123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056 |
- //
- // Created by huli on 2020/7/20.
- //
- #include "dispatch_manager.h"
- #include "../tool/proto_tool.h"
- #include <cstdlib>
- Dispatch_manager::Dispatch_manager()
- {
- m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
- m_dispatch_manager_id = -1;
- m_catcher_size = 0;
- m_carrier_size = 0;
- m_passageway_size = 0;
- m_process_thread_queue = nullptr;
- m_dispatch_manager_thread = nullptr;
- }
- Dispatch_manager::~Dispatch_manager()
- {
- dispatch_manager_uninit();
- }
- //调度管理 初始化
- Error_manager Dispatch_manager::dispatch_manager_init(int dispatch_manager_id)
- {
- m_dispatch_manager_id = dispatch_manager_id;
- return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
- }
- //调度管理 初始化
- Error_manager Dispatch_manager::dispatch_manager_init()
- {
- return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
- }
- //初始化 调度管理 模块。从文件读取
- Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(std::string prototxt_path)
- {
- Dispatch_proto::Dispatch_device_parameter_all t_dispatch_device_parameter_all;
- if(! proto_tool::read_proto_param(prototxt_path,t_dispatch_device_parameter_all) )
- {
- return Error_manager(DISPATCH_MANAGER_READ_PROTOBUF_ERROR,MINOR_ERROR,
- "Dispatch_manager read_proto_param failed");
- }
- return dispatch_manager_init_from_protobuf(t_dispatch_device_parameter_all);
- }
- //初始化 调度管理 模块。从protobuf读取
- Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all)
- {
- LOG(INFO) << " ----Dispatch_manager::dispatch_manager_init_from_protobuf----- "<< this;
- Error_manager t_error;
- m_catcher_size = dispatch_device_parameter_all.catcher_parameters_size();
- for (int i = 0; i < m_catcher_size; ++i)
- {
- std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Catcher);
- Catcher* tp_catcher = (Catcher*)tp_dispatch_device_base.get();
- int t_id = dispatch_device_parameter_all.catcher_parameters(i).id();
- int t_key = dispatch_device_parameter_all.catcher_parameters(i).key();
- tp_catcher->dispatch_device_base_init(t_id, t_key);
- m_catcher_map[t_id] = tp_dispatch_device_base;
- }
- m_carrier_size = dispatch_device_parameter_all.carrier_parameters_size();
- for (int i = 0; i < m_carrier_size; ++i)
- {
- std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Carrier);
- Carrier* tp_carrier = (Carrier*)tp_dispatch_device_base.get();
- int t_id = dispatch_device_parameter_all.carrier_parameters(i).id();
- int t_key = dispatch_device_parameter_all.carrier_parameters(i).key();
- tp_carrier->dispatch_device_base_init(t_id, t_key);
- m_carrier_map[t_id] = tp_dispatch_device_base;
- }
- m_passageway_size = dispatch_device_parameter_all.passageway_parameters_size();
- for (int i = 0; i < m_passageway_size; ++i)
- {
- std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Passageway);
- Passageway* tp_passageway = (Passageway*)tp_dispatch_device_base.get();
- int t_id = dispatch_device_parameter_all.passageway_parameters(i).id();
- int t_key = dispatch_device_parameter_all.passageway_parameters(i).key();
- tp_passageway->dispatch_device_base_init(t_id, t_key);
- m_passageway_map[t_id] = tp_dispatch_device_base;
- }
- //调度管理 设备复位
- t_error = dispatch_manager_device_reset();
- if ( t_error != Error_code::SUCCESS )
- {
- return t_error;
- }
- //创建线程池
- if (m_process_thread_queue == nullptr) {
- m_process_thread_queue = tq::TQFactory::CreateDefaultQueue();
- m_process_thread_queue->Start(48);
- }
- // 线程默认开启
- m_dispatch_manager_condition.reset(false, true, false);
- m_dispatch_manager_thread = new std::thread(&Dispatch_manager::resource_allocation, this);
- m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
- return Error_code::SUCCESS;
- }
- //调度管理 反初始化
- Error_manager Dispatch_manager::dispatch_manager_uninit()
- {
- if (m_dispatch_manager_thread)
- {
- m_dispatch_manager_condition.kill_all();
- }
- if (m_dispatch_manager_thread)
- {
- m_dispatch_manager_thread->join();
- delete m_dispatch_manager_thread;
- m_dispatch_manager_thread = NULL;
- }
- //等待线程池完成
- if(m_process_thread_queue!=nullptr) {
- m_process_thread_queue->WaitForFinish();
- m_process_thread_queue->Stop();
- m_process_thread_queue = nullptr;
- }
- m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
- m_dispatch_manager_id = -1;
- return Error_code::SUCCESS;
- }
- //调度管理 设备复位
- Error_manager Dispatch_manager::dispatch_manager_device_reset()
- {
- //以后再写
- return Error_code::SUCCESS;
- }
- //对外的接口函数,负责接受并处理任务单,
- Error_manager Dispatch_manager::execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction)
- {
- return Error_code::SUCCESS;
- // std::this_thread::sleep_for(std::chrono::seconds(rand()%3+3));
- if ( dispatch_motion_direction == E_PICKUP_CAR )
- {
- return Error_code::SUCCESS;
- }
- // return Error_code::SUCCESS;
- // srand(0);
- unsigned int t_probability = rand();
- if ( t_probability%100 >=20 )
- {
- return Error_code::SUCCESS;
- }
- else
- {
- return Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
- " Dispatch_manager::execute_task() error ");
- }
- }
- //检查能否执行消息指令
- Error_manager Dispatch_manager::check_execute_msg(Communication_message* p_msg)
- {
- Error_manager t_error = Dispatch_manager::get_instance_references().check_status();
- if ( t_error == Error_code::SUCCESS )
- {
- return Error_code::SUCCESS;
- }
- else if (t_error.get_error_level() == NEGLIGIBLE_ERROR)//一级故障,轻微故障,
- {
- std::cout << "Dispatch_manager _is_busy , " << std::endl;
- //返回繁忙之后, 通信模块1秒后再次调用check
- return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
- }
- switch ( p_msg->get_message_type() )
- {
- case Communication_message::Message_type::eDispatch_request_msg:
- {
- message::Dispatch_request_msg t_dispatch_request_msg;
- //针对消息类型, 对消息进行二次解析
- if (t_dispatch_request_msg.ParseFromString(p_msg->get_message_buf()))
- {
- //创建一条答复消息
- message::Dispatch_response_msg t_dispatch_response_msg;
- t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
- t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(5000);
- t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
- t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
- t_dispatch_response_msg.set_command_key(t_dispatch_request_msg.command_key());
- t_dispatch_response_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
- t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
- t_dispatch_response_msg.mutable_error_manager()->set_error_description(t_error.get_error_description());
- std::string t_msg = t_dispatch_response_msg.SerializeAsString();
- System_communication::get_instance_references().encapsulate_msg(t_msg);
- LOG(INFO) << " System_executor::check_execute_msg executer status error "<< this;
- return t_error;
- }
- else
- {
- LOG(INFO) << " System_executor::check_executer Second analysis ERROR "<< this;
- return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
- " message::Measure_request_msg ParseFromString error ");
- }
- }
- case Communication_message::Message_type::eDispatch_plan_response_msg:
- {
- return Error_code::SUCCESS;
- break;
- }
- case Communication_message::Message_type::eDispatch_control_request_msg:
- {
- return Error_code::SUCCESS;
- break;
- }
- default :
- //无效的消息,
- return Error_manager(Error_code::INVALID_MESSAGE, Error_level::NEGLIGIBLE_ERROR,
- " INVALID_MESSAGE error ");
- break;
- }
- }
- //检查状态
- Error_manager Dispatch_manager::check_status()
- {
- if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
- {
- return Error_code::SUCCESS;
- }
- else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE || m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE )
- {
- return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
- " Dispatch_manager::check_status() error ");
- }
- else
- {
- return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_ERROR, Error_level::MINOR_ERROR,
- " Dispatch_manager::check_status() error ");
- }
- return Error_code::SUCCESS;
- }
- //调度模块 //执行搬运请求(主控->调度管理)
- Error_manager Dispatch_manager::execute_for_dispatch_request_msg(message::Dispatch_request_msg& dispatch_request_msg)
- {
- LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_request_msg--- "<< dispatch_request_msg.DebugString() << " "<< this;
- LOG(INFO) << " dispatch_request_msg->m_command_key = "<<dispatch_request_msg.command_key()<< " "<< this;
- Error_manager t_error;
- //创建调度流程
- Dispatch_process * tp_dispatch_process(new Dispatch_process);
- t_error = tp_dispatch_process->Dispatch_process_init(dispatch_request_msg);
- if ( t_error != Error_code::SUCCESS )
- {
- delete(tp_dispatch_process);
- return t_error;
- }
- {//加锁
- std::unique_lock<std::mutex> t_lock(m_lock);
- //流程缓存到map
- if (tp_dispatch_process->m_dispatch_process_type ==
- Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE)
- {
- m_process_store_list.push_back(tp_dispatch_process);
- //这里就不查重了, 需要主控保证不会重复发送...
- // if (m_key_to_dispatch_process_store_map.find(tp_dispatch_process->m_command_key) !=
- // m_key_to_dispatch_process_store_map.end())
- // {
- // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
- // " tp_dispatch_process->m_command_key is repeat ");
- // }
- // else
- // {
- // m_key_to_dispatch_process_store_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
- // }
- }
- else if (tp_dispatch_process->m_dispatch_process_type ==
- Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP)
- {
- m_process_pickup_list.push_back(tp_dispatch_process);
- //这里就不查重了, 需要主控保证不会重复发送...
- // if (m_key_to_dispatch_process_pickup_map.find(tp_dispatch_process->m_command_key) !=
- // m_key_to_dispatch_process_pickup_map.end())
- // {
- // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
- // " tp_dispatch_process->m_command_key is repeat ");
- // }
- // else
- // {
- // m_key_to_dispatch_process_pickup_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
- // }
- }
- else
- {
- t_error = Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
- " tp_dispatch_process->m_dispatch_process_type PARAMRTER ERROR ");
- }
- }
- if ( t_error != Error_code::SUCCESS )
- {
- delete(tp_dispatch_process);
- send_dispatch_response_msg_with_error(dispatch_request_msg, t_error);
- return t_error;
- }
- else
- {
- //把流程添加到 调度线程池里面, 里面的线程池会自动回收调度流程的内存
- m_process_thread_queue->AddTask(tp_dispatch_process);
- }
- return Error_code::SUCCESS;
- }
- //调度模块 答复数据异常
- Error_manager Dispatch_manager::send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error)
- {
- message::Dispatch_response_msg t_dispatch_response_msg;
- t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
- t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(dispatch_request_msg.base_info().timeout_ms());
- t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
- t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
- t_dispatch_response_msg.set_command_key(dispatch_request_msg.command_key());
- t_dispatch_response_msg.mutable_error_manager()->set_error_code(error.get_error_code());
- t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)error.get_error_level());
- t_dispatch_response_msg.mutable_error_manager()->set_error_description(error.get_error_description());
- System_communication::get_instance_references().encapsulate_msg(t_dispatch_response_msg.SerializeAsString());
- return Error_code::SUCCESS;
- }
- //调度模块 //调度总规划的答复(调度算法->调度管理)
- Error_manager Dispatch_manager::execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg)
- {
- LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_plan_response_msg--- "<< this;
- LOG(INFO) << " dispatch_plan_response_msg->m_command_key = "<<dispatch_plan_response_msg.command_key()<< " "<< this;
- Error_manager t_error;
- std::unique_lock<std::mutex> t_lock(m_lock);
- //使用 command_key 找到对应的流程
- std::string t_command_key = dispatch_plan_response_msg.command_key();
- for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
- {
- if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
- {
- t_error = iter->second->check_process_ready() ;
- if ( t_error != Error_code::SUCCESS )
- {
- return t_error;
- }
- //把消息 写入流程
- std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
- iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
- return Error_code::SUCCESS;
- }
- }
- for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
- {
- if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
- {
- t_error = iter->second->check_process_ready() ;
- if ( t_error != Error_code::SUCCESS )
- {
- return t_error;
- }
- //把消息 写入流程
- std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
- iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
- return Error_code::SUCCESS;
- }
- }
- return Error_code::SUCCESS;
- }
- //调度模块 //调度控制的任务请求(调度算法->调度管理)
- Error_manager Dispatch_manager::execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg)
- {
- LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_control_request_msg--- "<< this;
- LOG(INFO) << " dispatch_control_request_msg->m_command_key = "<<dispatch_control_request_msg.command_key()<< " "<< this;
- Error_manager t_error;
- std::unique_lock<std::mutex> t_lock(m_lock);
- //使用 command_key 找到对应的流程
- std::string t_command_key = dispatch_control_request_msg.command_key();
- for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
- {
- if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
- {
- t_error = iter->second->check_process_ready() ;
- if ( t_error != Error_code::SUCCESS )
- {
- return t_error;
- }
- //把消息 写入流程
- std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
- int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
- if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
- {
- Dispatch_process::Dispatch_control_node t_dispatch_control_node;
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
- }
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
- // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
- return Error_code::SUCCESS;
- }
- }
- for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
- {
- if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
- {
- t_error = iter->second->check_process_ready() ;
- if ( t_error != Error_code::SUCCESS )
- {
- return t_error;
- }
- //把消息 写入流程
- std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
- int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
- if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
- {
- Dispatch_process::Dispatch_control_node t_dispatch_control_node;
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
- }
- iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
- // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
- return Error_code::SUCCESS;
- }
- }
- return Error_code::SUCCESS;
- }
- //定时发送 调度管理的状态
- Error_manager Dispatch_manager::encapsulate_send_dispatch_manager_status()
- {
- Error_manager t_error;
- int t_dispatch_manager_id = get_dispatch_manager_id();
- std::string t_msg;
- //创建一条 调度管理总管理的状态
- message::Dispatch_manager_status_msg t_dispatch_manager_status_msg;
- t_dispatch_manager_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_manager_status_msg);
- t_dispatch_manager_status_msg.mutable_base_info()->set_timeout_ms(5000);
- t_dispatch_manager_status_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
- t_dispatch_manager_status_msg.mutable_base_info()->set_receiver(message::Communicator::eEmpty);
- t_dispatch_manager_status_msg.set_dispatch_id(t_dispatch_manager_id);
- Dispatch_manager::Dispatch_manager_status t_dispatch_manager_status = get_dispatch_manager_status();
- t_dispatch_manager_status_msg.set_dispatch_manager_status((message::Dispatch_manager_status)t_dispatch_manager_status);
- for (auto iter = m_catcher_map.begin(); iter != m_catcher_map.end(); ++iter)
- {
- Catcher* tp_catcher = (Catcher*)iter->second.get();
- message::Catcher_data * tp_catcher_data = t_dispatch_manager_status_msg.mutable_catcher_data_map()->Add();
- switch ( tp_catcher->get_device_id() )
- {
- case 0:
- {
- tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_1);
- break;
- }
- case 1:
- {
- tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_2);
- break;
- }
- default:
- {
- break;
- }
- }
- if ( tp_catcher->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
- tp_catcher->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
- {
- tp_catcher_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
- }
- else
- {
- tp_catcher_data->set_dispatch_device_status((message::Dispatch_device_status)tp_catcher->get_dispatch_device_status());
- }
- tp_catcher_data->set_device_id(tp_catcher->get_device_id());
- tp_catcher_data->set_actual_device_status((message::Hardware_device_status)tp_catcher->m_actual_device_status);
- tp_catcher_data->set_actual_load_status((message::Load_status)tp_catcher->m_actual_load_status);
- tp_catcher_data->set_actual_coordinates_id(tp_catcher->m_actual_coordinates_id);
- tp_catcher_data->set_actual_x(tp_catcher->m_actual_x);
- tp_catcher_data->set_actual_y(tp_catcher->m_actual_y);
- tp_catcher_data->set_actual_b(tp_catcher->m_actual_b);
- tp_catcher_data->set_actual_z(tp_catcher->m_actual_z);
- tp_catcher_data->set_actual_d1(tp_catcher->m_actual_d1);
- tp_catcher_data->set_actual_d2(tp_catcher->m_actual_d2);
- tp_catcher_data->set_actual_clamp_motion1((message::Clamp_motion)tp_catcher->m_actual_clamp_motion1);
- tp_catcher_data->set_actual_clamp_motion2((message::Clamp_motion)tp_catcher->m_actual_clamp_motion2);
- tp_catcher_data->set_actual_clamp_motion3((message::Clamp_motion)tp_catcher->m_actual_clamp_motion3);
- tp_catcher_data->set_actual_clamp_motion4((message::Clamp_motion)tp_catcher->m_actual_clamp_motion4);
- std::string t_actual_error_code((char*)tp_catcher->m_actual_error_code, 50);
- tp_catcher_data->set_actual_error_code(t_actual_error_code);
- std::string t_actual_warning_code((char*)tp_catcher->m_actual_warning_code, 50);
- tp_catcher_data->set_actual_error_code(t_actual_warning_code);
- tp_catcher_data->set_actual_error_code(tp_catcher->m_actual_error_description);
- }
- for (auto iter = m_carrier_map.begin(); iter != m_carrier_map.end(); ++iter)
- {
- Carrier* tp_carrier = (Carrier*)iter->second.get();
- message::Carrier_data * tp_carrier_data = t_dispatch_manager_status_msg.mutable_carrier_data_map()->Add();
- switch ( tp_carrier->get_device_id() )
- {
- case 0:
- {
- tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_1);
- break;
- }
- case 1:
- {
- tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_2);
- break;
- }
- case 2:
- {
- tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_3);
- break;
- }
- default:
- {
- break;
- }
- }
- if ( tp_carrier->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
- tp_carrier->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
- {
- tp_carrier_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
- }
- else
- {
- tp_carrier_data->set_dispatch_device_status((message::Dispatch_device_status)tp_carrier->get_dispatch_device_status());
- }
- tp_carrier_data->set_device_id(tp_carrier->get_device_id());
- tp_carrier_data->set_actual_device_status((message::Hardware_device_status)tp_carrier->m_actual_device_status);
- tp_carrier_data->set_actual_load_status((message::Load_status)tp_carrier->m_actual_load_status);
- tp_carrier_data->set_actual_coordinates_id(tp_carrier->m_actual_coordinates_id);
- tp_carrier_data->set_actual_x(tp_carrier->m_actual_x);
- tp_carrier_data->set_actual_y(tp_carrier->m_actual_y);
- tp_carrier_data->set_actual_z(tp_carrier->m_actual_z);
- tp_carrier_data->set_actual_y1(tp_carrier->m_actual_y1);
- tp_carrier_data->set_actual_y2(tp_carrier->m_actual_y2);
- tp_carrier_data->set_actual_clamp_motion1((message::Clamp_motion)tp_carrier->m_actual_clamp_motion1);
- tp_carrier_data->set_actual_clamp_motion2((message::Clamp_motion)tp_carrier->m_actual_clamp_motion2);
- tp_carrier_data->set_actual_small_sports_car_motion((message::Small_sports_car_motion)tp_carrier->m_actual_small_sports_car_motion);
- tp_carrier_data->set_actual_joint_motion_x1((message::Joint_motion)tp_carrier->m_actual_joint_motion_x1);
- tp_carrier_data->set_actual_joint_motion_x2((message::Joint_motion)tp_carrier->m_actual_joint_motion_x2);
- std::string t_actual_error_code((char*)tp_carrier->m_actual_error_code, 50);
- tp_carrier_data->set_actual_error_code(t_actual_error_code);
- std::string t_actual_warning_code((char*)tp_carrier->m_actual_warning_code, 50);
- tp_carrier_data->set_actual_error_code(t_actual_warning_code);
- tp_carrier_data->set_actual_error_code(tp_carrier->m_actual_error_description);
- }
- t_msg = t_dispatch_manager_status_msg.SerializeAsString();
- System_communication::get_instance_references().encapsulate_msg(t_msg);
- // std::cout << " huli test :::: " << " 12312312312312 = " << t_dispatch_manager_status_msg.DebugString() << std::endl;
- // std::cout << " huli test :::: " << " 123123ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg12312312 = " << 123 << std::endl;
- return Error_code::SUCCESS;
- }
- //在流程的map 里面释放指定的流程
- Error_manager Dispatch_manager::release_dispatch_process(std::string command_key)
- {
- std::unique_lock<std::mutex> t_lock(m_lock);
- auto iter1 = m_key_to_dispatch_process_store_map.find(command_key);
- if ( iter1 != m_key_to_dispatch_process_store_map.end())
- {
- m_key_to_dispatch_process_store_map.erase(iter1);
- }
- auto iter2 = m_key_to_dispatch_process_pickup_map.find(command_key);
- if ( iter2 != m_key_to_dispatch_process_pickup_map.end())
- {
- m_key_to_dispatch_process_pickup_map.erase(iter2);
- }
- for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
- {
- if ( (*iter)->m_command_key == command_key )
- {
- m_process_store_list.erase(iter);
- break;
- }
- }
- for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
- {
- if ( (*iter)->m_command_key == command_key )
- {
- m_process_pickup_list.erase(iter);
- break;
- }
- }
- return Error_code::SUCCESS;
- }
- Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
- {
- return m_dispatch_manager_status;
- }
- int Dispatch_manager::get_dispatch_manager_id()
- {
- return m_dispatch_manager_id;
- }
- void Dispatch_manager::set_dispatch_manager_id(int dispatch_manager_id)
- {
- m_dispatch_manager_id = dispatch_manager_id;
- }
- //资源分配
- void Dispatch_manager::resource_allocation()
- {
- LOG(INFO) << " Dispatch_manager::resource_allocation() start " << this;
- Error_manager t_error;
- //分配资源的标记位, 保证每次大循环,只分配一个资源
- //流程和搬运器 匹配上了, 就直接把t_allocation_flag改为true, 然后重新开始线程循环.
- bool t_allocation_flag = false;
- Carrier* tp_carrier_left = (Carrier*)m_carrier_map[0].get();
- Carrier* tp_carrier_right = (Carrier*)m_carrier_map[1].get();
- Carrier* tp_carrier_3rd = (Carrier*)m_carrier_map[2].get();
- while (m_dispatch_manager_condition.is_alive())
- {
- m_dispatch_manager_condition.wait();
- if ( m_dispatch_manager_condition.is_alive() )
- {
- std::this_thread::sleep_for(std::chrono::microseconds(1));
- // std::this_thread::sleep_for(std::chrono::milliseconds(1));
- // std::this_thread::sleep_for(std::chrono::seconds(1));
- std::this_thread::yield();
- std::unique_lock<std::mutex> t_lock(m_lock);
- t_allocation_flag = false;
- //本线程函数只负责分配搬运器的资源 给对应的流程
- //然后拥有搬运器资源的流程, 自己去抢机器人的资源.
- //注意了: 搬运器有3个, 需要合理安排路线, 尽量保证搬运器以存取存取的顺序执行任务, 搬运器最好不要空载运行.
- //注意了: 机器人只有1个, 是调度系统最紧缺的资源, 尽量保证机器人无间断一直运行, 使效率最大化.
- bool t_carrier_left_is_ready = m_carrier_map[0]->is_ready();
- bool t_carrier_left_is_store = m_carrier_map[0]->is_able_excute_store();
- bool t_carrier_left_is_pickup = m_carrier_map[0]->is_able_excute_pickup();
- bool t_carrier_right_is_ready = m_carrier_map[1]->is_ready();
- bool t_carrier_right_is_store = m_carrier_map[1]->is_able_excute_store();
- bool t_carrier_right_is_pickup = m_carrier_map[1]->is_able_excute_pickup();
- bool t_carrier_3rd_is_ready = m_carrier_map[2]->is_ready();
- bool t_carrier_3rd_is_store = m_carrier_map[2]->is_able_excute_store();
- bool t_carrier_3rd_is_pickup = m_carrier_map[2]->is_able_excute_pickup();
- //判断是否 有搬运器空闲
- if ( t_carrier_left_is_ready || t_carrier_right_is_ready || t_carrier_3rd_is_ready)
- {
- if ( !t_allocation_flag )
- {
- //优先做取车
- for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
- {
- //判断是否有取车任务可以开始执行
- if ( (*iter)->is_ready() )
- {
- //注意了:获取 取车的路线, 停车位作为唯一起点, 由坐标模块判断可行的路径
- Dispatch_coordinates::Parkspace_path t_parkspace_path = Dispatch_coordinates::get_instance_references().get_pickup_path((*iter)->m_dispatch_source, (*iter)->m_dispatch_destination);
- //分配合理的版搬运器
- if ( t_carrier_left_is_ready && t_carrier_right_is_ready && t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH)
- {
- //选最近的搬运器
- if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier((*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id, tp_carrier_right->m_actual_coordinates_id) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- else
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_left_is_ready &&
- (t_parkspace_path == Dispatch_coordinates::Parkspace_path::LEFT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- if ( t_carrier_right_is_ready &&
- (t_parkspace_path == Dispatch_coordinates::Parkspace_path::RIGHT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- if ( t_carrier_3rd_is_ready && t_parkspace_path == Dispatch_coordinates::Parkspace_path::THIRD_FLOOR_PATH)
- {
- m_carrier_map[2]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[2]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- }
- if ( !t_allocation_flag )
- {
- //然后做存车
- for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
- {
- //判断是否有取车任务可以开始执行
- if ( (*iter)->is_ready() )
- {
- //注意了: 存车的路径由车位数据库模块来制定.
- bool is_left_path = (*iter)->is_able_store_left_path();
- bool is_right_path = (*iter)->is_able_store_right_path();
- bool is_temporary_path = (*iter)->is_able_store_temporary_cache_path();
- bool is_2nd_path = (*iter)->is_able_store_temporary_cache_path_2nd_floor();
- bool is_3rd_path = (*iter)->is_able_store_temporary_cache_path_3rd_floor();
- // std::cout << " huli test :::: " << " 1111111111111111 = " << 123 << std::endl;
- // std::cout << " huli test :::: " << " is_left_path = " << is_left_path << std::endl;
- // std::cout << " huli test :::: " << " is_right_path = " << is_right_path << std::endl;
- // std::cout << " huli test :::: " << " is_temporary_path = " << is_temporary_path << std::endl;
- // std::cout << " huli test :::: " << " is_2nd_path = " << is_2nd_path << std::endl;
- // std::cout << " huli test :::: " << " is_3rd_path = " << is_3rd_path << std::endl;
- // std::cout << " huli test :::: " << " 2222222222222222 = " << 567 << std::endl;
- //如果只能存到缓存位, 那么也要执行, 修改标志位
- if ( (!is_left_path) && (!is_right_path) && is_temporary_path)
- {
- (*iter)->m_temporary_cache_flag = true;
- }
- else
- {
- (*iter)->m_temporary_cache_flag = false;
- }
- //分配合理的版搬运器
- if ( t_carrier_left_is_ready && t_carrier_right_is_ready)
- {
- if ( (is_left_path && is_right_path) ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
- {
- //选最近的搬运器
- if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier(
- (*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id,
- tp_carrier_right->m_actual_coordinates_id) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key,
- (*iter)->m_dispatch_process_type,
- Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- else
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key,
- (*iter)->m_dispatch_process_type,
- Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- if ( t_carrier_left_is_ready )
- {
- if ( is_left_path ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_right_is_ready )
- {
- if ( is_right_path ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_3rd_is_ready)
- {
- if ( (!is_left_path) && (!is_right_path) && is_3rd_path)
- {
- m_carrier_map[2]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[2]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- }
- }
- }
- //判断是否 有搬运器可以预约取车
- if ( t_carrier_left_is_pickup || t_carrier_right_is_pickup || t_carrier_3rd_is_pickup)
- {
- if ( !t_allocation_flag )
- {
- //优先做取车
- for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
- {
- //判断是否有取车任务可以开始执行
- if ( (*iter)->is_ready() )
- {
- //注意了:获取 取车的路线, 停车位作为唯一起点, 由坐标模块判断可行的路径
- Dispatch_coordinates::Parkspace_path t_parkspace_path = Dispatch_coordinates::get_instance_references().get_pickup_path((*iter)->m_dispatch_source, (*iter)->m_dispatch_destination);
- //分配合理的版搬运器
- if ( t_carrier_left_is_pickup && t_carrier_right_is_pickup && t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH)
- {
- //注意了:这里需要根据3级存车任务来 选择一级取车任务
- //对比2个搬运器的3级存车任务的状态, 来选择合适的搬运器, 后续可能会改道
- if ( tp_carrier_left->m_redirect_flag && tp_carrier_right->m_redirect_flag &&
- (*iter)->m_car_type >= tp_carrier_left->m_redirect_store_car_type &&
- (*iter)->m_car_type >= tp_carrier_right->m_redirect_store_car_type)
- {
- //选最近的搬运器
- if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier((*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id, tp_carrier_right->m_actual_coordinates_id) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- else
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- else if ( tp_carrier_left->m_redirect_flag &&
- (*iter)->m_car_type >= tp_carrier_left->m_redirect_store_car_type )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- else //只要左库不能改道, 那么就把任务分给右库, 因为右库多一个7号出口.
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_left_is_pickup &&
- (t_parkspace_path == Dispatch_coordinates::Parkspace_path::LEFT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- if ( t_carrier_right_is_pickup &&
- (t_parkspace_path == Dispatch_coordinates::Parkspace_path::RIGHT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- if ( t_carrier_3rd_is_pickup && t_parkspace_path == Dispatch_coordinates::Parkspace_path::THIRD_FLOOR_PATH)
- {
- m_carrier_map[2]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[2]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- }
- }
- //判断是否 有搬运器可以预约取车
- if ( t_carrier_left_is_store || t_carrier_right_is_store || t_carrier_3rd_is_store)
- {
- if ( !t_allocation_flag )
- {
- //没有分配的
- int t_need_allocation_size = 0;
- for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
- {
- if ( !(*iter)->is_ready() )
- {
- t_need_allocation_size++;
- }
- }
- //然后做存车
- for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
- {
- //判断是否有取车任务可以开始执行
- if ( (*iter)->is_ready() )
- {
- //注意了: 存车的路径由车位数据库模块来制定.
- bool is_left_path = (*iter)->is_able_store_left_path();
- bool is_right_path = (*iter)->is_able_store_right_path();
- bool is_temporary_path = (*iter)->is_able_store_temporary_cache_path();
- bool is_2nd_path = (*iter)->is_able_store_temporary_cache_path_2nd_floor();
- bool is_3rd_path = (*iter)->is_able_store_temporary_cache_path_3rd_floor();
- //如果只能存到缓存位, 或者存车流程数量超限, 修改标志位
- if ( ( (!is_left_path) && (!is_right_path) && is_temporary_path) ||
- (t_need_allocation_size >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && is_temporary_path) )
- {
- (*iter)->m_temporary_cache_flag = true;
- }
- else
- {
- (*iter)->m_temporary_cache_flag = false;
- }
- //分配合理的版搬运器
- if ( t_carrier_left_is_store && t_carrier_right_is_store)
- {
- if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
- ( (!(*iter)->m_temporary_cache_flag) && is_left_path && is_right_path) )
- {
- if ( is_2nd_path )
- {
- //选最近的搬运器
- if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier(
- (*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id,
- tp_carrier_right->m_actual_coordinates_id) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key,
- (*iter)->m_dispatch_process_type,
- Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- else
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key,
- (*iter)->m_dispatch_process_type,
- Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- }
- if ( t_carrier_left_is_store )
- {
- if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
- ( (!(*iter)->m_temporary_cache_flag) && is_left_path ) )
- {
- m_carrier_map[0]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[0]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_right_is_store )
- {
- if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
- ( (!(*iter)->m_temporary_cache_flag) && is_right_path) )
- {
- m_carrier_map[1]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[1]);
- t_allocation_flag = true;
- break;
- }
- }
- if ( t_carrier_3rd_is_store)
- {
- if ( (*iter)->m_temporary_cache_flag && is_3rd_path )
- {
- m_carrier_map[2]->appoint_task((*iter)->m_command_key, (*iter)->m_dispatch_process_type, Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
- (*iter)->set_main_carrier(m_carrier_map[2]);
- t_allocation_flag = true;
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- LOG(INFO) << " Dispatch_manager::resource_allocation() end "<< this;
- return;
- }
|