dispatch_manager.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  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. mpp_space_lock = nullptr;
  17. m_space_lock_rows = 0;
  18. m_space_lock_columns = 0;
  19. m_space_lock_total = 0;
  20. }
  21. Dispatch_manager::~Dispatch_manager()
  22. {
  23. dispatch_manager_uninit();
  24. }
  25. //调度管理 初始化
  26. Error_manager Dispatch_manager::dispatch_manager_init(int dispatch_manager_id)
  27. {
  28. m_dispatch_manager_id = dispatch_manager_id;
  29. return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
  30. }
  31. //调度管理 初始化
  32. Error_manager Dispatch_manager::dispatch_manager_init()
  33. {
  34. return dispatch_manager_init_from_protobuf(DISPATCH_DEVICE_PARAMETER_PATH);
  35. }
  36. //初始化 调度管理 模块。从文件读取
  37. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(std::string prototxt_path)
  38. {
  39. Dispatch_proto::Dispatch_device_parameter_all t_dispatch_device_parameter_all;
  40. if(! proto_tool::read_proto_param(prototxt_path,t_dispatch_device_parameter_all) )
  41. {
  42. return Error_manager(DISPATCH_MANAGER_READ_PROTOBUF_ERROR,MINOR_ERROR,
  43. "Dispatch_manager read_proto_param failed");
  44. }
  45. return dispatch_manager_init_from_protobuf(t_dispatch_device_parameter_all);
  46. }
  47. //初始化 调度管理 模块。从protobuf读取
  48. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all)
  49. {
  50. LOG(INFO) << " ----Dispatch_manager::dispatch_manager_init_from_protobuf----- "<< this;
  51. Error_manager t_error;
  52. m_catcher_size = dispatch_device_parameter_all.catcher_parameters_size();
  53. for (int i = 0; i < m_catcher_size; ++i)
  54. {
  55. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Catcher);
  56. Catcher* tp_catcher = (Catcher*)tp_dispatch_device_base.get();
  57. int t_id = dispatch_device_parameter_all.catcher_parameters(i).id();
  58. int t_key = dispatch_device_parameter_all.catcher_parameters(i).key();
  59. tp_catcher->dispatch_device_base_init(t_id, t_key);
  60. m_catcher_map[t_id] = tp_dispatch_device_base;
  61. }
  62. m_carrier_size = dispatch_device_parameter_all.carrier_parameters_size();
  63. for (int i = 0; i < m_carrier_size; ++i)
  64. {
  65. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Carrier);
  66. Carrier* tp_carrier = (Carrier*)tp_dispatch_device_base.get();
  67. int t_id = dispatch_device_parameter_all.carrier_parameters(i).id();
  68. int t_key = dispatch_device_parameter_all.carrier_parameters(i).key();
  69. tp_carrier->dispatch_device_base_init(t_id, t_key);
  70. m_carrier_map[t_id] = tp_dispatch_device_base;
  71. }
  72. m_passageway_size = dispatch_device_parameter_all.passageway_parameters_size();
  73. for (int i = 0; i < m_passageway_size; ++i)
  74. {
  75. std::shared_ptr<Dispatch_device_base> tp_dispatch_device_base(new Passageway);
  76. Passageway* tp_passageway = (Passageway*)tp_dispatch_device_base.get();
  77. int t_id = dispatch_device_parameter_all.passageway_parameters(i).id();
  78. int t_key = dispatch_device_parameter_all.passageway_parameters(i).key();
  79. tp_passageway->dispatch_device_base_init(t_id, t_key);
  80. m_passageway_map[t_id] = tp_dispatch_device_base;
  81. }
  82. m_space_lock_rows = dispatch_device_parameter_all.parkspace_number().rows();
  83. m_space_lock_columns = dispatch_device_parameter_all.parkspace_number().columns();
  84. m_space_lock_total = dispatch_device_parameter_all.parkspace_number().total();
  85. mpp_space_lock = new space_device*[m_space_lock_rows];
  86. for (int i = 0; i < m_space_lock_rows; ++i)
  87. {
  88. mpp_space_lock[i] = new space_device[m_space_lock_columns];
  89. for (int j = 0; j < m_space_lock_columns; ++j)
  90. {
  91. //注意了, 这里一定要初始化为-1, 因为设备id=0 是有效设备
  92. mpp_space_lock[i][j].m_catcher_id = -1;
  93. mpp_space_lock[i][j].m_carrier_id = -1;
  94. }
  95. }
  96. //等待和plc建立通信后, 标定初始位置, 并加锁. (初始位置可能不标准, 要把左右的都加锁)
  97. // auto t_time = std::chrono::system_clock::now();
  98. // bool t_flag = false;
  99. // int t_rows_index = 0;
  100. // int t_columns_index = 0;
  101. // while ( std::chrono::system_clock::now() - t_time < std::chrono::seconds(5) || t_flag == false)
  102. // {
  103. // t_flag = true;
  104. // //先判断搬运器的
  105. //
  106. // for (auto iter = m_catcher_map.begin(); iter != m_catcher_map.end(); ++iter)
  107. // {
  108. // Catcher* tp_catcher = (Catcher*)iter->second.get();
  109. // int coordinates_id = tp_catcher->m_actual_coordinates_id;
  110. // if ( coordinates_id == 0 )
  111. // {
  112. // t_flag = false;
  113. // }
  114. // else if(coordinates_id>0 && coordinates_id<=dispatch_device_parameter_all.parkspace_number().total())
  115. // {
  116. // t_rows_index = coordinates_id/columns;
  117. // t_columns_index = coordinates_id%columns;
  118. // mpp_space_lock[t_rows_index][t_columns_index].catcher_id = tp_catcher->get_device_id();
  119. // t_rows_index = (coordinates_id+1)/columns;
  120. // t_columns_index = (coordinates_id+1)%columns;
  121. // mpp_space_lock[t_rows_index][t_columns_index].catcher_id = tp_catcher->get_device_id();
  122. // t_rows_index = (coordinates_id-1)/columns;
  123. // t_columns_index = (coordinates_id-1)%columns;
  124. // mpp_space_lock[t_rows_index][t_columns_index].catcher_id = tp_catcher->get_device_id();
  125. // }
  126. // else if ( coordinates_id>PASSAGEWAY_ID_BASE )
  127. // {
  128. // coordinates_id
  129. // }
  130. // }
  131. // std::this_thread::sleep_for(std::chrono::microseconds(1));
  132. // }
  133. // if ( t_flag == false )
  134. // {
  135. // return Error_manager(Error_code::DISPATCH_MANAGER_SPACE_LOCK_ERROR, Error_level::MINOR_ERROR,
  136. // " Dispatch_manager::dispatch_manager_init_from_protobuf error ");
  137. // }
  138. std::cout << " huli test :::: " << " m_catcher_size = " << m_catcher_size << std::endl;
  139. std::cout << " huli test :::: " << " m_catcher_map.size() = " << m_catcher_map.size() << std::endl;
  140. std::cout << " huli test :::: " << " m_carrier_size = " << m_carrier_size << std::endl;
  141. std::cout << " huli test :::: " << " m_carrier_map.size() = " << m_carrier_map.size() << std::endl;
  142. std::cout << " huli test :::: " << " m_passageway_size = " << m_passageway_size << std::endl;
  143. std::cout << " huli test :::: " << " m_passageway_map.size() = " << m_passageway_map.size() << std::endl;
  144. std::cout << " huli test :::: " << " m_space_lock_rows = " << m_space_lock_rows << std::endl;
  145. std::cout << " huli test :::: " << " m_space_lock_columns = " << m_space_lock_columns << std::endl;
  146. //调度管理 设备复位
  147. t_error = dispatch_manager_device_reset();
  148. if ( t_error != Error_code::SUCCESS )
  149. {
  150. return t_error;
  151. }
  152. //创建线程池
  153. if (m_process_thread_queue == nullptr) {
  154. m_process_thread_queue = tq::TQFactory::CreateDefaultQueue();
  155. m_process_thread_queue->Start(48);
  156. }
  157. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  158. return Error_code::SUCCESS;
  159. }
  160. //调度管理 反初始化
  161. Error_manager Dispatch_manager::dispatch_manager_uninit()
  162. {
  163. if (m_dispatch_manager_thread)
  164. {
  165. m_dispatch_manager_condition.kill_all();
  166. }
  167. if (m_dispatch_manager_thread)
  168. {
  169. m_dispatch_manager_thread->join();
  170. delete m_dispatch_manager_thread;
  171. m_dispatch_manager_thread = NULL;
  172. }
  173. //等待线程池完成
  174. if(m_process_thread_queue!=nullptr) {
  175. m_process_thread_queue->WaitForFinish();
  176. m_process_thread_queue->Stop();
  177. m_process_thread_queue = nullptr;
  178. }
  179. m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
  180. m_dispatch_manager_id = -1;
  181. // for (int i = 0; i < m_catcher_size; ++i)
  182. // {
  183. // m_catcher_vector[i]->dispatch_device_base_uninit();
  184. // delete(m_catcher_vector[i]);
  185. // }
  186. // m_catcher_size = 0;
  187. // m_catcher_vector.clear();
  188. //
  189. // for (int i = 0; i < m_carrier_size; ++i)
  190. // {
  191. // m_carrier_vector[i]->dispatch_device_base_uninit();
  192. // delete(m_carrier_vector[i]);
  193. // }
  194. // m_carrier_size = 0;
  195. // m_carrier_vector.clear();
  196. //
  197. // for (int i = 0; i < m_passageway_size; ++i)
  198. // {
  199. // m_passageway_vector[i]->dispatch_device_base_uninit();
  200. // delete(m_passageway_vector[i]);
  201. // }
  202. // m_passageway_size = 0;
  203. // m_passageway_vector.clear();
  204. return Error_code::SUCCESS;
  205. }
  206. //调度管理 设备复位
  207. Error_manager Dispatch_manager::dispatch_manager_device_reset()
  208. {
  209. //以后再写
  210. return Error_code::SUCCESS;
  211. }
  212. //对外的接口函数,负责接受并处理任务单,
  213. Error_manager Dispatch_manager::execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction)
  214. {
  215. return Error_code::SUCCESS;
  216. // std::this_thread::sleep_for(std::chrono::seconds(rand()%3+3));
  217. if ( dispatch_motion_direction == E_PICKUP_CAR )
  218. {
  219. return Error_code::SUCCESS;
  220. }
  221. // return Error_code::SUCCESS;
  222. // srand(0);
  223. unsigned int t_probability = rand();
  224. if ( t_probability%100 >=20 )
  225. {
  226. return Error_code::SUCCESS;
  227. }
  228. else
  229. {
  230. return Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
  231. " Dispatch_manager::execute_task() error ");
  232. }
  233. }
  234. //检查能否执行消息指令
  235. Error_manager Dispatch_manager::check_execute_msg(Communication_message* p_msg)
  236. {
  237. Error_manager t_error = Dispatch_manager::get_instance_references().check_status();
  238. if ( t_error == Error_code::SUCCESS )
  239. {
  240. return Error_code::SUCCESS;
  241. }
  242. else if (t_error.get_error_level() == NEGLIGIBLE_ERROR)//一级故障,轻微故障,
  243. {
  244. std::cout << "Dispatch_manager _is_busy , " << std::endl;
  245. //返回繁忙之后, 通信模块1秒后再次调用check
  246. return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
  247. }
  248. switch ( p_msg->get_message_type() )
  249. {
  250. case Communication_message::Message_type::eDispatch_request_msg:
  251. {
  252. message::Dispatch_request_msg t_dispatch_request_msg;
  253. //针对消息类型, 对消息进行二次解析
  254. if (t_dispatch_request_msg.ParseFromString(p_msg->get_message_buf()))
  255. {
  256. //创建一条答复消息
  257. message::Dispatch_response_msg t_dispatch_response_msg;
  258. t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  259. t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(5000);
  260. t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  261. t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  262. t_dispatch_response_msg.set_command_key(t_dispatch_request_msg.command_key());
  263. t_dispatch_response_msg.mutable_error_manager()->set_error_code(t_error.get_error_code());
  264. t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)t_error.get_error_level());
  265. t_dispatch_response_msg.mutable_error_manager()->set_error_description(t_error.get_error_description());
  266. std::string t_msg = t_dispatch_response_msg.SerializeAsString();
  267. System_communication::get_instance_references().encapsulate_msg(t_msg);
  268. LOG(INFO) << " System_executor::check_execute_msg executer status error "<< this;
  269. return t_error;
  270. }
  271. else
  272. {
  273. LOG(INFO) << " System_executor::check_executer Second analysis ERROR "<< this;
  274. return Error_manager(Error_code::SYSTEM_EXECUTOR_PARSE_ERROR, Error_level::MINOR_ERROR,
  275. " message::Measure_request_msg ParseFromString error ");
  276. }
  277. }
  278. case Communication_message::Message_type::eDispatch_plan_response_msg:
  279. {
  280. return Error_code::SUCCESS;
  281. break;
  282. }
  283. case Communication_message::Message_type::eDispatch_control_request_msg:
  284. {
  285. return Error_code::SUCCESS;
  286. break;
  287. }
  288. default :
  289. //无效的消息,
  290. return Error_manager(Error_code::INVALID_MESSAGE, Error_level::NEGLIGIBLE_ERROR,
  291. " INVALID_MESSAGE error ");
  292. break;
  293. }
  294. }
  295. //检查状态
  296. Error_manager Dispatch_manager::check_status()
  297. {
  298. if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
  299. {
  300. return Error_code::SUCCESS;
  301. }
  302. else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE || m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE )
  303. {
  304. return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
  305. " Dispatch_manager::check_status() error ");
  306. }
  307. else
  308. {
  309. return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_ERROR, Error_level::MINOR_ERROR,
  310. " Dispatch_manager::check_status() error ");
  311. }
  312. return Error_code::SUCCESS;
  313. }
  314. //调度模块 //执行搬运请求(主控->调度管理)
  315. Error_manager Dispatch_manager::execute_for_dispatch_request_msg(message::Dispatch_request_msg& dispatch_request_msg)
  316. {
  317. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_request_msg--- "<< dispatch_request_msg.DebugString() << " "<< this;
  318. LOG(INFO) << " dispatch_request_msg->m_command_key = "<<dispatch_request_msg.command_key()<< " "<< this;
  319. Error_manager t_error;
  320. //创建调度流程
  321. Dispatch_process * tp_dispatch_process(new Dispatch_process);
  322. t_error = tp_dispatch_process->Dispatch_process_init(dispatch_request_msg);
  323. if ( t_error != Error_code::SUCCESS )
  324. {
  325. delete(tp_dispatch_process);
  326. return t_error;
  327. }
  328. {//加锁
  329. std::unique_lock<std::mutex> t_lock(m_lock);
  330. //流程缓存到map
  331. if (tp_dispatch_process->m_dispatch_process_type ==
  332. Dispatch_process::Dispatch_process_type::DISPATCH_PROCESS_STORE)
  333. {
  334. m_process_store_list.push_back(tp_dispatch_process);
  335. //这里就不查重了, 需要主控保证不会重复发送...
  336. // if (m_key_to_dispatch_process_store_map.find(tp_dispatch_process->m_command_key) !=
  337. // m_key_to_dispatch_process_store_map.end())
  338. // {
  339. // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
  340. // " tp_dispatch_process->m_command_key is repeat ");
  341. // }
  342. // else
  343. // {
  344. // m_key_to_dispatch_process_store_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
  345. // }
  346. }
  347. else if (tp_dispatch_process->m_dispatch_process_type ==
  348. Dispatch_process::Dispatch_process_type::DISPATCH_PROCESS_PICKUP)
  349. {
  350. m_process_pickup_list.push_back(tp_dispatch_process);
  351. //这里就不查重了, 需要主控保证不会重复发送...
  352. // if (m_key_to_dispatch_process_pickup_map.find(tp_dispatch_process->m_command_key) !=
  353. // m_key_to_dispatch_process_pickup_map.end())
  354. // {
  355. // t_error = Error_manager(Error_code::DISPATCH_PROCESS_COMMAND_KEY_REPEAT, Error_level::MINOR_ERROR,
  356. // " tp_dispatch_process->m_command_key is repeat ");
  357. // }
  358. // else
  359. // {
  360. // m_key_to_dispatch_process_pickup_map[tp_dispatch_process->m_command_key] = tp_dispatch_process;
  361. // }
  362. }
  363. else
  364. {
  365. t_error = Error_manager(Error_code::DISPATCH_PROCESS_TASK_STATUS_ERROR, Error_level::MINOR_ERROR,
  366. " tp_dispatch_process->m_dispatch_process_type PARAMRTER ERROR ");
  367. }
  368. }
  369. if ( t_error != Error_code::SUCCESS )
  370. {
  371. delete(tp_dispatch_process);
  372. send_dispatch_response_msg_with_error(dispatch_request_msg, t_error);
  373. return t_error;
  374. }
  375. else
  376. {
  377. //把流程添加到 调度线程池里面, 里面的线程池会自动回收调度流程的内存
  378. m_process_thread_queue->AddTask(tp_dispatch_process);
  379. }
  380. return Error_code::SUCCESS;
  381. }
  382. //调度模块 答复数据异常
  383. Error_manager Dispatch_manager::send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error)
  384. {
  385. message::Dispatch_response_msg t_dispatch_response_msg;
  386. t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  387. t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(dispatch_request_msg.base_info().timeout_ms());
  388. t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  389. t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  390. t_dispatch_response_msg.set_command_key(dispatch_request_msg.command_key());
  391. t_dispatch_response_msg.mutable_error_manager()->set_error_code(error.get_error_code());
  392. t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)error.get_error_level());
  393. t_dispatch_response_msg.mutable_error_manager()->set_error_description(error.get_error_description(), error.get_description_length());
  394. System_communication::get_instance_references().encapsulate_msg(t_dispatch_response_msg.SerializeAsString());
  395. return Error_code::SUCCESS;
  396. }
  397. //调度模块 //调度总规划的答复(调度算法->调度管理)
  398. Error_manager Dispatch_manager::execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg)
  399. {
  400. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_plan_response_msg--- "<< this;
  401. LOG(INFO) << " dispatch_plan_response_msg->m_command_key = "<<dispatch_plan_response_msg.command_key()<< " "<< this;
  402. Error_manager t_error;
  403. std::unique_lock<std::mutex> t_lock(m_lock);
  404. //使用 command_key 找到对应的流程
  405. std::string t_command_key = dispatch_plan_response_msg.command_key();
  406. for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
  407. {
  408. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  409. {
  410. t_error = iter->second->check_process_ready() ;
  411. if ( t_error != Error_code::SUCCESS )
  412. {
  413. return t_error;
  414. }
  415. //把消息 写入流程
  416. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  417. iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
  418. return Error_code::SUCCESS;
  419. }
  420. }
  421. for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
  422. {
  423. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  424. {
  425. t_error = iter->second->check_process_ready() ;
  426. if ( t_error != Error_code::SUCCESS )
  427. {
  428. return t_error;
  429. }
  430. //把消息 写入流程
  431. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  432. iter->second->m_dispatch_plan_response_msg = dispatch_plan_response_msg;
  433. return Error_code::SUCCESS;
  434. }
  435. }
  436. return Error_code::SUCCESS;
  437. }
  438. //调度模块 //调度控制的任务请求(调度算法->调度管理)
  439. Error_manager Dispatch_manager::execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg)
  440. {
  441. LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_control_request_msg--- "<< this;
  442. LOG(INFO) << " dispatch_control_request_msg->m_command_key = "<<dispatch_control_request_msg.command_key()<< " "<< this;
  443. Error_manager t_error;
  444. std::unique_lock<std::mutex> t_lock(m_lock);
  445. //使用 command_key 找到对应的流程
  446. std::string t_command_key = dispatch_control_request_msg.command_key();
  447. for (auto iter = m_key_to_dispatch_process_store_map.begin(); iter != m_key_to_dispatch_process_store_map.end(); ++iter)
  448. {
  449. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  450. {
  451. t_error = iter->second->check_process_ready() ;
  452. if ( t_error != Error_code::SUCCESS )
  453. {
  454. return t_error;
  455. }
  456. //把消息 写入流程
  457. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  458. int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
  459. if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
  460. {
  461. Dispatch_process::Dispatch_control_node t_dispatch_control_node;
  462. iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
  463. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  464. }
  465. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
  466. // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  467. return Error_code::SUCCESS;
  468. }
  469. }
  470. for (auto iter = m_key_to_dispatch_process_pickup_map.begin(); iter != m_key_to_dispatch_process_pickup_map.end(); ++iter)
  471. {
  472. if ( 0 == iter->first.compare(0, COMMAND_KEY_DEFAULT_LENGTH, t_command_key, 0, COMMAND_KEY_DEFAULT_LENGTH) )
  473. {
  474. t_error = iter->second->check_process_ready() ;
  475. if ( t_error != Error_code::SUCCESS )
  476. {
  477. return t_error;
  478. }
  479. //把消息 写入流程
  480. std::unique_lock<std::mutex> t_lock(iter->second->m_lock);
  481. int t_dispatch_device_type = dispatch_control_request_msg.dispatch_device_type();
  482. if ( iter->second->m_dispatch_control_node_map.find(t_dispatch_device_type) == iter->second->m_dispatch_control_node_map.end() )
  483. {
  484. Dispatch_process::Dispatch_control_node t_dispatch_control_node;
  485. iter->second->m_dispatch_control_node_map[t_dispatch_device_type] = t_dispatch_control_node;
  486. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  487. }
  488. iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_request_msg = dispatch_control_request_msg;
  489. // iter->second->m_dispatch_control_node_map[t_dispatch_device_type].m_dispatch_control_status = Dispatch_process::Dispatch_control_status::DISPATCH_CONTROL_READY;
  490. return Error_code::SUCCESS;
  491. }
  492. }
  493. return Error_code::SUCCESS;
  494. }
  495. //定时发送 调度管理的状态
  496. Error_manager Dispatch_manager::encapsulate_send_dispatch_manager_status()
  497. {
  498. Error_manager t_error;
  499. int t_dispatch_manager_id = get_dispatch_manager_id();
  500. std::string t_msg;
  501. //创建一条 调度管理总管理的状态
  502. message::Dispatch_manager_status_msg t_dispatch_manager_status_msg;
  503. t_dispatch_manager_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_manager_status_msg);
  504. t_dispatch_manager_status_msg.mutable_base_info()->set_timeout_ms(5000);
  505. t_dispatch_manager_status_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  506. t_dispatch_manager_status_msg.mutable_base_info()->set_receiver(message::Communicator::eEmpty);
  507. t_dispatch_manager_status_msg.set_dispatch_id(t_dispatch_manager_id);
  508. Dispatch_manager::Dispatch_manager_status t_dispatch_manager_status = get_dispatch_manager_status();
  509. t_dispatch_manager_status_msg.set_dispatch_manager_status((message::Dispatch_manager_status)t_dispatch_manager_status);
  510. for (auto iter = m_catcher_map.begin(); iter != m_catcher_map.end(); ++iter)
  511. {
  512. Catcher* tp_catcher = (Catcher*)iter->second.get();
  513. message::Catcher_data * tp_catcher_data = t_dispatch_manager_status_msg.mutable_catcher_data_map()->Add();
  514. switch ( tp_catcher->get_device_id() )
  515. {
  516. case 0:
  517. {
  518. tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_1);
  519. break;
  520. }
  521. case 1:
  522. {
  523. tp_catcher_data->set_dispatch_device_type(message::Dispatch_device_type::ROBOT_2);
  524. break;
  525. }
  526. default:
  527. {
  528. break;
  529. }
  530. }
  531. if ( tp_catcher->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
  532. tp_catcher->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
  533. {
  534. tp_catcher_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
  535. }
  536. else
  537. {
  538. tp_catcher_data->set_dispatch_device_status((message::Dispatch_device_status)tp_catcher->get_dispatch_device_status());
  539. }
  540. tp_catcher_data->set_device_id(tp_catcher->get_device_id());
  541. tp_catcher_data->set_actual_device_status((message::Hardware_device_status)tp_catcher->m_actual_device_status);
  542. tp_catcher_data->set_actual_load_status((message::Load_status)tp_catcher->m_actual_load_status);
  543. tp_catcher_data->set_actual_coordinates_id(tp_catcher->m_actual_coordinates_id);
  544. tp_catcher_data->set_actual_x(tp_catcher->m_actual_x);
  545. tp_catcher_data->set_actual_y(tp_catcher->m_actual_y);
  546. tp_catcher_data->set_actual_b(tp_catcher->m_actual_b);
  547. tp_catcher_data->set_actual_z(tp_catcher->m_actual_z);
  548. tp_catcher_data->set_actual_d1(tp_catcher->m_actual_d1);
  549. tp_catcher_data->set_actual_d2(tp_catcher->m_actual_d2);
  550. tp_catcher_data->set_actual_clamp_motion1((message::Clamp_motion)tp_catcher->m_actual_clamp_motion1);
  551. tp_catcher_data->set_actual_clamp_motion2((message::Clamp_motion)tp_catcher->m_actual_clamp_motion2);
  552. tp_catcher_data->set_actual_clamp_motion3((message::Clamp_motion)tp_catcher->m_actual_clamp_motion3);
  553. tp_catcher_data->set_actual_clamp_motion4((message::Clamp_motion)tp_catcher->m_actual_clamp_motion4);
  554. std::string t_actual_error_code((char*)tp_catcher->m_actual_error_code, 50);
  555. tp_catcher_data->set_actual_error_code(t_actual_error_code);
  556. std::string t_actual_warning_code((char*)tp_catcher->m_actual_warning_code, 50);
  557. tp_catcher_data->set_actual_error_code(t_actual_warning_code);
  558. tp_catcher_data->set_actual_error_code(tp_catcher->m_actual_error_description);
  559. }
  560. for (auto iter = m_carrier_map.begin(); iter != m_carrier_map.end(); ++iter)
  561. {
  562. Carrier* tp_carrier = (Carrier*)iter->second.get();
  563. message::Carrier_data * tp_carrier_data = t_dispatch_manager_status_msg.mutable_carrier_data_map()->Add();
  564. switch ( tp_carrier->get_device_id() )
  565. {
  566. case 0:
  567. {
  568. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_1);
  569. break;
  570. }
  571. case 1:
  572. {
  573. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_2);
  574. break;
  575. }
  576. case 2:
  577. {
  578. tp_carrier_data->set_dispatch_device_type(message::Dispatch_device_type::CARRIER_3);
  579. break;
  580. }
  581. default:
  582. {
  583. break;
  584. }
  585. }
  586. if ( tp_carrier->get_dispatch_device_status() >= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_BUSY &&
  587. tp_carrier->get_dispatch_device_status() <= Dispatch_device_base::Dispatch_device_status::DISPATCH_DEVICE_THREE_LEVEL_WORK)
  588. {
  589. tp_carrier_data->set_dispatch_device_status(message::Dispatch_device_status::DISPATCH_DEVICE_BUSY);
  590. }
  591. else
  592. {
  593. tp_carrier_data->set_dispatch_device_status((message::Dispatch_device_status)tp_carrier->get_dispatch_device_status());
  594. }
  595. tp_carrier_data->set_device_id(tp_carrier->get_device_id());
  596. tp_carrier_data->set_actual_device_status((message::Hardware_device_status)tp_carrier->m_actual_device_status);
  597. tp_carrier_data->set_actual_load_status((message::Load_status)tp_carrier->m_actual_load_status);
  598. tp_carrier_data->set_actual_coordinates_id(tp_carrier->m_actual_coordinates_id);
  599. tp_carrier_data->set_actual_x(tp_carrier->m_actual_x);
  600. tp_carrier_data->set_actual_y(tp_carrier->m_actual_y);
  601. tp_carrier_data->set_actual_z(tp_carrier->m_actual_z);
  602. tp_carrier_data->set_actual_y1(tp_carrier->m_actual_y1);
  603. tp_carrier_data->set_actual_y2(tp_carrier->m_actual_y2);
  604. tp_carrier_data->set_actual_clamp_motion1((message::Clamp_motion)tp_carrier->m_actual_clamp_motion1);
  605. tp_carrier_data->set_actual_clamp_motion2((message::Clamp_motion)tp_carrier->m_actual_clamp_motion2);
  606. tp_carrier_data->set_actual_small_sports_car_motion((message::Small_sports_car_motion)tp_carrier->m_actual_small_sports_car_motion);
  607. tp_carrier_data->set_actual_joint_motion_x1((message::Joint_motion)tp_carrier->m_actual_joint_motion_x1);
  608. tp_carrier_data->set_actual_joint_motion_x2((message::Joint_motion)tp_carrier->m_actual_joint_motion_x2);
  609. std::string t_actual_error_code((char*)tp_carrier->m_actual_error_code, 50);
  610. tp_carrier_data->set_actual_error_code(t_actual_error_code);
  611. std::string t_actual_warning_code((char*)tp_carrier->m_actual_warning_code, 50);
  612. tp_carrier_data->set_actual_error_code(t_actual_warning_code);
  613. tp_carrier_data->set_actual_error_code(tp_carrier->m_actual_error_description);
  614. }
  615. t_msg = t_dispatch_manager_status_msg.SerializeAsString();
  616. System_communication::get_instance_references().encapsulate_msg(t_msg);
  617. // std::cout << " huli test :::: " << " 12312312312312 = " << t_dispatch_manager_status_msg.DebugString() << std::endl;
  618. // std::cout << " huli test :::: " << " 123123ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg12312312 = " << 123 << std::endl;
  619. return Error_code::SUCCESS;
  620. }
  621. //在流程的map 里面释放指定的流程
  622. Error_manager Dispatch_manager::release_dispatch_process(std::string command_key)
  623. {
  624. std::unique_lock<std::mutex> t_lock(m_lock);
  625. auto iter1 = m_key_to_dispatch_process_store_map.find(command_key);
  626. if ( iter1 != m_key_to_dispatch_process_store_map.end())
  627. {
  628. m_key_to_dispatch_process_store_map.erase(iter1);
  629. }
  630. auto iter2 = m_key_to_dispatch_process_pickup_map.find(command_key);
  631. if ( iter2 != m_key_to_dispatch_process_pickup_map.end())
  632. {
  633. m_key_to_dispatch_process_pickup_map.erase(iter2);
  634. }
  635. return Error_code::SUCCESS;
  636. }
  637. Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
  638. {
  639. return m_dispatch_manager_status;
  640. }
  641. int Dispatch_manager::get_dispatch_manager_id()
  642. {
  643. return m_dispatch_manager_id;
  644. }
  645. void Dispatch_manager::set_dispatch_manager_id(int dispatch_manager_id)
  646. {
  647. m_dispatch_manager_id = dispatch_manager_id;
  648. }
  649. void Dispatch_manager::set_space_lock(int space_rows, int space_columns, int catcher_id, int carrier_id)
  650. {
  651. std::unique_lock<std::mutex> t_lock(m_lock);
  652. mpp_space_lock[space_rows][space_columns].m_catcher_id = catcher_id;
  653. mpp_space_lock[space_rows][space_columns].m_carrier_id = carrier_id;
  654. }
  655. void Dispatch_manager::set_space_lock_for_catcher(int space_rows, int space_columns, int catcher_id)
  656. {
  657. std::unique_lock<std::mutex> t_lock(m_lock);
  658. mpp_space_lock[space_rows][space_columns].m_catcher_id = catcher_id;
  659. }
  660. void Dispatch_manager::set_space_lock_for_carrier(int space_rows, int space_columns, int carrier_id)
  661. {
  662. std::unique_lock<std::mutex> t_lock(m_lock);
  663. mpp_space_lock[space_rows][space_columns].m_carrier_id = carrier_id;
  664. }
  665. void Dispatch_manager::set_space_lock(int space_id, int catcher_id, int carrier_id)
  666. {
  667. int space_rows = (space_id-1) / m_space_lock_columns;
  668. int space_columns = (space_id-1) % m_space_lock_columns;
  669. set_space_lock(space_rows, space_columns, catcher_id, carrier_id);
  670. }
  671. void Dispatch_manager::set_space_lock_for_catcher(int space_id, int catcher_id)
  672. {
  673. int space_rows = (space_id-1) / m_space_lock_columns;
  674. int space_columns = (space_id-1) % m_space_lock_columns;
  675. set_space_lock_for_catcher(space_rows, space_columns, catcher_id);
  676. }
  677. void Dispatch_manager::set_space_lock_for_carrier(int space_id, int carrier_id)
  678. {
  679. int space_rows = (space_id-1) / m_space_lock_columns;
  680. int space_columns = (space_id-1) % m_space_lock_columns;
  681. set_space_lock_for_carrier(space_rows, space_columns, carrier_id);
  682. }