dispatch_manager.cpp 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056
  1. //
  2. // Created by huli on 2020/7/20.
  3. //
  4. #include "dispatch_manager.h"
  5. #include "../tool/proto_tool.h"
  6. #include <cstdlib>
  7. Dispatch_manager::Dispatch_manager()
  8. {
  9. m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
  10. m_dispatch_manager_id = -1;
  11. m_catcher_size = 0;
  12. m_carrier_size = 0;
  13. m_passageway_size = 0;
  14. m_process_thread_queue = nullptr;
  15. m_dispatch_manager_thread = nullptr;
  16. }
  17. Dispatch_manager::~Dispatch_manager()
  18. {
  19. dispatch_manager_uninit();
  20. }
  21. //调度管理 初始化
  22. Error_manager Dispatch_manager::dispatch_manager_init(int dispatch_manager_id)
  23. {
  24. m_dispatch_manager_id = dispatch_manager_id;
  25. return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
  26. }
  27. //调度管理 初始化
  28. Error_manager Dispatch_manager::dispatch_manager_init()
  29. {
  30. return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
  31. }
  32. //初始化 调度管理 模块。从文件读取
  33. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(std::string prototxt_path)
  34. {
  35. Dispatch_proto::Dispatch_device_parameter_all t_dispatch_device_parameter_all;
  36. if(! proto_tool::read_proto_param(prototxt_path,t_dispatch_device_parameter_all) )
  37. {
  38. return Error_manager(DISPATCH_MANAGER_READ_PROTOBUF_ERROR,MINOR_ERROR,
  39. "Dispatch_manager read_proto_param failed");
  40. }
  41. return dispatch_manager_init_from_protobuf(t_dispatch_device_parameter_all);
  42. }
  43. //初始化 调度管理 模块。从protobuf读取
  44. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all)
  45. {
  46. LOG(INFO) << " ----Dispatch_manager::dispatch_manager_init_from_protobuf----- "<< this;
  47. Error_manager t_error;
  48. m_catcher_size = dispatch_device_parameter_all.catcher_parameters_size();
  49. for (int i = 0; i < m_catcher_size; ++i)
  50. {
  51. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Catcher);
  52. Catcher* tp_catcher = (Catcher*)tp_dispatch_device_base.get();
  53. int t_id = dispatch_device_parameter_all.catcher_parameters(i).id();
  54. int t_key = dispatch_device_parameter_all.catcher_parameters(i).key();
  55. tp_catcher->dispatch_device_base_init(t_id, t_key);
  56. m_catcher_map[t_id] = tp_dispatch_device_base;
  57. }
  58. m_carrier_size = dispatch_device_parameter_all.carrier_parameters_size();
  59. for (int i = 0; i < m_carrier_size; ++i)
  60. {
  61. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Carrier);
  62. Carrier* tp_carrier = (Carrier*)tp_dispatch_device_base.get();
  63. int t_id = dispatch_device_parameter_all.carrier_parameters(i).id();
  64. int t_key = dispatch_device_parameter_all.carrier_parameters(i).key();
  65. tp_carrier->dispatch_device_base_init(t_id, t_key);
  66. m_carrier_map[t_id] = tp_dispatch_device_base;
  67. }
  68. m_passageway_size = dispatch_device_parameter_all.passageway_parameters_size();
  69. for (int i = 0; i < m_passageway_size; ++i)
  70. {
  71. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Passageway);
  72. Passageway* tp_passageway = (Passageway*)tp_dispatch_device_base.get();
  73. int t_id = dispatch_device_parameter_all.passageway_parameters(i).id();
  74. int t_key = dispatch_device_parameter_all.passageway_parameters(i).key();
  75. tp_passageway->dispatch_device_base_init(t_id, t_key);
  76. m_passageway_map[t_id] = tp_dispatch_device_base;
  77. }
  78. //调度管理 设备复位
  79. t_error = dispatch_manager_device_reset();
  80. if ( t_error != Error_code::SUCCESS )
  81. {
  82. return t_error;
  83. }
  84. //创建线程池
  85. if (m_process_thread_queue == nullptr) {
  86. m_process_thread_queue = tq::TQFactory::CreateDefaultQueue();
  87. m_process_thread_queue->Start(48);
  88. }
  89. // 线程默认开启
  90. m_dispatch_manager_condition.reset(false, true, false);
  91. m_dispatch_manager_thread = new std::thread(&Dispatch_manager::resource_allocation, this);
  92. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  93. return Error_code::SUCCESS;
  94. }
  95. //调度管理 反初始化
  96. Error_manager Dispatch_manager::dispatch_manager_uninit()
  97. {
  98. if (m_dispatch_manager_thread)
  99. {
  100. m_dispatch_manager_condition.kill_all();
  101. }
  102. if (m_dispatch_manager_thread)
  103. {
  104. m_dispatch_manager_thread->join();
  105. delete m_dispatch_manager_thread;
  106. m_dispatch_manager_thread = NULL;
  107. }
  108. //等待线程池完成
  109. if(m_process_thread_queue!=nullptr) {
  110. m_process_thread_queue->WaitForFinish();
  111. m_process_thread_queue->Stop();
  112. m_process_thread_queue = nullptr;
  113. }
  114. m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
  115. m_dispatch_manager_id = -1;
  116. return Error_code::SUCCESS;
  117. }
  118. //调度管理 设备复位
  119. Error_manager Dispatch_manager::dispatch_manager_device_reset()
  120. {
  121. //以后再写
  122. return Error_code::SUCCESS;
  123. }
  124. //对外的接口函数,负责接受并处理任务单,
  125. Error_manager Dispatch_manager::execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction)
  126. {
  127. return Error_code::SUCCESS;
  128. // std::this_thread::sleep_for(std::chrono::seconds(rand()%3+3));
  129. if ( dispatch_motion_direction == E_PICKUP_CAR )
  130. {
  131. return Error_code::SUCCESS;
  132. }
  133. // return Error_code::SUCCESS;
  134. // srand(0);
  135. unsigned int t_probability = rand();
  136. if ( t_probability%100 >=20 )
  137. {
  138. return Error_code::SUCCESS;
  139. }
  140. else
  141. {
  142. return Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
  143. " Dispatch_manager::execute_task() error ");
  144. }
  145. }
  146. //检查能否执行消息指令
  147. Error_manager Dispatch_manager::check_execute_msg(Communication_message* p_msg)
  148. {
  149. Error_manager t_error = Dispatch_manager::get_instance_references().check_status();
  150. if ( t_error == Error_code::SUCCESS )
  151. {
  152. return Error_code::SUCCESS;
  153. }
  154. else if (t_error.get_error_level() == NEGLIGIBLE_ERROR)//一级故障,轻微故障,
  155. {
  156. std::cout << "Dispatch_manager _is_busy , " << std::endl;
  157. //返回繁忙之后, 通信模块1秒后再次调用check
  158. return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
  159. }
  160. switch ( p_msg->get_message_type() )
  161. {
  162. case Communication_message::Message_type::eDispatch_request_msg:
  163. {
  164. message::Dispatch_request_msg t_dispatch_request_msg;
  165. //针对消息类型, 对消息进行二次解析
  166. if (t_dispatch_request_msg.ParseFromString(p_msg->get_message_buf()))
  167. {
  168. //创建一条答复消息
  169. message::Dispatch_response_msg t_dispatch_response_msg;
  170. t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  171. t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(5000);
  172. t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  173. t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  174. t_dispatch_response_msg.set_command_key(t_dispatch_request_msg.command_key());
  175. t_dispatch_response_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
  176. t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
  177. t_dispatch_response_msg.mutable_error_manager()->set_error_description(t_error.get_error_description());
  178. std::string t_msg = t_dispatch_response_msg.SerializeAsString();
  179. System_communication::get_instance_references().encapsulate_msg(t_msg);
  180. LOG(INFO) << " System_executor::check_execute_msg executer status error "<< this;
  181. return t_error;
  182. }
  183. else
  184. {
  185. LOG(INFO) << " System_executor::check_executer Second analysis ERROR "<< this;
  186. return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
  187. " message::Measure_request_msg ParseFromString error ");
  188. }
  189. }
  190. case Communication_message::Message_type::eDispatch_plan_response_msg:
  191. {
  192. return Error_code::SUCCESS;
  193. break;
  194. }
  195. case Communication_message::Message_type::eDispatch_control_request_msg:
  196. {
  197. return Error_code::SUCCESS;
  198. break;
  199. }
  200. default :
  201. //无效的消息,
  202. return Error_manager(Error_code::INVALID_MESSAGE, Error_level::NEGLIGIBLE_ERROR,
  203. " INVALID_MESSAGE error ");
  204. break;
  205. }
  206. }
  207. //检查状态
  208. Error_manager Dispatch_manager::check_status()
  209. {
  210. if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
  211. {
  212. return Error_code::SUCCESS;
  213. }
  214. else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE || m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE )
  215. {
  216. return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
  217. " Dispatch_manager::check_status() error ");
  218. }
  219. else
  220. {
  221. return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_ERROR, Error_level::MINOR_ERROR,
  222. " Dispatch_manager::check_status() error ");
  223. }
  224. return Error_code::SUCCESS;
  225. }
  226. //调度模块 //执行搬运请求(主控->调度管理)
  227. Error_manager Dispatch_manager::execute_for_dispatch_request_msg(message::Dispatch_request_msg& dispatch_request_msg)
  228. {
  229. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_request_msg--- "<< dispatch_request_msg.DebugString() << " "<< this;
  230. LOG(INFO) << " dispatch_request_msg->m_command_key = "<<dispatch_request_msg.command_key()<< " "<< this;
  231. Error_manager t_error;
  232. //创建调度流程
  233. Dispatch_process * tp_dispatch_process(new Dispatch_process);
  234. t_error = tp_dispatch_process->Dispatch_process_init(dispatch_request_msg);
  235. if ( t_error != Error_code::SUCCESS )
  236. {
  237. delete(tp_dispatch_process);
  238. return t_error;
  239. }
  240. {//加锁
  241. std::unique_lock<std::mutex> t_lock(m_lock);
  242. //流程缓存到map
  243. if (tp_dispatch_process->m_dispatch_process_type ==
  244. Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE)
  245. {
  246. m_process_store_list.push_back(tp_dispatch_process);
  247. //这里就不查重了, 需要主控保证不会重复发送...
  248. // if (m_key_to_dispatch_process_store_map.find(tp_dispatch_process->m_command_key) !=
  249. // m_key_to_dispatch_process_store_map.end())
  250. // {
  251. // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
  252. // " tp_dispatch_process->m_command_key is repeat ");
  253. // }
  254. // else
  255. // {
  256. // m_key_to_dispatch_process_store_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
  257. // }
  258. }
  259. else if (tp_dispatch_process->m_dispatch_process_type ==
  260. Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP)
  261. {
  262. m_process_pickup_list.push_back(tp_dispatch_process);
  263. //这里就不查重了, 需要主控保证不会重复发送...
  264. // if (m_key_to_dispatch_process_pickup_map.find(tp_dispatch_process->m_command_key) !=
  265. // m_key_to_dispatch_process_pickup_map.end())
  266. // {
  267. // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
  268. // " tp_dispatch_process->m_command_key is repeat ");
  269. // }
  270. // else
  271. // {
  272. // m_key_to_dispatch_process_pickup_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
  273. // }
  274. }
  275. else
  276. {
  277. t_error = Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
  278. " tp_dispatch_process->m_dispatch_process_type PARAMRTER ERROR ");
  279. }
  280. }
  281. if ( t_error != Error_code::SUCCESS )
  282. {
  283. delete(tp_dispatch_process);
  284. send_dispatch_response_msg_with_error(dispatch_request_msg, t_error);
  285. return t_error;
  286. }
  287. else
  288. {
  289. //把流程添加到 调度线程池里面, 里面的线程池会自动回收调度流程的内存
  290. m_process_thread_queue->AddTask(tp_dispatch_process);
  291. }
  292. return Error_code::SUCCESS;
  293. }
  294. //调度模块 答复数据异常
  295. Error_manager Dispatch_manager::send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error)
  296. {
  297. message::Dispatch_response_msg t_dispatch_response_msg;
  298. t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  299. t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(dispatch_request_msg.base_info().timeout_ms());
  300. t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  301. t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  302. t_dispatch_response_msg.set_command_key(dispatch_request_msg.command_key());
  303. t_dispatch_response_msg.mutable_error_manager()->set_error_code(error.get_error_code());
  304. t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)error.get_error_level());
  305. t_dispatch_response_msg.mutable_error_manager()->set_error_description(error.get_error_description());
  306. System_communication::get_instance_references().encapsulate_msg(t_dispatch_response_msg.SerializeAsString());
  307. return Error_code::SUCCESS;
  308. }
  309. //调度模块 //调度总规划的答复(调度算法->调度管理)
  310. Error_manager Dispatch_manager::execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg)
  311. {
  312. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_plan_response_msg--- "<< this;
  313. LOG(INFO) << " dispatch_plan_response_msg->m_command_key = "<<dispatch_plan_response_msg.command_key()<< " "<< this;
  314. Error_manager t_error;
  315. std::unique_lock<std::mutex> t_lock(m_lock);
  316. //使用 command_key 找到对应的流程
  317. std::string t_command_key = dispatch_plan_response_msg.command_key();
  318. for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
  319. {
  320. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  321. {
  322. t_error = iter->second->check_process_ready() ;
  323. if ( t_error != Error_code::SUCCESS )
  324. {
  325. return t_error;
  326. }
  327. //把消息 写入流程
  328. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  329. iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
  330. return Error_code::SUCCESS;
  331. }
  332. }
  333. for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
  334. {
  335. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  336. {
  337. t_error = iter->second->check_process_ready() ;
  338. if ( t_error != Error_code::SUCCESS )
  339. {
  340. return t_error;
  341. }
  342. //把消息 写入流程
  343. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  344. iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
  345. return Error_code::SUCCESS;
  346. }
  347. }
  348. return Error_code::SUCCESS;
  349. }
  350. //调度模块 //调度控制的任务请求(调度算法->调度管理)
  351. Error_manager Dispatch_manager::execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg)
  352. {
  353. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_control_request_msg--- "<< this;
  354. LOG(INFO) << " dispatch_control_request_msg->m_command_key = "<<dispatch_control_request_msg.command_key()<< " "<< this;
  355. Error_manager t_error;
  356. std::unique_lock<std::mutex> t_lock(m_lock);
  357. //使用 command_key 找到对应的流程
  358. std::string t_command_key = dispatch_control_request_msg.command_key();
  359. for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
  360. {
  361. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  362. {
  363. t_error = iter->second->check_process_ready() ;
  364. if ( t_error != Error_code::SUCCESS )
  365. {
  366. return t_error;
  367. }
  368. //把消息 写入流程
  369. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  370. int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
  371. if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
  372. {
  373. Dispatch_process::Dispatch_control_node t_dispatch_control_node;
  374. iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
  375. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  376. }
  377. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
  378. // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  379. return Error_code::SUCCESS;
  380. }
  381. }
  382. for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
  383. {
  384. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  385. {
  386. t_error = iter->second->check_process_ready() ;
  387. if ( t_error != Error_code::SUCCESS )
  388. {
  389. return t_error;
  390. }
  391. //把消息 写入流程
  392. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  393. int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
  394. if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
  395. {
  396. Dispatch_process::Dispatch_control_node t_dispatch_control_node;
  397. iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
  398. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  399. }
  400. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
  401. // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  402. return Error_code::SUCCESS;
  403. }
  404. }
  405. return Error_code::SUCCESS;
  406. }
  407. //定时发送 调度管理的状态
  408. Error_manager Dispatch_manager::encapsulate_send_dispatch_manager_status()
  409. {
  410. Error_manager t_error;
  411. int t_dispatch_manager_id = get_dispatch_manager_id();
  412. std::string t_msg;
  413. //创建一条 调度管理总管理的状态
  414. message::Dispatch_manager_status_msg t_dispatch_manager_status_msg;
  415. t_dispatch_manager_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_manager_status_msg);
  416. t_dispatch_manager_status_msg.mutable_base_info()->set_timeout_ms(5000);
  417. t_dispatch_manager_status_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  418. t_dispatch_manager_status_msg.mutable_base_info()->set_receiver(message::Communicator::eEmpty);
  419. t_dispatch_manager_status_msg.set_dispatch_id(t_dispatch_manager_id);
  420. Dispatch_manager::Dispatch_manager_status t_dispatch_manager_status = get_dispatch_manager_status();
  421. t_dispatch_manager_status_msg.set_dispatch_manager_status((message::Dispatch_manager_status)t_dispatch_manager_status);
  422. for (auto iter = m_catcher_map.begin(); iter != m_catcher_map.end(); ++iter)
  423. {
  424. Catcher* tp_catcher = (Catcher*)iter->second.get();
  425. message::Catcher_data * tp_catcher_data = t_dispatch_manager_status_msg.mutable_catcher_data_map()->Add();
  426. switch ( tp_catcher->get_device_id() )
  427. {
  428. case 0:
  429. {
  430. tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_1);
  431. break;
  432. }
  433. case 1:
  434. {
  435. tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_2);
  436. break;
  437. }
  438. default:
  439. {
  440. break;
  441. }
  442. }
  443. if ( tp_catcher->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
  444. tp_catcher->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
  445. {
  446. tp_catcher_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
  447. }
  448. else
  449. {
  450. tp_catcher_data->set_dispatch_device_status((message::Dispatch_device_status)tp_catcher->get_dispatch_device_status());
  451. }
  452. tp_catcher_data->set_device_id(tp_catcher->get_device_id());
  453. tp_catcher_data->set_actual_device_status((message::Hardware_device_status)tp_catcher->m_actual_device_status);
  454. tp_catcher_data->set_actual_load_status((message::Load_status)tp_catcher->m_actual_load_status);
  455. tp_catcher_data->set_actual_coordinates_id(tp_catcher->m_actual_coordinates_id);
  456. tp_catcher_data->set_actual_x(tp_catcher->m_actual_x);
  457. tp_catcher_data->set_actual_y(tp_catcher->m_actual_y);
  458. tp_catcher_data->set_actual_b(tp_catcher->m_actual_b);
  459. tp_catcher_data->set_actual_z(tp_catcher->m_actual_z);
  460. tp_catcher_data->set_actual_d1(tp_catcher->m_actual_d1);
  461. tp_catcher_data->set_actual_d2(tp_catcher->m_actual_d2);
  462. tp_catcher_data->set_actual_clamp_motion1((message::Clamp_motion)tp_catcher->m_actual_clamp_motion1);
  463. tp_catcher_data->set_actual_clamp_motion2((message::Clamp_motion)tp_catcher->m_actual_clamp_motion2);
  464. tp_catcher_data->set_actual_clamp_motion3((message::Clamp_motion)tp_catcher->m_actual_clamp_motion3);
  465. tp_catcher_data->set_actual_clamp_motion4((message::Clamp_motion)tp_catcher->m_actual_clamp_motion4);
  466. std::string t_actual_error_code((char*)tp_catcher->m_actual_error_code, 50);
  467. tp_catcher_data->set_actual_error_code(t_actual_error_code);
  468. std::string t_actual_warning_code((char*)tp_catcher->m_actual_warning_code, 50);
  469. tp_catcher_data->set_actual_error_code(t_actual_warning_code);
  470. tp_catcher_data->set_actual_error_code(tp_catcher->m_actual_error_description);
  471. }
  472. for (auto iter = m_carrier_map.begin(); iter != m_carrier_map.end(); ++iter)
  473. {
  474. Carrier* tp_carrier = (Carrier*)iter->second.get();
  475. message::Carrier_data * tp_carrier_data = t_dispatch_manager_status_msg.mutable_carrier_data_map()->Add();
  476. switch ( tp_carrier->get_device_id() )
  477. {
  478. case 0:
  479. {
  480. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_1);
  481. break;
  482. }
  483. case 1:
  484. {
  485. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_2);
  486. break;
  487. }
  488. case 2:
  489. {
  490. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_3);
  491. break;
  492. }
  493. default:
  494. {
  495. break;
  496. }
  497. }
  498. if ( tp_carrier->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
  499. tp_carrier->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
  500. {
  501. tp_carrier_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
  502. }
  503. else
  504. {
  505. tp_carrier_data->set_dispatch_device_status((message::Dispatch_device_status)tp_carrier->get_dispatch_device_status());
  506. }
  507. tp_carrier_data->set_device_id(tp_carrier->get_device_id());
  508. tp_carrier_data->set_actual_device_status((message::Hardware_device_status)tp_carrier->m_actual_device_status);
  509. tp_carrier_data->set_actual_load_status((message::Load_status)tp_carrier->m_actual_load_status);
  510. tp_carrier_data->set_actual_coordinates_id(tp_carrier->m_actual_coordinates_id);
  511. tp_carrier_data->set_actual_x(tp_carrier->m_actual_x);
  512. tp_carrier_data->set_actual_y(tp_carrier->m_actual_y);
  513. tp_carrier_data->set_actual_z(tp_carrier->m_actual_z);
  514. tp_carrier_data->set_actual_y1(tp_carrier->m_actual_y1);
  515. tp_carrier_data->set_actual_y2(tp_carrier->m_actual_y2);
  516. tp_carrier_data->set_actual_clamp_motion1((message::Clamp_motion)tp_carrier->m_actual_clamp_motion1);
  517. tp_carrier_data->set_actual_clamp_motion2((message::Clamp_motion)tp_carrier->m_actual_clamp_motion2);
  518. tp_carrier_data->set_actual_small_sports_car_motion((message::Small_sports_car_motion)tp_carrier->m_actual_small_sports_car_motion);
  519. tp_carrier_data->set_actual_joint_motion_x1((message::Joint_motion)tp_carrier->m_actual_joint_motion_x1);
  520. tp_carrier_data->set_actual_joint_motion_x2((message::Joint_motion)tp_carrier->m_actual_joint_motion_x2);
  521. std::string t_actual_error_code((char*)tp_carrier->m_actual_error_code, 50);
  522. tp_carrier_data->set_actual_error_code(t_actual_error_code);
  523. std::string t_actual_warning_code((char*)tp_carrier->m_actual_warning_code, 50);
  524. tp_carrier_data->set_actual_error_code(t_actual_warning_code);
  525. tp_carrier_data->set_actual_error_code(tp_carrier->m_actual_error_description);
  526. }
  527. t_msg = t_dispatch_manager_status_msg.SerializeAsString();
  528. System_communication::get_instance_references().encapsulate_msg(t_msg);
  529. // std::cout << " huli test :::: " << " 12312312312312 = " << t_dispatch_manager_status_msg.DebugString() << std::endl;
  530. // std::cout << " huli test :::: " << " 123123ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg12312312 = " << 123 << std::endl;
  531. return Error_code::SUCCESS;
  532. }
  533. //在流程的map 里面释放指定的流程
  534. Error_manager Dispatch_manager::release_dispatch_process(std::string command_key)
  535. {
  536. std::unique_lock<std::mutex> t_lock(m_lock);
  537. auto iter1 = m_key_to_dispatch_process_store_map.find(command_key);
  538. if ( iter1 != m_key_to_dispatch_process_store_map.end())
  539. {
  540. m_key_to_dispatch_process_store_map.erase(iter1);
  541. }
  542. auto iter2 = m_key_to_dispatch_process_pickup_map.find(command_key);
  543. if ( iter2 != m_key_to_dispatch_process_pickup_map.end())
  544. {
  545. m_key_to_dispatch_process_pickup_map.erase(iter2);
  546. }
  547. for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
  548. {
  549. if ( (*iter)->m_command_key == command_key )
  550. {
  551. m_process_store_list.erase(iter);
  552. break;
  553. }
  554. }
  555. for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
  556. {
  557. if ( (*iter)->m_command_key == command_key )
  558. {
  559. m_process_pickup_list.erase(iter);
  560. break;
  561. }
  562. }
  563. return Error_code::SUCCESS;
  564. }
  565. Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
  566. {
  567. return m_dispatch_manager_status;
  568. }
  569. int Dispatch_manager::get_dispatch_manager_id()
  570. {
  571. return m_dispatch_manager_id;
  572. }
  573. void Dispatch_manager::set_dispatch_manager_id(int dispatch_manager_id)
  574. {
  575. m_dispatch_manager_id = dispatch_manager_id;
  576. }
  577. //资源分配
  578. void Dispatch_manager::resource_allocation()
  579. {
  580. LOG(INFO) << " Dispatch_manager::resource_allocation() start " << this;
  581. Error_manager t_error;
  582. //分配资源的标记位, 保证每次大循环,只分配一个资源
  583. //流程和搬运器 匹配上了, 就直接把t_allocation_flag改为true, 然后重新开始线程循环.
  584. bool t_allocation_flag = false;
  585. Carrier* tp_carrier_left = (Carrier*)m_carrier_map[0].get();
  586. Carrier* tp_carrier_right = (Carrier*)m_carrier_map[1].get();
  587. Carrier* tp_carrier_3rd = (Carrier*)m_carrier_map[2].get();
  588. while (m_dispatch_manager_condition.is_alive())
  589. {
  590. m_dispatch_manager_condition.wait();
  591. if ( m_dispatch_manager_condition.is_alive() )
  592. {
  593. std::this_thread::sleep_for(std::chrono::microseconds(1));
  594. // std::this_thread::sleep_for(std::chrono::milliseconds(1));
  595. // std::this_thread::sleep_for(std::chrono::seconds(1));
  596. std::this_thread::yield();
  597. std::unique_lock<std::mutex> t_lock(m_lock);
  598. t_allocation_flag = false;
  599. //本线程函数只负责分配搬运器的资源 给对应的流程
  600. //然后拥有搬运器资源的流程, 自己去抢机器人的资源.
  601. //注意了: 搬运器有3个, 需要合理安排路线, 尽量保证搬运器以存取存取的顺序执行任务, 搬运器最好不要空载运行.
  602. //注意了: 机器人只有1个, 是调度系统最紧缺的资源, 尽量保证机器人无间断一直运行, 使效率最大化.
  603. bool t_carrier_left_is_ready = m_carrier_map[0]->is_ready();
  604. bool t_carrier_left_is_store = m_carrier_map[0]->is_able_excute_store();
  605. bool t_carrier_left_is_pickup = m_carrier_map[0]->is_able_excute_pickup();
  606. bool t_carrier_right_is_ready = m_carrier_map[1]->is_ready();
  607. bool t_carrier_right_is_store = m_carrier_map[1]->is_able_excute_store();
  608. bool t_carrier_right_is_pickup = m_carrier_map[1]->is_able_excute_pickup();
  609. bool t_carrier_3rd_is_ready = m_carrier_map[2]->is_ready();
  610. bool t_carrier_3rd_is_store = m_carrier_map[2]->is_able_excute_store();
  611. bool t_carrier_3rd_is_pickup = m_carrier_map[2]->is_able_excute_pickup();
  612. //判断是否 有搬运器空闲
  613. if ( t_carrier_left_is_ready || t_carrier_right_is_ready || t_carrier_3rd_is_ready)
  614. {
  615. if ( !t_allocation_flag )
  616. {
  617. //优先做取车
  618. for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
  619. {
  620. //判断是否有取车任务可以开始执行
  621. if ( (*iter)->is_ready() )
  622. {
  623. //注意了:获取 取车的路线, 停车位作为唯一起点, 由坐标模块判断可行的路径
  624. Dispatch_coordinates::Parkspace_path t_parkspace_path = Dispatch_coordinates::get_instance_references().get_pickup_path((*iter)->m_dispatch_source, (*iter)->m_dispatch_destination);
  625. //分配合理的版搬运器
  626. if ( t_carrier_left_is_ready && t_carrier_right_is_ready && t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH)
  627. {
  628. //选最近的搬运器
  629. 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) )
  630. {
  631. 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);
  632. (*iter)->set_main_carrier(m_carrier_map[0]);
  633. t_allocation_flag = true;
  634. break;
  635. }
  636. else
  637. {
  638. 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);
  639. (*iter)->set_main_carrier(m_carrier_map[1]);
  640. t_allocation_flag = true;
  641. break;
  642. }
  643. }
  644. if ( t_carrier_left_is_ready &&
  645. (t_parkspace_path == Dispatch_coordinates::Parkspace_path::LEFT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
  646. {
  647. 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);
  648. (*iter)->set_main_carrier(m_carrier_map[0]);
  649. t_allocation_flag = true;
  650. break;
  651. }
  652. if ( t_carrier_right_is_ready &&
  653. (t_parkspace_path == Dispatch_coordinates::Parkspace_path::RIGHT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
  654. {
  655. 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);
  656. (*iter)->set_main_carrier(m_carrier_map[1]);
  657. t_allocation_flag = true;
  658. break;
  659. }
  660. if ( t_carrier_3rd_is_ready && t_parkspace_path == Dispatch_coordinates::Parkspace_path::THIRD_FLOOR_PATH)
  661. {
  662. 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);
  663. (*iter)->set_main_carrier(m_carrier_map[2]);
  664. t_allocation_flag = true;
  665. break;
  666. }
  667. }
  668. }
  669. }
  670. if ( !t_allocation_flag )
  671. {
  672. //然后做存车
  673. for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
  674. {
  675. //判断是否有取车任务可以开始执行
  676. if ( (*iter)->is_ready() )
  677. {
  678. //注意了: 存车的路径由车位数据库模块来制定.
  679. bool is_left_path = (*iter)->is_able_store_left_path();
  680. bool is_right_path = (*iter)->is_able_store_right_path();
  681. bool is_temporary_path = (*iter)->is_able_store_temporary_cache_path();
  682. bool is_2nd_path = (*iter)->is_able_store_temporary_cache_path_2nd_floor();
  683. bool is_3rd_path = (*iter)->is_able_store_temporary_cache_path_3rd_floor();
  684. // std::cout << " huli test :::: " << " 1111111111111111 = " << 123 << std::endl;
  685. // std::cout << " huli test :::: " << " is_left_path = " << is_left_path << std::endl;
  686. // std::cout << " huli test :::: " << " is_right_path = " << is_right_path << std::endl;
  687. // std::cout << " huli test :::: " << " is_temporary_path = " << is_temporary_path << std::endl;
  688. // std::cout << " huli test :::: " << " is_2nd_path = " << is_2nd_path << std::endl;
  689. // std::cout << " huli test :::: " << " is_3rd_path = " << is_3rd_path << std::endl;
  690. // std::cout << " huli test :::: " << " 2222222222222222 = " << 567 << std::endl;
  691. //如果只能存到缓存位, 那么也要执行, 修改标志位
  692. if ( (!is_left_path) && (!is_right_path) && is_temporary_path)
  693. {
  694. (*iter)->m_temporary_cache_flag = true;
  695. }
  696. else
  697. {
  698. (*iter)->m_temporary_cache_flag = false;
  699. }
  700. //分配合理的版搬运器
  701. if ( t_carrier_left_is_ready && t_carrier_right_is_ready)
  702. {
  703. if ( (is_left_path && is_right_path) ||
  704. ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
  705. {
  706. //选最近的搬运器
  707. if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier(
  708. (*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id,
  709. tp_carrier_right->m_actual_coordinates_id) )
  710. {
  711. m_carrier_map[0]->appoint_task((*iter)->m_command_key,
  712. (*iter)->m_dispatch_process_type,
  713. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  714. (*iter)->set_main_carrier(m_carrier_map[0]);
  715. t_allocation_flag = true;
  716. break;
  717. }
  718. else
  719. {
  720. m_carrier_map[1]->appoint_task((*iter)->m_command_key,
  721. (*iter)->m_dispatch_process_type,
  722. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  723. (*iter)->set_main_carrier(m_carrier_map[1]);
  724. t_allocation_flag = true;
  725. break;
  726. }
  727. }
  728. }
  729. if ( t_carrier_left_is_ready )
  730. {
  731. if ( is_left_path ||
  732. ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
  733. {
  734. 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);
  735. (*iter)->set_main_carrier(m_carrier_map[0]);
  736. t_allocation_flag = true;
  737. break;
  738. }
  739. }
  740. if ( t_carrier_right_is_ready )
  741. {
  742. if ( is_right_path ||
  743. ( (!is_left_path) && (!is_right_path) && is_2nd_path) )//如果只能存到2楼, 那么也要执行
  744. {
  745. 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);
  746. (*iter)->set_main_carrier(m_carrier_map[1]);
  747. t_allocation_flag = true;
  748. break;
  749. }
  750. }
  751. if ( t_carrier_3rd_is_ready)
  752. {
  753. if ( (!is_left_path) && (!is_right_path) && is_3rd_path)
  754. {
  755. 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);
  756. (*iter)->set_main_carrier(m_carrier_map[2]);
  757. t_allocation_flag = true;
  758. break;
  759. }
  760. }
  761. }
  762. }
  763. }
  764. }
  765. //判断是否 有搬运器可以预约取车
  766. if ( t_carrier_left_is_pickup || t_carrier_right_is_pickup || t_carrier_3rd_is_pickup)
  767. {
  768. if ( !t_allocation_flag )
  769. {
  770. //优先做取车
  771. for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
  772. {
  773. //判断是否有取车任务可以开始执行
  774. if ( (*iter)->is_ready() )
  775. {
  776. //注意了:获取 取车的路线, 停车位作为唯一起点, 由坐标模块判断可行的路径
  777. Dispatch_coordinates::Parkspace_path t_parkspace_path = Dispatch_coordinates::get_instance_references().get_pickup_path((*iter)->m_dispatch_source, (*iter)->m_dispatch_destination);
  778. //分配合理的版搬运器
  779. if ( t_carrier_left_is_pickup && t_carrier_right_is_pickup && t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH)
  780. {
  781. //注意了:这里需要根据3级存车任务来 选择一级取车任务
  782. //对比2个搬运器的3级存车任务的状态, 来选择合适的搬运器, 后续可能会改道
  783. if ( tp_carrier_left->m_redirect_flag && tp_carrier_right->m_redirect_flag &&
  784. (*iter)->m_car_type >= tp_carrier_left->m_redirect_store_car_type &&
  785. (*iter)->m_car_type >= tp_carrier_right->m_redirect_store_car_type)
  786. {
  787. //选最近的搬运器
  788. 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) )
  789. {
  790. 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);
  791. (*iter)->set_main_carrier(m_carrier_map[0]);
  792. t_allocation_flag = true;
  793. break;
  794. }
  795. else
  796. {
  797. 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);
  798. (*iter)->set_main_carrier(m_carrier_map[1]);
  799. t_allocation_flag = true;
  800. break;
  801. }
  802. }
  803. else if ( tp_carrier_left->m_redirect_flag &&
  804. (*iter)->m_car_type >= tp_carrier_left->m_redirect_store_car_type )
  805. {
  806. 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);
  807. (*iter)->set_main_carrier(m_carrier_map[0]);
  808. t_allocation_flag = true;
  809. break;
  810. }
  811. else //只要左库不能改道, 那么就把任务分给右库, 因为右库多一个7号出口.
  812. {
  813. 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);
  814. (*iter)->set_main_carrier(m_carrier_map[1]);
  815. t_allocation_flag = true;
  816. break;
  817. }
  818. }
  819. if ( t_carrier_left_is_pickup &&
  820. (t_parkspace_path == Dispatch_coordinates::Parkspace_path::LEFT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
  821. {
  822. 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);
  823. (*iter)->set_main_carrier(m_carrier_map[0]);
  824. t_allocation_flag = true;
  825. break;
  826. }
  827. if ( t_carrier_right_is_pickup &&
  828. (t_parkspace_path == Dispatch_coordinates::Parkspace_path::RIGHT_PATH || t_parkspace_path == Dispatch_coordinates::Parkspace_path::DOUBLE_PATH) )
  829. {
  830. 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);
  831. (*iter)->set_main_carrier(m_carrier_map[1]);
  832. t_allocation_flag = true;
  833. break;
  834. }
  835. if ( t_carrier_3rd_is_pickup && t_parkspace_path == Dispatch_coordinates::Parkspace_path::THIRD_FLOOR_PATH)
  836. {
  837. 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);
  838. (*iter)->set_main_carrier(m_carrier_map[2]);
  839. t_allocation_flag = true;
  840. break;
  841. }
  842. }
  843. }
  844. }
  845. }
  846. //判断是否 有搬运器可以预约取车
  847. if ( t_carrier_left_is_store || t_carrier_right_is_store || t_carrier_3rd_is_store)
  848. {
  849. if ( !t_allocation_flag )
  850. {
  851. //没有分配的
  852. int t_need_allocation_size = 0;
  853. for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
  854. {
  855. if ( !(*iter)->is_ready() )
  856. {
  857. t_need_allocation_size++;
  858. }
  859. }
  860. //然后做存车
  861. for (auto iter = m_process_store_list.begin(); iter != m_process_store_list.end(); ++iter)
  862. {
  863. //判断是否有取车任务可以开始执行
  864. if ( (*iter)->is_ready() )
  865. {
  866. //注意了: 存车的路径由车位数据库模块来制定.
  867. bool is_left_path = (*iter)->is_able_store_left_path();
  868. bool is_right_path = (*iter)->is_able_store_right_path();
  869. bool is_temporary_path = (*iter)->is_able_store_temporary_cache_path();
  870. bool is_2nd_path = (*iter)->is_able_store_temporary_cache_path_2nd_floor();
  871. bool is_3rd_path = (*iter)->is_able_store_temporary_cache_path_3rd_floor();
  872. //如果只能存到缓存位, 或者存车流程数量超限, 修改标志位
  873. if ( ( (!is_left_path) && (!is_right_path) && is_temporary_path) ||
  874. (t_need_allocation_size >= DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT && is_temporary_path) )
  875. {
  876. (*iter)->m_temporary_cache_flag = true;
  877. }
  878. else
  879. {
  880. (*iter)->m_temporary_cache_flag = false;
  881. }
  882. //分配合理的版搬运器
  883. if ( t_carrier_left_is_store && t_carrier_right_is_store)
  884. {
  885. if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
  886. ( (!(*iter)->m_temporary_cache_flag) && is_left_path && is_right_path) )
  887. {
  888. if ( is_2nd_path )
  889. {
  890. //选最近的搬运器
  891. if ( Dispatch_coordinates::get_instance_references().choice_nearest_carrier(
  892. (*iter)->m_dispatch_source, tp_carrier_left->m_actual_coordinates_id,
  893. tp_carrier_right->m_actual_coordinates_id) )
  894. {
  895. m_carrier_map[0]->appoint_task((*iter)->m_command_key,
  896. (*iter)->m_dispatch_process_type,
  897. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  898. (*iter)->set_main_carrier(m_carrier_map[0]);
  899. t_allocation_flag = true;
  900. break;
  901. }
  902. else
  903. {
  904. m_carrier_map[1]->appoint_task((*iter)->m_command_key,
  905. (*iter)->m_dispatch_process_type,
  906. Dispatch_device_base::Dispatch_task_level::DISPATCH_TASK_ONE_LEVEL);
  907. (*iter)->set_main_carrier(m_carrier_map[1]);
  908. t_allocation_flag = true;
  909. break;
  910. }
  911. }
  912. }
  913. }
  914. if ( t_carrier_left_is_store )
  915. {
  916. if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
  917. ( (!(*iter)->m_temporary_cache_flag) && is_left_path ) )
  918. {
  919. 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);
  920. (*iter)->set_main_carrier(m_carrier_map[0]);
  921. t_allocation_flag = true;
  922. break;
  923. }
  924. }
  925. if ( t_carrier_right_is_store )
  926. {
  927. if ( ( (*iter)->m_temporary_cache_flag && is_2nd_path) ||
  928. ( (!(*iter)->m_temporary_cache_flag) && is_right_path) )
  929. {
  930. 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);
  931. (*iter)->set_main_carrier(m_carrier_map[1]);
  932. t_allocation_flag = true;
  933. break;
  934. }
  935. }
  936. if ( t_carrier_3rd_is_store)
  937. {
  938. if ( (*iter)->m_temporary_cache_flag && is_3rd_path )
  939. {
  940. 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);
  941. (*iter)->set_main_carrier(m_carrier_map[2]);
  942. t_allocation_flag = true;
  943. break;
  944. }
  945. }
  946. }
  947. }
  948. }
  949. }
  950. }
  951. }
  952. LOG(INFO) << " Dispatch_manager::resource_allocation() end "<< this;
  953. return;
  954. }