// // Created by zx on 2020/7/14. // #include #include #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(setting::System_setting system_setting) { /* * 检查参数 */ if(system_setting.has_bind_ip()==false || system_setting.has_entrance_num()== false ||system_setting.has_export_num()==false ) { return Error_manager(ERROR,MAJOR_ERROR,"系统配置错误"); } if(system_setting.entrance_num()<0 || system_setting.export_num()<0) { return Error_manager(ERROR,MAJOR_ERROR,"系统配置出入口数量错误"); } //创建线程池 if(m_thread_queue_process== nullptr) { m_thread_queue_process=tq::TQFactory::CreateDefaultQueue(); m_thread_queue_process->Start(12); } /* * 此处添加等待各个通讯模块正常代码 */ std::chrono::system_clock::time_point t_start=std::chrono::system_clock::now(); std::chrono::system_clock::time_point t_end=std::chrono::system_clock::now(); Error_manager parkspace_code=ERROR; LOG(INFO)<<"初始化车位管理模块..."; do { if (parkspace_code != SUCCESS) { parkspace_code = Parkspace_communicator::get_instance_pointer()->check_statu(); LOG_IF(INFO, parkspace_code == SUCCESS) << "车位管理模块初始化完成!!!"; } t_end=std::chrono::system_clock::now(); usleep(1000*100); }while(t_end-t_startcheck_statu(i); LOG_IF(INFO, locate_code == SUCCESS) << "停车入口:"<check_statu(i); LOG_IF(INFO, dispatch_code == SUCCESS) << "停车入口:"<check_statu(i); LOG_IF(INFO, dispatch_code == SUCCESS) << "取车出口:" << i << " 调度模块初始化完成!!!"; } t_end = std::chrono::system_clock::now(); if (dispatch_code == SUCCESS) break; usleep(1000*100); }while(t_end-t_startCopyFrom(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(request.terminal_id()); 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(request.terminal_id()); 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; } //一切正常,接受指令 message::Command_info command_info; //获取当前时间 auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); std::stringstream ss; ss << std::put_time(std::localtime(&t), "%Y-%m-%d:%H-%M-%S-%ms"); std::string str_time = ss.str(); command_info.set_time(str_time); char place[255]={0}; sprintf(place ,"027-01-%02d",request.terminal_id()); command_info.set_place(place); command_info.set_event(message::eStoring); LOG(INFO)<<"收到停车指令:"<init_task(command_info,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(request.terminal_id()); 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; message::Command_info command_info; //获取当前时间 auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); std::stringstream ss; ss << std::put_time(std::localtime(&t), "%Y-%m-%d:%H-%M-%S-%ms"); std::string str_time = ss.str(); command_info.set_time(str_time); char place[255]={0}; sprintf(place ,"027-01-%02d",request.terminal_id()); command_info.set_place(place); command_info.set_event(message::ePicking); 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_info, 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)<<"创建取车流程失败(车位查询失败),终端:"<