dispatch_manager.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  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(), error.get_description_length());
  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. return Error_code::SUCCESS;
  548. }
  549. Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
  550. {
  551. return m_dispatch_manager_status;
  552. }
  553. int Dispatch_manager::get_dispatch_manager_id()
  554. {
  555. return m_dispatch_manager_id;
  556. }
  557. void Dispatch_manager::set_dispatch_manager_id(int dispatch_manager_id)
  558. {
  559. m_dispatch_manager_id = dispatch_manager_id;
  560. }
  561. //资源分配
  562. void Dispatch_manager::resource_allocation()
  563. {
  564. LOG(INFO) << " Dispatch_manager::resource_allocation() start " << this;
  565. Error_manager t_error;
  566. while (m_dispatch_manager_condition.is_alive())
  567. {
  568. m_dispatch_manager_condition.wait();
  569. if ( m_dispatch_manager_condition.is_alive() )
  570. {
  571. std::this_thread::sleep_for(std::chrono::microseconds(1));
  572. // std::this_thread::sleep_for(std::chrono::milliseconds(1));
  573. // std::this_thread::sleep_for(std::chrono::seconds(1));
  574. std::this_thread::yield();
  575. std::unique_lock<std::mutex> t_lock(m_lock);
  576. //本线程函数只负责分配搬运器的资源 给对应的流程
  577. //然后拥有搬运器资源的流程, 自己去抢机器人的资源.
  578. //注意了: 搬运器有3个, 需要合理安排路线, 尽量保证搬运器以存取存取的顺序执行任务, 搬运器最好不要空载运行.
  579. //注意了: 机器人只有1个, 是调度系统最紧缺的资源, 尽量保证机器人无间断一直运行, 使效率最大化.
  580. //优先做取车
  581. for (auto iter = m_process_pickup_list.begin(); iter != m_process_pickup_list.end(); ++iter)
  582. {
  583. }
  584. }
  585. }
  586. LOG(INFO) << " Dispatch_manager::resource_allocation() end "<< this;
  587. return;
  588. }