Ver Fonte

#IQRV #comment [DevAdapter] cw/2021.0310.01 二期ST首次版本

gifur há 4 anos atrás
pai
commit
f37271f7a8
37 ficheiros alterados com 939 adições e 1812 exclusões
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 11 5
      DevAdapter/cw/cardissuer.1.1/cardissuerimpl.cpp
  3. 1 1
      DevAdapter/cw/contactlesscard.1.1/CMakeLists.txt
  4. 252 0
      DevAdapter/cw/contactlesscard.1.1/PcscCall.cpp
  5. 90 0
      DevAdapter/cw/contactlesscard.1.1/PcscCall.h
  6. 0 257
      DevAdapter/cw/contactlesscard.1.1/PcscLibrary.cpp
  7. 0 698
      DevAdapter/cw/contactlesscard.1.1/PcscLibrary.h
  8. 107 111
      DevAdapter/cw/contactlesscard.1.1/contactlessimpl.cpp
  9. 4 3
      DevAdapter/cw/contactlesscard.1.1/contactlessimpl.h
  10. 1 1
      DevAdapter/cw/deps/cw.baseio/CMakeLists.txt
  11. 142 170
      DevAdapter/cw/deps/cw.baseio/SUcs.cpp
  12. 3 4
      DevAdapter/cw/deps/cw.baseio/SUcs.h
  13. 19 0
      DevAdapter/cw/deps/cw.baseio/public.cpp
  14. 9 3
      DevAdapter/cw/fingerprint.1.1/FingerPrintImpl.cpp
  15. 10 3
      DevAdapter/cw/gpio.1.1/gpioclassimpl.cpp
  16. 3 23
      DevAdapter/cw/hspscanner.1.1/CMakeLists.txt
  17. 33 0
      DevAdapter/cw/hspscanner.1.1/CameraBase.h
  18. 22 0
      DevAdapter/cw/hspscanner.1.1/hspscanner.pro
  19. 0 2
      DevAdapter/cw/hspscanner.1.1/hspscannerdev.cpp
  20. 0 256
      DevAdapter/cw/hspscanner.1.1/hspscannerform.cpp
  21. 0 71
      DevAdapter/cw/hspscanner.1.1/hspscannerform.h
  22. 0 32
      DevAdapter/cw/hspscanner.1.1/hspscannerform.ui
  23. 113 64
      DevAdapter/cw/hspscanner.1.1/hspscannerimpl.cpp
  24. 4 14
      DevAdapter/cw/hspscanner.1.1/hspscannerimpl.h
  25. 0 52
      DevAdapter/cw/hspscanner.1.1/ui_hspscannerform.h
  26. 1 1
      DevAdapter/cw/idcer.1.1/CMakeLists.txt
  27. 10 8
      DevAdapter/cw/idcer.1.1/idcertimpl.cpp
  28. 17 6
      DevAdapter/cw/pinpad.1.1/pinpadimpl.cpp
  29. 24 0
      DevAdapter/cw/termalprint.1.1/ReceiptBase.cpp
  30. 6 2
      DevAdapter/cw/termalprint.1.1/ReceiptBase.h
  31. 29 10
      DevAdapter/cw/termalprint.1.1/termalprintimpl.cpp
  32. 2 0
      DevAdapter/cw/termalprint.1.1/termalprintimpl.h
  33. 4 4
      DevAdapter/cw/ups.1.1/deviceconnect.cpp
  34. 2 2
      DevAdapter/cw/ups.1.1/deviceconnect.h
  35. 10 4
      DevAdapter/cw/ups.1.1/upsimpl.cpp
  36. 1 1
      DevAdapter/cw/watchdog.1.1/CMakeLists.txt
  37. 8 3
      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.0201.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0119.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2021.0111.01@LR04.02_VendorLib/testing)
-	set(CW_CONAN_LIB_NAME cw/2021.0208.01@LR04.02_VendorLib/testing)
+	set(CW_CONAN_LIB_NAME cw/2021.0310.01@LR04.02_VendorLib/testing)
     set(GWI_CONAN_LIB_NAME gwi/2021.0119.01@LR04.02_VendorLib/testing)
 endif(DEVADAPTER_USING_CONAN)
  

+ 11 - 5
DevAdapter/cw/cardissuer.1.1/cardissuerimpl.cpp

@@ -52,15 +52,21 @@ ErrorCodeEnum CardIssuerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     if (!m_bIsOpen)
         return HandleDevError(DEVICE_NOT_OPEN, "GetDevCategory");
     char version[256];
+    char sFwid[32];
     int iRt = m_pDriver->getFirmversion((unsigned char*)version);
     ErrorCodeEnum eRt = HandleDevError(iRt, "GetDevCategory");
-    if(Error_Succeed != eRt)
-        strcpy(version, "A6-G422-72-Sankyo error");
+    if(Error_Succeed == eRt)
+    {
+        strcpy(sFwid, version+18);
+    }
+    else
+        strcpy(sFwid, "G422-72");
 
+    char szType[] = {"PVER=ACT#MID=F5-5540"};
+    char szModel[] = "CM=V2.0#FWID=%s#CID=00000000";
     memset(&devCategory, 0, sizeof(devCategory));
-    strcpy(devCategory.szType ,version);
-    char szModel[] = "CM=V2.0#FWID=00000000#CID=00000000";
-    strcpy(devCategory.szModel , szModel);
+    strcpy(devCategory.szType ,szType);
+    sprintf(devCategory.szModel , szModel, sFwid);
     strcpy(devCategory.szVendor , "cw");
     devCategory.version.wMajor = 1;
     devCategory.version.wMinor = 1;

+ 1 - 1
DevAdapter/cw/contactlesscard.1.1/CMakeLists.txt

@@ -9,7 +9,7 @@ set(${MODULE_PREFIX}_BATCH "1")
 
 # 包含要编译的实现文件,rvc_dev_config_library 内使用
 set(${MODULE_PREFIX}_SRCS SHARED
-        contactlessimpl.cpp contactlessdev.cpp  PcscLibrary.cpp
+	    contactlessimpl.cpp contactlessdev.cpp PcscCall.cpp
     )
 
 # 适配器工程需要通过此宏替代 add_library

+ 252 - 0
DevAdapter/cw/contactlesscard.1.1/PcscCall.cpp

@@ -0,0 +1,252 @@
+#include "PcscCall.h"
+#include "cmb.h"
+
+#define SCARD_SCOPE_SYSTEM		0x0002	/**< Scope in system */
+#define SCARD_E_NO_READERS_AVAILABLE    ((LONG)0x8010002E) /**< Cannot find a smart card reader. */
+#define SCARD_UNPOWER_CARD		0x0002	/**< Power down on close */
+#define SCARD_SHARE_EXCLUSIVE		0x0001	/**< Exclusive mode only */
+#define SCARD_PROTOCOL_T0		0x0001	/**< T=0 active protocol. */
+#define SCARD_PROTOCOL_T1		0x0002	/**< T=1 active protocol. */
+#define SCARD_STATE_UNAWARE		0x0000	/**< App wants status */
+#define SCARD_SHARE_DIRECT		0x0003	/**< Raw mode only */
+#define SCARD_PROTOCOL_UNDEFINED	0x0000	/**< protocol not set */
+#define SCARD_LEAVE_CARD		0x0000	/**< Do nothing on close */
+
+#define SCARD_CTL_CODE(code) (0x42000000 + (code))
+#define IOCTL_CCID_ESCAPE                   SCARD_CTL_CODE(1)
+
+PcscCall::PcscCall()
+{
+    m_sErrInfo[0] = 0;
+    m_sReadName[0] = 0;
+    m_hContext = NULL;
+    m_hCurCard = NULL;
+    SCardEstablishContext = NULL;
+}
+
+bool PcscCall::Load()
+{
+    void *hLib = dlopen("libpcsclite.so", RTLD_LAZY);        //load so
+    if(hLib == NULL)
+    {
+        strcpy(m_sErrInfo, "load libpcsclite.so error");
+        return false;
+    }
+    SCardEstablishContext = (pSCardEstablishContext)dlsym(hLib, "SCardEstablishContext");
+    if (SCardEstablishContext == NULL)
+    {
+        strcpy(m_sErrInfo, "find function SCardEstablishContext error");
+        return false;
+    }
+    SCardListReaders = (pSCardListReaders)dlsym(hLib, "SCardListReaders");
+    SCardConnect = (pSCardConnect)dlsym(hLib, "SCardConnect");
+    SCardDisconnect = (pSCardDisconnect)dlsym(hLib, "SCardDisconnect");
+    SCardGetStatusChange = (pSCardGetStatusChange)dlsym(hLib, "SCardGetStatusChange");
+    SCardStatus = (pSCardStatus)dlsym(hLib, "SCardStatus");
+    SCardTransmit = (pSCardTransmit)dlsym(hLib, "SCardTransmit");
+    SCardCancel = (pSCardCancel)dlsym(hLib, "SCardCancel");
+    SCardReleaseContext = (pSCardReleaseContext)dlsym(hLib, "SCardReleaseContext");
+    SCardIsValidContext = (pSCardIsValidContext)dlsym(hLib, "SCardIsValidContext");
+    SCardControl = (pSCardControl)dlsym(hLib, "SCardControl");
+
+    m_sErrInfo[0] = 0;
+    return true;
+}
+
+bool PcscCall::Open(const char* sNameIn)
+{
+    if (SCardEstablishContext == NULL && Load() == false)
+        return false;
+
+    LONG iRet = SCARD_S_SUCCESS;
+    if (m_hContext == NULL)
+    iRet = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &m_hContext);
+    if (iRet != SCARD_S_SUCCESS || m_hContext == NULL)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardEstablishContext %x", iRet);
+        return false;
+    }
+    char    sNameList[1024]="";
+    ULONG   dwLeng=1024;
+    iRet = SCardListReaders(m_hContext, NULL, sNameList , &dwLeng);
+    if (iRet == SCARD_E_NO_READERS_AVAILABLE)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardListReaders NO_READERS %x", iRet);
+        return false;
+    }
+    if (iRet != SCARD_S_SUCCESS || strlen(sNameList) < 16)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardListReaders %x", iRet);
+        return false;
+    }
+    if (m_hCurCard)
+        SCardDisconnect(m_hCurCard, SCARD_UNPOWER_CARD);
+    m_hCurCard = NULL;
+    int     iLen = sNameIn ? strlen(sNameIn) : 0;
+    char*   pEnd = sNameList + dwLeng;
+
+    for (char* pName = sNameList; pName < pEnd; pName++)
+    {
+        if (memcmp(pName, sNameIn, iLen) == 0)
+        {
+            strcpy(m_sReadName, pName);
+            return true;
+        }
+        pName += strlen(pName);
+    }
+    sprintf(m_sErrInfo, "PCSC SCardListReaders not fond");
+    return false;
+}
+
+bool PcscCall::Close()
+{
+    if (m_hCurCard)
+        DicConnect();
+
+    if (m_hContext > 0)
+    {
+        SCardCancel(m_hContext);
+        SCardReleaseContext(m_hContext);
+        m_hContext = 0;
+    }
+    m_sReadName[0] = 0;
+    return false;
+}
+
+int PcscCall::GetState()
+{
+    if (m_hContext == 0)
+    {
+        strcpy(m_sErrInfo, "PCSC not opened");
+        return STATE_NO_READER;
+    }
+    long iRet = SCARD_S_SUCCESS;
+
+    SCARD_READERSTATE ReaderState;
+    ReaderState.szReader = m_sReadName;
+    ReaderState.dwCurrentState = SCARD_STATE_UNAWARE;
+    ReaderState.dwEventState = 0;
+    DWORD Value_timeout = 0;
+    DWORD ReaderCount = 1;
+
+    iRet = SCardGetStatusChange(m_hContext, Value_timeout, &ReaderState, ReaderCount);
+    if (iRet != SCARD_S_SUCCESS)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardGetStatusChange %x", iRet);
+        return STATE_ERROR;
+    }
+
+    if (ReaderState.cbAtr > 0)
+    {
+        return STATE_HAVE_CARD;
+    }
+    return STATE_NO_CARD;
+}
+
+bool PcscCall::Connect(char* sATR, int& iLen)
+{
+    if (m_hContext == NULL)
+    {
+        strcpy(m_sErrInfo, "PCSC not opened");
+        return STATE_NO_READER;
+    }
+    if (m_hCurCard)
+        SCardDisconnect(m_hCurCard, SCARD_UNPOWER_CARD);
+    m_hCurCard = NULL;
+    LONG iRet = SCardConnect(m_hContext, m_sReadName, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1, &m_hCurCard, &m_APrtocol);
+    if (iRet != 0)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardConnect %s %x", m_sReadName, iRet);
+        return false;
+    }
+
+    ULONG dwState;
+    char szReader[256] = {0};
+    BYTE byData[256] = {0};
+    ULONG iDataLen = 256;
+    ULONG iReaderLen = 256;
+
+    iRet = SCardStatus(m_hCurCard, szReader, &iReaderLen, &dwState, &m_APrtocol, byData, &iDataLen);
+    if (iRet != SCARD_S_SUCCESS )
+    {
+        sprintf(m_sErrInfo, "PCSC SCardStatus %x", iRet);
+        return false;
+    }
+    memcpy(sATR, byData, iDataLen);
+    iLen = iDataLen;
+    return true;
+}
+
+bool PcscCall::DicConnect()
+{
+    if (m_hCurCard)
+        SCardDisconnect(m_hCurCard, SCARD_UNPOWER_CARD);
+    m_hCurCard = NULL;
+    return true;
+}
+
+int  PcscCall::ChipIO(const char* sIn, char* sOut)
+{
+    if (m_hCurCard == NULL)
+    {
+        strcpy(m_sErrInfo, "PCSC not connected");
+        return STATE_NO_READER;
+    }
+    SCARD_IO_REQUEST	pioSendRequest;
+    pioSendRequest.dwProtocol = m_APrtocol;
+    pioSendRequest.cbPciLength = sizeof(SCARD_IO_REQUEST);
+    BYTE bSend[512], bRecv[512];
+    ULONG iLen = ::HexStrToANSI(sIn, bSend);
+    ULONG iRcv = 512;
+    LONG iRet = SCardTransmit(m_hCurCard, &pioSendRequest, bSend, iLen, NULL, bRecv, &iRcv);
+    if (iRet != SCARD_S_SUCCESS)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardTransmit %x", iRet);
+        return STATE_ERROR;
+    }
+    ::ANSIToHexStr(bRecv, iRcv, sOut);
+    return 0;
+}
+
+int PcscCall::SendCMD(const char* sIn, char* sOut)
+{
+    if (m_hContext == 0)
+    {
+        strcpy(m_sErrInfo, "PCSC not opened");
+        return STATE_NO_READER;
+    }
+    if (m_hCurCard)
+        SCardDisconnect(m_hCurCard, SCARD_UNPOWER_CARD);
+    m_hCurCard = NULL;
+
+    long iRet = SCARD_S_SUCCESS;
+
+    SCARDHANDLE		hCurCard = 0;
+    ULONG dwOutProtocal = 0;
+
+    iRet = SCardConnect(m_hContext, m_sReadName, SCARD_SHARE_DIRECT, SCARD_PROTOCOL_UNDEFINED,&hCurCard, &dwOutProtocal);
+    if (iRet != 0)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardConnect %s %x", m_sReadName, iRet);
+        return STATE_ERROR;
+    }
+
+    BYTE bSend[512], bRecv[512];
+    ULONG iLen = ::HexStrToANSI(sIn, bSend);
+    ULONG iRcv = 512;
+
+    iRet = SCardControl(hCurCard, IOCTL_CCID_ESCAPE, bSend, iLen, bRecv, 512, &iRcv);
+    if (iRet != SCARD_S_SUCCESS)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardControl %s %x", m_sReadName, iRet);
+        return STATE_ERROR;
+    }
+    ::ANSIToHexStr(bRecv, iRcv, sOut);
+    iRet = SCardDisconnect(hCurCard, SCARD_LEAVE_CARD);
+    if (iRet != SCARD_S_SUCCESS)
+    {
+        sprintf(m_sErrInfo, "PCSC SCardDisconnect %x", iRet);
+        return STATE_ERROR;
+    }
+    return STATE_NO_CARD;
+}

+ 90 - 0
DevAdapter/cw/contactlesscard.1.1/PcscCall.h

@@ -0,0 +1,90 @@
+#ifndef CPCSCCALL_H
+#define CPCSCCALL_H
+
+#include "public.h"
+
+typedef LONG SCARDCONTEXT;
+typedef LONG SCARDHANDLE;
+#define MAX_ATR_SIZE			33	/**< Maximum ATR size */
+#define SCARD_S_SUCCESS         0
+
+/* 说明:
+ * 静态加载pcsc会造成函数冲突,必须改成动态加载
+ * PCSC的DWORD定义为 unsigned long,实际为8字节,本系统定义的DWORD为标准4字节,定义不一致,必须更改函数声明的类型,原pcsc中DWORD相关定义均修改为ULONG
+*/
+
+#define DATA_IN_ERROR       -3
+#define STATE_ERROR         -2
+#define STATE_NO_READER     -1
+#define STATE_NO_CARD       0
+#define STATE_HAVE_CARD     1
+#define STATE_CONNECTED     2
+
+typedef struct
+{
+    const char *szReader;
+    void *pvUserData;
+    ULONG dwCurrentState;
+    ULONG dwEventState;
+    ULONG cbAtr;
+    unsigned char rgbAtr[MAX_ATR_SIZE];
+}
+SCARD_READERSTATE, *LPSCARD_READERSTATE;
+
+typedef struct
+{
+    unsigned long dwProtocol;	/**< Protocol identifier */
+    unsigned long cbPciLength;	/**< Protocol Control Inf Length */
+}
+SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
+
+typedef LONG (*pSCardEstablishContext)(LONG, LPVOID, LPVOID, LONG*);
+typedef LONG (*pSCardListReaders)(LONG hContext, LPCSTR mszGroups, LPSTR mszReaders, ULONG* pcchReaders);
+
+typedef LONG (*pSCardCancel)(SCARDCONTEXT hContext);
+typedef LONG (*pSCardReleaseContext)(SCARDCONTEXT hContext);
+typedef LONG (*pSCardIsValidContext)(SCARDCONTEXT hContext);
+
+typedef LONG (*pSCardConnect)(SCARDCONTEXT hContext, LPCSTR szReader, ULONG dwShareMode, ULONG dwPreferredProtocols, SCARDHANDLE* phCard, ULONG* pdwActiveProtocol);
+typedef LONG (*pSCardDisconnect)(SCARDHANDLE hCard, ULONG dwDisposition);
+typedef LONG (*pSCardGetStatusChange)(SCARDCONTEXT hContext, ULONG dwTimeout, LPSCARD_READERSTATE rgReaderStates, ULONG cReaders);
+typedef LONG (*pSCardStatus)(SCARDHANDLE hCard, LPSTR mszReaderName, ULONG* pcchReaderLen, ULONG* pdwState, ULONG* pdwProtocol, LPBYTE pbAtr, ULONG* pcbAtrLen);
+typedef LONG (*pSCardTransmit)(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci, LPBYTE pbSendBuffer, ULONG cbSendLength, SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, ULONG* pcbRecvLength);
+typedef LONG (*pSCardControl)(SCARDHANDLE hCard, ULONG dwControlCode, const VOID* pbSendBuffer, ULONG cbSendLength, VOID* pbRecvBuffer, ULONG cbRecvLength, ULONG* lpBytesReturned);
+
+class PcscCall
+{
+public:
+    PcscCall();
+
+    bool    Load();
+    bool    Open(const char* sName);
+    bool    Close();
+    int     GetState();
+    bool    Connect(char* sATR, int& iLen);
+    bool    DicConnect();
+    int     ChipIO(const char* sIn, char* sOut);
+    int     SendCMD(const char* sIn, char* sOut);
+
+    const char*         GetErrInfo(){return m_sErrInfo;};
+protected:
+    pSCardEstablishContext      SCardEstablishContext;
+    pSCardListReaders           SCardListReaders;
+    pSCardCancel                SCardCancel;
+    pSCardReleaseContext        SCardReleaseContext;
+    pSCardIsValidContext        SCardIsValidContext;
+    pSCardConnect               SCardConnect;
+    pSCardDisconnect            SCardDisconnect;
+    pSCardGetStatusChange       SCardGetStatusChange;
+    pSCardStatus                SCardStatus;
+    pSCardTransmit              SCardTransmit;
+    pSCardControl               SCardControl;
+
+    char                        m_sErrInfo[256];
+    char                        m_sReadName[64];
+    SCARDCONTEXT                m_hContext;
+    SCARDHANDLE                 m_hCurCard;
+    ULONG                       m_APrtocol;
+};
+
+#endif // CPCSCCALL_H

+ 0 - 257
DevAdapter/cw/contactlesscard.1.1/PcscLibrary.cpp

@@ -1,257 +0,0 @@
-#include "PcscLibrary.h"
-
-CPcscLibrary::CPcscLibrary(void)
-{
-	hModule = NULL;
-    OpenConnect            = NULL;
-    CloseConnect           = NULL;
-    GetReaderListName      = NULL;
-    SetReaderName          = NULL;
-    GetReaderType          = NULL;
-    GetCardStatus          = NULL;
-    EjectCard              = NULL;
-    ReaderConnect          = NULL;
-    SendApdu               = NULL;
-    SendControlCMD         = NULL;
-    HotReset               = NULL;
-    SetReaderType          = NULL;
-    GetVersionInfo         = NULL;
-    AutoBeel               = NULL;
-    Beel                   = NULL;
-    SetLightMode           = NULL;
-    GetLightMode           = NULL;
-    SetLightStatus         = NULL;
-    GetLightStatus         = NULL;
-    BanTypeBCap            = NULL;
-    LoadMifareKey          = NULL;
-    CheckMifareKey         = NULL;
-    Read                   = NULL;
-    Write                  = NULL;
-    GetCardUID             = NULL;
-    SAMSlotActivation      = NULL;
-    ReadMagAllTracks       = NULL;
-    GetRFCardType          = NULL;
-    ReadIDCardInifo        = NULL;
-    M1ValueProcess         = NULL;
-    M1InquireBalance       = NULL;
-    M1BackBlock            = NULL;
-    GetIDFinger            = NULL;
-    GetIDDNNums            = NULL;
-    GetSAMID               = NULL;
-    SwitchRF               = NULL;
-    GetLastError           = NULL;
-}
-
-CPcscLibrary::~CPcscLibrary(void)
-{
-	if (hModule != NULL)
-	{
-		dlclose(hModule);
-		hModule = NULL;
-	}
-}
-
-bool CPcscLibrary::Load(const char* lpDllPath, char* ErrorInfo)
-{
-	//定义变量
-	returnValue = false;
-
-	//判断参数
-	if(ErrorInfo == NULL)
-	{
-		goto ExitLine;
-	}
-	//加载动态库
-	if(hModule)
-	{
-		returnValue = true;
-		goto ExitLine;
-	}
-
-	hModule = dlopen(lpDllPath, RTLD_LAZY);
-	if(hModule == NULL)
-	{
-		sprintf(ErrorInfo, "加载传入:%s失败!",lpDllPath);
-		//加载传入路径失败,再加载一次当前路径默认DLL
-		hModule = dlopen("./CRT_603_CZ7.so", RTLD_LAZY);
-		if(hModule == NULL)
-		{
-			sprintf(ErrorInfo, "加载默认及传入路径失败!");
-			goto ExitLine;
-		}
-	}
-
-	//******************************************************************************************************************
-	//加载CRT_OpenConnect
-    OpenConnect = (pCRT_OpenConnect)dlsym(hModule, "CRT_OpenConnect");
-    if(!OpenConnect)
-	{
-		sprintf(ErrorInfo, "加载'CRT_OpenConnect'失败!");
-		goto ExitLine;
-	}
-	
-	//******************************************************************************************************************
-	//加载CRT_CloseConnect
-    CloseConnect = (pCRT_CloseConnect)dlsym(hModule, "CRT_CloseConnect");
-    if(!CloseConnect)
-	{
-		sprintf(ErrorInfo, "加载'CRT_CloseConnect'失败!");
-		goto ExitLine;
-	}
-	
-    GetReaderListName = (pCRT_GetReaderListName)dlsym(hModule, "CRT_GetReaderListName");
-	
-	//******************************************************************************************************************
-	//加载CRT_SetReaderName
-    SetReaderName = (pCRT_SetReaderName)dlsym(hModule, "CRT_SetReaderName");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetReaderType
-    GetReaderType = (pCRT_GetReaderType)dlsym(hModule, "CRT_GetReaderType");
-
-	//******************************************************************************************************************
-	//加载CRT_GetCardStatus
-    GetCardStatus = (pCRT_GetCardStatus)dlsym(hModule, "CRT_GetCardStatus");
-
-	//******************************************************************************************************************
-	//加载CRT_EjectCard
-    EjectCard = (pCRT_EjectCard)dlsym(hModule, "CRT_EjectCard");
-
-	//******************************************************************************************************************
-	//加载CRT_ReaderConnect
-    ReaderConnect = (pCRT_ReaderConnect)dlsym(hModule, "CRT_ReaderConnect");
-
-	//******************************************************************************************************************
-	//加载CRT_SendApdu
-    SendApdu = (pCRT_SendApdu)dlsym(hModule, "CRT_SendApdu");
-
-	//******************************************************************************************************************
-	//加载CRT_SendControlCMD
-    SendControlCMD = (pCRT_SendControlCMD)dlsym(hModule, "CRT_SendControlCMD");
-
-	//******************************************************************************************************************
-	//加载CRT_HotReset
-    HotReset = (pCRT_HotReset)dlsym(hModule, "CRT_HotReset");
-
-	//******************************************************************************************************************
-	//加载CRT_SetReaderType
-    SetReaderType = (pCRT_SetReaderType)dlsym(hModule, "CRT_SetReaderType");
-
-	//******************************************************************************************************************
-	//加载CRT_GetVersionInfo
-    GetVersionInfo = (pCRT_GetVersionInfo)dlsym(hModule, "CRT_GetVersionInfo");
-	
-	//******************************************************************************************************************
-	//加载CRT_AutoBeel
-    AutoBeel = (pCRT_AutoBeel)dlsym(hModule, "CRT_AutoBeel");
-
-	//******************************************************************************************************************
-	//加载CRT_Beel
-    Beel = (pCRT_Beel)dlsym(hModule, "CRT_Beel");
-
-	//******************************************************************************************************************
-	//加载CRT_SetLightMode
-    SetLightMode = (pCRT_SetLightMode)dlsym(hModule, "CRT_SetLightMode");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetLightMode
-    GetLightMode = (pCRT_GetLightMode)dlsym(hModule, "CRT_GetLightMode");
-
-	//******************************************************************************************************************
-	//加载CRT_SetLightStatus
-    SetLightStatus = (pCRT_SetLightStatus)dlsym(hModule, "CRT_SetLightStatus");
-
-	//******************************************************************************************************************
-	//加载CRT_GetLightStatus
-    GetLightStatus = (pCRT_GetLightStatus)dlsym(hModule, "CRT_GetLightStatus");
-
-	//******************************************************************************************************************
-	//加载CRT_BanTypeBCap
-    BanTypeBCap = (pCRT_BanTypeBCap)dlsym(hModule, "CRT_BanTypeBCap");
-	
-	//******************************************************************************************************************
-	//加载CRT_LoadMifareKey
-    LoadMifareKey = (pCRT_LoadMifareKey)dlsym(hModule, "CRT_LoadMifareKey");
-	
-	//******************************************************************************************************************
-	//加载CRT_CheckMifareKey
-    CheckMifareKey = (pCRT_CheckMifareKey)dlsym(hModule, "CRT_CheckMifareKey");
-	
-	//******************************************************************************************************************
-	//加载CRT_Read
-    Read = (pCRT_Read)dlsym(hModule, "CRT_Read");
-	
-	//******************************************************************************************************************
-	//加载CRT_Write
-    Write = (pCRT_Write)dlsym(hModule, "CRT_Write");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetCardUID
-    GetCardUID = (pCRT_GetCardUID)dlsym(hModule, "CRT_GetCardUID");
-	
-	//******************************************************************************************************************
-	//加载CRT_SAMSlotActivation
-    SAMSlotActivation = (pCRT_SAMSlotActivation)dlsym(hModule, "CRT_SAMSlotActivation");
-	
-	//******************************************************************************************************************
-	//加载CRT_ReadMagAllTracks
-    ReadMagAllTracks = (pCRT_ReadMagAllTracks)dlsym(hModule, "CRT_ReadMagAllTracks");
-
-	
-	//******************************************************************************************************************
-	//加载CRT_GetRFCardType
-    GetRFCardType = (pCRT_GetRFCardType)dlsym(hModule, "CRT_GetRFCardType");
-	
-	//******************************************************************************************************************
-	//加载CRT_ReadIDCardInifo
-    ReadIDCardInifo = (pCRT_ReadIDCardInifo)dlsym(hModule, "CRT_ReadIDCardInifo");
-
-	//******************************************************************************************************************
-	//加载CRT_M1ValueProcess
-    M1ValueProcess = (pCRT_M1ValueProcess)dlsym(hModule, "CRT_M1ValueProcess");
-
-	//******************************************************************************************************************
-	//加载CRT_M1InquireBalance
-    M1InquireBalance = (pCRT_M1InquireBalance)dlsym(hModule, "CRT_M1InquireBalance");
-	
-	//******************************************************************************************************************
-	//加载CRT_M1BackBlock
-    M1BackBlock = (pCRT_M1BackBlock)dlsym(hModule, "CRT_M1BackBlock");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetIDFinger
-    GetIDFinger = (pCRT_GetIDFinger)dlsym(hModule, "CRT_GetIDFinger");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetIDDNNums
-    GetIDDNNums = (pCRT_GetIDDNNums)dlsym(hModule, "CRT_GetIDDNNums");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetSAMID
-    GetSAMID = (pCRT_GetSAMID)dlsym(hModule, "CRT_GetSAMID");
-	
-	//******************************************************************************************************************
-	//加载CRT_SwitchRF
-    SwitchRF = (pCRT_SwitchRF)dlsym(hModule, "CRT_SwitchRF");
-	
-	//******************************************************************************************************************
-	//加载CRT_GetLastError
-    GetLastError = (pCRT_GetLastError)dlsym(hModule, "CRT_GetLastError");
-	returnValue = true;
-
-ExitLine:
-	if(!returnValue && hModule)
-	{
-		dlclose(hModule);
-	}
-	return returnValue;
-}
-
-bool CPcscLibrary::IsLoadSucceed()
-{
-	if (!hModule && !returnValue)
-	{
-		return false;
-	}
-	return true;
-}

+ 0 - 698
DevAdapter/cw/contactlesscard.1.1/PcscLibrary.h

@@ -1,698 +0,0 @@
-#ifndef  __LoadLibrary_H__
-#define  __LoadLibrary_H__
-
-
-#include <stdio.h>       //标准输入输出定义
-#include <string.h>
-#include <stdlib.h>      //标准函数库定义
-#include <unistd.h>      //Unix标准函数定义
-#include <sys/types.h>
-#include <sys/stat.h>  
-#include <fcntl.h>       //文件控制定义
-#include <termios.h>     //PPSIX终端控制定义
-#include <errno.h>       //错误号定义
-
-#include <dlfcn.h>
-
-//二代证信息
-typedef struct
-{
-	char szName[31];   //姓名
-	char szSex[5];     //性别
-	char szNation[20]; //民族
-	char szBornDay[10]; //出生
-	char szAddress[128]; //地址
-	char szIDNum[20];   //身份证编号
-	char szIssued[51];  //签发机关
-	char szBeginValidity[10]; //开始有效日期
-	char szEndValidity[10];   //截止有效日期
-	char szHeadPath[256];      //小头像路径
-}CRTDef_IDInfo, *pCRTDef_IDInf;
-
-
-/** 
- * @fn		CRT_OpenConnect 
- * @detail	打开CRT智能读卡器
- * @see		...
- * @param	iListNums:输出 连接的读卡器列表个数
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_OpenConnect)(int* iListNums);
-
-
-
-
-/** 
- * @fn		CRT_CloseConnect 
- * @detail	关闭CRT智能读卡器
- * @see		...
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_CloseConnect)();
-
-
-
-
-/** 
- * @fn		CRT_GetReaderListName 
- * @detail	获取智能读卡器列表名字
- * @see		...
- * @param	iListNum:需获取的读卡器序列号(0为起始)
- * @param	szListName:输出 获取到的读卡器名字
- * @return	0 成功, 非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetReaderListName)(int iListNum, char szListName[]);
-
-
-
-
-/** 
- * @fn		CRT_SetReaderName 
- * @detail	设置当前工作的读卡器序列号(打开时,默认设置为第一个读卡器)
- * @see		...
- * @param	iListNum:需设置的读卡器序列号(0为起始)
- * @return	0 成功, 非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SetReaderName)(int iListNum);
-
-
-
-
-/** 
- * @fn		CRT_GetCardStatus 
- * @detail	获取读卡器上卡状态
- * @see		...
- * @return	1 有卡, 2 无卡, 9 状态未知
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetCardStatus)();
-
-
-
-
-/** 
- * @fn		CRT_EjectCard 
- * @detail	弹卡下电,读卡器断开连接
- * @see		...
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_EjectCard)();
-
-
-
-
-/** 
- * @fn		CRT_ReaderConnect 
- * @detail	读卡器卡片上电
- * @see		...
- * @param	byAtrData:输出 上电成功返回的ATR数据
- * @param	iAtrLen: 输出 上电成功返回的ATR数据长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_ReaderConnect)(unsigned char byAtrData[], int* iAtrLen);
-
-
-
-
-/** 
- * @fn		CRT_SendApdu 
- * @detail	读卡器发送APDU指令
- * @see		...
- * @param	bySendData:需发送的APDU指令(支持acsii码与BCD码)
- * @param	iSendDataLen: 需发送的APDU指令长度
- * @param	byRecvData:输出 APDU通讯后返回的数据
- * @param	iRecvDataLen: 输出 APDU通讯后返回的数据长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SendApdu)(unsigned char bySendData[], int iSendDataLen, unsigned char byRecvData[], int* iRecvDataLen);
-
-
-
-
-/** 
- * @fn		CRT_SendControlCMD 
- * @detail	读卡器发送扩展控制命令
- * @see		...
- * @param	bySendData:需发送的扩展控制命令数据(支持acsii码与BCD码)
- * @param	iSendDataLen: 需发送的扩展控制命令数据长度
- * @param	byRecvData:输出 扩展控制命令通讯后返回的数据
- * @param	iRecvDataLen: 输出 扩展控制命令通讯后返回的数据长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SendControlCMD)(unsigned char bySendData[], int iSendDataLen, unsigned char byRecvData[], int* iRecvDataLen);
-
-
-
-
-//***********************发送CRT603具体功能扩展命令****************************
-/** 
- * @fn		CRT_HotReset 
- * @detail	读卡器热复位
- * @see		...
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_HotReset)();
-
-
-
-
-/** 
- * @fn		CRT_SetReaderType 
- * @detail	设置读卡器操作模式
- * @see		...
- * @param	iType: 1 正常RF卡模式, 2 Felica模式, 3 点对点模式, 4 二代证模式, 5 卡模拟模式
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SetReaderType)(int iType);
-
-
-
-
-/** 
- * @fn		CRT_GetReaderType 
- * @detail	获取读卡器操作模式
- * @see		...
- * @return	>0 失败 1 正常RF卡模式, 2 Felica模式, 3 点对点模式, 4 二代证模式, 5 卡模拟模式
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetReaderType)();
-
-
-
-
-/** 
- * @fn		CRT_GetVersionInfo 
- * @detail	获取读卡器版本信息
- * @see		...
- * @param	iVerType: 需获取的版本 0 P/N信息, 1 SN信息, 2, 固件版本信息, 3 生成版本信息, 4 EMID信息, 5 动态库版本信息
- * @param	szVersionInfo: 输出 返回的版本信息
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetVersionInfo)(int iVerType, char szVersionInfo[]);
-
-
-
-
-/** 
- * @fn		CRT_AutoBeel 
- * @detail	读卡器自动蜂鸣
- * @see		...
- * @param	bAutoBeel: 是否自动蜂鸣,true 开启,false 关闭
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_AutoBeel)(bool bAutoBeel);
-
-
-
-
-/** 
- * @fn		CRT_Beel 
- * @detail	读卡器蜂鸣设置
- * @see		...
- * @param	MultipleTime: 蜂鸣时间:0.25秒的倍数,比如2,蜂鸣时间:2*0.25 即0.5秒(0-20 默认为1)
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_Beel)(int MultipleTime);
-
-
-
-
-/** 
- * @fn		CRT_SetLightMode 
- * @detail	设置读卡器指示灯模式
- * @see		...
- * @param	iType: 指示灯模式 0 自动模式, 1 手动模式
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SetLightMode)(int iType);
-
-
-
-
-/** 
- * @fn		CRT_GetLightMode 
- * @detail	获取读卡器指示灯模式
- * @see		...
- * @return	0 自动模式,1 手动模式, 9模式未知
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetLightMode)();
-
-
-
-
-/** 
- * @fn		CRT_SetLightStatus 
- * @detail	设置读卡器指示灯状态
- * @see		...
- * @param	iYellowType: 黄色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iBlueType:   蓝色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iGreenType:  绿色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iRedType:    红色指示灯状态 0 关, 1 开, 2 闪烁
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SetLightStatus)(int iYellowType, int iBlueType, int iGreenType,  int iRedType);
-
-
-
-
-/** 
- * @fn		CRT_SetLightStatus 
- * @detail	获取读卡器指示灯状态
- * @see		...
- * @param	iYellowType: 输出 黄色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iBlueType:   输出 蓝色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iGreenType:  输出 绿色指示灯状态 0 关, 1 开, 2 闪烁
- * @param	iRedType:    输出 红色指示灯状态 0 关, 1 开, 2 闪烁
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetLightStatus)(int* iYellowType, int* iBlueType, int* iGreenType,  int* iRedType);
-
-
-
-
-/** 
- * @fn		CRT_BanTypeBCap 
- * @detail	设置读卡器读取TYPE B卡能力
- * @see		...
- * @param	bBan: 是否关闭读TYPE B卡能力。 true 关闭, false 打开 
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_BanTypeBCap)(bool bBan);
-
-
-
-
-//***********************发送CRT603具体功能APDU命令****************************
-/** 
- * @fn		CRT_LoadMifareKey 
- * @detail	Mifare卡下载密码
- * @see		...
- * @param	ilocal:   密码存储位置。 0 临时性存储器, 1 非易失存储器
- * @param	iKeyType: 密钥类型。 0 TYPE A类型, 1 TYPE B类型 
- * @param	iKeyNum:  将保存到密钥组号(共0-15组) 
- * @param	byInKeyData: 密码信息。 (共6位,如0xFF,0xFF,0xFF,0xFF,0xFF,0xFF)
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_LoadMifareKey)(int ilocal, int iKeyType, int iKeyNum, unsigned char byInKeyData[]);
-
-
-
-
-/** 
- * @fn		CRT_CheckMifareKey 
- * @detail	Mifare卡校验密码
- * @see		...
- * @param	iKeyType: 密钥类型。 0 TYPE A类型, 1 TYPE B类型 
- * @param	iKeyNum:  已下载好的密钥组号(共0-15组) 
- * @param	iBlockNum: 需校验的Mifare卡块号(0为起始位)
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_CheckMifareKey)(int iKeyType, int iKeyNum, int iBlockNum);
-
-
-
-
-/** 
- * @fn		CRT_Read 
- * @detail	非CPU卡读数据操作
- * @see		...
- * @param	bFilica: 是否为filica卡读操作。 true 是filica, false 非filica 
- * @param	iBlockNum: 需读取的卡块号(0为起始位)
- * @param	byReadData: 输出 读取到的数据
- * @param	iReadDataLen: 输出 读取到的数据长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_Read)(bool bFilica, int iBlockNum, unsigned char byReadData[], int* iReadDataLen);
-
-
-
-
-/** 
- * @fn		CRT_Write 
- * @detail	非CPU卡写数据操作
- * @see		...
- * @param	bFilica: 是否为filica卡读操作。 true 是filica, false 非filica 
- * @param	iBlockNum: 需写入的卡块号(0为起始位)
- * @param	byWriteData: 写入到读卡器上的数据
- * @param	iWriteLen: 写入到读卡器上的数据长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_Write)(bool bFilica, int iBlockNum, unsigned char byWriteData[], int iWriteLen);
-
-
-
-
-/** 
- * @fn		CRT_GetCardUID 
- * @detail	获取卡片UID信息
- * @see		...
- * @param	szUID: 输出 卡片的UID信息
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetCardUID)(char szUID[]);
-
-
-
-
-//***********************发送CRT603具体功能SAM卡命令****************************
-/** 
- * @fn		CRT_SAMSlotActivation 
- * @detail	SAM卡切换并激活卡座
- * @see		...
- * @param	iSlotNum: 需切换激活的卡座号 (1-4个,如 1表示SAM1卡座) 
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_SAMSlotActivation)(int iSlotNum);
-
-
-
-//***********************磁条卡操作命令****************************
-/** 
- * @fn		CRT_ReadMagAllTracks
- * @detail	读所有磁道操作
- * @see		...
- * @param	szTrack1: 磁道1数据 ‘Not’未读取到
- * @param	szTrack2: 磁道2数据 ‘Not’未读取到
- * @param	szTrack3: 磁道3数据 ‘Not’未读取到
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_ReadMagAllTracks)(char szTrack1[], char szTrack2[], char szTrack3[]);
-
-
-//***********************获取RF卡类型****************************
-/** 
- * @fn		CRT_GetRFCardType 
- * @detail	获取RF卡类型
- * @see		...
- * @return	0 无卡,1 TYPE A类型卡, 2 TYPE B类型卡, 3 身份证, 其他 失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_GetRFCardType)();
-
-
-//***********************读二代证信息命令****************************
-/** 
- * @fn		CRT_ReadIDCardInifo 
- * @detail	读二代证信息
- * @see		...
- * @param	crtdef_IdInfo: 输出,读取到的二代证信息
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef int (*pCRT_ReadIDCardInifo)(CRTDef_IDInfo* crtdef_IdInfo);
-
-
-
-
-/** 
- * @fn		CRT_M1ValueProcess 
- * @detail	M1卡值操作
- * @see		...
- * @param	iMode: 输入,操作模式。 1 初始化钱包, 2 增值, 3 减值
- * @param	iBlock: 输入,操作块区。 需绝对地址
- * @param	iValue: 输入,操作金额
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/9/19
- */
-typedef int (*pCRT_M1ValueProcess)(int iMode, int iBlock, int iValue);
-
-
-
-/** 
- * @fn		CRT_M1InquireBalance 
- * @detail	M1卡查询余额
- * @see		...
- * @param	iBlock: 输入,操作块区。 需绝对地址
- * @param	iValue: 输出,查询到的金额值
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/9/19
- */
-typedef int (*pCRT_M1InquireBalance)(int iBlock, int* iValue);
-
-
-
-/** 
- * @fn		CRT_M1BackBlock 
- * @detail	M1卡备份钱包
- * @see		...
- * @param	iBlock: 输入,需备份块区。 需绝对地址
- * @param	iBackBlock: 输入,备份到块区。 需绝对地址
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/9/19
- */
-typedef int (*pCRT_M1BackBlock)(int iBlock, int iBackBlock);
-
-
-
-/** 
- * @fn		CRT_GetIDFinger 
- * @detail	获取二代证指纹信息
- * @see		...
- * @param	byFinger: 输出,获取到的指纹信息(一般为1024个字节)
- * @param	iFingerLen: 输出,指纹信息长度
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/10/27
- */
-typedef int (*pCRT_GetIDFinger)(unsigned char byFinger[], int *iFingerLen);
-
-
-
-/** 
- * @fn		CRT_GetIDFinger 
- * @detail	获取二代证DN号
- * @see		...
- * @param	szDNNums: 输出,获取到的DN号
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/10/30
- */
-typedef int (*pCRT_GetIDDNNums)(char szDNNums[]);
-
-
-
-/** 
- * @fn		CRT_GetSAMID 
- * @detail	获取身份证盒子SAM ID
- * @see		...
- * @param	szSAMID: 输出,获取到的SAM ID
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/10/30
- */
-typedef int (*pCRT_GetSAMID)(char szSAMID[]);
-
-
-
-/** 
- * @fn		CRT_SwitchRF 
- * @detail	读卡器开关射频场
- * @see		...
- * @param	iMode: 输入 开关射频场方式,0 开启, 1 关闭
- * @return	0 成功,非0失败
- * @exception ...
- *
- * @author	luowei
- * @date	2016/10/30
- */
-typedef int (*pCRT_SwitchRF)(int iMode);
-
-
-
-//***********************获取最后一次错误描叙****************************
-/** 
- * @fn		CRT_GetLastError 
- * @detail	获取最后一次错误描叙
- * @see		...
- * @return	获取信息
- * @exception ...
- *
- * @author	luowei
- * @date	2015/12/1
- */
-typedef char* (*pCRT_GetLastError)();
-
-
-
-class CPcscLibrary
-{
-//对外接口函数
-public:
-    bool Load(const char* lpDllPath, char* ErrorInfo);
-	bool IsLoadSucceed();
-    pCRT_OpenConnect          OpenConnect ;
-    pCRT_CloseConnect         CloseConnect;
-    pCRT_GetReaderListName    GetReaderListName;
-    pCRT_SetReaderName        SetReaderName;
-    pCRT_GetReaderType        GetReaderType;
-    pCRT_GetCardStatus        GetCardStatus;
-    pCRT_EjectCard            EjectCard;
-    pCRT_ReaderConnect        ReaderConnect;
-    pCRT_SendApdu             SendApdu;
-    pCRT_SendControlCMD       SendControlCMD;
-    pCRT_HotReset             HotReset;
-    pCRT_SetReaderType        SetReaderType;
-    pCRT_GetVersionInfo       GetVersionInfo;
-    pCRT_AutoBeel	          AutoBeel;
-    pCRT_Beel                 Beel;
-    pCRT_SetLightMode	      SetLightMode;
-    pCRT_GetLightMode         GetLightMode;
-    pCRT_SetLightStatus       SetLightStatus;
-    pCRT_GetLightStatus       GetLightStatus;
-    pCRT_BanTypeBCap          BanTypeBCap;
-    pCRT_LoadMifareKey        LoadMifareKey;
-    pCRT_CheckMifareKey       CheckMifareKey;
-    pCRT_Read                 Read;
-    pCRT_Write                Write;
-    pCRT_GetCardUID           GetCardUID;
-    pCRT_SAMSlotActivation    SAMSlotActivation;
-    pCRT_ReadMagAllTracks     ReadMagAllTracks;
-    pCRT_GetRFCardType        GetRFCardType;
-    pCRT_ReadIDCardInifo      ReadIDCardInifo;
-    pCRT_M1ValueProcess       M1ValueProcess;
-    pCRT_M1InquireBalance     M1InquireBalance;
-    pCRT_M1BackBlock          M1BackBlock;
-    pCRT_GetIDFinger          GetIDFinger;
-    pCRT_GetIDDNNums          GetIDDNNums;
-    pCRT_GetSAMID             GetSAMID;
-    pCRT_SwitchRF             SwitchRF;
-    pCRT_GetLastError         GetLastError;
-
-
-private:
-	void *  hModule;
-	bool returnValue;
-
-public:
-    CPcscLibrary(void);
-    ~CPcscLibrary(void);
-};
-
-#endif //__LoadLibrary_H__

+ 107 - 111
DevAdapter/cw/contactlesscard.1.1/contactlessimpl.cpp

@@ -1,40 +1,35 @@
 #include "contactlessimpl.h"
-#include "cmb.h"
+#include "SSocket.h"
 
-#define DEVICE_NAME "CREATOR CRT-603 (CZ1) CCR RF 0"
+#define DEVICE_NAME "Creator 603 smart card (20120516)"
 
 ContactlessCardImpl::ContactlessCardImpl()
 {
-    m_pConnect = new CPcscLibrary();
+    m_bDevOpen = false;
     m_bCardConn = false;
 }
 
 ContactlessCardImpl::~ContactlessCardImpl()
 {
-    delete m_pConnect;
 }
 
 ErrorCodeEnum ContactlessCardImpl::DevOpen(DWORD dwPort,DWORD dwBaudRate)
 {
     LOG4VTM_FUNCTION();
+    GetCurLibsPath(m_sLibPath, NULL);
 
-    char cFilePath[300] = {0};
-    GetCurLibsPath(m_sLibPath, cFilePath);
+    char sTemp[400];
+    if (m_PcscCall.Load() == false)
+        return GetErrorInfo(PCSC_NOT_OPEN, "DevOpen");
+
+    Sleep(200);
+    if (m_PcscCall.Open(DEVICE_NAME) == false)
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "DevOpen %s", m_PcscCall.GetErrInfo());
 
-    sprintf(cFilePath, "DevOpen GetCurProcPath = %s", m_sLibPath);
-    LOG4VTM(INFO, cFilePath);
-    sprintf(cFilePath, "%s/cw/libCRT603.cw.so", m_sLibPath); //usr symbolic link to point the real so
-
-    bool bOK = m_pConnect->Load(cFilePath, cFilePath);
-    if (!bOK) return GetErrorInfo(PCSC_HARDWARE_ERROR, "DevOpen");
-    int iCount = 0;
-    int iRt = m_pConnect->OpenConnect(&iCount);
-    if (iRt != 0)
-        return GetErrorInfo(PCSC_HARDWARE_ERROR, "DevOpen OpenConnect %d", iRt);
-    iRt = m_pConnect->SetReaderName(0);
-    if (iRt != 0)
-        return GetErrorInfo(PCSC_HARDWARE_ERROR, "DevOpen SetReaderName %d", iRt);
-    return GetErrorInfo(0, "DevOpen %d", iRt);
+    sprintf(sTemp, "DevOpen GetCurProcPath = %s", m_sLibPath);
+    LOG4VTM(INFO, sTemp);
+    m_bDevOpen = true;
+    return GetErrorInfo(0, "DevOpen");
 }
 
 int getFileVer(char* sFile, short& ch1, short& ch2)
@@ -64,21 +59,33 @@ int getFileVer(char* sFile, short& ch1, short& ch2)
 ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "GetDevCategory");
 
-    ErrorCodeEnum err = Error_Succeed;
-
     char sSer[256];
     memset(sSer, 0, sizeof(sSer));
-    if (m_pConnect->GetVersionInfo(2, sSer) == 0)
+    Sleep(500);
+
+    char szType[] = {"PVER=CREATOR#MID=CRT-603"};
+    char szModel[] = "FWID=%s";
+    char sSend[32] = "6892000500";
+
+    int iRet = m_PcscCall.SendCMD(sSend, sSer);
+    if (iRet < 0)
     {
-        sSer[32] = 0;
-        strcpy(devCategory.szType, sSer);
+        devCategory.eState = DEVICE_STATUS_NOT_READY;
+        sprintf(devCategory.szModel, szModel, "00000000");
     }
     else
-        strcpy(devCategory.szType, DEVICE_NAME);
-    strcpy(devCategory.szModel, "WID=Cashway001");
+    {
+        unsigned char chVer[16];
+        ::HexStrToANSI(sSer, chVer, 16);
+        chVer[8] = 0;
+        sprintf(devCategory.szModel, szModel, chVer);
+        devCategory.eState = DEVICE_STATUS_NORMAL;
+    }
+
+    strcpy(devCategory.szType, szType);
     strcpy(devCategory.szVendor, "cw");
 
     char cFilePath[300] = {0};
@@ -101,29 +108,24 @@ ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
 ErrorCodeEnum ContactlessCardImpl::Reset()
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
-        return GetErrorInfo(PCSC_NOT_OPEN, "Reset");
-
-    m_pConnect->CloseConnect();
-    int iCount = 0;
-    int iRt = m_pConnect->OpenConnect(&iCount);
-    if (iRt != 0)
-        return GetErrorInfo(PCSC_HARDWARE_ERROR, "Reset OpenConnect %d", iRt);
-    iRt = m_pConnect->SetReaderName(0);
-    if (iRt != 0)
-        return GetErrorInfo(PCSC_HARDWARE_ERROR, "Reset SetReaderName %d", iRt);
-    return GetErrorInfo(0, "Reset %d", iRt);
+    if (!m_bDevOpen)
+        return GetErrorInfo(PCSC_NOT_OPEN, "Reset ");
+
+    m_PcscCall.Close();
+    bool bOK = m_PcscCall.Open(DEVICE_NAME);
+    if (!bOK)
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "Reset %s", m_PcscCall.GetErrInfo());
+    return GetErrorInfo(0, "Reset");
 }
 
 ErrorCodeEnum ContactlessCardImpl::DevClose()
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "DevClose");
-
-    m_pConnect->CloseConnect();
-    ErrorCodeEnum err = Error_Succeed;
-    return err;
+    m_bDevOpen = false;
+    m_PcscCall.Close();
+    return Error_Succeed;
 }
 
 //  DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
@@ -190,18 +192,19 @@ ErrorCodeEnum ContactlessCardImpl::GetLastErr(DevErrorInfo &devErrInfo)
 ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus& devStatus)
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "GetDevStatus");
-    int ia = m_pConnect->GetCardStatus();
-    switch(ia){
-    case 1:
+
+    int iRet = m_PcscCall.GetState();
+    if (iRet < 0)
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "GetDevStatus %s", m_PcscCall.GetErrInfo());
+
+    if (iRet > 0)
+    {
         devStatus.eMediaPos = CI_MEDIA_RF;
-        break;
-    case 2:
-        devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
-        m_bCardConn = false;
-        break;
-    default:
+    }
+    else
+    {
         devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
         m_bCardConn = false;
     }
@@ -223,38 +226,32 @@ ErrorCodeEnum ContactlessCardImpl::AbortRead()
 ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType)
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "ActiveContactlessICCard");
 
-    BYTE byAtrData[256] =  {0};
-    int iAtrLen = 0;
-    m_bCardConn = false;
-    int iRet = m_pConnect->ReaderConnect(byAtrData, &iAtrLen);
-    if (iRet != 0 || iAtrLen < 1)
-    {
-        outType = '0';
-        return GetErrorInfo(PCSC_NO_CARD, "ActiveContactlessICCard ReaderConnect %d %s", iRet, m_pConnect->GetLastError());
-    }
-    char sHexData[512];
-    ::ANSIToHexStr(byAtrData, iAtrLen, sHexData);
-    printf("ATR %d %s\n", iAtrLen, sHexData);
+    char sATR[256];
+    int  iLen = 0;
+    if (!m_PcscCall.Connect(sATR, iLen))
+        return GetErrorInfo(PCSC_NOT_CONN, "ActiveContactlessICCard %s", m_PcscCall.GetErrInfo());
+
     outType = 'A';
-    if (strcmp(sHexData, "3B8F8001804F0CA000000306030001E00000018B") == 0)
+    if (strcmp(sATR, "3B8F8001804F0CA000000306030001E00000018B") == 0)
         outType = '0';
-    if (strcmp(sHexData, "3B8F8001804F0CA000000306030001000000006A") == 0)  // 公交卡、房卡
+    if (strcmp(sATR, "3B8F8001804F0CA000000306030001000000006A") == 0)  // 公交卡、房卡
         outType = 'M';
-    if (strcmp(sHexData, "3B8F8001804F0CA0000003060300020000000069") == 0)
+    if (strcmp(sATR, "3B8F8001804F0CA0000003060300020000000069") == 0)
         outType = 'M';
-    if (strcmp(sHexData, "3B8F8001804F0CA000000306030001E00000018B") == 0)
+    if (strcmp(sATR, "3B8F8001804F0CA000000306030001E00000018B") == 0)
         outType = '0';
 
 //    if (strcmp(sHexData, "3B8E800180318066B1C5240100ED83009000F7") == 0)  //
 //        outType = '2';
-    if (iAtrLen == 13 && strstr(sHexData, "3B888001D103"))   //身份证
+    if (strlen(sATR) == 26 && strstr(sATR, "3B888001D103"))   //身份证
         outType = 'B';
 
+    Sleep(400);
     m_bCardConn = true;
-    return GetErrorInfo(iRet, "ActiveContactlessICCard");
+    return GetErrorInfo(0, "ActiveContactlessICCard");
 }
 //
 //	Deactivate contactless IC card
@@ -262,14 +259,14 @@ ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char sc
 ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard()
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "DeactContactlessICCard");
 
     m_bCardConn = false;
-    int iRet = m_pConnect->EjectCard();
-    if (iRet == 0)
-        return GetErrorInfo(0, "DeactContactlessICCard");
-    return GetErrorInfo(PCSC_HARDWARE_ERROR, "ActiveCDeactContactlessICCard %d", iRet);;
+
+    if (!m_PcscCall.DicConnect())
+        return GetErrorInfo(PCSC_NOT_CONN, "DeactContactlessICCard %s", m_PcscCall.GetErrInfo());
+    return GetErrorInfo(0, "DeactContactlessICCard");
 }
 //
 //	Warm reset card(IC)
@@ -277,25 +274,21 @@ ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard()
 ErrorCodeEnum ContactlessCardImpl::WarmReset()
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "WarmReset");
 
     m_bCardConn = false;
-    if (m_pConnect->GetCardStatus() != 1)
-        return GetErrorInfo(PCSC_NO_CARD, "WarmReset");
-    int iRet = m_pConnect->EjectCard();
-    if (iRet != 0)
-        return GetErrorInfo(iRet, "WarmReset");
-
-    BYTE byAtrData[256] =  {0};
-    int iAtrLen = 0;
-    iRet = m_pConnect->ReaderConnect(byAtrData, &iAtrLen);
-    if (iRet == 0)
-    {
-        m_bCardConn = true;
-        return GetErrorInfo(0, "WarmReset");
-    }
-    return GetErrorInfo(PCSC_HARDWARE_ERROR, "WarmReset %d", iRet);;
+
+    if (!m_PcscCall.DicConnect())
+        return GetErrorInfo(PCSC_NOT_CONN, "WarmReset %s", m_PcscCall.GetErrInfo());
+
+    char sATR[256];
+    int  iLen = 0;
+    if (!m_PcscCall.Connect(sATR, iLen))
+        return GetErrorInfo(PCSC_NOT_CONN, "WarmReset %s", m_PcscCall.GetErrInfo());
+
+    m_bCardConn = true;
+    return GetErrorInfo(0, "WarmReset");;
 }
 //
 //	Mifare operation
@@ -332,14 +325,20 @@ ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& rec
     if (m_bCardConn == false)
         return GetErrorInfo(PCSC_NOT_CONN, "RFTypeABCommand");
 
-    unsigned char sAnsi[1024];
-    int iRetCount = 0;
-    ::HexStrToANSI((char*)sendBuf.data, sAnsi, sendBuf.dwSize);
-    int iRet = m_pConnect->SendApdu(sAnsi, sendBuf.dwSize << 1, sAnsi, &iRetCount);
-    if (iRet != 0)
-        return GetErrorInfo(iRet, "RFTypeABCommand SendApdu %d %s", iRet, m_pConnect->GetLastError());
-    ::ANSIToHexStr(sAnsi, iRetCount, (char*)recvBuf.data);
-    recvBuf.dwSize = iRetCount << 1;
+    char sSend[600];
+    ::ANSIToHexStr(sendBuf.data, sendBuf.dwSize, sSend);
+    LOG4VTM(INFO, sSend);
+
+    int iRet = m_PcscCall.ChipIO(sSend, sSend);
+    if (iRet < 0)
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "RFTypeABCommand %s", m_PcscCall.GetErrInfo());
+
+    LOG4VTM(INFO, sSend);
+    int iLen = strlen(sSend);
+    recvBuf.dwSize = iLen/2;
+    ::HexStrToANSI(sSend, recvBuf.data, iLen);
+    recvBuf.data[recvBuf.dwSize] = 0;
+    Sleep(10);
     return Error_Succeed;
 }
 
@@ -348,14 +347,11 @@ ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo& rec
 ErrorCodeEnum ContactlessCardImpl::HaltCard()
 {
     LOG4VTM_FUNCTION();
-    if (!m_pConnect->IsLoadSucceed())
+    if (!m_bDevOpen)
         return GetErrorInfo(PCSC_NOT_OPEN, "HaltCard");
 
-    int iRet = m_pConnect->EjectCard();
-    if (iRet == 0)
-    {
-        m_bCardConn = false;
-        return GetErrorInfo(0, "HaltCard");
-    }
-    return GetErrorInfo(PCSC_HARDWARE_ERROR, "HaltCard %d", iRet);;
+    m_bCardConn = false;
+    if (!m_PcscCall.DicConnect())
+        return GetErrorInfo(PCSC_HARDWARE_ERROR, "HaltCard %s", m_PcscCall.GetErrInfo());
+    return GetErrorInfo(0, "HaltCard");
 }

+ 4 - 3
DevAdapter/cw/contactlesscard.1.1/contactlessimpl.h

@@ -2,7 +2,8 @@
 #define LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H
 
 #include "RFICClass.h"
-#include "PcscLibrary.h"
+#include "cmb.h"
+#include "PcscCall.h"
 
 #define PCSC_SUCCESS				 0	// command succeeded
 #define PCSC_NOT_OPEN				-1	// command succeeded
@@ -20,7 +21,6 @@ public:
     ContactlessCardImpl();
     ~ContactlessCardImpl();
 
-
     //DeviceBaseClass
     virtual ErrorCodeEnum DevOpen(DWORD dwPort,DWORD dwBaudRate);
     virtual ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
@@ -82,11 +82,12 @@ public:
     //card have been halted must move from induction zone then can be found again
     virtual ErrorCodeEnum HaltCard();
 private:
-    CPcscLibrary*       m_pConnect;
     ErrorCodeEnum       GetErrorInfo(int iCode, char* sErr, ...);
     DevErrorInfo        m_DevErrInfo;
     char                m_sLibPath[260];
+    bool                m_bDevOpen;
     bool                m_bCardConn;
+    PcscCall            m_PcscCall;
 };
 
 

+ 1 - 1
DevAdapter/cw/deps/cw.baseio/CMakeLists.txt

@@ -1,5 +1,5 @@
 set(srcs serial.cpp public.cpp sini.cpp SUsb.cpp SUcs.cpp smutex.cpp
-    define.h serial.h public.h sini.h SUsb.h SUcs.h smutex.h)
+	define.h serial.h public.h sini.h SUsb.h SUcs.h smutex.h)
 
 add_compile_options(-fPIC)
 add_library(baseio STATIC ${srcs})

+ 142 - 170
DevAdapter/cw/deps/cw.baseio/SUcs.cpp

@@ -20,123 +20,123 @@ SUcs::~SUcs()
 //UTF32转UTF8,纯算法实现,只转换一个UNICODE字符
 int	SUcs::UnicodeToUTF8(unsigned int iUnicode, char* sOut)
 {
-	//	0000 0000-0000 007F | 0xxxxxxx
-	//	0000 0080-0000 07FF | 110xxxxx 10xxxxxx
-	//	0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
-	//	0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-	unsigned char* sTemp = (unsigned char*)sOut;
-	if (iUnicode > 0xFFFF)
-	{
-		if (sTemp)
-		{
-			sTemp[0] = (((iUnicode >> 18) & 0x07) | 0xF0);
-			sTemp[1] = (((iUnicode >> 12) & 0x3f) | 0x80);
-			sTemp[2] = (((iUnicode >> 6) & 0x3f) | 0x80);
-			sTemp[3] = ((iUnicode & 0x3f) | 0x80);
-		}
-		return 4;		
-	}
-	if (iUnicode > 0x7FF)
-	{
-		if (sTemp)	
-		{
-			sTemp[0] = (((iUnicode >> 12) & 0x0F) | 0xE0);
-			sTemp[1] = (((iUnicode >> 6) & 0x3F) | 0x80);
-			sTemp[2] = ((iUnicode & 0x3f) | 0x80);
-		}
-		return 3;
-	}
-	if (iUnicode > 0x7F)
-	{
-		if (sTemp)	
-		{
-			sTemp[0] = (((iUnicode >> 6) & 0x1F) | 0xC0);
-			sTemp[1] = ((iUnicode & 0x3f) | 0x80);
-		}
-		return 2;
-	}
-	if (sTemp)
-	{
-		//低位
-		*sTemp++ = (iUnicode & 0xff);
-	}
-	return 1;
+    //	0000 0000-0000 007F | 0xxxxxxx
+    //	0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+    //	0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+    //	0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+    unsigned char* sTemp = (unsigned char*)sOut;
+    if (iUnicode > 0xFFFF)
+    {
+        if (sTemp)
+        {
+            sTemp[0] = (((iUnicode >> 18) & 0x07) | 0xF0);
+            sTemp[1] = (((iUnicode >> 12) & 0x3f) | 0x80);
+            sTemp[2] = (((iUnicode >> 6) & 0x3f) | 0x80);
+            sTemp[3] = ((iUnicode & 0x3f) | 0x80);
+        }
+        return 4;
+    }
+    if (iUnicode > 0x7FF)
+    {
+        if (sTemp)
+        {
+            sTemp[0] = (((iUnicode >> 12) & 0x0F) | 0xE0);
+            sTemp[1] = (((iUnicode >> 6) & 0x3F) | 0x80);
+            sTemp[2] = ((iUnicode & 0x3f) | 0x80);
+        }
+        return 3;
+    }
+    if (iUnicode > 0x7F)
+    {
+        if (sTemp)
+        {
+            sTemp[0] = (((iUnicode >> 6) & 0x1F) | 0xC0);
+            sTemp[1] = ((iUnicode & 0x3f) | 0x80);
+        }
+        return 2;
+    }
+    if (sTemp)
+    {
+        //低位
+        *sTemp++ = (iUnicode & 0xff);
+    }
+    return 1;
 }
 
 //UTF32转UTF16,纯算法实现,只转换一个UNICODE字符,返回UTF16字符数
 int	SUcs::UnicodeToUTF16(unsigned int iUnicode, unsigned short* sOut)
 {
-	if (iUnicode > 0x10000)
-	{
-		//	0x10000其UTF-16编码就是0xD800 0xDC00(即0x10000经UTF-16编码后的码元序列为0xD800 0xDC00),
-		//	====代理码元1====   ====代理码元2====	
-		//	1101 10pp ppxx xxxx 1101 11xx xxxx xxxx
-		//	16个平面(即第2平面~第17平面)平面号需要-1
-		if (sOut)	
-		{
-			int iSpace = (iUnicode >> 16) - 1;
-			sOut[0] = 0xD800 | (iSpace << 6) | ((iUnicode >> 10) & 0x3f);
-			sOut[1] = 0xDC00 | (iUnicode & 0x3ff);
-		}
-		return 2;		
-	}
-	if (sOut)	
-	{
-		*sOut = iUnicode;
-	}
-	return 1;
+    if (iUnicode > 0x10000)
+    {
+        //	0x10000其UTF-16编码就是0xD800 0xDC00(即0x10000经UTF-16编码后的码元序列为0xD800 0xDC00),
+        //	====代理码元1====   ====代理码元2====
+        //	1101 10pp ppxx xxxx 1101 11xx xxxx xxxx
+        //	16个平面(即第2平面~第17平面)平面号需要-1
+        if (sOut)
+        {
+            int iSpace = (iUnicode >> 16) - 1;
+            sOut[0] = 0xD800 | (iSpace << 6) | ((iUnicode >> 10) & 0x3f);
+            sOut[1] = 0xDC00 | (iUnicode & 0x3ff);
+        }
+        return 2;
+    }
+    if (sOut)
+    {
+        *sOut = iUnicode;
+    }
+    return 1;
 }
 
 
 //UTF8转UTF16,纯算法实现,只转换一个UNICODE字符,返回UTF8字符数
 int	SUcs::UTF8ToUnicode(const char* sUTF8, unsigned int *iUnicode)
 {
-	//	0000 0000-0000 007F | 0xxxxxxx
-	//	0000 0080-0000 07FF | 110xxxxx 10xxxxxx
-	//	0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
-	//	0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-	unsigned char* sTemp = (unsigned char*)sUTF8;
-	if ((*sTemp & 0xf0) == 0xf0)	//1111 四字节
-	{
-		*iUnicode = ((sTemp[0] & 0x07) << 18) |
-			((sTemp[1] & 0x3f) << 12) |
-			((sTemp[2] & 0x3f) << 6 ) |
-			(sTemp[3] & 0x3f);
-		return 4;		
-	}
-	if ((*sTemp & 0xf0) == 0xE0)	//1110 三字节
-	{
-		*iUnicode = ((sTemp[0] & 0x0f) << 12) |
-			((sTemp[1] & 0x3f) << 6 ) |
-			(sTemp[2] & 0x3f);
-		return 3;
-	}
-	if ((*sTemp & 0xf0) == 0xC0)	//1100 二字节
-	{
-		*iUnicode = ((sTemp[0] & 0x1f) << 6 ) | (sTemp[1] & 0x3f);
-		return 2;
-	}
-	*iUnicode = sTemp[0];
-	return 1;
+    //	0000 0000-0000 007F | 0xxxxxxx
+    //	0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+    //	0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+    //	0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+    unsigned char* sTemp = (unsigned char*)sUTF8;
+    if ((*sTemp & 0xf0) == 0xf0)	//1111 四字节
+    {
+        *iUnicode = ((sTemp[0] & 0x07) << 18) |
+            ((sTemp[1] & 0x3f) << 12) |
+            ((sTemp[2] & 0x3f) << 6 ) |
+            (sTemp[3] & 0x3f);
+        return 4;
+    }
+    if ((*sTemp & 0xf0) == 0xE0)	//1110 三字节
+    {
+        *iUnicode = ((sTemp[0] & 0x0f) << 12) |
+            ((sTemp[1] & 0x3f) << 6 ) |
+            (sTemp[2] & 0x3f);
+        return 3;
+    }
+    if ((*sTemp & 0xf0) == 0xC0)	//1100 二字节
+    {
+        *iUnicode = ((sTemp[0] & 0x1f) << 6 ) | (sTemp[1] & 0x3f);
+        return 2;
+    }
+    *iUnicode = sTemp[0];
+    return 1;
 }
 
 //UTF16转UTF32,纯算法实现,只转换一个UNICODE字符,返回UTF16字符数
 int	SUcs::UTF16ToUnicode(const unsigned short* sUTF16, unsigned int *iUnicode)
 {
-	//	0x10000其UTF-16编码就是0xD800 0xDC00(即0x10000经UTF-16编码后的码元序列为0xD800 0xDC00),
-	//	====代理码元1====   ====代理码元2====	
-	//	1101 10pp ppxx xxxx 1101 11xx xxxx xxxx
-	//	16个平面(即第2平面~第17平面)平面号需要-1
+    //	0x10000其UTF-16编码就是0xD800 0xDC00(即0x10000经UTF-16编码后的码元序列为0xD800 0xDC00),
+    //	====代理码元1====   ====代理码元2====
+    //	1101 10pp ppxx xxxx 1101 11xx xxxx xxxx
+    //	16个平面(即第2平面~第17平面)平面号需要-1
     if ((*sUTF16 & 0xFF00) == 0xD800)	//1111 四字节
-	{
-		int iSpace = ((sUTF16[0] >> 6) & 0x0f) + 1;
-		*iUnicode = (iSpace << 16) 
-			      | ((sUTF16[0] & 0x3f) << 10)
-				  | (sUTF16[1] & 0x3ff) ;
-		return 2;
-	}
-	*iUnicode = sUTF16[0];
-	return 1;
+    {
+        int iSpace = ((sUTF16[0] >> 6) & 0x0f) + 1;
+        *iUnicode = (iSpace << 16)
+                  | ((sUTF16[0] & 0x3f) << 10)
+                  | (sUTF16[1] & 0x3ff) ;
+        return 2;
+    }
+    *iUnicode = sUTF16[0];
+    return 1;
 }
 
 //UTF16转UTF8,纯算法实现,转换整个字符串,返回UTF8字符数
@@ -172,61 +172,61 @@ int	SUcs::UTF8ToUTF16(const char* sUTF8, unsigned short* sUTF16)
 //GB18030转UTF8,转换整个字符串,返回UTF8字符数
 int	SUcs::GB18030ToUTF8(const char* sGB18030, char* sUnicode)
 {
-	int iLen = strlen(sGB18030);
-	wchar_t*	wch=new wchar_t[iLen + 1];
+    int iLen = strlen(sGB18030);
+    wchar_t*	wch=new wchar_t[iLen + 1];
     int iRet = MultiByteToWideChar(CP_ACP, 0, sGB18030, iLen, wch, iLen);
-	if (iRet < 0) 
-	{
-		delete wch;
-		return -1;
-	}
-	wch[iRet] = 0;
-	iLen = UTF16ToUTF8((const unsigned short*)wch, sUnicode);
-	delete wch;
-	return iRet;
+    if (iRet < 0)
+    {
+        delete wch;
+        return -1;
+    }
+    wch[iRet] = 0;
+    iLen = UTF16ToUTF8((const unsigned short*)wch, sUnicode);
+    delete wch;
+    return iRet;
 }
 
 //GB18030转UTF16,转换整个字符串,返回UTF16字符数
 int	SUcs::GB18030ToUTF16(const char* sGB18030, unsigned short* sUnicode)
 {
-	int iLen = strlen(sGB18030);
-	wchar_t*	wch=new wchar_t[iLen + 1];
+    int iLen = strlen(sGB18030);
+    wchar_t*	wch=new wchar_t[iLen + 1];
     int iRet = MultiByteToWideChar(CP_ACP, 0, sGB18030, iLen, (LPWSTR)sUnicode, iLen);
-	if (iRet < 0)	return -1;
-	sUnicode[iRet] = 0;
-	return iRet;
+    if (iRet < 0)	return -1;
+    sUnicode[iRet] = 0;
+    return iRet;
 }
 
 //UTF8转GB18030,转换整个字符串,返回UTF8字符数
 int	SUcs::UTF8ToGB18030(const char* sUnicode, char* sGB18030)
 {
-	int iLen = strlen(sUnicode);
-	wchar_t*	wch = new wchar_t[iLen + 1];
-	int iwl = UTF8ToUTF16(sUnicode, (unsigned short*)wch);
-	BOOL bFail = FALSE;
+    int iLen = strlen(sUnicode);
+    wchar_t*	wch = new wchar_t[iLen + 1];
+    int iwl = UTF8ToUTF16(sUnicode, (unsigned short*)wch);
+    BOOL bFail = FALSE;
     int iRet = WideCharToMultiByte(CP_ACP, 0, wch, iwl, sGB18030, iLen * 2, "?", &bFail);
-	if (iRet < 0)	return -1;
-	sGB18030[iRet] = 0;
-	return iRet;
+    if (iRet < 0)	return -1;
+    sGB18030[iRet] = 0;
+    return iRet;
 }
 
 //UTF16转GB18030,调用单字符函数,转换整个字符串,返回UTF8字符数
 int	SUcs::UTF16ToGB18030(const unsigned short* sUnicode, char* sGB18030)
 {
-	int iwl = wcslen((LPWSTR)sUnicode);
-	BOOL bFail = FALSE;
+    int iwl = wcslen((LPWSTR)sUnicode);
+    BOOL bFail = FALSE;
     int iRet = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)sUnicode, iwl, sGB18030, iwl * 3, "?", &bFail);
-	if (iRet < 0)	return -1;
-	sGB18030[iRet] = 0;
-	return iRet;
+    if (iRet < 0)	return -1;
+    sGB18030[iRet] = 0;
+    return iRet;
 }
 
 #else
 
 //GB18030转UTF8,转换整个字符串,返回UTF8字符数
-int	SUcs::GB18030ToUTF8(const char* sGB18030, char* sUnicode)
+int	SUcs::GB18030ToUTF8(const char* sGB18030, int iGBLen, char* sUnicode)
 {
-    size_t iInLen = strlen(sGB18030);
+    size_t iInLen = iGBLen ? iGBLen : strlen(sGB18030);
     iconv_t cd;
     cd = iconv_open("UTF-8", "GB18030");
     if((iconv_t)-1 == cd)   return -1;
@@ -235,72 +235,44 @@ int	SUcs::GB18030ToUTF8(const char* sGB18030, char* sUnicode)
     char* pOut = sUnicode;
     int iRet = iconv(cd, &pIn, &iInLen, &pOut, &iOutLen);
     iconv_close(cd);
-    if((size_t)-1 == iRet)  return -1;
+    sUnicode[iOutLen] = 0;
+    if(-1 == iRet)  return -1;
     return strlen(sUnicode);
 }
 
 //GB18030转UTF16,转换整个字符串,返回UTF16字符数
-int	SUcs::GB18030ToUTF16(const char* sGB18030, unsigned short* sUnicode)
+int	SUcs::GB18030ToUTF16(const char* sGB18030, int iGBLen, unsigned short* sUnicode)
 {
-    size_t iInLen = strlen(sGB18030);
+    size_t iInLen = iGBLen ? iGBLen : strlen(sGB18030);
     iconv_t cd;
     cd = iconv_open("UTF-16", "GB18030");
     if((iconv_t)-1 == cd)   return -1;
     size_t iOutLen = iInLen + 2;
     char* pIn = (char*)sGB18030;
-    unsigned short* pu16 = new unsigned short[iOutLen];
-    char* pOut = (char*)pu16;
+    char* pOut = (char*)sUnicode;
     int iRet = iconv(cd, &pIn, &iInLen, &pOut, &iOutLen);
     iconv_close(cd);
-    if((size_t)-1 == iRet)
-    {
-        delete pu16;
-        return -1;
-    }
-    for (iOutLen = 0; iOutLen < strlen(sGB18030); iOutLen++)
-    {
-        sUnicode[iOutLen] = pu16[iOutLen + 1];
-        if (pu16[iOutLen + 1] == 0)  break;
-    }
-    delete pu16;
+    if(iRet != 0)  return -1;
     return iOutLen;
 }
 
 //UTF8转GB18030,转换整个字符串,返回UTF8字符数
-int	SUcs::UTF8ToGB18030(const char* sUnicode, char* sGB18030)
+int	SUcs::UTF8ToGB18030(const char* sUnicode, int iUnLen, char* sGB18030)
 {
-    size_t iInLen = strlen(sUnicode);
+    size_t iInLen = iUnLen ? iUnLen : strlen(sUnicode);
     iconv_t cd;
     cd = iconv_open("GB18030", "UTF-8");
     if((iconv_t)-1 == cd)   return -1;
-    size_t iOutLen = iInLen * 2;
+    size_t iOutMax = iInLen * 2;
+    size_t iOutLen = iOutMax;
     char* pIn = (char*)sUnicode;
     char* pOut = sGB18030;
     int iRet = iconv(cd, &pIn, &iInLen, &pOut, &iOutLen);
+    sGB18030[iOutMax - iOutLen] = 0;
     iconv_close(cd);
-    if((size_t)-1 == iRet)  return -1;
+    if(iRet != 0)  return -1;
     return strlen(sGB18030);
 }
 
-//UTF16转GB18030,调用单字符函数,转换整个字符串,返回UTF8字符数
-int	SUcs::UTF16ToGB18030(const unsigned short* sUnicode, char* sGB18030)
-{
-    size_t iUL = 0;
-    unsigned short* pUTemp = (unsigned short*)sUnicode;
-    while (*pUTemp){   pUTemp++;    iUL+=2;}  //get length
-    size_t iOutLen = iUL + 2;
-    char* pIn = (char*)sUnicode;
-    char* pOut = (char*)sGB18030;
-
-    iconv_t cd;
-    cd = iconv_open("GB18030", "UTF-16");
-    if((iconv_t)-1 == cd)   return -1;
-    int iRet = iconv(cd, &pIn, &iUL, &pOut, &iOutLen);
-    iconv_close(cd);
-    if((size_t)-1 == iRet)  return -1;
-    return strlen(sGB18030);
-}
-
-
 #endif
 

+ 3 - 4
DevAdapter/cw/deps/cw.baseio/SUcs.h

@@ -29,12 +29,11 @@ public:
     static	int		UTF8ToUTF16(const char* sUTF8, unsigned short* sUTF16);
 
 	//GB18030转UTF8,转换整个字符串,返回UTF8字符数
-	static	int		GB18030ToUTF8(const char* sGB18030, char* sUnicode);
+	static	int		GB18030ToUTF8(const char* sGB18030, int iGBLen, char* sUnicode);
 	//GB18030转UTF16,转换整个字符串,返回UTF8字符数
-	static	int		GB18030ToUTF16(const char* sGB18030, unsigned short* sUnicode);
+	static	int		GB18030ToUTF16(const char* sGB18030, int iGBLen, unsigned short* sUnicode);
 
-	static	int		UTF8ToGB18030(const char* sUnicode, char* sGB18030);
-	static	int		UTF16ToGB18030(const unsigned short* sUnicode, char* sGB18030);
+	static	int		UTF8ToGB18030(const char* sUnicode, int iUnLen, char* sGB18030);
 protected:
 	
 	//GB18030编码转换成Unicode编码,转换一个汉字,返回GB18030字符数

+ 19 - 0
DevAdapter/cw/deps/cw.baseio/public.cpp

@@ -143,6 +143,25 @@ char* ANSIToHexStr(const unsigned char * sData, int iLen,char*sOut)
     return sOut;
 }
 
+
+//内存数据ANSI码转换成2进制字符串,如字符"A""41"转换成"01000001"
+char* ANSIToBitStr(const unsigned char * sData, int iLen, char*sOut)
+{
+    int iPos, iBit, iLeng = 0;
+    for (iPos = 0; iPos < iLen; iPos++)
+    {
+        for (iBit = 7; iBit >= 0; iBit--)
+        {
+            if ((sData[iPos] & (1 << iBit)) > 0)
+                sOut[iLeng++] = '1';
+            else
+                sOut[iLeng++] = '0';
+        }
+    }
+    sOut[iLeng] = 0;
+    return sOut;
+}
+
 void    ToUpper(char* sIn, int iLen)
 {
     if (iLen <= 0) iLen = strlen(sIn);

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

@@ -53,17 +53,23 @@ ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
         return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "GetDevCategory");
     char sInfo[128];
     int iRet = _fingerDev->GetVersion(sInfo);
+    char szType[] = {"PVER=wellcom#MID=JZT-998"};
+    char szModel[] = "FWID=%s";
+    strcpy(devCategory.szType, szType);
     ErrorCodeEnum errcode =  HandleDevError(iRet, "Reset");
     if (errcode == Error_Succeed) {
-        strcpy(devCategory.szType ,sInfo);
+        char* pSP = strstr(sInfo, "JZT-998");
+        if (pSP)
+            sprintf(devCategory.szModel, szModel, pSP + 7);
+        else
+            sprintf(devCategory.szModel, szModel, sInfo + 8);
         devCategory.eState = DEVICE_STATUS_NORMAL;
     }
     else{
         //"WELLCOM_JZT-998APB-V72_V2.0.1.0_N_R_GA[20201016]
-        strcpy(devCategory.szType , "WELLCOM_JZT-998APB-Get-Error");
+        sprintf(devCategory.szModel, szModel, sInfo + 8);
         devCategory.eState = DEVICE_STATUS_FAULT;
     }
-    strcpy(devCategory.szModel , "FWID=Well0000");
     strcpy(devCategory.szVendor , "cw");
 
     char sPath[256], sFile[128] = {0};

+ 10 - 3
DevAdapter/cw/gpio.1.1/gpioclassimpl.cpp

@@ -67,15 +67,17 @@ ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
 //    int iRet = _fingerDev->GetVersion(sInfo);
 //    ErrorCodeEnum errcode =  HandleDevError(iRet, "Reset");
 
+    char szType[] = {"PVER=cashway#MID=MSI118"};
+    char szModel[] = "FWID=%s";
+    strcpy(devCategory.szType, szType);
     char sSer[256];
     if (m_pDevice->GetFirmware(sSer) == 0)
     {
         sSer[32] = 0;
-        strcpy(devCategory.szType, sSer);
+        sprintf(devCategory.szModel, szModel, sSer);
     }
     else
-        strcpy(devCategory.szType, "GetFirmware error");
-    strcpy(devCategory.szModel, "WID=Cashway001");
+        sprintf(devCategory.szModel, szModel, "00000000");
     strcpy(devCategory.szVendor, "cw");
 
     char sPath[256], sFile[128] = {0};
@@ -220,6 +222,11 @@ ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
     LOG4VTM_FUNCTION();
     if (!m_pDevice->IsOpen())
         return GetErrorInfo(GPIO_NOT_OPEN, "WritePort");
+    char sBitImage[64];
+    int iPos = sprintf(sBitImage, "port = %d Data = ", dwPort);
+    ::ANSIToBitStr(&btData, 1, sBitImage+iPos);
+    LOG4VTM(INFO, sBitImage);
+
     for (int ia=0; ia<8; ia++)
     {
         bool b1 = (btData & (1 << ia)) > 0;

+ 3 - 23
DevAdapter/cw/hspscanner.1.1/CMakeLists.txt

@@ -7,42 +7,22 @@ set(${MODULE_PREFIX}_VENDOR "cw")
 set(${MODULE_PREFIX}_VERSION "1")
 set(${MODULE_PREFIX}_BATCH "1")
 
-if(RVC_INTEGRATE_BUILD)
-	conan_cmake_run( REQUIRES opencv/3.1.0@LR04.02_ThirdParty/stable BASIC_SETUP CMAKE_TARGETS)
-	set(OpenCV_INCLUDE_DIRS ${CONAN_INCLUDE_DIRS_OPENCV})
-	set(OpenCV_LIBS ${CONAN_LIBS_OPENCV})
-else()
-	set(OpenCV_DIR /opt/arm/opencv3.1-static/share/OpenCV)
-	find_package(OpenCV REQUIRED)
-	include_directories(${OpenCV_INCLUDE_DIRS})
-endif(RVC_INTEGRATE_BUILD)
-
-find_package (Qt5 COMPONENTS Core Gui Widgets REQUIRED)
-
 # 包含要编译的实现文件,rvc_dev_config_library 内使用
 set(${MODULE_PREFIX}_SRCS SHARED
-		hspscannerimpl.cpp hspscannerdev.cpp  hspscannerform.cpp
-		hspscannerimpl.h   hspscannerform.h
+		hspscannerimpl.cpp hspscannerdev.cpp
+		hspscannerimpl.h 
 )
 
 # 适配器工程需要通过此宏替代 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} ${OpenCV_INCLUDE_DIRS}  ${VENDOR_CURRENT_DEPS_DIR}/cw.baseio)
-target_link_directories(${MODULE_FULL_NAME} PRIVATE ${CONAN_LIB_DIRS_OPENCV})
+target_include_directories(${MODULE_FULL_NAME} PRIVATE ${VENDOR_CURRENT_INCLUDE_DIR} ${VENDOR_CURRENT_DEPS_DIR}/cw.baseio)
 target_link_libraries(${MODULE_FULL_NAME} baseio ${VENDOR_LOG_LIB_NAME} ${OpenCV_LIBS})
-#target_link_libraries(${MODULE_FULL_NAME} )
 
-#qt5_use_modules(${MODULE_FULL_NAME} Core Gui Widgets)
 
 SET(LIBRARY_OUTPUT_PATH ${VENDOR_CURRENT_LIB_DIR})
 
 #  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
 rvc_dev_target_install(${MODULE_FULL_NAME})
 
-target_link_libraries(${MODULE_FULL_NAME}
-		Qt5::Core
-		Qt5::Gui
-		Qt5::Widgets rt dl
-		)

+ 33 - 0
DevAdapter/cw/hspscanner.1.1/CameraBase.h

@@ -0,0 +1,33 @@
+#ifndef CAMERABASE_H
+#define CAMERABASE_H
+
+#define ERR_NO_DEVICE   -1
+#define ERR_NOT_OPENED  -2
+#define ERR_OPEN_FAIL   -3
+#define ERR_VIEW_FAIL   -4
+
+
+class CameraBase
+{
+public:
+    virtual int     Open(const char* sID) = 0;
+    virtual int     Close() = 0;
+
+    virtual void    SetPos(int iX, int iY, int iW, int iH) = 0;
+    virtual void    SetSize(float dA4[4], float dID[4], int iAll[2]) = 0;
+    virtual int     Preview(bool b) = 0;
+    virtual int     Show(bool b) = 0;
+    virtual int     State() = 0;
+    virtual int     GetPic(const char* sFile) = 0;
+
+    virtual bool    IsOpen(){return true;};
+    virtual void    SetGrey(bool iVal) = 0;
+    virtual void    SetRotate(int iVal) = 0;
+    virtual void    SetScanSz(int iVal) = 0;
+    virtual bool    IsView(){return true;};
+    virtual bool    IsHide(){return true;};
+};
+
+extern "C" CameraBase* GetCamDevice();
+
+#endif // CAMERABASE_H

+ 22 - 0
DevAdapter/cw/hspscanner.1.1/hspscanner.pro

@@ -0,0 +1,22 @@
+QT       -= gui core
+
+TARGET = HSPScanner.cw.1.1
+TEMPLATE = lib
+CONFIG += plugin
+
+DEFINES += QT_DEPRECATED_WARNINGS
+
+SOURCES += \
+    hspscannerimpl.cpp \
+	hspscannerdev.cpp
+
+HEADERS += \
+    hspscannerimpl.h \
+	CameraBase.h
+
+
+INCLUDEPATH += $$(CMB_DIR)/include $$(CMB_DIR)/cw/include
+DESTDIR = $$(CMB_DIR)/cw/lib/$$(SUB_DIR)
+LIBS += -L$$(CMB_DIR)/lib/$$(SUB_DIR) -L$$(CMB_DIR)/cw/lib/$$(SUB_DIR)
+
+LIBS += -lcw.baseio -llog4cplus -llog4vendor

+ 0 - 2
DevAdapter/cw/hspscanner.1.1/hspscannerdev.cpp

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

+ 0 - 256
DevAdapter/cw/hspscanner.1.1/hspscannerform.cpp

@@ -1,256 +0,0 @@
-#include "hspscannerform.h"
-#include "ui_hspscannerform.h"
-
-HSPScannerForm::HSPScannerForm(QWidget *parent) :
-    QWidget(parent),
-    ui(new Ui::HSPScannerForm)
-{
-    ui->setupUi(this);
-
-    Qt::WindowFlags flags = windowFlags();
-    this->setWindowFlags(flags | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
-
-    m_ViewTimer = new QTimer(this);
-    connect(m_ViewTimer, SIGNAL(timeout()),this,SLOT(onCamTimer()));
-
-    m_bIsGrey = false;
-    m_bIsOpen = m_bIsView = false;
-    m_bIsHide = true;
-    m_iRotate = 0;
-    m_iScanSz = 0;
-    m_iCamIdx = -1;
-    SetPos(1080, 0, 384,216);
-    m_dA4Pos[0] = 0.07;
-    m_dA4Pos[1] = 0.07;
-    m_dA4Pos[2] = 0.93;
-    m_dA4Pos[3] = 0.93;
-
-    m_dIDPos[0] = 0.35;
-    m_dIDPos[1] = 0.35;
-    m_dIDPos[2] = 0.65;
-    m_dIDPos[3] = 0.65;
-
-    m_iCamAll[0] = 2560;
-    m_iCamAll[1] = 1440;
-}
-
-HSPScannerForm::~HSPScannerForm()
-{
-    delete ui;
-    delete m_ViewTimer;
-}
-
-void    HSPScannerForm::SetPos(int iX, int iY, int iW, int iH)
-{
-    this->move(iX, iY);
-    ui->labViewPos->move(0, 0);
-    this->resize(iW, iH);
-    ui->labViewPos->resize(iW, iH);
-    ui->labViewPos->setAlignment(Qt::AlignCenter);
-    QPalette label_palette;
-    label_palette.setColor(QPalette::Background, QColor(200, 200, 200));
-    ui->labViewPos->setAutoFillBackground(true);
-    ui->labViewPos->setPalette(label_palette);
-}
-
-void    HSPScannerForm::SetSize(float dA4[4], float dID[4], int iAll[2])
-{
-    memcpy(m_dA4Pos, dA4, sizeof(m_dA4Pos));
-    memcpy(m_dIDPos, dID, sizeof(m_dIDPos));
-    memcpy(m_iCamAll, iAll, sizeof(m_iCamAll));
-}
-
-QImage  HSPScannerForm::Mat2QImage(cv::Mat cvImg)
-{
-    QImage qImg;
-    if(cvImg.channels()==3)                             //3 channels color image
-    {
-        qImg =QImage((const unsigned char*)(cvImg.data),
-                     cvImg.cols, cvImg.rows,
-                     cvImg.cols*cvImg.channels(),
-                     QImage::Format_RGB888);
-    }
-    else if(cvImg.channels()==1)                    //grayscale image
-    {
-        qImg =QImage((const unsigned char*)(cvImg.data),
-                     cvImg.cols,cvImg.rows,
-                     cvImg.cols*cvImg.channels(),
-                     QImage::Format_Indexed8);
-    }
-    else
-    {
-        qImg =QImage((const unsigned char*)(cvImg.data),
-                     cvImg.cols,cvImg.rows,
-                     cvImg.cols*cvImg.channels(),
-                     QImage::Format_RGB888);
-    }
-    return qImg.rgbSwapped();
-}
-
-#include "cmb.h"
-void HSPScannerForm::onCamTimer()
-{
-    cv::Mat mMat1, mMat2;
-
-    LOG4VTM(WARN, "Read Start!");
-    m_cvCamera.read(mMat1);
-    LOG4VTM(WARN, "Read End!");
-    cv::Size size = mMat1.size();
-    if (mMat1.empty())
-    {
-        m_cvCamera.release();
-        m_ViewTimer->stop();
-        m_bIsView = false;
-    }
-    if (m_bIsGrey)
-        cv::cvtColor(mMat1, mMat2, cv::COLOR_RGB2GRAY);
-    else
-        mMat2 = mMat1;
-
-    if (m_iScanSz == 0)
-    {
-        mMat1 = mMat2;
-        m_Capture = mMat1;
-    }
-    if (m_iScanSz == 1)
-    {
-        cv::Rect rA4((int)(size.width * m_dA4Pos[0]), (int)(size.height * m_dA4Pos[1]),
-                (int)(size.width * (m_dA4Pos[2] - m_dA4Pos[0])), (int)(size.height * (m_dA4Pos[3] - m_dA4Pos[1])));
-        mMat1  = cv::Mat(cv::Size(rA4.width, rA4.height), mMat2.type());
-        mMat2(rA4).convertTo(mMat1, mMat1.type(), 1, 0);
-        m_Capture = mMat1;
-    }
-    if (m_iScanSz == 2)
-    {
-        cv::Rect rID((int)(size.width * m_dIDPos[0]), (int)(size.height * m_dIDPos[1]),
-                (int)(size.width * (m_dIDPos[2] - m_dIDPos[0])), (int)(size.height * (m_dIDPos[3] - m_dIDPos[1])));
-
-        m_Capture  = cv::Mat(cv::Size(rID.width, rID.height), mMat2.type());
-        mMat2(rID).convertTo(m_Capture, m_Capture.type(), 1, 0);
-        mMat1 = mMat2;
-        rectangle(mMat1, rID, cv::Scalar(0,255,0));
-    }
-//*
-    if (m_iRotate == 0)
-        mMat2 = mMat1;
-    if (m_iRotate == 1)
-        cv::flip(mMat1.t(), mMat2, 1);
-    if (m_iRotate == 2)
-        cv::flip(mMat1.t(), mMat2, -1);
-    if (m_iRotate == 3)
-        cv::flip(mMat1.t(), mMat2, 0);
-//        cv::rotate(mMat1, mMat2, 0);
-/*/
-    mMat2 = mMat1;
-//*/
-    if (this->isHidden()) return;
-    QImage  image = Mat2QImage(mMat2);
-    QPixmap pixmap = QPixmap::fromImage(image);
-    int iH = height();
-    int iW = ((iH * pixmap.width()) / pixmap.height());
-    QPixmap fiPixmap = pixmap.scaled(iW, iH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-    ui->labViewPos->setPixmap(fiPixmap);
-}
-
-int HSPScannerForm::GetPic(const char* sFile)
-{
-    if (!m_cvCamera.isOpened()) return ERR_NOT_OPENED;
-    if (m_Capture.empty())  return ERR_VIEW_FAIL;
-
-    if (cv::imwrite(sFile, m_Capture)) return 0;
-    return ERR_VIEW_FAIL;
-}
-
-int HSPScannerForm::Open(const char* sID)
-{
-    if (m_cvCamera.isOpened()) return 0;
-    m_iCamIdx = GetCamIndex(sID);
-    if (m_iCamIdx < 0) return ERR_NO_DEVICE;
-    m_cvCamera.open(m_iCamIdx);
-    if (m_cvCamera.isOpened())
-    {
-        m_cvCamera.release();
-        m_bIsOpen = true;
-        return 0;
-    }
-    m_bIsOpen = false;
-    return ERR_OPEN_FAIL;
-}
-
-int HSPScannerForm::Close()
-{
-    if (isVisible())    hide();
-    if (m_cvCamera.isOpened())
-        m_cvCamera.release();
-    m_bIsOpen = false;
-    return 0;
-}
-
-int     HSPScannerForm::Preview(bool b)
-{
-    if (!m_bIsOpen)
-        return ERR_NOT_OPENED;
-    if (b)
-    {
-        if (!m_cvCamera.isOpened())
-            m_cvCamera.open(m_iCamIdx);
-        if (!m_cvCamera.isOpened())
-            return ERR_OPEN_FAIL;
-
-        m_cvCamera.set(CV_CAP_PROP_FRAME_WIDTH, m_iCamAll[0]);
-        m_cvCamera.set(CV_CAP_PROP_FRAME_HEIGHT, m_iCamAll[1]);
-
-        double fps = m_cvCamera.get(CV_CAP_PROP_FPS);
-        if (fps < 10) fps = 10;
-        m_ViewTimer->start(int(1000/fps));
-        m_bIsView = true;
-    }
-    else
-    {
-        m_bIsView = false;
-        m_ViewTimer->stop();
-        m_cvCamera.release();
-    }
-    return 0;
-}
-
-int     HSPScannerForm::Show(bool b)
-{
-    if (!m_bIsOpen)
-        return ERR_NOT_OPENED;
-    m_bIsHide = !b;
-    if (b)
-        this->show();
-    else
-        this->hide();
-    return 0;
-}
-
-int     HSPScannerForm::State()
-{
-    return 0;
-}
-
-bool    HSPScannerForm::GetVideoID(int iIndex, char* sGet)
-{
-    char sTemp[128];
-    sprintf(sTemp, "/sys/class/video4linux/video%d/device/modalias", iIndex);
-    FILE* fp=fopen(sTemp, "r");
-    if (fp == NULL) return false;
-    int iLen = fread(sTemp, 1, 100, fp);
-    sTemp[iLen]=0;
-    fclose(fp);
-    strcpy(sGet, sTemp);
-    return true;
-}
-
-int     HSPScannerForm::GetCamIndex(const char* sIn)
-{
-    char sSys[128];    //usb:v04F2pB61E  d0425dcE
-    for (int ia=0; ia<10; ia++){
-        if (GetVideoID(ia, sSys) == false) return -1;
-        if (memcmp(sIn, sSys, strlen(sIn)) == 0) return ia;
-    }
-    return -1;
-}
-

+ 0 - 71
DevAdapter/cw/hspscanner.1.1/hspscannerform.h

@@ -1,71 +0,0 @@
-#ifndef HSPSCANNERFORM_H
-#define HSPSCANNERFORM_H
-
-#include <opencv2/core/core.hpp>
-#include <opencv2/imgproc/imgproc.hpp>
-#include <opencv2/highgui/highgui.hpp>
-#include <opencv2/imgcodecs/imgcodecs.hpp>
-#include <opencv2/core/mat.hpp>
-#include <opencv2/core/mat.inl.hpp>
-#include <QWidget>
-#include <QTimer>
-
-#define ERR_NO_DEVICE   -1
-#define ERR_NOT_OPENED  -2
-#define ERR_OPEN_FAIL   -3
-#define ERR_VIEW_FAIL   -4
-
-namespace Ui {
-class HSPScannerForm;
-}
-
-class HSPScannerForm : public QWidget
-{
-    Q_OBJECT
-
-public:
-    explicit HSPScannerForm(QWidget *parent = nullptr);
-    ~HSPScannerForm();
-
-    int                 Open(const char* sID);
-    int                 Close();
-
-    void                SetPos(int iX, int iY, int iW, int iH);
-    void                SetSize(float dA4[4], float dID[4], int iAll[2]);
-    int                 Preview(bool b);
-    int                 Show(bool b);
-    int                 State();
-    int                 GetPic(const char* sFile);
-
-    bool                m_bIsGrey;
-    int                 m_iRotate;
-    int                 m_iScanSz;
-
-    bool                m_bIsOpen;
-    bool                m_bIsView;
-    bool                m_bIsHide;
-
-    cv::VideoCapture    m_cvCamera;
-protected:
-    bool                GetVideoID(int iIndex, char* sGet);
-    int                 GetCamIndex(const char* sIn);
-    int                 CameraState();
-
-private:
-    Ui::HSPScannerForm *ui;
-
-    float               m_dA4Pos[4];
-    float               m_dIDPos[4];
-    int                 m_iCamAll[2];
-
-    cv::Mat             m_Capture;
-    int                 m_iCamIdx;
-
-    QImage              Mat2QImage(cv::Mat cvImg);
-    QTimer *            m_ViewTimer;
-public slots:
-    void                onCamTimer();
-
-};
-
-#endif // HSPSCANNERFORM_H

+ 0 - 32
DevAdapter/cw/hspscanner.1.1/hspscannerform.ui

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>HSPScannerForm</class>
- <widget class="QWidget" name="HSPScannerForm">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>886</width>
-    <height>616</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <widget class="QLabel" name="labViewPos">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>891</width>
-     <height>591</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string/>
-   </property>
-  </widget>
- </widget>
- <resources/>
- <connections/>
-</ui>

+ 113 - 64
DevAdapter/cw/hspscanner.1.1/hspscannerimpl.cpp

@@ -1,57 +1,49 @@
 #include "hspscannerimpl.h"
-#include "cmb.h"
+#include "SSocket.h"
 
-
-HSPSThread::HSPSThread()
-    :QThread (0)
-{
-    start();
-}
-
-void HSPSThread::run()
-{
-    exec();
-}
+#define ERR_NO_DEVICE   -1
+#define ERR_NOT_OPENED  -2
+#define ERR_OPEN_FAIL   -3
+#define ERR_VIEW_FAIL   -4
 
 /////////////////////////////////////////////////////////////////////
 
+
 HSPSClassImpl::HSPSClassImpl()
 {
     m_sLibPath[0] = 0;
-    m_CamDevice.moveToThread(&m_HSPSThread);
+    m_bIsOpen = false;
+    HSPSCall = NULL;
 }
 
 HSPSClassImpl::~HSPSClassImpl()
 {
-    m_HSPSThread.exit();
 }
 
 ErrorCodeEnum HSPSClassImpl::DevOpen()
 {
     LOG4VTM_FUNCTION();
-    SIni ini;
-    char sA4[32], sID[32], sAll[32], sUsb[64];
-    //拍照裁剪范围设置
-    if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeA4", sA4, 30) &&
-        ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeID", sID, 30) &&
-        ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "SizeAll", sAll, 30))
-    {
-        float dA4[4], dID[4];
-        int iSize[2];
-        int i1 = sscanf(sA4, "%f,%f,%f,%f", &dA4[0], &dA4[1], &dA4[2], &dA4[3]);
-        int i2 = sscanf(sID, "%f,%f,%f,%f", &dID[0], &dID[1], &dID[2], &dID[3]);
-        int i3 = sscanf(sAll, "%dx%d", &iSize[0], &iSize[1]);
-        if (i1 > 3 && i2 > 3 && i3 > 1)   m_CamDevice.SetSize(dA4, dID, iSize);
-    }
-    //摄像头的pid vid
-    if (!ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "HSPScan", "Camera", sUsb, 30))
+    GetCurLibsPath(m_sLibPath, NULL);
+    char sTemp[400];
+    if (HSPSCall == NULL)
     {
-        strcpy(sUsb, "usb:v04F2pB61E");
+        sprintf(sTemp, "%s/cw/libCmbServConn.cw.so", m_sLibPath);
+        void *hlib = dlopen(sTemp, RTLD_LAZY);        //load so
+        if(hlib == NULL)
+        {
+            printf("dlopen - %sn", dlerror());
+            return GetErrorInfo(ERR_NO_DEVICE, "DevOpen");
+        }
+        HSPSCall = (pHSPSCall)dlsym(hlib, "HSPSCall");
     }
+    Sleep(200);
 
-    GetCurLibsPath(m_sLibPath, NULL);
+    int iRet = 0;
+    if (HSPSCall("H 0 0", 0, iRet) < 0)
+        return GetErrorInfo(ERR_NO_DEVICE, "DevOpen");
 
-    int iRet = m_CamDevice.Open(sUsb);
+    if (iRet == 0)
+        m_bIsOpen = true;
     return GetErrorInfo(iRet, "DevOpen");
 }
 
@@ -82,12 +74,13 @@ int getFileVer(char* sFile, short& ch1, short& ch2)
 ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
 {
     LOG4VTM_FUNCTION();
-    if (!m_CamDevice.m_bIsOpen)
+
+    if (!m_bIsOpen)
         return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
     memset(&devCategory, 0, sizeof(devCategory));
-    strcpy(devCategory.szModel , "FWID=Cam00001");
+    strcpy(devCategory.szModel , "FWID=00000000");
     strcpy(devCategory.szVendor , "cw");
-    strcpy(devCategory.szType ,"00000000");
+    strcpy(devCategory.szType ,"PVER=LHT#MID=5M01");
 
     char sPath[256], sFile[128] = {0};
     GetCurLibsPath(sPath, sFile);
@@ -99,7 +92,8 @@ ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     devCategory.version.wRevision = 0xffff;
     devCategory.version.wBuild = FILE_VERSION;
 
-    if (m_CamDevice.State())
+    int iRet = 0;
+    if (HSPSCall("H 3 0", 0, iRet) == 0 && iRet >= 0)
         devCategory.eState = DEVICE_STATUS_NORMAL;
     else
         devCategory.eState = DEVICE_STATUS_NOT_READY;
@@ -109,7 +103,7 @@ ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
 ErrorCodeEnum HSPSClassImpl::Reset()
 {
     LOG4VTM_FUNCTION();
-    if (!m_CamDevice.m_bIsOpen)
+    if (!m_bIsOpen)
         return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
     int iRet = 0;
     return GetErrorInfo(iRet, "Reset");
@@ -117,7 +111,10 @@ ErrorCodeEnum HSPSClassImpl::Reset()
 ErrorCodeEnum HSPSClassImpl::DevClose()
 {
     LOG4VTM_FUNCTION();
-    m_CamDevice.Close();
+
+    int iRet = 0;
+    HSPSCall("H 0 1", 0, iRet);
+
     Sleep(50);
     return Error_Succeed;
 }
@@ -131,19 +128,27 @@ ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
 ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
 {
     LOG4VTM_FUNCTION();
+    if (!m_bIsOpen)
+        return GetErrorInfo(ERR_NOT_OPENED, "SetParam");
+    char sCmd[32];
     switch(type){
     case HSPS_MODEL_COLOR:
-        m_CamDevice.m_bIsGrey = (value == HSPS_COLOR_GREY);
+        sprintf(sCmd, "H 2 2 %d", (value == HSPS_COLOR_GREY));
         break;
     case HSPS_MODEL_ROTATE:
-        m_CamDevice.m_iRotate = (value - HSPS_ROTATE_NOANGLE);
+        sprintf(sCmd, "H 2 3 %d", value - HSPS_ROTATE_NOANGLE);
         break;
     case HSPS_MODEL_SCANSIZE:
-        m_CamDevice.m_iScanSz = (value - HSPS_SCAN_FULL);
+        sprintf(sCmd, "H 2 4 %d", value - HSPS_SCAN_FULL);
         break;
     case HSPS_MODEL_VIEW:
-        m_CamDevice.Show(value == HSPS_VIEW_SHOW);
+        sprintf(sCmd, "H 2 1 %d", (value == HSPS_VIEW_SHOW));
     }
+
+    int iRet = 0;
+    if (HSPSCall(sCmd, 0, iRet) < 0)
+        return GetErrorInfo(ERR_NOT_OPENED, "SetParam");
+
     return Error_Succeed;
 }
 
@@ -152,15 +157,27 @@ ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
 ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
 {
     LOG4VTM_FUNCTION();
+    Sleep(100);
+    if (!m_bIsOpen)
+        return GetErrorInfo(ERR_NOT_OPENED, "SetPreview not open");
     int iRet = 0;
     if (nValue == 1)
     {
-        iRet = m_CamDevice.Preview(nValue == 1);
-        if (iRet == 0)
-            m_CamDevice.Show(true);
+        //预览,打开摄像头
+        if (HSPSCall("H 2 0 1", 0, iRet) < 0)
+            return GetErrorInfo(ERR_NOT_OPENED, "SetPreview opencam");
+        if (iRet != 0)
+            return GetErrorInfo(ERR_NOT_OPENED, "SetPreview opencam %d", iRet);
+        //显示界面
+        Sleep(2000);
+        HSPSCall("H 2 1 1", 0, iRet);
     }
-    else {
-        iRet = m_CamDevice.Preview(nValue == 1);
+    else
+    {
+        int iOK = HSPSCall("H 2 0 0", 0, iRet);
+        HSPSCall("H 2 1 0", 0, iRet);
+        if (iOK < 0)
+            return GetErrorInfo(ERR_NOT_OPENED, "SetPreview openwin");
     }
     return GetErrorInfo(iRet, "SetPreview");
 }
@@ -171,9 +188,18 @@ ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
 ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
 {
     LOG4VTM_FUNCTION();
-    if (!m_CamDevice.m_bIsView)
+
+    if (!m_bIsOpen)
         return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
-    int iRet = m_CamDevice.GetPic(pszFileName);
+
+    int iRet = 0;
+    if (HSPSCall("H 3 2", 0, iRet) < 0 || iRet != 1)
+        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+
+    char sSend[300];
+    strcpy(sSend, "H 4 ");
+    strcat(sSend, pszFileName);
+    HSPSCall(sSend, 0, iRet);
     return GetErrorInfo(iRet, "ScanImage");
 }
 
@@ -191,33 +217,47 @@ ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
 ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char* pszFileName)
 {
     LOG4VTM_FUNCTION();
-    if (!m_CamDevice.m_bIsView)
-        return GetErrorInfo(ERR_NOT_OPENED, "ScanImageEx");
-    char sFile[300];
+    if (!m_bIsOpen)
+        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+
+    int iRet = 0;
+    if (HSPSCall("H 3 2", 0, iRet) < 0 || iRet != 1)
+        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+
+    char sSend[300];
+    strcpy(sSend, "H 4 ");
     bool bFile = false;
     if (strlen(pszFileName))
     {
-        strcpy(sFile, pszFileName);
+        strcpy(sSend + 4, pszFileName);
         bFile = true;
     }
     else
-        sprintf(sFile, "%s/hsps-temp.jpg", m_sLibPath);
+        sprintf(sSend + 4, "%s/hsps-temp.jpg", m_sLibPath);
+    HSPSCall(sSend, 0, iRet);
 
     ErrorCodeEnum eRet = Error_Succeed;
-    int iRet = m_CamDevice.GetPic(sFile);
-    if (iRet != 0)  return GetErrorInfo(iRet, "ScanImageEx");
-    FILE* fp = fopen(sFile, "rb");
+    if (iRet != 0)
+        return GetErrorInfo(iRet, "ScanImageEx");
+    FILE* fp = fopen(sSend + 4, "rb");
+    if (fp == NULL)
+        return GetErrorInfo(Error_Param, "ScanImageEx");
+
     fseek(fp, 0, SEEK_END);
     int iLen = ftell(fp);
-    if (iLen < nBtLen)
+    if (pBtImg && iLen < nBtLen)
     {
         fseek(fp, 0, SEEK_SET);
         fread(pBtImg, 1, iLen, fp);
+        nBtLen = iLen;
     }
     else
+    {
         eRet = Error_TooSmallBuffer;
+        nBtLen = iLen*1.2;//照片会动态变化,大概率出现下次拍照更大
+    }
     fclose(fp);
-    if (!bFile) remove(sFile);
+    if (!bFile) remove(sSend + 4);
     return eRet;
 }
 
@@ -225,16 +265,25 @@ ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char*
 ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
 {
     LOG4VTM_FUNCTION();
-    m_CamDevice.SetPos(nX, nY, nWidth, nWidth*9/16);
+    int iRet = 0;
+    char sSend[32];
+    sprintf(sSend, "H 1 %d %d %d %d", nX, nY, nWidth, nWidth*9/16);
+    if (HSPSCall(sSend, 0, iRet) < 0)
+        return GetErrorInfo(ERR_NOT_OPENED, "SetViewPos");
+
     return Error_Succeed;
 }
 
 ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status)
 {
     LOG4VTM_FUNCTION();
-    status.isConnected = m_CamDevice.m_bIsOpen;
-    status.inPreview = m_CamDevice.m_bIsView;
-    status.inShow = !m_CamDevice.m_bIsHide;
+    int iRet = 0;
+    if (HSPSCall("H 3 4", 0, iRet) < 0)
+        return GetErrorInfo(ERR_NOT_OPENED, "ScanImage");
+
+    status.isConnected = (iRet & 4) > 0;
+    status.inPreview = (iRet & 2) > 0;
+    status.inShow = (iRet & 1) == 0;
     return Error_Succeed;
 }
 

+ 4 - 14
DevAdapter/cw/hspscanner.1.1/hspscannerimpl.h

@@ -1,20 +1,12 @@
 #ifndef LIBFRAMEWORK_HSPS_IMPL_H
 #define LIBFRAMEWORK_HSPS_IMPL_H
 
-#include <QThread>
 #include "HSPScannerClass.h"
-#include "hspscannerform.h"
+#include "cmb.h"
 
 #define FILE_VERSION    1
 
-//本类的目的只是为了实现一个线程容器,dbus的事件必须和主线程在不同的线程容器里面
-class HSPSThread : public QThread
-{
-    Q_OBJECT
-public:
-    HSPSThread();
-    virtual void run();
-};
+typedef int  (*pHSPSCall)(const char *data, size_t len, int& iRet);
 
 class HSPSClassImpl : public CHSPSClass
 {
@@ -93,13 +85,11 @@ public:
 
 public:
     int         Run();
-
+    pHSPSCall   HSPSCall;
 protected:
     ErrorCodeEnum       GetErrorInfo(int iCode, char* sErr, ...);
     DevErrorInfo        m_DevErrInfo;
-    HSPScannerForm      m_CamDevice;
-    HSPSThread          m_HSPSThread;
-
+    bool                m_bIsOpen;
     char                m_sLibPath[260];
 };
 

+ 0 - 52
DevAdapter/cw/hspscanner.1.1/ui_hspscannerform.h

@@ -1,52 +0,0 @@
-/********************************************************************************
-** Form generated from reading UI file 'hspscannerform.ui'
-**
-** Created by: Qt User Interface Compiler version 5.11.3
-**
-** WARNING! All changes made in this file will be lost when recompiling UI file!
-********************************************************************************/
-
-#ifndef UI_HSPSCANNERFORM_H
-#define UI_HSPSCANNERFORM_H
-
-#include <QtCore/QVariant>
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QLabel>
-#include <QtWidgets/QWidget>
-
-QT_BEGIN_NAMESPACE
-
-class Ui_HSPScannerForm
-{
-public:
-    QLabel *labViewPos;
-
-    void setupUi(QWidget *HSPScannerForm)
-    {
-        if (HSPScannerForm->objectName().isEmpty())
-            HSPScannerForm->setObjectName(QLatin1String("HSPScannerForm"));
-        HSPScannerForm->resize(886, 616);
-        labViewPos = new QLabel(HSPScannerForm);
-        labViewPos->setObjectName(QLatin1String("labViewPos"));
-        labViewPos->setGeometry(QRect(0, 0, 891, 591));
-
-        retranslateUi(HSPScannerForm);
-
-        QMetaObject::connectSlotsByName(HSPScannerForm);
-    } // setupUi
-
-    void retranslateUi(QWidget *HSPScannerForm)
-    {
-        HSPScannerForm->setWindowTitle(QApplication::translate("HSPScannerForm", "Form", nullptr));
-        labViewPos->setText(QString());
-    } // retranslateUi
-
-};
-
-namespace Ui {
-    class HSPScannerForm: public Ui_HSPScannerForm {};
-} // namespace Ui
-
-QT_END_NAMESPACE
-
-#endif // UI_HSPSCANNERFORM_H

+ 1 - 1
DevAdapter/cw/idcer.1.1/CMakeLists.txt

@@ -15,7 +15,7 @@ set(${MODULE_PREFIX}_SRCS SHARED
 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_include_directories(${MODULE_FULL_NAME} PRIVATE ${VENDOR_CURRENT_INCLUDE_DIR} ${VENDOR_CURRENT_DEPS_DIR}/cw.baseio)
 target_link_libraries(${MODULE_FULL_NAME} baseio ${VENDOR_LOG_LIB_NAME})
 SET(LIBRARY_OUTPUT_PATH ${VENDOR_CURRENT_LIB_DIR})
 

+ 10 - 8
DevAdapter/cw/idcer.1.1/idcertimpl.cpp

@@ -69,8 +69,8 @@ ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
     if (!m_bOpen)
         HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
     memset(&devCategory, 0, sizeof(devCategory));
-    strcpy(devCategory.szModel , "FWID=snbcid81#STYLE=IG#FUNCTION=ITF");
     strcpy(devCategory.szVendor , "cw");
+    strcpy(devCategory.szType ,"PVER=SNBC#MID=ID81");
 
     char sPath[256], sFile[128] = {0};
     GetCurLibsPath(sPath, sFile);
@@ -81,22 +81,24 @@ ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
 
     devCategory.version.wRevision = 0xffff;
     devCategory.version.wBuild = FILE_VERSION;
-    char szVer[200] = {0};
-//    SAutoLock lock(&m_MutexLock);
     Sleep(800);
-    int iRt = m_id81Dev->getFWVersion(szVer);       //"Main Firmware:FV1.001.05
+    int iRt = m_id81Dev->getFWVersion(sPath);       //"Main Firmware:FV1.001.05
     if (Error_Succeed == iRt)
     {
-        LOG4VTM(INFO, "GetDevCategory getFWVersion ok");
-        strcpy(devCategory.szType ,szVer);
+        char* pSP = strstr(sPath, "FV");
+        if (pSP)
+            strcpy(sFile, pSP+2);
+        else
+            strcpy(sFile, sPath);
         devCategory.eState = DEVICE_STATUS_NORMAL;
     }
     else
     {
+        strcpy(sFile, "00000000");
         LOG4VTM(INFO, "GetDevCategory getFWVersion error");
-        strcpy(devCategory.szType ,"ID81 get Firmware error");
         devCategory.eState = DEVICE_STATUS_CONNECTING;
     }
+    sprintf(devCategory.szModel , "FWID=%s#STYLE=IG#FUNCTION=ITF", sFile);
     return Error_Succeed;
 }
 
@@ -516,7 +518,7 @@ ErrorCodeEnum IDCertImpl:: ScanIDAndSaveImage()
     sprintf(szIDFront, "%s/idfront.bmp", m_sLibPath);
     sprintf(szIDBack, "%s/idback.bmp", m_sLibPath);
 //    SAutoLock lock(&m_MutexLock);
-    if (m_bReInsert)    Sleep(1000);
+    if (m_bReInsert)    Sleep(1000);//连续测试发热较大
     int iRt = m_id81Dev->DoScan(szIDFront,szIDBack);
     if(CWERR_IDCARD_SUCCESS != iRt)
     {

+ 17 - 6
DevAdapter/cw/pinpad.1.1/pinpadimpl.cpp

@@ -53,12 +53,12 @@ ErrorCodeEnum PinPadImpl::GetDevCategory(DevCategoryInfo &devCategory)
     LOG4VTM_FUNCTION();
     if (!m_bIsOPen)
         return GetErrorInfo(-1, "GetDevCategory");
-    char szType[] = {"Pin Just E6020"};
-    char szModel[] = {"PM=V2.0#MID=100N-BJHY-E42-A01#PID=0000#FWID=00000000"};
+    char szType[] = {"PVER=SUNSON#MID=SNK088A"};
+    char szModel[] = {"PM=V2.0#MID=00000000#PID=00000000#FWID=%s"};
     char szVendor[] = {"cw"};
 
     ErrorCodeEnum err = Error_Succeed;
-    strcpy(devCategory.szModel, szModel);
+    strcpy(devCategory.szType, szType);
     strcpy(devCategory.szVendor, szVendor);
 
     char sPath[256], sFile[128] = {0};
@@ -74,9 +74,17 @@ ErrorCodeEnum PinPadImpl::GetDevCategory(DevCategoryInfo &devCategory)
     int iRet = m_pPinpad->getEppVersion(sTemp);
     iRet = GetErrorInfo(iRet, "GetDevCategory");
     if (iRet == Error_Succeed)
-        strcpy(devCategory.szType, (char*)sTemp); //XZ-H602-F31-V1.03-D015
+    {
+        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");
+    }
     else
-        strcpy(devCategory.szType, "XZ-H602-F31-get-error");
+    {
+        sprintf(devCategory.szModel, szModel, "00000000");
+    }
     switch(iRet){
     case Error_Succeed:
     case Error_Param:
@@ -354,6 +362,8 @@ ErrorCodeEnum PinPadImpl::KeyRead(BYTE &ch)
 
     if (m_bPinMode)
     {
+        if (ch == 0x0d)
+            return GetErrorInfo(JT_TIMEOUT, "KeyRead ch=0d");
         m_iKeyGot++;
         char sLog[256];
         sprintf(sLog, "KeyRead pin mode len =%d key=%d", m_iKeyGot, ch);
@@ -365,7 +375,8 @@ ErrorCodeEnum PinPadImpl::KeyRead(BYTE &ch)
             StartPinInput(m_iPinLen, m_bAutoEnd);
             m_iKeyGot = 0;
         }
-        if (ch == 0x1b || ch == 0x0d || m_iKeyGot >= m_iPinLen)
+        if (ch == 0x1b || //ch == 0x0d ||
+            m_iKeyGot >= m_iPinLen)
         {
             unsigned char sTemp[32];
             m_pPinpad->SetBuzzerEnabled(0x31, sTemp);

+ 24 - 0
DevAdapter/cw/termalprint.1.1/ReceiptBase.cpp

@@ -263,6 +263,18 @@ int		ReceiptBase::PrintLine(const char* sLine)
     return FeedLines(1);
 }
 
+//横向移动
+int	ReceiptBase::MoveX(int iX)
+{
+    if(iX < 0 || iX > 255)
+    {
+        return RECEIPT_ERR_IN_ERR;
+    }
+    unsigned char sCmd[4]={0x1b, 0x5c, (unsigned char)iX, 0};
+    int nRet = SendData(sCmd,4);
+    if (nRet < 0)	return nRet;
+    return RECEIPT_SUCCESS;
+}
 //走纸1点阵
 int ReceiptBase::FeedPaper(short iMode, short iDistance)
 {
@@ -548,6 +560,18 @@ int ReceiptBase::SetLeftDistance(int iLeft)
     return RECEIPT_SUCCESS;
 }
 
+//设置字符间隔,单位为点(0.125mm)
+int	ReceiptBase::SetCharSpace(char iLeft, char iRight)
+{
+    char iWide = (iLeft + iRight) >> 1;
+    unsigned char cmd[]={0x1B, 0x20, iWide};
+    int nRet = SendData(cmd,3,300);
+    if (nRet < 0)	return nRet;
+    unsigned char cmd2[]={0x1C, 0x53, (char)iLeft, (char)iRight};
+    SendData(cmd2,4,300);
+    return RECEIPT_SUCCESS;
+}
+
 //设置打印区域
 int ReceiptBase::SetPrintArea(int iLeng)
 {

+ 6 - 2
DevAdapter/cw/termalprint.1.1/ReceiptBase.h

@@ -94,13 +94,17 @@ public:
     int     SetPrintArea(int iLeng);
     //设置行高,单位为点(0.125mm)
 	int		SetRowDistance(int iH);
-	//DH 倍高 DW倍宽 DD黑体 UL下划线 XT斜体
+    //设置字符间隔,单位为点(0.125mm)
+    int		SetCharSpace(char iLeft, char iRight);
+    //DH 倍高 DW倍宽 DD黑体 UL下划线 XT斜体
 	int 	SetFont(bool bDH, bool bDW, bool bDD, bool bUL, bool bCharB);
 	//nAlign 0左对齐 ,1居中, 2右对齐
 	int		SetAlign(short nAlign);
 	//设置打印放大倍数(1-6)
 	int		SetScale(int iX, int iY);
-	//设置黑白反显打印模式
+    //横向移动
+    int		MoveX(int iX);
+    //设置黑白反显打印模式
 	int		SetInverse(bool b);
 	//选择/取消顺时针旋转90度
 	int		SetRotate(bool b);

+ 29 - 10
DevAdapter/cw/termalprint.1.1/termalprintimpl.cpp

@@ -53,11 +53,13 @@ ErrorCodeEnum ThermalPrintClassImpl::GetDevCategory(DevCategoryInfo &devCategory
         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)
-        strcpy(devCategory.szType, sSVer);
+        sprintf(devCategory.szModel, szModel, sSVer + 1);
     else
-        strcpy(devCategory.szType, "DEVICE_NAME");
-    strcpy(devCategory.szModel, "WID=Cashway001");
+        sprintf(devCategory.szModel, szModel, "00000000");
     strcpy(devCategory.szVendor, "cw");
 
     char cFilePath[300] = {0};
@@ -155,6 +157,9 @@ ErrorCodeEnum ThermalPrintClassImpl::ControlAction(PrintAction eAction, DWORD dw
     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)
     {
@@ -173,9 +178,9 @@ ErrorCodeEnum ThermalPrintClassImpl::ControlAction(PrintAction eAction, DWORD dw
     case ACTION_CUT_HALF:
         iRet = m_pPrint->Cut(1);
         break;
-//    case ACTION_MOVE_TO_POSITION_RELATIVE:    //把打印光标移动相对当前位置一段距离(横向),单位mm
-//        iRet = m_pPrint->(0, dwValue1 * 8);
-//        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;
@@ -196,6 +201,10 @@ ErrorCodeEnum ThermalPrintClassImpl::SetParam(CommandType eType, DWORD dwValue1,
     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)
     {
@@ -226,6 +235,10 @@ ErrorCodeEnum ThermalPrintClassImpl::SetFont(FontStyle eType, DWORD dwValue1, DW
     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)
     {
@@ -243,22 +256,24 @@ ErrorCodeEnum ThermalPrintClassImpl::SetFont(FontStyle eType, DWORD dwValue1, DW
         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->SetLeftDistance(dwValue1);
+        iRet = m_pPrint->SetCharSpace(dwValue1*8 / m_FontParam.iXScale, dwValue2*8 / m_FontParam.iXScale);
         break;
     }
-    return GetErrorInfo(iRet, "SetParam");;
+    return GetErrorInfo(iRet, "SetParam");
 }
 
 //打印文本数据函数
@@ -268,6 +283,11 @@ ErrorCodeEnum ThermalPrintClassImpl::PrintText(BYTE* pData, DWORD dwDataLen)
     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);
@@ -277,8 +297,7 @@ ErrorCodeEnum ThermalPrintClassImpl::PrintText(BYTE* pData, DWORD dwDataLen)
     }
     int iLen = dwDataLen > 0 ? dwDataLen : strlen((char*)pData);
     char* pGB = new char[iLen+1];
-    iLen = SUcs::UTF8ToGB18030((char*)pData, pGB);
-    pGB[iLen] = 0;
+    iLen = SUcs::UTF8ToGB18030((char*)pData, iLen, pGB);
     iRet = m_pPrint->GetState();
     if (iRet < 0)
         GetErrorInfo(iRet, "PrintText");

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

@@ -91,10 +91,12 @@ private:
         bool bold;
         bool bDW;
         bool bDH;
+        int  iXScale;
 
         FontParam()
         {
             bold = bUL = bDW = bDH = false;
+            iXScale = 1;
         }
     };
     FontParam       m_FontParam;

+ 4 - 4
DevAdapter/cw/ups.1.1/deviceconnect.cpp

@@ -37,7 +37,7 @@ int  DeviceConnect::GetStatus(bool& bUps, bool& bLow)
 {
     BYTE Cmd[256] = {0x41, 0x22};
     int iRecv = 0;
-    int iRet = Execute(Cmd, 2, Cmd, &iRecv, 2000);
+    int iRet = Execute(Cmd, 2, Cmd, &iRecv);
     if (iRet != 0)  return iRet;
 
     BYTE bySt = Cmd[3]; //
@@ -52,7 +52,7 @@ int DeviceConnect::ShutDown(int iMinite)
     BYTE Cmd[256] = {0x43, 0xc6, 0, 0};
     Cmd[2] = iMinite % 256;
     Cmd[3] = iMinite / 256;
-    int iRet = Execute(Cmd, 4, 2000);
+    int iRet = Execute(Cmd, 4);
     if (iRet != 0)  return iRet;
     return 0;
 }
@@ -63,7 +63,7 @@ int DeviceConnect::ReStart(int iMinite)
     BYTE Cmd[256] = {0x43, 0xc7, 0, 0x00};
     Cmd[2] = iMinite % 256;
     Cmd[3] = iMinite / 256;
-    int iRet = Execute(Cmd, 4, 2000);
+    int iRet = Execute(Cmd, 4);
     if (iRet != 0)  return iRet;
     return 0;
 }
@@ -73,7 +73,7 @@ int DeviceConnect::GetVersion(char* strVersion)
 {
     BYTE Cmd[256] = {0x41, 0x1E};
     int iRecv = 0;
-    int iRet = Execute(Cmd, 2, Cmd, &iRecv, 2000);
+    int iRet = Execute(Cmd, 2, Cmd, &iRecv);
     if (iRet != 0)  return iRet;
     strcpy(strVersion, (const char*)Cmd + 3);
     strVersion[iRecv - 4] = 0;

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

@@ -31,8 +31,8 @@ public:
 protected:
     SSerial*    m_pSerial;
     BYTE    CalBcc(BYTE* pData, BYTE iCount);
-    int     Execute(BYTE* pData, int iLength, BYTE* pOut, int* pOutLen, int iTimeOut);
-    int     Execute(BYTE* pData, int iLength, int iTimeOut);
+    int     Execute(BYTE* pData, int iLength, BYTE* pOut, int* pOutLen, int iTimeOut = 200);
+    int     Execute(BYTE* pData, int iLength, int iTimeOut = 200);
 
 };
 

+ 10 - 4
DevAdapter/cw/ups.1.1/upsimpl.cpp

@@ -61,15 +61,17 @@ ErrorCodeEnum UpsClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
 //    int iRet = _fingerDev->GetVersion(sInfo);
 //    ErrorCodeEnum errcode =  HandleDevError(iRet, "Reset");
 
+    char szType[] = {"PVER=goldpower#MID=GPAD301"};
+    char szModel[] = "FWID=%s";
+    strcpy(devCategory.szType, szType);
     char sSer[256]="11111111";
     if (m_pDevice->GetVersion(sSer) == 0)
     {
         sSer[32] = 0;
-        strcpy(devCategory.szType, sSer);
+        sprintf(devCategory.szModel, szModel, sSer);
     }
     else
-        strcpy(devCategory.szType, "GetFirmware error");
-    strcpy(devCategory.szModel, "WID=Cashway001");
+        sprintf(devCategory.szModel, szModel, "00000000");
     strcpy(devCategory.szVendor, "cw");
 
     char sPath[256], sFile[128] = {0};
@@ -129,10 +131,14 @@ ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime, DWORD dwRestartTime)
     LOG4VTM_FUNCTION();
     if (!m_pDevice->IsOpen())
         return GetErrorInfo(UPS_NOT_OPEN, "Shutdown");
+    if (dwShutTime < 1)
+    {
+        dwShutTime = 1;
+    }
     int iRet = m_pDevice->ShutDown(dwShutTime);
     if (iRet != 0)
         return GetErrorInfo(iRet, "Shutdown");
-    iRet = m_pDevice->ReStart(dwRestartTime);
+    iRet = m_pDevice->ReStart(dwShutTime + dwRestartTime);
     return GetErrorInfo(iRet, "Shutdown ReStart");;
 }
 

+ 1 - 1
DevAdapter/cw/watchdog.1.1/CMakeLists.txt

@@ -16,7 +16,7 @@ set(${MODULE_PREFIX}_SRCS SHARED
 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_include_directories(${MODULE_FULL_NAME} PRIVATE ${VENDOR_CURRENT_INCLUDE_DIR} ${VENDOR_CURRENT_DEPS_DIR}/cw.baseio)
 target_link_libraries(${MODULE_FULL_NAME} baseio ${VENDOR_LOG_LIB_NAME})
 
 SET(LIBRARY_OUTPUT_PATH ${VENDOR_CURRENT_LIB_DIR})

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

@@ -7,6 +7,7 @@ WatchDogClassImpl::WatchDogClassImpl()
     m_hThreadID = 0;
     m_iStartTime = 0;
     m_bIsOpen = false;
+    m_iRebootTime = 0;
 }
 
 WatchDogClassImpl::~WatchDogClassImpl()
@@ -44,8 +45,10 @@ ErrorCodeEnum WatchDogClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     if (!m_bIsOpen)
         return GetErrorInfo(-1, "GetDevCategory");
     ErrorCodeEnum err = Error_Succeed;
-    strcpy(devCategory.szType, "soft WatchDogClass");
-    strcpy(devCategory.szModel, "WID=Cashway001");
+    char szType[] = {"PVER=cashway#MID=softdog"};
+    char szModel[] = "FWID=00000000";
+    strcpy(devCategory.szType, szType);
+    strcpy(devCategory.szModel, szModel);
     strcpy(devCategory.szVendor, "cw");
 
     char sPath[256], sFile[128] = {0};
@@ -180,7 +183,7 @@ void*	WatchDogClassImpl::ThreadRun()
         Sleep(500);
         time(&tNow);
         if (!m_bIsOpen || m_iStartTime < 1 || tNow < m_iStartTime)   continue;   //监控未开始
-        if (tNow <= m_iRebootTime)   continue;   //监控未开始
+        if (m_iRebootTime && tNow <= m_iRebootTime)   continue;   //监控未开始
         char sTemp[256];
         sprintf(sTemp, "WatchDogClassImpl timeout");
         LOG4VTM(INFO, sTemp);
@@ -199,6 +202,7 @@ ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
     time(&tNow);
     m_iStartTime = tNow + dwDelay;
     m_iTimeout = dwTimeout + 1;
+    m_iRebootTime = m_iStartTime + m_iTimeout;
     return Error_Succeed;
 }
 
@@ -208,6 +212,7 @@ ErrorCodeEnum WatchDogClassImpl::StopWatch()
     if (!m_bIsOpen)
         return GetErrorInfo(-1, "StopWatch");
     m_iStartTime = 0;
+    m_iRebootTime = 0;
     return Error_Succeed;
 }