Device.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. #pragma once
  2. #include <string>
  3. #include <queue>
  4. #include <map>
  5. #include <mutex>
  6. #include "AlarmDefine.h"
  7. //缓冲数据 50小时 毫秒
  8. #define MAX_SAVE_TIME_MILLI 180000000
  9. #define MAX_SAVE_TIME_SECOND 180000
  10. enum class SENSOR_STATUS : int8_t
  11. {
  12. UNKONW = -1,
  13. ABNORMAL = 0,
  14. NORMAL = 1
  15. };
  16. class CDevice
  17. {
  18. public:
  19. CDevice(std::string a, std::string b, std::string c, std::string d);
  20. virtual ~CDevice();
  21. void Insert(int index, time_t time, int data0, int data1, int data2);
  22. //调用Insert数据插入完 来判断是否需要插入数据 返回false 不需要 返回true 需要
  23. inline bool CalcBInsertData(int index, time_t* time, int* data0, int* data1, int* data2)
  24. {
  25. if (index == 0)
  26. return CalcBInsertData(m_mapSecondStatInfo00, m_mapSecondStatInfo01, m_mapSecondStatInfo02, time, data0, data1, data2);
  27. else if (index == 1)
  28. return CalcBInsertData(m_mapSecondStatInfo10, m_mapSecondStatInfo11, m_mapSecondStatInfo12, time, data0, data1, data2);
  29. else
  30. return CalcBInsertData(m_mapSecondStatInfo20, m_mapSecondStatInfo21, m_mapSecondStatInfo22, time, data0, data1, data2);
  31. }
  32. void LoadHist();
  33. inline void updateActive()
  34. {
  35. time(&m_tmLastActive);
  36. }
  37. std::map<time_t, int>* GetMapData(uint8_t idx, uint8_t no);
  38. inline BOOL IsDeviceOnline(time_t tmNow = 0, int inteval = 180000)
  39. {
  40. if (tmNow == 0) time(&tmNow);
  41. if (tmNow - m_tmLastActive < inteval)
  42. return TRUE;
  43. return FALSE;
  44. }
  45. inline BOOL GetSendStatInfo(time_t tmStart, time_t tmEnd, uint8_t idx,
  46. std::map<time_t, tagSecondStatInfo>& map0, std::map<time_t, tagSecondStatInfo>& map1, std::map<time_t, tagSecondStatInfo>& map2)
  47. {
  48. if (idx == 0)
  49. {
  50. if (m_mapSecondStatInfo00.size() == 0) return FALSE;
  51. for (auto i = tmStart; i < tmEnd; i++)
  52. {
  53. auto it0 = m_mapSecondStatInfo00.find(i);
  54. if (it0 == m_mapSecondStatInfo00.end()) continue;
  55. auto it1 = m_mapSecondStatInfo01.find(i);
  56. auto it2 = m_mapSecondStatInfo02.find(i);
  57. if (it1 == m_mapSecondStatInfo01.end() || it2 == m_mapSecondStatInfo02.end())
  58. {
  59. ASSERT(FALSE);
  60. }
  61. auto it00 = it0, it01 = it1, it02 = it2;
  62. for (; it00 != m_mapSecondStatInfo00.end();)
  63. {
  64. if (it00->first <= tmEnd)
  65. {
  66. it00++;
  67. it01++;
  68. it02++;
  69. }
  70. else
  71. {
  72. map0.insert(it0, it00);
  73. map1.insert(it1, it01);
  74. map2.insert(it2, it02);
  75. return TRUE;
  76. }
  77. }
  78. if (it0 != it00)
  79. {
  80. map0.insert(it0, it00);
  81. map1.insert(it1, it01);
  82. map2.insert(it2, it02);
  83. return TRUE;
  84. }
  85. }
  86. }
  87. else if (idx == 1)
  88. {
  89. if (m_mapSecondStatInfo10.size() == 0) return FALSE;
  90. for (auto i = tmStart; i < tmEnd; i++)
  91. {
  92. auto it0 = m_mapSecondStatInfo10.find(i);
  93. if (it0 == m_mapSecondStatInfo10.end()) continue;
  94. auto it1 = m_mapSecondStatInfo11.find(i);
  95. auto it2 = m_mapSecondStatInfo12.find(i);
  96. if (it1 == m_mapSecondStatInfo11.end() || it2 == m_mapSecondStatInfo12.end())
  97. {
  98. ASSERT(FALSE);
  99. }
  100. auto it00 = it0, it01 = it1, it02 = it2;
  101. for (; it00 != m_mapSecondStatInfo10.end();)
  102. {
  103. if (it00->first <= tmEnd)
  104. {
  105. it00++;
  106. it01++;
  107. it02++;
  108. }
  109. else
  110. {
  111. map0.insert(it0, it00);
  112. map1.insert(it1, it01);
  113. map2.insert(it2, it02);
  114. return TRUE;
  115. }
  116. }
  117. if (it0 != it00)
  118. {
  119. map0.insert(it0, it00);
  120. map1.insert(it1, it01);
  121. map2.insert(it2, it02);
  122. return TRUE;
  123. }
  124. }
  125. }
  126. else if (idx == 2)
  127. {
  128. if (m_mapSecondStatInfo20.size() == 0) return FALSE;
  129. for (auto i = tmStart; i < tmEnd; i++)
  130. {
  131. auto it0 = m_mapSecondStatInfo20.find(i);
  132. if (it0 == m_mapSecondStatInfo20.end()) continue;
  133. auto it1 = m_mapSecondStatInfo21.find(i);
  134. auto it2 = m_mapSecondStatInfo22.find(i);
  135. if (it1 == m_mapSecondStatInfo21.end() || it2 == m_mapSecondStatInfo22.end())
  136. {
  137. ASSERT(FALSE);
  138. }
  139. auto it00 = it0, it01 = it1, it02 = it2;
  140. for (; it00 != m_mapSecondStatInfo20.end();)
  141. {
  142. if (it00->first <= tmEnd)
  143. {
  144. it00++;
  145. it01++;
  146. it02++;
  147. }
  148. else
  149. {
  150. map0.insert(it0, it00);
  151. map1.insert(it1, it01);
  152. map2.insert(it2, it02);
  153. return TRUE;
  154. }
  155. }
  156. if (it0 != it00)
  157. {
  158. map0.insert(it0, it00);
  159. map1.insert(it1, it01);
  160. map2.insert(it2, it02);
  161. return TRUE;
  162. }
  163. }
  164. }
  165. return FALSE;
  166. }
  167. //新的接口
  168. inline void Insert(const uint8_t idx, const __time64_t tmStartTime, const int step, const vector<int>& data0, const vector<int>& data1, const vector<int>& data2,
  169. const vector<bool> result, const size_t len, const SECOND_STAT_INFO& stSS1, const SECOND_STAT_INFO& stSS2, const SECOND_STAT_INFO& stSS3)
  170. {
  171. //TRACE("%s:%d %s\r\n", __FUNCTION__, __LINE__, CTime(tmStartTime / 1000).Format("%Y-%m-%d %H:%M:%S"));
  172. lock_guard<mutex> lock(m_mtx);
  173. switch (idx)
  174. {
  175. case 0:
  176. {
  177. for (auto i = 0; i < len; i++)
  178. {
  179. if (result[i] == false) continue;
  180. map_resist_idx00[tmStartTime + i * step] = data0[i];
  181. map_resist_idx01[tmStartTime + i * step] = data1[i];
  182. map_resist_idx02[tmStartTime + i * step] = data2[i];
  183. }
  184. auto tmStartTimeSecond = tmStartTime / 1000;
  185. m_mapSecondStatInfo00[tmStartTimeSecond] = stSS1;
  186. m_mapSecondStatInfo01[tmStartTimeSecond] = stSS2;
  187. m_mapSecondStatInfo02[tmStartTimeSecond] = stSS3;
  188. time(&m_tmMoveDetectTime0);
  189. {
  190. auto it = map_resist_idx00.begin();
  191. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  192. it = map_resist_idx00.erase(it);
  193. it = map_resist_idx01.begin();
  194. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  195. it = map_resist_idx01.erase(it);
  196. it = map_resist_idx02.begin();
  197. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  198. it = map_resist_idx02.erase(it);
  199. }
  200. {
  201. auto it = m_mapSecondStatInfo00.begin();
  202. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  203. it = m_mapSecondStatInfo00.erase(it);
  204. it = m_mapSecondStatInfo01.begin();
  205. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  206. it = m_mapSecondStatInfo01.erase(it);
  207. it = m_mapSecondStatInfo02.begin();
  208. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  209. it = m_mapSecondStatInfo02.erase(it);
  210. }
  211. }
  212. break;
  213. case 1:
  214. {
  215. for (auto i = 0; i < len; i++)
  216. {
  217. if (result[i] == false) continue;
  218. map_resist_idx10[tmStartTime + i * step] = data0[i];
  219. map_resist_idx11[tmStartTime + i * step] = data1[i];
  220. map_resist_idx12[tmStartTime + i * step] = data2[i];
  221. }
  222. auto tmStartTimeSecond = tmStartTime / 1000;
  223. m_mapSecondStatInfo10[tmStartTimeSecond] = stSS1;
  224. m_mapSecondStatInfo11[tmStartTimeSecond] = stSS2;
  225. m_mapSecondStatInfo12[tmStartTimeSecond] = stSS3;
  226. time(&m_tmMoveDetectTime1);
  227. {
  228. auto it = map_resist_idx10.begin();
  229. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  230. it = map_resist_idx10.erase(it);
  231. it = map_resist_idx11.begin();
  232. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  233. it = map_resist_idx11.erase(it);
  234. it = map_resist_idx12.begin();
  235. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  236. it = map_resist_idx12.erase(it);
  237. }
  238. {
  239. auto it = m_mapSecondStatInfo10.begin();
  240. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  241. it = m_mapSecondStatInfo10.erase(it);
  242. it = m_mapSecondStatInfo11.begin();
  243. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  244. it = m_mapSecondStatInfo11.erase(it);
  245. it = m_mapSecondStatInfo12.begin();
  246. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  247. it = m_mapSecondStatInfo12.erase(it);
  248. }
  249. }
  250. break;
  251. case 2:
  252. {
  253. for (auto i = 0; i < len; i++)
  254. {
  255. if (result[i] == false) continue;
  256. map_resist_idx20[tmStartTime + i * step] = data0[i];
  257. map_resist_idx21[tmStartTime + i * step] = data1[i];
  258. map_resist_idx22[tmStartTime + i * step] = data2[i];
  259. }
  260. auto tmStartTimeSecond = tmStartTime / 1000;
  261. m_mapSecondStatInfo20[tmStartTimeSecond] = stSS1;
  262. m_mapSecondStatInfo21[tmStartTimeSecond] = stSS2;
  263. m_mapSecondStatInfo22[tmStartTimeSecond] = stSS3;
  264. time(&m_tmMoveDetectTime2);
  265. {
  266. auto it = map_resist_idx20.begin();
  267. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  268. it = map_resist_idx20.erase(it);
  269. it = map_resist_idx21.begin();
  270. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  271. it = map_resist_idx21.erase(it);
  272. it = map_resist_idx22.begin();
  273. while (tmStartTime - it->first > MAX_SAVE_TIME_MILLI)
  274. it = map_resist_idx22.erase(it);
  275. }
  276. {
  277. auto it = m_mapSecondStatInfo20.begin();
  278. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  279. it = m_mapSecondStatInfo20.erase(it);
  280. it = m_mapSecondStatInfo21.begin();
  281. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  282. it = m_mapSecondStatInfo21.erase(it);
  283. it = m_mapSecondStatInfo22.begin();
  284. while (tmStartTimeSecond - it->first > MAX_SAVE_TIME_SECOND)
  285. it = m_mapSecondStatInfo22.erase(it);
  286. }
  287. }
  288. break;
  289. default:
  290. ASSERT(0);
  291. break;
  292. }
  293. //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());
  294. }
  295. public:
  296. //战场名
  297. const std::string m_station;
  298. //道岔名
  299. const std::string m_mo;
  300. //转辙机名
  301. const std::string m_mp;
  302. //
  303. const std::string taskid;
  304. std::string name1;
  305. std::string name2;
  306. std::string name3;
  307. std::string direct1;
  308. std::string direct2;
  309. std::string mo_name;
  310. std::string mp_name;
  311. //0通道数据
  312. std::map<time_t, int> map_resist_idx00; //毫秒数, 阻力值
  313. std::map<time_t, int> map_resist_idx01;
  314. std::map<time_t, int> map_resist_idx02;
  315. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo00;
  316. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo01;
  317. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo02;
  318. //1通道数据
  319. std::map<time_t, int> map_resist_idx10;
  320. std::map<time_t, int> map_resist_idx11;
  321. std::map<time_t, int> map_resist_idx12;
  322. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo10;
  323. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo11;
  324. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo12;
  325. //2通道数据
  326. std::map<time_t, int> map_resist_idx20;
  327. std::map<time_t, int> map_resist_idx21;
  328. std::map<time_t, int> map_resist_idx22;
  329. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo20;
  330. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo21;
  331. std::map<time_t, tagSecondStatInfo> m_mapSecondStatInfo22;
  332. std::mutex m_mtx;
  333. COleDateTime m_odt_data0;
  334. COleDateTime m_odt_data1;
  335. COleDateTime m_odt_data2;
  336. //心跳时间
  337. CTime m_ctUpdateTime = 0;
  338. SENSOR_STATUS m_sensor_status[9][2];
  339. time_t m_tmMoveDetectTime0 = 0;
  340. time_t m_tmMoveDetectTime1 = 0;
  341. time_t m_tmMoveDetectTime2 = 0;
  342. time_t m_tmLastActive;
  343. private:
  344. static void InsertData(std::map<time_t, int>& map, time_t tTime, int val);
  345. inline static void InsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo, time_t tTime, int val)
  346. {
  347. time_t tt = tTime / 1000; //换算成秒数
  348. if (mapSecondStatInfo[tt].first_val == INT_MIN)
  349. {
  350. mapSecondStatInfo[tt].first_val = val; //存储第一个值
  351. }
  352. auto& it = mapSecondStatInfo[tt];
  353. if (val > it.max_val)
  354. {
  355. it.max_val = val;
  356. it.max_time = tTime;
  357. }
  358. if (val < it.min_val)
  359. {
  360. it.min_val = val;
  361. it.min_time = tTime;
  362. }
  363. it.dif_val = it.max_val - it.min_val;
  364. it.sum_val += val;
  365. it.cout++;
  366. it.end_val = val;
  367. }
  368. inline static bool CalcBInsertData(std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo0,
  369. std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo1, std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo2,
  370. time_t* time, int* data0, int* data1, int* data2)
  371. {
  372. if (mapSecondStatInfo0.size() < 2) return false;
  373. //for (auto it = mapSecondStatInfo0.crbegin(); it != mapSecondStatInfo0.crend(); ++it) {
  374. // TRACE(fmt::format("{}:{}", it->first, it->second.dif_val).c_str());
  375. //}
  376. auto it0 = mapSecondStatInfo0.crbegin();
  377. auto it1 = mapSecondStatInfo1.crbegin();
  378. auto it2 = mapSecondStatInfo2.crbegin();
  379. if (it0->second.dif_val < 100 && it1->second.dif_val < 100 && it2->second.dif_val < 100)
  380. return false; //无波动
  381. if (it0->second.dif_val > 100)
  382. {
  383. auto it = it0;
  384. it++;
  385. if (it->second.dif_val < 100 && it0->first - it->first > 2 && it0->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  386. {
  387. *time = it0->first * 1000 - 20;
  388. *data0 = (++it0)->second.end_val;
  389. *data1 = (++it1)->second.end_val;
  390. *data2 = (++it2)->second.end_val;
  391. return true;
  392. }
  393. }
  394. else if (it1->second.dif_val > 100)
  395. {
  396. auto it = it1;
  397. it++;
  398. if (it->second.dif_val < 100 && it1->first - it->first > 2 && it1->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  399. {
  400. *time = it1->first * 1000 - 20;
  401. *data0 = (++it0)->second.end_val;
  402. *data1 = (++it1)->second.end_val;
  403. *data2 = (++it2)->second.end_val;
  404. return true;
  405. }
  406. }
  407. else if (it2->second.dif_val > 100)
  408. {
  409. auto it = it2;
  410. it++;
  411. if (it->second.dif_val < 100 && it2->first - it->first > 2 && it2->first - it->first < 60) //前面无波动 相隔时差 大于2秒 小于 60秒
  412. {
  413. *time = it2->first * 1000 - 20;
  414. *data0 = (++it0)->second.end_val;
  415. *data1 = (++it1)->second.end_val;
  416. *data2 = (++it2)->second.end_val;
  417. return true;
  418. }
  419. }
  420. return false;
  421. }
  422. };
  423. class CDeviceMng
  424. {
  425. private:
  426. CDeviceMng();
  427. ~CDeviceMng();
  428. public:
  429. static inline CDeviceMng* Instance() { return &obj; };
  430. void LoadDevice();
  431. bool Insert(CDevice*);
  432. CDevice* Find(std::string taskid);
  433. BOOL IsDeviceOnline(std::string taskid, int interval = 180000); //默认3分钟判断是否在线
  434. private:
  435. static CDeviceMng obj;
  436. public:
  437. std::mutex m_mtx;
  438. //imei
  439. std::map<std::string, CDevice*> m_map_devices;
  440. };