| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- #include <memory.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include "gpio_impl.h"
- #include "log4vendor.h"
- #include "IOSignalCtrBoardDevDef.h"
- #define SIU_DEF_DEVNAME "IOEXTENDDEV"
- #define SIGNAL_NUM 16
- GPIOClassImpl::GPIOClassImpl()
- :m_mode(0)
- {
- m_pHandle = NULL;
- memset(&m_GpioParm,0,sizeof(m_GpioParm));
- }
- GPIOClassImpl::~GPIOClassImpl()
- {
- DevClose();
- }
- ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- const char *pType = "PVER=GRG#MID=IOExtern";
- const char *pMode = "FWID=0";
- const char *pVendor = "grg";
- strcpy(devCategory.szType, pType);
- strcpy(devCategory.szModel, pMode);
- strcpy(devCategory.szVendor, pVendor);
- devCategory.version.wMajor = 1;
- devCategory.version.wMinor = 1;
- devCategory.version.wRevision = 65535;
- devCategory.version.wBuild = 1;
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIOClassImpl::Reset()
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- tDevReturn l_tDevReturn[8] = { 0 };
- iInit(m_pHandle,INIT_IO_STAUTS, l_tDevReturn);
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIOClassImpl::DevClose()
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- if (m_pHandle) {
- iCloseComm(m_pHandle);
- vCloseLigicDevice(m_pHandle);
- m_pHandle = NULL;
- }
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
- {
- memset(&devErrInfo, 0, sizeof(devErrInfo));
- memcpy(&devErrInfo, &m_DevErrorInfo, sizeof(devErrInfo));
- return Error_Succeed;
- }
- ErrorCodeEnum GPIOClassImpl::DevOpen(GpioInitParam initParam)
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- int l_oDuniteResult = SUCCESS;
- memcpy(&m_GpioParm,&initParam,sizeof(initParam));
- tDevReturn l_tDevReturn[8] = { 0 };
- m_pHandle = hOpenLogicDevice(SIU_DEF_DEVNAME);
- if (m_pHandle == NULL) {
- //Open Dev error
- FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_BASE,"Open logicDevice Failed,hOpenLogicDevice");
- return Error_DevConnFailed;
- }
- l_oDuniteResult = iSetCommPara(m_pHandle,l_tDevReturn);
- if (SUCCESS != l_oDuniteResult)
- {
- FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "Open logicDevice Failed,iSetCommPara");
- return Error_DevConnFailed;
- }
- memset(l_tDevReturn, 0, sizeof(l_tDevReturn));
- l_oDuniteResult = iInit(m_pHandle,INIT_IO_STAUTS, l_tDevReturn);
- if (SUCCESS != l_oDuniteResult)
- {
- FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "Open logicDevice Failed,iInit");
- return Error_NotInit;
- }
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- if (0>dwPort || dwPort >= MAX_PORT_NUM)
- {
- //LOG4VTM(ERROR,__FUNCTION__<<"0>dwPort || dwPort >= MAX_PORT_NUM"<<"dwPort = "<<dwPort);
- char msg[1024]={0};
- sprintf(msg,"invalid param dwPort = %d",dwPort);
- FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_INVALIDPARAM, msg);
- return Error_Param;
- }
- ErrorCodeEnum l_ErrRlt = Error_Succeed;
- tDevReturn l_tDevReturn[8] = { 0 };
- int l_oDuniteResult = iSetCommPara(m_pHandle,l_tDevReturn);
- if (SUCCESS != l_oDuniteResult)
- {
- FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetCommPara");
- return Error_DevConnFailed;
- //return (ErrorCodeEnum)l_tDevReturn[0].iLogicCode;
- }
- l_oDuniteResult = iGetLightStatus(0, l_tDevReturn);
- BYTE l_btStatus[2] = { 0 };
- vGetLightStatus(l_btStatus, l_tDevReturn);
-
- //process hspscanner Tips light 26-6
- if(dwPort == 3)
- {
- l_oDuniteResult = iSetLightStatus(m_pHandle,6, btData >> (2) & 1, l_tDevReturn);
- if (SUCCESS != l_oDuniteResult)
- {
- FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetLightStatus");
- return Error_Unexpect;
- }
- return l_ErrRlt;
- }
- //process hspscanner Tips light
-
- //process other light
- if (dwPort>1) //12路扩展板只能支持dwPort=0,dwPort=1
- {
- return l_ErrRlt;
- }
- //先判断usb通断
- if (dwPort == 0)
- {
- if (btData >> 1 & 1)
- {
- //usb 通
- l_oDuniteResult = iUsbOnOffSetting(m_pHandle,1, 0, l_tDevReturn);
- }
- else
- {
- //usb 断
- l_oDuniteResult = iUsbOnOffSetting(m_pHandle,0, 0, l_tDevReturn);
- }
- }
- //BYTE l_byStatusChanged = l_btStatus[dwPort] ^ btData;
- for (int i = 1; i <= 8; i++)
- {
- int l_iIoNum = dwPort * 8 + i;
- if (l_iIoNum>SIGNAL_NUM)
- {
- break;
- }
- //if (l_byStatusChanged & (1 << (i - 1)))
- {
- memset(l_tDevReturn, 0, sizeof(l_tDevReturn));
- int l_iGrg = -1;
- //can't find no
- if(!vChangeTable(l_iGrg, l_iIoNum, false))
- continue;
- /*
- //jump usb control
- if(l_iGrg == -1)
- continue;
- */
- //printf("l_iGrg = %d, on = %d\n",l_iGrg,btData >> (i - 1) & 1);
- l_oDuniteResult = iSetLightStatus(m_pHandle,l_iGrg, btData >> (i - 1) & 1, l_tDevReturn);
- if (SUCCESS != l_oDuniteResult)
- {
- FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetLightStatus");
- return Error_Unexpect;
- }
- }
- }
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return l_ErrRlt;
- }
- ErrorCodeEnum GPIOClassImpl::ReadPort(DWORD dwPort, BYTE& btStatus)
- {
- LOG4VTM_FUNCTION();
- LOG4VTM(INFO,__FUNCTION__);
- ErrorCodeEnum l_ErrRlt = Error_Succeed;
- btStatus = 0;
- if (0>dwPort || dwPort >= MAX_PORT_NUM)
- {
- //LOG4VTM(ERROR,__FUNCTION__<<"0>dwPort || dwPort >= MAX_PORT_NUM"<<"dwPort = "<<dwPort);
- char msg[1024]={0};
- sprintf(msg,"invalid param dwPort = %d",dwPort);
- FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_INVALIDPARAM, msg);
- return Error_Param;
- }
- /*
- if (0 > dwPort || dwPort >= MAX_PORT_NUM) //错误dwPort输入
- {
- return Error_Param;
- }
- */
- //get IOIn status start
- if(dwPort == 2)
- {
- BYTE l_btStatus[2] = { 0 };
- tDevReturn l_tDevReturn[8] = { 0 };
- int l_iStartus = iGetIOInStatus(0, l_tDevReturn);
- vGetIOInStatus(l_btStatus, l_tDevReturn);
- btStatus = l_btStatus[0];
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return l_ErrRlt;
- }
- //get IOIn status end
-
- //get hspscanner Tips light status
- if(dwPort == 3)
- {
- tDevReturn l_tDevReturn[8] = { 0 };
- int l_iStartus = iGetLightStatus(0, l_tDevReturn);
- btStatus |= l_tDevReturn[5].iLogicCode << 5;
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return l_ErrRlt;
- }
- //get hspscanner Tips light status
- //get other light status
- if (dwPort > 1) //12路扩展板只能支持dwPort=0,dwPort=1
- {
- return l_ErrRlt;
- }
- BYTE l_btStatus[2] = { 0 };
- tDevReturn l_tDevReturn[8] = { 0 };
- int l_iStartus = iGetLightStatus(0, l_tDevReturn);
- vGetLightStatus(l_btStatus, l_tDevReturn);
- // BYTE l_byMask[] = { 0x0F,0x03,0,0 };
- // btStatus = l_btStatus[dwPort] & l_byMask[dwPort];
- btStatus = l_btStatus[dwPort];
- LOG4VTM(INFO,__FUNCTION__<<" OK");
- return l_ErrRlt;
- }
- DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
- {
- baseObj = new GPIOClassImpl();
- if (baseObj == NULL) {
- return Error_Resource;
- }
- cmb::log_init_config config;
- config.dev_name = "Gpio";
- config.log_level = CMB_LOG_LEVEL_TRACE;
- #if defined(_MSC_VER)
- config.log_dir = ("C:\\rvc\\dbg\\");
- #else
- config.log_dir = ("/opt/rvc/dbg/");
- #endif //_MSC_VER
- std::string str;
- cmb::log4vendor::init(config, str);
- printf("init after: %s\n", str.c_str());
- return Error_Succeed;
- }
- DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
- {
- if (pBaseObj == NULL) {
- return Error_Param;
- }
- if (GPIOClassImpl* pTmp = dynamic_cast<GPIOClassImpl*>(pBaseObj))
- {
- delete pTmp;
- pTmp = NULL;
- return Error_Succeed;
- }
- return Error_Param;
- }
- void GPIOClassImpl::ZeroDevErrorInfo()
- {
- memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
- }
- void GPIOClassImpl::FormatDevErrorInfo(const char* funcname, int line, int errCode,const char* errStr)
- {
- ZeroDevErrorInfo();
- snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "ErrCode:0x%x,Description:Func:%s,Line:%d,Msg:%s", errCode, funcname, line, errStr);
- m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
- LOG4VTM(ERROR,m_DevErrorInfo.szErrMsg);
- }
- void GPIOClassImpl::vGetLightStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn)
- {
- int l_Grg_vaules[SIGNAL_NUM] = { 0 };
- for (int i = 0; i < 8; i++)
- {
- l_Grg_vaules[i] = p_ptDevReturn[i].iLogicCode;
- //p_pbtStatus[0] |= (p_ptDevReturn[i].iLogicCode << i);
- if (i < 4)
- {
- l_Grg_vaules[i + 8] = p_ptDevReturn[i + 4].iPhyCode;
- // p_pbtStatus[1] |= (p_ptDevReturn[i+4].iPhyCode << i);
- }
- }
- int l_iZS = 0, l_iGrg = 0;
- int l_ZS_vaules[SIGNAL_NUM] = { 0 };
- for (int j = 0; j < SIGNAL_NUM; j++)
- {
- printf("vGetLightStatus[%d] = %d\n",j+1,l_Grg_vaules[j]);
- l_iGrg = j + 1;
- if(vChangeTable(l_iGrg, l_iZS))
- {
- l_ZS_vaules[l_iZS - 1] = l_Grg_vaules[j];
- }
- }
- p_pbtStatus[0] = 0;
- p_pbtStatus[1] = 0;
- for (int k = 0; k < SIGNAL_NUM; k++)
- {
- //printf("light state[%d] : %d\n",k,l_ZS_vaules[k]);
- if (k < 8)
- {
- p_pbtStatus[0] |= l_ZS_vaules[k] << k;
- }
- else
- {
- p_pbtStatus[1] |= l_ZS_vaules[k] << (k - 8);
- }
- }
- }
- /*
- 招行信号灯序号 公司信号灯编号
- 1.读卡器 2.读/发卡指示灯
- 2.USB通断控制
- 3.身份证灯 1.身份证指示灯
- 4.键盘提示灯 5.键盘照明灯
- 5.脸部照明灯 10.摄像头补光灯
- 6.故障灯 12.故障指示灯
- 7.发卡器维护灯 8.读/发卡器维护灯
- 8.USB口提示灯 4.USB口提示灯
- 9.非接IC提示 9.非接指示灯
- 10.二维码提示灯
- 11.指纹仪提示灯 11.指纹仪指示灯
- 12.凭条打印提示灯 7.凭条指示灯
- 13.高拍仪照明灯 3.高拍仪照明灯
- 14.打印盖章提示绿灯
- 15.纸槽提示绿灯
- 16.纸槽缺纸红灯
- */
- //信号灯编号转换
- bool GPIOClassImpl::vChangeTable(int &p_iGrg, int &p_iZS, bool p_bToZS)
- {
- int l_iGrgs[]={2,1,5,10,12,8,4,9,11,7,3};
- int l_iZSs[] ={1,3,4,5,6,7,8,9,11,12,13};
- //grg转zs
- if (p_bToZS)
- {
- for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
- {
- if (p_iGrg == l_iGrgs[i])
- {
- p_iZS = l_iZSs[i];
- return true;
- }
- }
- }
- else
- {
- //zs转grg
- for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
- {
- if (p_iZS == l_iZSs[i])
- {
- p_iGrg = l_iGrgs[i];
- return true;
- }
- }
- }
-
- return false;
- }
- #define IOEXTEND_ALLDOOR 0
- int GPIOClassImpl::iGetLightStatus(int p_piLightNum, tDevReturn *p_psStatus)
- {
- tIOStatus l_stIOStatus;
- int l_iReuslt = iGetIODevStatus(m_pHandle,&l_stIOStatus, p_psStatus);
- if (l_iReuslt == SUCCESS)
- {
- char l_acStatusData[0x20];
- memset(l_acStatusData, 0x00, sizeof(l_acStatusData));
- sprintf(l_acStatusData, "I%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- l_stIOStatus.byLightStauts[0], l_stIOStatus.byLightStauts[1], l_stIOStatus.byLightStauts[2],
- l_stIOStatus.byLightStauts[3], l_stIOStatus.byLightStauts[4], l_stIOStatus.byLightStauts[5],
- l_stIOStatus.byLightStauts[6], l_stIOStatus.byLightStauts[7], l_stIOStatus.byLightStauts[8],
- l_stIOStatus.byLightStauts[9], l_stIOStatus.byLightStauts[10], l_stIOStatus.byLightStauts[11]);
- memcpy(p_psStatus[0].acReserve, l_acStatusData, strlen(l_acStatusData));
- if (p_piLightNum == IOEXTEND_ALLDOOR)
- {
- int i = 0;
- for (i = 0; i < 4; i++)
- {
- p_psStatus[i].iLogicCode = l_stIOStatus.byLightStauts[i];
- p_psStatus[i].iPhyCode = l_stIOStatus.byLightStauts[i];
- }
- for (i = 4; i < 8; i++)
- {
- p_psStatus[i].iLogicCode = l_stIOStatus.byLightStauts[i];
- p_psStatus[i].iPhyCode = l_stIOStatus.byLightStauts[i + 4];
- }
- }
- else
- {
- p_psStatus[0].iLogicCode = l_stIOStatus.byLightStauts[p_piLightNum - 1];
- p_psStatus[0].iPhyCode = l_stIOStatus.byLightStauts[p_piLightNum - 1];
- }
- }
- return l_iReuslt;
- }
- int GPIOClassImpl::iGetIOInStatus(int p_piLightNum, tDevReturn *p_psStatus)
- {
- tIOStatus l_stIOStatus;
- int l_iReuslt = iGetIODevStatus(m_pHandle,&l_stIOStatus, p_psStatus);
- if (l_iReuslt == SUCCESS)
- {
- char l_acStatusData[0x20];
- memset(l_acStatusData, 0x00, sizeof(l_acStatusData));
- sprintf(l_acStatusData, "I%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
- l_stIOStatus.byDoorStauts[0], l_stIOStatus.byDoorStauts[1], l_stIOStatus.byDoorStauts[2],
- l_stIOStatus.byDoorStauts[3], l_stIOStatus.byDoorStauts[4], l_stIOStatus.byDoorStauts[5],
- l_stIOStatus.byDoorStauts[6], l_stIOStatus.byDoorStauts[7], l_stIOStatus.byDoorStauts[8],
- l_stIOStatus.byDoorStauts[9], l_stIOStatus.byDoorStauts[10], l_stIOStatus.byDoorStauts[11]);
- memcpy(p_psStatus[0].acReserve, l_acStatusData, strlen(l_acStatusData));
- if (p_piLightNum == IOEXTEND_ALLDOOR)
- {
- int i = 0;
- for (i = 0; i < 4; i++)
- {
- p_psStatus[i].iLogicCode = l_stIOStatus.byDoorStauts[i];
- p_psStatus[i].iPhyCode = l_stIOStatus.byDoorStauts[i];
- }
- for (i = 4; i < 8; i++)
- {
- p_psStatus[i].iLogicCode = l_stIOStatus.byDoorStauts[i];
- p_psStatus[i].iPhyCode = l_stIOStatus.byDoorStauts[i + 4];
- }
- }
- else
- {
- p_psStatus[0].iLogicCode = l_stIOStatus.byDoorStauts[p_piLightNum - 1];
- p_psStatus[0].iPhyCode = l_stIOStatus.byDoorStauts[p_piLightNum - 1];
- }
- }
- return l_iReuslt;
- }
- void GPIOClassImpl::vGetIOInStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn)
- {
- int l_Grg_vaules[SIGNAL_NUM] = { 0 };
- for (int i = 0; i < 8; i++)
- {
- l_Grg_vaules[i] = p_ptDevReturn[i].iLogicCode;
- if (i < 4)
- {
- l_Grg_vaules[i + 8] = p_ptDevReturn[i + 4].iPhyCode;
- }
- }
- int l_iZS = 0, l_iGrg = 0;
- int l_ZS_vaules[SIGNAL_NUM] = { 0 };
- for (int j = 0; j < SIGNAL_NUM; j++)
- {
- printf("vGetIOInStatus[%d] = %d\n",j+1,l_Grg_vaules[j]);
- LOG4VTM(INFO,__FUNCTION__<<" org vGetIOInStatus["<<j+1<<"]"<<" = "<<l_Grg_vaules[j]);
- l_iGrg = j + 1;
- if(vChangeTableIOIn(l_iGrg, l_iZS))
- {
- //subtract start no 17
- l_ZS_vaules[l_iZS - 17] = l_Grg_vaules[j];
- }
- }
- p_pbtStatus[0] = 0;
- p_pbtStatus[1] = 0;
- for (int k = 0; k < SIGNAL_NUM; k++)
- {
- //printf("IOIn state[%d] : %d\n",k,l_ZS_vaules[k]);
- LOG4VTM(INFO,__FUNCTION__<<" change state["<<k<<"]"<<" = "<<l_ZS_vaules[k]);
- if (k < 8)
- {
- p_pbtStatus[0] |= l_ZS_vaules[k] << k;
- }
- else
- {
- p_pbtStatus[1] |= l_ZS_vaules[k] << (k - 8);
- }
- }
- }
- bool GPIOClassImpl::vChangeTableIOIn(int &p_iGrg, int &p_iZS, bool p_bToZS)
- {
- int l_iGrgs[]={1,2,6,7,9};
- int l_iZSs[] ={17,18,20,21,19};//zs no
- //grg转zs
- if (p_bToZS)
- {
- for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
- {
- if (p_iGrg == l_iGrgs[i])
- {
- p_iZS = l_iZSs[i];
- return true;
- }
- }
- }
- else
- {
- //zs转grg
- for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
- {
- if (p_iZS == l_iZSs[i])
- {
- p_iGrg = l_iGrgs[i];
- return true;
- }
- }
- }
- return false;
- }
|