| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- #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 szType[] = {"PVER=cashway#MID=MSI118"};
- char szModel[] = "FWID=%s";
- strcpy(devCategory.szType, szType);
- char sSer[256];
- if (m_pDevice->GetFirmware(sSer) == 0)
- {
- sSer[32] = 0;
- sprintf(devCategory.szModel, szModel, sSer);
- }
- else
- sprintf(devCategory.szModel, szModel, "00000000");
- 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");
- char sBitImage[64];
- int iPos = sprintf(sBitImage, "port = %d Data = ", dwPort);
- ::ANSIToBitStr(&btData, 1, sBitImage+iPos);
- LOG4VTM(INFO, sBitImage);
- 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");
- }
|