PickupProcessTask.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. //
  2. // Created by zx on 2020/7/7.
  3. //
  4. #include <Parkspace_communicator.h>
  5. #include <dispatch_message.pb.h>
  6. #include "PickupProcessTask.h"
  7. #include "process_message.pb.h"
  8. #include "command_manager.h"
  9. #include "system_communicator.h"
  10. #include "uniq_key.h"
  11. PickupProcessTask::PickupProcessTask(unsigned int terminal_id)
  12. {
  13. m_terminor_id=terminal_id;
  14. reset_process_statu();
  15. }
  16. PickupProcessTask::~PickupProcessTask()
  17. {
  18. }
  19. Error_manager PickupProcessTask::init_task(message::Command_info command_info, message::Car_info car_info)
  20. {
  21. m_command_info=command_info;
  22. m_car_info=car_info;
  23. if(is_ready()) {
  24. reset_process_statu();
  25. }
  26. else
  27. {
  28. return Error_manager(ERROR,MINOR_ERROR,"终端未准备!!!");
  29. }
  30. }
  31. /*
  32. * reset 进度信息
  33. */
  34. void PickupProcessTask::reset_process_statu()
  35. {
  36. message::Check_space_step_statu check_step;
  37. check_step.set_step_statu(message::eWaiting);
  38. message::Dispatch_pick_step_statu pick_step;
  39. pick_step.set_step_statu(message::eWaiting);
  40. message::Release_space_step_statu release_step;
  41. release_step.set_step_statu(message::eWaiting);
  42. message::Waitfor_leave_step_statu waitfor_leave_step;
  43. waitfor_leave_step.set_step_statu(message::eWaiting);
  44. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  45. m_picking_process_statu.mutable_check_space_step()->CopyFrom(check_step);
  46. m_picking_process_statu.mutable_dispatch_step()->CopyFrom(pick_step);
  47. m_picking_process_statu.mutable_release_space_step()->CopyFrom(release_step);
  48. m_picking_process_statu.mutable_waitfor_leave()->CopyFrom(waitfor_leave_step);
  49. m_picking_process_statu.set_license(m_car_info.license());
  50. }
  51. /*
  52. * 检查当前任务是否处于空闲准备状态
  53. */
  54. bool PickupProcessTask::is_ready()
  55. {
  56. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  57. bool cond_check_space = m_picking_process_statu.check_space_step().step_statu()==message::eWaiting
  58. ||m_picking_process_statu.check_space_step().step_statu()==message::eComplete;
  59. bool cond_dispatch = m_picking_process_statu.dispatch_step().step_statu()==message::eWaiting
  60. ||m_picking_process_statu.dispatch_step().step_statu()==message::eComplete;
  61. bool cond_release_space = m_picking_process_statu.release_space_step().step_statu()==message::eWaiting
  62. ||m_picking_process_statu.release_space_step().step_statu()==message::eComplete;
  63. return cond_check_space && cond_dispatch && cond_release_space;
  64. }
  65. /*
  66. * 查询车位
  67. */
  68. Error_manager PickupProcessTask::search_space()
  69. {
  70. //更新状态
  71. {
  72. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  73. m_picking_process_statu.mutable_check_space_step()->set_step_statu(message::eWorking);
  74. }
  75. /*
  76. * 检验汽车信息是否正常
  77. */
  78. if(m_car_info.has_car_width()==false||m_car_info.has_car_height()== false
  79. ||m_car_info.has_license()==false)
  80. {
  81. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  82. m_picking_process_statu.mutable_check_space_step()->set_step_statu(message::eError);
  83. m_picking_process_statu.mutable_check_space_step()->set_description("查询车位请求汽车信息错误");
  84. return Error_manager(INVALID_MESSAGE,CRITICAL_ERROR,"查询车位请求汽车信息错误");
  85. }
  86. /*
  87. * 检查车位管理模块是否正常
  88. */
  89. Error_manager code=Parkspace_communicator::get_instance_pointer()->check_statu();
  90. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  91. if(code!=SUCCESS)
  92. {
  93. m_picking_process_statu.mutable_check_space_step()->set_description(code.get_error_description());
  94. m_picking_process_statu.mutable_check_space_step()->set_step_statu(message::eError);
  95. return code;
  96. }
  97. message::Base_info base_info;
  98. base_info.set_msg_type(message::eParkspace_search_request_msg);
  99. base_info.set_sender(message::eMain);
  100. base_info.set_receiver(message::eParkspace);
  101. base_info.set_timeout_ms(1000);
  102. message::Parkspace_search_request_msg request;
  103. request.mutable_command_info()->CopyFrom(m_command_info);
  104. request.mutable_command_info()->set_time(create_key());
  105. request.mutable_base_info()->CopyFrom(base_info);
  106. request.mutable_car_info()->CopyFrom(m_car_info);
  107. code = Parkspace_communicator::get_instance_pointer()->search_request(request,m_parcspace_search_response_msg);
  108. if(code==SUCCESS)
  109. {
  110. m_picking_process_statu.mutable_check_space_step()->mutable_space_info()->CopyFrom(m_parcspace_search_response_msg.car_position());
  111. m_picking_process_statu.mutable_check_space_step()->set_step_statu(message::eComplete);
  112. }
  113. else {
  114. m_picking_process_statu.mutable_check_space_step()->set_step_statu(message::eError);
  115. m_picking_process_statu.mutable_check_space_step()->set_description(code.get_error_description());
  116. }
  117. return code;
  118. }
  119. void PickupProcessTask::Main()
  120. {
  121. Error_manager code;
  122. //进入取车流程
  123. switch (0)
  124. {
  125. //第一步,执行取车动作
  126. case 0:
  127. {
  128. //更新状态
  129. {
  130. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  131. m_picking_process_statu.mutable_dispatch_step()->set_step_statu(message::eWorking);
  132. m_picking_process_statu.mutable_dispatch_step()->mutable_space_info()->CopyFrom(
  133. m_parcspace_search_response_msg.car_position());
  134. }
  135. //开始工作
  136. code=pickup_step();
  137. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  138. if(code!=SUCCESS)
  139. {
  140. LOG(ERROR)<<"取车调度失败,取车终端:"<<m_terminor_id<<"指令id:"<<m_command_info.place()
  141. <<", 车位id:"<<m_parcspace_search_response_msg.car_position().parkspace_id()
  142. <<", 车位楼层:"<<m_parcspace_search_response_msg.car_position().floor()
  143. <<", 车位序号:"<<m_parcspace_search_response_msg.car_position().index()
  144. <<", 车牌号:"<<m_car_info.license()
  145. <<", 库内车牌号:"<<m_parcspace_search_response_msg.car_position().car_info().license();
  146. m_picking_process_statu.mutable_dispatch_step()->set_step_statu(message::eError);
  147. m_picking_process_statu.mutable_dispatch_step()->set_description(code.get_error_description());
  148. break;
  149. }
  150. m_picking_process_statu.mutable_dispatch_step()->set_step_statu(message::eComplete);
  151. LOG(WARNING)<<"取车调度成功,取车终端:"<<m_terminor_id<<"指令id:"<<m_command_info.place()
  152. <<", 车位id:"<<m_parcspace_search_response_msg.car_position().parkspace_id()
  153. <<", 车位楼层:"<<m_parcspace_search_response_msg.car_position().floor()
  154. <<", 车位序号:"<<m_parcspace_search_response_msg.car_position().index()
  155. <<", 车牌号:"<<m_car_info.license()
  156. <<", 库内车牌号:"<<m_parcspace_search_response_msg.car_position().car_info().license();
  157. }
  158. //第二步,清除车位
  159. case 1:
  160. {
  161. //更新状态
  162. {
  163. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  164. m_picking_process_statu.mutable_release_space_step()->set_step_statu(message::eWorking);
  165. m_picking_process_statu.mutable_release_space_step()->mutable_space_info()->CopyFrom(
  166. m_parcspace_search_response_msg.car_position());
  167. }
  168. code=release_space_step();
  169. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  170. if(code!=SUCCESS)
  171. {
  172. m_picking_process_statu.mutable_release_space_step()->set_step_statu(message::eError);
  173. m_picking_process_statu.mutable_release_space_step()->set_description(code.get_error_description());
  174. LOG(ERROR)<<"取车释放车位失败:"<<code.get_error_description();
  175. break;
  176. }
  177. m_picking_process_statu.mutable_release_space_step()->set_step_statu(message::eComplete);
  178. }
  179. //第三步,等待车辆离开
  180. case 2:
  181. {
  182. //更新状态
  183. {
  184. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  185. m_picking_process_statu.mutable_waitfor_leave()->set_step_statu(message::eWorking);
  186. m_picking_process_statu.mutable_waitfor_leave()->mutable_car_info()->CopyFrom(m_car_info);
  187. }
  188. //等待离开
  189. code=wait_for_leave_step();
  190. std::lock_guard<std::mutex> lock(m_picking_statu_lock);
  191. if(code!=SUCCESS)
  192. {
  193. m_picking_process_statu.mutable_waitfor_leave()->set_step_statu(message::eError);
  194. m_picking_process_statu.mutable_waitfor_leave()->set_description(code.get_error_description());
  195. break;
  196. }
  197. m_picking_process_statu.mutable_waitfor_leave()->set_step_statu(message::eComplete);
  198. }
  199. }
  200. }
  201. /*
  202. * 执行取车动作请求,并等待执行完成
  203. */
  204. Error_manager PickupProcessTask::pickup_step()
  205. {
  206. /*
  207. * 检查是否曾经分配过车位
  208. */
  209. if(m_parcspace_search_response_msg.has_car_position()==false)
  210. {
  211. return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息");
  212. }
  213. //2,判断调度节点状态
  214. Error_manager code=Dispatch_communicator::get_instance_pointer()->check_export_statu(m_terminor_id);
  215. if(code!=SUCCESS)
  216. return code;
  217. message::Dispatch_request_msg request;
  218. message::Base_info base_info;
  219. base_info.set_msg_type(message::eDispatch_request_msg);
  220. base_info.set_sender(message::eMain);
  221. base_info.set_receiver(message::eDispatch);
  222. base_info.set_timeout_ms(1000*300); //测量超时300s
  223. request.mutable_base_info()->CopyFrom(base_info);
  224. message::Parkspace_info space_info=m_parcspace_search_response_msg.car_position();
  225. request.set_dispatch_motion_direction(message::E_PICKUP_CAR);
  226. request.set_parkspace_id(space_info.parkspace_id());
  227. request.set_terminal_id(m_terminor_id);
  228. request.mutable_command_info()->CopyFrom(m_command_info);
  229. request.mutable_command_info()->set_time(create_key());
  230. message::Dispatch_response_msg response;
  231. code=Dispatch_communicator::get_instance_pointer()->dispatch_request(request,response);
  232. if(code!=SUCCESS)
  233. return code;
  234. if(response.error_manager().error_code()==0) {
  235. return SUCCESS;
  236. }
  237. else
  238. return Error_manager(FAILED,MINOR_ERROR,"取车流程调度反馈错误码");
  239. }
  240. /*
  241. * 等待车辆离开
  242. */
  243. Error_manager PickupProcessTask::wait_for_leave_step()
  244. {
  245. return SUCCESS;
  246. }
  247. /*
  248. * 清除车位表中对应的车位
  249. */
  250. Error_manager PickupProcessTask::release_space_step()
  251. {
  252. /*
  253. * 检查是否曾经分配过车位
  254. */
  255. if(m_parcspace_search_response_msg.has_car_position()==false)
  256. {
  257. return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息");
  258. }
  259. /*
  260. * 检查车位管理模块是否正常
  261. */
  262. Error_manager code=Parkspace_communicator::get_instance_pointer()->check_statu();
  263. if(code!=SUCCESS)
  264. return code;
  265. message::Parkspace_release_request_msg request;
  266. message::Base_info base_info;
  267. base_info.set_msg_type(message::eParkspace_release_request_msg);
  268. base_info.set_sender(message::eMain);
  269. base_info.set_receiver(message::eParkspace);
  270. base_info.set_timeout_ms(1000); //测量超时1s
  271. request.mutable_base_info()->CopyFrom(base_info);
  272. message::Parkspace_info space_info=m_parcspace_search_response_msg.car_position();
  273. request.mutable_release_space_info()->CopyFrom(space_info);
  274. request.mutable_command_info()->CopyFrom(m_command_info);
  275. request.mutable_command_info()->set_time(create_key());
  276. message::Parkspace_release_response_msg release_response;
  277. code=Parkspace_communicator::get_instance_pointer()->release_request(request,release_response);
  278. if(code!=SUCCESS)
  279. return code;
  280. if(release_response.error_manager().error_code()==0) {
  281. return SUCCESS;
  282. }
  283. else
  284. return Error_manager(FAILED,MINOR_ERROR,"取车流程parkspace release response error_code error");
  285. }