parkspace_allocation_communicator.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. //
  2. // Created by zx on 2020/6/18.
  3. //
  4. #include "parkspace_allocation_communicator.h"
  5. Parkspace_allocation_communicator::Parkspace_allocation_communicator()
  6. {
  7. }
  8. Parkspace_allocation_communicator::~Parkspace_allocation_communicator()
  9. {
  10. }
  11. //************************************* 公有函数 ****************************************
  12. //外部调用发送分配车位结果
  13. Error_manager Parkspace_allocation_communicator::send_allocation_result(Communication_message *message)
  14. {
  15. return encapsulate_msg(message);
  16. }
  17. //外部调用更新所有车位信息/初始化所有车位
  18. Error_manager Parkspace_allocation_communicator::update_parkspace_status(message::Parkspace_allocation_status_msg status_msg)
  19. {
  20. std::lock_guard<std::mutex> lck(m_status_mutex);
  21. m_parkspace_status_msg.CopyFrom(status_msg);
  22. return SUCCESS;
  23. }
  24. //外部调用更新单一车位信息
  25. Error_manager Parkspace_allocation_communicator::update_parkspace_status(int parkspace_id, message::Parkspace_info parkspace_info)
  26. {
  27. std::lock_guard<std::mutex> lck(m_status_mutex);
  28. if(m_parkspace_status_msg.parkspace_info_size() >= parkspace_id)
  29. {
  30. m_parkspace_status_msg.mutable_parkspace_info(parkspace_id-1)->CopyFrom(parkspace_info);
  31. }
  32. return SUCCESS;
  33. }
  34. //外部调用获取当前车位状态消息
  35. message::Parkspace_allocation_status_msg Parkspace_allocation_communicator::get_status()
  36. {
  37. std::lock_guard<std::mutex> lck(m_status_mutex);
  38. message::Parkspace_allocation_status_msg parkspace_status_msg;
  39. parkspace_status_msg.CopyFrom(m_parkspace_status_msg);
  40. return parkspace_status_msg;
  41. }
  42. //************************************* 内部函数 ****************************************
  43. //封装反馈消息自动发送
  44. Error_manager Parkspace_allocation_communicator::encapsulate_msg(Communication_message *message)
  45. {
  46. if (message == nullptr)
  47. {
  48. return Error_manager(POINTER_IS_NULL, NEGLIGIBLE_ERROR, "Parkspace_allocation_communicator::message null pointer");
  49. }
  50. //记录请求
  51. if (message->get_message_type() == Communication_message::eParkspace_allocation_response_msg)
  52. {
  53. message::Parkspace_allocation_response_msg response;
  54. bool result = response.ParseFromString(message->get_message_buf());
  55. //可增加待发送分配车位反馈消息校核
  56. }
  57. else
  58. {
  59. return Error_manager(PARKSPACE_ALLOCATOR_MSG_RESPONSE_TYPE_ERROR, NEGLIGIBLE_ERROR, "Parkspace_allocation_communicator::message response type error");
  60. }
  61. //发送请求
  62. return Communication_socket_base::encapsulate_msg(message);
  63. }
  64. //重载执行消息,父类线程通过check_msg接收到车位分配请求后调用,解析内容并进行相应处理
  65. Error_manager Parkspace_allocation_communicator::execute_msg(Communication_message *p_msg)
  66. {
  67. if (p_msg == nullptr)
  68. return Error_manager(POINTER_IS_NULL, CRITICAL_ERROR, "parkspace allocation response msg pointer is null");
  69. //车位分配request消息
  70. switch (p_msg->get_message_type())
  71. {
  72. ///测量结果反馈消息
  73. case Communication_message::eParkspace_allocation_request_msg:
  74. {
  75. message::Parkspace_allocation_request_msg request;
  76. request.ParseFromString(p_msg->get_message_buf());
  77. //根据请求的信息反馈分配的车位,并封装发送
  78. //此处跳过外部处理与调用的过程,直接在内部调用,发送分配结果用于测试
  79. Communication_message* response=new Communication_message();
  80. message::Parkspace_allocation_response_msg response_msg;
  81. message::Base_info t_response_header;
  82. message::Error_manager t_error;
  83. t_response_header.set_msg_type(message::Message_type::eParkspace_allocation_response_msg);
  84. t_response_header.set_timeout_ms(1000);
  85. t_response_header.set_sender(message::Communicator::eParkspace_allocator);
  86. t_response_header.set_receiver(message::Communicator::eMain);
  87. t_error.set_error_code(0);
  88. t_error.set_error_level(message::Error_level::NORMAL);
  89. response_msg.mutable_base_info()->CopyFrom(t_response_header);
  90. response_msg.mutable_error_manager()->CopyFrom(t_error);
  91. response_msg.set_command_id(request.command_id());
  92. response_msg.set_allocated_space_id(33);
  93. response->reset(t_response_header, response_msg.SerializeAsString());
  94. return send_allocation_result(response);
  95. // return SUCCESS;
  96. }
  97. }
  98. return Error_manager(PARKSPACE_ALLOCATOR_MSG_RESPONSE_TYPE_ERROR, NEGLIGIBLE_ERROR, "parkspace allocation wrong request type");
  99. }
  100. //检查消息是否应由本模块接收
  101. Error_manager Parkspace_allocation_communicator::check_msg(Communication_message* p_msg)
  102. {
  103. //通过 p_msg->get_message_type() 和 p_msg->get_receiver() 判断这条消息是不是车位请求消息.
  104. if ( p_msg->get_message_type() == Communication_message::Message_type::eParkspace_allocation_request_msg
  105. && p_msg->get_receiver() == Communication_message::Communicator::eParkspace_allocator)
  106. {
  107. return Error_code::SUCCESS;
  108. }
  109. else
  110. {
  111. //认为接受人
  112. return Error_code::INVALID_MESSAGE;
  113. }
  114. }
  115. Error_manager Parkspace_allocation_communicator::check_executer(Communication_message* p_msg)
  116. {
  117. //检查对应模块的状态, 判断是否可以处理这条消息
  118. //同时也要判断是否超时, 超时返回 COMMUNICATION_ANALYSIS_TIME_OUT
  119. //如果处理器正在忙别的, 那么返回 COMMUNICATION_EXCUTER_IS_BUSY
  120. if ( p_msg->is_over_time() )
  121. {
  122. std::cout << "Communication_socket_base::check_msg p_buf = " << p_msg->get_message_buf() << std::endl;
  123. std::cout << "Communication_socket_base::check_msg size = " << p_msg->get_message_buf().size() << std::endl;
  124. std::cout << "COMMUNICATION_ANALYSIS_TIME_OUT , " << std::endl;
  125. return Error_code::COMMUNICATION_ANALYSIS_TIME_OUT;
  126. }
  127. else
  128. {
  129. bool executer_is_ready = true;
  130. //通过 p_msg->get_message_type() 和 p_msg->get_receiver() 找到处理模块的实例对象, 查询执行人是否可以处理这条消息
  131. //这里子类重载时, 增加判断逻辑, 以后再写.
  132. // std::cout << "Communication_socket_base::check_msg p_buf = " << p_msg->get_message_buf() << std::endl;
  133. // std::cout << "Communication_socket_base::check_msg size = " << p_msg->get_message_buf().size() << std::endl;
  134. if ( executer_is_ready )
  135. {
  136. std::cout << "executer_is_ready , " << std::endl;
  137. return Error_code::SUCCESS;
  138. }
  139. else
  140. {
  141. std::cout << "executer_is_busy , " << std::endl;
  142. return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
  143. }
  144. }
  145. return Error_code::SUCCESS;
  146. }
  147. //重载心跳与车位状态发送函数
  148. Error_manager Parkspace_allocation_communicator::encapsulate_send_data()
  149. {
  150. return Error_code::SUCCESS;
  151. std::lock_guard<std::mutex> lck(m_status_mutex);
  152. //车位信息消息赋值
  153. message::Parkspace_allocation_status_msg t_parkspace_status_msg;
  154. t_parkspace_status_msg.CopyFrom(m_parkspace_status_msg);
  155. message::Base_info t_base_info;
  156. message::Error_manager t_error;
  157. t_base_info.set_msg_type(message::Message_type::eParkspace_allocation_status_msg);
  158. t_base_info.set_timeout_ms(5000);
  159. t_base_info.set_sender(message::Communicator::eParkspace_allocator);
  160. t_base_info.set_receiver(message::Communicator::eMain);
  161. t_error.set_error_code(0);
  162. t_parkspace_status_msg.mutable_base_info()->CopyFrom(t_base_info);
  163. t_parkspace_status_msg.mutable_error_manager()->CopyFrom(t_error);
  164. Communication_message* tp_msg = new Communication_message(t_parkspace_status_msg.SerializeAsString());
  165. //重置消息,填入头信息
  166. tp_msg->reset(t_base_info, tp_msg->get_message_buf());
  167. bool is_push = m_send_data_list.push(tp_msg);
  168. if ( is_push == false )
  169. {
  170. delete(tp_msg);
  171. tp_msg = NULL;
  172. return Error_manager(Error_code::CONTAINER_IS_TERMINATE, Error_level::MINOR_ERROR,
  173. " Parkspace_allocation_communicator::send status error ");
  174. }
  175. return Error_code::SUCCESS;
  176. }