#include "gpioclassimpl.h" #include "cmb.h" GPIOClassImpl::GPIOClassImpl() { m_pDevice = new GPIODevice(); } GPIOClassImpl::~GPIOClassImpl() { delete m_pDevice; } LightNode GPIOClassImpl::m_Lights[]={ {0x00, 0, "l:", 33, 1, 0}, //读卡器灯 {0x01, 0, "L:", 38, 1, 0}, //USB通断 {0x02, 0, "L:", 23, 1, 0}, //二代证灯 {0x03, 0, "L:", 21, 1, 0}, //键盘灯 {0x04, 0, "l:", 29, 1, 0}, //脸部照明 {0x05, 0, "l:", 30, 1, 0}, //故障灯 {0x06, 0, "L:", 33, 1, 0}, //卡机维护灯 {0x07, 0, "L:", 22, 1, 0}, //USB提示灯 {0x10, 0, "L:", 35, 1, 0}, //非接灯 {0x11, 0, "L:", 25, 1, 0}, //二维码灯 {0x12, 0, "L:", 24, 1, 0}, //指纹仪灯 {0x13, 0, "L:", 31, 1, 0}, //凭条灯 {0x14, 0, "L:", 32, 1, 0}, //高拍仪照明灯 {0x15, 0, "l:", 36, 1, 0}, //打印盖章灯(绿色) {0x16, 0, "l:", 34, 1, 0}, //纸槽灯(绿色) {0x17, 0, "L:", 34, 1, 0}, //纸槽灯(红色) 没有这个灯 {0x30, 0, "L:", 36, 1, 0}, //打印盖章提示红灯 没有这个灯 {0x31, 0, "L:", 37, 1, 0}, //高拍仪提示灯 }; int getFileVer(char* sFile, short& ch1, short& ch2) { ch1 = 0; ch2 = 0; char* pFind = strstr(sFile, ".so"); char* pTemp = pFind; while (pTemp) { pFind = pTemp; pTemp = strstr(pFind + 3, ".so"); } if (pFind == NULL) return 0; pTemp = pFind - 1; while(isdigit(*pTemp) && pTemp > sFile) pTemp--; if (*pTemp == '.') ch2 = atoi(pTemp+1); pTemp--; while(isdigit(*pTemp) && pTemp > sFile) pTemp--; if (*pTemp == '.') ch1 = atoi(pTemp+1); return 1; } ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory) { LOG4VTM_FUNCTION(); if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "GetDevCategory"); ErrorCodeEnum err = Error_Succeed; // int iRet = _fingerDev->GetVersion(sInfo); // ErrorCodeEnum errcode = HandleDevError(iRet, "Reset"); char sSer[256]; if (m_pDevice->GetFirmware(sSer) == 0) { sSer[32] = 0; strcpy(devCategory.szType, sSer); } else strcpy(devCategory.szType, "GetFirmware error"); strcpy(devCategory.szModel, "WID=Cashway001"); strcpy(devCategory.szVendor, "cw"); char sPath[256], sFile[128] = {0}; GetCurLibsPath(sPath, sFile); short v1,v2; getFileVer(sFile, v1, v2); devCategory.version.wMajor = v1; devCategory.version.wMinor = v2; devCategory.version.wRevision = 0xffff; devCategory.version.wBuild = FILE_VERSION; char szRet[512] = {0}; sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)", devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState); LOG4VTM(INFO, szRet); return err; } int GPIOClassImpl::CloseAll() { int iRet = m_pDevice->Init(); if (iRet != 0) return iRet; for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++) { m_Lights[ib].iState = 0; } return 0; } ErrorCodeEnum GPIOClassImpl::Reset() { LOG4VTM_FUNCTION(); if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "Reset"); int iRet = CloseAll(); return GetErrorInfo(iRet, "Reset");; } ErrorCodeEnum GPIOClassImpl::DevClose() { LOG4VTM_FUNCTION(); if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "DevClose"); CloseAll(); m_pDevice->Close(); ErrorCodeEnum err = Error_Succeed; return err; } ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo) { memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo)); return Error_Succeed; } // // Device initialization. // Configure port input/output direction. // ErrorCodeEnum GPIOClassImpl::DevOpen(GpioInitParam initParam) { LOG4VTM_FUNCTION(); char sPort[16],sGet[32]; sprintf(sPort, "COM%d", initParam.dwPort); SIni ini; if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30)) strcpy(sPort, sGet); int iRet = m_pDevice->OpenSIU(sPort, initParam.dwBaudRate); if (iRet != 0) return GetErrorInfo(iRet, "DevOpen OpenSIU"); iRet = CloseAll(); if (iRet != 0) return GetErrorInfo(iRet, "DevOpen"); if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", "YYB", sGet, 30)) m_pDevice->OpenYYB(sGet, initParam.dwBaudRate); return GetErrorInfo(iRet, "DevOpen"); } // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY const static CmbErrorDef GpioErrorDat[] = { {0, "成功", Error_Succeed, DEC_SUCCESS}, {GPIO_NOT_OPEN, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED}, {GPIO_HARDWARE_ERROR, "设备硬件故障", Error_Hardware, DEC_HARDWARE}, {GPIO_TIMEOUT, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT}, {GPIO_PARA_ERR, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER}, }; ErrorCodeEnum GPIOClassImpl::GetErrorInfo(int iCode, char* sErr, ...) { size_t iLenOne = sizeof(CmbErrorDef); size_t iLenAll = sizeof(GpioErrorDat); int iCount = iLenAll / iLenOne; char sErrInfo[256]=""; DWORD dSta = 0; int iErr = -1; for (int ia = 0; ia < iCount; ia++) { if (GpioErrorDat[ia].iCode == iCode) { dSta = GpioErrorDat[ia].iInf; strcpy(sErrInfo, GpioErrorDat[ia].sInf); iErr = GpioErrorDat[ia].iRet; break; } } char sErrAll[300]; va_list arglist; va_start(arglist, sErr); _vsnprintf(sErrAll, 128, sErr, arglist); va_end(arglist); if (sErrInfo[0]) { strcat(sErrAll, " "); strcat(sErrAll, sErrInfo); } sErrAll[200] = 0; iLenOne = strlen(sErrAll); sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll); // strcpy(m_DevErrInfo.szErrMsg, sErrAll); m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne; if (iErr != Error_Succeed) LOG4VTM(WARN, m_DevErrInfo.szErrMsg); else LOG4VTM(INFO, m_DevErrInfo.szErrMsg); return (ErrorCodeEnum)iErr; } // Set ports output. // Arguments: // - dwPort:port serial number,0~MAX_PORT_NUM-1 // - btData:output value // bit value 1/0 means voltage high or low // ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData) { LOG4VTM_FUNCTION(); if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "WritePort"); for (int ia=0; ia<8; ia++) { bool b1 = (btData & (1 << ia)) > 0; int iLight = (dwPort << 4) + ia; LightNode* pNode = NULL; for (int ib=0; ib < sizeof(m_Lights) / sizeof(LightNode); ib++) { if (m_Lights[ib].iLight == iLight) { pNode = &m_Lights[ib]; break; } } if (pNode == NULL) continue; if (pNode->iState == b1) continue; pNode->iState = b1; int iRet = m_pDevice->SetLight(pNode->iIndex, pNode->sCmd, b1 ? pNode->iOpen : pNode->iClose); if (iRet != 0) return GetErrorInfo(iRet, "WritePort"); } return GetErrorInfo(0, "WritePort"); } // // Get port input. // Arguments: // - dwPort:port serial number,0~MAX_PORT_NUM-1 // - btStatus:input value // ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level // ErrorCodeEnum GPIOClassImpl::ReadPort(DWORD dwPort, BYTE& btStatus) { LOG4VTM_FUNCTION(); if (!m_pDevice->IsOpen()) return GetErrorInfo(GPIO_NOT_OPEN, "WritePort"); if (dwPort != 2) return GetErrorInfo(GPIO_PARA_ERR, "WritePort"); short stGet = 0; int iRet = m_pDevice->GetStatus(stGet); btStatus = stGet; return GetErrorInfo(iRet, "ReadPort"); }