// // Created by zx on 2020/7/7. // #include #include #include "PickupProcessTask.h" #include "process_message.pb.h" #include "command_manager.h" #include "command_accepter.h" #include "exception_solver.h" #include "uniq_key.h" PickupProcessTask::PickupProcessTask(unsigned int terminal_id,message::Car_info car_info) :Process_task(terminal_id,car_info) { } PickupProcessTask::~PickupProcessTask() { Exception_solver::get_instance_pointer()->delete_task_cancel_condition(m_car_info.license()); } Error_manager PickupProcessTask::init_task() { reset_recv_msg(); //添加当前流程的任务取消标志位到异常处理模块 m_cancel_condition.reset(false, false, false); Error_manager code=Exception_solver::get_instance_pointer()->add_task_cancel_condition(m_car_info.license(),this); if(code!=SUCCESS) return code; //设置状态消息,基本信息 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_process_msg.mutable_base_info()->CopyFrom(base_info); m_process_msg.set_terminal_id(m_terminor_id); m_process_msg.set_license(m_car_info.license()); m_current_step_type=message::eSearch_step; ///创建状态发布线程 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); } return SUCCESS; } void PickupProcessTask::reset_recv_msg() { m_search_request_msg=message::Parkspace_search_request_msg(); m_search_response_msg=message::Parkspace_search_response_msg(); m_dispatch_request_msg=message::Dispatch_request_msg(); m_dispatch_response_msg=message::Dispatch_response_msg(); m_command_response_msg=message::Pickup_command_response_msg(); } /* * 查询车位 */ Error_manager PickupProcessTask::search_space_step() { message::Base_info base_info_response; base_info_response.set_msg_type(message::ePickup_command_response_msg); base_info_response.set_sender(message::eMain); base_info_response.set_receiver(message::eTerminor); m_command_response_msg.mutable_base_info()->CopyFrom(base_info_response); m_command_response_msg.set_terminal_id(m_terminor_id); if(Command_manager::get_instance_pointer()->is_paused()==true) { return Error_manager(PAUSE, MINOR_ERROR, "系统已急停"); } message::Entrance_statu statu=Command_manager::get_instance_pointer()->export_statu(m_terminor_id); if(statu.has_paused()==false) { return Error_manager(ERROR, MINOR_ERROR, "出口已禁止使用 Disable"); } if(statu.paused()==true) { return Error_manager(ERROR, MINOR_ERROR, "出口已禁止使用 Disable"); } /* * 检验汽车信息是否正常 */ if(m_car_info.has_car_width()==false||m_car_info.has_car_height()== false ||m_car_info.has_license()==false) { return Error_manager(INVALID_MESSAGE,CRITICAL_ERROR,"查询车位请求信息错误"); } /* * 检查车位管理模块是否正常 */ Error_manager code=Parkspace_excutor::get_instance_pointer()->check_statu(); if(code!=SUCCESS) { return code; } message::Base_info base_info_request; base_info_request.set_msg_type(message::eParkspace_search_request_msg); base_info_request.set_sender(message::eMain); base_info_request.set_receiver(message::eParkspace); base_info_request.set_timeout_ms(2000); message::Parkspace_search_request_msg request; request.set_command_key(create_key()); request.mutable_base_info()->CopyFrom(base_info_request); request.mutable_car_info()->CopyFrom(m_car_info); code = Parkspace_excutor::get_instance_pointer()->search_request(request, m_search_response_msg,m_cancel_condition); return code; } /* * 回退查询车位 */ Error_manager PickupProcessTask::back_search_space_step() { return SUCCESS; } /* * 控制流程到下一步 */ Error_manager PickupProcessTask::next_step() { if(m_current_step_statu==message::eWaiting || m_current_step_statu== message::eWorking) return Error_manager(ERROR,MINOR_ERROR,"当前状态禁止改变步骤类型"); switch (m_current_step_type) { case message::eSearch_step: m_current_step_type=(m_current_step_statu==message::eFinished)?message::eDispatch_step:message::eBackComplete; break; case message::eDispatch_step: m_current_step_type=(m_current_step_statu==message::eFinished)?message::eWait_step:message::eBackSearch_step; break; case message::eWait_step: m_current_step_type=(m_current_step_statu==message::eFinished)?message::eComplete:message::eBackDispatch_step; break; case message::eComplete: break; case message::eBackDispatch_step: m_current_step_type=message::eBackSearch_step; break; case message::eBackSearch_step: m_current_step_type=message::eBackComplete; break; case message::eBackComplete: break; default: LOG(ERROR)<<" 取车流程未知步骤 : "<CopyFrom(error_msg); Communication_message msg; msg.reset(m_command_response_msg.base_info(),m_command_response_msg.SerializeAsString()); Message_communicator::get_instance_pointer()->send_msg(&msg); LOG_IF(ERROR, code != SUCCESS) << "查询失败,取车终端:"<post_process_statu(m_process_msg); break; } if(m_current_step_type== message::eBackWait_step) { code=back_wait_for_leave_step(); if(code!=SUCCESS) { //提升错误等级为四级 break; } else { m_current_step_type= message::eBackDispatch_step; } } if(m_current_step_type== message::eBackDispatch_step) { code=back_dispatch_step(); if(code!=SUCCESS) { //提升错误等级为四级 break; } else { m_current_step_type= message::eBackSearch_step; } } if(m_current_step_type== message::eBackSearch_step) { code=back_search_space_step(); if(code!=SUCCESS) { //提升错误等级为四级,急停 break; } else { m_current_step_type= message::eBackComplete; } } if(m_current_step_type== message::eBackComplete) break; } /* * 跳出循环后,判断状态,是否正常结束, 循环跳出状态只有可能是 eBackComplete(异常结束),eComplete(正常结束) */ if(m_current_step_type== message::eBackComplete) { //异常结束 usleep(1000*1000); LOG(ERROR)<<"异常停车,回退结束"<<"车牌号:"<check_export_statu(m_terminor_id); 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_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_key(create_key()); message::Dispatch_response_msg response; code=Dispatch_excutor::get_instance_pointer()->dispatch_request(request,response,m_cancel_condition); if(code!=SUCCESS) return code; if(response.error_manager().error_code()==0) { return SUCCESS; } else return Error_manager(FAILED,MINOR_ERROR,"取车流程调度反馈错误码"); } /* * 回退取车调度 */ Error_manager PickupProcessTask::back_dispatch_step() { /* * 关门,搬运将车从出口抓回去 */ return SUCCESS; } /* * 等待车辆离开 */ Error_manager PickupProcessTask::wait_for_leave_step() { return SUCCESS; } /* * 回退等待车辆离开 */ Error_manager PickupProcessTask::back_wait_for_leave_step() { return SUCCESS; } /* * 清除车位表中对应的车位 */ Error_manager PickupProcessTask::release_space_step() { /* * 检查是否曾经分配过车位 */ if(m_search_response_msg.has_car_position()==false) { return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息"); } /* * 检查车位管理模块是否正常 */ Error_manager code=Parkspace_excutor::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(5000); //测量超时1s request.mutable_base_info()->CopyFrom(base_info); message::Parkspace_info space_info=m_search_response_msg.car_position(); request.mutable_release_space_info()->CopyFrom(space_info); request.set_command_key(create_key()); message::Parkspace_release_response_msg release_response; code=Parkspace_excutor::get_instance_pointer()->release_request(request,release_response,m_cancel_condition); 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_step_status() { /* * 通过communicator 发布状态 */ if (Command_accepter::get_instance_pointer()) { updata_step_statu_msg(); Command_accepter::get_instance_pointer()->post_process_statu(m_process_msg); } } /* * 根据当前流程状态,生成状态消息 */ void PickupProcessTask::updata_step_statu_msg() { message::Search_space_step_statu search_step_statu; message::Dispatch_pick_step_statu dispatch_step_statu; message::Waitfor_leave_step_statu wait_step_statu; message::Release_space_step_statu release_step_statu; search_step_statu.set_step_statu(message::eWaiting); dispatch_step_statu.set_step_statu(message::eWaiting); wait_step_statu.set_step_statu(message::eWaiting); release_step_statu.set_step_statu(message::eWaiting); switch (m_current_step_type) { case message::eSearch_step: { search_step_statu.set_step_statu(message::eWorking); if(m_current_step_type==message::eSearch_step) break; } case message::eDispatch_step: { search_step_statu.set_step_statu(message::eFinished); dispatch_step_statu.set_step_statu(message::eWorking); dispatch_step_statu.mutable_space_info()->CopyFrom(m_search_response_msg.car_position()); if(m_current_step_type==message::eDispatch_step) break; } case message::eWait_step: { dispatch_step_statu.set_step_statu(message::eFinished); wait_step_statu.set_step_statu(message::eWorking); wait_step_statu.mutable_car_info()->CopyFrom(m_car_info); if(m_current_step_type== message::eWait_step) break; } case message::eRelease_step: { wait_step_statu.set_step_statu(message::eFinished); release_step_statu.set_step_statu(message::eWorking); release_step_statu.mutable_space_info()->CopyFrom(m_search_response_msg.car_position()); if(m_current_step_type== message::eRelease_step) break; } case message::eComplete: { release_step_statu.set_step_statu(message::eFinished); if(m_current_step_type==message::eComplete) break; } case message::eBackWait_step :{ wait_step_statu.set_step_statu(message::eError); if(m_current_step_type== message::eBackWait_step) break; } case message::eBackDispatch_step: { dispatch_step_statu.set_step_statu(message::eError); if(m_current_step_type==message::eBackDispatch_step) break; } case message::eBackSearch_step: { search_step_statu.set_step_statu(message::eError); if(m_current_step_type==message::eBackSearch_step) break; } case message::eBackComplete: { release_step_statu.set_step_statu(message::eFinished); if(m_current_step_type==message::eBackComplete) break; } default: break; } m_process_msg.mutable_search_space_step()->CopyFrom(search_step_statu); m_process_msg.mutable_dispatch_step()->CopyFrom(dispatch_step_statu); m_process_msg.mutable_waitfor_leave_step()->CopyFrom(wait_step_statu); m_process_msg.mutable_release_space_step()->CopyFrom(release_step_statu); }