// // Created by zx on 2020/7/14. // #include #include "command_manager.h" #include "StoreProcessTask.h" #include "PickupProcessTask.h" #include "system_communicator.h" Command_manager::Command_manager() :m_thread_queue_process(nullptr) { } Command_manager::~Command_manager() { //等待线程池完成 if(m_thread_queue_process!=nullptr) { m_thread_queue_process->WaitForFinish(); m_thread_queue_process->Stop(); } } Error_manager Command_manager::init() { //创建线程池 if(m_thread_queue_process== nullptr) { m_thread_queue_process=tq::TQFactory::CreateDefaultQueue(); m_thread_queue_process->Start(12); } return SUCCESS; } /* * 执行停车请求 */ Error_manager Command_manager::execute_store_command(message::Store_command_request_msg& request,message::Store_command_response_msg& response) { if(m_thread_queue_process==nullptr) { return Error_manager(ERROR,CRITICAL_ERROR,"线程池未初始化,bug"); } if(request.base_info().msg_type()==message::eStore_command_request_msg &&request.base_info().receiver()==message::eMain &&request.base_info().sender()==message::eTerminor) { if(request.has_locate_information()) { message::Locate_information locate_info=request.locate_information(); if(locate_info.has_locate_correct()) { if(locate_info.locate_correct()==true) { if(locate_info.has_locate_width()&&locate_info.has_locate_height() &&locate_info.has_locate_x()&&locate_info.has_locate_y() &&locate_info.has_locate_angle()&&locate_info.has_locate_wheel_base()) { /* * 检查消息完毕,开始处理 */ message::Base_info base_info; base_info.set_msg_type(message::eStore_command_response_msg); base_info.set_sender(message::eMain); base_info.set_receiver(message::eTerminor); response.mutable_base_info()->CopyFrom(base_info); response.set_terminal_id(request.terminal_id()); message::Error_manager error_msg; error_msg.set_error_code(0); /* * 检查各个节点是否正常 */ Error_manager parkspace_code= Parkspace_communicator::get_instance_pointer()->check_statu(); if(parkspace_code!=SUCCESS) { error_msg.set_error_code(parkspace_code.get_error_code()); error_msg.set_error_description(parkspace_code.get_error_description()); response.mutable_code()->CopyFrom(error_msg); return parkspace_code; } Error_manager locate_code= Locate_communicator::get_instance_pointer()->check_statu(); if(locate_code!=SUCCESS) { error_msg.set_error_code(locate_code.get_error_code()); error_msg.set_error_description(locate_code.get_error_description()); response.mutable_code()->CopyFrom(error_msg); return locate_code; } Error_manager dispatch_code= Dispatch_communicator::get_instance_pointer()->check_statu(); if(dispatch_code!=SUCCESS) { error_msg.set_error_code(dispatch_code.get_error_code()); error_msg.set_error_description(dispatch_code.get_error_description()); response.mutable_code()->CopyFrom(error_msg); return dispatch_code; } //一切正常,接受指令 int command_id=request.terminal_id()+10000; tq::BaseTask* ptask; if(false==m_store_command_task_map.find(request.terminal_id(),ptask)) { ptask=new StoreProcessTask(request.terminal_id()); m_store_command_task_map[request.terminal_id()]=ptask; } StoreProcessTask* pStore_task=(StoreProcessTask*)ptask; //初始化流程 pStore_task->init_task(command_id,locate_info,request.car_info()); //获取车位 Error_manager code=pStore_task->alloc_space(); if(code==SUCCESS) { m_thread_queue_process->AddTask(pStore_task); response.mutable_code()->CopyFrom(error_msg); return SUCCESS; } error_msg.set_error_code(code.get_error_code()); error_msg.set_error_description(code.to_string()); response.mutable_code()->CopyFrom(error_msg); LOG(ERROR)<<"创建停车流程失败(车位分配失败),终端:"<CopyFrom(baseInfo); response.set_terminal_id(request.terminal_id()); message::Error_manager error_msg; error_msg.set_error_code(0); /* * 检查各个节点是否正常 */ Error_manager parkspace_code= Parkspace_communicator::get_instance_pointer()->check_statu(); if(parkspace_code!=SUCCESS) { error_msg.set_error_code(parkspace_code.get_error_code()); error_msg.set_error_description(parkspace_code.get_error_description()); response.mutable_code()->CopyFrom(error_msg); return parkspace_code; } Error_manager dispatch_code= Dispatch_communicator::get_instance_pointer()->check_statu(); if(dispatch_code!=SUCCESS) { error_msg.set_error_code(dispatch_code.get_error_code()); error_msg.set_error_description(dispatch_code.get_error_description()); response.mutable_code()->CopyFrom(error_msg); return dispatch_code; } //一切正常,接受指令 Error_manager code; int command_id = request.terminal_id()+20000; tq::BaseTask* ptask; if(false==m_pick_command_task_map.find(request.terminal_id(),ptask)) { ptask=new PickupProcessTask(request.terminal_id()); m_pick_command_task_map[request.terminal_id()]=ptask; } PickupProcessTask* pPick_task=(PickupProcessTask*)ptask; //初始化流程 pPick_task->init_task(command_id, request.car_info()); /////查询车位 code=pPick_task->search_space(); if(code==SUCCESS) { m_thread_queue_process->AddTask(pPick_task); response.mutable_code()->CopyFrom(error_msg); return SUCCESS; } error_msg.set_error_code(code.get_error_code()); error_msg.set_error_description(code.to_string()); response.mutable_code()->CopyFrom(error_msg); LOG(ERROR)<<"创建取车流程失败(车位查询失败),终端:"<