GpioFSM.h 4.8 KB

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