Browse Source

#IQRV #comment [GPIO] GPIO 改造

gifur 2 years ago
parent
commit
336126b52e

+ 13 - 0
DevAdapter/cmbsz/gpio.1.2/CMakeLists.txt

@@ -0,0 +1,13 @@
+rvc_dev_define_module("Gpio")
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "2")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        gpio_impl.cpp
+        )
+
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 145 - 0
DevAdapter/cmbsz/gpio.1.2/gpio_impl.cpp

@@ -0,0 +1,145 @@
+#include "gpio_impl.h"
+#include<cstring>
+#include <cstdio>
+GPIOClassImpl::GPIOClassImpl()
+        :m_mode(0)
+{
+
+}
+
+GPIOClassImpl::~GPIOClassImpl()
+{
+
+}
+
+ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+
+    ErrorCodeEnum err = Error_Succeed;
+    std::strcpy(devCategory.szModel, "szModel");
+    //新接口版本标记
+    std::strcpy(devCategory.szType, "szType#FUNCVER=2.0");
+    std::strcpy(devCategory.szVendor, "szVendor");
+    return err;
+}
+
+ErrorCodeEnum GPIOClassImpl::Reset()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    m_mode = 0;
+    return err;
+}
+
+
+ErrorCodeEnum GPIOClassImpl::DevClose()
+{
+    ErrorCodeEnum err = Error_Succeed;
+    return err;
+}
+
+
+
+ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    static int times = 0;
+    char szMessage[128];
+    sprintf(szMessage, "这是第 %d 条错误信息", ++times);
+    strcpy(devErrInfo.szErrMsg, szMessage);
+    devErrInfo.dwErrMsgLen = strlen(szMessage);
+    return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::SetStatus(DWORD dwReq, DWORD dwMode)
+{
+    ErrorCodeEnum ec = Error_Succeed;
+
+    if ((dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN) && (dwMode & GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER)) {
+        return Error_Param;
+    }
+    if ((dwMode & GPIO_DEV_LIGHT_MODE_COLOR_NORMAL) && (dwMode & GPIO_DEV_LIGHT_MODE_COLOR_FAULT)) {
+        return Error_Param;
+    }
+
+    switch (dwReq) {
+    case GPIO_DEV_SN_LIGHT_CARDISSUER:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_IDCERTIFICATE:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_PINPAD:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_FACE:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_CONTACTLESSCARD:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_FINGERPRINT:
+        //....
+        break;
+    case GPIO_DEV_SN_LIGHT_SENSOR_ALL: 
+    {
+        if (dwMode == GPIO_DEV_LIGHT_MODE_RESET) {
+            //熄灭当前的所有灯
+        }
+    }
+        break;
+    default:
+        ec = Error_NotSupport;
+        break;
+    }
+    return ec;
+}
+
+ErrorCodeEnum GPIOClassImpl::DetectStatus(DWORD dwReq, DWORD& dwMode)
+{
+    ErrorCodeEnum ec = Error_Succeed;
+    dwMode = 0;
+
+    if (dwReq & GPIO_DEV_SN_SENSOR_SHAKE) {
+        //检测是否震动,如果震动,则对应的位置为1
+        dwMode |= GPIO_DEV_SN_SENSOR_SHAKE;
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_DOOR) {
+        // 检测是否开机柜门,没开则置为0
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_PHONE) {
+        //检测是否提机,如果提机,则对应的位置为1
+        dwMode |= GPIO_DEV_SN_SENSOR_PHONE;
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_HUMAN_DETECT) {
+        //......
+    }
+    if (dwReq & GPIO_DEV_SN_SENSOR_CARD_MOUTH) {
+        //......
+    }
+    return ec;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new GPIOClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(GPIOClassImpl* pTmp = dynamic_cast<GPIOClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 62 - 0
DevAdapter/cmbsz/gpio.1.2/gpio_impl.h

@@ -0,0 +1,62 @@
+#ifndef LIBFRAMEWORK_GPIO_IMPL_H
+#define LIBFRAMEWORK_GPIO_IMPL_H
+
+#include "GpioClass.h"
+
+class GPIOClassImpl : public GpioClass
+{
+public:
+    GPIOClassImpl();
+    ~GPIOClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Device initialization.
+    //	Configure port input/output direction.
+    //
+    virtual ErrorCodeEnum DevOpen(GpioInitParam initParam)
+    {
+        ErrorCodeEnum err = Error_Succeed;
+        return err;
+    }
+
+    //
+    //	Set ports output.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btData:output value
+    //	  bit value 1/0 means voltage high or low
+    //	  ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
+    //
+    virtual ErrorCodeEnum WritePort(DWORD dwPort, BYTE btData)
+    {
+        return Error_Succeed;
+    }
+    //
+    //	Get port input.
+    //	Arguments:
+    //	- dwPort:port serial number,0~MAX_PORT_NUM-1
+    //	- btStatus:input value
+    //	  ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
+    //
+    virtual ErrorCodeEnum ReadPort(DWORD dwPort, BYTE& btStatus)
+    {
+        return Error_NotImpl;
+    }
+
+    ErrorCodeEnum SetStatus(DWORD dwReq, DWORD dwMode);
+
+    ErrorCodeEnum DetectStatus(DWORD dwReq, DWORD& dwMode);
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_GPIO_IMPL_H

+ 71 - 6
DevAdapter/include/GpioClass.h

@@ -29,13 +29,45 @@ struct GpioInitParam
 							//port 0 = pin 1~8,port 1 = pin 9~16 ...
 };
 
+
+//硬件模块序号,对应规格文档
+#define GPIO_DEV_SN_LIGHT_SENSOR_ALL ((DWORD)(-1)) //全体指示灯,用于启动时重置所有的灯
+
+#define GPIO_DEV_SN_LIGHT_CARDISSUER 1 //读卡发卡器提示灯
+#define GPIO_DEV_SN_LIGHT_IDCERTIFICATE 3 //身份证阅读器提示灯
+#define GPIO_DEV_SN_LIGHT_PINPAD 4 //密码键盘提示灯
+#define GPIO_DEV_SN_LIGHT_FACE 5 //脸部照明灯
+#define GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN 7 //读卡发卡器维护提示灯
+#define GPIO_DEV_SN_LIGHT_CONTACTLESSCARD 9 //非接IC读卡器提示灯
+#define GPIO_DEV_SN_LIGHT_FINGERPRINT 11 //指纹仪提示灯
+
+#define GPIO_DEV_SN_SENSOR_SHAKE 1                              //震动探测器
+#define GPIO_DEV_SN_SENSOR_DOOR (1 << 1)                   //机具门感应
+#define GPIO_DEV_SN_SENSOR_PHONE (1 << 2)                 //话机提机感应
+#define GPIO_DEV_SN_SENSOR_HUMAN_DETECT (1 << 3)  //人体探测感应
+#define GPIO_DEV_SN_SENSOR_CARD_MOUTH (1 << 4)     //发卡器卡嘴覆盖探测
+
+//模块灯属性
+#define GPIO_DEV_LIGHT_MODE_RESET 0 //熄灭灯
+//灯亮模式
+#define GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN 0x1 //常亮
+#define GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER 0x2 //闪烁
+//灯颜色
+#define GPIO_DEV_LIGHT_MODE_COLOR_NORMAL 0x4 //常规颜色
+#define GPIO_DEV_LIGHT_MODE_COLOR_FAULT 0x8 //故障状态的颜色,一般为红色
+
+// 驱动状态
+#define GPIO_DEV_SENSOR_MODE_HIGHT_LEVEL 0x1
+
 class GpioClass : public DeviceBaseClass
 {
 public:
-	//
-	//	Device initialization.
-	//	Configure port input/output direction.
-	//
+	/// <summary>
+	/// Device initialization.
+	/// Configure port input/output direction.
+	/// </summary>
+	/// <param name="initParam"></param>
+	/// <returns></returns>
 	virtual ErrorCodeEnum DevOpen(GpioInitParam initParam) = 0;
 
 	//
@@ -46,7 +78,7 @@ public:
 	//	  bit value 1/0 means voltage high or low
 	//	  ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
 	//
-	virtual ErrorCodeEnum WritePort(DWORD dwPort,BYTE btData) = 0;
+	virtual ErrorCodeEnum WritePort(DWORD dwPort,BYTE btData) { return Error_NotImpl; }
 	//
 	//	Get port input.
 	//	Arguments:
@@ -54,6 +86,39 @@ public:
 	//	- btStatus:input value
 	//	  ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
 	//
-	virtual ErrorCodeEnum ReadPort(DWORD dwPort,BYTE &btStatus) = 0;
+	virtual ErrorCodeEnum ReadPort(DWORD dwPort,BYTE &btStatus) { return Error_NotImpl; }
+
+	/// <summary>
+	/// 打开指定模块的提示灯
+	/// </summary>
+	/// <param name="dwReq">
+	/// 硬件灯模块序号,见上方定义GPIO_DEV_SN_*,或参考规格说明文档,只会传送模式为”驱动“的序号之一
+	/// 只会设置灯,如果是其他值则返回 Error_NotSupport
+	/// </param>
+	/// <param name="dwMode">
+	/// 入参,指定灯的属性如常亮还是闪烁,是普通灯颜色还是故障灯颜色
+	/// 不同属性可以通过与的方式合并传入,如灯颜色和亮灯模式,同一属性只会传入其中一个值,比如灯常亮和闪烁只会传入其中之一
+	/// 具体值表示的内容参考上方定义的内容 GPIO_DEV_LIGHT_MODE_*
+	/// </param>
+	/// <returns>
+	///  参数有误或设置失败返回对应的报错
+	/// </returns>
+	virtual ErrorCodeEnum SetStatus(DWORD dwReq, DWORD dwMode) { return Error_NotImpl; }
+
+	/// <summary>
+	/// 获取探测器的状态
+	/// </summary>
+	/// <param name="dwReq">
+	/// 感应模块序号,见上方定义GPIO_DEV_SN_*,或参考规格说明文档,只会传送模式为”接收“的序号
+	/// 这个可能是与的关系,即有可能会一个调用同时获取多个模块的状态
+	/// </param>
+	/// <param name="dwMode">
+	/// 对应模块(有震动、开门、摘机、有人靠近)对应的位,如果是高电平置为1,如果低电平则置为0
+	/// </param>
+	/// <returns>
+	/// 无法获取状态则返回报错
+	/// </returns>
+	virtual ErrorCodeEnum DetectStatus(DWORD dwReq, DWORD& dwMode) { return Error_NotImpl; }
+
 };
 #endif //__GPIO_CLASS_H

+ 0 - 10
Module/include/EventCode.h

@@ -5,7 +5,6 @@ enum LightSeq{
 	UNKNOWN_DEVICE,
 	CARDREADER,
 	CARDREADER_RED,
-	PRINTER,
 	IDCERTIFICATE,
 	PINPAD,
 	PINPADLIGHT,
@@ -17,11 +16,8 @@ enum LightSeq{
 	HEADLIGHT,
 	HEADLIGHT_RED,
 	CONTACTLESSCARD,
-	USBCONTROL,
-	USBLIGHT,
 	HEADLIGHT_ASSIST,
 	HSPSCANNER,
-	PRINTER_SEAL,
 	FINGERPRINT
 };
 //设备类型枚举
@@ -627,12 +623,6 @@ ERROR_ACCESSAUTH_CONNECT_ACS_x}
 #define LOG_WARN_CONTACTLESS_CARD_FORGET_FETCH		(ContactlessCard_Public_Start + 4)
 #define LOG_ERR_CONTACTLESS_CARD_FAILED				(ContactlessCard_Public_Start + 5)
 
-#define LOG_EVT_USB_CONTROL_ON 0x21400001
-#define LOG_EVT_USB_CONTROL_OFF 0x21400002
-#define LOG_EVT_USB_CONTROL_OP 0x21400003
-#define LOG_EVT_USB_LIGHT_ON 0x21400004
-#define LOG_EVT_USB_LIGHT_OFF 0x21400005
-//#define LOG_DEVICECONTROL_BROWSER_CACHE_CLEAER 0x21400006
 #define LOG_DEVICECONTROL_SOGOU_SCRIPTS_NOT_EXISTS 0x21400007
 #define LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_SUCC 0x21400008
 #define LOG_DEVICECONTROL_SOGOU_SCRIPTS_EXECUTE_FAILED 0x21400009

+ 2 - 177
Module/mod_DeviceControl/DeviceControlFSM.cpp

@@ -13,41 +13,6 @@ static const char DEFAULT_ADAPTER_LIBRARY_NAME[] = "DeviceControl.cmbsz.1.1.dll"
 static const char DEFAULT_ADAPTER_LIBRARY_NAME[] = "libDeviceControl.cmbsz.1.1.so";
 #endif //RVC_OS_WIN
 
-namespace
-{
-/*
-PAD, Desk2S1.0: false
-* Stand2S, CardStore, Desk2S.2.0, Desk2S.2.1, Desk1S.1.0: true
-*/
-bool IsNeedOpenUsb(CEntityBase* pCallerEntity)
-{
-    bool result = false;
-    ErrorCodeEnum errCode = Error_Unexpect;
-    CSystemStaticInfo sysDevInfo;
-    errCode = pCallerEntity->GetFunction()->GetSystemStaticInfo(sysDevInfo);
-    CSimpleStringA strMachineType;
-    strMachineType = sysDevInfo.strMachineType;
-    WORD majorVersion = sysDevInfo.MachineVersion.GetMajor();
-    WORD minorVersion = sysDevInfo.MachineVersion.GetMinor();
-    CSimpleStringA machineVersion = CSimpleStringA::Format("%d.%d", majorVersion, minorVersion);
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("MachineType:%s, machineVersion:%s", strMachineType.GetData(), machineVersion.GetData());
-
-    if (!strMachineType.Compare("RVC.PAD", true)
-        || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("1.0"))
-        || !strMachineType.Compare("RVC.Stand1SPlus", true)) {
-        result = false;
-    } else if (!strMachineType.Compare("RVC.Stand2S", true) || !strMachineType.Compare("RVC.CardStore", true)
-               || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("2.0"))
-               || (!strMachineType.Compare("RVC.Desk2S", true) && !machineVersion.Compare("2.1"))) {
-        result = true;
-    } else {
-        //TODO:: if add new machine type
-        result = true;
-    }
-    return result;
-}
-}
-
 ErrorCodeEnum CDeviceControlFSM::OnInit()
 {
     LOG_FUNCTION();
@@ -377,11 +342,6 @@ unsigned int CDeviceControlFSM::s0_on_event(FSMEvent* pEvt)
         task->ctx = ue->ctx;
         GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
         pEvt->SetHandled();
-#if defined(RVC_OS_WIN)
-        m_bWorkingOp = true;
-        WorkingOpTask* pOp = new WorkingOpTask(this);
-        GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
-#endif //RVC_OS_WIN
         return 0;
     }
     case USER_EVT_INIT_TOKEN:
@@ -391,11 +351,6 @@ unsigned int CDeviceControlFSM::s0_on_event(FSMEvent* pEvt)
         task->ctx = ue->ctx;
         GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
         pEvt->SetHandled();
-#if defined(RVC_OS_WIN)
-        m_bWorkingOp = true;
-        WorkingOpTask* pOp = new WorkingOpTask(this);
-        GetEntityBase()->GetFunction()->PostThreadPoolTask(pOp);
-#endif //RVC_OS_WIN
         return 0;
     }
     default:
@@ -447,55 +402,13 @@ unsigned int CDeviceControlFSM::s4_on_event(FSMEvent* pEvt)
 }
 int CDeviceControlFSM::UsbControl(SpReqAnsContext<DeviceControlService_USB_Req, DeviceControlService_USB_Ans>::Pointer ctx)
 {
-    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("open %d", ctx->Req.open);
-    if (IsNeedOpenUsb(m_pEntity)) {
-        ControlType eType;
-        if (ctx->Req.open) {
-            eType = USB_PORT_ENABLE;
-            LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_ON, "usb on");//control by gpio
-            LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_ON, "usb on");//control by gpio
-        } else {
-            eType = USB_PORT_DISABLE;
-            LogEvent(Severity_Middle, LOG_EVT_USB_CONTROL_OFF, "usb off");//control by gpio
-            LogEvent(Severity_Middle, LOG_EVT_USB_LIGHT_OFF, "usb off");//control by gpio
-        }
-    } else {
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no need open/close usb, this machine's usb is always open.");
-    }
-    ctx->Answer(Error_Succeed);
-    return 0;
+    ctx->Answer(Error_NotSupport);
 }
 
 int CDeviceControlFSM::GetUkeyIDx(SpReqAnsContext<DeviceControlService_GetUkeyID_Req, DeviceControlService_GetUkeyID_Ans>::Pointer ctx)
 {
-    LOG_FUNCTION();
-    if (ctx == NULL) {
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ctx is null.");
-        return 1;
-    }
-#if defined(RVC_OS_WIN)
-    char pID[512];
-    ZeroMemory(pID, 512);
-    int tmp = 512;
-    int ret = AQGetUKeyID(pID, tmp);
-    m_bWorkingOp = false;
-    if (ret == 0) {
-        ctx->Ans.UkeyID = pID;
-        ctx->Ans.UkeyIDLen = strlen(pID);
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest ukey id [%d][%s][%d]", tmp, (LPCTSTR)ctx->Ans.UkeyID, ctx->Ans.UkeyIDLen);
-        ctx->Ans.reserved1 = 999;
-        ctx->Answer(Error_Succeed);
-        return 0;
-    } else {
-        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetUKey failed.%d,%d", ret, GetLastError());
-        ctx->Ans.reserved1 = ret;
-        ctx->Answer(Error_Succeed);
-        return 1;
-    }
-#else
     ctx->Answer(Error_NotSupport);
     return 1;
-#endif //RVC_OS_WIN
 }
 int CDeviceControlFSM::InitTokenx(SpReqAnsContext<DeviceControlService_InitToken_Req, DeviceControlService_InitToken_Ans>::Pointer ctx)
 {
@@ -504,101 +417,13 @@ int CDeviceControlFSM::InitTokenx(SpReqAnsContext<DeviceControlService_InitToken
         DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ctx is null.");
         return 1;
     }
-#if defined(RVC_OS_WIN)
-    int tokensnlen, pkcs10len, msglen;
-    tokensnlen = 32;
-    pkcs10len = 2048;
-    msglen = 128;
-    char tokenSn[32], pkcs10[2048], msg[128];
-    ZeroMemory(tokenSn, tokensnlen);
-    ZeroMemory(pkcs10, pkcs10len);
-    ZeroMemory(msg, msglen);
-
-    int ret = AQInitToken(const_cast<char*>(ctx->Req.CertType.GetData())
-                          , ctx->Ans.TokenType, const_cast<char*>(ctx->Req.OldSuperPwd.GetData())
-                          , const_cast<char*>(ctx->Req.UserName.GetData())
-                          , const_cast<char*>(ctx->Req.UserIDType.GetData())
-                          , const_cast<char*>(ctx->Req.UserIDNo.GetData())
-                          , tokenSn
-                          , tokensnlen, pkcs10, pkcs10len, msg, msglen);
-    m_bWorkingOp = false;
-    if (ret == 0) {
-        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[%d][%s][%d][%s][%d]", tokensnlen, tokenSn, msglen, msg, pkcs10len);
-        char xx1[768], xx2[768];
-        ZeroMemory(xx1, 768);
-        ZeroMemory(xx2, 768);
-        if (pkcs10len > 600) {
-            strncpy(xx1, pkcs10, 600);
-            strncpy(xx2, pkcs10 + 600, pkcs10len - 600 + 1);
-        } else
-            strncpy(xx1, pkcs10, pkcs10len);
-
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]", xx1);
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("[%s]", xx2);
-        ctx->Ans.TokenSn = tokenSn;
-        ctx->Ans.PKCS10 = pkcs10;
-        ctx->Ans.Msg = msg;
-        ctx->Ans.TokenSnLen = tokensnlen;
-        ctx->Ans.PKCS10Len = pkcs10len;
-        ctx->Ans.MsgLen = msglen;
-        ctx->Ans.reserved1 = 999;
-        ctx->Answer(Error_Succeed);
-        return 0;
-    } else {
-        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InitToken failed.%d,%d", ret, GetLastError());
-        ctx->Ans.reserved1 = ret;
-        ctx->Answer(Error_Succeed);
-        return 1;
-    }
-#else
     ctx->Answer(Error_NotSupport);
     return 1;
-#endif //RVC_OS_WIN
-
 }
 int CDeviceControlFSM::QueryUSB(SpReqAnsContext<DeviceControlService_QueryUSBStatus_Req
     , DeviceControlService_QueryUSBStatus_Ans>::Pointer ctx)
 {
-    ErrorCodeEnum eErr = Error_Unexpect;
-    GpioService_ClientBase* pGpio = new GpioService_ClientBase(this->GetEntityBase());
-    if (pGpio != NULL) {
-        eErr = pGpio->Connect();
-        if (eErr != Error_Succeed) {
-            DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to gpio failed.");
-            pGpio->SafeDelete();
-            pGpio = NULL;
-            ctx->Answer(eErr);
-            return 0;
-        }
-        GpioService_QueryCurrSet_Req req;
-        GpioService_QueryCurrSet_Ans ans;
-        eErr = pGpio->QueryCurrSet(req, ans, 10000);
-        if (eErr == Error_Succeed) {
-            ctx->Ans.flag = ((ans.output & 0x2) == 0x2);
-            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,%d", ans.output, ctx->Ans.flag);
-            ctx->Answer(Error_Succeed);
-        } else {
-            DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Query usb failed: %s", SpStrError(eErr));
-            ctx->Answer(eErr);
-        }
-        pGpio->GetFunction()->CloseSession();
-    }
-    return 0;
-}
-/** 5s per times and quit after 100 times*/
-void CDeviceControlFSM::WorkingOp()
-{
-    int count = 0;
-    while (m_bWorkingOp) {
-        //relate with eventconvert
-        LogEvent(Severity_Low, LOG_EVT_USB_CONTROL_OP, "ukey op.");
-        Sleep(5000);
-        count++;
-        if (count > 100) {
-            m_bWorkingOp = false;
-            break;
-        }
-    }
+    ctx->Answer(Error_NotSupport);
 }
 
 

+ 0 - 13
Module/mod_DeviceControl/DeviceControlFSM.h

@@ -13,10 +13,7 @@
 
 #include "Interface.h"
 
-#include "Gpio_client_g.h"
-
 using namespace DeviceControl;
-using namespace Gpio;
 
 typedef int  (__stdcall *lpInitToken)(char* pszCertType,int& nTokenType,char* pszOldSuperPwd,char* pszUserName,char* pszUserIDType,\
 	char* pszUserIDNo,char* pszTokenSn, int& nTokenSn,char* pszPKCS10,  int& nPKCS10,char* pszMsg,     int& nMsg);
@@ -145,7 +142,6 @@ public:
 	int GetUkeyIDx(SpReqAnsContext<DeviceControlService_GetUkeyID_Req, DeviceControlService_GetUkeyID_Ans>::Pointer ctx);
 	int InitTokenx(SpReqAnsContext<DeviceControlService_InitToken_Req, DeviceControlService_InitToken_Ans>::Pointer ctx);
 	int QueryUSB(SpReqAnsContext<DeviceControlService_QueryUSBStatus_Req,DeviceControlService_QueryUSBStatus_Ans>::Pointer ctx);
-	void WorkingOp();
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		pTransactionContext->SendAnswer(Error_Succeed);
@@ -217,14 +213,5 @@ struct InitTokenTask : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
-struct WorkingOpTask : public ITaskSp
-{
-	CDeviceControlFSM* fsm;
-	WorkingOpTask(CDeviceControlFSM* f) : fsm(f) {}
 
-	void Process()
-	{
-		fsm->WorkingOp();
-	}
-};
 #endif //_DEVICE_CONTROL_FSM_H

+ 180 - 201
Module/mod_gpio/mod_gpio.cpp

@@ -19,13 +19,6 @@ int negative_level_count = 0;
 
 using namespace SP::Module::Comm;
 
-bool DetectBit(ULONG data, int pos)
-{
-    ULONG tmp = 0;
-    SETBIT(tmp, pos);
-    return data & tmp;
-}
-
 static const char* GetDriverPortString(int pin)
 {
     switch (pin) {
@@ -86,10 +79,8 @@ static const char* GetLightSeqString(int seq)
     LIGHT_STRING_CONVERT(UNKNOWN_DEVICE)
     LIGHT_STRING_CONVERT(CARDREADER)
     LIGHT_STRING_CONVERT(CARDREADER_RED)
-    LIGHT_STRING_CONVERT(PRINTER)
     LIGHT_STRING_CONVERT(IDCERTIFICATE)
     LIGHT_STRING_CONVERT(PINPAD)
-    LIGHT_STRING_CONVERT(PINPADLIGHT)
     LIGHT_STRING_CONVERT(SHAKEDETECT)
     LIGHT_STRING_CONVERT(SWITCHINDUCTOR)
     LIGHT_STRING_CONVERT(PHONEPICKUP)
@@ -98,11 +89,8 @@ static const char* GetLightSeqString(int seq)
     LIGHT_STRING_CONVERT(HEADLIGHT)
     LIGHT_STRING_CONVERT(HEADLIGHT_RED)
     LIGHT_STRING_CONVERT(CONTACTLESSCARD)
-    LIGHT_STRING_CONVERT(USBCONTROL)
-    LIGHT_STRING_CONVERT(USBLIGHT)
     LIGHT_STRING_CONVERT(HEADLIGHT_ASSIST)
     LIGHT_STRING_CONVERT(HSPSCANNER)
-    LIGHT_STRING_CONVERT(PRINTER_SEAL)
     LIGHT_STRING_CONVERT(FINGERPRINT)
     default:
         DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unkonwn LightSeq: %d", seq);
@@ -115,25 +103,17 @@ static const char* GetLightSeqString(int seq)
 
 void CGpioServiceSession::Handle_Set(SpOnewayCallContext<GpioService_Set_Info>::Pointer ctx)
 {
-    GpioService_Set_Info req = ctx->Info;
-    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq=%d", req.devseq);
-    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mode=%d", req.mode);
-    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("close=%d", req.close);
-    m_pEntity->Set(req);
+
 }
 
 void CGpioServiceSession::Handle_GetStatus(SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx)
 {
-    m_pEntity->GetStatus(ctx->Req.devseq, ctx);
+    ctx->Answer(Error_NotSupport);
 }
 
 void CGpioServiceSession::Handle_QueryCurrSet(SpReqAnsContext<GpioService_QueryCurrSet_Req, GpioService_QueryCurrSet_Ans>::Pointer ctx)
 {
-    DevOutputInfo output;
-    output = m_pEntity->GetCurrDevStatus();
-    ctx->Ans.dir = output.dir;
-    ctx->Ans.output = m_pEntity->GetOutputStatus(0);
-    ctx->Answer(Error_Succeed);
+    ctx->Answer(Error_NotSupport);
 }
 
 bool isnostr(const char* str)
@@ -231,6 +211,20 @@ void CGpioEntity::ToLogWarnInfoAboutTerm(const AdapterInfo& m_adapterInfo)
 	return;
 }
 
+bool CGpioEntity::DetectBit(ULONG data, int pos)
+{
+    if (!m_bFuncVer2) {
+        ULONG tmp = 0;
+        SETBIT(tmp, pos);
+        return data & tmp;
+    } else {
+        if (m_hDevHelper != nullptr) {
+            DWORD dwReq = (GPIO_DEV_SN_SENSOR_SHAKE << pos);
+            return (data & dwReq);
+        }
+    }
+}
+
 ErrorCodeEnum CGpioEntity::Initial()
 {
     ErrorCodeEnum err;
@@ -326,11 +320,16 @@ ErrorCodeEnum CGpioEntity::Initial()
             err = m_hDevHelper->GetDevCategory(m_devCatInfo);
             if (err == Error_Succeed) {
                 m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
+                CSimpleStringA strType(m_devCatInfo.szType);
+                if (strType.IndexOf("FUNCVER=2.0") != -1) {
+                    m_bFuncVer2 = TRUE;
+                    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Detect new interface version: %s", strType.GetData());
+                }
             } else {
                 DevErrorInfo devErrInfo;
                 ZeroMemory(&devErrInfo, sizeof(devErrInfo));
                 m_hDevHelper->GetLastErr(devErrInfo);
-                errMsg = CSimpleStringA::Format("GetDevCategory failed:%d(s)", err, devErrInfo.szErrMsg);
+                errMsg = CSimpleStringA::Format("GetDevCategory failed:%s(s)", SpStrError(err), devErrInfo.szErrMsg);
                 LogWarn(Severity_Middle, Error_Unexpect, GPIO_UserErrorCode_GetDevCategory_Failed, errMsg.GetData());
             }
             initTries = 0;
@@ -352,13 +351,18 @@ ErrorCodeEnum CGpioEntity::Initial()
         err = Error_DevConnFailed;
     }
 
-    err = m_hDevHelper->WritePort(0, 0x00);
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(err));
-    err = m_hDevHelper->WritePort(1, 0x00);
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(err));
-    if (m_bNewVersion) {
-        err = m_hDevHelper->WritePort(3, 0x00);
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(err));
+    if (!m_bFuncVer2) {
+        err = m_hDevHelper->WritePort(0, 0x00);
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(err));
+        err = m_hDevHelper->WritePort(1, 0x00);
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(err));
+        if (m_bNewVersion) {
+            err = m_hDevHelper->WritePort(3, 0x00);
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(err));
+        }
+    } else {
+        err = m_hDevHelper->SetStatus(GPIO_DEV_SN_LIGHT_SENSOR_ALL, GPIO_DEV_LIGHT_MODE_RESET);
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write resetone returned: %s)", SpStrError(err));
     }
 
     //oilyang@20170214 
@@ -376,6 +380,7 @@ ErrorCodeEnum CGpioEntity::Initial()
         m_moveHoldTimes = MAX_MOVE_HOLD_TIMES;//oiltmp about 5000*300ms = 25 minutes
     }
     m_moveDisappearTimes = m_moveHoldTimes;
+
     m_eMachineType = SP::Module::Comm::GetTerminalMachineInfo(this).type;
     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine type: %s", SP::Module::Comm::Type2Str(m_eMachineType));
 
@@ -387,6 +392,7 @@ ErrorCodeEnum CGpioEntity::Initial()
 
     return err;
 }
+
 void CGpioEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
                         const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
                         const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
@@ -431,14 +437,6 @@ void CGpioEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, con
         Req.devseq = CONTACTLESSCARD;
         Req.mode = 1;
         break;
-    case LOG_EVT_USB_CONTROL_ON:
-        Req.devseq = USBCONTROL;
-        Req.mode = 1;
-        break;
-    case LOG_EVT_USB_LIGHT_ON:
-        Req.devseq = USBLIGHT;
-        Req.mode = 1;
-        break;
     case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_ON:
         Req.devseq = HEADLIGHT_ASSIST;
         Req.mode = 1;
@@ -487,16 +485,6 @@ void CGpioEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, con
         Req.mode = 1;
         Req.close = 1;
         break;
-    case LOG_EVT_USB_CONTROL_OFF:
-        Req.devseq = USBCONTROL;
-        Req.mode = 1;
-        Req.close = 1;
-        break;
-    case LOG_EVT_USB_LIGHT_OFF:
-        Req.devseq = USBLIGHT;
-        Req.mode = 1;
-        Req.close = 1;
-        break;
     case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_OFF:
         Req.devseq = HEADLIGHT_ASSIST;
         Req.mode = 1;
@@ -517,17 +505,8 @@ void CGpioEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, con
         DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unkown event: 0x%X", dwUserCode);
         return;
     }
-
-    if (m_eMachineType != RVC_Stand1SPlus
-        || (dwUserCode == LOG_EVT_HEADLIGHT_GREEN_ON || dwUserCode == LOG_EVT_HEADLIGHT_RED_ON || dwUserCode == LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_ON
-            || dwUserCode == LOG_EVT_HEADLIGHT_GREEN_OFF || dwUserCode == LOG_EVT_HEADLIGHT_RED_OFF || dwUserCode == LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_OFF)) {
-
-        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
-        Set(Req);
-
-    } else {
-        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Stand1S: devseq[%d],mode[%d]close[%d] is not supported!", Req.devseq, Req.mode, Req.close);
-    }
+    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
+    m_bFuncVer2 ? SetEx(Req) : Set(Req);
 }
 
 void CGpioEntity::WritePin(DWORD dwPinSeq, bool bHighLevel)
@@ -574,6 +553,83 @@ void CGpioEntity::WritePin(DWORD dwPinSeq, bool bHighLevel)
     }
 }
 
+void CGpioEntity::SetEx(GpioService_Set_Info req)
+{
+    int devicePort;
+    LOG_TRACE("SetEx request %s arrived!", GetLightSeqString(req.devseq));
+    switch (req.devseq) {
+    case CARDREADER:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER;
+        break;
+    }
+    case CARDREADER_RED:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN;
+        break;
+    }
+    case IDCERTIFICATE:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_IDCERTIFICATE;
+        break;
+    }
+    case FINGERPRINT:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_FINGERPRINT;
+        break;
+    }
+    case PINPAD:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_PINPAD;
+        break;
+    }
+    case HEADLIGHT:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_FACE;
+        break;
+    }
+    case HEADLIGHT_RED:
+    {
+        devicePort = 6/*GPIO_DEV_SN_LIGHT_MACHINE_FAULT*/;
+        break;
+    }
+    case CONTACTLESSCARD:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_CONTACTLESSCARD;
+        break;
+    }
+    case HEADLIGHT_ASSIST:
+    {
+        devicePort = GPIO_DEV_SN_LIGHT_FACE;
+        break;
+    }
+    break;
+    default:
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unsupport device seq: %d", req.devseq);
+        return;
+    }
+
+    if (m_hDevHelper != nullptr) {
+        DWORD dwReq = devicePort;
+        DWORD dwMode = 0;
+        if (!req.close) {
+            dwMode |= GPIO_DEV_LIGHT_MODE_COLOR_NORMAL;
+            dwMode |= GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER;
+        }
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to set SetStatus...%d, 0x%X", dwReq, dwMode);
+        const ErrorCodeEnum ec = m_hDevHelper->SetStatus(dwReq, dwMode);
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SetStatus returned %s", SpStrError(ec));
+        if (ec != Error_Succeed) {
+            DevErrorInfo devErrInfo;
+            ZeroMemory(&devErrInfo, sizeof(devErrInfo));
+            m_hDevHelper->GetLastErr(devErrInfo);
+            DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DevOpen failed:%s(%s)", SpStrError(ec), devErrInfo.szErrMsg);
+        }
+    } else {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("dev helper object is invalid pointer!");
+    }
+}
+
 void CGpioEntity::Set(GpioService_Set_Info req)
 {
     CSimpleStringA activeModeSecName = "";
@@ -632,18 +688,6 @@ void CGpioEntity::Set(GpioService_Set_Info req)
         devicePort = 8;
         break;
     }
-    case USBCONTROL:
-    {
-        activeModeSecName = "LightNormal";
-        devicePort = 1;
-        break;
-    }
-    case USBLIGHT:
-    {
-        activeModeSecName = "CardReaderNormal";
-        devicePort = 7;
-        break;
-    }
     case HEADLIGHT_ASSIST:
     {
         activeModeSecName = "AssistNormal";
@@ -662,39 +706,37 @@ void CGpioEntity::Set(GpioService_Set_Info req)
         return;
     }
 
-    if (m_eMachineType != RVC_Stand1SPlus
-        || (deviceSeq == HEADLIGHT || deviceSeq == HEADLIGHT_RED || deviceSeq == HEADLIGHT_ASSIST)) {
-
-        OutDrivingInfo odi;
-        GetOutDrivingModInfo(activeModeSecName, odi);
-        SetOutDriving(req, odi, 0, devicePort);
-    
-    } else {
-        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Stand1SPlus: %d,%d(%s) is not supported!", deviceSeq, devicePort, activeModeSecName);
-    }
+    OutDrivingInfo odi;
+    GetOutDrivingModInfo(activeModeSecName, odi);
+    SetOutDriving(req, odi, 0, devicePort);
 }
 
+//仅仅获取挂机的状态,但远远没有这么简单,这点只调用了一次,开了一个监听线程,用于监听震动、开关门等事件
 void CGpioEntity::GetStatus(int deviceSeq, SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx)
 {
-    /** 注意设备序号是实体内定义的逻辑,不是设备端口号*/
+    /** 注意设备序号是实体内定义的逻辑,不是设备端口号,用作于计时器的ID去了*/
     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetStatus with devseq %d", deviceSeq);
-    CSimpleStringA initDriver = "";
-    int devicePort;
-    /** 获取指定的模式,以便后续获取输入模式和持续触发模式,见 GetReceivingModInfo*/
-    initDriver = "PhoneNormal";
-    /** 获取硬件规格里对应的序号,其实是固定死的*/
-    devicePort = 18;
-    ReceivingInfo ri;
-    GetReceivingModInfo(initDriver, ri);
-    ri.Port = devicePort;
-    GetReceiving(deviceSeq, ri, PICKUPSENSOR, ctx);
+    if (deviceSeq == PHONEPICKUP) {
+    
+        if (!m_bFuncVer2) {
+            CSimpleStringA initDriver = "";
+            int devicePort;
+            /** 获取指定的模式,以便后续获取输入模式和持续触发模式,见 GetReceivingModInfo*/
+            initDriver = "PhoneNormal";
+            /** 获取硬件规格里对应的序号,其实是固定死的*/
+            devicePort = 18;
+            ReceivingInfo ri;
+            GetReceivingModInfo(initDriver, ri);
+            ri.Port = devicePort;
+            GetReceiving(deviceSeq, ri, PICKUPSENSOR);
+        }
+    }
 }
 
 void CGpioEntity::OnOutputPositiveLevelTimerout(void* pData)
 {
     SetContextInfo* pSCI = (SetContextInfo*)pData;
     GetFunction()->KillTimer(pSCI->timerID);
-    ULONG devEnableStatus = GetDevEnableStatus();
     DevOutputInfo doi = GetCurrDevStatus();
     WritePin(pSCI->pinSeq, true);
     delete pSCI;
@@ -705,21 +747,17 @@ void CGpioEntity::OnPositiveFlickerSetTimerout(void* pData)
     SetContextInfo* pSCI = (SetContextInfo*)pData;
     GetFunction()->KillTimer(pSCI->timerID);
 
-    ULONG devEnableStatus = GetDevEnableStatus();
     DevOutputInfo doi = GetCurrDevStatus();
     WritePin(pSCI->pinSeq, false);
     pSCI->timerID = pSCI->timerID;
 
     ITimerListener* pListener = new TimerOutHelper<CGpioEntity>(this, &CGpioEntity::OnPositiveFlickerResetTimerout, pSCI, true);
     GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->resetTime);
-
 }
-
 void CGpioEntity::OnPositiveFlickerResetTimerout(void* pData)
 {
     SetContextInfo* pSCI = (SetContextInfo*)pData;
     GetFunction()->KillTimer(pSCI->timerID);
-    ULONG devEnableStatus = GetDevEnableStatus();
     DevOutputInfo doi = GetCurrDevStatus();
 
     WritePin(pSCI->pinSeq, true);
@@ -727,16 +765,16 @@ void CGpioEntity::OnPositiveFlickerResetTimerout(void* pData)
     GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->setTime);
 }
 
+//老接口,用于控制灯
 bool CGpioEntity::SetOutDriving(GpioService_Set_Info req, OutDrivingInfo od, ULONG iIndex, ULONG pinSeq)
 {
-    ULONG devEnableStatus = GetDevEnableStatus();
     DevOutputInfo doi = GetCurrDevStatus();
     if (req.close == 1) {
         GetFunction()->KillTimer(req.devseq);
         //oilyang add 20161222
         //如果关闭照明灯,以感知为准
         if (pinSeq == m_headlightDevPort)
-            WritePin(pinSeq, m_bHeadLightFlag);
+            WritePin(pinSeq, m_bHeadLightFlag); //这个值有待商榷
         else {
             if (pinSeq == PIN_HSPSCANNER_PREVIEW_LIGHT) {
                 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("off hspsanner.");
@@ -744,7 +782,6 @@ bool CGpioEntity::SetOutDriving(GpioService_Set_Info req, OutDrivingInfo od, ULO
             }
             WritePin(pinSeq, false);
         }
-
         return true;
     }
 
@@ -830,42 +867,12 @@ bool CGpioEntity::SetOutDriving(GpioService_Set_Info req, OutDrivingInfo od, ULO
 
     return true;
 }
-void CGpioEntity::OnPositivePulseUpTimerout(void* pData)
-{
-    GetContextInfo* pGCI = (GetContextInfo*)pData;
-
-    BYTE btInput = 0;
-    ErrorCodeEnum err;
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("port[%d]", INPUT_PORT_2);
-    err = m_hDevHelper->ReadPort(INPUT_PORT_2, btInput);
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("read[%d]", btInput);
-    //判断输入
-    if (DetectBit(btInput, pGCI->index)) {
-        if (pGCI->CttPhone == 0)//oiltest 20130709
-        {
-            ////触发
-            pGCI->ctx->Ans.status = 1;
-            pGCI->ctx->Answer(Error_Succeed);
-        } else {
-            pGCI->CttPhone--;//oiltest 20130709
-            GetFunction()->ResetTimer(pGCI->timerID, 1000);
-        }
-    } else {
-        pGCI->CttPhone = pGCI->InitCTT;//oiltest 20130709
-        GetFunction()->ResetTimer(pGCI->timerID, 1);
-    }
-}
-
-void CGpioEntity::OnNegativePulseUpTimerout(void* pData)
-{
-
-}
 
+/** 太复杂了,先掺在一起再改动吧  [Gifur@2023921]*/
 void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
 {
     GetContextInfo* pGci = (GetContextInfo*)pData;
 
-    const int count = pGci->InitCTT;
     const int initCtt = pGci->InitCTT;
     const int pos = pGci->Port;
     
@@ -875,7 +882,18 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
     bool bShakeOne, bMoveOne, bSwitchOne, bPhoneOne, bCardOne;
     bShakeOne = bMoveOne = bSwitchOne = bPhoneOne = bCardOne = false;
 
-    const ErrorCodeEnum err = m_hDevHelper->ReadPort(INPUT_PORT_2, btInput);
+    ErrorCodeEnum err(Error_Succeed);
+    if (!m_bFuncVer2) {
+        err = m_hDevHelper->ReadPort(INPUT_PORT_2, btInput);
+    } else {
+        DWORD dwReq(GPIO_DEV_SN_LIGHT_SENSOR_ALL);
+        DWORD dwMode = 0;
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to DetectStatus %d...", dwReq);
+        err = m_hDevHelper->DetectStatus(dwReq, dwMode);
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DetectStatus return %s, %d", SpStrError(err), dwMode);
+        btInput = dwMode;
+    }
+
     if (err != Error_Succeed) {
         DevErrorInfo devErrInfo;
         ZeroMemory(&devErrInfo, sizeof(DevErrorInfo));
@@ -891,6 +909,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
 
         do {
 
+            /** 待商榷,这里永远不可能为1 [Gifur@2023921]*/
             if (initCtt == 1) {
                 if (DetectBit(btInput, VIBRATIONSENSOR)) {
                     if (!m_bVibrationFlag && (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)) {
@@ -1181,8 +1200,6 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
 
     if (pGci->CttMove > 1 && !bMoveOne) {
         do {
-            //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("before ccMove: %d, ccInit: %d, moveRound: %d, %d, disppear: %d, holder: %d",
-            //    pGci->CttMove, pGci->InitCTT, m_bMoveRound, DetectBit(btInput, MOVESENSOR), m_moveDisappearTimes, m_moveHoldTimes);
 
             if (m_bMoveRound) {
                 if (DetectBit(btInput, MOVESENSOR))
@@ -1199,15 +1216,10 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
                     pGci->CttMove = pGci->InitCTT;
                 }
             }
-            
-            //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("after ccMove: %d, ccInit: %d, moveRound: %d, %d, disppear: %d, holder: %d",
-            //    pGci->CttMove, pGci->InitCTT, m_bMoveRound, DetectBit(btInput, MOVESENSOR), m_moveDisappearTimes, m_moveHoldTimes);
 
         } while (0);
-    } else {
-        //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("===== ccMove: %d, moveOne: %d, moveRound: %d, %d, disppear: %d, holder: %d",
-        //    pGci->CttMove, bMoveOne, m_bMoveRound, DetectBit(btInput, MOVESENSOR), m_moveDisappearTimes, m_moveHoldTimes);
-    }
+
+    } 
 
     if (pGci->CttCard > 1 && !bCardOne) {
         do {
@@ -1232,41 +1244,15 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
     GetFunction()->ResetTimer(pGci->timerID, 100);
 }
 
-void CGpioEntity::OnNegativeLevelTimerOut(void* pData)
-{
-
-}
-
-bool CGpioEntity::GetReceiving(int deviceSeq, ReceivingInfo ri, ULONG iIndex, 
-                               SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx)
+bool CGpioEntity::GetReceiving(int deviceSeq, ReceivingInfo ri, ULONG iIndex)
 {
-
     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("inputmode[%d],port[%d],ctt[%d]", ri.InputMode, ri.Port, ri.ContinuousTriggerTime);
     switch (ri.InputMode) 
     {
-        case IM_POSITIVE_PULSE_UP:
-        {
-            GetContextInfo* pGci = new GetContextInfo();
-            pGci->timerID = ctx->Req.devseq;
-            pGci->ctx = ctx;
-            pGci->index = iIndex;
-            pGci->Port = ri.Port;
-            pGci->CttCard = ri.ContinuousTriggerTime;
-            pGci->CttMove = ri.ContinuousTriggerTime;
-            pGci->CttPhone = ri.ContinuousTriggerTime;
-            pGci->CttShake = ri.ContinuousTriggerTime;
-            pGci->CttSwitch = ri.ContinuousTriggerTime;
-            pGci->InitCTT = ri.ContinuousTriggerTime;
-            ITimerListener* pListener = new TimerOutHelper<CGpioEntity>(this, &CGpioEntity::OnPositivePulseUpTimerout, pGci);
-            GetFunction()->SetTimer(pGci->timerID, pListener, 1);
-            break;
-        }
-
         case IM_POSITIVE_LEVEL:
-        {
+        { /** 目前只是使用了这一个 [Gifur@2023921]*/
             GetContextInfo* pGci = new GetContextInfo();
             pGci->timerID = deviceSeq;
-            pGci->ctx = ctx;
             pGci->index = iIndex;
             pGci->Port = ri.Port;
             pGci->CttCard = ri.ContinuousTriggerTime;
@@ -1279,69 +1265,66 @@ bool CGpioEntity::GetReceiving(int deviceSeq, ReceivingInfo ri, ULONG iIndex,
             GetFunction()->SetTimer(pGci->timerID, pListener, 100);
             break;
         }
-        case IM_NEGATIVE_LEVEL:
-        {
-            GetContextInfo* pGci = new GetContextInfo();
-            pGci->timerID = deviceSeq;
-            pGci->ctx = ctx;
-            pGci->index = iIndex;
-            pGci->Port = ri.Port;
-            pGci->InitCTT = ri.ContinuousTriggerTime;
-            ITimerListener* pListener = new TimerOutHelper<CGpioEntity>(this, &CGpioEntity::OnNegativeLevelTimerOut, pGci);
-            GetFunction()->SetTimer(pGci->timerID, pListener, 1);
-            break;
-        }
         default:
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("not support: %d", ri.InputMode);
             break;
     }
     return true;
 }
 
+/** 旧接口,从配置中获取闪烁的属性 [Gifur@2023921]*/
 void CGpioEntity::GetOutDrivingModInfo(CSimpleStringA modName, OutDrivingInfo& odi)
 {
 	if (modName.Compare("IDCertificateNormal") == 0) {
-		odi.OutputMode = 2;
-		odi.StopMode = 2;
+		odi.OutputMode = OM_POSITIVE_FLICKER;
+		odi.StopMode = SM_CYCLE;
 		odi.SetTime = 150;
 		odi.ResetTime = 150;
 		odi.TimeOut = 5000;
+
 	} else if (modName.Compare("FingerPrintNormal") == 0) {
-		odi.OutputMode = 2;
-		odi.StopMode = 2;
+		odi.OutputMode = OM_POSITIVE_FLICKER;
+		odi.StopMode = SM_CYCLE;
 		odi.SetTime = 150;
 		odi.ResetTime = 150;
 		odi.TimeOut = 5000;
+
 	} else if (modName.Compare("CardReaderNormal") == 0) {
-		odi.OutputMode = 2;
-		odi.StopMode = 2;
+		odi.OutputMode = OM_POSITIVE_FLICKER;
+		odi.StopMode = SM_CYCLE;
 		odi.SetTime = 200;
 		odi.ResetTime = 200;
 		odi.TimeOut = 5000;
+
 	} else if (modName.Compare("AssistNormal") == 0) {
-		odi.OutputMode = 2;
-		odi.StopMode = 2;
+		odi.OutputMode = OM_POSITIVE_FLICKER;
+		odi.StopMode = SM_CYCLE;
 		odi.SetTime = 1000;
 		odi.ResetTime = 500;
 		odi.TimeOut = 5000;
+
 	} else if (modName.Compare("LightNormal") == 0) {
-		odi.OutputMode = 0;
-		odi.StopMode = 0;
+		odi.OutputMode = OM_POSITIVE_LEVEL;
+		odi.StopMode = SM_CALLTRIGGER;
 		odi.SetTime = 1000;
 		odi.ResetTime = 1000;
 		odi.TimeOut = 5000;
+
 	} else if (modName.Compare("RedLightNormal") == 0) {
-		odi.OutputMode = 0;
-		odi.StopMode = 0;
+		odi.OutputMode = OM_POSITIVE_LEVEL;
+		odi.StopMode = SM_CALLTRIGGER;
 		odi.SetTime = 200;
 		odi.ResetTime = 200;
 		odi.TimeOut = 3000;
+
 	} else {
-		odi.OutputMode = 0;
-		odi.StopMode = 0;
+		odi.OutputMode = OM_POSITIVE_LEVEL;
+		odi.StopMode = SM_CALLTRIGGER;
 		odi.SetTime = 200;
 		odi.ResetTime = 200;
 		odi.TimeOut = 5000;
 	}
+
 	LOG_TRACE("outputmode.stopmode:[%d].[%d]", odi.OutputMode, odi.StopMode);
 }
 
@@ -1349,21 +1332,17 @@ void CGpioEntity::GetOutDrivingModInfo(CSimpleStringA modName, OutDrivingInfo& o
 void CGpioEntity::GetReceivingModInfo(CSimpleStringA modName, ReceivingInfo& ri)
 {
 	if (modName.Compare("PhoneNormal") == 0) {
-		ri.InputMode = 4;
 		ri.ContinuousTriggerTime = 2;
 	} else if (modName.Compare("GpioNormal") == 0) {
-		ri.InputMode = 4;
 		ri.ContinuousTriggerTime = 10;
 	} else if (modName.Compare("CardGateNormal") == 0) {
-		ri.InputMode = 4;
 		ri.ContinuousTriggerTime = 10;
 	} else if (modName.Compare("ShakeNormal") == 0) {
-		ri.InputMode = 4;
 		ri.ContinuousTriggerTime = 4;
 	} else {
-		ri.InputMode = 4;
 		ri.ContinuousTriggerTime = 10;
 	}
+    ri.InputMode = IM_POSITIVE_LEVEL;
 }
 
 BYTE CGpioEntity::GetOutputStatus(int sn)

+ 6 - 15
Module/mod_gpio/mod_gpio.h

@@ -141,12 +141,12 @@ class CGpioEntity : public CDevAdptEntityBase, public ILogListener
 {
 public:
 	//0000 0000 0000 0010 0110 1111 1100 0000
-	CGpioEntity():m_devEnableStatus(0x1f),m_bPickUpRound(false),m_bVibrationRound(false)
+	CGpioEntity():m_bPickUpRound(false),m_bVibrationRound(false)
 		,m_bOpenRound(false),m_bMoveRound(false),m_bCardGateRound(false), m_ePickUpFlag(Unknown)
 		,m_bVibrationFlag(false),m_bOpenFlag(false),m_bMoveFlag(false),m_bCardGateFlag(false)
 		, m_pLogListener(NULL), m_bHeadLightFlag(false), m_headlightDevPort(0), m_moveHoldTimes(0)
 		, m_moveDisappearTimes(0),m_eMachineType(SP::Module::Comm::RVC_UNKNOWN)
-		, m_bNewVersion(FALSE), m_FirstStart(true)
+		, m_bNewVersion(FALSE), m_bFuncVer2(FALSE), m_FirstStart(true)
 		, m_csDevNo(""), m_port(""), m_portNum(""), m_Baudrate(""), m_InOutDir("")
 	{
 		m_timerID = 1;
@@ -155,8 +155,6 @@ public:
 		//currDevStatus.dir = 0x7ffb0;
 		memset(m_btOutputStatus,0,MAX_PORT_NUM);
 		currDevStatus.output = 0x0;
-//		currDir = 0x2007ffff;
-		//m_pPIUT = new PositivePulseUpTimer();
 	}
 
 #ifdef RVC_OS_LINUX
@@ -243,17 +241,12 @@ public:
 
 	bool SetOutDriving(GpioService_Set_Info req,OutDrivingInfo od, ULONG iIndex,ULONG devSeq);
 
-	bool GetReceiving(int deviceSeq,ReceivingInfo ri, ULONG iIndex, 
-					  SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx);
+	bool GetReceiving(int deviceSeq,ReceivingInfo ri, ULONG iIndex);
 
 	DevOutputInfo GetCurrDevStatus()const {return currDevStatus;}
 
 	void SaveCurrDevStatus(DevOutputInfo devOutputInfo) {currDevStatus = devOutputInfo;}
 
-	ULONG GetDevEnableStatus(){return m_devEnableStatus;}
-
-	void SetDevEnableStatus(ULONG devEnableStatus){m_devEnableStatus = devEnableStatus;}
-
 	ULONG GetNewTimerID(){return m_timerID++;}
 
 	BYTE GetOutputStatus(int sn=0);
@@ -264,14 +257,12 @@ public:
 	void OnOutputPositiveLevelTimerout(void *pData);
 	void OnPositiveFlickerSetTimerout(void *pData);
 	void OnPositiveFlickerResetTimerout(void *pData);
-	void OnPositivePulseUpTimerout(void* pData);
-	void OnNegativePulseUpTimerout(void* pData);
 	void OnPositiveLevelTimerOut(void* pData);
-	void OnNegativeLevelTimerOut(void* pData);
 	void GetOutDrivingModInfo(CSimpleStringA modName, OutDrivingInfo& odi);
 	void GetReceivingModInfo(CSimpleStringA modName, ReceivingInfo& ri);
 	void GetStatus(int deviceSeq,SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx);
 	void Set(GpioService_Set_Info info);
+	void SetEx(GpioService_Set_Info info);
 	void WritePin(DWORD dwPinSeq,bool bHighLevel);
 
 	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
@@ -280,7 +271,7 @@ public:
 
 	void ToLogRootINIInfo();
 	void ToLogWarnInfoAboutTerm(const AdapterInfo& m_adapterInfo);
-
+	bool DetectBit(ULONG data, int pos);
 private:
 
 	HMODULE m_hVerdorDll;
@@ -293,12 +284,12 @@ private:
 	BYTE m_btOutputStatus[MAX_PORT_NUM];
 	DWORD m_dwPortNum,m_dwInOutDir;
 	BOOL m_bNewVersion;
+	BOOL m_bFuncVer2;
 	CUUID m_uuidHealth,m_uuidPtr,m_uuidCR,m_uuidIDC,m_uuidFP,m_uuidKB,m_uuidCA,m_uuidCC,m_uuidDD,m_uuidCS,m_uuidIE,m_uuidPrinter;
 	CUUID m_uuidHSPscanner;
 	CUUID m_uuidPrintSeal;
 	DevOutputInfo currDevStatus;
 	DevCategoryInfo m_devCatInfo;
-	ULONG m_devEnableStatus;
 	ULONG m_timerID;
 	bool m_bPickUpRound,m_bVibrationRound,m_bOpenRound,m_bMoveRound,m_bCardGateRound;
 	bool m_bVibrationFlag,m_bOpenFlag,m_bMoveFlag,m_bCardGateFlag;