Device.h 19 KB

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