1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042 |
- //
- // 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(), error.get_description_length());
- 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);
- }
- 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;
- }
- }
- else 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;
- }
- else 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;
- }
- else 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;
- }
- else
- {
- //流程和搬运器没有匹配上, 就直接找下一个流程
- continue;
- }
- }
- }
- }
- 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();
- //如果只能存到缓存位, 那么也要执行, 修改标志位
- 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;
- }
- }
- }
- else 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;
- }
- }
- else 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;
- }
- }
- else 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;
- }
- }
- else
- {
- continue;
- }
- }
- }
- }
- }
- //判断是否 有搬运器可以预约取车
- 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;
- }
- }
- else 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;
- }
- else 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;
- }
- else 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;
- }
- else
- {
- //流程和搬运器没有匹配上, 就直接找下一个流程
- continue;
- }
- }
- }
- }
- }
- //判断是否 有搬运器可以预约取车
- if ( t_carrier_left_is_store || t_carrier_right_is_store || t_carrier_3rd_is_store)
- {
- 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();
- //如果只能存到缓存位, 或者存车流程数量超限, 修改标志位
- if ( ( (!is_left_path) && (!is_right_path) && is_temporary_path) ||
- (m_process_store_list.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_ready && t_carrier_right_is_ready)
- {
- if ( (is_left_path && is_right_path) ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) || //如果只能存到2楼, 那么也要执行
- (m_process_store_list.size() >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && 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;
- }
- }
- else if (m_process_store_list.size() >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && is_2nd_path)
- {
- }
- }
- else if ( t_carrier_left_is_ready )
- {
- if ( is_left_path ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) || //如果只能存到2楼, 那么也要执行
- (m_process_store_list.size() >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && is_2nd_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;
- }
- }
- else if ( t_carrier_right_is_ready )
- {
- if ( is_right_path ||
- ( (!is_left_path) && (!is_right_path) && is_2nd_path) || //如果只能存到2楼, 那么也要执行
- (m_process_store_list.size() >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && is_2nd_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;
- }
- }
- else if ( t_carrier_3rd_is_ready)
- {
- if ( ( (!is_left_path) && (!is_right_path) && is_3rd_path) || //如果只能存到2楼, 那么也要执行
- (m_process_store_list.size() >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && 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;
- }
- }
- else
- {
- continue;
- }
- }
- }
- }
- }
- }
- }
- LOG(INFO) << " Dispatch_manager::resource_allocation() end "<< this;
- return;
- }
|