Parkspace_communicator.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. //
  2. // Created by zx on 2020/7/9.
  3. //
  4. #include "Parkspace_communicator.h"
  5. namespace message {
  6. bool operator<(const message::Parkspace_allocation_request_msg &msg1,
  7. const message::Parkspace_allocation_request_msg &msg2) {
  8. return (msg1.command_id() < msg2.command_id());
  9. }
  10. bool operator==(const message::Parkspace_allocation_request_msg &msg1,
  11. const message::Parkspace_allocation_request_msg &msg2)
  12. {
  13. if (msg1.base_info().msg_type() == msg2.base_info().msg_type()
  14. && msg1.base_info().sender() == msg2.base_info().sender()
  15. && msg1.base_info().receiver() == msg2.base_info().receiver()
  16. && msg1.command_id() == msg2.command_id()
  17. && msg1.terminal_id() == msg2.terminal_id()){
  18. return true;
  19. }
  20. return false;
  21. }
  22. bool operator<(const message::Parkspace_search_request_msg &msg1,
  23. const message::Parkspace_search_request_msg &msg2) {
  24. return (msg1. command_id() < msg2.command_id());
  25. }
  26. bool operator==(const message::Parkspace_search_request_msg &msg1, const message::Parkspace_search_request_msg &msg2)
  27. {
  28. if (msg1.base_info().msg_type() == msg2.base_info().msg_type()
  29. && msg1.base_info().sender() == msg2.base_info().sender()
  30. && msg1.base_info().receiver() == msg2.base_info().receiver()
  31. && msg1.command_id() == msg2.command_id()) {
  32. return true;
  33. }
  34. return false;
  35. }
  36. bool operator<(const message::Parkspace_release_request_msg &msg1, const message::Parkspace_release_request_msg &msg2)
  37. {
  38. return (msg1.command_id() < msg2.command_id());
  39. }
  40. bool operator==(const message::Parkspace_release_request_msg &msg1, const message::Parkspace_release_request_msg &msg2)
  41. {
  42. if (msg1.base_info().msg_type() == msg2.base_info().msg_type()
  43. && msg1.base_info().sender() == msg2.base_info().sender()
  44. && msg1.base_info().receiver() == msg2.base_info().receiver()
  45. && msg1.command_id() == msg2.command_id()) {
  46. return true;
  47. }
  48. return false;
  49. }
  50. }
  51. Parkspace_communicator::~Parkspace_communicator(){}
  52. /*
  53. * 请求分配车位
  54. */
  55. Error_manager Parkspace_communicator::alloc_request(message::Parkspace_allocation_request_msg& request,message::Parkspace_allocation_response_msg& result)
  56. {
  57. /*
  58. * 检查request合法性,以及模块状态
  59. */
  60. if(request.base_info().sender()!=message::eMain||request.base_info().receiver()!=message::eTable)
  61. return Error_manager(PARKSPACE_ALLOC_REQUEST_INVALID,MINOR_ERROR,"parkspace alloc request invalid");
  62. if(m_alloc_table.find(request)==true)
  63. return Error_manager(PARKSPACE_ALLOC_REQUEST_REPEATED,MAJOR_ERROR," parkspace alloc request repeated");
  64. //设置超时,若没有设置,默认1000
  65. int timeout=request.base_info().has_timeout_ms()?request.base_info().timeout_ms():1000;
  66. //向测量节点发送测量请求,并记录请求
  67. Error_manager code;
  68. Communication_message message;
  69. message::Base_info base_msg;
  70. base_msg.set_msg_type(message::eParkspace_allocation_request_msg);
  71. base_msg.set_sender(message::eMain);
  72. base_msg.set_receiver(message::eTable);
  73. base_msg.set_timeout_ms(timeout);
  74. message.reset(base_msg,request.SerializeAsString());
  75. code=encapsulate_msg(&message);
  76. if(code!=SUCCESS)
  77. return code;
  78. //循环查询请求是否被处理
  79. auto start_time=std::chrono::system_clock::now();
  80. double time=0;
  81. do{
  82. //查询到记录
  83. message::Parkspace_allocation_response_msg response;
  84. ///查询是否存在,并且删除该记录,
  85. if(m_alloc_table.find(request,response))
  86. {
  87. //判断是否接收到回应,若回应信息被赋值则证明有回应
  88. if (response.has_base_info() && response.has_command_id())
  89. {
  90. message::Base_info response_base = response.base_info();
  91. //检查类型是否匹配
  92. if (response_base.msg_type() != message::eParkspace_allocation_response_msg) {
  93. return Error_manager(PARKSPACE_ALLOC_RESPONSE_TYPE_ERROR, MAJOR_ERROR,
  94. "parkspace alloc response msg type error");
  95. }
  96. //检查基本信息是否匹配
  97. if (response_base.sender() != message::eTable ||
  98. response_base.receiver() != message::eMain ||
  99. response.command_id() != request.command_id()) {
  100. return Error_manager(PARKSPACE_ALLOC_RESPONSE_INFO_ERROR, MAJOR_ERROR,
  101. "parkspace alloc response msg info error");
  102. }
  103. result = response;
  104. m_alloc_table.erase(request);
  105. return SUCCESS;
  106. }
  107. }
  108. else
  109. {
  110. //未查询到记录,任务已经被提前取消,记录被删除
  111. return Error_manager(PARKSPACE_ALLOC_REQUEST_CANCELED,MINOR_ERROR,"parkspace alloc request canceled");
  112. }
  113. auto end_time=std::chrono::system_clock::now();
  114. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
  115. time=1000.0*double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
  116. std::this_thread::yield();
  117. usleep(1000);
  118. }while(time<double(timeout));
  119. return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"parkspace alloc request timeout");
  120. }
  121. /*
  122. * 查询车辆所在位置请求
  123. */
  124. Error_manager Parkspace_communicator::search_request(message::Parkspace_search_request_msg& request,
  125. message::Parkspace_search_response_msg& result)
  126. {
  127. /*
  128. * 检查request合法性,以及模块状态
  129. */
  130. if(request.base_info().sender()!=message::eMain||request.base_info().receiver()!=message::eTable)
  131. return Error_manager(PARKSPACE_SEARCH_REQUEST_INVALID,MINOR_ERROR,"parkspace search request invalid");
  132. if(m_search_table.find(request)==true)
  133. return Error_manager(PARKSPACE_SEARCH_REQUEST_REPEATED,MAJOR_ERROR," parkspace search request repeated");
  134. //设置超时,若没有设置,默认1000
  135. int timeout=request.base_info().has_timeout_ms()?request.base_info().timeout_ms():1000;
  136. //向测量节点发送测量请求,并记录请求
  137. Error_manager code;
  138. Communication_message message;
  139. message::Base_info base_msg;
  140. base_msg.set_msg_type(message::eParkspace_search_request_msg);
  141. base_msg.set_sender(message::eMain);
  142. base_msg.set_receiver(message::eTable);
  143. base_msg.set_timeout_ms(timeout);
  144. message.reset(base_msg,request.SerializeAsString());
  145. code=encapsulate_msg(&message);
  146. if(code!=SUCCESS)
  147. return code;
  148. //循环查询请求是否被处理
  149. auto start_time=std::chrono::system_clock::now();
  150. double time=0;
  151. do{
  152. //查询到记录
  153. message::Parkspace_search_response_msg response;
  154. ///查询是否存在,并且删除该记录,
  155. if(m_search_table.find(request,response))
  156. {
  157. //判断是否接收到回应,若回应信息被赋值则证明有回应
  158. if (response.has_base_info() && response.has_command_id())
  159. {
  160. message::Base_info response_base = response.base_info();
  161. //检查类型是否匹配
  162. if (response_base.msg_type() != message::eParkspace_search_response_msg) {
  163. return Error_manager(PARKSPACE_SEARCH_RESPONSE_TYPE_ERROR, MAJOR_ERROR,
  164. "parkspace search response msg type error");
  165. }
  166. //检查基本信息是否匹配
  167. if (response_base.sender() != message::eTable ||
  168. response_base.receiver() != message::eMain ||
  169. response.command_id() != request.command_id()) {
  170. return Error_manager(PARKSPACE_SEARCH_RESPONSE_INFO_ERROR, MAJOR_ERROR,
  171. "parkspace search response msg info error");
  172. }
  173. result = response;
  174. m_search_table.erase(request);
  175. return SUCCESS;
  176. }
  177. }
  178. else
  179. {
  180. //未查询到记录,任务已经被提前取消,记录被删除
  181. return Error_manager(PARKSPACE_SEARCH_REQUEST_CANCELED,MINOR_ERROR,"parkspace search request canceled");
  182. }
  183. auto end_time=std::chrono::system_clock::now();
  184. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
  185. time=1000.0*double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
  186. std::this_thread::yield();
  187. usleep(1000);
  188. }while(time<double(timeout));
  189. return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"parkspace search request timeout");
  190. }
  191. /*
  192. * 释放车位请求(停车失败或者取车完成时调用)
  193. */
  194. Error_manager Parkspace_communicator::release_request(message::Parkspace_release_request_msg& request,
  195. message::Parkspace_release_response_msg& result)
  196. {
  197. /*
  198. * 检查request合法性,以及模块状态
  199. */
  200. if(request.base_info().sender()!=message::eMain||request.base_info().receiver()!=message::eTable)
  201. return Error_manager(PARKSPACE_RELEASE_REQUEST_INVALID,MINOR_ERROR,"parkspace release request invalid");
  202. if(m_release_table.find(request)==true)
  203. return Error_manager(PARKSPACE_RELEASE_REQUEST_REPEATED,MAJOR_ERROR," parkspace release request repeated");
  204. //设置超时,若没有设置,默认1000
  205. int timeout=request.base_info().has_timeout_ms()?request.base_info().timeout_ms():1000;
  206. //向测量节点发送测量请求,并记录请求
  207. Error_manager code;
  208. Communication_message message;
  209. message::Base_info base_msg;
  210. base_msg.set_msg_type(message::eParkspace_release_request_msg);
  211. base_msg.set_sender(message::eMain);
  212. base_msg.set_receiver(message::eTable);
  213. base_msg.set_timeout_ms(timeout);
  214. message.reset(base_msg,request.SerializeAsString());
  215. code=encapsulate_msg(&message);
  216. if(code!=SUCCESS)
  217. return code;
  218. //循环查询请求是否被处理
  219. auto start_time=std::chrono::system_clock::now();
  220. double time=0;
  221. do{
  222. //查询到记录
  223. message::Parkspace_release_response_msg response;
  224. ///查询是否存在,并且删除该记录,
  225. if(m_release_table.find(request,response))
  226. {
  227. //判断是否接收到回应,若回应信息被赋值则证明有回应
  228. if (response.has_base_info() && response.has_command_id())
  229. {
  230. message::Base_info response_base = response.base_info();
  231. //检查类型是否匹配
  232. if (response_base.msg_type() != message::eParkspace_release_response_msg) {
  233. return Error_manager(PARKSPACE_RELEASE_RESPONSE_TYPE_ERROR, MAJOR_ERROR,
  234. "parkspace release response msg type error");
  235. }
  236. //检查基本信息是否匹配
  237. if (response_base.sender() != message::eTable ||
  238. response_base.receiver() != message::eMain ||
  239. response.command_id() != request.command_id()) {
  240. return Error_manager(PARKSPACE_RELEASE_RESPONSE_INFO_ERROR, MAJOR_ERROR,
  241. "parkspace release response msg info error");
  242. }
  243. result = response;
  244. m_release_table.erase(request);
  245. return SUCCESS;
  246. }
  247. }
  248. else
  249. {
  250. //未查询到记录,任务已经被提前取消,记录被删除
  251. return Error_manager(PARKSPACE_RELEASE_REQUEST_CANCELED,MINOR_ERROR,"parkspace release request canceled");
  252. }
  253. auto end_time=std::chrono::system_clock::now();
  254. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
  255. time=1000.0*double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
  256. std::this_thread::yield();
  257. usleep(1000);
  258. }while(time<double(timeout));
  259. return Error_manager(RESPONSE_TIMEOUT,MINOR_ERROR,"parkspace release request timeout");
  260. }
  261. Error_manager Parkspace_communicator::check_statu()
  262. {
  263. return SUCCESS;
  264. }
  265. Parkspace_communicator::Parkspace_communicator(){}
  266. Error_manager Parkspace_communicator::encapsulate_msg(Communication_message* message)
  267. {
  268. switch (message->get_message_type())
  269. {
  270. case Communication_message::eParkspace_allocation_request_msg:
  271. {
  272. message::Parkspace_allocation_request_msg request;
  273. request.ParseFromString(message->get_message_buf());
  274. //记录数据
  275. m_alloc_table[request]=message::Parkspace_allocation_response_msg();
  276. //发送请求
  277. return Communication_socket_base::encapsulate_msg(message);
  278. }
  279. case Communication_message::eParkspace_search_request_msg:
  280. {
  281. message::Parkspace_search_request_msg request;
  282. request.ParseFromString(message->get_message_buf());
  283. //记录数据
  284. m_search_table[request]=message::Parkspace_search_response_msg();
  285. //发送请求
  286. return Communication_socket_base::encapsulate_msg(message);
  287. }
  288. case Communication_message::eParkspace_release_request_msg:
  289. {
  290. message::Parkspace_release_request_msg request;
  291. request.ParseFromString(message->get_message_buf());
  292. //记录数据
  293. m_release_table[request]=message::Parkspace_release_response_msg();
  294. //发送请求
  295. return Communication_socket_base::encapsulate_msg(message);
  296. }
  297. default:
  298. return Error_manager(PARKSPACE_REQUEST_MSG_TYPE_ERROR,NEGLIGIBLE_ERROR,"parkspace message table is not exist");
  299. }
  300. }
  301. Error_manager Parkspace_communicator::execute_msg(Communication_message* p_msg)
  302. {
  303. if(p_msg== nullptr)
  304. return Error_manager(POINTER_IS_NULL,CRITICAL_ERROR,"parkspace response msg pointer is null");
  305. //车位response消息
  306. switch (p_msg->get_message_type())
  307. {
  308. ///测量结果反馈消息
  309. case Communication_message::eParkspace_allocation_response_msg:
  310. {
  311. message::Parkspace_allocation_response_msg response;
  312. response.ParseFromString(p_msg->get_message_buf());
  313. message::Parkspace_allocation_request_msg request=create_request_by_response(response);
  314. ///查询请求表是否存在,并且更新
  315. if(m_alloc_table.find_update(request,response))
  316. {
  317. return Error_manager(PARKSPACE_ALLOCMSG_RESPONSE_HAS_NO_REQUEST,NEGLIGIBLE_ERROR,"parkspace alloc response without request");
  318. }
  319. break;
  320. }
  321. case Communication_message::eParkspace_search_response_msg:
  322. {
  323. message::Parkspace_search_response_msg response;
  324. response.ParseFromString(p_msg->get_message_buf());
  325. message::Parkspace_search_request_msg request=create_request_by_response(response);
  326. ///查询请求表是否存在,并且更新
  327. if(m_search_table.find_update(request,response))
  328. {
  329. return Error_manager(PARKSPACE_SEARCHMSG_RESPONSE_HAS_NO_REQUEST,NEGLIGIBLE_ERROR,"parkspace search response without request");
  330. }
  331. break;
  332. }
  333. case Communication_message::eParkspace_release_response_msg:
  334. {
  335. message::Parkspace_release_response_msg response;
  336. response.ParseFromString(p_msg->get_message_buf());
  337. message::Parkspace_release_request_msg request=create_request_by_response(response);
  338. ///查询请求表是否存在,并且更新
  339. if(m_release_table.find_update(request,response))
  340. {
  341. return Error_manager(PARKSPACE_RELEASEMSG_RESPONSE_HAS_NO_REQUEST,NEGLIGIBLE_ERROR,"parkspace release response without request");
  342. }
  343. break;
  344. }
  345. ///测量系统状态
  346. case Communication_message::eParkspace_allocation_status_msg:
  347. {
  348. m_parkspace_status_msg=*p_msg;
  349. break;
  350. }
  351. }
  352. return SUCCESS;
  353. }
  354. /*
  355. * 检测消息类型是否可被处理
  356. */
  357. Error_manager Parkspace_communicator::check_msg(Communication_message* p_msg)
  358. {
  359. //通过 p_msg->get_message_type() 和 p_msg->get_receiver() 判断这条消息是不是给我的.
  360. //子类重载时, 增加自己模块的判断逻辑, 以后再写.
  361. if ( (p_msg->get_message_type() == Communication_message::Message_type::eParkspace_allocation_response_msg
  362. ||p_msg->get_message_type() == Communication_message::Message_type::eParkspace_search_response_msg
  363. ||p_msg->get_message_type() == Communication_message::Message_type::eParkspace_release_response_msg
  364. ||p_msg->get_message_type() == Communication_message::Message_type::eParkspace_allocation_status_msg)
  365. && p_msg->get_receiver() == Communication_message::Communicator::eMain )
  366. {
  367. return Error_code::SUCCESS;
  368. }
  369. else
  370. {
  371. //认为接受人
  372. return Error_code::INVALID_MESSAGE;
  373. }
  374. return SUCCESS;
  375. }
  376. /*
  377. * 心跳发送函数,重载
  378. */
  379. Error_manager Parkspace_communicator::encapsulate_send_data()
  380. {
  381. return SUCCESS;
  382. }
  383. //检查消息是否可以被解析, 需要重载
  384. Error_manager Parkspace_communicator::check_executer(Communication_message* p_msg)
  385. {
  386. return SUCCESS;
  387. }
  388. /*
  389. * 根据接收到的response,生成对应的 request
  390. */
  391. message::Parkspace_allocation_request_msg
  392. Parkspace_communicator::create_request_by_response(message::Parkspace_allocation_response_msg& response)
  393. {
  394. message::Parkspace_allocation_request_msg request;
  395. message::Base_info baseInfo;
  396. baseInfo.set_msg_type(message::eLocate_request_msg);
  397. baseInfo.set_sender(response.base_info().sender());
  398. baseInfo.set_receiver(response.base_info().receiver());
  399. request.mutable_base_info()->CopyFrom(baseInfo);
  400. request.set_command_id(response.command_id());
  401. request.set_terminal_id(response.command_id());
  402. return request;
  403. }
  404. message::Parkspace_search_request_msg
  405. Parkspace_communicator::create_request_by_response(message::Parkspace_search_response_msg& response)
  406. {
  407. message::Parkspace_search_request_msg request;
  408. message::Base_info baseInfo;
  409. baseInfo.set_msg_type(message::eLocate_request_msg);
  410. baseInfo.set_sender(response.base_info().sender());
  411. baseInfo.set_receiver(response.base_info().receiver());
  412. request.mutable_base_info()->CopyFrom(baseInfo);
  413. request.set_command_id(response.command_id());
  414. return request;
  415. }
  416. message::Parkspace_release_request_msg
  417. Parkspace_communicator::create_request_by_response(message::Parkspace_release_response_msg& response)
  418. {
  419. message::Parkspace_release_request_msg request;
  420. message::Base_info baseInfo;
  421. baseInfo.set_msg_type(message::eLocate_request_msg);
  422. baseInfo.set_sender(response.base_info().sender());
  423. baseInfo.set_receiver(response.base_info().receiver());
  424. request.mutable_base_info()->CopyFrom(baseInfo);
  425. request.set_command_id(response.command_id());
  426. return request;
  427. }