GpioFSM.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #ifndef _GPIO_FSM_H_
  2. #define _GPIO_FSM_H_
  3. #pragma once
  4. #include "SpBase.h"
  5. #include "SpFSM.h"
  6. #include "GpioClass.h"
  7. #include "Gpio_server_g.h"
  8. #include "DevFSMCommBase.hpp"
  9. #include "Gpio_UserErrorCode.h"
  10. #define GpioService_LogCode_Detect_DoorOpen "QLR0402209A1"
  11. #define GpioService_LogCode_Detect_PhonePickup "QLR0402209A2"
  12. #define GpioService_LogCode_Detect_CardMouseJam "QLR0402209A3"
  13. #define GpioService_LogCode_Detect_DoorClose "QLR0402209A4"
  14. #define GpioService_LogCode_Detect_PhonePutDown "QLR0402209A5"
  15. enum PinPort {
  16. VIBRATIONSENSOR, /**震动探测器*/
  17. OPENSENSOR, /*开机箱门感应器*/
  18. PICKUPSENSOR, /*话机感应器*/
  19. MOVESENSOR, /**人体探测感应器*/
  20. CARDGATESENSOR, /**发卡器卡嘴感应器*/
  21. };
  22. /*用于标识等挂机等状态,布尔型不能满足,需要有一个初始状态*/
  23. enum PinActiveStatus
  24. {
  25. UnknownStatus,
  26. InActive,
  27. Actived
  28. };
  29. struct OutDrivingInfo
  30. {
  31. int Port;
  32. int SetTime;
  33. int ResetTime;
  34. int TimeOut;
  35. };
  36. struct ReceivingInfo
  37. {
  38. ULONG Port;
  39. int ContinuousTriggerTime;
  40. };
  41. struct SetContextInfo
  42. {
  43. ULONG timerID;
  44. ULONG pinSeq;
  45. int setTime;
  46. int resetTime;
  47. int timeout;
  48. };
  49. struct GetContextInfo
  50. {
  51. ULONG timerID;
  52. };
  53. enum LightSeq {
  54. UNKNOWN_DEVICE,
  55. CARDREADER,
  56. CARDREADER_RED,
  57. IDCERTIFICATE,
  58. PINPAD,
  59. PINPADLIGHT,
  60. SHAKEDETECT,
  61. SWITCHINDUCTOR,
  62. PHONEPICKUP,
  63. MOVEDETECT,
  64. CARDGATEDETECT,
  65. HEADLIGHT,
  66. HEADLIGHT_RED,
  67. CONTACTLESSCARD,
  68. HEADLIGHT_ASSIST,
  69. HSPSCANNER,
  70. FINGERPRINT,
  71. LIGHT_SEQ_MAX
  72. };
  73. /** 添加注释:对应规格说明书中的引脚信号,这里是从0开始,适应程序 [Gifur@202494]*/
  74. enum DevicePinSeq
  75. {
  76. PIN_CARD_READER_LIGHT = 0,
  77. PIN_USB_CONTROL_SWITCH, //已下线
  78. PIN_IDCERTIFICATE_LIGHT,
  79. PIN_PINPAD_LIGHT,
  80. PIN_HEAD_LIGHT,
  81. PIN_TROUBLE_LIGHT = 5,
  82. PIN_CARD_ISSUE_MAINTAIN_LIGHT,
  83. PIN_USB_CONTROL_LIGHT,//已下线
  84. PIN_CONTACELESS_LIGHT,
  85. PIN_RESERVED1, //RESERVED未使用,下同
  86. PIN_FINGERPRINT_LIGHT = 10,
  87. PIN_RESERVED2,
  88. PIN_HSPSCANNER_PREVIEW_LIGHT,
  89. PIN_RESERVED3,
  90. PIN_RESERVED4,
  91. PIN_RESERVED5 = 15,
  92. PIN_DETECT_SHAKE = 16,
  93. PIN_DETECT_OPENDOOR,
  94. PIN_DETECT_PHONE,
  95. PIN_DETECT_BODY,
  96. PIN_DETECT_CARDMOUSE_JAM,
  97. PIN_HSPSCANNER_LIGHT = 25
  98. };
  99. struct GpioSet_Info
  100. {
  101. /** 注意设备序号是实体内定义的逻辑,不是设备端口号,最后用作于计时器*/
  102. int devseq;
  103. /*目前用于灯亮模式标记,1表示闪烁,0表示常亮*/
  104. int mode;
  105. /*关灯还是开灯的标记,1表示关灯,0表示开灯*/
  106. int close;
  107. };
  108. using namespace Gpio;
  109. class CGPIOFSM : public CCommDevFSM<CGPIOFSM, GpioClass>
  110. {
  111. public:
  112. CGPIOFSM(void);
  113. ~CGPIOFSM(void) {}
  114. virtual ErrorCodeEnum OnInit();
  115. virtual ErrorCodeEnum OnExit() {
  116. LOG_FUNCTION();
  117. return Error_Succeed;
  118. }
  119. void AfterInit();
  120. void SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
  121. enum { s0 };
  122. BEGIN_FSM_STATE(CGPIOFSM)
  123. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  124. END_FSM_STATE()
  125. BEGIN_FSM_RULE(CGPIOFSM, s0)
  126. FSM_RULE_ENTRY_ANY(s0, s0, 0)
  127. END_FSM_RULE()
  128. virtual void s0_on_entry() {}
  129. virtual void s0_on_exit() {}
  130. virtual unsigned int s0_on_event(FSMEvent* e) {
  131. return 0;
  132. }
  133. void GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req,
  134. GpioService_GetDevInfo_Ans>::Pointer ctx);
  135. void Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx);
  136. void OnLogEvent(DWORD dwUserCode);
  137. //////////////////////////////////////////////////////////////////////////
  138. void OnPositiveFlickerSetTimerout(void* pData);
  139. void OnPositiveFlickerResetTimerout(void* pData);
  140. //具体的监听事件函数
  141. void OnEventDetect(void* pData);
  142. //开了一个监听线程,用于监听震动、开关门等事件
  143. void StartDetectWorkThread();
  144. void Set(GpioSet_Info info);
  145. void SetEx(GpioSet_Info info);
  146. bool SetOutDriving(GpioSet_Info req, OutDrivingInfo od);
  147. //调用硬件适配器接口,不涉及到其他复杂逻辑
  148. //0:success; 1:false;-1:other(ignore)
  149. int WritePin(DWORD dwPinSeq, bool bHighLevel);
  150. private:
  151. bool DetectBit(ULONG data, int pos);
  152. private:
  153. BYTE m_btOutputStatus[MAX_PORT_NUM];
  154. BOOL m_bLightStatus[LIGHT_SEQ_MAX];
  155. BYTE m_btLastRevcInput;
  156. unsigned int m_RecvErrTims;
  157. BOOL m_bNewVersion;
  158. BOOL m_bFuncVer2;
  159. bool m_bVibrationFlag, m_bOpenFlag, m_bMoveFlag, m_bCardGateFlag;
  160. PinActiveStatus m_ePickUpFlag;
  161. unsigned long m_PickUpTimeStamp;
  162. unsigned long m_PutDownTimeStamp;
  163. unsigned long m_DoorOpenTimeStamp;
  164. unsigned long m_DoorCloseTimeStamp;
  165. int m_headlightDevPort;
  166. unsigned long m_moveHoldTimes, m_moveDisappearTimes;
  167. };
  168. template<class T>
  169. class TimerOutHelper : public ITimerListener
  170. {
  171. public:
  172. typedef void (T::* FuncTimer)(void* pUserdata);
  173. TimerOutHelper(T* p, FuncTimer pTimerFunc, void* pUserData, bool bDeleteSelf = false)
  174. : m_pObject(p), m_pUserData(pUserData), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf) {}
  175. virtual void OnTimeout(DWORD dwTimerID)
  176. {
  177. (m_pObject->*m_pTimer)(m_pUserData);
  178. if (m_bDeleteSelf)
  179. delete this;
  180. }
  181. private:
  182. void* m_pUserData;
  183. T* m_pObject;
  184. FuncTimer m_pTimer;
  185. bool m_bDeleteSelf;
  186. };
  187. #endif //_GPIO_FSM_H_