SensorsFSM.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #ifndef __SENSORS_FSM_H
  2. #define __SENSORS_FSM_H
  3. #pragma once
  4. #include <map>
  5. using namespace std;
  6. #include "SpFSM.h"
  7. #include <InitGuid.h>
  8. #include <SensorsApi.h>
  9. #include <Sensors.h>
  10. #include "Sensors_server_g.h"
  11. #include "GnssClass.h"
  12. using namespace Sensors;
  13. enum EvtType
  14. {
  15. USER_EVT_TEST = EVT_USER+1,
  16. USER_EVT_INIT,
  17. USER_EVT_INIT_FINISHED,
  18. USER_EVT_WORK_FINISHED,
  19. USER_EVT_EXIT,
  20. USER_EVT_GET_DEVINFO,
  21. USER_EVT_ERROR,
  22. };
  23. enum SensorType
  24. {
  25. AMBIENT_LIGHT = 0x1,
  26. GYROMETER_3D = 0x2,
  27. COMPASS_3D = 0x4,
  28. INCLINOMETER_3D = 0x8,
  29. ACCELEROMETER_3D = 0x10,
  30. // ORIENTATION,
  31. // SIMPLE_DEVICE_ORIENTATION,
  32. // CUSTOM,
  33. };
  34. struct SensorValue
  35. {
  36. double dwData;
  37. double dwX;
  38. double dwY;
  39. double dwZ;
  40. };
  41. typedef ErrorCodeEnum(*lpCreateDevCom)(DeviceBaseClass*& baseObj);
  42. typedef ErrorCodeEnum(*lpReleaseDevCom)(DeviceBaseClass*& pBaseObj);
  43. class MyEvents;
  44. class CSensorsFSM : public FSMImpl<CSensorsFSM>
  45. {
  46. public:
  47. enum {s0,s1,s2};
  48. BEGIN_FSM_STATE(CSensorsFSM)
  49. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  50. FSM_STATE_ENTRY(s1,"Normal",s1_on_entry,s1_on_exit,s1_on_event)
  51. FSM_STATE_ENTRY(s2,"Fail",s2_on_entry,s2_on_exit,s2_on_event)
  52. END_FSM_STATE()
  53. BEGIN_FSM_RULE(CSensorsFSM, s0)
  54. FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT_FINISHED, 0)
  55. FSM_RULE_ENTRY(s0, s2, USER_EVT_INIT_FINISHED, 1)
  56. END_FSM_RULE()
  57. CSensorsFSM():m_dwSensorsHave(0),m_testResult(Error_Succeed),m_pLightSensor(NULL)
  58. ,m_lightVar(10),m_gyroVar(10),m_inclineVar(10),m_compassVar(10),m_acceleroVar(10), m_csFWBVendor("")
  59. , m_pGnssClass(NULL){};
  60. virtual ~CSensorsFSM() {};
  61. virtual ErrorCodeEnum OnInit();
  62. virtual ErrorCodeEnum OnExit();
  63. virtual void s0_on_entry();
  64. virtual void s0_on_exit();
  65. virtual unsigned int s0_on_event(FSMEvent* e);
  66. virtual void s1_on_entry();
  67. virtual void s1_on_exit();
  68. virtual unsigned int s1_on_event(FSMEvent* e);
  69. virtual void s2_on_entry();
  70. virtual void s2_on_exit();
  71. virtual unsigned int s2_on_event(FSMEvent* e);
  72. int DoInit();
  73. int DoWork();
  74. void OnCheckTimeTimeout();
  75. //to get
  76. void GetAmbientLightData();
  77. void GetGyroMeter3DData();
  78. void GetCompass3DData();
  79. void GetInclinoMeter3DData();
  80. void GetAcceleroMeter3DData();
  81. void FindSensorDataChange(SensorType eType,double dwValue1,double dwX,double dwY,double dwZ);
  82. bool Is3DDataChanged(SensorType eType,double dwX,double dwY,double dwZ);
  83. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  84. HRESULT SetCurrentReportInterval(ISensor* pSensor, ULONG ulNewInterval);
  85. void DoGetGnss();
  86. private:
  87. DWORD m_dwSensorsHave;
  88. int m_lightVar,m_gyroVar,m_inclineVar,m_compassVar,m_acceleroVar;
  89. ErrorCodeEnum m_testResult;
  90. ISensorManager *m_pSensorManager;
  91. CSimpleStringA m_csFWBVendor;
  92. GnssClass *m_pGnssClass;
  93. HMODULE m_hVerdorDll;
  94. lpCreateDevCom CreateDevComponent;
  95. lpReleaseDevCom ReleaseDevComponent;
  96. map<SensorType,GUID> m_mapGUID;
  97. map<SensorType,SensorValue> m_mapLastValue;
  98. ISensor *m_pLightSensor,*m_pGyroMeter3DSensor,*m_pInclinoMeter3DSensor,*m_pCompass3DSensor,*m_pAcceleroMeter3DSensor;
  99. ISensorEvents* m_pLightEvents,*m_pGyroMeter3DEvents,*m_pInclinoMeter3DEvents,*m_pCompass3DEvents,*m_pAcceleroMeter3DEvents;
  100. MyEvents *m_pLightEvtClass,*m_pGyroMeter3DClass,*m_pInclinoMeter3DClass,*m_pCompass3DClass,*m_pAcceleroMeter3DClass;
  101. GnssInfoStru m_gnssInfo,m_lastGnssInfo;
  102. ErrorCodeEnum LoadGnssVendorDLL();
  103. };
  104. struct DoInitTask : public ITaskSp
  105. {
  106. CSensorsFSM *pFSM;
  107. DoInitTask(CSensorsFSM *f):pFSM(f){}
  108. virtual void Process()
  109. {
  110. FSMEvent *pEvt = new FSMEvent(USER_EVT_INIT_FINISHED);
  111. pEvt->param1 = pFSM->DoInit();
  112. pFSM->PostEventFIFO(pEvt);
  113. }
  114. };
  115. struct DoWorkTask : public ITaskSp
  116. {
  117. CSensorsFSM *pFSM;
  118. DoWorkTask(CSensorsFSM *f):pFSM(f){}
  119. virtual void Process()
  120. {
  121. FSMEvent *pEvt = new FSMEvent(USER_EVT_WORK_FINISHED);
  122. pEvt->param1 = pFSM->DoWork();
  123. pFSM->PostEventFIFO(pEvt);
  124. }
  125. };
  126. struct DoGetGnssTask : public ITaskSp
  127. {
  128. CSensorsFSM* pFSM;
  129. DoGetGnssTask(CSensorsFSM* f) :pFSM(f) {}
  130. virtual void Process()
  131. {
  132. pFSM->DoGetGnss();
  133. }
  134. };
  135. class MyEvents : public ISensorEvents
  136. {
  137. public:
  138. //MyEvents(CSensorsFSM *pFSM):m_pFSM(pFSM)
  139. MyEvents()
  140. {
  141. m_mapGUID[AMBIENT_LIGHT] = SENSOR_TYPE_AMBIENT_LIGHT;
  142. m_mapGUID[GYROMETER_3D] = SENSOR_TYPE_GYROMETER_3D;
  143. m_mapGUID[COMPASS_3D] = SENSOR_TYPE_COMPASS_3D;
  144. m_mapGUID[ACCELEROMETER_3D] = SENSOR_TYPE_ACCELEROMETER_3D;
  145. m_mapGUID[INCLINOMETER_3D] = SENSOR_TYPE_INCLINOMETER_3D;
  146. }
  147. STDMETHODIMP QueryInterface(REFIID iid, void** ppv)
  148. {
  149. if (ppv == NULL)
  150. {
  151. return E_POINTER;
  152. }
  153. if (iid == __uuidof(IUnknown))
  154. {
  155. *ppv = static_cast<IUnknown*>(this);
  156. }
  157. else if (iid == __uuidof(ISensorEvents))
  158. {
  159. *ppv = static_cast<ISensorEvents*>(this);
  160. }
  161. else
  162. {
  163. *ppv = NULL;
  164. return E_NOINTERFACE;
  165. }
  166. AddRef();
  167. m_count = 0;
  168. return S_OK;
  169. }
  170. STDMETHODIMP_(ULONG) AddRef()
  171. {
  172. return InterlockedIncrement(&m_cRef);
  173. }
  174. STDMETHODIMP_(ULONG) Release()
  175. {
  176. ULONG count = InterlockedDecrement(&m_cRef);
  177. if (count == 0)
  178. {
  179. delete this;
  180. return 0;
  181. }
  182. return count;
  183. }
  184. // ISensorEvents methods.
  185. STDMETHODIMP OnEvent(ISensor *pSensor,REFGUID eventID,IPortableDeviceValues *pEventData)
  186. {
  187. HRESULT hr = S_OK;
  188. // Handle custom events here.
  189. return hr;
  190. }
  191. STDMETHODIMP OnLeave(REFSENSOR_ID sensorID)
  192. {
  193. HRESULT hr = S_OK;
  194. // Peform any housekeeping tasks for the sensor that is leaving.
  195. // For example, if you have maintained a reference to the sensor,
  196. // release it now and set the pointer to NULL.
  197. return hr;
  198. }
  199. STDMETHODIMP OnDataUpdated(ISensor *pSensor,ISensorDataReport *pNewData);
  200. STDMETHODIMP OnStateChanged(ISensor* pSensor,SensorState state)
  201. {
  202. HRESULT hr = S_OK;
  203. if(NULL == pSensor)
  204. {
  205. return E_INVALIDARG;
  206. }
  207. if(state == SENSOR_STATE_READY)
  208. {
  209. wprintf_s(L"\nTime sensor is now ready.");
  210. }
  211. else if(state == SENSOR_STATE_ACCESS_DENIED)
  212. {
  213. wprintf_s(L"\nNo permission for the time sensor.\n");
  214. wprintf_s(L"Enable the sensor in the control panel.\n");
  215. }
  216. return hr;
  217. }
  218. //on event
  219. void OnAmbientLightUpdate(ISensor *pSensor,ISensorDataReport *pNewData);
  220. void OnGyroMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData);
  221. void OnCompass3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData);
  222. void OnInclinoMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData);
  223. void OnAcceleroMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData);
  224. private:
  225. long m_cRef;
  226. int m_count;
  227. //CSensorsFSM *m_pFSM;
  228. map<SensorType,GUID> m_mapGUID;
  229. };
  230. template<class T>
  231. class TimerOutHelper : public ITimerListener
  232. {
  233. public:
  234. typedef void (T::*FuncTimer)();
  235. TimerOutHelper(T *p, FuncTimer pTimerFunc, bool bDeleteSelf = false)
  236. : m_pObject(p), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf) {}
  237. virtual void OnTimeout(DWORD dwTimerID)
  238. {
  239. (m_pObject->*m_pTimer)();
  240. if (m_bDeleteSelf)
  241. delete this;
  242. }
  243. private:
  244. T *m_pObject;
  245. FuncTimer m_pTimer;
  246. bool m_bDeleteSelf;
  247. };
  248. #endif //__SENSORS_FSM_H