// // Created by huli on 2020/7/2. // #include "system_executor.h" #include "../message/measure_message.pb.h" #include "../laser/laser_manager.h" #include "../locate/locate_manager.h" System_executor::System_executor(int thread_pool_size) :m_thread_pool(thread_pool_size) { } System_executor::~System_executor() { } //检查执行者的状态, 判断能否处理这条消息, Error_manager System_executor::check_executer(Communication_message* p_msg) { if ( p_msg == NULL ) { return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR, " POINTER IS NULL "); } Error_manager t_error; switch ( p_msg->get_message_type() ) { case Communication_message::eLocate_request_msg: if ( Laser_manager::get_instance_references().check_status() == SUCCESS && Locate_manager::get_instance_references().check_status() == SUCCESS ) { t_error = Error_code::SUCCESS; } else if ( Laser_manager::get_instance_references().check_status() == LASER_MANAGER_STATUS_BUSY && Locate_manager::get_instance_references().check_status() == LOCATER_MANAGER_STATUS_BUSY ) { t_error = Error_code::COMMUNICATION_EXCUTER_IS_BUSY; } else { if ( Laser_manager::get_instance_references().check_status() == LASER_MANAGER_STATUS_ERROR ) { t_error.compare_and_cover_error(Laser_manager::get_instance_references().check_status()); } if ( Locate_manager::get_instance_references().check_status() == LOCATER_MANAGER_STATUS_ERROR ) { t_error.compare_and_cover_error(Laser_manager::get_instance_references().check_status()); } } break; } return t_error; } //处理消息的执行函数 Error_manager System_executor::execute_msg(Communication_message* p_msg) { if ( p_msg == NULL ) { return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR, " POINTER IS NULL "); } switch ( p_msg->get_message_type() ) { case Communication_message::eLocate_request_msg: message::Measure_request_msg t_measure_request_msg; //针对消息类型, 对消息进行二次解析 if( t_measure_request_msg.ParseFromString(p_msg->get_message_buf()) ) { //往线程池添加执行任务, 之后会唤醒一个线程去执行他. m_thread_pool.enqueue(&System_executor::execute_for_measure, this, t_measure_request_msg.command_id(), t_measure_request_msg.terminal_id()); } else { return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR, " message::Measure_request_msg ParseFromString error "); } break; } return Error_code::SUCCESS; } //判断是否为待机,如果已经准备好,则可以执行任务。 bool System_executor::is_ready() { if ( m_system_executor_status == SYSTEM_EXECUTOR_READY && m_thread_pool.thread_is_full_load() == false ) { return true; } else { return false; } } //雷达感测定位 的处理函数 //input::command_id, 消息指令id, 由主控制系统生成的唯一码 //input::command_id, 终端id, 对应具体的某个车位 //return::void, 没有返回, 执行结果直接生成一条答复消息, 然后通过通信返回 void System_executor::execute_for_measure(int command_id, int terminal_id) { }