GpioFSM.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. };
  84. /** 添加注释:对应规格说明书中的引脚信号,这里是从0开始,适应程序 [Gifur@202494]*/
  85. enum DevicePinSeq
  86. {
  87. PIN_CARD_READER_LIGHT = 0,
  88. PIN_USB_CONTROL_SWITCH, //已下线
  89. PIN_IDCERTIFICATE_LIGHT,
  90. PIN_PINPAD_LIGHT,
  91. PIN_HEAD_LIGHT,
  92. PIN_TROUBLE_LIGHT = 5,
  93. PIN_CARD_ISSUE_MAINTAIN_LIGHT,
  94. PIN_USB_CONTROL_LIGHT,//已下线
  95. PIN_CONTACELESS_LIGHT,
  96. PIN_RESERVED1, //RESERVED未使用,下同
  97. PIN_FINGERPRINT_LIGHT = 10,
  98. PIN_RESERVED2,
  99. PIN_HSPSCANNER_PREVIEW_LIGHT,
  100. PIN_RESERVED3,
  101. PIN_RESERVED4,
  102. PIN_RESERVED5 = 15,
  103. PIN_DETECT_SHAKE = 16,
  104. PIN_DETECT_OPENDOOR,
  105. PIN_DETECT_PHONE,
  106. PIN_DETECT_BODY,
  107. PIN_HSPSCANNER_LIGHT = 25
  108. };
  109. struct GpioSet_Info
  110. {
  111. int devseq;
  112. int mode;
  113. int close;
  114. };
  115. using namespace Gpio;
  116. class CGPIOFSM : public CCommDevFSM<CGPIOFSM, GpioClass>
  117. {
  118. public:
  119. CGPIOFSM(void);
  120. ~CGPIOFSM(void) {}
  121. virtual ErrorCodeEnum OnInit();
  122. virtual ErrorCodeEnum OnExit() {
  123. LOG_FUNCTION();
  124. return Error_Succeed;
  125. }
  126. void AfterInit();
  127. void SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
  128. enum { s0 };
  129. BEGIN_FSM_STATE(CGPIOFSM)
  130. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  131. END_FSM_STATE()
  132. BEGIN_FSM_RULE(CGPIOFSM, s0)
  133. FSM_RULE_ENTRY_ANY(s0, s0, 0)
  134. END_FSM_RULE()
  135. virtual void s0_on_entry() {}
  136. virtual void s0_on_exit() {}
  137. virtual unsigned int s0_on_event(FSMEvent* e) {
  138. return 0;
  139. }
  140. void GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req,
  141. GpioService_GetDevInfo_Ans>::Pointer ctx);
  142. void Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx);
  143. void OnLogEvent(DWORD dwUserCode);
  144. //////////////////////////////////////////////////////////////////////////
  145. void OnPositiveFlickerSetTimerout(void* pData);
  146. void OnPositiveFlickerResetTimerout(void* pData);
  147. void OnEventDetect(void* pData);
  148. //开了一个监听线程,用于监听震动、开关门等事件
  149. void StartDetectWorkThread();
  150. void Set(GpioSet_Info info);
  151. void SetEx(GpioSet_Info info);
  152. bool SetOutDriving(GpioSet_Info req, OutDrivingInfo od, ULONG iIndex, ULONG devSeq);
  153. void WritePin(DWORD dwPinSeq, bool bHighLevel);
  154. private:
  155. bool DetectBit(ULONG data, int pos);
  156. private:
  157. BYTE m_btOutputStatus[MAX_PORT_NUM];
  158. BOOL m_bNewVersion;
  159. BOOL m_bFuncVer2;
  160. BYTE m_btLastRevcInput;
  161. bool m_bVibrationFlag, m_bOpenFlag, m_bMoveFlag, m_bCardGateFlag;
  162. PinActiveStatus m_ePickUpFlag;
  163. unsigned long m_PickUpTimeStamp;
  164. unsigned long m_PutDownTimeStamp;
  165. unsigned long m_DoorOpenTimeStamp;
  166. unsigned long m_DoorCloseTimeStamp;
  167. bool m_bHeadLightFlag;
  168. int m_headlightDevPort;
  169. unsigned long m_moveHoldTimes, m_moveDisappearTimes;
  170. };
  171. template<class T>
  172. class TimerOutHelper : public ITimerListener
  173. {
  174. public:
  175. typedef void (T::* FuncTimer)(void* pUserdata);
  176. TimerOutHelper(T* p, FuncTimer pTimerFunc, void* pUserData, bool bDeleteSelf = false)
  177. : m_pObject(p), m_pUserData(pUserData), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf) {}
  178. virtual void OnTimeout(DWORD dwTimerID)
  179. {
  180. (m_pObject->*m_pTimer)(m_pUserData);
  181. if (m_bDeleteSelf)
  182. delete this;
  183. }
  184. private:
  185. void* m_pUserData;
  186. T* m_pObject;
  187. FuncTimer m_pTimer;
  188. bool m_bDeleteSelf;
  189. };
  190. #endif //_GPIO_FSM_H_