Преглед на файлове

#IQRV #comment [DevAdapter] 添加恒银二期二轮源码 cw/2021.0521.01

gifur преди 4 години
родител
ревизия
fc225ca73c
променени са 29 файла, в които са добавени 444 реда и са изтрити 794 реда
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 2 3
      DevAdapter/cw/cardissuer.1.1/cardissuerimpl.cpp
  3. 26 5
      DevAdapter/cw/contactlesscard.1.1/contactlessimpl.cpp
  4. 3 1
      DevAdapter/cw/deps/cw.baseio/SUsb.cpp
  5. 2 2
      DevAdapter/cw/deps/cw.baseio/SUsb.h
  6. 1 12
      DevAdapter/cw/deps/cw.baseio/public.cpp
  7. 1 1
      DevAdapter/cw/deps/cw.baseio/serial.cpp
  8. 58 0
      DevAdapter/cw/deps/cw.baseio/sini.cpp
  9. 20 0
      DevAdapter/cw/deps/cw.baseio/sini.h
  10. 2 1
      DevAdapter/cw/fingerprint.1.1/FingerDev.cpp
  11. 15 3
      DevAdapter/cw/fingerprint.1.1/FingerPrintImpl.cpp
  12. 0 2
      DevAdapter/cw/gpio.1.1/gpioclassdev.cpp
  13. 14 8
      DevAdapter/cw/gpio.1.1/gpioclassimpl.cpp
  14. 23 52
      DevAdapter/cw/gpio.1.1/gpiodevice.cpp
  15. 81 7
      DevAdapter/cw/hspscanner.1.1/hspscannerimpl.cpp
  16. 19 2
      DevAdapter/cw/hspscanner.1.1/hspscannerimpl.h
  17. 2 1
      DevAdapter/cw/idcer.1.1/idcertconn.cpp
  18. 52 21
      DevAdapter/cw/idcer.1.1/idcertimpl.cpp
  19. 52 50
      DevAdapter/cw/pinpad.1.1/pinpadimpl.cpp
  20. 0 2
      DevAdapter/cw/pinpad.1.1/pinpadimpl.h
  21. 43 1
      DevAdapter/cw/pinpad.1.1/pinpadxzf31.cpp
  22. 4 0
      DevAdapter/cw/pinpad.1.1/pinpadxzf31.h
  23. 0 26
      DevAdapter/cw/termalprint.1.1/CMakeLists.txt
  24. 0 477
      DevAdapter/cw/termalprint.1.1/termalprintimpl.cpp
  25. 0 112
      DevAdapter/cw/termalprint.1.1/termalprintimpl.h
  26. 13 0
      DevAdapter/cw/ups.1.1/deviceconnect.cpp
  27. 2 0
      DevAdapter/cw/ups.1.1/deviceconnect.h
  28. 5 2
      DevAdapter/cw/ups.1.1/upsimpl.cpp
  29. 3 2
      DevAdapter/cw/watchdog.1.1/watchdogimpl.cpp

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -142,7 +142,7 @@ if(DEVADAPTER_USING_CONAN)
     set(KEBA_CONAN_LIB_NAME keba/2021.0520.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0519.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2021.0519.01@LR04.02_VendorLib/testing)
-	set(CW_CONAN_LIB_NAME cw/2021.0317.01@LR04.02_VendorLib/testing)
+	set(CW_CONAN_LIB_NAME cw/2021.0521.01@LR04.02_VendorLib/testing)
     set(GWI_CONAN_LIB_NAME gwi/2021.0402.01@LR04.02_VendorLib/testing)
 endif(DEVADAPTER_USING_CONAN)
  

+ 2 - 3
DevAdapter/cw/cardissuer.1.1/cardissuerimpl.cpp

@@ -56,11 +56,10 @@ ErrorCodeEnum CardIssuerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     int iRt = m_pDriver->getFirmversion((unsigned char*)version);
     ErrorCodeEnum eRt = HandleDevError(iRt, "GetDevCategory");
     if(Error_Succeed == eRt)
-    {
         strcpy(sFwid, version+18);
-    }
     else
-        strcpy(sFwid, "G422-72");
+        return eRt;
+//        strcpy(sFwid, "G422-72");
 
     char szType[] = {"PVER=ACT#MID=F5-5540"};
     char szModel[] = "CM=V2.0#FWID=%s#CID=00000000";

+ 26 - 5
DevAdapter/cw/contactlesscard.1.1/contactlessimpl.cpp

@@ -73,8 +73,9 @@ ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
     int iRet = m_PcscCall.SendCMD(sSend, sSer);
     if (iRet < 0)
     {
-        devCategory.eState = DEVICE_STATUS_NOT_READY;
-        sprintf(devCategory.szModel, szModel, "00000000");
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "GetDevCategory getFirmversion error");
+//        devCategory.eState = DEVICE_STATUS_NOT_READY;
+//        sprintf(devCategory.szModel, szModel, "00000000");
     }
     else
     {
@@ -229,6 +230,7 @@ ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus& devStatus)
 //
 ErrorCodeEnum ContactlessCardImpl::AbortRead()
 {
+    LOG4VTM_FUNCTION();
     return Error_Succeed;
 }
 //
@@ -246,6 +248,7 @@ ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char sc
     char sATR[256];
     if (!m_PcscCall.Connect(sATR))
         return GetErrorInfo(PCSC_NOT_CONN, "ActiveContactlessICCard %s", m_PcscCall.GetErrInfo());
+//    system("aplay /cashway/lib/ContactlessCard.wav &");
     outType = 'A';
     if (strcmp(sATR, "3B8F8001804F0CA000000306030001E00000018B") == 0)
         outType = '0';
@@ -261,7 +264,19 @@ ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char sc
     if (strlen(sATR) == 26 && strstr(sATR, "3B888001D103"))   //身份证
         outType = 'B';
 
-    Sleep(400);
+    sprintf(sATR, "ActiveContactlessICCard fstType=%c, scdType=%c, thdType=%c, Get=%c",
+            fstType, scdType, thdType, outType);
+    LOG4VTM(INFO, sATR);
+    //要求读卡时发蜂鸣声。银行读卡流程会两次调用该函数,会蜂鸣两次
+//    if (!m_bCardConn)
+    {
+        char sSend[32] = "6892030103010000";
+        m_PcscCall.SendCMD(sSend, sSend);
+        Sleep(100);
+        m_PcscCall.Connect(sATR);
+    }
+    //因为刚检测到卡的时候状态不够稳定,数据收发失败概率很大
+    Sleep(300);
     m_bCardConn = true;
     return GetErrorInfo(0, "ActiveContactlessICCard");
 }
@@ -335,20 +350,26 @@ ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& rec
     LOG4VTM_FUNCTION();
     if (m_bCardConn == false)
         return GetErrorInfo(PCSC_NOT_CONN, "RFTypeABCommand");
-
     char sSend[600];
     ::ANSIToHexStr(sendBuf.data, sendBuf.dwSize, sSend);
+#ifdef QT_DEBUG
     LOG4VTM(INFO, sSend);
-
+#endif
     int iRet = m_PcscCall.ChipIO(sSend, sSend);
     if (iRet < 0)
         return GetErrorInfo(PCSC_HARDWARE_ERROR, "RFTypeABCommand %s", m_PcscCall.GetErrInfo());
 
+#ifdef QT_DEBUG
     LOG4VTM(INFO, sSend);
+#endif
     int iLen = strlen(sSend);
     recvBuf.dwSize = iLen/2;
     ::HexStrToANSI(sSend, recvBuf.data, iLen);
     recvBuf.data[recvBuf.dwSize] = 0;
+
+    sprintf(sSend, "RFTypeABCommand send=%d recv=%d", sendBuf.dwSize, recvBuf.dwSize);
+    LOG4VTM(INFO, sSend);
+
     Sleep(10);
     return Error_Succeed;
 }

+ 3 - 1
DevAdapter/cw/deps/cw.baseio/SUsb.cpp

@@ -1,4 +1,4 @@
-// SUsb.cpp: implementation of the SUsb class.
+// SUsb.cpp: implementation of the SUsb class.
 //
 //////////////////////////////////////////////////////////////////////
 
@@ -246,6 +246,8 @@ int SUsb::Receive(unsigned char *sData, int iLen, int iTimeout)
 
 void SUsb::Flush()
 {
+    unsigned char sTemp[256];
+    while  (Receive(sTemp, 250, 10) > 0);
 //    libusb_clear_halt(m_hDevHandle, m_iRecvPoint);
 //    libusb_clear_halt(m_hDevHandle, m_iSendPoint);
 }

+ 2 - 2
DevAdapter/cw/deps/cw.baseio/SUsb.h

@@ -1,4 +1,4 @@
-// SUsb.h: interface for the SUsb class.
+// SUsb.h: interface for the SUsb class.
 //
 //////////////////////////////////////////////////////////////////////
 
@@ -27,7 +27,7 @@ public:
 	int Send(const unsigned char *sData, int iLen , int iTimeout = -1 );
 	//接收数据,返回已收长度,-1失败
 	int Receive(unsigned char *sData, int iLen, int iTimeout = -1 );
-	void Flush();//清除缓存
+    void Flush();//清除缓存
 
 	void SetEndPoint(int iSend, int iReav);
 

+ 1 - 12
DevAdapter/cw/deps/cw.baseio/public.cpp

@@ -182,21 +182,10 @@ void    ToLower(char* sIn, int iLen)
 //获取系统时间,毫秒
 INT64 GetSystemTime()
 {
-    INT64 lRet=0;
-    time_t tNow;
-    time(&tNow);
-    lRet = (INT64)tNow * 1000;
-#ifdef _WIN32
-    SYSTEMTIME sysTime;
-    GetLocalTime(&sysTime);
-    lRet += sysTime.wMilliseconds;
-#else
     struct timeval	tmv;
     struct timezone	tmz;
     gettimeofday(&tmv, &tmz);
-    lRet += tmv.tv_usec / 1000;
-#endif
-    return lRet;
+    return tmv.tv_sec * 1000 + tmv.tv_usec / 1000;
 }
 
 //BASE64格式字符串解码成文件数据

+ 1 - 1
DevAdapter/cw/deps/cw.baseio/serial.cpp

@@ -207,7 +207,7 @@ void SSerial::Flush()
 //	Return:		  -1: 发送失败 >0:已经发送的字节
 int SSerial::SendOnce(const char *sData, int iLen, int timeout )
 {
-    SetTimeout(timeout);
+//    SetTimeout(timeout);
     return write( m_hCom, sData, iLen); //实际写入的长度
 }
 

+ 58 - 0
DevAdapter/cw/deps/cw.baseio/sini.cpp

@@ -1,4 +1,62 @@
 #include "sini.h"
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#define MY_SHARE_MEM_NAME	"sewsharemem"
+
+SShareMem::SShareMem(char* sName, int iSize)
+{
+    m_pData = NULL;
+    strcpy(m_sName, sName);
+    m_iSize = iSize;
+}
+
+SShareMem::SShareMem()
+{
+    m_pData = NULL;
+    strcpy(m_sName, MY_SHARE_MEM_NAME);
+    m_iSize = 1024;
+}
+
+SShareMem::~SShareMem()
+{
+    Release();
+}
+
+void* SShareMem::GetShareMem()
+{
+    if (m_pData)	return m_pData;
+    key_t	key = ftok(m_sName, 10);
+    //Open the shared memory segment ,create if necessary
+    m_ShmID = shmget(key, m_iSize, IPC_CREAT | IPC_EXCL | 0666);
+
+    //egment probably already exists - try as a client
+    if (m_ShmID == -1)
+        m_ShmID = shmget(key, m_iSize, 0);
+
+    if (m_ShmID == -1)
+        return NULL;
+    m_pData = shmat(m_ShmID, 0, 0);
+    return m_pData;
+}
+
+void SShareMem::Release()
+{
+    if (m_pData == NULL) return;
+#ifdef _WIN32
+    UnmapViewOfFile(m_pData);
+    CloseHandle(m_hMap);
+#endif
+#ifdef LINUX
+    shmctl(m_ShmID, IPC_RMID, 0);
+#endif
+#ifdef ANDROID
+    delete m_pData;
+#endif
+    m_pData = NULL;
+    return;
+}
+
 
 
 SIni::SIni()

+ 20 - 0
DevAdapter/cw/deps/cw.baseio/sini.h

@@ -2,6 +2,26 @@
 #define SINI_H
 #include "define.h"
 
+MYEXPORTCLASS SShareMem
+{
+public:
+    SShareMem(char* sName, int iSize);
+    SShareMem();
+    ~SShareMem();
+    void*	GetShareMem();
+    void	Release();
+protected:
+    char	m_sName[64];
+    int		m_iSize;
+    void*	m_pData;
+#ifdef _WIN32
+    HANDLE	m_hMap;
+#else
+    int		m_ShmID;
+#endif
+};
+
+//////////////////////////
 
 MYEXPORTCLASS SIni
 {

+ 2 - 1
DevAdapter/cw/fingerprint.1.1/FingerDev.cpp

@@ -31,7 +31,8 @@ int FingerDev::Close()
 
 int FingerDev::Reset()
 {
-    return LS_ERROR_SUCCESS;
+    pWELLDeviceClose();
+    return pWELLDeviceInit();
 }
 
 int FingerDev::GetFPIImg2Bmp(char *psImgPath)

+ 15 - 3
DevAdapter/cw/fingerprint.1.1/FingerPrintImpl.cpp

@@ -53,6 +53,11 @@ ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
         return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "GetDevCategory");
     char sInfo[128];
     int iRet = _fingerDev->GetVersion(sInfo);
+    if (iRet == LS_ERROR_DEVICE_NOT_FOUND || iRet == LS_ERROR_DEVICE_NOT_INIT)
+    {
+        _fingerDev->Reset();
+        iRet = _fingerDev->GetVersion(sInfo);
+    }
     char szType[] = {"PVER=wellcom#MID=JZT-998"};
     char szModel[] = "FWID=%s";
     strcpy(devCategory.szType, szType);
@@ -66,9 +71,10 @@ ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
         devCategory.eState = DEVICE_STATUS_NORMAL;
     }
     else{
-        //"WELLCOM_JZT-998APB-V72_V2.0.1.0_N_R_GA[20201016]
-        sprintf(devCategory.szModel, szModel, sInfo + 8);
-        devCategory.eState = DEVICE_STATUS_FAULT;
+        return errcode;
+        //  "WELLCOM_JZT-998APB-V72_V2.0.1.0_N_R_GA[20201016]
+//        sprintf(devCategory.szModel, szModel, sInfo + 8);
+//        devCategory.eState = DEVICE_STATUS_FAULT;
     }
     strcpy(devCategory.szVendor , "cw");
 
@@ -152,9 +158,15 @@ ErrorCodeEnum FingerPrintImpl::Image2Feature(const char* imageName, LPBYTE lpbFe
     LOG4VTM(INFO, logMsg);
 
     int iRt = _fingerDev->GetFPIImg2Bmp(sImgPath);
+    if (iRt == LS_ERROR_DEVICE_NOT_FOUND || iRt == LS_ERROR_DEVICE_NOT_INIT)
+    {
+        _fingerDev->Reset();
+        iRt = _fingerDev->GetFPIImg2Bmp(sImgPath);
+    }
     ErrorCodeEnum errcode = HandleDevError(iRt, "GetFPIImg2Bmp");
     if(Error_Succeed == errcode)
     {
+        system("aplay /cashway/lib/FingerPrint.wav &");
         LOG4VTM(INFO, "获取特征图片成功");
         iRt = _fingerDev->GetFPIBmp2Feature(sImgPath, lpbFeature, iLength);
         errcode = HandleDevError(iRt, "GetFPIBmp2Feature");

+ 0 - 2
DevAdapter/cw/gpio.1.1/gpioclassdev.cpp

@@ -17,8 +17,6 @@ void __attribute__((constructor)) init()
 {
 }
 
-
-
 DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
 {
     ErrorCodeEnum eRt = Error_Succeed;

+ 14 - 8
DevAdapter/cw/gpio.1.1/gpioclassimpl.cpp

@@ -77,7 +77,8 @@ ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
         sprintf(devCategory.szModel, szModel, sSer);
     }
     else
-        sprintf(devCategory.szModel, szModel, "00000000");
+        return GetErrorInfo(GPIO_HARDWARE_ERROR, "GetDevCategory GetFirmware error");
+//        sprintf(devCategory.szModel, szModel, "00000000");
     strcpy(devCategory.szVendor, "cw");
 
     char sPath[256], sFile[128] = {0};
@@ -206,8 +207,7 @@ ErrorCodeEnum GPIOClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
     m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
     if (iErr != Error_Succeed)
         LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
-    else
-        LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
+//    else        LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
     return (ErrorCodeEnum)iErr;
 }
 
@@ -219,11 +219,11 @@ ErrorCodeEnum GPIOClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
 //	  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();
+//    LOG4VTM_FUNCTION();
     if (!m_pDevice->IsOpen())
         return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
     char sBitImage[64];
-    int iPos = sprintf(sBitImage, "port = %d Data = ", dwPort);
+    int iPos = sprintf(sBitImage, "WritePort port = %d Data = ", dwPort);
     ::ANSIToBitStr(&btData, 1, sBitImage+iPos);
     LOG4VTM(INFO, sBitImage);
 
@@ -257,11 +257,17 @@ ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
 //
 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");
+//    LOG4VTM_FUNCTION();
+    if (!m_pDevice->IsOpen())   return GetErrorInfo(GPIO_NOT_OPEN, "ReadPort");
+    if (dwPort != 2)   return GetErrorInfo(GPIO_PARA_ERR, "ReadPort");
     short stGet = 0;
     int iRet = m_pDevice->GetStatus(stGet);
     btStatus = stGet;
+
+    char sBitImage[64];
+    int iPos = sprintf(sBitImage, "ReadPort Data = ");
+    ::ANSIToBitStr(&btStatus, 1, sBitImage+iPos);
+    LOG4VTM(INFO, sBitImage);
+
     return GetErrorInfo(iRet, "ReadPort");
 }

+ 23 - 52
DevAdapter/cw/gpio.1.1/gpiodevice.cpp

@@ -110,12 +110,15 @@ int GPIODevice::GetStatus( short & dwState)
     if (iRet == 0)
     {
         dwState = 0;
+        //卡嘴检测
+        int iGet = ((sSend[0] >> 6) & 1);
+        dwState |= iGet << 4;
         //人体接近
-        int iGet = ((sSend[0] >> 7) & 1);
+        iGet = ((sSend[0] >> 7) & 1);
         dwState |= iGet << 3;
         //电话摘机
-        iGet = ((sSend[2] >> 0) & 1) ? 0 : 1;
-        dwState |= iGet << 2;
+//        iGet = ((sSend[2] >> 0) & 1) ? 0 : 1;
+//        dwState |= iGet << 2;
         //开门
         iGet = ((sSend[1] >> 7) & 1) ? 0 : 1;
         dwState |= iGet << 1;
@@ -187,44 +190,28 @@ int GPIODevice::ExecuteSIU(char * pSend, int iLength, char* sRecv, int& iRecv, i
     sBuf[ iLength + 5 ] = ETX ;
 
     m_SerSIU.Flush();
-    int iLen = m_SerSIU.Send((char*)sBuf, iLength+6, 300);
+    int iLen = m_SerSIU.Send((char*)sBuf, iLength+6, 20);
 
     if (iTimeOut < 500) iTimeOut = 500;
-    INT64 iNow = GetSystemTime();
-    INT64 iEnd = iNow + iTimeOut;
     int iHeadLen = 6;
-    for (int ia=0; ia<100 && iNow < iEnd; ia++)
+    if (m_SerSIU.Receive((char*)sBuf, iHeadLen, iTimeOut) < iHeadLen)
     {
-        if (m_SerSIU.Receive((char*)sBuf, 1, iTimeOut) < 0)
-        {
-            LOG4VTM(ERROR, "serial port date read failed");
-            return GPIO_TIMEOUT;
-        }
-        if (sBuf[0] == STX_RET) break;
-        else
-        {
-            LOG4VTM(ERROR, "serial port read data err");
-        }
-        iNow = GetSystemTime();
+        LOG4VTM(ERROR, "serial port SIU date read failed");
+        return GPIO_TIMEOUT;
     }
     if (sBuf[0] != STX_RET)
     {
-        LOG4VTM(ERROR, "serial port date format error");
+        LOG4VTM(ERROR, "serial port SIU date format error");
         return GPIO_PARA_ERR;
     }
-    iLen = m_SerSIU.Receive((char*)sBuf + 1, iHeadLen - 1, 100);
-    if (iLen + 1 < iHeadLen)
-    {
-        LOG4VTM(ERROR, "serial port date read failed");
-        return GPIO_TIMEOUT;
-    }
-    int iBodyLen = (sBuf[2] << 8) + sBuf[3] - iHeadLen;
-    iLen = m_SerSIU.Receive((char*)sRecv, iBodyLen + 1, 100);
+    int iBodyLen = (sBuf[2] << 8) + sBuf[3] - iHeadLen + 1;
+    iLen = m_SerSIU.Receive((char*)sRecv, iBodyLen, 50);
     if (iLen < iBodyLen)
     {
-        LOG4VTM(ERROR, "serial port date read body failed");
+        LOG4VTM(ERROR, "serial port SIU date read body failed");
         return GPIO_TIMEOUT;
     }
+    iBodyLen--;
     iRecv = iBodyLen;
     sRecv[iRecv] = 0;
     if (sBuf[4] == 'S' || sBuf[4] == 'K' || sBuf[4] == 'D')    return GPIO_SUCCESS;
@@ -250,44 +237,28 @@ int GPIODevice::ExecuteYYB(char * pSend, int iLength, char* sRecv, int& iRecv, i
     sBuf[ iLength + 5 ] = ETX ;
 
     m_SerYYB.Flush();
-    m_SerYYB.Send((char*)sBuf, iLength+6, 300);
+    m_SerYYB.Send((char*)sBuf, iLength+6, 100);
 
     if (iTimeOut < 500) iTimeOut = 500;
-    INT64 iNow = GetSystemTime();
-    INT64 iEnd = iNow + iTimeOut;
     int iHeadLen = 6;
-    for (int ia=0; ia<100 && iNow < iEnd; ia++)
+    if (m_SerYYB.Receive((char*)sBuf, iHeadLen, iTimeOut) < iHeadLen)
     {
-        if (m_SerYYB.Receive((char*)sBuf, 1, iTimeOut) < 0)
-        {
-            LOG4VTM(ERROR, "serial port date read failed");
-            return GPIO_TIMEOUT;
-        }
-        if (sBuf[0] == STX_RET) break;
-        else
-        {
-            LOG4VTM(ERROR, "serial port read data err");
-        }
-        iNow = GetSystemTime();
+        LOG4VTM(ERROR, "serial port YYB date read failed");
+        return GPIO_TIMEOUT;
     }
     if (sBuf[0] != STX_RET)
     {
-        LOG4VTM(ERROR, "serial port date format error");
+        LOG4VTM(ERROR, "serial port YYB date format error");
         return GPIO_PARA_ERR;
     }
-    int iLen = m_SerYYB.Receive((char*)sBuf + 1, iHeadLen - 1, 100);
-    if (iLen + 1 < iHeadLen)
-    {
-        LOG4VTM(ERROR, "serial port date read failed");
-        return GPIO_TIMEOUT;
-    }
     int iBodyLen = sBuf[3];
-    iLen = m_SerYYB.Receive((char*)sBuf + iHeadLen, iBodyLen, 100);
+    int iLen = m_SerYYB.Receive((char*)sBuf + iHeadLen, iBodyLen, 50);
     if (iLen < iBodyLen)
     {
-        LOG4VTM(ERROR, "serial port date read body failed");
+        LOG4VTM(ERROR, "serial port YYB date read body failed");
         return GPIO_TIMEOUT;
     }
+
     iRecv = iBodyLen;
     memcpy(sRecv, (char*)sBuf + 4, iBodyLen);
     sRecv[iRecv] = 0;

+ 81 - 7
DevAdapter/cw/hspscanner.1.1/hspscannerimpl.cpp

@@ -5,19 +5,26 @@
 #define ERR_NOT_OPENED  -2
 #define ERR_OPEN_FAIL   -3
 #define ERR_VIEW_FAIL   -4
+#define ERR_DEVICE_CHG  -5
 
 /////////////////////////////////////////////////////////////////////
 
-
 HSPSClassImpl::HSPSClassImpl()
 {
     m_sLibPath[0] = 0;
     m_bIsOpen = false;
     HSPSCall = NULL;
+    m_hThreadID = 0;
+    m_bThreadExit = true;
 }
 
 HSPSClassImpl::~HSPSClassImpl()
 {
+    if (m_hThreadID)
+    {
+        m_bThreadExit = true;
+        Sleep(100);
+    }
 }
 
 ErrorCodeEnum HSPSClassImpl::DevOpen()
@@ -40,10 +47,23 @@ ErrorCodeEnum HSPSClassImpl::DevOpen()
 
     int iRet = 0;
     if (HSPSCall("H 0 0", 0, iRet) < 0)
-        return GetErrorInfo(ERR_NO_DEVICE, "DevOpen");
+        return GetErrorInfo(ERR_NO_DEVICE, "DevOpen connect fail");
+    if (iRet == ERR_DEVICE_CHG)//重插后摄像头编码变化,目前只能重新启动进程
+    {
+        LOG4VTM(INFO, "DevOpen camera need reconnected");
+        system("killall CmbService.cw");
+        Sleep(500);
+        if (HSPSCall("H 0 2", 0, iRet) < 0)
+            return GetErrorInfo(ERR_NO_DEVICE, "DevOpen camera reopen fail");
+    }
 
     if (iRet == 0)
         m_bIsOpen = true;
+    if (m_hThreadID == 0)
+    {
+        m_bThreadExit = false;
+        StartIn();
+    }
     return GetErrorInfo(iRet, "DevOpen");
 }
 
@@ -76,7 +96,7 @@ ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     LOG4VTM_FUNCTION();
 
     if (!m_bIsOpen)
-        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+        return GetErrorInfo(ERR_NOT_OPENED, "GetDevCategory");
     memset(&devCategory, 0, sizeof(devCategory));
     strcpy(devCategory.szModel , "FWID=00000000");
     strcpy(devCategory.szVendor , "cw");
@@ -96,7 +116,8 @@ ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     if (HSPSCall("H 3 0", 0, iRet) == 0 && iRet >= 0)
         devCategory.eState = DEVICE_STATUS_NORMAL;
     else
-        devCategory.eState = DEVICE_STATUS_NOT_READY;
+        return GetErrorInfo(ERR_NOT_OPENED, "GetDevCategory");
+//        devCategory.eState = DEVICE_STATUS_NOT_READY;
     return Error_Succeed;
 }
 
@@ -104,7 +125,7 @@ ErrorCodeEnum HSPSClassImpl::Reset()
 {
     LOG4VTM_FUNCTION();
     if (!m_bIsOpen)
-        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+        return GetErrorInfo(ERR_NOT_OPENED, "Reset");
     int iRet = 0;
     return GetErrorInfo(iRet, "Reset");
 }
@@ -167,9 +188,27 @@ ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
     {
         //预览,打开摄像头
         if (HSPSCall("H 2 0 1", 0, iRet) < 0)
-            return GetErrorInfo(ERR_NOT_OPENED, "SetPreview opencam");
+            return GetErrorInfo(ERR_NOT_OPENED, "SetPreview connect fail");
+
+        if (iRet == ERR_DEVICE_CHG)//重插后摄像头编码变化,目前只能重新启动进程
+        {
+            LOG4VTM(INFO, "SetPreview camera need reconnected");
+
+            system("killall CmbService.cw");
+            Sleep(400);
+            if (HSPSCall("H 0 2", 0, iRet) < 0)
+                return GetErrorInfo(ERR_NO_DEVICE, "SetPreview camera reopen fail");
+
+            if (iRet != 0)
+                return GetErrorInfo(ERR_NO_DEVICE, "SetPreview camera reopen %d", iRet);
+
+            if (HSPSCall("H 2 0 2", 0, iRet) < 0)   //预览,恢复保存的参数
+                return GetErrorInfo(ERR_NOT_OPENED, "SetPreview camera review fail");
+        }
+
         if (iRet != 0)
             return GetErrorInfo(ERR_NOT_OPENED, "SetPreview opencam %d", iRet);
+
         //显示界面
         HSPSCall("H 2 1 1", 0, iRet);
 //        Sleep(2000);
@@ -299,7 +338,6 @@ const static CmbErrorDef HSPSErrInfo[] = {
     {ERR_NOT_OPENED, "设备尚未打开", Error_Param, DEC_DEV_NOT_OPENED},
     {ERR_OPEN_FAIL, "设备打开失败", Error_Hardware, DEC_HARDWARE},
     {ERR_VIEW_FAIL, "启动预览失败", Error_Hardware, DEC_HARDWARE},
-
 };
 
 ErrorCodeEnum HSPSClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
@@ -344,3 +382,39 @@ ErrorCodeEnum HSPSClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
     return (ErrorCodeEnum)iErr;
 }
 
+void    HSPSClassImpl::ThreadRun()
+{
+    HspsState* pBuf = (HspsState*) m_ShereMem.GetShareMem();
+    while (1)
+    {
+        Sleep(50);
+        if (m_bThreadExit) break;
+        Sleep(50);
+        if (m_bThreadExit) break;
+        pBuf->iTime = GetSystemTime();
+    }
+}
+
+void	HSPSClassImpl::StartIn()
+{
+    pthread_attr_t	attr;
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
+    pthread_create(&m_hThreadID, &attr, Proc, (void*) this);
+    pthread_attr_destroy(&attr);
+}
+
+void*	HSPSClassImpl::Proc(void* inPara)
+{
+    HSPSClassImpl*	pCtrl = (HSPSClassImpl*)inPara;
+    pCtrl->ThreadRun();
+    pCtrl->CloseThread(pCtrl->m_hThreadID);
+    return 0;
+}
+
+void HSPSClassImpl::CloseThread(pthread_t& h)
+{
+    pthread_exit(0);
+    m_hThreadID = 0;
+}
+

+ 19 - 2
DevAdapter/cw/hspscanner.1.1/hspscannerimpl.h

@@ -6,6 +6,15 @@
 
 #define FILE_VERSION    1
 
+typedef struct{
+    INT64   iTime;          //心跳时间
+    short   iX,iY,iW,iH;    //窗口位置
+    char    bGrey;          //灰度
+    BYTE    iRotate;        //旋转角度
+    BYTE    iScanSz;        //尺寸
+    BYTE    iCamIdx;        //摄像头编号
+}HspsState;
+
 typedef int  (*pHSPSCall)(const char *data, size_t len, int& iRet);
 
 class HSPSClassImpl : public CHSPSClass
@@ -84,13 +93,21 @@ public:
     ////////////////////////////////////
 
 public:
-    int         Run();
-    pHSPSCall   HSPSCall;
+    void            ThreadRun();
+
+    pthread_t       m_hThreadID;
+    static void*	Proc(void* inPara);
+    bool            m_bThreadExit;
+    void			StartIn();
+    void            CloseThread(pthread_t& h);
+
+    pHSPSCall       HSPSCall;
 protected:
     ErrorCodeEnum       GetErrorInfo(int iCode, char* sErr, ...);
     DevErrorInfo        m_DevErrInfo;
     bool                m_bIsOpen;
     char                m_sLibPath[260];
+    SShareMem           m_ShereMem;
 };
 
 

+ 2 - 1
DevAdapter/cw/idcer.1.1/idcertconn.cpp

@@ -484,7 +484,8 @@ int IDCertConn::GetID2InfoAll(
                 memcpy(strSex, infEX.sex, strlen(infEX.sex));
                 memcpy(strNation, infEX.nation, strlen(infEX.nation));
                 memcpy(strBirthday, infEX.birthday, strlen(infEX.birthday));
-                memcpy(strAddress, infEX.address, strlen(infEX.address));
+//                memcpy(strAddress, infEX.address, strlen(infEX.address));
+                memcpy(strAddress, infEX.address, strlen(TrimRight(infEX.address, strlen(infEX.address))));
                 memcpy(strNumber, infEX.number, strlen(infEX.number));
                 memcpy(strDepartment, infEX.department, strlen(TrimRight(infEX.department, strlen(infEX.department))));
                 memcpy(strTimeLimitStart, infEX.timeLimit, 8);

+ 52 - 21
DevAdapter/cw/idcer.1.1/idcertimpl.cpp

@@ -27,6 +27,8 @@ void IDCertImpl::DeleteBmp()
         remove(sFile);
         sprintf(sFile, "%s/zp.bmp", m_sLibPath);
         remove(sFile);
+        sprintf(sFile, "%s/cw/SNBCID81Log.log", m_sLibPath);
+        remove(sFile);
     }
 }
 
@@ -74,7 +76,7 @@ ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     memset(&devCategory, 0, sizeof(devCategory));
     strcpy(devCategory.szVendor , "cw");
     strcpy(devCategory.szType ,"PVER=SNBC#MID=ID81");
@@ -90,6 +92,12 @@ ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
     devCategory.version.wBuild = FILE_VERSION;
     Sleep(800);
     int iRt = m_id81Dev->getFWVersion(sPath);       //"Main Firmware:FV1.001.05
+    if (Error_Succeed != iRt)
+    {
+        int nCardST;
+        m_id81Dev->GetStatus(nCardST);
+        iRt = m_id81Dev->getFWVersion(sPath);
+    }
     if (Error_Succeed == iRt)
     {
         char* pSP = strstr(sPath, "FV");
@@ -101,9 +109,10 @@ ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
     }
     else
     {
-        strcpy(sFile, "00000000");
-        LOG4VTM(INFO, "GetDevCategory getFWVersion error");
-        devCategory.eState = DEVICE_STATUS_CONNECTING;
+        return HandleDevError(DEV_NOT_OPEN, "GetDevCategory GetFirmware error");
+//        strcpy(sFile, "00000000");
+//        LOG4VTM(INFO, "GetDevCategory getFWVersion error");
+//        devCategory.eState = DEVICE_STATUS_CONNECTING;
     }
     sprintf(devCategory.szModel , "FWID=%s#STYLE=IG#FUNCTION=ITF", sFile);
     return Error_Succeed;
@@ -114,7 +123,7 @@ ErrorCodeEnum IDCertImpl::Reset()
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     SAutoLock lock(&m_MutexLock);
     CancelWaitMediaInsert();
     int iRt = Error_Succeed;
@@ -160,7 +169,8 @@ ErrorCodeEnum IDCertImpl::DevOpen(DWORD dwPort)
         m_bOpen = TRUE;
     }
     m_iWaitFlag = 0;
-    StartIn();
+    if (m_hThreadID == 0)
+        StartIn();
     return HandleDevError(iRt, __FUNCTION__);
 }
 
@@ -172,7 +182,7 @@ ErrorCodeEnum IDCertImpl:: IDCerAuthenticate()
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     SAutoLock lock(&m_MutexLock);
     int nCardST = 0, iRt = Error_Succeed;
     ErrorCodeEnum eRt = Error_Unexpect;
@@ -184,6 +194,7 @@ ErrorCodeEnum IDCertImpl:: IDCerAuthenticate()
         {
         case CWINF_IDCARD_NOCARD:     //无卡
             eRt =  Error_Unexpect;
+            LOG4VTM(INFO, "IDCerAuthenticate GetStatus CWINF_IDCARD_NOCARD");
             break;
         case CWINF_IDCARD_CARDMIDDLE: //在读卡位
             iRt = m_id81Dev->getIDCardType(&m_iCardType);
@@ -192,15 +203,18 @@ ErrorCodeEnum IDCertImpl:: IDCerAuthenticate()
                 if(0 == m_iCardType || 1 == m_iCardType || 2 == m_iCardType) //0:二代证 1:外国人 2:港澳居住证
                 {
                     eRt = Error_Succeed;
+                    LOG4VTM(INFO, "IDCerAuthenticate GetStatus have card");
                 }
             }
             else
             {
                 eRt =  Error_DevMedia;
+                LOG4VTM(INFO, "IDCerAuthenticate GetStatus Error_DevMedia");
             }
             break;
         default:
             eRt =  Error_Unexpect;
+            LOG4VTM(INFO, "IDCerAuthenticate GetStatus Error_Unexpect");
             break;
         }
     }
@@ -213,7 +227,7 @@ ErrorCodeEnum IDCertImpl::IDCerGetData(IDCerInfo &idCerInfo)
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     memset(&idCerInfo,0,sizeof(IDCerInfo));
 
     int iRt = Error_Succeed;
@@ -332,7 +346,7 @@ ErrorCodeEnum IDCertImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     memset(&idCerInfoEx,0,sizeof(IDCerInfoEx));
 
     int iRt = Error_Succeed;
@@ -492,6 +506,8 @@ ErrorCodeEnum IDCertImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
         LOG4VTM(INFO, "IDCerGetDataEx 证件类型有误");
         break;
     }
+    sprintf(strName, "IDCerGetData name=%d addr=%d", idCerInfoEx.name.dwSize, idCerInfoEx.address.dwSize);
+    LOG4VTM(INFO, strName);
     return Error_Succeed;
 }
 
@@ -502,7 +518,7 @@ ErrorCodeEnum IDCertImpl:: ForceIDEject()
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     SAutoLock lock(&m_MutexLock);
     CancelWaitMediaInsert();
     Sleep(300);
@@ -521,7 +537,7 @@ ErrorCodeEnum IDCertImpl:: ScanIDAndSaveImage()
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     char szIDFront[MAX_PATH] = {0};
     char szIDBack[MAX_PATH] = {0};
     sprintf(szIDFront, "%s/idfront.bmp", m_sLibPath);
@@ -550,7 +566,7 @@ ErrorCodeEnum IDCertImpl:: QueryCardPos(int &pos)
 {
     LOG4VTM_FUNCTION();
     if (!m_bOpen)
-        HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     int iRt = Error_Succeed;
     int nCardST = 0;
     SAutoLock lock(&m_MutexLock);
@@ -706,6 +722,8 @@ void IDCertImpl::CancelWaitMediaInsert()
 ErrorCodeEnum IDCertImpl:: IDCerRFControl(bool bControl)
 {
     LOG4VTM_FUNCTION();
+    if (!m_bOpen)
+        return HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     m_iCardType = -1;
     SAutoLock lock(&m_MutexLock);
 //    CancelWaitMediaInsert();
@@ -715,9 +733,9 @@ ErrorCodeEnum IDCertImpl:: IDCerRFControl(bool bControl)
 //        return HandleDevError(iRt, "IDCerRFControl GetStatus");
 
     int iRt = 0;
+    char sMsg[300] = {0};
     if(bControl)
     {
-        char sMsg[300] = {0};
         DeleteBmp();
         int iPos = 0;
         LOG4VTM(INFO, "IDCerRFControl enable");
@@ -761,24 +779,32 @@ ErrorCodeEnum IDCertImpl:: IDCerRFControl(bool bControl)
     }
     else
     {
-//        m_id81Dev->setAutoFeedEnable(0);
-        m_iWaitFlag = 0;
+        if (m_iWaitFlag > 0)
+        {
+            m_iWaitFlag = 0;
+            Sleep(800);
+        }
         iRt = m_id81Dev->eject();
+        if(iRt != CWERR_IDCARD_SUCCESS)
+            return HandleDevError(iRt, "IDCerRFControl eject fail");
+        int iPos = 0;
+        iRt = m_id81Dev->GetStatus(iPos);
+        if (iPos == CWINF_IDCARD_CARDMIDDLE || iPos == CWINF_IDCARD_CARDSCAN)
+        {
+            LOG4VTM(INFO, "IDCerRFControl eject CARDJAM");
+            m_id81Dev->Reset(2);
+            iRt = m_id81Dev->eject();
+        }
         return HandleDevError(iRt, "IDCerRFControl false setAutoFeedEnable 0");
     }
 }
 
 void    IDCertImpl::ThreadRun()
 {
-    int iRet = 0, iPos = 0, iCount = 0;;
+    int iRet = 0, iPos = 0, iCount = 0;
     while (1)
     {
         Sleep(50);
-        if (m_iWaitFlag == 0)
-        {
-            iCount = 0;
-            continue;
-        }
         if (m_iWaitFlag < 0)   return;
         Sleep(50);
         if (m_iWaitFlag < 0)   return;
@@ -786,6 +812,11 @@ void    IDCertImpl::ThreadRun()
         if (m_iWaitFlag < 0)   return;
         Sleep(50);
         if (m_iWaitFlag < 0)   return;
+        if (m_iWaitFlag == 0)
+        {
+            iCount = 0;
+            continue;
+        }
         m_MutexLock.Wait(300);
         iRet = m_id81Dev->GetStatus(iPos);
         if(iRet != CWERR_IDCARD_SUCCESS)

+ 52 - 50
DevAdapter/cw/pinpad.1.1/pinpadimpl.cpp

@@ -48,16 +48,26 @@ int getFileVer(char* sFile, short& ch1, short& ch2)
     return 1;
 }
 
+//新版本,增加设备序列号
 ErrorCodeEnum PinPadImpl::GetDevCategory(DevCategoryInfo &devCategory)
 {
     LOG4VTM_FUNCTION();
     if (!m_bIsOPen)
         return GetErrorInfo(-1, "GetDevCategory");
     char szType[] = {"PVER=SUNSON#MID=SNK088A"};
-    char szModel[] = {"PM=V2.0#MID=00000000#PID=00000000#FWID=%s"};
+
+    char sPID[32];
+    unsigned char sTemp[256];
+
+    int iRet = m_pPinpad->getSerialNo((unsigned char*)sPID);
+    iRet = GetErrorInfo(iRet, "GetDevCategory getSerialNo");
+    if (iRet != Error_Succeed)
+        return (ErrorCodeEnum)iRet;
+
+    char szModel[256];
+    sprintf(szModel, "PM=V2.0#MID=00000000#PID=%s#FWID=%%s", sPID);
     char szVendor[] = {"cw"};
 
-    ErrorCodeEnum err = Error_Succeed;
     strcpy(devCategory.szType, szType);
     strcpy(devCategory.szVendor, szVendor);
 
@@ -70,21 +80,17 @@ ErrorCodeEnum PinPadImpl::GetDevCategory(DevCategoryInfo &devCategory)
 
     devCategory.version.wRevision = 0xffff;
     devCategory.version.wBuild = FILE_VERSION;
-    unsigned char sTemp[256];
-    int iRet = m_pPinpad->getEppVersion(sTemp);
-    iRet = GetErrorInfo(iRet, "GetDevCategory");
-    if (iRet == Error_Succeed)
-    {
-        char* pSP = strstr((char*)sTemp, "F31-V");
-        if (pSP)
-            sprintf(devCategory.szModel, szModel, pSP + 5); //XZ-H602-F31-V1.03-D015
-        else
-            sprintf(devCategory.szModel, szModel, "00000000");
-    }
+
+    iRet = m_pPinpad->getEppVersion(sTemp);
+    iRet = GetErrorInfo(iRet, "GetDevCategory getEppVersions");
+    if (iRet != Error_Succeed)
+        return (ErrorCodeEnum)iRet;
+    char* pSP = strstr((char*)sTemp, "F31");
+    if (pSP)
+        sprintf(devCategory.szModel, szModel, pSP); //XZ-H602-F31-V1.03-D015
     else
-    {
         sprintf(devCategory.szModel, szModel, "00000000");
-    }
+
     switch(iRet){
     case Error_Succeed:
     case Error_Param:
@@ -98,7 +104,8 @@ ErrorCodeEnum PinPadImpl::GetDevCategory(DevCategoryInfo &devCategory)
         devCategory.eState = DEVICE_STATUS_FAULT;
     }
     char sLog[512];
-    sprintf(sLog, "GetDevCategory devCategory.version.wBuild =%d, devCategory.szType=%s ", devCategory.version.wBuild, devCategory.szType);
+    sprintf(sLog, "GetDevCategory version.wBuild =%d, szType=%s szModel = %s szVendor = %s 固件版本 %s",
+            devCategory.version.wBuild, devCategory.szType, devCategory.szModel, devCategory.szVendor, sTemp);
     LOG4VTM(INFO, sLog);
     return Error_Succeed;
 }
@@ -178,8 +185,13 @@ ErrorCodeEnum PinPadImpl::DevOpen(DWORD dwPort,DWORD dwBaudRate)
         if (iRet != 0)
             return (ErrorCodeEnum)iRet;
         m_bSMMode = sMode[0] == 1;
+
+        m_pPinpad->CloseEppPlainTextMode(sMode);
+        m_pPinpad->SetBuzzerEnabled(0x31, sMode);
+        m_pPinpad->SysKeyEnable(false);
         return GetErrorInfo(0, "DevOpen");
     }
+
     return GetErrorInfo(-1, "DevOpen");
 }
 
@@ -342,9 +354,11 @@ ErrorCodeEnum PinPadImpl::SetAccNo(AccountInfo accInfo)
     }
     strcpy(m_sCardNo, (char*)pNo);
 
+#ifdef QT_DEBUG
     char sLog[256];
     sprintf(sLog, "SetAccNo %s", m_sCardNo);
     LOG4VTM(DEBUG, sLog);
+#endif
 
     return Error_Succeed;
 }
@@ -412,19 +426,12 @@ ErrorCodeEnum PinPadImpl::LoadMasterKey(MasterKeyParam masterKey)
     m_pPinpad->EnableLoadSameKey(0x00, sTemp);
     ::HexStrToANSI((char*)masterKey.key, sTemp, iLen);
     int iMK = MK_HEAD + masterKey.dwSN;
-//    m_sKeyAttr[iMK] = '0';
     iRet = m_pPinpad->LoadUserKey(iMK, 0xffff, 0x27, iLen>>1, sTemp, sTemp);
     iRet = GetErrorInfo(iRet, "LoadMasterKey sm=%d mk= %d", masterKey.smFlag, masterKey.dwSN);
-//    if (iRet == 0)
-//    {
-//        if (m_sKeyAttr[iMK] - '0' != masterKey.smFlag)
-//        {
-//            m_sKeyAttr[iMK] = masterKey.smFlag + '0';
-//            SIni::SetValueToIniFile("/cashway/setting/cashway.ini", "Serial", "SMFlg", m_sKeyAttr);
-//            sprintf(sLog, "LoadMasterKey save key SM flag %d %d", iMK, masterKey.smFlag);
-//            LOG4VTM(INFO, sLog);
-//        }
-//    }
+#ifdef QT_DEBUG
+    sprintf(sLog, "LoadMasterKey %s", masterKey.key);
+    LOG4VTM(INFO, sLog);
+#endif
     return (ErrorCodeEnum)iRet;
 }
 
@@ -442,9 +449,12 @@ ErrorCodeEnum PinPadImpl::LoadWorkingKey(WorkKeyParam wkKey)
 
     bool bSM = wkKey.smFlag == 1;
     int iRet = 0;
+    char sLog[256];
     if (m_bSMMode != bSM)
     {
         iRet = m_pPinpad->SetEPPSMMode(wkKey.smFlag);
+        sprintf(sLog, "LoadWorkingKey SetEPPSMMode %d ret%d", wkKey.smFlag, iRet);
+        LOG4VTM(INFO, sLog);
         if (iRet != Error_Succeed)
             return GetErrorInfo(iRet, "LoadMasterKey setModeSMAlgorithm");
         m_bSMMode = bSM;
@@ -457,15 +467,11 @@ ErrorCodeEnum PinPadImpl::LoadWorkingKey(WorkKeyParam wkKey)
     ::HexStrToANSI((char*)wkKey.key, sTemp, iLen);
     int iWk = WK_HEAD + wkKey.dwMasterSN * 4 + wkKey.dwWorkingSN;
     iRet = m_pPinpad->LoadUserKey(iWk, MK_HEAD + wkKey.dwMasterSN, 0x07, iLen>>1, sTemp, sTemp);
-    iRet = GetErrorInfo(iRet, "LoadWorkingKey activeKey sm=%d mk= %d wk = %d", wkKey.smFlag, wkKey.dwMasterSN, wkKey.dwWorkingSN);
-//    if (iRet == 0)
-//    {
-//        if (m_sKeyAttr[iWk] - '0' != wkKey.smFlag)
-//        {
-//            m_sKeyAttr[iWk] = wkKey.smFlag + '0';
-//            SIni::SetValueToIniFile("/cashway/setting/cashway.ini", "Serial", "SMFlg", m_sKeyAttr);
-//        }
-//    }
+    iRet = GetErrorInfo(iRet, "LoadWorkingKey sm=%d mk= %d wk = %d", wkKey.smFlag, wkKey.dwMasterSN, wkKey.dwWorkingSN);
+#ifdef QT_DEBUG
+    sprintf(sLog, "LoadWorkingKey %s", wkKey.key);
+    LOG4VTM(INFO, sLog);
+#endif
     return (ErrorCodeEnum)iRet;
 }
 
@@ -483,15 +489,6 @@ ErrorCodeEnum PinPadImpl::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
     else
         m_iWorkKey = WK_HEAD + dwMkSN * 4 + dwWkSN;
     iRet = GetErrorInfo(iRet, "ActiveWorkingKey mk= %d wk= %d", dwMkSN, dwWkSN);
-/*
-    if (m_bSMMode != m_sKeyAttr[m_iWorkKey] - '0')
-    {
-        iRet = m_pPinpad->SetEPPSMMode(m_sKeyAttr[m_iWorkKey] - '0');
-        if (iRet != Error_Succeed)
-            return GetErrorInfo(iRet, "ActiveWorkingKey setModeSMAlgorithm");
-        m_bSMMode = m_sKeyAttr[m_iWorkKey] - '0';
-    }
-//*/
     return (ErrorCodeEnum)iRet;
 }
 
@@ -536,7 +533,7 @@ ErrorCodeEnum PinPadImpl::StartPinInputConfirm(BYTE byLen)
     LOG4VTM_FUNCTION();
     if (!m_bIsOPen)
         return GetErrorInfo(-1, "StartPinInputConfirm");
-    return StartPinInput(byLen, true);
+    return StartPinInput(byLen, false);
 }
 
 ErrorCodeEnum PinPadImpl::StartPinInput(BYTE byLen)
@@ -544,7 +541,7 @@ ErrorCodeEnum PinPadImpl::StartPinInput(BYTE byLen)
     LOG4VTM_FUNCTION();
     if (!m_bIsOPen)
         return GetErrorInfo(-1, "StartPinInput");
-    return StartPinInput(byLen, false);
+    return StartPinInput(byLen, true);
 }
 
 //	Start key press(plain text mode).
@@ -598,6 +595,7 @@ ErrorCodeEnum PinPadImpl::GetPinBlock(PinBlock &block)
         block.dwSize = (iLength << 1);
         ANSIToHexStr(sPinRead, iLength, (char*)block.data);
     }
+    m_pPinpad->CloseEppPlainTextMode(sPinRead);
     return (ErrorCodeEnum)iRet;
 }
 
@@ -610,11 +608,11 @@ ErrorCodeEnum PinPadImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &dest
     if (!m_bIsOPen)
         return GetErrorInfo(-1, "DevClose");
 
+    char sLog[256];
     bool bSM = (m_EncType == EPP_ALGO_METHOD_SM4);
     if (m_bSMMode != bSM)
     {
         int iRet = m_pPinpad->SetEPPSMMode(bSM);
-        char sLog[256];
         sprintf(sLog, "EncryptData SetEPPSMMode %d ret%d", bSM, iRet);
         LOG4VTM(INFO, sLog);
         if (iRet != Error_Succeed)
@@ -633,12 +631,12 @@ ErrorCodeEnum PinPadImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &dest
     case EPP_ALGO_MODE_DEC_ECB:
     case EPP_ALGO_MODE_3DEC_ECB:
     case EPP_ALGO_MODE_ECB:
-        iRet = m_pPinpad->DataCompute(m_iWorkKey, 0x31, 0x30, 0x0f, iSize, sData, sOut, iOut);
+        iRet = m_pPinpad->DataCompute(m_iWorkKey, 0x31, 0x30, 0x00, iSize, sData, sOut, iOut);
         break;
     case EPP_ALGO_MODE_DEC_CBC:
     case EPP_ALGO_MODE_3DEC_CBC:
     case EPP_ALGO_MODE_CBC:
-        iRet = m_pPinpad->DataCompute(m_iWorkKey, 0x31, 0x31, 0x0f, iSize, sData, sOut, iOut);
+        iRet = m_pPinpad->DataCompute(m_iWorkKey, 0x31, 0x31, 0x00, iSize, sData, sOut, iOut);
         break;
     default:
         iRet = JT_PARA_ERR;
@@ -648,6 +646,10 @@ ErrorCodeEnum PinPadImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo &dest
     {
         destInfo.dwSize = (iOut << 1);
         ANSIToHexStr(sOut, iOut, (char*)destInfo.data);
+#ifdef QT_DEBUG
+        sprintf(sLog, "EncryptData in %s out %s ret%d", srcInfo.data, destInfo.data, iRet);
+        LOG4VTM(INFO, sLog);
+#endif
     }
     return (ErrorCodeEnum)iRet;
 }

+ 0 - 2
DevAdapter/cw/pinpad.1.1/pinpadimpl.h

@@ -14,8 +14,6 @@
 #define MK_HEAD     0x1
 #define WK_HEAD     0x07
 
-//  #define
-
 class PinPadImpl : public PinPadClass
 {
 public:

+ 43 - 1
DevAdapter/cw/pinpad.1.1/pinpadxzf31.cpp

@@ -196,10 +196,34 @@ int PinPadXZF31::getEppVersion(unsigned char *version)
     memset(&rsp, 0, sizeof(rsp));
     int iRt = executeCmd(&cmd, &rsp);
     if (0 < rsp.dataLen)
-      memcpy(version, rsp.data, rsp.dataLen);
+    {
+        memcpy(version, rsp.data, rsp.dataLen);
+        version[rsp.dataLen] = 0;
+    }
+    return iRt;
+}
+
+// 取产品序列号
+int PinPadXZF31::getSerialNo(unsigned char *version)
+{
+    SUNSON_F31_CMD cmd;
+    memset(&cmd, 0, sizeof(cmd));
+    cmd.cmdCode1 = 0x52;
+    cmd.cmdCode2 = 0x53;
+
+    SUNSON_RSP rsp;
+    memset(&rsp, 0, sizeof(rsp));
+    int iRt = executeCmd(&cmd, &rsp);
+    if (0 < rsp.dataLen)
+    {
+        memcpy(version, rsp.data, rsp.dataLen);
+        version[rsp.dataLen] = 0;
+    }
     return iRt;
 }
 
+
+
 // 命令:0X1B +'L'(4Ch)+'K'(4Bh)+<Ln>+<DATA>+[XOR] +0X0D+0X0A
 // 描述:按照约定的方式下载主密钥和工作密钥。可以是明文也可是密文。
 // DATA: <Header>+<EK>
@@ -862,6 +886,24 @@ int PinPadXZF31::GetKCV(int keyId, unsigned char ucCheckMode, unsigned char* Ret
     return iRt;
 }
 
+//允许/禁止系统键盘模式
+int PinPadXZF31::SysKeyEnable(bool b)
+{
+    int iRt = -1;
+
+    SUNSON_F31_CMD cmd;
+    memset(&cmd, 0, sizeof(cmd));
+    cmd.cmdCode1 = 0x54;
+    cmd.cmdCode2 = 0x4D;
+
+    cmd.data[cmd.dataLen++] = b+1;
+
+    SUNSON_RSP rsp;
+    memset(&rsp, 0, sizeof(rsp));
+    iRt = executeCmd(&cmd, &rsp);
+    return iRt;
+}
+
 // 命令:0X1B +'E'(45h) + 'S'(53h) + <Ln> +<KeyID> +[XOR] + 0x0D+0x0A
 // 描述:加密键盘安全机制。
 // Ln:= 0x0002 ,2Byte

+ 4 - 0
DevAdapter/cw/pinpad.1.1/pinpadxzf31.h

@@ -27,8 +27,12 @@ public:
     //get sankey
     int scankeyPress(unsigned char& ucKeyValue);
 
+    //允许/禁止系统键盘模式
+    int SysKeyEnable(bool b);
     // 取产品版本号
     int getEppVersion(unsigned char *version);
+    // 取产品序列号
+    int getSerialNo(unsigned char *version);
     // 描述:按照约定的方式下载主密钥和工作密钥。可以是明文也可是密文。
     int LoadUserKey(int ucKeyId, int ucDecryptKeyId,
                     unsigned char KeyAttribute, unsigned char ucKeyLen,

+ 0 - 26
DevAdapter/cw/termalprint.1.1/CMakeLists.txt

@@ -1,26 +0,0 @@
-
-# 声明模块名称的前缀和名称
-rvc_dev_define_module("ThermalPrint")
-
-# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
-set(${MODULE_PREFIX}_VENDOR "cw")
-set(${MODULE_PREFIX}_VERSION "1")
-set(${MODULE_PREFIX}_BATCH "1")
-
-# 包含要编译的实现文件,rvc_dev_config_library 内使用
-set(${MODULE_PREFIX}_SRCS SHARED
-    termalprintimpl.cpp termalprintdev.cpp ReceiptBase.cpp ReceiptSnbc.cpp
-   )
-
-# 适配器工程需要通过此宏替代 add_library
-rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
-
-# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
-target_include_directories(${MODULE_FULL_NAME} PRIVATE ${VENDOR_CURRENT_INCLUDE_DIR} ${VENDOR_CURRENT_DEPS_DIR}/cw.baseio)
-target_link_libraries(${MODULE_FULL_NAME} baseio usb-1.0 ${VENDOR_LOG_LIB_NAME})
-
-SET(LIBRARY_OUTPUT_PATH ${VENDOR_CURRENT_LIB_DIR})
-
-#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
-rvc_dev_target_install(${MODULE_FULL_NAME})
-

+ 0 - 477
DevAdapter/cw/termalprint.1.1/termalprintimpl.cpp

@@ -1,477 +0,0 @@
-#include "termalprintimpl.h"
-#include "SUcs.h"
-
-ThermalPrintClassImpl::ThermalPrintClassImpl()
-{
-    m_pPrint = new ReceiptSnbc();
-    m_bStartup = false;
-}
-
-ThermalPrintClassImpl::~ThermalPrintClassImpl()
-{
-    delete m_pPrint;
-}
-
-//	打开打印机
-ErrorCodeEnum ThermalPrintClassImpl::DevOpen(BYTE btPort,DWORD dwBaudRate)
-{
-    int iRet = m_pPrint->Open(0x154f, 0x154f);
-    if (iRet != 0)  return GetErrorInfo(iRet, "DevOpen");
-
-    iRet = m_pPrint->GetState();
-    return GetErrorInfo(iRet, "DevOpen");
-}
-
-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 ThermalPrintClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetDevCategory");
-
-    char sSVer[256];
-    char szType[] = {"PVER=SNBC#MID=BT-NH80"};
-    char szModel[] = "FWID=%s";
-    strcpy(devCategory.szType, szType);
-    if (m_pPrint->GetFirmware(sSVer) == 0)
-        sprintf(devCategory.szModel, szModel, sSVer + 1);
-    else
-        sprintf(devCategory.szModel, szModel, "00000000");
-    strcpy(devCategory.szVendor, "cw");
-
-    char cFilePath[300] = {0};
-    GetCurLibsPath(m_sLibPath, cFilePath);
-    short v1,v2;
-    getFileVer(cFilePath, 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 Error_Succeed;
-}
-
-ErrorCodeEnum ThermalPrintClassImpl::Reset()
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "Reset");
-    m_pPrint->Init();
-    int iRet = m_pPrint->GetState();
-    return GetErrorInfo(iRet, "Reset");
-}
-
-ErrorCodeEnum ThermalPrintClassImpl::DevClose()
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "DevClose");
-    int iRet = m_pPrint->Close();
-    return GetErrorInfo(iRet, "DevClose");
-}
-
-ErrorCodeEnum ThermalPrintClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
-{
-    memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
-    return Error_Succeed;
-}
-
-//	获取打印机实时状态
-ErrorCodeEnum ThermalPrintClassImpl::GetDevState(ThermalState& devState)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetDevCategory");
-
-    int iRet = m_pPrint->GetState();
-    if (iRet < 0)
-        return GetErrorInfo(iRet, "Reset");
-    devState.hardwareState = STATE_OK;
-    switch(iRet)
-    {
-    case RECEIPT_SUCCESS:
-        devState.paperState = PAPER_FULL;
-        break;
-    case RECEIPT_WARN_NO_MEDIA:
-        devState.paperState = PAPER_EMPTY;
-        break;
-    case RECEIPT_WARN_PAP_LOW:
-        devState.paperState = PAPER_LOW;
-        break;
-    case RECEIPT_WARN_HEAD_UP:
-        devState.hardwareState = STATE_OTHER_ERROR;
-        break;
-    case RECEIPT_WARN_JAMMED:
-        devState.paperState = PAPER_JAMMED;
-        break;
-    }
-    return Error_Succeed;
-}
-
-//开始打印初始设置:paperWidth一般为80mm和57mm
-ErrorCodeEnum ThermalPrintClassImpl::BeginPrint(ThermalPaperType eType, int paperWidth)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "BeginPrint");
-    int iRet = m_pPrint->Init();
-    if (iRet != 0)
-        return GetErrorInfo(iRet, "BeginPrint");
-    m_bStartup = true;
-    return Error_Succeed;
-}
-
-
-//打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
-//第三个参数是预留参数 暂时无用到
-ErrorCodeEnum ThermalPrintClassImpl::ControlAction(PrintAction eAction, DWORD dwValue1, DWORD dwValue2)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "ControlAction");
-    char sAnsi[256];
-    sprintf(sAnsi, "ControlAction PrintAction=%d val=%d,%d", eAction, dwValue1, dwValue2);
-    LOG4VTM(INFO, sAnsi);
-    int iRet = 0;
-    switch(eAction)
-    {
-    case ACTION_PRINT_ONE_LINE:
-        iRet = m_pPrint->FeedLines(1);
-        break;
-    case ACTION_PRINT_MOVEFORWRAD_LINES:
-        iRet = m_pPrint->FeedLines(dwValue1);
-        break;
-//    case ACTION_PRINT_MOVEBACKWRAD_LINES:     //回纸n行(单位:字符行)
-//        iRet = m_pPrint->FeedLines(-dwValue1);
-//        break;
-    case ACTION_CUT_ALL:
-        iRet = m_pPrint->Cut(0);
-        break;
-    case ACTION_CUT_HALF:
-        iRet = m_pPrint->Cut(1);
-        break;
-    case ACTION_MOVE_TO_POSITION_RELATIVE:    //把打印光标移动相对当前位置一段距离(横向),单位mm
-        iRet = m_pPrint->MoveX(dwValue1 * 8);
-        break;
-    case ACTION_MOVE_TO_FORWRAD_LENGTH:
-        iRet = m_pPrint->FeedPaper(0, dwValue1 * 8);
-        break;
-//    case ACTION_MOVE_TO_BLACKMARK:  //移动到黑标位置,把打印位置设置在行首(标记纸有效)
-//        iRet = m_pPrint->mo
-//        break;
-//    case ACTION_PRINT_MOVEBACK_TO_LINE: //设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
-//        iRet = m_pPrint->FeedPaper(0, dwValue1 * 8);
-//        break;
-    }
-    return GetErrorInfo(iRet, "ControlAction");
-}
-
-//打印参数指令函数:
-//第三个参数是预留参数 暂时无用到
-ErrorCodeEnum ThermalPrintClassImpl::SetParam(CommandType eType, DWORD dwValue1, DWORD dwValue2)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "SetParam");
-    char sAnsi[1024];
-    sprintf(sAnsi, "SetParam CommandType=%d val=%d,%d", eType, dwValue1, dwValue2);
-    LOG4VTM(INFO, sAnsi);
-
-    int iRet = 0;
-    switch(eType)
-    {
-    case COMMON_ROW_SPACE:
-        iRet = m_pPrint->SetRowDistance(dwValue1 * 8);
-        break;
-    case COMMON_ALIGN:
-        iRet = m_pPrint->SetAlign(dwValue1);
-        break;
-//    case COMMON_REVERSE:
-//        iRet = m_pPrint->SetInverse(dwValue1);
-//        break;
-    case COMMON_LEFT_MARGIN:
-        iRet = m_pPrint->SetLeftDistance(dwValue1 * 8);
-        break;
-    case COMMON_PRINTABLE_AREA:
-        iRet = m_pPrint->SetPrintArea(dwValue1 * 8);
-        break;
-    }
-    return GetErrorInfo(iRet, "SetParam");
-}
-
-//打印字体指令函数:主要是字体相关饿指令函数
-//第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
-//					设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
-ErrorCodeEnum ThermalPrintClassImpl::SetFont(FontStyle eType, DWORD dwValue1, DWORD dwValue2)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "SetFont");
-    char sAnsi[1024];
-    sprintf(sAnsi, "SetFont FontStyle=%d val=%d,%d", eType, dwValue1, dwValue2);
-    LOG4VTM(INFO, sAnsi);
-
-    int iRet = 0;
-    switch(eType)
-    {
-    case FONT_UNDERLINE:
-        m_FontParam.bUL = dwValue1;
-        m_bFontChanged = true;
-        break;
-    case FONT_BOLD:
-        m_FontParam.bold = dwValue1;
-        m_bFontChanged = true;
-        break;
-    case FONT_DOUBLEHEIGHT:
-        m_FontParam.bDH = dwValue1;
-        m_bFontChanged = true;
-        break;
-    case FONT_DOUBLEWIDE:
-        m_FontParam.bDW = dwValue1;
-        m_FontParam.iXScale = dwValue1 ? 2 : 1;
-        m_bFontChanged = true;
-        break;
-    case FONT_INVERSE:
-        iRet = m_pPrint->SetInverse(dwValue1);
-        break;
-    case FONT_CUSTOM_SIZE:
-        m_FontParam.iXScale = dwValue1;
-        iRet = m_pPrint->SetScale(dwValue1, dwValue2);
-        break;
-    case FONT_ROTATE:
-        iRet = m_pPrint->SetRotate(dwValue1);
-        break;
-    case FONT_LEFT_RIGHT_SPACE:
-        iRet = m_pPrint->SetCharSpace(dwValue1*8 / m_FontParam.iXScale, dwValue2*8 / m_FontParam.iXScale);
-        break;
-    }
-    return GetErrorInfo(iRet, "SetParam");
-}
-
-//打印文本数据函数
-ErrorCodeEnum ThermalPrintClassImpl::PrintText(BYTE* pData, DWORD dwDataLen)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintText");
-    int iRet = 0;
-
-    char sAnsi[64];
-    sprintf(sAnsi, "send leng=%d", dwDataLen);
-    LOG4VTM(INFO, sAnsi);
-
-    if (m_bFontChanged)
-    {
-        iRet = m_pPrint->SetFont(m_FontParam.bDH, m_FontParam.bDW, m_FontParam.bold, m_FontParam.bUL, false);
-        m_bFontChanged = false;
-        if (iRet != 0)
-            return GetErrorInfo(iRet, "PrintText");
-    }
-    int iLen = dwDataLen > 0 ? dwDataLen : strlen((char*)pData);
-    char* pGB = new char[iLen+1];
-    iLen = SUcs::UTF8ToGB18030((char*)pData, iLen, pGB);
-    iRet = m_pPrint->GetState();
-    if (iRet < 0)
-        GetErrorInfo(iRet, "PrintText");
-    iRet = m_pPrint->PrintData(pGB);
-    if (iRet < 0)
-        return GetErrorInfo(iRet, "PrintText");
-    return GetErrorInfo(0, "PrintText");
-}
-
-//打印条形码函数
-//dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
-//dwHeight 条形码高度 单位mm
-//iHRIPosition hri字符打印位置 见枚举类型HriPosition
-ErrorCodeEnum ThermalPrintClassImpl::PrintBarCode(BarCodeType eType, BYTE* pData,
-                                   DWORD dwDataLen, DWORD dwUnitWidth,
-                                   DWORD dwHeight, HriPosition eHRIPosition)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintBarCode");
-    return Error_Succeed;
-}
-
-//打印二维码QRCode函数
-//dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
-ErrorCodeEnum ThermalPrintClassImpl::PrintQRCode(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintQRCode");
-    return Error_Succeed;
-}
-
-//打印二维码QRCode函数
-//dwWidth 二维码长度 ,单位mm
-ErrorCodeEnum ThermalPrintClassImpl::PrintQRCodeByArea(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth, DWORD dwWidth)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintQRCodeByArea");
-    return Error_Succeed;
-}
-
-//打印二维码PDF417函数
-//errorLevel pdf417纠错级别 取值{0..8}
-//dwUnitWidth  基本元素宽度 取值{3..90}
-//dwUnitHeight 基本元素长度 取值{1..30}
-//row  pdf417 行数 取值{1..7}
-//lines pdf417 列数 取值{2..25}
-ErrorCodeEnum ThermalPrintClassImpl::PrintPDF417code(BYTE* pData, DWORD dwDataLen, int errorLevel,
-                                      DWORD dwUnitWidth, DWORD dwUnitHeight, int rows, int lines)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintPDF417code");
-    return Error_Succeed;
-}
-
-
-//打印二维码PDF417函数
-//errorLevel pdf417纠错级别 取值{0..8}
-//dwWidth  pdf417宽度 单位mm
-//dwHeight pdf417长度 单位mm
-ErrorCodeEnum ThermalPrintClassImpl::PrintPDF417codeByArea(BYTE* pData, DWORD dwDataLen,
-                                            int errorLevel, DWORD dwWidth, DWORD dwHeight)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintPDF417codeByArea");
-    return Error_Succeed;
-}
-
-
-//打印图像函数:pData是base64编码的数据
-ErrorCodeEnum ThermalPrintClassImpl::PrintImage(BYTE* pData, DWORD dwDataLen)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintImage");
-    int iRet = m_pPrint->PrintMemBmp((char*)pData, true);
-    return GetErrorInfo(iRet, "PrintImage");
-}
-
-
-//获取打印失败后错误信息和错误状态
-ErrorCodeEnum ThermalPrintClassImpl::GetLastErrState(ThermalState& devState, DevErrorInfo& devErrInfo)
-{
-    LOG4VTM_FUNCTION();
-    if (!m_pPrint->Isopen())
-        return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetLastErrState");
-
-    int iRet = m_pPrint->GetState();
-    if (iRet < 0)
-        return GetErrorInfo(iRet, "Reset");
-    devState.hardwareState = STATE_OK;
-    switch(iRet)
-    {
-    case RECEIPT_SUCCESS:
-        devState.paperState = PAPER_FULL;
-        break;
-    case RECEIPT_WARN_NO_MEDIA:
-        devState.paperState = PAPER_EMPTY;
-        break;
-    case RECEIPT_WARN_PAP_LOW:
-        devState.paperState = PAPER_LOW;
-        break;
-    case RECEIPT_WARN_HEAD_UP:
-        devState.hardwareState = STATE_OTHER_ERROR;
-        break;
-    case RECEIPT_WARN_JAMMED:
-        devState.paperState = PAPER_JAMMED;
-        break;
-    }
-    memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
-    return Error_Succeed;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-
-//  DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
-const static CmbErrorDef PrintErrInfo[] = {
-    {RECEIPT_SUCCESS,       "命令执行成功", Error_Succeed, DEC_SUCCESS},
-    {RECEIPT_ERR_NO_FOND,   "设备未找到", Error_Hardware, DEC_DEV_NOT_FOUND},
-    {RECEIPT_ERR_NO_OPEN,   "设备尚未打开", Error_Param, DEC_DEV_NOT_OPENED},
-    {RECEIPT_ERR_RCV_ERR,   "数据接收错误", Error_IO, DEC_COMMUNICATION_FAILED},
-    {RECEIPT_ERR_IN_ERR,    "输入参数错误", Error_Param, DEC_INVALID_PARAMETER},
-    {RECEIPT_ERR_DEV_ERR,   "设备硬件故障", Error_Hardware, DEC_HARDWARE},
-
-    {RECEIPT_WARN_NO_MEDIA,  "缺纸", Error_DevMedia, DEC_HARDWARE},
-    {RECEIPT_WARN_HEAD_UP,   "机头未闭合", Error_Hardware, DEC_HARDWARE},
-    {RECEIPT_WARN_JAMMED,    "卡纸", Error_Hardware, DEC_HARDWARE},
-
-    {RECEIPT_WARN_PAP_LOW,   "纸少", Error_Succeed, DEC_SUCCESS},
-};
-
-ErrorCodeEnum ThermalPrintClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
-{
-    size_t iLenOne = sizeof(CmbErrorDef);
-    size_t iLenAll = sizeof(PrintErrInfo);
-    int iCount = iLenAll / iLenOne;
-    char sErrInfo[256]="";
-    DWORD dSta = 0;
-    int iErr = -1;
-    for (int ia = 0; ia < iCount; ia++)
-    {
-        if (PrintErrInfo[ia].iCode == iCode)
-        {
-            dSta = PrintErrInfo[ia].iInf;
-            strcpy(sErrInfo, PrintErrInfo[ia].sInf);
-            iErr = PrintErrInfo[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;
-}
-

+ 0 - 112
DevAdapter/cw/termalprint.1.1/termalprintimpl.h

@@ -1,112 +0,0 @@
-#ifndef LIBFRAMEWORK_THERM_IMPL_H
-#define LIBFRAMEWORK_THERM_IMPL_H
-
-#include "ThermalPrintClass.h"
-#include "ReceiptSnbc.h"
-
-#define FILE_VERSION    1
-
-class ThermalPrintClassImpl : public ThermalPrintClass
-{
-public:
-    ThermalPrintClassImpl();
-    ~ThermalPrintClassImpl();
-
-
-    //DeviceBaseClass
-    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
-    ErrorCodeEnum Reset();
-    ErrorCodeEnum DevClose();
-    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
-
-    //	打开打印机
-    virtual ErrorCodeEnum DevOpen(BYTE btPort, DWORD dwBaudRate);
-    //	获取打印机实时状态
-    virtual ErrorCodeEnum GetDevState(ThermalState& devState);
-
-    //开始打印初始设置:paperWidth一般为80mm和57mm
-    virtual ErrorCodeEnum BeginPrint(ThermalPaperType eType, int paperWidth);
-
-    //打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
-    //第三个参数是预留参数 暂时无用到
-    virtual ErrorCodeEnum ControlAction(PrintAction eAction, DWORD dwValue1, DWORD dwValue2 = 0);
-
-    //打印参数指令函数:
-    //第三个参数是预留参数 暂时无用到
-    virtual ErrorCodeEnum SetParam(CommandType eType, DWORD dwValue1, DWORD dwValue2 = 0);
-
-    //打印字体指令函数:主要是字体相关饿指令函数
-    //第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
-    //					设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
-    virtual ErrorCodeEnum SetFont(FontStyle eType, DWORD dwValue1, DWORD dwValue2 = 0);
-
-    //打印文本数据函数
-    virtual ErrorCodeEnum PrintText(BYTE* pData, DWORD dwDataLen);
-
-    //打印条形码函数
-    //dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
-    //dwHeight 条形码高度 单位mm
-    //iHRIPosition hri字符打印位置 见枚举类型HriPosition
-    virtual ErrorCodeEnum PrintBarCode(BarCodeType eType, BYTE* pData, 
-                                       DWORD dwDataLen, DWORD dwUnitWidth,
-                                       DWORD dwHeight, HriPosition eHRIPosition);
-
-    //打印二维码QRCode函数
-    //dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
-    virtual ErrorCodeEnum PrintQRCode(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth);
-
-    //打印二维码QRCode函数
-    //dwWidth 二维码长度 ,单位mm
-    virtual ErrorCodeEnum PrintQRCodeByArea(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth, DWORD dwWidth);
-
-    //打印二维码PDF417函数
-    //errorLevel pdf417纠错级别 取值{0..8}
-    //dwUnitWidth  基本元素宽度 取值{3..90}
-    //dwUnitHeight 基本元素长度 取值{1..30}
-    //row  pdf417 行数 取值{1..7}
-    //lines pdf417 列数 取值{2..25}
-    virtual ErrorCodeEnum PrintPDF417code(BYTE* pData, DWORD dwDataLen, int errorLevel, 
-                                          DWORD dwUnitWidth, DWORD dwUnitHeight, int rows, int lines);
-
-    //打印二维码PDF417函数
-    //errorLevel pdf417纠错级别 取值{0..8}
-    //dwWidth  pdf417宽度 单位mm
-    //dwHeight pdf417长度 单位mm
-    virtual ErrorCodeEnum PrintPDF417codeByArea(BYTE* pData, DWORD dwDataLen, 
-                                                int errorLevel, DWORD dwWidth, DWORD dwHeight);
-
-    //打印图像函数:pData是base64编码的数据
-    virtual ErrorCodeEnum PrintImage(BYTE* pData, DWORD dwDataLen);
-
-    //获取打印失败后错误信息和错误状态
-    virtual ErrorCodeEnum GetLastErrState(ThermalState& devState, DevErrorInfo& devErrInfo);
-
-private:
-    ReceiptSnbc*        m_pPrint;
-    bool                m_bStartup;
-    bool                m_bFontChanged;
-    struct FontParam
-    {
-        bool bUL;
-        bool bold;
-        bool bDW;
-        bool bDH;
-        int  iXScale;
-
-        FontParam()
-        {
-            bold = bUL = bDW = bDH = false;
-            iXScale = 1;
-        }
-    };
-    FontParam       m_FontParam;
-
-protected:
-    ErrorCodeEnum       GetErrorInfo(int iCode, char* sErr, ...);
-    DevErrorInfo        m_DevErrInfo;
-    char                m_sLibPath[260];
-
-};
-
-
-#endif //LIBFRAMEWORK_THERM_IMPL_H

+ 13 - 0
DevAdapter/cw/ups.1.1/deviceconnect.cpp

@@ -46,6 +46,19 @@ int  DeviceConnect::GetStatus(bool& bUps, bool& bLow)
     return 0;
 }
 
+// 获取UPS电压电量
+int DeviceConnect::GetVoltage(int& iVol, int& iCap)
+{
+    BYTE Cmd[256] = {0x41, 0x20};
+    int iRecv = 0;
+    int iRet = Execute(Cmd, 2, Cmd, &iRecv);
+    if (iRet != 0)  return iRet;
+
+    iCap = Cmd[3]; //
+    iVol = Cmd[4] + (Cmd[5] << 8);
+    return 0;
+}
+
 // 关闭UPS
 int DeviceConnect::ShutDown(int iMinite)
 {

+ 2 - 0
DevAdapter/cw/ups.1.1/deviceconnect.h

@@ -21,6 +21,8 @@ public:
 
     // 获取UPS状态
     int     GetStatus(bool& bUps, bool& bLow);
+    // 获取UPS电压电量
+    int     GetVoltage(int& iVol, int& iCap);
     // 关闭UPS
     int ShutDown(int iMinite);
     // 重启UPS

+ 5 - 2
DevAdapter/cw/ups.1.1/upsimpl.cpp

@@ -71,7 +71,8 @@ ErrorCodeEnum UpsClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
         sprintf(devCategory.szModel, szModel, sSer);
     }
     else
-        sprintf(devCategory.szModel, szModel, "00000000");
+        return GetErrorInfo(UPS_NOT_OPEN, "GetDevCategory GetVersion error");
+//        sprintf(devCategory.szModel, szModel, "00000000");
     strcpy(devCategory.szVendor, "cw");
 
     char sPath[256], sFile[128] = {0};
@@ -101,6 +102,8 @@ ErrorCodeEnum UpsClassImpl::GetDevStatus(UpsStatusEnum& eStatus)
         eStatus = bUps ? UPS_STATUS_NO_ELECTOR : UPS_STATUS_NORMAL;
     else
         eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
+    int i1,i2;
+    iRet = m_pDevice->GetVoltage(i1, i2);
     return GetErrorInfo(iRet, "GetDevStatus");
 }
 
@@ -139,7 +142,7 @@ ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime, DWORD dwRestartTime)
     if (iRet != 0)
         return GetErrorInfo(iRet, "Shutdown");
     iRet = m_pDevice->ReStart(dwShutTime + dwRestartTime);
-    return GetErrorInfo(iRet, "Shutdown ReStart");;
+    return GetErrorInfo(iRet, "Shutdown ReStart");
 }
 
 ErrorCodeEnum UpsClassImpl::GetLastErr(DevErrorInfo &devErrInfo)

+ 3 - 2
DevAdapter/cw/watchdog.1.1/watchdogimpl.cpp

@@ -225,7 +225,8 @@ ErrorCodeEnum WatchDogClassImpl::RefreshDog()
         return Error_Succeed;
     time_t tNow=0;
     time(&tNow);
-    if (tNow + m_iTimeout > m_tReboot )
-        m_tReboot += m_iTimeout;
+//    if (tNow + m_iTimeout > m_tReboot )
+//        m_tReboot += m_iTimeout;
+    m_tReboot = tNow + m_iTimeout;
     return Error_Succeed;
 }