site_message_handle.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // Created by Administrator on 2019/1/14.
  3. //
  4. #include "site_message_handle.h"
  5. #include "system_basic_info/SystemAnalysis.h"
  6. #include "common_tool.h"
  7. #include "ant.h"
  8. #include "ya_event.h"
  9. site_message_handle::site_message_handle()
  10. {
  11. m_time_last_rec = 0;
  12. }
  13. /** 解析 分站发送过来的数据中(分站的信息数据)*/
  14. void site_message_handle::parse_data_locate_reader(int msgId,const message_siteinfo &loc ,bool bHistroy)
  15. {
  16. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_15);
  17. std::shared_ptr<site> pSite = sit_list::instance()->get(loc.m_site_id);
  18. //bool isErrorReader = false;
  19. if(pSite){
  20. //add_socket_to_list(dwConnID, reader_id, DEVICE_TYPE::DT_CARD_READER);
  21. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_16);
  22. }else{
  23. pSite = std::make_shared<site>();
  24. pSite->m_id = loc.m_site_id;
  25. LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_17);
  26. }
  27. // 接收数据时间
  28. pSite->m_rec_time = time(NULL);
  29. m_time_last_rec = pSite->m_rec_time; // 更新最后信号时间
  30. // 分站时间戳
  31. pSite->m_tick_count = loc.m_time_stamp;
  32. // 分站时间
  33. // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年
  34. struct tm reader_time;
  35. reader_time.tm_sec = loc.m_sec;
  36. reader_time.tm_min = loc.m_min;
  37. reader_time.tm_hour = loc.m_hour;
  38. reader_time.tm_mday = loc.m_day;
  39. reader_time.tm_wday = loc.m_week;
  40. reader_time.tm_mon = loc.m_mon - 1;
  41. reader_time.tm_year = loc.m_year + 100; // + 2000 - 1900
  42. pSite->m_time = mktime(&reader_time);
  43. //改为大小分站信息,最高位第7位表示大小分站,1表示大分站,0表示小分站
  44. //高6位表示分站(大或小)在大分站的左侧或右侧,1代表在大分站的左侧,0表示在大分站的右侧
  45. //高5位预留位,用于区分是读卡分站还是大小分站
  46. uint8_t reader_type = loc.m_site_relation >>7; //大小分站的区别
  47. uint8_t reader_dir = (loc.m_site_relation >>6)&0x01;
  48. uint8_t reader_type_locate = (loc.m_site_relation >>5)&0x01; //大小分站与读卡分站的区别
  49. uint8_t relay_counts = loc.m_site_relation&0x0F;
  50. pSite->m_reader_dir = reader_dir;
  51. pSite->m_relay_counts = relay_counts;
  52. reader_power_battery_alarm(loc.m_site_id,loc.m_site_power);
  53. log_info("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, sta: %d,reader_power: %d"
  54. ",reader_type: %d,is_big_reader: %d,is_left: %d, counts: %d",
  55. loc.m_site_id, loc.m_time_stamp, loc.m_year, loc.m_mon, loc.m_day\
  56. , loc.m_hour, loc.m_min,loc.m_sec\
  57. , loc.m_site_state,loc.m_site_power,reader_type_locate,reader_type,reader_dir,relay_counts);/*tep:%d,*/
  58. }
  59. void site_message_handle::reader_power_battery_alarm(unsigned int site_id, int powerType)
  60. {
  61. std::shared_ptr<site> pSite = sit_list::instance()->get(site_id);
  62. if (pSite == nullptr )
  63. {
  64. return ;
  65. }
  66. std::shared_ptr<ya_event> ev_ptr = event_list::instance()->get_event_reader(site_id,ET_READER_POWER_BY_BATTERY);
  67. int oldEvState = -1;
  68. int usePowerType = powerType;
  69. if (!pSite->m_needpower_alarm)
  70. {
  71. //如果分站不需要电池供电告警,而告警事件列表中存在告警信息,需要发送结束告警事件
  72. if (nullptr != ev_ptr && ev_ptr->m_status == ES_START)
  73. {
  74. oldEvState = ES_START;
  75. usePowerType = 1;
  76. }
  77. else
  78. {
  79. return;
  80. }
  81. }
  82. switch (usePowerType)
  83. {
  84. case 1 : //交流电 取消警告
  85. {
  86. if(nullptr == ev_ptr || oldEvState == ES_END)
  87. {
  88. return ; //不出在警告并且警告已是取消状态
  89. }
  90. event_list::copy_event(pSite,ev_ptr);
  91. ev_ptr->m_status = ES_END;
  92. ev_ptr->m_cur_time = std::chrono::system_clock::now();
  93. ev_ptr->m_cur_value = usePowerType;
  94. ev_ptr->m_is_display = true;
  95. event_list::save_event(ev_ptr);
  96. log_info("[event warning: restore reader power supply] reader_id: %d.",site_id);
  97. }
  98. break;
  99. case 0: //直流电警告
  100. {
  101. if(nullptr != ev_ptr && oldEvState == ES_START)
  102. {
  103. return ; //已有警告在发送不需要再次添加
  104. }
  105. if (nullptr == ev_ptr)
  106. {
  107. ev_ptr = event_list::create_event_reader(site_id,ET_READER_POWER_BY_BATTERY);
  108. event_list::copy_event(pSite,ev_ptr);
  109. event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
  110. }
  111. ev_ptr->m_status = ES_START;
  112. ev_ptr->m_limit_value = 0;
  113. ev_ptr->m_cur_value = usePowerType;
  114. event_list::save_event(ev_ptr);
  115. log_info("[event warning: reader power supply by battery] reader_id: %d.",site_id);
  116. }
  117. break;
  118. }
  119. }