// // Created by zx on 2020/7/7. // #include #include #include "PickupProcessTask.h" #include "process_message.pb.h" #include "command_manager.h" #include "system_communicator.h" PickupProcessTask::PickupProcessTask(unsigned int terminal_id) :m_publish_statu_thread(nullptr) { m_terminor_id=terminal_id; m_command_id=-1; message::Base_info base_info; base_info.set_msg_type(message::eStoring_process_statu_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eEmpty); m_picking_process_statu_msg.mutable_base_info()->CopyFrom(base_info); m_picking_process_statu_msg.set_terminal_id(terminal_id); reset_process_statu(); } PickupProcessTask::~PickupProcessTask() { //退出线程 m_publish_exit_condition.set_pass_ever(true); if(m_publish_statu_thread!= nullptr) { if(m_publish_statu_thread->joinable()) { m_publish_statu_thread->join(); } delete m_publish_statu_thread; m_publish_statu_thread=nullptr; } } Error_manager PickupProcessTask::init_task(unsigned int command_id, message::Car_info car_info) { m_command_id=command_id; m_car_info=car_info; message::Base_info base_info; base_info.set_msg_type(message::ePicking_process_statu_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eEmpty); m_picking_process_statu_msg.mutable_base_info()->CopyFrom(base_info); reset_process_statu(); ///创建状态发布线程 if(m_publish_statu_thread== nullptr) { m_publish_exit_condition.reset(false, false, false); m_publish_statu_thread=new std::thread(publish_thread_func,this); } if(is_ready()) { return SUCCESS; } else { return Error_manager(ERROR,MINOR_ERROR,"终端未准备!!!"); } } /* * reset 进度信息 */ void PickupProcessTask::reset_process_statu() { message::Check_space_step_statu check_step; check_step.set_step_statu(message::eWaiting); message::Dispatch_pick_step_statu pick_step; pick_step.set_step_statu(message::eWaiting); message::Release_space_step_statu release_step; release_step.set_step_statu(message::eWaiting); m_picking_process_statu_msg.mutable_check_space_step()->CopyFrom(check_step); m_picking_process_statu_msg.mutable_dispatch_step()->CopyFrom(pick_step); m_picking_process_statu_msg.mutable_release_space_step()->CopyFrom(release_step); } /* * 检查当前任务是否处于空闲准备状态 */ bool PickupProcessTask::is_ready() { bool cond_check_space = m_picking_process_statu_msg.check_space_step().step_statu()==message::eWaiting ||m_picking_process_statu_msg.check_space_step().step_statu()==message::eComplete; bool cond_dispatch = m_picking_process_statu_msg.dispatch_step().step_statu()==message::eWaiting ||m_picking_process_statu_msg.dispatch_step().step_statu()==message::eComplete; bool cond_release_space = m_picking_process_statu_msg.release_space_step().step_statu()==message::eWaiting ||m_picking_process_statu_msg.release_space_step().step_statu()==message::eComplete; return cond_check_space && cond_dispatch && cond_release_space; } /* * 查询车位 */ Error_manager PickupProcessTask::search_space() { //更新状态 m_picking_process_statu_msg.mutable_check_space_step()->set_step_statu(message::eWorking); /* * 检验汽车信息是否正常 */ if(m_car_info.has_car_width()==false||m_car_info.has_car_height()== false ||m_car_info.has_license()==false) { m_picking_process_statu_msg.mutable_check_space_step()->set_step_statu(message::eError); m_picking_process_statu_msg.mutable_check_space_step()->set_description("查询车位请求汽车信息错误"); return Error_manager(INVALID_MESSAGE,CRITICAL_ERROR,"查询车位请求汽车信息错误"); } /* * 检查车位管理模块是否正常 */ Error_manager code=Parkspace_communicator::get_instance_pointer()->check_statu(); if(code!=SUCCESS) { m_picking_process_statu_msg.mutable_check_space_step()->set_description(code.get_error_description()); m_picking_process_statu_msg.mutable_check_space_step()->set_step_statu(message::eError); return code; } message::Base_info base_info; base_info.set_msg_type(message::eParkspace_search_request_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eParkspace); base_info.set_timeout_ms(1000); message::Parkspace_search_request_msg request; request.set_command_id(m_command_id); request.mutable_base_info()->CopyFrom(base_info); request.mutable_car_info()->CopyFrom(m_car_info); code = Parkspace_communicator::get_instance_pointer()->search_request(request,m_parcspace_search_response_msg); if(code==SUCCESS) { m_picking_process_statu_msg.mutable_check_space_step()->mutable_space_info()->CopyFrom(m_parcspace_search_response_msg.car_position()); m_picking_process_statu_msg.mutable_check_space_step()->set_step_statu(message::eComplete); } else { m_picking_process_statu_msg.mutable_check_space_step()->set_step_statu(message::eError); m_picking_process_statu_msg.mutable_check_space_step()->set_description(code.get_error_description()); } return code; } void PickupProcessTask::Main() { Error_manager code; //进入取车流程 switch (0) { //第一步,执行取车动作 case 0: { //更新状态 m_picking_process_statu_msg.mutable_dispatch_step()->set_step_statu(message::eWorking); m_picking_process_statu_msg.mutable_dispatch_step()->mutable_space_info()->CopyFrom(m_parcspace_search_response_msg.car_position()); //开始工作 code=pickup_step(); if(code!=SUCCESS) { LOG(ERROR)<<"取车调度失败,取车终端:"<set_step_statu(message::eError); m_picking_process_statu_msg.mutable_dispatch_step()->set_description(code.get_error_description()); break; } m_picking_process_statu_msg.mutable_dispatch_step()->set_step_statu(message::eComplete); LOG(WARNING)<<"取车调度成功,取车终端:"<set_step_statu(message::eWorking); m_picking_process_statu_msg.mutable_release_space_step()->mutable_space_info()->CopyFrom(m_parcspace_search_response_msg.car_position()); code=release_space_step(); if(code!=SUCCESS) { m_picking_process_statu_msg.mutable_release_space_step()->set_step_statu(message::eError); m_picking_process_statu_msg.mutable_release_space_step()->set_description(code.get_error_description()); LOG(ERROR)<<"取车释放车位失败:"<set_step_statu(message::eComplete); } //第三步,等待车辆离开 case 2: { //更新状态 m_picking_process_statu_msg.mutable_waitfor_leave()->set_step_statu(message::eWorking); m_picking_process_statu_msg.mutable_waitfor_leave()->mutable_car_info()->CopyFrom(m_car_info); //等待离开 code=wait_for_leave_step(); if(code!=SUCCESS) { m_picking_process_statu_msg.mutable_waitfor_leave()->set_step_statu(message::eError); m_picking_process_statu_msg.mutable_waitfor_leave()->set_description(code.get_error_description()); break; } m_picking_process_statu_msg.mutable_waitfor_leave()->set_step_statu(message::eComplete); } } } /* * 执行取车动作请求,并等待执行完成 */ Error_manager PickupProcessTask::pickup_step() { /* * 检查是否曾经分配过车位 */ if(m_parcspace_search_response_msg.has_car_position()==false) { return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息"); } //2,判断调度节点状态 Error_manager code=Dispatch_communicator::get_instance_pointer()->check_statu(); if(code!=SUCCESS) return code; message::Dispatch_request_msg request; message::Base_info base_info; base_info.set_msg_type(message::eDispatch_request_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eDispatch); base_info.set_timeout_ms(1000*300); //测量超时300s request.mutable_base_info()->CopyFrom(base_info); message::Parkspace_info space_info=m_parcspace_search_response_msg.car_position(); request.set_dispatch_motion_direction(message::E_PICKUP_CAR); request.set_parkspace_id(space_info.parkspace_id()); request.set_terminal_id(m_terminor_id); request.set_command_id(m_command_id); message::Dispatch_response_msg response; code=Dispatch_communicator::get_instance_pointer()->dispatch_request(request,response); if(code!=SUCCESS) return code; if(response.error_manager().error_code()==0) { return SUCCESS; } else return Error_manager(FAILED,MINOR_ERROR,"取车流程调度反馈错误码"); } /* * 等待车辆离开 */ Error_manager PickupProcessTask::wait_for_leave_step() { return SUCCESS; } /* * 清除车位表中对应的车位 */ Error_manager PickupProcessTask::release_space_step() { /* * 检查是否曾经分配过车位 */ if(m_parcspace_search_response_msg.has_car_position()==false) { return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息"); } /* * 检查车位管理模块是否正常 */ Error_manager code=Parkspace_communicator::get_instance_pointer()->check_statu(); if(code!=SUCCESS) return code; message::Parkspace_release_request_msg request; message::Base_info base_info; base_info.set_msg_type(message::eParkspace_release_request_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eParkspace); base_info.set_timeout_ms(1000); //测量超时1s request.mutable_base_info()->CopyFrom(base_info); message::Parkspace_info space_info=m_parcspace_search_response_msg.car_position(); request.mutable_release_space_info()->CopyFrom(space_info); request.set_command_id(m_command_id); message::Parkspace_release_response_msg release_response; code=Parkspace_communicator::get_instance_pointer()->release_request(request,release_response); if(code!=SUCCESS) return code; if(release_response.error_manager().error_code()==0) { return SUCCESS; } else return Error_manager(FAILED,MINOR_ERROR,"取车流程parkspace release response error_code error"); } /* * 发布状态线程 */ void PickupProcessTask::publish_thread_func(PickupProcessTask* ptask) { if(ptask) { ptask->publish_step_status(); } } void PickupProcessTask::publish_step_status() { //未收到退出信号 while(false==m_publish_exit_condition.wait_for_ex(std::chrono::milliseconds(200))) { /* * 通过communicator 发布状态 */ if(System_communicator::get_instance_pointer()) { if(m_picking_process_statu_msg.has_base_info()==true) { System_communicator::get_instance_pointer()->post_entrance_statu(m_picking_process_statu_msg); } } } }