gpioclassimpl.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 sSer[256];
  62. if (m_pDevice->GetFirmware(sSer) == 0)
  63. {
  64. sSer[32] = 0;
  65. strcpy(devCategory.szType, sSer);
  66. }
  67. else
  68. strcpy(devCategory.szType, "GetFirmware error");
  69. strcpy(devCategory.szModel, "WID=Cashway001");
  70. strcpy(devCategory.szVendor, "cw");
  71. char sPath[256], sFile[128] = {0};
  72. GetCurLibsPath(sPath, sFile);
  73. short v1,v2;
  74. getFileVer(sFile, v1, v2);
  75. devCategory.version.wMajor = v1;
  76. devCategory.version.wMinor = v2;
  77. devCategory.version.wRevision = 0xffff;
  78. devCategory.version.wBuild = FILE_VERSION;
  79. char szRet[512] = {0};
  80. sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
  81. devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
  82. LOG4VTM(INFO, szRet);
  83. return err;
  84. }
  85. int GPIOClassImpl::CloseAll()
  86. {
  87. int iRet = m_pDevice->Init();
  88. if (iRet != 0) return iRet;
  89. for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++)
  90. {
  91. m_Lights[ib].iState = 0;
  92. }
  93. return 0;
  94. }
  95. ErrorCodeEnum GPIOClassImpl::Reset()
  96. {
  97. LOG4VTM_FUNCTION();
  98. if (!m_pDevice->IsOpen())
  99. return GetErrorInfo(GPIO_NOT_OPEN, "Reset");
  100. int iRet = CloseAll();
  101. return GetErrorInfo(iRet, "Reset");;
  102. }
  103. ErrorCodeEnum GPIOClassImpl::DevClose()
  104. {
  105. LOG4VTM_FUNCTION();
  106. if (!m_pDevice->IsOpen())
  107. return GetErrorInfo(GPIO_NOT_OPEN, "DevClose");
  108. CloseAll();
  109. m_pDevice->Close();
  110. ErrorCodeEnum err = Error_Succeed;
  111. return err;
  112. }
  113. ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  114. {
  115. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  116. return Error_Succeed;
  117. }
  118. //
  119. // Device initialization.
  120. // Configure port input/output direction.
  121. //
  122. ErrorCodeEnum GPIOClassImpl::DevOpen(GpioInitParam initParam)
  123. {
  124. LOG4VTM_FUNCTION();
  125. char sPort[16],sGet[32];
  126. sprintf(sPort, "COM%d", initParam.dwPort);
  127. SIni ini;
  128. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30))
  129. strcpy(sPort, sGet);
  130. int iRet = m_pDevice->OpenSIU(sPort, initParam.dwBaudRate);
  131. if (iRet != 0)
  132. return GetErrorInfo(iRet, "DevOpen OpenSIU");
  133. iRet = CloseAll();
  134. if (iRet != 0)
  135. return GetErrorInfo(iRet, "DevOpen");
  136. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", "YYB", sGet, 30))
  137. m_pDevice->OpenYYB(sGet, initParam.dwBaudRate);
  138. return GetErrorInfo(iRet, "DevOpen");
  139. }
  140. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  141. const static CmbErrorDef GpioErrorDat[] = {
  142. {0, "成功", Error_Succeed, DEC_SUCCESS},
  143. {GPIO_NOT_OPEN, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED},
  144. {GPIO_HARDWARE_ERROR, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
  145. {GPIO_TIMEOUT, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT},
  146. {GPIO_PARA_ERR, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER},
  147. };
  148. ErrorCodeEnum GPIOClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  149. {
  150. size_t iLenOne = sizeof(CmbErrorDef);
  151. size_t iLenAll = sizeof(GpioErrorDat);
  152. int iCount = iLenAll / iLenOne;
  153. char sErrInfo[256]="";
  154. DWORD dSta = 0;
  155. int iErr = -1;
  156. for (int ia = 0; ia < iCount; ia++)
  157. {
  158. if (GpioErrorDat[ia].iCode == iCode)
  159. {
  160. dSta = GpioErrorDat[ia].iInf;
  161. strcpy(sErrInfo, GpioErrorDat[ia].sInf);
  162. iErr = GpioErrorDat[ia].iRet;
  163. break;
  164. }
  165. }
  166. char sErrAll[300];
  167. va_list arglist;
  168. va_start(arglist, sErr);
  169. _vsnprintf(sErrAll, 128, sErr, arglist);
  170. va_end(arglist);
  171. if (sErrInfo[0])
  172. {
  173. strcat(sErrAll, " ");
  174. strcat(sErrAll, sErrInfo);
  175. }
  176. sErrAll[200] = 0;
  177. iLenOne = strlen(sErrAll);
  178. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  179. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  180. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  181. if (iErr != Error_Succeed)
  182. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  183. else
  184. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  185. return (ErrorCodeEnum)iErr;
  186. }
  187. // Set ports output.
  188. // Arguments:
  189. // - dwPort:port serial number,0~MAX_PORT_NUM-1
  190. // - btData:output value
  191. // bit value 1/0 means voltage high or low
  192. // ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
  193. ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
  194. {
  195. LOG4VTM_FUNCTION();
  196. if (!m_pDevice->IsOpen())
  197. return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
  198. for (int ia=0; ia<8; ia++)
  199. {
  200. bool b1 = (btData & (1 << ia)) > 0;
  201. int iLight = (dwPort << 4) + ia;
  202. LightNode* pNode = NULL;
  203. for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++)
  204. {
  205. if (m_Lights[ib].iLight == iLight)
  206. {
  207. pNode = &m_Lights[ib];
  208. break;
  209. }
  210. }
  211. if (pNode == NULL) continue;
  212. if (pNode->iState == b1) continue;
  213. pNode->iState = b1;
  214. int iRet = m_pDevice->SetLight(pNode->iIndex, pNode->sCmd, b1 ? pNode->iOpen : pNode->iClose);
  215. if (iRet != 0) return GetErrorInfo(iRet, "WritePort");
  216. }
  217. return GetErrorInfo(0, "WritePort");
  218. }
  219. //
  220. // Get port input.
  221. // Arguments:
  222. // - dwPort:port serial number,0~MAX_PORT_NUM-1
  223. // - btStatus:input value
  224. // ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
  225. //
  226. ErrorCodeEnum GPIOClassImpl::ReadPort(DWORD dwPort, BYTE& btStatus)
  227. {
  228. LOG4VTM_FUNCTION();
  229. if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
  230. if (dwPort != 2) return GetErrorInfo(GPIO_PARA_ERR, "WritePort");
  231. short stGet = 0;
  232. int iRet = m_pDevice->GetStatus(stGet);
  233. btStatus = stGet;
  234. return GetErrorInfo(iRet, "ReadPort");
  235. }