// // Created by zx on 2020/7/7. // #include #include #include #include "dispatch_excutor.h" #include "StoreProcessTask.h" #include "process_message.pb.h" #include "command_manager.h" #include "command_accepter.h" #include "exception_solver.h" #include "uniq_key.h" StoreProcessTask::StoreProcessTask(unsigned int terminor_id,message::Car_info car_info) :Process_task(terminor_id,car_info) { m_process_log.set_process_type(message::eStoring); } StoreProcessTask::~StoreProcessTask() { //退出线程 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 StoreProcessTask::init_task(const ::google::protobuf::Message& parameter) { message::Locate_information locate_info; locate_info.CopyFrom(parameter); /*char log[255]={0}; sprintf(log,"来自终端 %d 的停车指令:\n %s",m_terminor_id,locate_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::eAlloc_step; return Process_task::init_task(locate_info); } /* * 检验结果 */ Error_manager StoreProcessTask::compare_step() { return SUCCESS; } /* * 回退检验 */ Error_manager StoreProcessTask::back_compare_step() { //ALOG(INFO)<<" 回退compare"; return SUCCESS; } /* * 调度 */ Error_manager StoreProcessTask::dispatch_step() { Error_manager code; /* * 判断调度所需的数据是否都正常 */ //1,测量信息是否存在 if( // m_measure_response_msg.has_base_info()== false // ||m_measure_response_msg.has_locate_information()==false // || m_parcspace_alloc_response_msg.has_base_info()== false ||m_parcspace_alloc_response_msg.allocated_parkspace_info_ex_size()==0) { return Error_manager(ERROR,MAJOR_ERROR,"调度所需的前置数据(测量,车位)不存在"); } //2,判断调度节点状态 code=Dispatch_excutor::get_instance_pointer()->check_entrance_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*60*20); //超时20min m_dispatch_request_msg.mutable_base_info()->CopyFrom(base_info); m_dispatch_request_msg.set_terminal_id(m_terminor_id); m_dispatch_request_msg.set_dispatch_motion_direction(message::E_STORE_CAR); // 20210812 changed by yct. m_dispatch_request_msg.mutable_parkspace_info_ex()->CopyFrom(m_parcspace_alloc_response_msg.allocated_parkspace_info_ex()); code=Dispatch_excutor::get_instance_pointer()->dispatch_request(m_dispatch_request_msg, m_dispatch_response_msg,m_cancel_condition); //记录 /*message::Node_log node_log; node_log.mutable_dispatch_request()->CopyFrom(m_dispatch_request_msg); node_log.mutable_dispatch_response()->CopyFrom(m_dispatch_response_msg); ALOG(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_entrance_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_locate_info.has_locate_height()==false||m_locate_info.has_locate_width()==false) { 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_request; base_info_request.set_msg_type(message::eParkspace_allocation_request_msg); base_info_request.set_sender(message::eMain); base_info_request.set_receiver(message::eParkspace); base_info_request.set_timeout_ms(5000); //超时1s m_alloc_request_msg.mutable_base_info()->CopyFrom(base_info_request); m_alloc_request_msg.mutable_car_info()->CopyFrom(m_car_info); m_alloc_request_msg.set_terminal_id(m_terminor_id); code=Parkspace_excutor::get_instance_pointer()->alloc_request(m_alloc_request_msg, m_parcspace_alloc_response_msg,m_cancel_condition); //记录日志 /*message::Node_log node_log; node_log.mutable_alloc_request()->CopyFrom(m_alloc_request_msg); node_log.mutable_alloc_response()->CopyFrom(m_parcspace_alloc_response_msg); ALOG(INFO)<check_statu(); if(code!=SUCCESS) return code; message::Parkspace_confirm_alloc_request_msg request; message::Base_info base_info; base_info.set_msg_type(message::eParkspace_confirm_alloc_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); request.mutable_confirm_parkspace_info_ex()->CopyFrom(m_dispatch_response_msg.parkspace_info_ex()); request.set_command_key(create_key()); message::Parkspace_confirm_alloc_response_msg confirm_response; code=Parkspace_excutor::get_instance_pointer()->confirm_request(request,confirm_response,m_cancel_condition); //记录日志 /*message::Node_log node_log; node_log.mutable_confirm_request()->CopyFrom(request); node_log.mutable_confirm_response()->CopyFrom(confirm_response); ALOG(INFO)<check_statu(); if(code!=SUCCESS) { code.set_error_level_location(MAJOR_ERROR); 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); request.mutable_release_parkspace_info_ex()->CopyFrom(m_parcspace_alloc_response_msg.allocated_parkspace_info_ex()); message::Parkspace_release_response_msg release_response; code=Parkspace_excutor::get_instance_pointer()->release_request(request,release_response,m_cancel_condition); //记录 /*message::Node_log node_log; node_log.mutable_release_request()->CopyFrom(request); node_log.mutable_release_response()->CopyFrom(release_response); node_log.set_description("回退分配步骤,释放车位"); 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); //ALOG_IF(WARNING, code != SUCCESS) << "------ 停 ------- 分配失败:" <solve_exception(code, this); //根据处理结果更新步骤状态 } else { //本次步骤正常,切换步骤类型,进入下一步,否则不修改步骤类型,再次执行本次步骤 updata_step_statu(message::eFinished); next_step(); } } /* * 跳出循环后,判断状态,是否正常结束, 循环跳出状态只有可能是 eBackComplete(异常结束),eComplete(正常结束),任务取消状态 */ updata_step_statu(message::eFinished); publish_step_status(); if(m_storing_carlicense_terminal_id.find(m_car_info.car_numberplate())==true) m_storing_carlicense_terminal_id.erase(m_car_info.car_numberplate()); if(m_cancel_condition.wait_for_millisecond(1)==true) { /*ALOG(ERROR) << "------ 停 ------- 停车任务被强制取消,车牌号:" << m_car_info.license() << ", 终端号:" << m_terminor_id;*/ LOG(ERROR) << "------ 停 ------- 停车任务被强制取消,车牌号:" << m_car_info.license() << ", 终端号:" << m_terminor_id; usleep(1000*200); return ; } if(m_current_step_type== message::eBackComplete) { //异常结束 usleep(1000*200); /*ALOG(WARNING)<<"------ 停 ------- 异常停车,回退结束"<<"车牌号:"< lock(m_process_msg_lock); Command_accepter::get_instance_pointer()->post_process_statu(m_process_msg); } } /* * 根据当前流程状态,并修改状态消息 */ void StoreProcessTask::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::eAlloc_step: { message::Alloc_space_step_statu alloc_step_statu; alloc_step_statu.set_step_statu(statu); m_process_msg.mutable_alloc_space_step()->CopyFrom(alloc_step_statu); break; } case message::eCompare_step:{ message::Compare_step_statu compare_step; compare_step.mutable_locate_info_wj()->CopyFrom(m_locate_info); compare_step.mutable_locate_info_dj()->CopyFrom(m_measure_response_msg.locate_information()); compare_step.mutable_locate_info_result()->CopyFrom(m_compare_location_data); compare_step.set_step_statu(statu); m_process_msg.mutable_compare_step()->CopyFrom(compare_step); break; } case message::eDispatch_step: { message::Dispatch_store_step_statu dispatch_step_statu; dispatch_step_statu.set_step_statu(statu); dispatch_step_statu.mutable_locate_info()->CopyFrom(m_locate_info); dispatch_step_statu.mutable_allocated_parkspace_info_ex()->CopyFrom(m_dispatch_response_msg.parkspace_info_ex()); m_process_msg.mutable_dispatch_step()->CopyFrom(dispatch_step_statu); break; } case message::eConfirm_step: { message::Confirm_space_step_statu confirm_step_type; confirm_step_type.set_step_statu(statu); confirm_step_type.mutable_confirm_parkspace_info_ex()->CopyFrom(m_dispatch_response_msg.parkspace_info_ex()); m_process_msg.mutable_confirm_space_step()->CopyFrom(confirm_step_type); break; } case message::eComplete: { m_process_msg.set_completed(true); break; } case message::eBackConfirm_step: { message::Back_confirm_space_step_statu back_confirm_step_type; back_confirm_step_type.set_step_statu(statu); m_process_msg.mutable_back_confirm_step()->CopyFrom(back_confirm_step_type); break; } case message::eBackDispatch_step: { message::Back_dispatch_store_step_statu back_dispatch_step_statu; back_dispatch_step_statu.set_step_statu(statu); back_dispatch_step_statu.mutable_allocated_parkspace_info_ex()->CopyFrom(m_dispatch_response_msg.parkspace_info_ex()); back_dispatch_step_statu.mutable_locate_info()->CopyFrom(m_compare_location_data); m_process_msg.mutable_back_dispatch_step()->CopyFrom(back_dispatch_step_statu); break; } case message::eBack_compare_step:{ message::Back_compare_step_statu back_compare_step_statu; back_compare_step_statu.set_step_statu(statu); back_compare_step_statu.mutable_locate_info_wj()->CopyFrom(m_locate_info); back_compare_step_statu.mutable_locate_info_dj()->CopyFrom(m_measure_response_msg.locate_information()); back_compare_step_statu.mutable_locate_info_result()->CopyFrom(m_compare_location_data); m_process_msg.mutable_back_compare_step()->CopyFrom(back_compare_step_statu); break; } case message::eBackAlloc_step: { message::Back_alloc_space_step_statu back_alloc_step_statu; back_alloc_step_statu.set_step_statu(statu); back_alloc_step_statu.mutable_allocated_parkspace_info_ex()->CopyFrom(m_parcspace_alloc_response_msg.allocated_parkspace_info_ex()); m_process_msg.mutable_back_alloc_space_step()->CopyFrom(back_alloc_step_statu); break; } case message::eBackComplete: { m_process_msg.set_back_completed(true); break; } default: break; } } /* * 初始化 接收到的消息 */ void StoreProcessTask::reset_msg() { m_alloc_request_msg = message::Parkspace_allocation_request_msg(); m_measure_request_msg = message::Measure_request_msg(); m_dispatch_request_msg = message::Dispatch_request_msg(); m_confirm_request_msg = message::Parkspace_confirm_alloc_request_msg(); m_command_response_msg=message::Store_command_response_msg(); m_locate_info = message::Locate_information(); m_measure_response_msg = message::Measure_response_msg(); //测量模块的测量数据 m_parcspace_alloc_response_msg = message::Parkspace_allocation_response_msg(); //分配的车位数据 m_dispatch_response_msg = message::Dispatch_response_msg(); //调度模块的反馈数据 }