SensorsFSM.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  1. #include "stdafx.h"
  2. #include "SensorsFSM.h"
  3. #include "EventCode.h"
  4. const DWORD HEALTHMANAGER_TIMER_ID = 1;
  5. const DWORD HEALTHMANAGER_WD_TIMER_ID = 2;
  6. const DWORD HEALTHMANAGER_TIMER_INTERVAL = 1000;
  7. ErrorCodeEnum CSensorsFSM::OnInit()
  8. {
  9. LOG_FUNCTION();
  10. LoadGnssVendorDLL();
  11. return Error_Succeed;
  12. // Create a COM interface to the SensorManager object.
  13. HRESULT hr = CoInitialize(NULL);
  14. hr = ::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER,
  15. IID_PPV_ARGS(&m_pSensorManager));
  16. long tmp = hr;
  17. if (FAILED(hr))
  18. {
  19. Dbg("create SensorManager failed,%d.",hr);
  20. return Error_Resource;
  21. }
  22. m_mapGUID[AMBIENT_LIGHT] = SENSOR_TYPE_AMBIENT_LIGHT;
  23. m_mapGUID[GYROMETER_3D] = SENSOR_TYPE_GYROMETER_3D;
  24. m_mapGUID[COMPASS_3D] = SENSOR_TYPE_COMPASS_3D;
  25. m_mapGUID[ACCELEROMETER_3D] = SENSOR_TYPE_ACCELEROMETER_3D;
  26. m_mapGUID[INCLINOMETER_3D] = SENSOR_TYPE_INCLINOMETER_3D;
  27. SensorValue sValue = {0,0,0,0};
  28. m_mapLastValue[AMBIENT_LIGHT] = sValue;
  29. m_mapLastValue[GYROMETER_3D] = sValue;
  30. m_mapLastValue[COMPASS_3D] = sValue;
  31. m_mapLastValue[ACCELEROMETER_3D] = sValue;
  32. m_mapLastValue[INCLINOMETER_3D] = sValue;
  33. return Error_Succeed;
  34. }
  35. ErrorCodeEnum CSensorsFSM::OnExit()
  36. {
  37. LOG_FUNCTION();
  38. if (m_pLightSensor != NULL)
  39. m_pLightSensor->SetEventSink(NULL);
  40. return Error_Succeed;
  41. }
  42. void CSensorsFSM::s0_on_entry()
  43. {
  44. LOG_FUNCTION();
  45. //FSMEvent *pEvt = new FSMEvent(USER_EVT_INIT);
  46. //PostEventFIFO(pEvt);
  47. }
  48. unsigned int CSensorsFSM::s0_on_event(FSMEvent *pEvt)
  49. {
  50. Dbg("s0 init evt %d",pEvt->iEvt);
  51. switch(pEvt->iEvt)
  52. {
  53. case USER_EVT_INIT:
  54. {
  55. pEvt->SetHandled();
  56. DoInitTask *pTask = new DoInitTask(this);
  57. GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  58. break;
  59. }
  60. case USER_EVT_INIT_FINISHED:
  61. pEvt->SetHandled();
  62. return pEvt->param1;
  63. default:
  64. break;
  65. }
  66. return 0;
  67. }
  68. void CSensorsFSM::s0_on_exit()
  69. {
  70. }
  71. //normal
  72. void CSensorsFSM::s1_on_entry()
  73. {
  74. //oilyang@20200225 comment the following two line as no need for sensors now
  75. //DoWorkTask *pTask = new DoWorkTask(this);
  76. //GetEntityBase()->GetFunction()->PostEntityTaskFIFO(pTask);
  77. }
  78. unsigned int CSensorsFSM::s1_on_event(FSMEvent *pEvt)
  79. {
  80. Dbg("s1 normal evt %d",pEvt->iEvt);
  81. switch(pEvt->iEvt)
  82. {
  83. case USER_EVT_WORK_FINISHED:
  84. break;
  85. default:
  86. break;
  87. }
  88. return 0;
  89. }
  90. void CSensorsFSM::s1_on_exit()
  91. {
  92. }
  93. //failed
  94. void CSensorsFSM::s2_on_entry()
  95. {
  96. }
  97. unsigned int CSensorsFSM::s2_on_event(FSMEvent *pEvt)
  98. {
  99. return 0;
  100. }
  101. void CSensorsFSM::s2_on_exit()
  102. {
  103. }
  104. //to get all sensors on the device
  105. int CSensorsFSM::DoInit()
  106. {
  107. if (!m_pSensorManager)
  108. {
  109. Dbg("initialize first.");
  110. return -1;
  111. }
  112. ISensorCollection* pSensorCollection = NULL;
  113. HRESULT hr = m_pSensorManager->GetSensorsByCategory(SENSOR_CATEGORY_ALL, &pSensorCollection);
  114. if (FAILED(hr))
  115. {
  116. Dbg("Unable to find any sensor on the computer.");
  117. return -1;
  118. }
  119. ULONG ulCount = 0;
  120. hr = pSensorCollection->GetCount(&ulCount);
  121. if (FAILED(hr) || ulCount < 1)
  122. {
  123. Dbg("no sensor");
  124. return -1;
  125. }
  126. //MessageBox(0,0,0,0);
  127. for (int i = 0; i < ulCount; ++i)
  128. {
  129. ISensor *pSensor;
  130. Dbg("i %d",i);
  131. hr = pSensorCollection->GetAt(i,&pSensor);
  132. if (SUCCEEDED(hr))
  133. {
  134. SENSOR_TYPE_ID id;
  135. hr = pSensor->GetType(&id);
  136. ISensorDataReport *pData;
  137. PROPVARIANT var;
  138. if (IsEqualGUID(id,m_mapGUID[AMBIENT_LIGHT]))
  139. {
  140. Dbg("is light");
  141. m_pLightSensor = pSensor;
  142. m_dwSensorsHave |= AMBIENT_LIGHT;
  143. //m_pLightEvtClass = new MyEvents();
  144. //hr = m_pLightEvtClass->QueryInterface(IID_PPV_ARGS(&m_pLightEvents));
  145. //if (SUCCEEDED(hr))
  146. //{
  147. // Dbg("to set light event");
  148. // hr = m_pLightSensor->SetEventSink(m_pLightEvents);
  149. // Dbg("set light event %d",hr);
  150. //GUID pguid[2];
  151. //pguid[0] = SENSOR_EVENT_DATA_UPDATED;
  152. //pguid[1] = SENSOR_EVENT_STATE_CHANGED;
  153. //Dbg("to set event interest");
  154. //hr = m_pLightSensor->SetEventInterest(pguid, 2);
  155. //Dbg("set event interest %d",hr);
  156. //GUID pguid[1];
  157. //pguid[0] = SENSOR_EVENT_DATA_UPDATED;
  158. //pguid[1] = SENSOR_EVENT_STATE_CHANGED;
  159. //Dbg("to set event interest");
  160. //hr = m_pLightSensor->SetEventInterest(pguid, 1);
  161. //Dbg("set event interest %d,%d",hr,GetLastError());
  162. //hr = SetCurrentReportInterval(m_pLightSensor,1000);
  163. //Dbg("set light interval %d",hr);
  164. //Sleep(10000);
  165. //}
  166. }
  167. else if (IsEqualGUID(id,m_mapGUID[GYROMETER_3D]))
  168. {
  169. Dbg("is gyro meter 3D");
  170. m_dwSensorsHave |= GYROMETER_3D;
  171. m_pGyroMeter3DSensor = pSensor;
  172. //m_pGyroMeter3DClass = new MyEvents(this);
  173. //hr = m_pGyroMeter3DClass->QueryInterface(IID_PPV_ARGS(&m_pGyroMeter3DEvents));
  174. //if (SUCCEEDED(hr))
  175. //{
  176. // Dbg("to set gyro meter 3D event");
  177. // hr = m_pGyroMeter3DSensor->SetEventSink(m_pGyroMeter3DEvents);
  178. // Dbg("set gyro 3D event %d",hr);
  179. // //hr = SetCurrentReportInterval(m_pGyroMeter3DSensor,1000);
  180. // //Dbg("set gyro interval %d",hr);
  181. //}
  182. }
  183. else if (IsEqualGUID(id,m_mapGUID[COMPASS_3D]))
  184. {
  185. Dbg("is compass 3d.");
  186. m_dwSensorsHave |= COMPASS_3D;
  187. m_pCompass3DSensor = pSensor;
  188. }
  189. else if (IsEqualGUID(id,m_mapGUID[INCLINOMETER_3D]))
  190. {
  191. Dbg("is inclinometer 3D");
  192. m_dwSensorsHave |= INCLINOMETER_3D;
  193. m_pInclinoMeter3DSensor = pSensor;
  194. //m_pInclinoMeter3DClass = new MyEvents(this);
  195. //hr = m_pGyroMeter3DClass->QueryInterface(IID_PPV_ARGS(&m_pInclinoMeter3DEvents));
  196. //if (SUCCEEDED(hr))
  197. //{
  198. // Dbg("to set inclinometer 3D event");
  199. // hr = m_pInclinoMeter3DSensor->SetEventSink(m_pInclinoMeter3DEvents);
  200. // Dbg("set inclinometer event %d",hr);
  201. // //hr = SetCurrentReportInterval(m_pInclinoMeter3DSensor,1000);
  202. // //Dbg("set inclinometer interval %d",hr);
  203. //}
  204. }
  205. else if (IsEqualGUID(id,m_mapGUID[ACCELEROMETER_3D]))
  206. {
  207. Dbg("is accelerometer 3D.");
  208. m_dwSensorsHave |= ACCELEROMETER_3D;
  209. m_pAcceleroMeter3DSensor = pSensor;
  210. }
  211. else
  212. Dbg("sensor haven't be predefined? Er...");
  213. }
  214. }
  215. CSmartPointer<IConfigInfo> spConfig;
  216. ErrorCodeEnum err = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  217. if (err != Error_Succeed) {
  218. LOG_TRACE("open cfg file failed!");
  219. return 1;
  220. }
  221. spConfig->ReadConfigValueInt("init","LightVar",m_lightVar);
  222. spConfig->ReadConfigValueInt("init","CompassVar",m_compassVar);
  223. spConfig->ReadConfigValueInt("init","GyroVar",m_gyroVar);
  224. spConfig->ReadConfigValueInt("init","InclineVar",m_inclineVar);
  225. spConfig->ReadConfigValueInt("init","AcceleroVar",m_acceleroVar);
  226. Dbg("sensors:%d",m_dwSensorsHave);
  227. return 0;
  228. }
  229. //working
  230. int CSensorsFSM::DoWork()
  231. {
  232. ITimerListener *pListener = new TimerOutHelper<CSensorsFSM>(this, &CSensorsFSM::OnCheckTimeTimeout);
  233. Dbg("set timer");
  234. GetEntityBase()->GetFunction()->SetTimer(HEALTHMANAGER_TIMER_ID, pListener, HEALTHMANAGER_TIMER_INTERVAL);
  235. return 0;
  236. }
  237. void CSensorsFSM::OnCheckTimeTimeout()
  238. {
  239. GetAmbientLightData();
  240. GetCompass3DData();
  241. GetGyroMeter3DData();
  242. GetAcceleroMeter3DData();
  243. GetInclinoMeter3DData();
  244. GetEntityBase()->GetFunction()->ResetTimer(HEALTHMANAGER_TIMER_ID, HEALTHMANAGER_TIMER_INTERVAL);
  245. }
  246. HRESULT CSensorsFSM::SetCurrentReportInterval(ISensor* pSensor, ULONG ulNewInterval)
  247. {
  248. //assert(pSensor);
  249. HRESULT hr = S_OK;
  250. IPortableDeviceValues* pPropsToSet = NULL; // Input
  251. IPortableDeviceValues* pPropsReturn = NULL; // Output
  252. // Create the input object.
  253. hr = CoCreateInstance(__uuidof(PortableDeviceValues),
  254. NULL,
  255. CLSCTX_INPROC_SERVER,
  256. IID_PPV_ARGS(&pPropsToSet));
  257. if(SUCCEEDED(hr))
  258. {
  259. // Add the current report interval property.
  260. hr = pPropsToSet->SetUnsignedIntegerValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, ulNewInterval);
  261. }
  262. if(SUCCEEDED(hr))
  263. {
  264. // Only setting a single property, here.
  265. hr = pSensor->SetProperties(pPropsToSet, &pPropsReturn);
  266. }
  267. // Test for failure.
  268. if(hr == S_FALSE)
  269. {
  270. HRESULT hrError = S_OK;
  271. // Check results for failure.
  272. hr = pPropsReturn->GetErrorValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, &hrError);
  273. if(SUCCEEDED(hr))
  274. {
  275. // Print an error message.
  276. wprintf_s(L"\nSetting current report interval failed with error 0x%X\n", hrError);
  277. // Return the error code.
  278. hr = hrError;
  279. }
  280. }
  281. else if(hr == E_ACCESSDENIED)
  282. {
  283. // No permission. Take appropriate action.
  284. }
  285. //SafeRelease(&pPropsToSet);
  286. //SafeRelease(&pPropsReturn);
  287. return hr;
  288. }
  289. STDMETHODIMP MyEvents::OnDataUpdated(ISensor *pSensor,ISensorDataReport *pNewData)
  290. {
  291. HRESULT hr = S_OK;
  292. if(NULL == pNewData ||
  293. NULL == pSensor)
  294. {
  295. return E_INVALIDARG;
  296. }
  297. SENSOR_TYPE_ID id;
  298. hr = pSensor->GetType(&id);
  299. ISensorDataReport *pData;
  300. PROPVARIANT var;
  301. Dbg("on data id %d",id.Data1);
  302. if (IsEqualGUID(id,m_mapGUID[AMBIENT_LIGHT]))
  303. OnAmbientLightUpdate(pSensor,pNewData);
  304. else if (IsEqualGUID(id,m_mapGUID[GYROMETER_3D]))
  305. OnGyroMeter3DUpdate(pSensor,pNewData);
  306. else if (IsEqualGUID(id,m_mapGUID[COMPASS_3D]))
  307. OnCompass3DUpdate(pSensor,pNewData);
  308. else if (IsEqualGUID(id,m_mapGUID[INCLINOMETER_3D]))
  309. OnInclinoMeter3DUpdate(pSensor,pNewData);
  310. else if (IsEqualGUID(id,m_mapGUID[ACCELEROMETER_3D]))
  311. OnAcceleroMeter3DUpdate(pSensor,pNewData);
  312. return hr;
  313. }
  314. void MyEvents::OnAmbientLightUpdate(ISensor *pSensor,ISensorDataReport *pNewData)
  315. {
  316. PROPVARIANT var = {};
  317. HRESULT hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,&var);
  318. if (SUCCEEDED(hr))
  319. {
  320. if (var.vt == VT_R4)
  321. {
  322. Dbg("light %f",var.fltVal);
  323. }
  324. }
  325. PropVariantClear(&var);
  326. }
  327. void MyEvents::OnGyroMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData)
  328. {
  329. PROPVARIANT var = {};
  330. HRESULT hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_X_DEGREES_PER_SECOND_SQUARED,&var);
  331. if (SUCCEEDED(hr))
  332. {
  333. //Dbg("gyro meter 3d(X) var.vt %d",var.vt);
  334. if (var.vt == VT_R8)
  335. {
  336. Dbg("gyro(x) %f",var.fltVal);
  337. }
  338. }
  339. else
  340. Dbg("no gyro x");
  341. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Y_DEGREES_PER_SECOND_SQUARED,&var);
  342. if (SUCCEEDED(hr))
  343. {
  344. //Dbg("gyro meter 3d(Y) var.vt %d",var.vt);
  345. if (var.vt == VT_R8)
  346. {
  347. Dbg("gyro(y) %f",var.fltVal);
  348. }
  349. }
  350. else
  351. Dbg("no gyro y");
  352. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Z_DEGREES_PER_SECOND_SQUARED,&var);
  353. if (SUCCEEDED(hr))
  354. {
  355. //Dbg("gyro meter 3d(Z) var.vt %d",var.vt);
  356. if (var.vt == VT_R8)
  357. {
  358. Dbg("gyro(z) %f",var.fltVal);
  359. }
  360. }
  361. else
  362. Dbg("no gyro z");
  363. PropVariantClear(&var);
  364. }
  365. void MyEvents::OnCompass3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData)
  366. {
  367. PROPVARIANT var = {};
  368. HRESULT hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_X_DEGREES,&var);
  369. if (SUCCEEDED(hr))
  370. {
  371. if (var.vt == VT_R4)
  372. {
  373. Dbg("compass(x) %f",var.fltVal);
  374. }
  375. }
  376. else
  377. Dbg("no compass x");
  378. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_Y_DEGREES,&var);
  379. if (SUCCEEDED(hr))
  380. {
  381. if (var.vt == VT_R4)
  382. {
  383. Dbg("compass(y) %f",var.fltVal);
  384. }
  385. }
  386. else
  387. Dbg("no compass y");
  388. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_Z_DEGREES,&var);
  389. if (SUCCEEDED(hr))
  390. {
  391. if (var.vt == VT_R4)
  392. {
  393. Dbg("compass(z) %f",var.fltVal);
  394. }
  395. }
  396. else
  397. Dbg("no compass z");
  398. PropVariantClear(&var);
  399. }
  400. void MyEvents::OnInclinoMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData)
  401. {
  402. PROPVARIANT var = {};
  403. HRESULT hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_TILT_X_DEGREES,&var);
  404. if (SUCCEEDED(hr))
  405. {
  406. //Dbg("inclinometer 3d(X) var.vt %d",var.vt);
  407. if (var.vt == VT_R4)
  408. {
  409. Dbg("inclinometer(x) %f",var.fltVal);
  410. }
  411. }
  412. else
  413. Dbg("no inclinometer x");
  414. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_TILT_Y_DEGREES,&var);
  415. if (SUCCEEDED(hr))
  416. {
  417. //Dbg("inclinometer 3d(Y) var.vt %d",var.vt);
  418. if (var.vt == VT_R4)
  419. {
  420. Dbg("inclinometer(y) %f",var.fltVal);
  421. }
  422. }
  423. else
  424. Dbg("no inclinometer y");
  425. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_TILT_Z_DEGREES,&var);
  426. if (SUCCEEDED(hr))
  427. {
  428. //Dbg("inclinometer 3d(Z) var.vt %d",var.vt);
  429. if (var.vt == VT_R4)
  430. {
  431. Dbg("inclinometer(z) %f",var.fltVal);
  432. }
  433. }
  434. else
  435. Dbg("no inclinometer z");
  436. PropVariantClear(&var);
  437. }
  438. void MyEvents::OnAcceleroMeter3DUpdate(ISensor *pSensor,ISensorDataReport *pNewData)
  439. {
  440. PROPVARIANT var = {};
  441. HRESULT hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_X_G,&var);
  442. if (SUCCEEDED(hr))
  443. {
  444. if (var.vt == VT_R8)
  445. {
  446. Dbg("accelerometer(x) %f",var.fltVal);
  447. }
  448. }
  449. else
  450. Dbg("no accelerometer x");
  451. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Y_G,&var);
  452. if (SUCCEEDED(hr))
  453. {
  454. if (var.vt == VT_R8)
  455. {
  456. Dbg("accelerometer(y) %f",var.fltVal);
  457. }
  458. }
  459. else
  460. Dbg("no accelerometer y");
  461. hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Z_G,&var);
  462. if (SUCCEEDED(hr))
  463. {
  464. if (var.vt == VT_R8)
  465. {
  466. Dbg("accelerometer(z) %f",var.fltVal);
  467. }
  468. }
  469. else
  470. Dbg("no accelerometer z");
  471. PropVariantClear(&var);
  472. }
  473. void CSensorsFSM::GetAmbientLightData()
  474. {
  475. ISensorDataReport *pLightData;
  476. m_pLightSensor->GetData(&pLightData);
  477. PROPVARIANT var = {};
  478. HRESULT hr = pLightData->GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,&var);
  479. if (SUCCEEDED(hr))
  480. {
  481. if (var.vt == VT_R4)
  482. {
  483. Dbg("light %f",var.fltVal);
  484. FindSensorDataChange(AMBIENT_LIGHT,var.fltVal,0,0,0);
  485. m_mapLastValue[AMBIENT_LIGHT].dwData = var.fltVal;
  486. }
  487. }
  488. PropVariantClear(&var);
  489. }
  490. void CSensorsFSM::GetGyroMeter3DData()
  491. {
  492. ISensorDataReport *pGyroMeter3DData;
  493. m_pGyroMeter3DSensor->GetData(&pGyroMeter3DData);
  494. double x,y,z;
  495. x = y = z = 0;
  496. PROPVARIANT var = {};
  497. HRESULT hr = pGyroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_X_DEGREES_PER_SECOND_SQUARED,&var);
  498. if (SUCCEEDED(hr))
  499. {
  500. //Dbg("gyro meter 3d(X) var.vt %d",var.vt);
  501. if (var.vt == VT_R8)
  502. {
  503. Dbg("gyro(x) %f",var.dblVal);
  504. x = var.dblVal;
  505. }
  506. }
  507. else
  508. Dbg("no gyro x");
  509. hr = pGyroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Y_DEGREES_PER_SECOND_SQUARED,&var);
  510. if (SUCCEEDED(hr))
  511. {
  512. //Dbg("gyro meter 3d(Y) var.vt %d",var.vt);
  513. if (var.vt == VT_R8)
  514. {
  515. Dbg("gyro(y) %f",var.dblVal);
  516. y = var.dblVal;
  517. }
  518. }
  519. else
  520. Dbg("no gyro y");
  521. hr = pGyroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ANGULAR_ACCELERATION_Z_DEGREES_PER_SECOND_SQUARED,&var);
  522. if (SUCCEEDED(hr))
  523. {
  524. //Dbg("gyro meter 3d(Z) var.vt %d",var.vt);
  525. if (var.vt == VT_R8)
  526. {
  527. Dbg("gyro(z) %f",var.dblVal);
  528. z = var.dblVal;
  529. }
  530. }
  531. else
  532. Dbg("no gyro z");
  533. hr = pGyroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_SPEED_METERS_PER_SECOND,&var);
  534. if (SUCCEEDED(hr))
  535. {
  536. if (var.vt == VT_R8)
  537. {
  538. Dbg("gyro(speed) %f",var.dblVal);
  539. }
  540. }
  541. else
  542. Dbg("no gyro speed");
  543. hr = pGyroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_MOTION_STATE,&var);
  544. if (SUCCEEDED(hr))
  545. {
  546. if (var.vt == VT_BOOL)
  547. {
  548. Dbg("gyro(motion state) %f",var.boolVal);
  549. }
  550. }
  551. else
  552. Dbg("no gyro motion state");
  553. FindSensorDataChange(GYROMETER_3D,0,x,y,z);
  554. if (x != 0)
  555. m_mapLastValue[GYROMETER_3D].dwX = x;
  556. if (y != 0)
  557. m_mapLastValue[GYROMETER_3D].dwY = y;
  558. if (z != 0)
  559. m_mapLastValue[GYROMETER_3D].dwZ = z;
  560. PropVariantClear(&var);
  561. }
  562. void CSensorsFSM::GetCompass3DData()
  563. {
  564. ISensorDataReport *pCompass3DData;
  565. m_pCompass3DSensor->GetData(&pCompass3DData);
  566. PROPVARIANT var = {};
  567. HRESULT hr = pCompass3DData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_X_DEGREES,&var);
  568. if (SUCCEEDED(hr))
  569. {
  570. if (var.vt == VT_R4)
  571. {
  572. Dbg("compass(x) %f",var.fltVal);
  573. }
  574. }
  575. else
  576. Dbg("no compass x");
  577. hr = pCompass3DData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_Y_DEGREES,&var);
  578. if (SUCCEEDED(hr))
  579. {
  580. if (var.vt == VT_R4)
  581. {
  582. Dbg("compass(y) %f",var.fltVal);
  583. }
  584. }
  585. else
  586. Dbg("no compass y");
  587. hr = pCompass3DData->GetSensorValue(SENSOR_DATA_TYPE_MAGNETIC_HEADING_Z_DEGREES,&var);
  588. if (SUCCEEDED(hr))
  589. {
  590. if (var.vt == VT_R4)
  591. {
  592. Dbg("compass(z) %f",var.fltVal);
  593. }
  594. }
  595. else
  596. Dbg("no compass z");
  597. PropVariantClear(&var);
  598. }
  599. void CSensorsFSM::GetInclinoMeter3DData()
  600. {
  601. ISensorDataReport *pInclinoMeter3DData;
  602. m_pInclinoMeter3DSensor->GetData(&pInclinoMeter3DData);
  603. double x,y,z;
  604. x = y = z = 0;
  605. PROPVARIANT var = {};
  606. HRESULT hr = pInclinoMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_TILT_X_DEGREES,&var);
  607. if (SUCCEEDED(hr))
  608. {
  609. //Dbg("inclinometer 3d(X) var.vt %d",var.vt);
  610. if (var.vt == VT_R4)
  611. {
  612. Dbg("inclinometer(x) %f",var.fltVal);
  613. x = var.fltVal;
  614. }
  615. }
  616. else
  617. Dbg("no inclinometer x");
  618. hr = pInclinoMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_TILT_Y_DEGREES,&var);
  619. if (SUCCEEDED(hr))
  620. {
  621. //Dbg("inclinometer 3d(Y) var.vt %d",var.vt);
  622. if (var.vt == VT_R4)
  623. {
  624. Dbg("inclinometer(y) %f",var.fltVal);
  625. y = var.fltVal;
  626. }
  627. }
  628. else
  629. Dbg("no inclinometer y");
  630. hr = pInclinoMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_TILT_Z_DEGREES,&var);
  631. if (SUCCEEDED(hr))
  632. {
  633. //Dbg("inclinometer 3d(Z) var.vt %d",var.vt);
  634. if (var.vt == VT_R4)
  635. {
  636. Dbg("inclinometer(z) %f",var.fltVal);
  637. z = var.fltVal;
  638. }
  639. }
  640. else
  641. Dbg("no inclinometer z");
  642. FindSensorDataChange(INCLINOMETER_3D,0,x,y,z);
  643. if (x != 0)
  644. m_mapLastValue[INCLINOMETER_3D].dwX = x;
  645. if (y != 0)
  646. m_mapLastValue[INCLINOMETER_3D].dwY = y;
  647. if (z != 0)
  648. m_mapLastValue[INCLINOMETER_3D].dwZ = z;
  649. PropVariantClear(&var);
  650. }
  651. void CSensorsFSM::GetAcceleroMeter3DData()
  652. {
  653. ISensorDataReport *pAcceleroMeter3DData;
  654. m_pAcceleroMeter3DSensor->GetData(&pAcceleroMeter3DData);
  655. double x,y,z;
  656. x=y=z=0;
  657. PROPVARIANT var = {};
  658. HRESULT hr = pAcceleroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_X_G,&var);
  659. if (SUCCEEDED(hr))
  660. {
  661. if (var.vt == VT_R8)
  662. {
  663. Dbg("accelerometer(x) %f",var.dblVal);
  664. x = var.dblVal;
  665. }
  666. }
  667. else
  668. Dbg("no accelerometer x");
  669. hr = pAcceleroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Y_G,&var);
  670. if (SUCCEEDED(hr))
  671. {
  672. if (var.vt == VT_R8)
  673. {
  674. Dbg("accelerometer(y) %f",var.dblVal);
  675. y = var.dblVal;
  676. }
  677. }
  678. else
  679. Dbg("no accelerometer y");
  680. hr = pAcceleroMeter3DData->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Z_G,&var);
  681. if (SUCCEEDED(hr))
  682. {
  683. if (var.vt == VT_R8)
  684. {
  685. Dbg("accelerometer(z) %f",var.dblVal);
  686. z = var.dblVal;
  687. }
  688. }
  689. else
  690. Dbg("no accelerometer z");
  691. FindSensorDataChange(ACCELEROMETER_3D,0,x,y,z);
  692. if (x != 0)
  693. m_mapLastValue[ACCELEROMETER_3D].dwX = x;
  694. if (y != 0)
  695. m_mapLastValue[ACCELEROMETER_3D].dwY = y;
  696. if (z != 0)
  697. m_mapLastValue[ACCELEROMETER_3D].dwZ = z;
  698. PropVariantClear(&var);
  699. }
  700. void CSensorsFSM::FindSensorDataChange(SensorType eType,double dwValue1,double dwX,double dwY,double dwZ)
  701. {
  702. bool bChanged = false;
  703. switch(eType)
  704. {
  705. case AMBIENT_LIGHT:
  706. if (m_mapLastValue[eType].dwData != 0)
  707. {
  708. if (dwValue1 > m_mapLastValue[eType].dwData && dwValue1 > (m_mapLastValue[eType].dwData+m_lightVar))
  709. {
  710. Dbg("brighttttttt");
  711. LogEvent(Severity_Middle,LOG_EVT_SENSORS_LIGHT_BRIGHT,"ambient light is more brighter.");
  712. }
  713. else if (dwValue1 < m_mapLastValue[eType].dwData && (dwValue1+m_lightVar) < m_mapLastValue[eType].dwData)
  714. {
  715. Dbg("darkerrrrrr");
  716. LogEvent(Severity_Middle,LOG_EVT_SENSORS_LIGHT_DARK,"ambient light is more darker.");
  717. }
  718. }
  719. break;
  720. case GYROMETER_3D:
  721. if (m_mapLastValue[eType].dwX != 0 || m_mapLastValue[eType].dwY != 0 || m_mapLastValue[eType].dwZ != 0)
  722. {
  723. bChanged = Is3DDataChanged(eType,dwX,dwY,dwZ);
  724. if (bChanged)
  725. {
  726. Dbg("gyro meter change");
  727. LogEvent(Severity_Middle,LOG_EVT_SENSORS_DYROMETER_CHANGE,"Gyro meter 3d changed.");
  728. }
  729. }
  730. break;
  731. case COMPASS_3D:
  732. if (m_mapLastValue[eType].dwX != 0 || m_mapLastValue[eType].dwY != 0 || m_mapLastValue[eType].dwZ != 0)
  733. {
  734. bChanged = Is3DDataChanged(eType,dwX,dwY,dwZ);
  735. if (bChanged)
  736. LogEvent(Severity_Middle,LOG_EVT_SENSORS_COMPASS_CHANGE,"compass 3d changed.");
  737. }
  738. break;
  739. case INCLINOMETER_3D:
  740. if (m_mapLastValue[eType].dwX != 0 || m_mapLastValue[eType].dwY != 0 || m_mapLastValue[eType].dwZ != 0)
  741. {
  742. bChanged = Is3DDataChanged(eType,dwX,dwY,dwZ);
  743. if (bChanged)
  744. {
  745. Dbg("inclinometer change");
  746. LogEvent(Severity_Middle,LOG_EVT_SENSORS_INCLINEMETER_CHANGE,"inclinometer 3d changed.");
  747. }
  748. }
  749. break;
  750. case ACCELEROMETER_3D:
  751. if (m_mapLastValue[eType].dwX != 0 || m_mapLastValue[eType].dwY != 0 || m_mapLastValue[eType].dwZ != 0)
  752. {
  753. bChanged = Is3DDataChanged(eType,dwX,dwY,dwZ);
  754. if (bChanged)
  755. LogEvent(Severity_Middle,LOG_EVT_SENSORS_ACCELEROMETER_CHANGE,"accelerometer 3d changed.");
  756. }
  757. break;
  758. default:
  759. break;
  760. }
  761. }
  762. bool CSensorsFSM::Is3DDataChanged(SensorType eType,double dwX,double dwY,double dwZ)
  763. {
  764. bool bChanged = false;
  765. int iVar = 0;
  766. switch(eType)
  767. {
  768. case COMPASS_3D:
  769. iVar = m_compassVar;
  770. break;
  771. case GYROMETER_3D:
  772. iVar = m_gyroVar;
  773. break;
  774. case INCLINOMETER_3D:
  775. iVar = m_inclineVar;
  776. break;
  777. case ACCELEROMETER_3D:
  778. iVar = m_acceleroVar;
  779. break;
  780. default:
  781. Dbg("Is3DDataChanged unknown sensor type.");
  782. return false;
  783. }
  784. if (m_mapLastValue[eType].dwX != 0 || m_mapLastValue[eType].dwY != 0 || m_mapLastValue[eType].dwZ != 0)
  785. {
  786. if (dwX != 0)
  787. if (dwX > (m_mapLastValue[eType].dwX + iVar) || (dwX+iVar) < m_mapLastValue[eType].dwX)
  788. bChanged = true;
  789. if (dwY != 0)
  790. if (dwY > (m_mapLastValue[eType].dwY + iVar) || (dwY+iVar) < m_mapLastValue[eType].dwY)
  791. bChanged = true;
  792. if (dwZ != 0)
  793. if (dwZ > (m_mapLastValue[eType].dwZ + iVar) || (dwZ+iVar) < m_mapLastValue[eType].dwZ)
  794. bChanged = true;
  795. }
  796. return bChanged;
  797. }
  798. ErrorCodeEnum CSensorsFSM::LoadGnssVendorDLL()
  799. {
  800. //oiyang@20200226
  801. LOG_FUNCTION();
  802. CSimpleStringA csDepPath(""), csBackslash("\\"), dllName(""), tmpDLLVersion("");
  803. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", m_csFWBVendor);
  804. GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
  805. if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1
  806. tmpDLLVersion = "8.1";
  807. ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  808. dllName = csDepPath + csBackslash + "gnss." + m_csFWBVendor + "." + tmpDLLVersion + ".dll";//oiltmp
  809. Dbg("load vendor dll %s", (const char*)dllName);
  810. m_hVerdorDll = LoadLibraryA(dllName);
  811. if (m_hVerdorDll == NULL)
  812. {
  813. Dbg("Load dll failed.%d", GetLastError());
  814. //GetEntityBase()->GetFunction()->ShowFatalError("加载厂商适配器失败!请确定是否没绑定蓝牙多合一。");
  815. return Error_DevLoadFileFailed;
  816. }
  817. if ((CreateDevComponent = (lpCreateDevCom)GetProcAddress(m_hVerdorDll, "CreateDevComponent")) == NULL)
  818. {
  819. Dbg("Get CreateDevComponent failed.");
  820. return Error_DevLoadFileFailed;
  821. }
  822. if ((ReleaseDevComponent = (lpReleaseDevCom)GetProcAddress(m_hVerdorDll, "ReleaseDevComponent")) == NULL)
  823. {
  824. Dbg("Get ReleaseDevComponent failed.");
  825. return Error_DevLoadFileFailed;
  826. }
  827. if (m_pGnssClass == NULL)
  828. {
  829. if (CreateDevComponent((DeviceBaseClass * &)m_pGnssClass) != Error_Succeed)
  830. {
  831. Dbg("CreateDevComponent failed.");
  832. }
  833. }
  834. Dbg("Create vendor handle suc.");
  835. GnssClass* pxx = (GnssClass*)m_pGnssClass;
  836. ErrorCodeEnum eErrDev = m_pGnssClass->DevOpen(0, 0);
  837. if (eErrDev == Error_Succeed)
  838. {
  839. Dbg("定位模块打开成功。");
  840. DoGetGnssTask *pTask = new DoGetGnssTask(this);
  841. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  842. return Error_Succeed;
  843. }
  844. else
  845. {
  846. DevErrorInfo errInfo;
  847. ZeroMemory(errInfo.szErrMsg, sizeof(errInfo.szErrMsg));
  848. m_pGnssClass->GetLastErr(errInfo);
  849. Dbg("%x,%s", errInfo.dwErrMsgLen, errInfo.szErrMsg);
  850. return Error_DevCommFailed;
  851. }
  852. }
  853. void CSensorsFSM::DoGetGnss()
  854. {
  855. memset(&m_gnssInfo, 0, sizeof(GnssInfoStru));
  856. memset(&m_lastGnssInfo, 0, sizeof(GnssInfoStru));
  857. CHAR gnssMsg[128];
  858. memset(gnssMsg, 0, sizeof(gnssMsg));
  859. ErrorCodeEnum eErr = Error_Unexpect;
  860. while (1) {
  861. //struct GnssInfoStru
  862. //{
  863. // CHAR status; // GNSS数据有效性标志,'V' 无效, 'A' 有效
  864. // CHAR dateTime[14 + 1]; // 日期时间(北京时间), 格式为: YYYYMMDDHHMMSS
  865. // CHAR lat[20 + 1]; // 纬度,格式为: x,dd,mm.mmmm
  866. // // 其中: x为北纬或南纬指示:N - 北纬 S - 南纬
  867. // // dd - 度, mm.mmmm - 分
  868. // CHAR lon[20 + 1]; // 经度,格式为: y,ddd,mm.mmmm
  869. // // 其中: y 为东经或西经指示: E - 东经 W - 西经
  870. // // ddd - 度, mm.mmmm - 分
  871. //};
  872. eErr = m_pGnssClass->ReadGnssInfo(m_gnssInfo);
  873. if (eErr == Error_Succeed) {
  874. //[13:38:20.628][DEBUG] Debug: {A,20200730133916,N,29,44.6831,E,106,33.8813}
  875. Dbg("%c,%s,%s,%s", m_gnssInfo.status, m_gnssInfo.dateTime, m_gnssInfo.lat, m_gnssInfo.lon);
  876. int lenLatMax = (strlen(m_gnssInfo.lat) > 20) ? 20 : strlen(m_gnssInfo.lat);
  877. int lenLonMax = (strlen(m_gnssInfo.lon) > 20) ? 20 : strlen(m_gnssInfo.lon);
  878. if (m_gnssInfo.status == 'A' && (_strnicmp(m_lastGnssInfo.lat,m_gnssInfo.lat,lenLatMax) != 0
  879. || _strnicmp(m_lastGnssInfo.lon, m_gnssInfo.lon, lenLonMax) != 0))
  880. {
  881. strncpy_s(m_lastGnssInfo.lat, _countof(m_lastGnssInfo.lat), m_gnssInfo.lat, lenLatMax);
  882. strncpy_s(m_lastGnssInfo.lon, _countof(m_lastGnssInfo.lon), m_gnssInfo.lon, lenLonMax);
  883. sprintf_s(gnssMsg, "%s,lat:%s,lon:%s", m_gnssInfo.dateTime, m_gnssInfo.lat, m_gnssInfo.lon);
  884. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_SENSORS_GNSS_CHANGE, gnssMsg);
  885. memset(gnssMsg, 0, sizeof(gnssMsg));
  886. }
  887. }
  888. Sleep(1000 * 60);
  889. }
  890. }