Terminal_communication.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //
  2. // Created by zx on 2020/7/13.
  3. //
  4. #include "Terminal_communication.h"
  5. #include "process_message.pb.h"
  6. #include <condition_variable>
  7. Terminal_communication::Terminal_communication(){}
  8. Terminal_communication::~Terminal_communication(){}
  9. //重载函数
  10. Error_manager Terminal_communication::encapsulate_msg(Communication_message* message)
  11. {
  12. Error_manager code;
  13. switch (message->get_message_type())
  14. {
  15. case Communication_message::eStore_command_request_msg:
  16. {
  17. message::Store_command_request_msg request;
  18. request.ParseFromString(message->get_message_buf());
  19. //清空记录
  20. m_store_response_msg=message::Store_command_response_msg();
  21. //发送请求
  22. code= Communication_socket_base::encapsulate_msg(message);
  23. break;
  24. }
  25. case Communication_message::ePickup_command_request_msg:
  26. {
  27. message::Pickup_command_request_msg request;
  28. request.ParseFromString(message->get_message_buf());
  29. //清空记录
  30. m_pickup_response_msg=message::Pickup_command_response_msg();
  31. //发送请求
  32. code= Communication_socket_base::encapsulate_msg(message);
  33. break;
  34. }
  35. default:
  36. code= Error_manager(ERROR,NEGLIGIBLE_ERROR,"terminal message table is not exist");
  37. }
  38. return code;
  39. }
  40. Error_manager Terminal_communication::execute_msg(Communication_message* p_msg)
  41. {
  42. if(p_msg->get_message_type()==Communication_message::eStore_command_response_msg)
  43. {
  44. message::Store_command_response_msg response;
  45. if(false==response.ParseFromString(p_msg->get_message_buf()))
  46. {
  47. return Error_manager(ERROR,CRITICAL_ERROR,"停车指令反馈信息解析错误");
  48. }
  49. message::Base_info base_info=response.base_info();
  50. if(base_info.sender()==message::eMain && base_info.receiver()==message::eTerminor)
  51. {
  52. message::Error_manager error_code=response.code();
  53. if(error_code.error_code()==0)
  54. {
  55. m_store_response_msg=response;
  56. return SUCCESS;
  57. }
  58. }
  59. }
  60. if(p_msg->get_message_type()==Communication_message::ePickup_command_response_msg)
  61. {
  62. message::Pickup_command_response_msg response;
  63. if(false==response.ParseFromString(p_msg->get_message_buf()))
  64. {
  65. return Error_manager(ERROR,CRITICAL_ERROR,"停车指令反馈信息解析错误");
  66. }
  67. message::Base_info base_info=response.base_info();
  68. if(base_info.sender()==message::eMain && base_info.receiver()==message::eTerminor)
  69. {
  70. message::Error_manager error_code=response.code();
  71. if(error_code.error_code()==0)
  72. {
  73. m_pickup_response_msg=response;
  74. return SUCCESS;
  75. }
  76. }
  77. }
  78. if(p_msg->get_message_type()==Communication_message::eStoring_process_statu_msg)
  79. {
  80. message::Storing_process_statu_msg msg;
  81. if(msg.ParseFromString(p_msg->get_message_buf())==false)
  82. {
  83. std::cout<<" ERROR : Storing_process_statu_msg 失败"<<std::endl;
  84. }
  85. message::Base_info base_info=msg.base_info();
  86. if(base_info.sender()==message::eMain)
  87. {
  88. m_storing_statu_map[msg.terminal_id()]=msg;
  89. }
  90. }
  91. if(p_msg->get_message_type()==Communication_message::ePicking_process_statu_msg)
  92. {
  93. message::Picking_process_statu_msg msg;
  94. if(msg.ParseFromString(p_msg->get_message_buf())==false)
  95. {
  96. std::cout<<" ERROR : Picking_process_statu_msg 失败"<<std::endl;
  97. }
  98. message::Base_info base_info=msg.base_info();
  99. if(base_info.sender()==message::eMain)
  100. {
  101. m_picking_statu_map[msg.terminal_id()]=msg;
  102. }
  103. }
  104. return SUCCESS;
  105. return Error_manager(FAILED,MINOR_ERROR,"terminal communication 未知消息");
  106. }
  107. /*
  108. * 检测消息是否可被处理
  109. */
  110. Error_manager Terminal_communication::check_msg(Communication_message* p_msg)
  111. {
  112. return SUCCESS;
  113. }
  114. /*
  115. * 心跳发送函数,重载
  116. */
  117. Error_manager Terminal_communication::encapsulate_send_data()
  118. {
  119. return SUCCESS;
  120. }
  121. //检查消息是否可以被解析, 需要重载
  122. Error_manager Terminal_communication::check_executer(Communication_message* p_msg)
  123. {
  124. return SUCCESS;
  125. }
  126. /*
  127. * 设置终端id
  128. */
  129. Error_manager Terminal_communication::set_terminal_id(int id)
  130. {
  131. if(id<0 || id>5)
  132. return Error_manager(ERROR,CRITICAL_ERROR,"终端设置id不在范围");
  133. m_terminal_id=id;
  134. return SUCCESS;
  135. }
  136. /*
  137. * 发送停车指令请求
  138. */
  139. Error_manager Terminal_communication::store_request(message::Store_command_request_msg& request,message::Store_command_response_msg& response)
  140. {
  141. if(request.has_locate_information()==false ||
  142. request.has_car_info()==false)
  143. {
  144. return Error_manager(ERROR,CRITICAL_ERROR,"停车指令请求消息缺少必要信息");
  145. }
  146. Error_manager code;
  147. Communication_message message;
  148. message.reset(request.base_info(),request.SerializeAsString());
  149. int timeout=1000*5;
  150. code=encapsulate_msg(&message);
  151. if(code!=SUCCESS)
  152. return code;
  153. //循环查询请求是否被处理
  154. auto start_time=std::chrono::system_clock::now();
  155. double time=0;
  156. do {
  157. //查询到记录
  158. ///查询是否存在,并且删除该记录,
  159. //判断是否接收到回应,若回应信息被赋值则证明有回应
  160. if (m_store_response_msg.has_base_info() && m_store_response_msg.has_code()) {
  161. message::Base_info response_base = m_store_response_msg.base_info();
  162. //检查类型是否匹配
  163. if (response_base.msg_type() != message::eStore_command_response_msg) {
  164. return Error_manager(ERROR, CRITICAL_ERROR,
  165. "停车指令反馈消息 response msg type error");
  166. }
  167. //检查基本信息是否匹配
  168. if (response_base.sender() != message::eMain ||
  169. response_base.receiver() != message::eTerminor ) {
  170. return Error_manager(PARKSPACE_RELEASE_RESPONSE_INFO_ERROR, MAJOR_ERROR,
  171. "parkspace store response msg info error");
  172. }
  173. response.CopyFrom(m_store_response_msg);
  174. m_store_response_msg.clear_base_info();
  175. return SUCCESS;
  176. }
  177. auto end_time = std::chrono::system_clock::now();
  178. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
  179. time = 1000.0 * double(duration.count()) * std::chrono::microseconds::period::num /
  180. std::chrono::microseconds::period::den;
  181. std::this_thread::yield();
  182. usleep(1000);
  183. }while(time<double(timeout));
  184. //超时,删除记录,返回错误
  185. return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"parkspace store request timeout");
  186. }
  187. /*
  188. * 发送取车指令请求
  189. */
  190. Error_manager Terminal_communication::pickup_request(message::Pickup_command_request_msg& request,message::Pickup_command_response_msg& response)
  191. {
  192. if(request.has_car_info()==false)
  193. {
  194. return Error_manager(ERROR,CRITICAL_ERROR,"取车指令请求消息缺少车辆信息");
  195. }
  196. Error_manager code;
  197. Communication_message message;
  198. message.reset(request.base_info(),request.SerializeAsString());
  199. int timeout=1000;
  200. code=encapsulate_msg(&message);
  201. if(code!=SUCCESS)
  202. return code;
  203. // m_statu=eTerminal_picking;
  204. //循环查询请求是否被处理
  205. auto start_time=std::chrono::system_clock::now();
  206. double time=0;
  207. do {
  208. //查询到记录
  209. ///查询是否存在,并且删除该记录,
  210. //判断是否接收到回应,若回应信息被赋值则证明有回应
  211. if (m_pickup_response_msg.has_base_info() && m_pickup_response_msg.has_code())
  212. {
  213. message::Base_info response_base = m_pickup_response_msg.base_info();
  214. //检查类型是否匹配
  215. if (response_base.msg_type() != message::ePickup_command_response_msg) {
  216. return Error_manager(ERROR, CRITICAL_ERROR,
  217. "停车指令反馈消息 response msg type error");
  218. }
  219. //检查基本信息是否匹配
  220. if (response_base.sender() != message::eMain ||
  221. response_base.receiver() != message::eTerminor ) {
  222. return Error_manager(PARKSPACE_RELEASE_RESPONSE_INFO_ERROR, MAJOR_ERROR,
  223. "parkspace release response msg info error");
  224. }
  225. response.CopyFrom(m_pickup_response_msg);
  226. m_pickup_response_msg.clear_base_info();
  227. //m_pickup_response_msg=message::Pickup_command_response_msg();
  228. return SUCCESS;
  229. }
  230. auto end_time = std::chrono::system_clock::now();
  231. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
  232. time = 1000.0 * double(duration.count()) * std::chrono::microseconds::period::num /
  233. std::chrono::microseconds::period::den;
  234. std::this_thread::yield();
  235. usleep(1000);
  236. }while(time<double(timeout));
  237. //超时,删除记录,返回错误
  238. return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"parkspace release request timeout");
  239. }
  240. /*
  241. * 获取停车流程状态
  242. */
  243. Error_manager Terminal_communication::get_storing_statu(int terminal_id,message::Storing_process_statu_msg& msg)
  244. {
  245. if(m_storing_statu_map.find(terminal_id,msg)) {
  246. return SUCCESS;
  247. }
  248. return FAILED;
  249. }
  250. /*
  251. * 获取取车流程状态
  252. */
  253. Error_manager Terminal_communication::get_picking_statu(int terminal_id,message::Picking_process_statu_msg& msg)
  254. {
  255. if(m_picking_statu_map.find(terminal_id,msg))
  256. return SUCCESS;
  257. return FAILED;
  258. }