// // Created by zx on 2020/7/7. // #include #include #include #include "PickupProcessTask.h" #include "notify_excutor.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) { m_process_log.set_process_type(message::ePicking); } 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(const ::google::protobuf::Message& parameter) { /*char log[255]={0}; sprintf(log,"来自终端 %d 的取车指令:\n %s",m_terminor_id,m_car_info.DebugString().c_str()); ALOG(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; return Process_task::init_task(parameter); } void PickupProcessTask::reset_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); m_command_response_msg.set_license(m_car_info.license()); if(Command_manager::get_instance_pointer()->is_paused()==true) { return Error_manager(PAUSE, MINOR_ERROR, "系统已急停"); } message::Entrance_statu statu=Command_manager::get_instance_pointer()->get_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( // 20210812 changed by yct, only check license, terminal cannot find width height at this stage // 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); m_search_request_msg.mutable_base_info()->CopyFrom(base_info_request); m_search_request_msg.mutable_car_info()->CopyFrom(m_car_info); code = Parkspace_excutor::get_instance_pointer()->search_request(m_search_request_msg, m_search_response_msg,m_cancel_condition); /*message::Node_log node_log; node_log.mutable_search_request()->CopyFrom(m_search_request_msg); node_log.mutable_search_response()->CopyFrom(m_search_response_msg); ALOG(INFO)<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); code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished); LOG_IF(ERROR, code != SUCCESS) << "------- 取 -------查询失败,取车终端:"<pause_export(m_terminor_id,true); } if(m_current_step_type== message::eRelease_step) { updata_step_statu(message::eWorking); code=release_space_step(); code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished); if(code!=SUCCESS) { //提升错误等级为三级 LOG(ERROR)<<"------- 取 ------- 释放车位失败 ------进入异常处理, 车牌号:"<solve_exception(code, this); continue; } } if(m_current_step_type==message::eComplete) { //流程结束前,保证至少发送一次流程完成状态 updata_step_statu(message::eFinished); break; } // ----------------------------------------华丽的分割线 ---------------------------------------- if(m_current_step_type== message::eBackWait_step) { updata_step_statu(message::eWorking); code=back_wait_for_leave_step(); code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished); if(code.get_error_level()>=MAJOR_ERROR) { //提升错误等级为四级 LOG(ERROR)<<"------- 取 ------- 回退等待失败 ------进入异常处理, 车牌号:"<solve_exception(code,this); continue; } } if(m_current_step_type== message::eBackDispatch_step) { updata_step_statu(message::eWorking); code=back_dispatch_step(); code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished); if(code.get_error_level()>=MAJOR_ERROR) { //提升错误等级为四级 LOG(ERROR)<<"------- 取 ------- 回退调度失败 ------进入异常处理, 车牌号:"<solve_exception(code,this); continue; } } if(m_current_step_type== message::eBackSearch_step) { updata_step_statu(message::eWorking); code=back_search_space_step(); code!=SUCCESS?updata_step_statu(message::eError):updata_step_statu(message::eFinished); if(code.get_error_level()>=MAJOR_ERROR) { //提升错误等级为四级 LOG(ERROR)<<"------- 取 ------- 回退调度失败 ------进入异常处理, 车牌号:"<solve_exception(code,this); continue; } } if(m_current_step_type== message::eBackComplete) break; next_step(); } /* * 跳出循环后,判断状态,是否正常结束, 循环跳出状态只有可能是 eBackComplete(异常结束),eComplete(正常结束),任务取消状态 */ updata_step_statu(message::eFinished); publish_step_status(); //删除该号牌指令记录 if(m_picking_carlicense_terminal_id.find(m_car_info.car_numberplate())==true) m_picking_carlicense_terminal_id.erase(m_car_info.car_numberplate()); if(m_cancel_condition.wait_for_millisecond(1)==true) { LOG(ERROR) << "------- 取 -------取车任务被强制取消,车牌号:" << m_car_info.license() << ", 终端号:" << m_terminor_id; /*ALOG(ERROR) << "------- 取 -------取车任务被强制取消,车牌号:" << m_car_info.license() << ", 终端号:" << m_terminor_id;*/ usleep(1000*500); return ; } if(m_current_step_type== message::eBackComplete) { //异常结束 usleep(1000*500); LOG(ERROR)<<"------- 取 -------异常取车,回退结束"<<"车牌号:"<check_export_statu(m_terminor_id); if(code!=SUCCESS) return code; 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_manager); base_info.set_timeout_ms(1000*300); //测量超时300s m_dispatch_request_msg.mutable_base_info()->CopyFrom(base_info); m_dispatch_request_msg.set_dispatch_motion_direction(message::E_PICKUP_CAR); m_dispatch_request_msg.mutable_parkspace_info_ex()->CopyFrom(m_search_response_msg.query_parkspace_info_ex()); m_dispatch_request_msg.set_terminal_id(m_terminor_id); code=Dispatch_excutor::get_instance_pointer()->dispatch_request(m_dispatch_request_msg,m_dispatch_response_msg,m_cancel_condition); /*message::Node_log dispatch_log; dispatch_log.mutable_dispatch_request()->CopyFrom(m_dispatch_request_msg); dispatch_log.mutable_dispatch_response()->CopyFrom(m_dispatch_response_msg); ALOG(INFO)<CopyFrom(base_info); request.mutable_car_info()->CopyFrom(m_car_info); request.set_command_key(create_key()); message::Notify_response_msg response; Error_manager code=Notify_excutor::get_instance_pointer()->notify_request(request,response,m_cancel_condition); if(code==SUCCESS) { if(response.code().error_code()!=0) { return Error_manager(FAILED,MINOR_ERROR,response.code().error_description().c_str()); } return SUCCESS; } return code; } /* * 回退等待车辆离开 */ Error_manager PickupProcessTask::back_wait_for_leave_step() { return SUCCESS; } /* * 清除车位表中对应的车位 */ Error_manager PickupProcessTask::release_space_step() { /*int k=rand()%10; if(k==0) return Error_manager(ERROR,MINOR_ERROR,"手动制造错误");*/ /* * 检查是否曾经分配过车位 */ if(m_search_response_msg.query_parkspace_info_ex_size()==0) { return Error_manager(FAILED,MINOR_ERROR," 取车流程释放车位请求缺少车位信息"); } /* * 检查车位管理模块是否正常 */ Error_manager code=Parkspace_excutor::get_instance_pointer()->check_statu(); if(code!=SUCCESS) return code; 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 m_release_request_msg.mutable_base_info()->CopyFrom(base_info); m_release_request_msg.mutable_release_parkspace_info_ex()->CopyFrom(m_search_response_msg.query_parkspace_info_ex()); code=Parkspace_excutor::get_instance_pointer()->release_request(m_release_request_msg,m_release_response_msg,m_cancel_condition); /*message::Node_log node_log; node_log.mutable_release_request()->CopyFrom(m_release_request_msg); node_log.mutable_release_response()->CopyFrom(m_release_response_msg); ALOG(INFO)< lock(m_process_msg_lock); Command_accepter::get_instance_pointer()->post_process_statu(m_process_msg); } } /* * 根据当前流程状态,生成状态消息 */ void PickupProcessTask::updata_step_statu(message::Step_statu statu) { m_current_step_statu=statu; std::lock_guard lock(m_process_msg_lock); switch (m_current_step_type) { case message::eSearch_step: { message::Search_space_step_statu search_step_statu; search_step_statu.set_step_statu(statu); m_process_msg.mutable_search_space_step()->CopyFrom(search_step_statu); break; } case message::eDispatch_step: { message::Dispatch_pick_step_statu dispatch_step_statu; dispatch_step_statu.set_step_statu(statu); dispatch_step_statu.mutable_search_parkspace_info_ex()->CopyFrom(m_search_response_msg.query_parkspace_info_ex()); m_process_msg.mutable_dispatch_step()->CopyFrom(dispatch_step_statu); break; } case message::eWait_step: { message::Waitfor_leave_step_statu waitfor_leave_step; waitfor_leave_step.set_step_statu(statu); waitfor_leave_step.mutable_car_info()->CopyFrom(m_car_info); m_process_msg.mutable_waitfor_leave_step()->CopyFrom(waitfor_leave_step); break; } case message::eRelease_step: { message::Release_space_step_statu release_step_statu; release_step_statu.set_step_statu(statu); release_step_statu.mutable_release_parkspace_info_ex()->CopyFrom(m_search_response_msg.query_parkspace_info_ex()); m_process_msg.mutable_release_space_step()->CopyFrom(release_step_statu); break; } case message::eComplete: { m_process_msg.set_completed(true); break; } case message::eBackWait_step: { message::Back_waitfor_leave_step_statu back_waitfor_step_statu; back_waitfor_step_statu.set_step_statu(statu); back_waitfor_step_statu.mutable_car_info()->CopyFrom(m_car_info); m_process_msg.mutable_back_waitfor_leave_step()->CopyFrom(back_waitfor_step_statu); break; } case message::eBackDispatch_step: { message::Back_dispatch_pick_step_statu back_dispatch_step_statu; back_dispatch_step_statu.set_step_statu(statu); back_dispatch_step_statu.mutable_search_parkspace_info_ex()->CopyFrom(m_search_response_msg.query_parkspace_info_ex()); m_process_msg.mutable_back_dispatch_step()->CopyFrom(back_dispatch_step_statu); break; } case message::eBackSearch_step: { message::Back_search_space_step_statu back_search_step_statu; back_search_step_statu.set_step_statu(statu); back_search_step_statu.mutable_car_info()->CopyFrom(m_car_info); m_process_msg.mutable_back_search_space_step_statu()->CopyFrom(back_search_step_statu); break; } case message::eBackComplete: { m_process_msg.set_back_completed(true); break; } default: break; } }