Gpio.nantian.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. #include "Gpio.nantian.h"
  2. GPIO_NT_NAC::GPIO_NT_NAC()
  3. {
  4. //初始化
  5. m_trace = new CILIXTrace(NULL, "NT_NAC", "GPIO_NT_NAC");
  6. m_device = NULL;
  7. dplHandle = NULL;
  8. m_connect = false;
  9. VC_Creat_NTDRV_NT_NAC = NULL;
  10. VC_Destroy_NTDRV_NT_NAC = NULL;
  11. m_loadDllFlag = false;
  12. m_busy_flag = false;
  13. m_read_port_flag = false;
  14. m_ptStatus = 0;
  15. //加载设备库
  16. m_loadDllFlag = LoadNTDRVSO();
  17. }
  18. GPIO_NT_NAC::~GPIO_NT_NAC()
  19. {
  20. if (m_trace != NULL)
  21. delete m_trace;
  22. if (m_device != NULL)
  23. VC_Destroy_NTDRV_NT_NAC(m_device);
  24. if (dplHandle != NULL)
  25. {
  26. dlclose(dplHandle);
  27. dplHandle = NULL;
  28. }
  29. }
  30. bool GPIO_NT_NAC::LoadNTDRVSO()
  31. {
  32. char sCurPath[1024] = "";
  33. char sSOPath[1024] = "";
  34. CILIX_AUX_X::CILIX_GetModuleCurPath(sCurPath);
  35. sprintf(sSOPath, "%snantian/libDRV_NT_NAC.nantian.so", sCurPath);
  36. m_trace->WriteTrace("GPIO_NT_NAC::LoadNTDRVDLL", "DLLPath=%s", sSOPath);
  37. LOG4VTM(WARN, "GPIO_NT_NAC::LoadNTDRVDLL"
  38. << "DLLPath=" << sSOPath);
  39. void *pszErr = NULL;
  40. dplHandle = dlopen(sSOPath, RTLD_LAZY);
  41. if (!dplHandle || pszErr)
  42. {
  43. m_trace->WriteTrace("GVar::LoadDRVSO", "Load SO Fail!,reson:%s", dlerror());
  44. LOG4VTM(WARN, "GVar::LoadDRVSO"
  45. << "Load SO Fail!,reson:%s" << dlerror());
  46. return false;
  47. }
  48. VC_Creat_NTDRV_NT_NAC = (pCreat_NTDRV_NT_NAC)dlsym(dplHandle, "Creat_NTDRV_NT_NAC");
  49. if (VC_Creat_NTDRV_NT_NAC == NULL)
  50. {
  51. m_trace->WriteTrace("GVar::LoadDRVSO", "Load Create_DRV_Siu Fali!");
  52. LOG4VTM(WARN, "GVar::LoadDRVSO"
  53. << "Load Create_DRV_Siu Fali!");
  54. return false;
  55. }
  56. VC_Destroy_NTDRV_NT_NAC = (pDestroy_NTDRV_NT_NAC)dlsym(dplHandle, "Destory_NTDRV_NT_NAC");
  57. if (VC_Destroy_NTDRV_NT_NAC == NULL)
  58. {
  59. m_trace->WriteTrace("GVar::LoadDRVSO", "Load Destory_DRV_Siu Fail!");
  60. LOG4VTM(WARN, "GVar::LoadDRVSO"
  61. << "Load Destory_DRV_Siu Fail!");
  62. return false;
  63. }
  64. m_device = VC_Creat_NTDRV_NT_NAC();
  65. return true;
  66. }
  67. GPIO_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
  68. {
  69. baseObj = new GPIO_NT_NAC();
  70. //初始化日志
  71. char INIPath[100] = "";
  72. CILIX_AUX_X::CILIX_GetModuleCurPath(INIPath);
  73. strcat(INIPath, "nantian/log.nantian.ini");
  74. char log_dir[100] = "";
  75. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_dir", log_dir, "/etc/nantian");
  76. char log_level[100] = "";
  77. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_level", log_level, "3");
  78. cmb::log_init_config config;
  79. config.dev_name = "GPIO";
  80. config.log_dir = log_dir;
  81. config.log_level = atoi(log_level);
  82. std::string str;
  83. cmb::log4vendor::init(config, str);
  84. LOG4VTM(WARN, "GPIO_NT_NAC::GPIO_NT_NAC "
  85. << "libGpio.Nantian.1.1.so -v 1.0.0.2");
  86. if (baseObj == NULL)
  87. return Error_Resource;
  88. return Error_Succeed;
  89. }
  90. GPIO_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
  91. {
  92. if (pBaseObj == NULL)
  93. return Error_Param;
  94. /*LOG4VTM(WARN, "ReleaseDevComponent "
  95. << "Enter");
  96. LOG4VTM(WARN, "ReleaseDevComponent "
  97. << "Exit");*/
  98. delete ((GPIO_NT_NAC *)pBaseObj);
  99. return Error_Succeed;
  100. }
  101. ////////////////////////////////////////////////////////////////////////////////////////
  102. ErrorCodeEnum GPIO_NT_NAC::GetLastErr(DevErrorInfo &devErrInfo)
  103. {
  104. int iret = Error_Succeed;
  105. CILIXAutoTrace __at(m_trace, "GetLastErr", &iret);
  106. LOG4VTM(WARN, "GetLastErr "
  107. << "Enter");
  108. devErrInfo.dwErrMsgLen = m_errorInfo.dwErrMsgLen;
  109. strcpy(devErrInfo.szErrMsg, m_errorInfo.szErrMsg);
  110. LOG4VTM(WARN, "GetLastErr "
  111. << "Exit");
  112. return Error_Succeed;
  113. }
  114. ErrorCodeEnum GPIO_NT_NAC::DevOpen(GpioInitParam initParam)
  115. {
  116. int iret = Error_Succeed;
  117. CILIXAutoTrace __at(m_trace, "DevOpen", &iret);
  118. LOG4VTM(WARN, "DevOpen "
  119. << "Enter");
  120. //判断设备库加载是否成功
  121. if (this->m_loadDllFlag == false)
  122. {
  123. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  124. strcpy(m_errorInfo.szErrMsg, "load vendor NTDRV dll failed!");
  125. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  126. iret = Error_DevLoadFileFailed;
  127. return Error_DevLoadFileFailed;
  128. }
  129. //判断是否初始化
  130. if (m_connect == true)
  131. return Error_Succeed;
  132. //赋值
  133. m_initParam = initParam;
  134. //参数判断
  135. if (m_initParam.dwPortNum > MAX_PORT_NUM)
  136. {
  137. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  138. strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
  139. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  140. iret = Error_Param;
  141. return Error_Param;
  142. }
  143. //记录初始化参数信息
  144. int ilen = 0;
  145. char logBuff[100] = "";
  146. sprintf(logBuff, "PortsInfo: dwPortNum=%d", m_initParam.dwPortNum);
  147. for (int i = 0; i < m_initParam.dwPortNum; i++)
  148. {
  149. ilen = strlen(logBuff);
  150. sprintf(logBuff + ilen, ", dir[%d]=%d", i, m_initParam.dir[i]);
  151. }
  152. m_trace->WriteTrace("DevOpen", "%s", logBuff);
  153. LOG4VTM(WARN, "DevOpen "
  154. << "logBuff");
  155. //端口由应用传入,传入的是设备2的端口号;
  156. //打开设备
  157. iret = m_device->OpenDevice(initParam.dwPort-1, initParam.dwBaudRate);
  158. m_trace->WriteTrace("DevOpen", "Invoke OpenDevice(%d,%d) return %d", initParam.dwPort-1, initParam.dwBaudRate, iret);
  159. LOG4VTM(WARN, "DevOpen "
  160. << "Invoke OpenDevice Port=ttyXRUSB" << initParam.dwPort -1 << " Rate=" << initParam.dwBaudRate << "return:" << iret);
  161. if (iret != 0)
  162. {
  163. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  164. strcpy(m_errorInfo.szErrMsg, "connect to device failed!");
  165. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  166. m_connect = false;
  167. return Error_DevConnFailed;
  168. }
  169. m_connect = true;
  170. LOG4VTM(WARN, "DevOpen "
  171. << "Exit ");
  172. return Error_Succeed;
  173. }
  174. ErrorCodeEnum GPIO_NT_NAC::DevClose()
  175. {
  176. m_busy_flag = true;
  177. //WAITING_LOOP();
  178. int iret = Error_Succeed;
  179. CILIXAutoTrace __at(m_trace, "DevClose", &iret);
  180. LOG4VTM(WARN, "DevClose "
  181. << "Enter ");
  182. //判断是否初始化
  183. if (m_connect == true)
  184. {
  185. int iret = m_device->CloseDevice();
  186. m_trace->WriteTrace("DevClose", "Invoke CloseDevice return %d", iret);
  187. LOG4VTM(WARN, "DevClose "
  188. << "Invoke CloseDevice return " << iret);
  189. m_connect = false;
  190. }
  191. m_busy_flag = false;
  192. LOG4VTM(WARN, "DevClose "
  193. << "Exit ");
  194. return Error_Succeed;
  195. }
  196. ErrorCodeEnum GPIO_NT_NAC::GetDevCategory(DevCategoryInfo &devCategory)
  197. {
  198. m_busy_flag = true;
  199. //WAITING_LOOP();
  200. int iret = Error_Succeed;
  201. CILIXAutoTrace __at(m_trace, "GetDevCategory", &iret);
  202. LOG4VTM(WARN, "GetDevCategory "
  203. << "Enter ");
  204. //赋值
  205. strcpy(devCategory.szType, "PVER=NT#MID=NT_NAC");
  206. strcpy(devCategory.szVendor, "nantian");
  207. devCategory.version.wMajor = 1;
  208. devCategory.version.wMinor = 0;
  209. devCategory.version.wRevision = 0;
  210. devCategory.version.wBuild = 2;
  211. //设备未连接
  212. if (m_connect == false)
  213. {
  214. strcpy(devCategory.szModel, "");
  215. devCategory.eState = DEVICE_STATUS_NOT_READY;
  216. //置标记
  217. m_busy_flag = false;
  218. return Error_Succeed;
  219. }
  220. //通过获取固件版本来获取硬件设备状态
  221. char sDevVer[100] = "";
  222. char sDevVerEx[100] = "";
  223. //设备1
  224. int iret1 = m_device->GetFirmwareVersion(sDevVer);
  225. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "GetDevCategory", "[1]Invoke GetFirmwareVersion return %d", iret1);
  226. LOG4VTM(WARN, "GetDevCategory "
  227. << "Invoke GetFirmwareVersion return " << iret1);
  228. //设备2
  229. int iret2 = m_device->GetFirmwareVersionEx(sDevVerEx);
  230. m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "GetDevCategory", "[2]Invoke GetFirmwareVersion return %d", iret2);
  231. LOG4VTM(WARN, "GetDevCategory "
  232. << "Invoke GetFirmwareVersionEx return " << iret2);
  233. char sDevVerModel[100] = "";
  234. sprintf(sDevVerModel,"FWID=%s",sDevVer);
  235. strcpy(devCategory.szModel, sDevVerModel);
  236. if (iret1 == 0 && iret2 == 0)
  237. devCategory.eState = DEVICE_STATUS_NORMAL;
  238. else
  239. devCategory.eState = DEVICE_STATUS_FAULT;
  240. m_busy_flag = false;
  241. LOG4VTM(WARN, "GetDevCategory "
  242. << "Exit ");
  243. return Error_Succeed;
  244. }
  245. ErrorCodeEnum GPIO_NT_NAC::Reset()
  246. {
  247. m_busy_flag = true;
  248. //WAITING_LOOP();
  249. int iret = Error_Succeed;
  250. CILIXAutoTrace __at(m_trace, "Reset", &iret);
  251. LOG4VTM(WARN, "Reset "
  252. << "Enter ");
  253. //判断是否连接
  254. if (m_connect == false)
  255. {
  256. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  257. strcpy(m_errorInfo.szErrMsg, "device not connected!");
  258. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  259. //置标记
  260. m_busy_flag = false;
  261. iret = Error_DevNotAvailable;
  262. return Error_DevNotAvailable;
  263. }
  264. //复位设备
  265. iret = m_device->ResetDevice();
  266. m_trace->WriteTrace("Reset", "Invoke ResetDevice return %d", iret);
  267. LOG4VTM(WARN, "Reset "
  268. << "Invoke ResetDevice return: " << iret);
  269. if (iret != 0 )
  270. {
  271. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  272. strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
  273. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  274. //置标记
  275. m_busy_flag = false;
  276. return Error_DevCommFailed;
  277. }
  278. m_busy_flag = false;
  279. LOG4VTM(WARN, "Reset "
  280. << "Exit ");
  281. return Error_Succeed;
  282. }
  283. ErrorCodeEnum GPIO_NT_NAC::WritePort(DWORD dwPort, BYTE btData)
  284. {
  285. m_busy_flag = true;
  286. //WAITING_LOOP();
  287. int iret = Error_Succeed;
  288. CILIXAutoTrace __at(m_trace, "WritePort", &iret);
  289. LOG4VTM(WARN, "WritePort "
  290. << "Enter ");
  291. //判断是否连接
  292. if (m_connect == false)
  293. {
  294. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  295. strcpy(m_errorInfo.szErrMsg, "device not connected!");
  296. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  297. //置标记
  298. m_busy_flag = false;
  299. iret = Error_DevNotAvailable;
  300. return Error_DevNotAvailable;
  301. }
  302. m_trace->WriteTrace("WritePort", "dwPort=%d, btData=%d", dwPort, btData);
  303. LOG4VTM(WARN, "WritePort "
  304. << "dwPort=" << dwPort << " btData= " << (int)btData);
  305. //判断端口是否合法
  306. if (dwPort > m_initParam.dwPortNum || dwPort < 0)
  307. {
  308. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  309. strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
  310. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  311. //置标记
  312. m_busy_flag = false;
  313. iret = Error_Param;
  314. return Error_Param;
  315. }
  316. //判断端口的属性是否合法
  317. if (m_initParam.dir[dwPort] != 1)
  318. {
  319. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  320. strcpy(m_errorInfo.szErrMsg, "Type of port to set is invalid!");
  321. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  322. //置标记
  323. m_busy_flag = false;
  324. iret = Error_Param;
  325. return Error_Param;
  326. }
  327. //设置输出
  328. if (dwPort == 0)
  329. {
  330. //P0.1,设备1,OUT1
  331. iret = m_device->SetOutputStatus(1, (btData & 0x01)); //读卡器指示灯
  332. //P0.2,设备2,OUT8
  333. iret = m_device->SetOutputStatusEx(8, (btData & 0x02) >> 1); //USB通断控制
  334. //P0.3,设备1,OUT3
  335. iret = m_device->SetOutputStatus(3, (btData & 0x04) >> 2); //身份证指示灯
  336. //P0.4,设备2,OUT2
  337. iret = m_device->SetOutputStatusEx(2, (btData & 0x08) >> 3); //键盘指示灯
  338. //P0.5,设备2,OUT0
  339. iret = m_device->SetOutputStatusEx(0, (btData & 0x10) >> 4); //面部照明灯
  340. //P0.6,设备2,OUT1
  341. iret = m_device->SetOutputStatusEx(1, (btData & 0x20) >> 5); //故障灯
  342. //P0.7,设备1,OUT0
  343. iret = m_device->SetOutputStatus(0, (btData & 0x40) >> 6); //卡机维护灯
  344. //P0.8,设备2,OUT6
  345. iret = m_device->SetOutputStatusEx(6, (btData & 0x80) >> 7); //USB指示灯
  346. }
  347. else if (dwPort == 1)
  348. {
  349. //P1.1,设备1,OUT8
  350. iret = m_device->SetOutputStatus(8, (btData & 0x01)); //非接指示灯
  351. //P1.2,设备2,OUT3
  352. iret = m_device->SetOutputStatusEx(3, (btData & 0x02) >> 1); //二维码指示灯
  353. //P1.3,设备1,OUT4
  354. iret = m_device->SetOutputStatus(4, (btData & 0x04) >> 2); //指纹仪指示灯
  355. //P1.4,设备1,OUT2
  356. iret = m_device->SetOutputStatus(2, (btData & 0x08) >> 3); //凭条指示灯
  357. //P1.5,13,设备2,OUT10
  358. iret = m_device->SetOutputStatusEx(10, (btData & 0x10) >> 4); //高拍仪照明灯
  359. //P1.6,设备2,OUT4
  360. iret = m_device->SetOutputStatusEx(4, (btData & 0x20) >> 5); //激光打印机绿灯
  361. //P1.7,设备1,OUT5
  362. iret = m_device->SetOutputStatus(5, (btData & 0x40) >> 6); //纸盒指示灯绿灯
  363. //P1.8,设备1,OUT6
  364. iret = m_device->SetOutputStatus(6, (btData & 0x80) >> 7); //纸盒指示灯红灯
  365. }
  366. else if (dwPort == 3)
  367. {
  368. //P1.1,25,设备2,OUT5
  369. iret = m_device->SetOutputStatusEx(5, (btData & 0x01)); //激光打印机红灯
  370. //P1.2,26,设备2,OUT9
  371. iret = m_device->SetOutputStatusEx(9, (btData & 0x02) >> 1); //高拍仪提示灯
  372. }
  373. if (iret != 0)
  374. {
  375. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  376. strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
  377. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  378. //置标记
  379. m_busy_flag = false;
  380. return Error_DevCommFailed;
  381. }
  382. m_busy_flag = false;
  383. LOG4VTM(WARN, "WritePort "
  384. << "Exit ");
  385. return Error_Succeed;
  386. }
  387. ErrorCodeEnum GPIO_NT_NAC::ReadPort(DWORD dwPort, BYTE &btStatus)
  388. {
  389. m_read_port_flag = true;
  390. int iret = Error_Succeed;
  391. //CILIXAutoTrace __at(m_trace,"ReadPort",&iret);
  392. //判断是否连接
  393. if (m_connect == false)
  394. {
  395. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  396. strcpy(m_errorInfo.szErrMsg, "device not connected!");
  397. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  398. //置标记
  399. m_read_port_flag = false;
  400. iret = Error_DevNotAvailable;
  401. return Error_DevNotAvailable;
  402. }
  403. //m_trace->WriteTrace("ReadPort","dwPort=%d",dwPort);
  404. //判断端口是否合法
  405. if (dwPort > m_initParam.dwPortNum || dwPort < 0)
  406. {
  407. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  408. strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
  409. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  410. //置标记
  411. m_read_port_flag = false;
  412. iret = Error_Param;
  413. return Error_Param;
  414. }
  415. //判断端口的属性是否合法
  416. if (m_initParam.dir[dwPort] != 0)
  417. {
  418. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  419. strcpy(m_errorInfo.szErrMsg, "Type of port to set is invalid!");
  420. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  421. //置标记
  422. m_read_port_flag = false;
  423. iret = Error_Param;
  424. return Error_Param;
  425. }
  426. if (dwPort == 2)
  427. {
  428. int p21 = 0, p22 = 0, p23 = 0, p24 = 0, p25 = 0, p26 = 0, p27 = 0, p28 = 0;
  429. //***P2.1,震动传感器,设备1,IN4
  430. p21 = m_device->GetInputStatus(4);
  431. if (p21 == 1)
  432. p21 = 0;
  433. else if (p21 == 0)
  434. p21 = 1;
  435. //***P2.2,柜门开关
  436. int f_d = m_device->GetInputStatus(0); //前门下,IN0
  437. int re = m_device->GetInputStatus(5); //后门,IN5
  438. if (f_d >= 0 && re >= 0)
  439. p22 = f_d & re; //默认0为开
  440. if (p22 == 1)
  441. p22 = 0;
  442. else if (p22 == 0)
  443. p22 = 1;
  444. //***P2.3,挂摘机开关,设备2,IN2
  445. p23 = m_device->GetInputStatusEx(2);
  446. if (p23 == 1)
  447. p23 = 0;
  448. else if (p23 == 0)
  449. p23 = 1;
  450. //***P2.4,人体接近传感器,设备1,IN3
  451. p24 = m_device->GetInputStatus(3);
  452. //if(p24 == 1) p24 = 0;
  453. //else if(p24 == 0) p24 = 1;
  454. //***P2.5,卡嘴检测
  455. p25 = m_device->GetInputStatus(1);
  456. //***P2.6,开机盖检测,设备1,IN7
  457. p26 = m_device->GetInputStatus(7);
  458. if (p26 == 1)
  459. p26 = 0;
  460. else if (p26 == 0)
  461. p26 = 1;
  462. if (p21 >= 0 && p22 >= 0 && p23 >= 0 && p24 >= 0 && p25 >=0&& p26 >= 0)
  463. {
  464. btStatus = p21 | (p22 << 1) | (p23 << 2) | (p24 << 3) | (p25 << 4) | (p26 << 5);
  465. }
  466. else
  467. {
  468. memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
  469. strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
  470. m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
  471. //置标记
  472. m_read_port_flag = false;
  473. iret = Error_DevCommFailed;
  474. return Error_DevCommFailed;
  475. }
  476. }
  477. m_ptStatus = btStatus;
  478. m_last_errorcode = (ErrorCodeEnum)iret;
  479. m_read_port_flag = false;
  480. return (ErrorCodeEnum)iret;
  481. }