gpioclassimpl.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #include "gpioclassimpl.h"
  2. #include "cmb.h"
  3. GPIOClassImpl::GPIOClassImpl()
  4. {
  5. m_pDevice = new GPIODevice();
  6. }
  7. GPIOClassImpl::~GPIOClassImpl()
  8. {
  9. delete m_pDevice;
  10. }
  11. LightNode GPIOClassImpl::m_Lights[]={
  12. {0x00, 0, "l:", 33, 1, 0}, //读卡器灯
  13. {0x01, 0, "L:", 38, 1, 0}, //USB通断
  14. {0x02, 0, "L:", 23, 1, 0}, //二代证灯
  15. {0x03, 0, "L:", 21, 1, 0}, //键盘灯
  16. {0x04, 0, "l:", 29, 1, 0}, //脸部照明
  17. {0x05, 0, "l:", 30, 1, 0}, //故障灯
  18. {0x06, 0, "L:", 33, 1, 0}, //卡机维护灯
  19. {0x07, 0, "L:", 22, 1, 0}, //USB提示灯
  20. {0x10, 0, "L:", 35, 1, 0}, //非接灯
  21. {0x11, 0, "L:", 25, 1, 0}, //二维码灯
  22. {0x12, 0, "L:", 24, 1, 0}, //指纹仪灯
  23. {0x13, 0, "L:", 31, 1, 0}, //凭条灯
  24. {0x14, 0, "L:", 32, 1, 0}, //高拍仪照明灯
  25. {0x15, 0, "l:", 36, 1, 0}, //打印盖章灯(绿色)
  26. {0x16, 0, "l:", 34, 1, 0}, //纸槽灯(绿色)
  27. {0x17, 0, "L:", 34, 1, 0}, //纸槽灯(红色) 没有这个灯
  28. {0x30, 0, "L:", 36, 1, 0}, //打印盖章提示红灯 没有这个灯
  29. {0x31, 0, "L:", 37, 1, 0}, //高拍仪提示灯
  30. };
  31. int getFileVer(char* sFile, short& ch1, short& ch2)
  32. {
  33. ch1 = 0;
  34. ch2 = 0;
  35. char* pFind = strstr(sFile, ".so");
  36. char* pTemp = pFind;
  37. while (pTemp)
  38. {
  39. pFind = pTemp;
  40. pTemp = strstr(pFind + 3, ".so");
  41. }
  42. if (pFind == NULL) return 0;
  43. pTemp = pFind - 1;
  44. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  45. if (*pTemp == '.')
  46. ch2 = atoi(pTemp+1);
  47. pTemp--;
  48. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  49. if (*pTemp == '.')
  50. ch1 = atoi(pTemp+1);
  51. return 1;
  52. }
  53. ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  54. {
  55. LOG4VTM_FUNCTION();
  56. if (!m_pDevice->IsOpen())
  57. return GetErrorInfo(GPIO_NOT_OPEN, "GetDevCategory");
  58. ErrorCodeEnum err = Error_Succeed;
  59. // int iRet = _fingerDev->GetVersion(sInfo);
  60. // ErrorCodeEnum errcode = HandleDevError(iRet, "Reset");
  61. char szType[] = {"PVER=cashway#MID=MSI118"};
  62. char szModel[] = "FWID=%s";
  63. strcpy(devCategory.szType, szType);
  64. char sSer[256];
  65. if (m_pDevice->GetFirmware(sSer) == 0)
  66. {
  67. sSer[32] = 0;
  68. sprintf(devCategory.szModel, szModel, sSer);
  69. }
  70. else
  71. sprintf(devCategory.szModel, szModel, "00000000");
  72. strcpy(devCategory.szVendor, "cw");
  73. char sPath[256], sFile[128] = {0};
  74. GetCurLibsPath(sPath, sFile);
  75. short v1,v2;
  76. getFileVer(sFile, v1, v2);
  77. devCategory.version.wMajor = v1;
  78. devCategory.version.wMinor = v2;
  79. devCategory.version.wRevision = 0xffff;
  80. devCategory.version.wBuild = FILE_VERSION;
  81. char szRet[512] = {0};
  82. sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
  83. devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
  84. LOG4VTM(INFO, szRet);
  85. return err;
  86. }
  87. int GPIOClassImpl::CloseAll()
  88. {
  89. int iRet = m_pDevice->Init();
  90. if (iRet != 0) return iRet;
  91. for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++)
  92. {
  93. m_Lights[ib].iState = 0;
  94. }
  95. return 0;
  96. }
  97. ErrorCodeEnum GPIOClassImpl::Reset()
  98. {
  99. LOG4VTM_FUNCTION();
  100. if (!m_pDevice->IsOpen())
  101. return GetErrorInfo(GPIO_NOT_OPEN, "Reset");
  102. int iRet = CloseAll();
  103. return GetErrorInfo(iRet, "Reset");;
  104. }
  105. ErrorCodeEnum GPIOClassImpl::DevClose()
  106. {
  107. LOG4VTM_FUNCTION();
  108. if (!m_pDevice->IsOpen())
  109. return GetErrorInfo(GPIO_NOT_OPEN, "DevClose");
  110. CloseAll();
  111. m_pDevice->Close();
  112. ErrorCodeEnum err = Error_Succeed;
  113. return err;
  114. }
  115. ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  116. {
  117. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  118. return Error_Succeed;
  119. }
  120. //
  121. // Device initialization.
  122. // Configure port input/output direction.
  123. //
  124. ErrorCodeEnum GPIOClassImpl::DevOpen(GpioInitParam initParam)
  125. {
  126. LOG4VTM_FUNCTION();
  127. char sPort[16],sGet[32];
  128. sprintf(sPort, "COM%d", initParam.dwPort);
  129. SIni ini;
  130. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30))
  131. strcpy(sPort, sGet);
  132. int iRet = m_pDevice->OpenSIU(sPort, initParam.dwBaudRate);
  133. if (iRet != 0)
  134. return GetErrorInfo(iRet, "DevOpen OpenSIU");
  135. iRet = CloseAll();
  136. if (iRet != 0)
  137. return GetErrorInfo(iRet, "DevOpen");
  138. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", "YYB", sGet, 30))
  139. m_pDevice->OpenYYB(sGet, initParam.dwBaudRate);
  140. return GetErrorInfo(iRet, "DevOpen");
  141. }
  142. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  143. const static CmbErrorDef GpioErrorDat[] = {
  144. {0, "成功", Error_Succeed, DEC_SUCCESS},
  145. {GPIO_NOT_OPEN, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED},
  146. {GPIO_HARDWARE_ERROR, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
  147. {GPIO_TIMEOUT, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT},
  148. {GPIO_PARA_ERR, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER},
  149. };
  150. ErrorCodeEnum GPIOClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  151. {
  152. size_t iLenOne = sizeof(CmbErrorDef);
  153. size_t iLenAll = sizeof(GpioErrorDat);
  154. int iCount = iLenAll / iLenOne;
  155. char sErrInfo[256]="";
  156. DWORD dSta = 0;
  157. int iErr = -1;
  158. for (int ia = 0; ia < iCount; ia++)
  159. {
  160. if (GpioErrorDat[ia].iCode == iCode)
  161. {
  162. dSta = GpioErrorDat[ia].iInf;
  163. strcpy(sErrInfo, GpioErrorDat[ia].sInf);
  164. iErr = GpioErrorDat[ia].iRet;
  165. break;
  166. }
  167. }
  168. char sErrAll[300];
  169. va_list arglist;
  170. va_start(arglist, sErr);
  171. _vsnprintf(sErrAll, 128, sErr, arglist);
  172. va_end(arglist);
  173. if (sErrInfo[0])
  174. {
  175. strcat(sErrAll, " ");
  176. strcat(sErrAll, sErrInfo);
  177. }
  178. sErrAll[200] = 0;
  179. iLenOne = strlen(sErrAll);
  180. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  181. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  182. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  183. if (iErr != Error_Succeed)
  184. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  185. else
  186. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  187. return (ErrorCodeEnum)iErr;
  188. }
  189. // Set ports output.
  190. // Arguments:
  191. // - dwPort:port serial number,0~MAX_PORT_NUM-1
  192. // - btData:output value
  193. // bit value 1/0 means voltage high or low
  194. // ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
  195. ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
  196. {
  197. LOG4VTM_FUNCTION();
  198. if (!m_pDevice->IsOpen())
  199. return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
  200. char sBitImage[64];
  201. int iPos = sprintf(sBitImage, "port = %d Data = ", dwPort);
  202. ::ANSIToBitStr(&btData, 1, sBitImage+iPos);
  203. LOG4VTM(INFO, sBitImage);
  204. for (int ia=0; ia<8; ia++)
  205. {
  206. bool b1 = (btData & (1 << ia)) > 0;
  207. int iLight = (dwPort << 4) + ia;
  208. LightNode* pNode = NULL;
  209. for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++)
  210. {
  211. if (m_Lights[ib].iLight == iLight)
  212. {
  213. pNode = &m_Lights[ib];
  214. break;
  215. }
  216. }
  217. if (pNode == NULL) continue;
  218. if (pNode->iState == b1) continue;
  219. pNode->iState = b1;
  220. int iRet = m_pDevice->SetLight(pNode->iIndex, pNode->sCmd, b1 ? pNode->iOpen : pNode->iClose);
  221. if (iRet != 0) return GetErrorInfo(iRet, "WritePort");
  222. }
  223. return GetErrorInfo(0, "WritePort");
  224. }
  225. //
  226. // Get port input.
  227. // Arguments:
  228. // - dwPort:port serial number,0~MAX_PORT_NUM-1
  229. // - btStatus:input value
  230. // ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
  231. //
  232. ErrorCodeEnum GPIOClassImpl::ReadPort(DWORD dwPort, BYTE& btStatus)
  233. {
  234. LOG4VTM_FUNCTION();
  235. if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
  236. if (dwPort != 2) return GetErrorInfo(GPIO_PARA_ERR, "WritePort");
  237. short stGet = 0;
  238. int iRet = m_pDevice->GetStatus(stGet);
  239. btStatus = stGet;
  240. return GetErrorInfo(iRet, "ReadPort");
  241. }