123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- #include "Gpio.nantian.h"
- GPIO_NT_NAC::GPIO_NT_NAC()
- {
- //初始化
- m_trace = new CILIXTrace(NULL, "NT_NAC", "GPIO_NT_NAC");
- m_device = NULL;
- dplHandle = NULL;
- m_connect = false;
- VC_Creat_NTDRV_NT_NAC = NULL;
- VC_Destroy_NTDRV_NT_NAC = NULL;
- m_loadDllFlag = false;
- m_busy_flag = false;
- m_read_port_flag = false;
- m_ptStatus = 0;
- //加载设备库
- m_loadDllFlag = LoadNTDRVSO();
- }
- GPIO_NT_NAC::~GPIO_NT_NAC()
- {
- if (m_trace != NULL)
- delete m_trace;
- if (m_device != NULL)
- VC_Destroy_NTDRV_NT_NAC(m_device);
- if (dplHandle != NULL)
- {
- dlclose(dplHandle);
- dplHandle = NULL;
- }
- }
- bool GPIO_NT_NAC::LoadNTDRVSO()
- {
- char sCurPath[1024] = "";
- char sSOPath[1024] = "";
- CILIX_AUX_X::CILIX_GetModuleCurPath(sCurPath);
- sprintf(sSOPath, "%snantian/libDRV_NT_NAC.nantian.so", sCurPath);
- m_trace->WriteTrace("GPIO_NT_NAC::LoadNTDRVDLL", "DLLPath=%s", sSOPath);
- LOG4VTM(WARN, "GPIO_NT_NAC::LoadNTDRVDLL"
- << "DLLPath=" << sSOPath);
- void *pszErr = NULL;
- dplHandle = dlopen(sSOPath, RTLD_LAZY);
- if (!dplHandle || pszErr)
- {
- m_trace->WriteTrace("GVar::LoadDRVSO", "Load SO Fail!,reson:%s", dlerror());
- LOG4VTM(WARN, "GVar::LoadDRVSO"
- << "Load SO Fail!,reson:%s" << dlerror());
- return false;
- }
- VC_Creat_NTDRV_NT_NAC = (pCreat_NTDRV_NT_NAC)dlsym(dplHandle, "Creat_NTDRV_NT_NAC");
- if (VC_Creat_NTDRV_NT_NAC == NULL)
- {
- m_trace->WriteTrace("GVar::LoadDRVSO", "Load Create_DRV_Siu Fali!");
- LOG4VTM(WARN, "GVar::LoadDRVSO"
- << "Load Create_DRV_Siu Fali!");
- return false;
- }
- VC_Destroy_NTDRV_NT_NAC = (pDestroy_NTDRV_NT_NAC)dlsym(dplHandle, "Destory_NTDRV_NT_NAC");
- if (VC_Destroy_NTDRV_NT_NAC == NULL)
- {
- m_trace->WriteTrace("GVar::LoadDRVSO", "Load Destory_DRV_Siu Fail!");
- LOG4VTM(WARN, "GVar::LoadDRVSO"
- << "Load Destory_DRV_Siu Fail!");
- return false;
- }
- m_device = VC_Creat_NTDRV_NT_NAC();
- return true;
- }
- GPIO_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
- {
- baseObj = new GPIO_NT_NAC();
- //初始化日志
- char INIPath[100] = "";
- CILIX_AUX_X::CILIX_GetModuleCurPath(INIPath);
- strcat(INIPath, "nantian/log.nantian.ini");
-
- char log_dir[100] = "";
- CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_dir", log_dir, "/etc/nantian");
- char log_level[100] = "";
- CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_level", log_level, "3");
- cmb::log_init_config config;
- config.dev_name = "GPIO";
- config.log_dir = log_dir;
- config.log_level = atoi(log_level);
- std::string str;
- cmb::log4vendor::init(config, str);
- LOG4VTM(WARN, "GPIO_NT_NAC::GPIO_NT_NAC "
- << "libGpio.Nantian.1.1.so -v 1.0.0.2");
- if (baseObj == NULL)
- return Error_Resource;
- return Error_Succeed;
- }
- GPIO_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
- {
- if (pBaseObj == NULL)
- return Error_Param;
- /*LOG4VTM(WARN, "ReleaseDevComponent "
- << "Enter");
- LOG4VTM(WARN, "ReleaseDevComponent "
- << "Exit");*/
- delete ((GPIO_NT_NAC *)pBaseObj);
- return Error_Succeed;
- }
- ////////////////////////////////////////////////////////////////////////////////////////
- ErrorCodeEnum GPIO_NT_NAC::GetLastErr(DevErrorInfo &devErrInfo)
- {
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "GetLastErr", &iret);
- LOG4VTM(WARN, "GetLastErr "
- << "Enter");
- devErrInfo.dwErrMsgLen = m_errorInfo.dwErrMsgLen;
- strcpy(devErrInfo.szErrMsg, m_errorInfo.szErrMsg);
- LOG4VTM(WARN, "GetLastErr "
- << "Exit");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::DevOpen(GpioInitParam initParam)
- {
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "DevOpen", &iret);
- LOG4VTM(WARN, "DevOpen "
- << "Enter");
- //判断设备库加载是否成功
- if (this->m_loadDllFlag == false)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "load vendor NTDRV dll failed!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- iret = Error_DevLoadFileFailed;
- return Error_DevLoadFileFailed;
- }
- //判断是否初始化
- if (m_connect == true)
- return Error_Succeed;
- //赋值
- m_initParam = initParam;
- //参数判断
- if (m_initParam.dwPortNum > MAX_PORT_NUM)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- iret = Error_Param;
- return Error_Param;
- }
- //记录初始化参数信息
- int ilen = 0;
- char logBuff[100] = "";
- sprintf(logBuff, "PortsInfo: dwPortNum=%d", m_initParam.dwPortNum);
- for (int i = 0; i < m_initParam.dwPortNum; i++)
- {
- ilen = strlen(logBuff);
- sprintf(logBuff + ilen, ", dir[%d]=%d", i, m_initParam.dir[i]);
- }
- m_trace->WriteTrace("DevOpen", "%s", logBuff);
- LOG4VTM(WARN, "DevOpen "
- << "logBuff");
- //端口由应用传入,传入的是设备2的端口号;
- //打开设备
- iret = m_device->OpenDevice(initParam.dwPort-1, initParam.dwBaudRate);
- m_trace->WriteTrace("DevOpen", "Invoke OpenDevice(%d,%d) return %d", initParam.dwPort-1, initParam.dwBaudRate, iret);
- LOG4VTM(WARN, "DevOpen "
- << "Invoke OpenDevice Port=ttyXRUSB" << initParam.dwPort -1 << " Rate=" << initParam.dwBaudRate << "return:" << iret);
- if (iret != 0)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "connect to device failed!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- m_connect = false;
- return Error_DevConnFailed;
- }
- m_connect = true;
- LOG4VTM(WARN, "DevOpen "
- << "Exit ");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::DevClose()
- {
- m_busy_flag = true;
- //WAITING_LOOP();
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "DevClose", &iret);
- LOG4VTM(WARN, "DevClose "
- << "Enter ");
- //判断是否初始化
- if (m_connect == true)
- {
- int iret = m_device->CloseDevice();
- m_trace->WriteTrace("DevClose", "Invoke CloseDevice return %d", iret);
- LOG4VTM(WARN, "DevClose "
- << "Invoke CloseDevice return " << iret);
- m_connect = false;
- }
- m_busy_flag = false;
- LOG4VTM(WARN, "DevClose "
- << "Exit ");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::GetDevCategory(DevCategoryInfo &devCategory)
- {
- m_busy_flag = true;
- //WAITING_LOOP();
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "GetDevCategory", &iret);
- LOG4VTM(WARN, "GetDevCategory "
- << "Enter ");
- //赋值
- strcpy(devCategory.szType, "PVER=NT#MID=NT_NAC");
- strcpy(devCategory.szVendor, "nantian");
- devCategory.version.wMajor = 1;
- devCategory.version.wMinor = 0;
- devCategory.version.wRevision = 0;
- devCategory.version.wBuild = 2;
- //设备未连接
- if (m_connect == false)
- {
- strcpy(devCategory.szModel, "");
- devCategory.eState = DEVICE_STATUS_NOT_READY;
- //置标记
- m_busy_flag = false;
- return Error_Succeed;
- }
- //通过获取固件版本来获取硬件设备状态
- char sDevVer[100] = "";
- char sDevVerEx[100] = "";
- //设备1
- int iret1 = m_device->GetFirmwareVersion(sDevVer);
- m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "GetDevCategory", "[1]Invoke GetFirmwareVersion return %d", iret1);
- LOG4VTM(WARN, "GetDevCategory "
- << "Invoke GetFirmwareVersion return " << iret1);
- //设备2
- int iret2 = m_device->GetFirmwareVersionEx(sDevVerEx);
- m_trace->WriteTrace(CILIXTRACE_L_DEBUG, "GetDevCategory", "[2]Invoke GetFirmwareVersion return %d", iret2);
- LOG4VTM(WARN, "GetDevCategory "
- << "Invoke GetFirmwareVersionEx return " << iret2);
- char sDevVerModel[100] = "";
- sprintf(sDevVerModel,"FWID=%s",sDevVer);
- strcpy(devCategory.szModel, sDevVerModel);
- if (iret1 == 0 && iret2 == 0)
- devCategory.eState = DEVICE_STATUS_NORMAL;
- else
- devCategory.eState = DEVICE_STATUS_FAULT;
- m_busy_flag = false;
- LOG4VTM(WARN, "GetDevCategory "
- << "Exit ");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::Reset()
- {
- m_busy_flag = true;
- //WAITING_LOOP();
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "Reset", &iret);
- LOG4VTM(WARN, "Reset "
- << "Enter ");
- //判断是否连接
- if (m_connect == false)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "device not connected!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- iret = Error_DevNotAvailable;
- return Error_DevNotAvailable;
- }
- //复位设备
- iret = m_device->ResetDevice();
- m_trace->WriteTrace("Reset", "Invoke ResetDevice return %d", iret);
- LOG4VTM(WARN, "Reset "
- << "Invoke ResetDevice return: " << iret);
- if (iret != 0 )
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- return Error_DevCommFailed;
- }
- m_busy_flag = false;
- LOG4VTM(WARN, "Reset "
- << "Exit ");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::WritePort(DWORD dwPort, BYTE btData)
- {
- m_busy_flag = true;
- //WAITING_LOOP();
- int iret = Error_Succeed;
- CILIXAutoTrace __at(m_trace, "WritePort", &iret);
- LOG4VTM(WARN, "WritePort "
- << "Enter ");
- //判断是否连接
- if (m_connect == false)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "device not connected!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- iret = Error_DevNotAvailable;
- return Error_DevNotAvailable;
- }
- m_trace->WriteTrace("WritePort", "dwPort=%d, btData=%d", dwPort, btData);
- LOG4VTM(WARN, "WritePort "
- << "dwPort=" << dwPort << " btData= " << (int)btData);
- //判断端口是否合法
- if (dwPort > m_initParam.dwPortNum || dwPort < 0)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- iret = Error_Param;
- return Error_Param;
- }
- //判断端口的属性是否合法
- if (m_initParam.dir[dwPort] != 1)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Type of port to set is invalid!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- iret = Error_Param;
- return Error_Param;
- }
- //设置输出
- if (dwPort == 0)
- {
- //P0.1,设备1,OUT1
- iret = m_device->SetOutputStatus(1, (btData & 0x01)); //读卡器指示灯
- //P0.2,设备2,OUT8
- iret = m_device->SetOutputStatusEx(8, (btData & 0x02) >> 1); //USB通断控制
- //P0.3,设备1,OUT3
- iret = m_device->SetOutputStatus(3, (btData & 0x04) >> 2); //身份证指示灯
- //P0.4,设备2,OUT2
- iret = m_device->SetOutputStatusEx(2, (btData & 0x08) >> 3); //键盘指示灯
- //P0.5,设备2,OUT0
- iret = m_device->SetOutputStatusEx(0, (btData & 0x10) >> 4); //面部照明灯
- //P0.6,设备2,OUT1
- iret = m_device->SetOutputStatusEx(1, (btData & 0x20) >> 5); //故障灯
- //P0.7,设备1,OUT0
- iret = m_device->SetOutputStatus(0, (btData & 0x40) >> 6); //卡机维护灯
- //P0.8,设备2,OUT6
- iret = m_device->SetOutputStatusEx(6, (btData & 0x80) >> 7); //USB指示灯
- }
- else if (dwPort == 1)
- {
- //P1.1,设备1,OUT8
- iret = m_device->SetOutputStatus(8, (btData & 0x01)); //非接指示灯
- //P1.2,设备2,OUT3
- iret = m_device->SetOutputStatusEx(3, (btData & 0x02) >> 1); //二维码指示灯
- //P1.3,设备1,OUT4
- iret = m_device->SetOutputStatus(4, (btData & 0x04) >> 2); //指纹仪指示灯
- //P1.4,设备1,OUT2
- iret = m_device->SetOutputStatus(2, (btData & 0x08) >> 3); //凭条指示灯
- //P1.5,13,设备2,OUT10
- iret = m_device->SetOutputStatusEx(10, (btData & 0x10) >> 4); //高拍仪照明灯
- //P1.6,设备2,OUT4
- iret = m_device->SetOutputStatusEx(4, (btData & 0x20) >> 5); //激光打印机绿灯
- //P1.7,设备1,OUT5
- iret = m_device->SetOutputStatus(5, (btData & 0x40) >> 6); //纸盒指示灯绿灯
- //P1.8,设备1,OUT6
- iret = m_device->SetOutputStatus(6, (btData & 0x80) >> 7); //纸盒指示灯红灯
- }
- else if (dwPort == 3)
- {
- //P1.1,25,设备2,OUT5
- iret = m_device->SetOutputStatusEx(5, (btData & 0x01)); //激光打印机红灯
- //P1.2,26,设备2,OUT9
- iret = m_device->SetOutputStatusEx(9, (btData & 0x02) >> 1); //高拍仪提示灯
- }
- if (iret != 0)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_busy_flag = false;
- return Error_DevCommFailed;
- }
- m_busy_flag = false;
- LOG4VTM(WARN, "WritePort "
- << "Exit ");
- return Error_Succeed;
- }
- ErrorCodeEnum GPIO_NT_NAC::ReadPort(DWORD dwPort, BYTE &btStatus)
- {
- m_read_port_flag = true;
- int iret = Error_Succeed;
- //CILIXAutoTrace __at(m_trace,"ReadPort",&iret);
- //判断是否连接
- if (m_connect == false)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "device not connected!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_read_port_flag = false;
- iret = Error_DevNotAvailable;
- return Error_DevNotAvailable;
- }
- //m_trace->WriteTrace("ReadPort","dwPort=%d",dwPort);
- //判断端口是否合法
- if (dwPort > m_initParam.dwPortNum || dwPort < 0)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Number of port to set is invalid!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_read_port_flag = false;
- iret = Error_Param;
- return Error_Param;
- }
- //判断端口的属性是否合法
- if (m_initParam.dir[dwPort] != 0)
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Type of port to set is invalid!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_read_port_flag = false;
- iret = Error_Param;
- return Error_Param;
- }
- if (dwPort == 2)
- {
- int p21 = 0, p22 = 0, p23 = 0, p24 = 0, p25 = 0, p26 = 0, p27 = 0, p28 = 0;
- //***P2.1,震动传感器,设备1,IN4
- p21 = m_device->GetInputStatus(4);
- if (p21 == 1)
- p21 = 0;
- else if (p21 == 0)
- p21 = 1;
- //***P2.2,柜门开关
- int f_d = m_device->GetInputStatus(0); //前门下,IN0
- int re = m_device->GetInputStatus(5); //后门,IN5
- if (f_d >= 0 && re >= 0)
- p22 = f_d & re; //默认0为开
- if (p22 == 1)
- p22 = 0;
- else if (p22 == 0)
- p22 = 1;
- //***P2.3,挂摘机开关,设备2,IN2
- p23 = m_device->GetInputStatusEx(2);
- if (p23 == 1)
- p23 = 0;
- else if (p23 == 0)
- p23 = 1;
- //***P2.4,人体接近传感器,设备1,IN3
- p24 = m_device->GetInputStatus(3);
- //if(p24 == 1) p24 = 0;
- //else if(p24 == 0) p24 = 1;
- //***P2.5,卡嘴检测
- p25 = m_device->GetInputStatus(1);
- //***P2.6,开机盖检测,设备1,IN7
- p26 = m_device->GetInputStatus(7);
- if (p26 == 1)
- p26 = 0;
- else if (p26 == 0)
- p26 = 1;
-
- if (p21 >= 0 && p22 >= 0 && p23 >= 0 && p24 >= 0 && p25 >=0&& p26 >= 0)
- {
- btStatus = p21 | (p22 << 1) | (p23 << 2) | (p24 << 3) | (p25 << 4) | (p26 << 5);
- }
- else
- {
- memset(m_errorInfo.szErrMsg, 0, sizeof(m_errorInfo.szErrMsg));
- strcpy(m_errorInfo.szErrMsg, "Communication failed between HOST and Device!");
- m_errorInfo.dwErrMsgLen = strlen(m_errorInfo.szErrMsg);
- //置标记
- m_read_port_flag = false;
- iret = Error_DevCommFailed;
- return Error_DevCommFailed;
- }
- }
- m_ptStatus = btStatus;
- m_last_errorcode = (ErrorCodeEnum)iret;
- m_read_port_flag = false;
- return (ErrorCodeEnum)iret;
- }
|