Device.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. #pragma once
  2. #include <string>
  3. #include <queue>
  4. #include <map>
  5. #include <mutex>
  6. #include "AlarmDefine.h"
  7. #ifdef DEBUG_202
  8. #define MAX_SAVE_TIME_MILLI 259200000 //十分钟
  9. #define MAX_SAVE_TIME_SECOND 259200 //五分钟
  10. #else
  11. //缓冲数据 1小时 毫秒
  12. #define MAX_SAVE_TIME_MILLI 300000 //十分钟
  13. #define MAX_SAVE_TIME_SECOND 300 //五分钟
  14. #endif // DEBUG_202
  15. enum class SENSOR_STATUS : int8_t
  16. {
  17. UNKONW = -1,
  18. ABNORMAL = 0,
  19. NORMAL = 1
  20. };
  21. class CDevice
  22. {
  23. public:
  24. CDevice();
  25. virtual ~CDevice();
  26. void Insert(int index, time_t time, int data0, int data1, int data2);
  27. //调用Insert数据插入完 来判断是否需要插入数据 返回false 不需要 返回true 需要
  28. inline bool CalcBInsertData(int index, time_t* time, int* data0, int* data1, int* data2)
  29. {
  30. lock_guard<mutex> lock(m_mtx);
  31. if (index == 0)
  32. return CalcBInsertData(m_mapSecondStatInfo00, m_mapSecondStatInfo01, m_mapSecondStatInfo02, time, data0, data1, data2);
  33. else if (index == 1)
  34. return CalcBInsertData(m_mapSecondStatInfo10, m_mapSecondStatInfo11, m_mapSecondStatInfo12, time, data0, data1, data2);
  35. else
  36. return CalcBInsertData(m_mapSecondStatInfo20, m_mapSecondStatInfo21, m_mapSecondStatInfo22, time, data0, data1, data2);
  37. }
  38. void LoadHist();
  39. std::map<time_t, int>* GetMapData(uint8_t idx, uint8_t no);
  40. std::map<time_t, tagSecondStatInfo>* GetStatInfo(uint8_t idx, uint8_t no);
  41. BOOL IsDeviceOnline(uint8_t idx, time_t tmNow, int inteval);
  42. inline BOOL GetSendStatInfo(time_t tmStart, time_t tmEnd, uint8_t idx,
  43. std::map<time_t, tagSecondStatInfo>& map0, std::map<time_t, tagSecondStatInfo>& map1, std::map<time_t, tagSecondStatInfo>& map2)
  44. {
  45. if (idx == 0)
  46. {
  47. if (m_mapSecondStatInfo00.size() == 0) return FALSE;
  48. for (auto i = tmStart; i < tmEnd; i++)
  49. {
  50. auto it0 = m_mapSecondStatInfo00.find(i);
  51. if (it0 == m_mapSecondStatInfo00.end()) continue;
  52. auto it1 = m_mapSecondStatInfo01.find(i);
  53. auto it2 = m_mapSecondStatInfo02.find(i);
  54. if (it1 == m_mapSecondStatInfo01.end() || it2 == m_mapSecondStatInfo02.end())
  55. {
  56. ASSERT(FALSE);
  57. }
  58. auto it00 = it0, it01 = it1, it02 = it2;
  59. for (; it00 != m_mapSecondStatInfo00.end();)
  60. {
  61. if (it00->first <= tmEnd)
  62. {
  63. it00++;
  64. it01++;
  65. it02++;
  66. }
  67. else
  68. {
  69. map0.insert(it0, it00);
  70. map1.insert(it1, it01);
  71. map2.insert(it2, it02);
  72. return TRUE;
  73. }
  74. }
  75. if (it0 != it00)
  76. {
  77. map0.insert(it0, it00);
  78. map1.insert(it1, it01);
  79. map2.insert(it2, it02);
  80. return TRUE;
  81. }
  82. }
  83. }
  84. else if (idx == 1)
  85. {
  86. if (m_mapSecondStatInfo10.size() == 0) return FALSE;
  87. for (auto i = tmStart; i < tmEnd; i++)
  88. {
  89. auto it0 = m_mapSecondStatInfo10.find(i);
  90. if (it0 == m_mapSecondStatInfo10.end()) continue;
  91. auto it1 = m_mapSecondStatInfo11.find(i);
  92. auto it2 = m_mapSecondStatInfo12.find(i);
  93. if (it1 == m_mapSecondStatInfo11.end() || it2 == m_mapSecondStatInfo12.end())
  94. {
  95. ASSERT(FALSE);
  96. }
  97. auto it00 = it0, it01 = it1, it02 = it2;
  98. for (; it00 != m_mapSecondStatInfo10.end();)
  99. {
  100. if (it00->first <= tmEnd)
  101. {
  102. it00++;
  103. it01++;
  104. it02++;
  105. }
  106. else
  107. {
  108. map0.insert(it0, it00);
  109. map1.insert(it1, it01);
  110. map2.insert(it2, it02);
  111. return TRUE;
  112. }
  113. }
  114. if (it0 != it00)
  115. {
  116. map0.insert(it0, it00);
  117. map1.insert(it1, it01);
  118. map2.insert(it2, it02);
  119. return TRUE;
  120. }
  121. }
  122. }
  123. else if (idx == 2)
  124. {
  125. if (m_mapSecondStatInfo20.size() == 0) return FALSE;
  126. for (auto i = tmStart; i < tmEnd; i++)
  127. {
  128. auto it0 = m_mapSecondStatInfo20.find(i);
  129. if (it0 == m_mapSecondStatInfo20.end()) continue;
  130. auto it1 = m_mapSecondStatInfo21.find(i);
  131. auto it2 = m_mapSecondStatInfo22.find(i);
  132. if (it1 == m_mapSecondStatInfo21.end() || it2 == m_mapSecondStatInfo22.end())
  133. {
  134. ASSERT(FALSE);
  135. }
  136. auto it00 = it0, it01 = it1, it02 = it2;
  137. for (; it00 != m_mapSecondStatInfo20.end();)
  138. {
  139. if (it00->first <= tmEnd)
  140. {
  141. it00++;
  142. it01++;
  143. it02++;
  144. }
  145. else
  146. {
  147. map0.insert(it0, it00);
  148. map1.insert(it1, it01);
  149. map2.insert(it2, it02);
  150. return TRUE;
  151. }
  152. }
  153. if (it0 != it00)
  154. {
  155. map0.insert(it0, it00);
  156. map1.insert(it1, it01);
  157. map2.insert(it2, it02);
  158. return TRUE;
  159. }
  160. }
  161. }
  162. return FALSE;
  163. }
  164. //新的接口
  165. inline bool Insert(const uint8_t idx, const __time64_t tmStartTime, const int step, const vector<int>& data0, const vector<int>& data1, const vector<int>& data2,
  166. const vector<bool> result, const size_t len, const SECOND_STAT_INFO& stSS1, const SECOND_STAT_INFO& stSS2, const SECOND_STAT_INFO& stSS3, uint8_t nNewNum, int bMakeup = false)
  167. {
  168. bool bSave = true;
  169. auto tmStartTimeSecond = tmStartTime / 1000;
  170. //TRACE("%s:%d %s\r\n", __FUNCTION__, __LINE__, CTime(tmStartTime / 1000).Format("%Y-%m-%d %H:%M:%S"));
  171. lock_guard<mutex> lock(m_mtx);
  172. if (nNewNum == 1)
  173. {
  174. switch (idx)
  175. {
  176. case 0:
  177. time(&m_tmUpdateTime0);
  178. if (m_mapSecondStatInfo00.size())
  179. {
  180. if (m_mapSecondStatInfo00.rbegin()->second.dif_val < 100 &&
  181. m_mapSecondStatInfo01.rbegin()->second.dif_val < 100 &&
  182. m_mapSecondStatInfo02.rbegin()->second.dif_val < 100 &&
  183. abs(m_mapSecondStatInfo00.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  184. abs(m_mapSecondStatInfo01.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  185. abs(m_mapSecondStatInfo02.rbegin()->second.min_val - stSS3.min_val) < 100)
  186. {
  187. bSave = false;
  188. break;
  189. }
  190. }
  191. map_resist_idx00[tmStartTime] = data0[0];
  192. map_resist_idx01[tmStartTime] = data1[0];
  193. map_resist_idx02[tmStartTime] = data2[0];
  194. m_mapSecondStatInfo00[tmStartTimeSecond] = stSS1;
  195. m_mapSecondStatInfo01[tmStartTimeSecond] = stSS2;
  196. m_mapSecondStatInfo02[tmStartTimeSecond] = stSS3;
  197. break;
  198. case 1:
  199. time(&m_tmUpdateTime1);
  200. if (m_mapSecondStatInfo10.size())
  201. {
  202. if (m_mapSecondStatInfo10.rbegin()->second.dif_val < 100 &&
  203. m_mapSecondStatInfo11.rbegin()->second.dif_val < 100 &&
  204. m_mapSecondStatInfo12.rbegin()->second.dif_val < 100 &&
  205. abs(m_mapSecondStatInfo10.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  206. abs(m_mapSecondStatInfo11.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  207. abs(m_mapSecondStatInfo12.rbegin()->second.min_val - stSS3.min_val) < 100)
  208. {
  209. bSave = false;
  210. break;
  211. }
  212. }
  213. map_resist_idx10[tmStartTime] = data0[0];
  214. map_resist_idx11[tmStartTime] = data1[0];
  215. map_resist_idx12[tmStartTime] = data2[0];
  216. m_mapSecondStatInfo10[tmStartTimeSecond] = stSS1;
  217. m_mapSecondStatInfo11[tmStartTimeSecond] = stSS2;
  218. m_mapSecondStatInfo12[tmStartTimeSecond] = stSS3;
  219. break;
  220. case 2:
  221. time(&m_tmUpdateTime2);
  222. if (m_mapSecondStatInfo20.size())
  223. {
  224. if (m_mapSecondStatInfo20.rbegin()->second.dif_val < 100 &&
  225. m_mapSecondStatInfo21.rbegin()->second.dif_val < 100 &&
  226. m_mapSecondStatInfo22.rbegin()->second.dif_val < 100 &&
  227. abs(m_mapSecondStatInfo20.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  228. abs(m_mapSecondStatInfo21.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  229. abs(m_mapSecondStatInfo22.rbegin()->second.min_val - stSS3.min_val) < 100)
  230. {
  231. bSave = false;
  232. break;
  233. }
  234. }
  235. map_resist_idx20[tmStartTime] = data0[0];
  236. map_resist_idx21[tmStartTime] = data1[0];
  237. map_resist_idx22[tmStartTime] = data2[0];
  238. m_mapSecondStatInfo20[tmStartTimeSecond] = stSS1;
  239. m_mapSecondStatInfo21[tmStartTimeSecond] = stSS2;
  240. m_mapSecondStatInfo22[tmStartTimeSecond] = stSS3;
  241. break;
  242. default:
  243. ASSERT(0);
  244. bSave = false;
  245. break;
  246. }
  247. }
  248. else
  249. {
  250. switch (idx)
  251. {
  252. case 0:
  253. {
  254. time(&m_tmUpdateTime0);
  255. for (auto i = 0; i < len; i++)
  256. {
  257. if (result[i] == false) continue;
  258. const auto tt = tmStartTime + i * step;
  259. map_resist_idx00[tt] = data0[i];
  260. map_resist_idx01[tt] = data1[i];
  261. map_resist_idx02[tt] = data2[i];
  262. }
  263. m_mapSecondStatInfo00[tmStartTimeSecond] = stSS1;
  264. m_mapSecondStatInfo01[tmStartTimeSecond] = stSS2;
  265. m_mapSecondStatInfo02[tmStartTimeSecond] = stSS3;
  266. //time(&m_tmMoveDetectTime0);//暂时不知道为啥赋值,先注释 2024年5月12日 这个时间20秒未更新,计算扳动数据
  267. if (!bMakeup)
  268. {
  269. {
  270. auto it = map_resist_idx00.begin();
  271. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  272. it = map_resist_idx00.erase(it);
  273. it = map_resist_idx01.begin();
  274. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  275. it = map_resist_idx01.erase(it);
  276. it = map_resist_idx02.begin();
  277. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  278. it = map_resist_idx02.erase(it);
  279. }
  280. {
  281. auto it = m_mapSecondStatInfo00.begin();
  282. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  283. it = m_mapSecondStatInfo00.erase(it);
  284. it = m_mapSecondStatInfo01.begin();
  285. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  286. it = m_mapSecondStatInfo01.erase(it);
  287. it = m_mapSecondStatInfo02.begin();
  288. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  289. it = m_mapSecondStatInfo02.erase(it);
  290. }
  291. }
  292. }
  293. break;
  294. case 1:
  295. {
  296. time(&m_tmUpdateTime1);
  297. for (auto i = 0; i < len; i++)
  298. {
  299. if (result[i] == false) continue;
  300. const auto tt = tmStartTime + i * step;
  301. map_resist_idx10[tt] = data0[i];
  302. map_resist_idx11[tt] = data1[i];
  303. map_resist_idx12[tt] = data2[i];
  304. }
  305. m_mapSecondStatInfo10[tmStartTimeSecond] = stSS1;
  306. m_mapSecondStatInfo11[tmStartTimeSecond] = stSS2;
  307. m_mapSecondStatInfo12[tmStartTimeSecond] = stSS3;
  308. //time(&m_tmMoveDetectTime1);//暂时不知道为啥赋值,先注释 2024年5月12日
  309. if (!bMakeup)
  310. {
  311. {
  312. auto it = map_resist_idx10.begin();
  313. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  314. it = map_resist_idx10.erase(it);
  315. it = map_resist_idx11.begin();
  316. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  317. it = map_resist_idx11.erase(it);
  318. it = map_resist_idx12.begin();
  319. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  320. it = map_resist_idx12.erase(it);
  321. }
  322. {
  323. auto it = m_mapSecondStatInfo10.begin();
  324. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  325. it = m_mapSecondStatInfo10.erase(it);
  326. it = m_mapSecondStatInfo11.begin();
  327. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  328. it = m_mapSecondStatInfo11.erase(it);
  329. it = m_mapSecondStatInfo12.begin();
  330. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  331. it = m_mapSecondStatInfo12.erase(it);
  332. }
  333. }
  334. }
  335. break;
  336. case 2:
  337. {
  338. time(&m_tmUpdateTime2);
  339. for (auto i = 0; i < len; i++)
  340. {
  341. if (result[i] == false) continue;
  342. const auto tt = tmStartTime + i * step;
  343. map_resist_idx20[tt] = data0[i];
  344. map_resist_idx21[tt] = data1[i];
  345. map_resist_idx22[tt] = data2[i];
  346. }
  347. m_mapSecondStatInfo20[tmStartTimeSecond] = stSS1;
  348. m_mapSecondStatInfo21[tmStartTimeSecond] = stSS2;
  349. m_mapSecondStatInfo22[tmStartTimeSecond] = stSS3;
  350. //time(&m_tmMoveDetectTime2);//暂时不知道为啥赋值,先注释 2024年5月12日
  351. if (!bMakeup)
  352. {
  353. {
  354. auto it = map_resist_idx20.begin();
  355. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  356. it = map_resist_idx20.erase(it);
  357. it = map_resist_idx21.begin();
  358. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  359. it = map_resist_idx21.erase(it);
  360. it = map_resist_idx22.begin();
  361. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  362. it = map_resist_idx22.erase(it);
  363. }
  364. {
  365. auto it = m_mapSecondStatInfo20.begin();
  366. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  367. it = m_mapSecondStatInfo20.erase(it);
  368. it = m_mapSecondStatInfo21.begin();
  369. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  370. it = m_mapSecondStatInfo21.erase(it);
  371. it = m_mapSecondStatInfo22.begin();
  372. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  373. it = m_mapSecondStatInfo22.erase(it);
  374. }
  375. }
  376. }
  377. break;
  378. default:
  379. ASSERT(0);
  380. bSave = false;
  381. break;
  382. }
  383. }
  384. //TRACE("%s:%d %s\r\n", __FUNCTION__, __LINE__, fmt::format("size 1:{} 2:{} 3:{}", m_mapSecondStatInfo00.size(), m_mapSecondStatInfo10.size(), m_mapSecondStatInfo20.size()).c_str());
  385. return bSave;
  386. }
  387. bool IsHaveTemp()const { return m_nTemperature != INT_MIN; }
  388. bool IsHaveHumi()const { return m_nHumidity != INT_MIN; }
  389. public:
  390. //设备唯一号
  391. std::string imei;
  392. //0通道数据
  393. std::map<time_t, int> map_resist_idx00; //毫秒数, 阻力值
  394. std::map<time_t, int> map_resist_idx01;
  395. std::map<time_t, int> map_resist_idx02;
  396. //秒数, 统计信息
  397. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo00;
  398. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo01;
  399. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo02;
  400. //1通道数据
  401. std::map<time_t, int> map_resist_idx10;
  402. std::map<time_t, int> map_resist_idx11;
  403. std::map<time_t, int> map_resist_idx12;
  404. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo10;
  405. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo11;
  406. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo12;
  407. //2通道数据
  408. std::map<time_t, int> map_resist_idx20;
  409. std::map<time_t, int> map_resist_idx21;
  410. std::map<time_t, int> map_resist_idx22;
  411. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo20;
  412. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo21;
  413. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo22;
  414. std::mutex m_mtx;
  415. //最后数据时间 设备时间
  416. COleDateTime m_odt_data0;
  417. COleDateTime m_odt_data1;
  418. COleDateTime m_odt_data2;
  419. //设备的心跳时间 跟牵引点数据时间有区别
  420. CTime m_ctUpdateTime = 0;
  421. SENSOR_STATUS m_sensor_status[9][2];
  422. //最后扳动的检测时间
  423. time_t m_tmMoveDetectTime0 = 0;
  424. time_t m_tmMoveDetectTime1 = 0;
  425. time_t m_tmMoveDetectTime2 = 0;
  426. int m_nTemperature = INT_MIN;
  427. int m_nHumidity = INT_MIN;
  428. inline time_t GetUpdateTime(uint8_t idx)
  429. {
  430. switch (idx)
  431. {
  432. case 0:
  433. return m_tmUpdateTime0;
  434. case 1:
  435. return m_tmUpdateTime1;
  436. case 2:
  437. return m_tmUpdateTime2;
  438. default:
  439. ASSERT(0);
  440. return 0;
  441. }
  442. }
  443. private:
  444. //最后数据时间 系统时间,用来判断是否在线
  445. time_t m_tmUpdateTime0 = time(0);
  446. time_t m_tmUpdateTime1 = time(0);
  447. time_t m_tmUpdateTime2 = time(0);
  448. private:
  449. inline static void InsertData(std::map<time_t, int>& map, time_t time, int val)
  450. {
  451. if (map.size() >= 2)
  452. {
  453. auto it = map.end();
  454. auto last = --it;
  455. auto second_last = --it;
  456. if (time / 1000 == last->first / 1000 && second_last->first / 1000 == time / 1000)
  457. {
  458. if (abs(last->second - val) <= 30 && abs(second_last->second - val) <= 30 && abs(last->second - second_last->second) <= 30)
  459. {
  460. #ifdef _DEBUG
  461. TRACE("%d:%d.%d\r\n", time % 100000, last->first % 100000, (time - last->first) % 1000);
  462. #endif // _DEBUG
  463. //都相等 先删除
  464. map.erase(last);
  465. }
  466. }
  467. else if (last->first == second_last->first + 980 && abs(last->second - second_last->second) <= 30)
  468. {
  469. map.erase(last);
  470. }
  471. map[time] = val;
  472. }
  473. else
  474. {
  475. map[time] = val;
  476. }
  477. auto it = map.begin();
  478. if ((time - it->first) > MAX_SAVE_TIME_MILLI) map.erase(it);
  479. }
  480. inline static void InsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo, time_t tTime, int val)
  481. {
  482. time_t tt = tTime / 1000; //换算成秒数
  483. if (mapSecondStatInfo[tt].first_val == INT_MIN)
  484. {
  485. mapSecondStatInfo[tt].first_val = val; //存储第一个值
  486. }
  487. auto& it = mapSecondStatInfo[tt];
  488. if (val > it.max_val)
  489. {
  490. it.max_val = val;
  491. it.max_time = tTime;
  492. }
  493. if (val < it.min_val)
  494. {
  495. it.min_val = val;
  496. it.min_time = tTime;
  497. }
  498. it.dif_val = it.max_val - it.min_val;
  499. it.sum_val += val;
  500. it.cout++;
  501. it.end_val = val;
  502. }
  503. inline static bool CalcBInsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo0,
  504. std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo1, std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo2,
  505. time_t* time, int* data0, int* data1, int* data2)
  506. {
  507. if (mapSecondStatInfo0.size() < 2) return false;
  508. //for (auto it = mapSecondStatInfo0.crbegin(); it != mapSecondStatInfo0.crend(); ++it) {
  509. // TRACE(fmt::format("{}:{}", it->first, it->second.dif_val).c_str());
  510. //}
  511. auto it0 = mapSecondStatInfo0.crbegin();
  512. auto it1 = mapSecondStatInfo1.crbegin();
  513. auto it2 = mapSecondStatInfo2.crbegin();
  514. if (it0->second.dif_val < 100 && it1->second.dif_val < 100 && it2->second.dif_val < 100)
  515. return false; //无波动
  516. if (it0->second.dif_val > 100)
  517. {
  518. auto it = it0;
  519. it++;
  520. if (it->second.dif_val < 100 && it0->first - it->first > 2 && it0->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  521. {
  522. *time = it0->first * 1000 - 20;
  523. *data0 = (++it0)->second.end_val;
  524. *data1 = (++it1)->second.end_val;
  525. *data2 = (++it2)->second.end_val;
  526. return true;
  527. }
  528. }
  529. else if (it1->second.dif_val > 100)
  530. {
  531. auto it = it1;
  532. it++;
  533. if (it->second.dif_val < 100 && it1->first - it->first > 2 && it1->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  534. {
  535. *time = it1->first * 1000 - 20;
  536. *data0 = (++it0)->second.end_val;
  537. *data1 = (++it1)->second.end_val;
  538. *data2 = (++it2)->second.end_val;
  539. return true;
  540. }
  541. }
  542. else if (it2->second.dif_val > 100)
  543. {
  544. auto it = it2;
  545. it++;
  546. if (it->second.dif_val < 100 && it2->first - it->first > 2 && it2->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  547. {
  548. *time = it2->first * 1000 - 20;
  549. *data0 = (++it0)->second.end_val;
  550. *data1 = (++it1)->second.end_val;
  551. *data2 = (++it2)->second.end_val;
  552. return true;
  553. }
  554. }
  555. return false;
  556. }
  557. };
  558. class CDeviceMng
  559. {
  560. private:
  561. CDeviceMng();
  562. ~CDeviceMng();
  563. public:
  564. static inline CDeviceMng* Instance() { return &obj; };
  565. CDevice* Insert(std::string imei);
  566. CDevice* Find(std::string imei);
  567. BOOL IsDeviceOnline(std::string imei, int8_t idx, int interval = 180); //默认3分钟判断是否在线
  568. private:
  569. static CDeviceMng obj;
  570. public:
  571. std::mutex m_mtx;
  572. //imei
  573. std::map<std::string, CDevice*> m_map_devices;
  574. };