Device.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  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 + 28800) % 86400 > 61)
  177. {
  178. switch (idx)
  179. {
  180. case 0:
  181. time(&m_tmUpdateTime0);
  182. if (m_mapSecondStatInfo00.size())
  183. {
  184. if (tmStartTimeSecond - m_mapSecondStatInfo00.rbegin()->first <3600 &&
  185. m_mapSecondStatInfo00.rbegin()->second.dif_val < 100 &&
  186. m_mapSecondStatInfo01.rbegin()->second.dif_val < 100 &&
  187. m_mapSecondStatInfo02.rbegin()->second.dif_val < 100 &&
  188. abs(m_mapSecondStatInfo00.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  189. abs(m_mapSecondStatInfo01.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  190. abs(m_mapSecondStatInfo02.rbegin()->second.min_val - stSS3.min_val) < 100)
  191. {
  192. bSave = false;
  193. break;
  194. }
  195. }
  196. map_resist_idx00[tmStartTime] = data0[0];
  197. map_resist_idx01[tmStartTime] = data1[0];
  198. map_resist_idx02[tmStartTime] = data2[0];
  199. m_mapSecondStatInfo00[tmStartTimeSecond] = stSS1;
  200. m_mapSecondStatInfo01[tmStartTimeSecond] = stSS2;
  201. m_mapSecondStatInfo02[tmStartTimeSecond] = stSS3;
  202. break;
  203. case 1:
  204. time(&m_tmUpdateTime1);
  205. if (m_mapSecondStatInfo10.size())
  206. {
  207. if (tmStartTimeSecond - m_mapSecondStatInfo10.rbegin()->first < 3600 &&
  208. m_mapSecondStatInfo10.rbegin()->second.dif_val < 100 &&
  209. m_mapSecondStatInfo11.rbegin()->second.dif_val < 100 &&
  210. m_mapSecondStatInfo12.rbegin()->second.dif_val < 100 &&
  211. abs(m_mapSecondStatInfo10.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  212. abs(m_mapSecondStatInfo11.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  213. abs(m_mapSecondStatInfo12.rbegin()->second.min_val - stSS3.min_val) < 100)
  214. {
  215. bSave = false;
  216. break;
  217. }
  218. }
  219. map_resist_idx10[tmStartTime] = data0[0];
  220. map_resist_idx11[tmStartTime] = data1[0];
  221. map_resist_idx12[tmStartTime] = data2[0];
  222. m_mapSecondStatInfo10[tmStartTimeSecond] = stSS1;
  223. m_mapSecondStatInfo11[tmStartTimeSecond] = stSS2;
  224. m_mapSecondStatInfo12[tmStartTimeSecond] = stSS3;
  225. break;
  226. case 2:
  227. time(&m_tmUpdateTime2);
  228. if (m_mapSecondStatInfo20.size())
  229. {
  230. if (tmStartTimeSecond - m_mapSecondStatInfo20.rbegin()->first < 3600 &&
  231. m_mapSecondStatInfo20.rbegin()->second.dif_val < 100 &&
  232. m_mapSecondStatInfo21.rbegin()->second.dif_val < 100 &&
  233. m_mapSecondStatInfo22.rbegin()->second.dif_val < 100 &&
  234. abs(m_mapSecondStatInfo20.rbegin()->second.min_val - stSS1.min_val) < 100 &&
  235. abs(m_mapSecondStatInfo21.rbegin()->second.min_val - stSS2.min_val) < 100 &&
  236. abs(m_mapSecondStatInfo22.rbegin()->second.min_val - stSS3.min_val) < 100)
  237. {
  238. bSave = false;
  239. break;
  240. }
  241. }
  242. map_resist_idx20[tmStartTime] = data0[0];
  243. map_resist_idx21[tmStartTime] = data1[0];
  244. map_resist_idx22[tmStartTime] = data2[0];
  245. m_mapSecondStatInfo20[tmStartTimeSecond] = stSS1;
  246. m_mapSecondStatInfo21[tmStartTimeSecond] = stSS2;
  247. m_mapSecondStatInfo22[tmStartTimeSecond] = stSS3;
  248. break;
  249. default:
  250. ASSERT(0);
  251. bSave = false;
  252. break;
  253. }
  254. }
  255. else
  256. {
  257. switch (idx)
  258. {
  259. case 0:
  260. {
  261. time(&m_tmUpdateTime0);
  262. for (auto i = 0; i < len; i++)
  263. {
  264. if (result[i] == false) continue;
  265. const auto tt = tmStartTime + i * step;
  266. map_resist_idx00[tt] = data0[i];
  267. map_resist_idx01[tt] = data1[i];
  268. map_resist_idx02[tt] = data2[i];
  269. }
  270. m_mapSecondStatInfo00[tmStartTimeSecond] = stSS1;
  271. m_mapSecondStatInfo01[tmStartTimeSecond] = stSS2;
  272. m_mapSecondStatInfo02[tmStartTimeSecond] = stSS3;
  273. //time(&m_tmMoveDetectTime0);//暂时不知道为啥赋值,先注释 2024年5月12日 这个时间20秒未更新,计算扳动数据
  274. if (!bMakeup)
  275. {
  276. {
  277. auto it = map_resist_idx00.begin();
  278. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  279. it = map_resist_idx00.erase(it);
  280. it = map_resist_idx01.begin();
  281. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  282. it = map_resist_idx01.erase(it);
  283. it = map_resist_idx02.begin();
  284. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  285. it = map_resist_idx02.erase(it);
  286. }
  287. {
  288. auto it = m_mapSecondStatInfo00.begin();
  289. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  290. it = m_mapSecondStatInfo00.erase(it);
  291. it = m_mapSecondStatInfo01.begin();
  292. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  293. it = m_mapSecondStatInfo01.erase(it);
  294. it = m_mapSecondStatInfo02.begin();
  295. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  296. it = m_mapSecondStatInfo02.erase(it);
  297. }
  298. }
  299. }
  300. break;
  301. case 1:
  302. {
  303. time(&m_tmUpdateTime1);
  304. for (auto i = 0; i < len; i++)
  305. {
  306. if (result[i] == false) continue;
  307. const auto tt = tmStartTime + i * step;
  308. map_resist_idx10[tt] = data0[i];
  309. map_resist_idx11[tt] = data1[i];
  310. map_resist_idx12[tt] = data2[i];
  311. }
  312. m_mapSecondStatInfo10[tmStartTimeSecond] = stSS1;
  313. m_mapSecondStatInfo11[tmStartTimeSecond] = stSS2;
  314. m_mapSecondStatInfo12[tmStartTimeSecond] = stSS3;
  315. //time(&m_tmMoveDetectTime1);//暂时不知道为啥赋值,先注释 2024年5月12日
  316. if (!bMakeup)
  317. {
  318. {
  319. auto it = map_resist_idx10.begin();
  320. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  321. it = map_resist_idx10.erase(it);
  322. it = map_resist_idx11.begin();
  323. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  324. it = map_resist_idx11.erase(it);
  325. it = map_resist_idx12.begin();
  326. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  327. it = map_resist_idx12.erase(it);
  328. }
  329. {
  330. auto it = m_mapSecondStatInfo10.begin();
  331. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  332. it = m_mapSecondStatInfo10.erase(it);
  333. it = m_mapSecondStatInfo11.begin();
  334. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  335. it = m_mapSecondStatInfo11.erase(it);
  336. it = m_mapSecondStatInfo12.begin();
  337. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  338. it = m_mapSecondStatInfo12.erase(it);
  339. }
  340. }
  341. }
  342. break;
  343. case 2:
  344. {
  345. time(&m_tmUpdateTime2);
  346. for (auto i = 0; i < len; i++)
  347. {
  348. if (result[i] == false) continue;
  349. const auto tt = tmStartTime + i * step;
  350. map_resist_idx20[tt] = data0[i];
  351. map_resist_idx21[tt] = data1[i];
  352. map_resist_idx22[tt] = data2[i];
  353. }
  354. m_mapSecondStatInfo20[tmStartTimeSecond] = stSS1;
  355. m_mapSecondStatInfo21[tmStartTimeSecond] = stSS2;
  356. m_mapSecondStatInfo22[tmStartTimeSecond] = stSS3;
  357. //time(&m_tmMoveDetectTime2);//暂时不知道为啥赋值,先注释 2024年5月12日
  358. if (!bMakeup)
  359. {
  360. {
  361. auto it = map_resist_idx20.begin();
  362. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  363. it = map_resist_idx20.erase(it);
  364. it = map_resist_idx21.begin();
  365. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  366. it = map_resist_idx21.erase(it);
  367. it = map_resist_idx22.begin();
  368. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  369. it = map_resist_idx22.erase(it);
  370. }
  371. {
  372. auto it = m_mapSecondStatInfo20.begin();
  373. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  374. it = m_mapSecondStatInfo20.erase(it);
  375. it = m_mapSecondStatInfo21.begin();
  376. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  377. it = m_mapSecondStatInfo21.erase(it);
  378. it = m_mapSecondStatInfo22.begin();
  379. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  380. it = m_mapSecondStatInfo22.erase(it);
  381. }
  382. }
  383. }
  384. break;
  385. default:
  386. ASSERT(0);
  387. bSave = false;
  388. break;
  389. }
  390. }
  391. //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());
  392. return bSave;
  393. }
  394. bool IsHaveTemp()const { return m_nTemperature != INT_MIN; }
  395. bool IsHaveHumi()const { return m_nHumidity != INT_MIN; }
  396. public:
  397. //设备唯一号
  398. std::string imei;
  399. //0通道数据
  400. std::map<time_t, int> map_resist_idx00; //毫秒数, 阻力值
  401. std::map<time_t, int> map_resist_idx01;
  402. std::map<time_t, int> map_resist_idx02;
  403. //秒数, 统计信息
  404. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo00;
  405. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo01;
  406. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo02;
  407. //1通道数据
  408. std::map<time_t, int> map_resist_idx10;
  409. std::map<time_t, int> map_resist_idx11;
  410. std::map<time_t, int> map_resist_idx12;
  411. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo10;
  412. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo11;
  413. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo12;
  414. //2通道数据
  415. std::map<time_t, int> map_resist_idx20;
  416. std::map<time_t, int> map_resist_idx21;
  417. std::map<time_t, int> map_resist_idx22;
  418. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo20;
  419. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo21;
  420. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo22;
  421. std::mutex m_mtx;
  422. //最后数据时间 设备时间
  423. COleDateTime m_odt_data0;
  424. COleDateTime m_odt_data1;
  425. COleDateTime m_odt_data2;
  426. //设备的心跳时间 跟牵引点数据时间有区别
  427. CTime m_ctUpdateTime = 0;
  428. SENSOR_STATUS m_sensor_status[9][2];
  429. //最后扳动的检测时间
  430. time_t m_tmMoveDetectTime0 = 0;
  431. time_t m_tmMoveDetectTime1 = 0;
  432. time_t m_tmMoveDetectTime2 = 0;
  433. int m_nTemperature = INT_MIN;
  434. int m_nHumidity = INT_MIN;
  435. inline time_t GetUpdateTime(uint8_t idx)
  436. {
  437. switch (idx)
  438. {
  439. case 0:
  440. return m_tmUpdateTime0;
  441. case 1:
  442. return m_tmUpdateTime1;
  443. case 2:
  444. return m_tmUpdateTime2;
  445. default:
  446. ASSERT(0);
  447. return 0;
  448. }
  449. }
  450. private:
  451. //最后数据时间 系统时间,用来判断是否在线
  452. time_t m_tmUpdateTime0 = time(0);
  453. time_t m_tmUpdateTime1 = time(0);
  454. time_t m_tmUpdateTime2 = time(0);
  455. private:
  456. inline static void InsertData(std::map<time_t, int>& map, time_t time, int val)
  457. {
  458. if (map.size() >= 2)
  459. {
  460. auto it = map.end();
  461. auto last = --it;
  462. auto second_last = --it;
  463. if (time / 1000 == last->first / 1000 && second_last->first / 1000 == time / 1000)
  464. {
  465. if (abs(last->second - val) <= 30 && abs(second_last->second - val) <= 30 && abs(last->second - second_last->second) <= 30)
  466. {
  467. #ifdef _DEBUG
  468. TRACE("%d:%d.%d\r\n", time % 100000, last->first % 100000, (time - last->first) % 1000);
  469. #endif // _DEBUG
  470. //都相等 先删除
  471. map.erase(last);
  472. }
  473. }
  474. else if (last->first == second_last->first + 980 && abs(last->second - second_last->second) <= 30)
  475. {
  476. map.erase(last);
  477. }
  478. map[time] = val;
  479. }
  480. else
  481. {
  482. map[time] = val;
  483. }
  484. auto it = map.begin();
  485. if ((time - it->first) > MAX_SAVE_TIME_MILLI) map.erase(it);
  486. }
  487. inline static void InsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo, time_t tTime, int val)
  488. {
  489. time_t tt = tTime / 1000; //换算成秒数
  490. if (mapSecondStatInfo[tt].first_val == INT_MIN)
  491. {
  492. mapSecondStatInfo[tt].first_val = val; //存储第一个值
  493. }
  494. auto& it = mapSecondStatInfo[tt];
  495. if (val > it.max_val)
  496. {
  497. it.max_val = val;
  498. it.max_time = tTime;
  499. }
  500. if (val < it.min_val)
  501. {
  502. it.min_val = val;
  503. it.min_time = tTime;
  504. }
  505. it.dif_val = it.max_val - it.min_val;
  506. it.sum_val += val;
  507. it.cout++;
  508. it.end_val = val;
  509. }
  510. inline static bool CalcBInsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo0,
  511. std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo1, std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo2,
  512. time_t* time, int* data0, int* data1, int* data2)
  513. {
  514. if (mapSecondStatInfo0.size() < 2) return false;
  515. //for (auto it = mapSecondStatInfo0.crbegin(); it != mapSecondStatInfo0.crend(); ++it) {
  516. // TRACE(fmt::format("{}:{}", it->first, it->second.dif_val).c_str());
  517. //}
  518. auto it0 = mapSecondStatInfo0.crbegin();
  519. auto it1 = mapSecondStatInfo1.crbegin();
  520. auto it2 = mapSecondStatInfo2.crbegin();
  521. if (it0->second.dif_val < 100 && it1->second.dif_val < 100 && it2->second.dif_val < 100)
  522. return false; //无波动
  523. if (it0->second.dif_val > 100)
  524. {
  525. auto it = it0;
  526. it++;
  527. if (it->second.dif_val < 100 && it0->first - it->first > 2 && it0->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  528. {
  529. *time = it0->first * 1000 - 20;
  530. *data0 = (++it0)->second.end_val;
  531. *data1 = (++it1)->second.end_val;
  532. *data2 = (++it2)->second.end_val;
  533. return true;
  534. }
  535. }
  536. else if (it1->second.dif_val > 100)
  537. {
  538. auto it = it1;
  539. it++;
  540. if (it->second.dif_val < 100 && it1->first - it->first > 2 && it1->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  541. {
  542. *time = it1->first * 1000 - 20;
  543. *data0 = (++it0)->second.end_val;
  544. *data1 = (++it1)->second.end_val;
  545. *data2 = (++it2)->second.end_val;
  546. return true;
  547. }
  548. }
  549. else if (it2->second.dif_val > 100)
  550. {
  551. auto it = it2;
  552. it++;
  553. if (it->second.dif_val < 100 && it2->first - it->first > 2 && it2->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  554. {
  555. *time = it2->first * 1000 - 20;
  556. *data0 = (++it0)->second.end_val;
  557. *data1 = (++it1)->second.end_val;
  558. *data2 = (++it2)->second.end_val;
  559. return true;
  560. }
  561. }
  562. return false;
  563. }
  564. };
  565. class CDeviceMng
  566. {
  567. private:
  568. CDeviceMng();
  569. ~CDeviceMng();
  570. public:
  571. static inline CDeviceMng* Instance() { return &obj; };
  572. CDevice* Insert(std::string imei);
  573. CDevice* Find(std::string imei);
  574. BOOL IsDeviceOnline(std::string imei, int8_t idx, int interval = 180); //默认3分钟判断是否在线
  575. private:
  576. static CDeviceMng obj;
  577. public:
  578. std::mutex m_mtx;
  579. //imei
  580. std::map<std::string, CDevice*> m_map_devices;
  581. };