dispatch_manager.cpp 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605
  1. //
  2. // Created by huli on 2020/7/20.
  3. //
  4. #include "dispatch_manager.h"
  5. #include "../tool/proto_tool.h"
  6. #include <google/protobuf/text_format.h>
  7. #include <cstdlib>
  8. Dispatch_manager::Dispatch_manager()
  9. {
  10. m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
  11. m_dispatch_manager_status_last = E_DISPATCH_MANAGER_STORE;//初始化上一次为存车, 下一次就优先取车。
  12. m_dispatch_manager_force_pickup_flag = false;
  13. m_dispatch_manager_id = -1;
  14. // m_dispatch_motion_direction_next = Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_PICKUP;
  15. m_dispatch_manager_thread = nullptr;
  16. m_device_floor = 1;
  17. m_count_flag = false;
  18. m_post_flag = false;
  19. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_TYPE_UNKNOW;
  20. m_plc_floor = 0;
  21. m_car_type = Common_data::Car_type::UNKNOW_CAR_TYPE;
  22. }
  23. Dispatch_manager::~Dispatch_manager()
  24. {
  25. dispatch_manager_uninit();
  26. }
  27. //调度管理 初始化
  28. Error_manager Dispatch_manager::dispatch_manager_init(int dispatch_manager_id)
  29. {
  30. m_dispatch_manager_id = dispatch_manager_id;
  31. return dispatch_manager_init_from_protobuf(SETTING_PATH DISPATCH_DEVICE_PARAMETER_PATH);
  32. }
  33. //调度管理 初始化
  34. Error_manager Dispatch_manager::dispatch_manager_init()
  35. {
  36. return dispatch_manager_init_from_protobuf(SETTING_PATH DISPATCH_DEVICE_PARAMETER_PATH);
  37. }
  38. //初始化 调度管理 模块。从文件读取
  39. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(std::string prototxt_path)
  40. {
  41. Dispatch_proto::Dispatch_device_parameter_all t_dispatch_device_parameter_all;
  42. if(! proto_tool::read_proto_param(prototxt_path,t_dispatch_device_parameter_all) )
  43. {
  44. return Error_manager(DISPATCH_MANAGER_READ_PROTOBUF_ERROR,MINOR_ERROR,
  45. "Dispatch_manager read_proto_param failed");
  46. }
  47. return dispatch_manager_init_from_protobuf(t_dispatch_device_parameter_all);
  48. }
  49. //初始化 调度管理 模块。从protobuf读取
  50. Error_manager Dispatch_manager::dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all)
  51. {
  52. LOG(INFO) << " ----Dispatch_manager::dispatch_manager_init_from_protobuf----- "<< this;
  53. Error_manager t_error;
  54. m_dispatch_plc.dispatch_plc_init(m_dispatch_manager_id);
  55. m_dispatch_ground_lidar[0].dispatch_ground_lidar_init(m_dispatch_manager_id, 0);
  56. m_dispatch_ground_lidar[1].dispatch_ground_lidar_init(m_dispatch_manager_id, 1);
  57. #ifdef CHUTIAN_PROJECT_PROJECT
  58. m_dispatch_singlechip[0].dispatch_singlechip_init(m_dispatch_manager_id, 0, 1);
  59. m_dispatch_singlechip[1].dispatch_singlechip_init(m_dispatch_manager_id, 1, 1);
  60. m_dispatch_singlechip[2].dispatch_singlechip_init(m_dispatch_manager_id, 0, 2);
  61. m_dispatch_singlechip[3].dispatch_singlechip_init(m_dispatch_manager_id, 1, 2);
  62. #endif
  63. // m_dispatch_motion_direction_next = Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_PICKUP;
  64. // 线程默认开启
  65. m_dispatch_manager_condition.reset(false, true, false);
  66. // m_dispatch_manager_thread = new std::thread(&Dispatch_manager::resource_allocation, this);
  67. // m_dispatch_manager_thread = new std::thread(&Dispatch_manager::process_control, this);
  68. #ifdef CHUTIAN_PROJECT_PROJECT
  69. m_dispatch_manager_thread = new std::thread(&Dispatch_manager::process_sql, this);
  70. #endif//CHUTIAN_PROJECT_PROJECT
  71. #ifdef SHANGGUJIE_PROJECT_PROJECT
  72. m_dispatch_manager_thread = new std::thread(&Dispatch_manager::process_sql_shanggujie, this);
  73. #endif//SHANGGUJIE_PROJECT_PROJECT
  74. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  75. return Error_code::SUCCESS;
  76. }
  77. //调度管理 反初始化
  78. Error_manager Dispatch_manager::dispatch_manager_uninit()
  79. {
  80. if (m_dispatch_manager_thread)
  81. {
  82. m_dispatch_manager_condition.kill_all();
  83. }
  84. if (m_dispatch_manager_thread)
  85. {
  86. m_dispatch_manager_thread->join();
  87. delete m_dispatch_manager_thread;
  88. m_dispatch_manager_thread = NULL;
  89. }
  90. m_dispatch_manager_status = E_DISPATCH_MANAGER_UNKNOW;
  91. m_dispatch_manager_id = -1;
  92. m_dispatch_plc.dispatch_plc_uninit();
  93. #ifdef CHUTIAN_PROJECT_PROJECT
  94. m_dispatch_ground_lidar[0].dispatch_ground_lidar_uninit();
  95. m_dispatch_ground_lidar[1].dispatch_ground_lidar_uninit();
  96. m_dispatch_singlechip[0].dispatch_singlechip_uninit();
  97. m_dispatch_singlechip[1].dispatch_singlechip_uninit();
  98. m_dispatch_singlechip[2].dispatch_singlechip_uninit();
  99. m_dispatch_singlechip[3].dispatch_singlechip_uninit();
  100. #endif
  101. return Error_code::SUCCESS;
  102. }
  103. //调度管理 设备复位
  104. Error_manager Dispatch_manager::dispatch_manager_device_reset()
  105. {
  106. //以后再写
  107. return Error_code::SUCCESS;
  108. }
  109. //新的对外接口, 负责接受Rabbitmq_message,然后内部处理
  110. Error_manager Dispatch_manager::execute_rabbitmq_message_new(Rabbitmq_message* p_msg)
  111. {
  112. std::unique_lock<std::mutex> t_lock(m_lock);
  113. #ifdef CHUTIAN_PROJECT_PROJECT
  114. //通过key来判断消息类型
  115. if ( p_msg->m_routing_key == "measure_1_statu_port" ||
  116. p_msg->m_routing_key == "measure_3_statu_port" ||
  117. p_msg->m_routing_key == "measure_5_statu_port" )
  118. {
  119. m_measure_statu_msg_1 = *p_msg;
  120. if(google::protobuf::TextFormat::ParseFromString(m_measure_statu_msg_1.m_message_buf, &m_measure_info_1))
  121. {
  122. m_dispatch_ground_lidar[0].execute_for_ground_status_msg_new(m_measure_info_1);
  123. }
  124. }
  125. else if ( p_msg->m_routing_key == "measure_2_statu_port" ||
  126. p_msg->m_routing_key == "measure_4_statu_port" ||
  127. p_msg->m_routing_key == "measure_6_statu_port" )
  128. {
  129. // if ( p_msg->m_routing_key == "measure_2_statu_port" )
  130. // {
  131. // std::cout << " huli test :::: " << " nnnnnnnnnnnnnnnnnnnnnhhhhhhhhhhhhhhhhhhhhhhhhhh = " << p_msg->m_message_buf << std::endl;
  132. // }
  133. m_measure_statu_msg_2 = *p_msg;
  134. if(google::protobuf::TextFormat::ParseFromString(m_measure_statu_msg_2.m_message_buf, &m_measure_info_2))
  135. {
  136. m_dispatch_ground_lidar[1].execute_for_ground_status_msg_new(m_measure_info_2);
  137. }
  138. }
  139. else if ( p_msg->m_routing_key == "in_mcpu_1_statu_port" ||
  140. p_msg->m_routing_key == "in_mcpu_3_statu_port" ||
  141. p_msg->m_routing_key == "in_mcpu_5_statu_port" )
  142. {
  143. // std::cout << " huli test :::: " << " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx = " << p_msg->m_message_buf << std::endl;
  144. // if ( p_msg->m_routing_key == "in_mcpu_3_statu_port" )
  145. // {
  146. // std::cout << " huli test :::: " << " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbffffffffffffffffff in_mcpu_3_statu_port= " << p_msg->m_message_buf << std::endl;
  147. //
  148. // }
  149. m_in_mcpu_statu_msg_1 = *p_msg;
  150. if(google::protobuf::TextFormat::ParseFromString(m_in_mcpu_statu_msg_1.m_message_buf, &m_in_mcpu_statu_1))
  151. {
  152. m_dispatch_singlechip[0].execute_for_singlechip_data_msg_new(m_in_mcpu_statu_1, true);
  153. }
  154. }
  155. else if ( p_msg->m_routing_key == "in_mcpu_2_statu_port" ||
  156. p_msg->m_routing_key == "in_mcpu_4_statu_port" ||
  157. p_msg->m_routing_key == "in_mcpu_6_statu_port" )
  158. {
  159. // std::cout << " huli test :::: " << " cccccccccccccccccccccccccccccccccccccccccccccccccc = " << p_msg->m_message_buf << std::endl;
  160. // if ( p_msg->m_routing_key == "in_mcpu_4_statu_port" )
  161. // {
  162. // std::cout << " huli test :::: " << " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbffffffffffffffffff in_mcpu_4_statu_port= " << p_msg->m_message_buf << std::endl;
  163. // }
  164. m_in_mcpu_statu_msg_2 = *p_msg;
  165. if(google::protobuf::TextFormat::ParseFromString(m_in_mcpu_statu_msg_2.m_message_buf, &m_in_mcpu_statu_2))
  166. {
  167. m_dispatch_singlechip[1].execute_for_singlechip_data_msg_new(m_in_mcpu_statu_2, true);
  168. }
  169. }
  170. else if ( p_msg->m_routing_key == "out_mcpu_1_statu_port" ||
  171. p_msg->m_routing_key == "out_mcpu_3_statu_port" ||
  172. p_msg->m_routing_key == "out_mcpu_5_statu_port" )
  173. {
  174. // if ( p_msg->m_routing_key == "out_mcpu_1_statu_port" )
  175. // {
  176. // std::cout << " huli test :::: " << " vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv out_mcpu_1_statu_port= " << p_msg->m_message_buf << std::endl;
  177. // }
  178. // std::cout << " huli test :::: " << " vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv = " << p_msg->m_message_buf << std::endl;
  179. m_out_mcpu_statu_msg_1 = *p_msg;
  180. if(google::protobuf::TextFormat::ParseFromString(m_out_mcpu_statu_msg_1.m_message_buf, &m_out_mcpu_statu_1))
  181. {
  182. m_dispatch_singlechip[2].execute_for_singlechip_data_msg_new(m_out_mcpu_statu_1, true);
  183. }
  184. }
  185. else if ( p_msg->m_routing_key == "out_mcpu_2_statu_port" ||
  186. p_msg->m_routing_key == "out_mcpu_4_statu_port" ||
  187. p_msg->m_routing_key == "out_mcpu_6_statu_port" )
  188. {
  189. // if ( p_msg->m_routing_key == "out_mcpu_2_statu_port" )
  190. // {
  191. // std::cout << " huli test :::: " << " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb out_mcpu_2_statu_port= " << p_msg->m_message_buf << std::endl;
  192. // }
  193. // std::cout << " huli test :::: " << " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = " << p_msg->m_message_buf << std::endl;
  194. m_out_mcpu_statu_msg_2 = *p_msg;
  195. if(google::protobuf::TextFormat::ParseFromString(m_out_mcpu_statu_msg_2.m_message_buf, &m_out_mcpu_statu_2))
  196. {
  197. m_dispatch_singlechip[3].execute_for_singlechip_data_msg_new(m_out_mcpu_statu_2, true);
  198. }
  199. }
  200. #endif //#ifdef CHUTIAN_PROJECT_PROJECT
  201. #ifdef SHANGGUJIE_PROJECT_PROJECT
  202. // LOG(INFO) << " zzzzzzzzzzzzzzzzzzzzzzzzzzz = "<< p_msg->m_message_buf << " --- " << this;
  203. if ( p_msg->m_routing_key.find("dispatch_park_command") != std::string::npos )
  204. {
  205. park_table t_park_table;
  206. if(google::protobuf::TextFormat::ParseFromString(p_msg->m_message_buf, &t_park_table))
  207. {
  208. //关闭入口外门
  209. int t_passway_id = m_dispatch_command.get_passway_id(t_park_table.terminal_id(), 1);
  210. m_dispatch_plc.control_ouside_door(t_passway_id, 2);
  211. //存入数据库
  212. //need
  213. LOG(INFO) << " t_park_table = "<< t_park_table.DebugString() << " --- " << this;
  214. if ( t_park_table.statu().execute_statu() == eNormal )
  215. {
  216. //删除图片,如果是base64,就删除,是网址就保留。
  217. if ( t_park_table.car_number_info().plate_full_image().size() > 200 )
  218. {
  219. t_park_table.mutable_car_number_info()->clear_plate_full_image();
  220. }
  221. if ( t_park_table.car_number_info().plate_clip_image().size() > 200 )
  222. {
  223. t_park_table.mutable_car_number_info()->clear_plate_clip_image();
  224. }
  225. Common_data::Car_type t_car_type;
  226. Dispatch_command::Dispatch_space_info t_dispatch_space_info;
  227. //查询空闲车位最优解, 存车指令 根据调度指令最优解 获取 空闲车位最优解
  228. m_dispatch_command.query_dispatch_space_optimal(t_park_table.unit_id(), t_park_table.entrance_measure_info().height(),
  229. t_park_table.entrance_measure_info().wheelbase(),
  230. t_car_type, t_dispatch_space_info);
  231. //存车指令入队, 检查节点直接通过rabbitmq发送给调度, 调度接受后数据库指令入队,
  232. m_dispatch_command.insert_park_command(t_park_table, t_dispatch_space_info);
  233. //更新 车位状态, 根据车位ID 写入车牌号即可
  234. m_dispatch_command.update_parkspace_write_car_number(t_park_table, t_dispatch_space_info);
  235. //增加 记录表, 存车指令 完成后添加存车记录
  236. m_dispatch_command.insert_record_for_park_start(t_park_table, t_dispatch_space_info);
  237. }
  238. //else
  239. }
  240. System_communication::get_instance_references().ack_msg(p_msg);
  241. }
  242. else if ( p_msg->m_routing_key.find("dispatch_pick_command") != std::string::npos )
  243. {
  244. pick_table t_pick_table;
  245. if(google::protobuf::TextFormat::ParseFromString(p_msg->m_message_buf, &t_pick_table))
  246. {
  247. //存入数据库
  248. //need
  249. LOG(INFO) << " t_pick_table = "<< t_pick_table.DebugString() << " --- " << this;
  250. if ( t_pick_table.statu().execute_statu() == eNormal )
  251. {
  252. //删除图片,如果是base64,就删除,是网址就保留。
  253. if ( t_pick_table.car_number_info().plate_full_image().size() > 200 )
  254. {
  255. t_pick_table.mutable_car_number_info()->clear_plate_full_image();
  256. }
  257. if ( t_pick_table.car_number_info().plate_clip_image().size() > 200 )
  258. {
  259. t_pick_table.mutable_car_number_info()->clear_plate_clip_image();
  260. }
  261. m_dispatch_command.insert_pick_command(t_pick_table);
  262. }
  263. //else
  264. }
  265. System_communication::get_instance_references().ack_msg(p_msg);
  266. }
  267. else if ( p_msg->m_routing_key == "measure_1101_statu_port" ||
  268. p_msg->m_routing_key == "measure_1202_statu_port" ||
  269. p_msg->m_routing_key == "measure_1304_statu_port" ||
  270. p_msg->m_routing_key == "measure_1406_statu_port" ||
  271. p_msg->m_routing_key == "measure_2108_statu_port" ||
  272. p_msg->m_routing_key == "measure_2210_statu_port" ||
  273. p_msg->m_routing_key == "measure_2312_statu_port" ||
  274. p_msg->m_routing_key == "measure_2414_statu_port" ||
  275. p_msg->m_routing_key == "measure_2516_statu_port" ||
  276. p_msg->m_routing_key == "measure_3117_statu_port" ||
  277. p_msg->m_routing_key == "measure_3119_statu_port" )
  278. {
  279. m_measure_statu_msg_1 = *p_msg;
  280. if(google::protobuf::TextFormat::ParseFromString(m_measure_statu_msg_1.m_message_buf, &m_measure_info_1))
  281. {
  282. m_dispatch_ground_lidar[0].execute_for_ground_status_msg_new(m_measure_info_1);
  283. }
  284. }
  285. else if ( p_msg->m_routing_key == "measure_1203_statu_port" ||
  286. p_msg->m_routing_key == "measure_1305_statu_port" ||
  287. p_msg->m_routing_key == "measure_1407_statu_port" ||
  288. p_msg->m_routing_key == "measure_2109_statu_port" ||
  289. p_msg->m_routing_key == "measure_2211_statu_port" ||
  290. p_msg->m_routing_key == "measure_2313_statu_port" ||
  291. p_msg->m_routing_key == "measure_2415_statu_port" ||
  292. p_msg->m_routing_key == "measure_3118_statu_port" )
  293. {
  294. m_measure_statu_msg_2 = *p_msg;
  295. if(google::protobuf::TextFormat::ParseFromString(m_measure_statu_msg_2.m_message_buf, &m_measure_info_2))
  296. {
  297. m_dispatch_ground_lidar[1].execute_for_ground_status_msg_new(m_measure_info_2);
  298. }
  299. }
  300. #endif//SHANGGUJIE_PROJECT_PROJECT
  301. else
  302. {
  303. LOG(INFO) << "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx error Rabbitmq_message = "<< p_msg->m_message_buf << " --- " << this;
  304. // park_table t_park_table;
  305. // if(google::protobuf::TextFormat::ParseFromString(p_msg->m_message_buf, &t_park_table))
  306. // {
  307. // std::string t_str = t_park_table.DebugString();
  308. // std::cout << " huli test :::: " << " t_str = " << t_str << std::endl;
  309. //
  310. // std::string t_str1 = t_park_table.statu().statu_description();
  311. // std::cout << " huli test :::: " << " t_str1 = " << t_str1 << std::endl;
  312. //
  313. // std::string t_str2 = t_park_table.car_number();
  314. // std::cout << " huli test :::: " << " t_str2 = " << t_str2 << std::endl;
  315. //
  316. // }
  317. }
  318. return Error_code::SUCCESS;
  319. }
  320. //给dispatch_plc底层提供接口, ack答复服务器,
  321. Error_manager Dispatch_manager::ack_rabbitmq_message_new()
  322. {
  323. if ( m_count_flag )
  324. {
  325. m_count_flag = false;
  326. System_communication::get_instance_references().ack_msg(&m_count_command_signal_msg);
  327. }
  328. if ( m_post_flag )
  329. {
  330. m_post_flag = false;
  331. System_communication::get_instance_references().ack_msg(&m_post_command_msg);
  332. }
  333. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  334. return Error_code::SUCCESS;
  335. }
  336. //网络通信的对外接口. 对单片机通信
  337. Error_manager Dispatch_manager::execute_network_message_new(Network_message* p_msg)
  338. {
  339. std::unique_lock<std::mutex> t_lock(m_lock);
  340. #ifdef CHUTIAN_PROJECT_PROJECT
  341. //根据自定义的socket_id, 分发给4个单片机模块.
  342. if ( 0 <= p_msg->m_socket_id && p_msg->m_socket_id < 4 )
  343. {
  344. return m_dispatch_singlechip[p_msg->m_socket_id].execute_for_singlechip_data_msg_new(p_msg->m_message_buf);
  345. }
  346. #endif//CHUTIAN_PROJECT_PROJECT
  347. return Error_code::SUCCESS;
  348. }
  349. //对外的接口函数,负责接受并处理任务单,
  350. //Error_manager Dispatch_manager::execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction)
  351. //{
  352. // return Error_code::SUCCESS;
  353. //// std::this_thread::sleep_for(std::chrono::seconds(rand()%3+3));
  354. //
  355. // if ( dispatch_motion_direction == E_PICKUP_CAR )
  356. // {
  357. // return Error_code::SUCCESS;
  358. // }
  359. //
  360. //// return Error_code::SUCCESS;
  361. //
  362. //// srand(0);
  363. // unsigned int t_probability = rand();
  364. //
  365. // if ( t_probability%100 >=20 )
  366. // {
  367. // return Error_code::SUCCESS;
  368. // }
  369. // else
  370. // {
  371. // return Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
  372. // " Dispatch_manager::execute_task() error ");
  373. // }
  374. //}
  375. //检查能否执行消息指令
  376. Error_manager Dispatch_manager::check_execute_msg(Rabbitmq_message* p_msg)
  377. {
  378. return Error_code::SUCCESS;
  379. /*
  380. Error_manager t_error = Dispatch_manager::get_instance_references().check_status();
  381. if ( t_error == Error_code::SUCCESS )
  382. {
  383. return Error_code::SUCCESS;
  384. }
  385. else if (t_error.get_error_level() == NEGLIGIBLE_ERROR)//一级故障,轻微故障,
  386. {
  387. std::cout << "Dispatch_manager _is_busy , " << std::endl;
  388. //返回繁忙之后, 通信模块1秒后再次调用check
  389. return Error_code::COMMUNICATION_EXCUTER_IS_BUSY;
  390. }
  391. switch ( p_msg->get_message_type() )
  392. {
  393. case Communication_message::Message_type::eDispatch_request_msg:
  394. {
  395. return Error_code::SUCCESS;
  396. break;
  397. }
  398. case Communication_message::Message_type::eDispatch_plan_response_msg:
  399. {
  400. return Error_code::SUCCESS;
  401. break;
  402. }
  403. case Communication_message::Message_type::eDispatch_control_request_msg:
  404. {
  405. return Error_code::SUCCESS;
  406. break;
  407. }
  408. default :
  409. {
  410. //无效的消息,
  411. return Error_manager(Error_code::INVALID_MESSAGE, Error_level::NEGLIGIBLE_ERROR,
  412. " INVALID_MESSAGE error ");
  413. break;
  414. }
  415. }
  416. */
  417. return Error_code::SUCCESS;
  418. }
  419. //检查状态
  420. Error_manager Dispatch_manager::check_status()
  421. {
  422. if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
  423. {
  424. return Error_code::SUCCESS;
  425. }
  426. else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_STORE || m_dispatch_manager_status == E_DISPATCH_MANAGER_PICKUP )
  427. {
  428. return Error_code::SUCCESS;
  429. //无论存取, 状态都是返回正常,运行接受下一个任务
  430. // return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
  431. // " Dispatch_manager::check_status() error ");
  432. }
  433. else
  434. {
  435. return Error_manager(Error_code::DISPATCH_MANAGER_STATUS_ERROR, Error_level::MINOR_ERROR,
  436. " Dispatch_manager::check_status() error ");
  437. }
  438. return Error_code::SUCCESS;
  439. }
  440. //调度模块 //执行搬运请求(主控->调度管理)
  441. //Error_manager Dispatch_manager::execute_for_dispatch_request_msg(message::Dispatch_request_msg& dispatch_request_msg)
  442. //{
  443. // LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_request_msg--- "<< dispatch_request_msg.DebugString() << " "<< this;
  444. // LOG(INFO) << " dispatch_request_msg->m_command_key = "<<dispatch_request_msg.command_key()<< " "<< this;
  445. //
  446. // Error_manager t_error;
  447. //
  448. // std::unique_lock<std::mutex> t_lock(m_lock);
  449. // if ( dispatch_request_msg.dispatch_motion_direction() == message::Dispatch_motion_direction::E_STORE_CAR )
  450. // {
  451. // m_dispatch_request_store_list.push_back(dispatch_request_msg);
  452. // m_store_updata_time = std::chrono::system_clock::now();
  453. // }
  454. // else
  455. // {
  456. // m_dispatch_request_pickup_list.push_back(dispatch_request_msg);
  457. // m_pickup_updata_time = std::chrono::system_clock::now();
  458. // }
  459. //
  460. //
  461. //
  462. // //need, 目前直接转发给调度plc执行, 后续要存队列,然后增加调度逻辑.
  463. //
  464. //// m_dispatch_plc.execute_for_dispatch_request_msg(dispatch_request_msg);
  465. //
  466. //
  467. //
  468. // return Error_code::SUCCESS;
  469. //}
  470. ////调度模块 答复数据异常
  471. //Error_manager Dispatch_manager::send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error)
  472. //{
  473. // message::Dispatch_response_msg t_dispatch_response_msg;
  474. // t_dispatch_response_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_response_msg);
  475. // t_dispatch_response_msg.mutable_base_info()->set_timeout_ms(dispatch_request_msg.base_info().timeout_ms());
  476. // t_dispatch_response_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  477. // t_dispatch_response_msg.mutable_base_info()->set_receiver(message::Communicator::eMain);
  478. // t_dispatch_response_msg.set_command_key(dispatch_request_msg.command_key());
  479. //
  480. // t_dispatch_response_msg.mutable_error_manager()->set_error_code(error.get_error_code());
  481. // t_dispatch_response_msg.mutable_error_manager()->set_error_level((message::Error_level)error.get_error_level());
  482. // t_dispatch_response_msg.mutable_error_manager()->set_error_description(error.get_error_description());
  483. //
  484. //// System_communication::get_instance_references().encapsulate_msg(t_dispatch_response_msg.SerializeAsString());
  485. // System_communication::get_instance_references().encapsulate_task_msg(t_dispatch_response_msg.SerializeAsString());
  486. // return Error_code::SUCCESS;
  487. //}
  488. //
  489. ////调度模块 //调度总规划的答复(调度算法->调度管理)
  490. //Error_manager Dispatch_manager::execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg)
  491. //{
  492. // LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_plan_response_msg--- "<< this;
  493. // LOG(INFO) << " dispatch_plan_response_msg->m_command_key = "<<dispatch_plan_response_msg.command_key()<< " "<< this;
  494. //
  495. // Error_manager t_error;
  496. //
  497. // return Error_code::SUCCESS;
  498. //}
  499. ////调度模块 //调度控制的任务请求(调度算法->调度管理)
  500. //Error_manager Dispatch_manager::execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg)
  501. //{
  502. // LOG(INFO) << " ---Dispatch_manager::execute_for_dispatch_control_request_msg--- "<< this;
  503. // LOG(INFO) << " dispatch_control_request_msg->m_command_key = "<<dispatch_control_request_msg.command_key()<< " "<< this;
  504. //
  505. // Error_manager t_error;
  506. //
  507. // return Error_code::SUCCESS;
  508. //}
  509. //定时发送 调度管理的状态
  510. Error_manager Dispatch_manager::encapsulate_send_dispatch_manager_status()
  511. {
  512. // Error_manager t_error;
  513. //
  514. // int t_dispatch_manager_id = get_dispatch_manager_id();
  515. //
  516. // std::string t_msg1;
  517. // //创建一条 调度管理总管理的状态 旧版
  518. // message::Dispatch_terminal_status_msg t_dispatch_terminal_status_msg;
  519. // t_dispatch_terminal_status_msg.mutable_base_info()->set_msg_type(message::Message_type::eDispatch_status_msg);
  520. // t_dispatch_terminal_status_msg.mutable_base_info()->set_timeout_ms(5000);
  521. // t_dispatch_terminal_status_msg.mutable_base_info()->set_sender(message::Communicator::eDispatch_manager);
  522. // t_dispatch_terminal_status_msg.mutable_base_info()->set_receiver(message::Communicator::eEmpty);
  523. //
  524. // t_dispatch_terminal_status_msg.mutable_id_struct()->set_unit_id(t_dispatch_manager_id);
  525. // t_dispatch_terminal_status_msg.set_terminal_status(message::Terminal_status(m_dispatch_manager_status));
  526. // t_dispatch_terminal_status_msg.set_passageway_direction(message::Passageway_direction::E_BILATERAL);
  527. //
  528. //
  529. // //E_DISPATCH_POCESS_OVER
  530. // {
  531. // std::unique_lock<std::mutex> t_lock(m_lock);
  532. // for (auto iter = m_dispatch_response_store_map.begin(); iter != m_dispatch_response_store_map.end(); ++iter)
  533. // {
  534. // message::Dispatch_process_information * tp_dispatch_process_information =
  535. // t_dispatch_terminal_status_msg.mutable_dispatch_store_process_information_vector()->Add();
  536. // tp_dispatch_process_information->set_car_numberplate(iter->second.parkspace_info_ex(0).car_info().car_numberplate());
  537. // tp_dispatch_process_information->set_command_key(iter->second.command_key());
  538. // tp_dispatch_process_information->set_dispatch_motion_direction(iter->second.dispatch_motion_direction());
  539. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(iter->second.id_struct());
  540. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(iter->second.locate_information());
  541. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(iter->second.parkspace_info_ex());
  542. // tp_dispatch_process_information->set_car_type(iter->second.car_type());
  543. //
  544. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_OVER);
  545. // }
  546. // for (auto iter = m_dispatch_response_pickup_map.begin(); iter != m_dispatch_response_pickup_map.end(); ++iter)
  547. // {
  548. // message::Dispatch_process_information * tp_dispatch_process_information =
  549. // t_dispatch_terminal_status_msg.mutable_dispatch_pickup_process_information_vector()->Add();
  550. // tp_dispatch_process_information->set_car_numberplate(iter->second.parkspace_info_ex(0).car_info().car_numberplate());
  551. // tp_dispatch_process_information->set_command_key(iter->second.command_key());
  552. // tp_dispatch_process_information->set_dispatch_motion_direction(iter->second.dispatch_motion_direction());
  553. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(iter->second.id_struct());
  554. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(iter->second.locate_information());
  555. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(iter->second.parkspace_info_ex());
  556. // tp_dispatch_process_information->set_car_type(iter->second.car_type());
  557. //
  558. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_OVER);
  559. // }
  560. // }
  561. //
  562. //
  563. // //E_DISPATCH_POCESS_WORKING
  564. // {
  565. // if ( m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_REQUEST ||
  566. // m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_WORKING||
  567. // m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_BUSY)
  568. // {
  569. // message::Dispatch_request_msg t_dispatch_request_msg = m_dispatch_plc.get_dispatch_request_msg();
  570. // if ( t_dispatch_request_msg.dispatch_motion_direction() == message::Dispatch_motion_direction::E_STORE_CAR )
  571. // {
  572. // message::Dispatch_process_information * tp_dispatch_process_information =
  573. // t_dispatch_terminal_status_msg.mutable_dispatch_store_process_information_vector()->Add();
  574. // tp_dispatch_process_information->set_car_numberplate(t_dispatch_request_msg.parkspace_info_ex(0).car_info().car_numberplate());
  575. // tp_dispatch_process_information->set_command_key(t_dispatch_request_msg.command_key());
  576. // tp_dispatch_process_information->set_dispatch_motion_direction(t_dispatch_request_msg.dispatch_motion_direction());
  577. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(t_dispatch_request_msg.id_struct());
  578. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(t_dispatch_request_msg.locate_information());
  579. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(t_dispatch_request_msg.parkspace_info_ex());
  580. // tp_dispatch_process_information->set_car_type(t_dispatch_request_msg.car_type());
  581. //
  582. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_WORKING);
  583. // tp_dispatch_process_information->set_working_total_time(m_dispatch_plc.get_response_working_total_time());
  584. // tp_dispatch_process_information->set_working_remaining_time(m_dispatch_plc.get_response_working_remaining_time());
  585. // }
  586. // else
  587. // {
  588. // message::Dispatch_process_information * tp_dispatch_process_information =
  589. // t_dispatch_terminal_status_msg.mutable_dispatch_pickup_process_information_vector()->Add();
  590. // tp_dispatch_process_information->set_car_numberplate(t_dispatch_request_msg.parkspace_info_ex(0).car_info().car_numberplate());
  591. // tp_dispatch_process_information->set_command_key(t_dispatch_request_msg.command_key());
  592. // tp_dispatch_process_information->set_dispatch_motion_direction(t_dispatch_request_msg.dispatch_motion_direction());
  593. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(t_dispatch_request_msg.id_struct());
  594. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(t_dispatch_request_msg.locate_information());
  595. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(t_dispatch_request_msg.parkspace_info_ex());
  596. // tp_dispatch_process_information->set_car_type(t_dispatch_request_msg.car_type());
  597. //
  598. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_WORKING);
  599. // tp_dispatch_process_information->set_working_total_time(m_dispatch_plc.get_response_working_total_time());
  600. // tp_dispatch_process_information->set_working_remaining_time(m_dispatch_plc.get_response_working_remaining_time());
  601. // }
  602. // }
  603. // }
  604. //
  605. // //E_DISPATCH_POCESS_WAIT
  606. // {
  607. // std::unique_lock<std::mutex> t_lock(m_lock);
  608. // int t_store_wait_number = 1;
  609. // for (auto iter = m_dispatch_request_store_list.begin(); iter != m_dispatch_request_store_list.end(); ++iter)
  610. // {
  611. // message::Dispatch_process_information * tp_dispatch_process_information =
  612. // t_dispatch_terminal_status_msg.mutable_dispatch_store_process_information_vector()->Add();
  613. // tp_dispatch_process_information->set_car_numberplate(iter->parkspace_info_ex(0).car_info().car_numberplate());
  614. // tp_dispatch_process_information->set_command_key(iter->command_key());
  615. // tp_dispatch_process_information->set_dispatch_motion_direction(iter->dispatch_motion_direction());
  616. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(iter->id_struct());
  617. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(iter->locate_information());
  618. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(iter->parkspace_info_ex());
  619. // tp_dispatch_process_information->set_car_type(iter->car_type());
  620. //
  621. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_WAIT);
  622. // tp_dispatch_process_information->set_wait_number(t_store_wait_number);
  623. // t_store_wait_number++;
  624. // }
  625. // int t_pickup_wait_number = 1;
  626. // for (auto iter = m_dispatch_request_pickup_list.begin(); iter != m_dispatch_request_pickup_list.end(); ++iter)
  627. // {
  628. // message::Dispatch_process_information * tp_dispatch_process_information =
  629. // t_dispatch_terminal_status_msg.mutable_dispatch_pickup_process_information_vector()->Add();
  630. // tp_dispatch_process_information->set_car_numberplate(iter->parkspace_info_ex(0).car_info().car_numberplate());
  631. // tp_dispatch_process_information->set_command_key(iter->command_key());
  632. // tp_dispatch_process_information->set_dispatch_motion_direction(iter->dispatch_motion_direction());
  633. // tp_dispatch_process_information->mutable_id_struct()->CopyFrom(iter->id_struct());
  634. // tp_dispatch_process_information->mutable_locate_information()->CopyFrom(iter->locate_information());
  635. // tp_dispatch_process_information->mutable_parkspace_info_ex()->CopyFrom(iter->parkspace_info_ex());
  636. // tp_dispatch_process_information->set_car_type(iter->car_type());
  637. //
  638. // tp_dispatch_process_information->set_dispatch_process_status(message::Dispatch_process_status::E_DISPATCH_POCESS_WAIT);
  639. // tp_dispatch_process_information->set_wait_number(t_pickup_wait_number);
  640. // t_pickup_wait_number++;
  641. // }
  642. // }
  643. //
  644. // std::string t_store_updata_time = Time_tool::get_instance_references().get_time_string_millisecond(m_store_updata_time);
  645. // std::string t_pickup_updata_time = Time_tool::get_instance_references().get_time_string_millisecond(m_pickup_updata_time);
  646. //
  647. // t_dispatch_terminal_status_msg.set_dispatch_store_process_information_updata_time(t_store_updata_time);
  648. // t_dispatch_terminal_status_msg.set_dispatch_pickup_process_information_updata_time(t_pickup_updata_time);
  649. //
  650. //
  651. // t_msg1 = t_dispatch_terminal_status_msg.SerializeAsString();
  652. // System_communication::get_instance_references().encapsulate_status_msg(t_msg1);
  653. //
  654. return Error_code::SUCCESS;
  655. }
  656. //定时发送 调度管理的状态
  657. Error_manager Dispatch_manager::encapsulate_send_dispatch_manager_status_new()
  658. {
  659. std::unique_lock<std::mutex> t_lock(m_lock);
  660. dispatch_node_statu t_dispatch_node_statu_msg;
  661. if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_READY )
  662. {
  663. t_dispatch_node_statu_msg.set_statu(eIdle);
  664. // t_dispatch_node_statu_msg.set_statu(eBusy);
  665. }
  666. else if ( m_dispatch_manager_status == E_DISPATCH_MANAGER_UNKNOW ||
  667. m_dispatch_manager_status == E_DISPATCH_MANAGER_DISCONNECT ||
  668. m_dispatch_manager_status == E_DISPATCH_MANAGER_FAULT )
  669. {
  670. t_dispatch_node_statu_msg.set_statu(eFault);
  671. }
  672. else
  673. {
  674. t_dispatch_node_statu_msg.set_statu(eBusy);
  675. }
  676. t_dispatch_node_statu_msg.set_idle_stop_floor(m_device_floor);
  677. if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE ||
  678. m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_REALLOCATE)
  679. {
  680. t_dispatch_node_statu_msg.mutable_running_pack_info()->CopyFrom(m_park_table_msg);
  681. }
  682. else if ( m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP ||
  683. m_dispatch_process_type == Common_data::Dispatch_process_type::DISPATCH_PROCESS_REVOCATION )
  684. {
  685. t_dispatch_node_statu_msg.mutable_running_pick_info()->CopyFrom(m_pick_table_msg);
  686. }
  687. else
  688. {
  689. }
  690. t_dispatch_node_statu_msg.set_unit_id(m_dispatch_manager_id);
  691. t_dispatch_node_statu_msg.set_plc_heartbeat(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_heartbeat);
  692. t_dispatch_node_statu_msg.set_plc_mode_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_mode_status);
  693. t_dispatch_node_statu_msg.set_plc_passway_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status);
  694. t_dispatch_node_statu_msg.set_plc_carrier_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_carrier_status);
  695. t_dispatch_node_statu_msg.set_plc_inlet_1_status((m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0x03)>>0);
  696. t_dispatch_node_statu_msg.set_plc_inlet_2_status((m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0x0C)>>2);
  697. t_dispatch_node_statu_msg.set_plc_outlet_3_status((m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0x30)>>4);
  698. t_dispatch_node_statu_msg.set_plc_outlet_4_status((m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0xC0)>>6);
  699. for (int i = 0; i < 4; ++i)
  700. {
  701. dispatch_plc_passway_status * p_dispatch_plc_passway_status = t_dispatch_node_statu_msg.mutable_dispatch_plc_passway_status_vector()->Add();
  702. p_dispatch_plc_passway_status->set_car_height(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_car_height);
  703. p_dispatch_plc_passway_status->set_outside_door_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_outside_door_status);
  704. p_dispatch_plc_passway_status->set_inside_door_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_inside_door_status);
  705. p_dispatch_plc_passway_status->set_comb_body_status(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_comb_body_status);
  706. p_dispatch_plc_passway_status->set_sensor_1(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_sensor_1);
  707. p_dispatch_plc_passway_status->set_sensor_2(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_sensor_2);
  708. p_dispatch_plc_passway_status->set_turnplate_angle_min(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_turnplate_angle_min);
  709. p_dispatch_plc_passway_status->set_turnplate_angle_max(m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_passway_vector[i].m_turnplate_angle_max);
  710. p_dispatch_plc_passway_status->set_plc_passway_enable((m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & (0x03<<(i*2)) )>>(i*2));
  711. // p_dispatch_plc_passway_status->set_plc_passway_enable(1 );
  712. }
  713. std::string t_msg = t_dispatch_node_statu_msg.DebugString();
  714. // std::cout << " huli test :::: " << " +++++++++++++++++++++++++++++++++++++++++++ = " << 11233 << std::endl;
  715. // std::cout << " huli test t_dispatch_node_statu_msg:::: " << " t_msg.size() = " << t_msg.size() << std::endl;
  716. // std::cout << " huli test t_dispatch_node_statu_msg:::: " << " t_msg = " << t_msg << std::endl;
  717. // std::cout << " huli test :::: " << " ----------------------------------------- = " << 44556 << std::endl;
  718. // std::cout << " huli test :::: " << " *********************************************************************************** t_dispatch_node_statu_msg.plc_heartbeat() = " << t_dispatch_node_statu_msg.plc_heartbeat() << std::endl;
  719. System_communication::get_instance_references().encapsulate_status_msg(t_msg);
  720. return Error_code::SUCCESS;
  721. }
  722. //在流程的map 里面释放指定的流程
  723. Error_manager Dispatch_manager::release_dispatch_process(std::string command_key)
  724. {
  725. std::unique_lock<std::mutex> t_lock(m_lock);
  726. return Error_code::SUCCESS;
  727. }
  728. //调度模块 ///地面雷达的状态消息(地面雷达->null)
  729. //Error_manager Dispatch_manager::execute_for_ground_status_msg(message::Ground_status_msg ground_status_msg)
  730. //{
  731. // int t_inlet_id = ground_status_msg.mutable_id_struct()->terminal_id() %2;
  732. // return m_dispatch_ground_lidar[t_inlet_id].execute_for_ground_status_msg(ground_status_msg);
  733. //
  734. // return Error_code::SUCCESS;
  735. //}
  736. //调度模块 ///单片机的状态消息
  737. //Error_manager Dispatch_manager::execute_for_singlechip_data_msg(message::Singlechip_data singlechip_data_msg, bool validity)
  738. //{
  739. // if ( singlechip_data_msg.has_terminalid() && singlechip_data_msg.has_dispatchdirection() )
  740. // {
  741. // if ( singlechip_data_msg.terminalid() >=0 &&
  742. // singlechip_data_msg.terminalid() <=5 &&
  743. // singlechip_data_msg.dispatchdirection() >=1 &&
  744. // singlechip_data_msg.dispatchdirection() <=2 )
  745. // {
  746. // int t_temp = (singlechip_data_msg.terminalid() %2) + (singlechip_data_msg.dispatchdirection()-1)*2;
  747. // return m_dispatch_singlechip[t_temp].execute_for_singlechip_data_msg(singlechip_data_msg, validity);
  748. // }
  749. // }
  750. //
  751. // return Error_code::SUCCESS;
  752. //}
  753. //获取空闲的出口,返回0表示没有空闲出口, 返回1~6表示对应的出口
  754. int Dispatch_manager::get_outlet_for_ready()
  755. {
  756. // std::cout << " huli test 111:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  757. #ifdef CHUTIAN_PROJECT_PROJECT
  758. //A单元优先分配A2, B和C正常分配
  759. if ( m_dispatch_manager_id == 0 )
  760. {
  761. //检查出口, 并删除取车完成 //判断2个出口是否空闲
  762. if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[3].is_outlet_ready() )
  763. {
  764. std::cout << " huli test 444:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  765. if ( m_dispatch_command.check_export_id_is_ready(m_dispatch_manager_id*2+2) == Error_code::SUCCESS )
  766. {
  767. std::cout << " huli test 555:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  768. return m_dispatch_manager_id*2+2;
  769. }
  770. }
  771. else if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[2].is_outlet_ready() )
  772. {
  773. std::cout << " huli test 222:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  774. if ( m_dispatch_command.check_export_id_is_ready(m_dispatch_manager_id*2+1) == Error_code::SUCCESS )
  775. {
  776. std::cout << " huli test 333:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  777. return m_dispatch_manager_id*2+1;
  778. }
  779. }
  780. else
  781. {
  782. return 0;
  783. }
  784. }
  785. else
  786. {
  787. //检查出口, 并删除取车完成 //判断2个出口是否空闲
  788. if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[2].is_outlet_ready() )
  789. {
  790. std::cout << " huli test 222:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  791. if ( m_dispatch_command.check_export_id_is_ready(m_dispatch_manager_id*2+1) == Error_code::SUCCESS )
  792. {
  793. std::cout << " huli test 333:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  794. return m_dispatch_manager_id*2+1;
  795. }
  796. }
  797. else if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[3].is_outlet_ready() )
  798. {
  799. std::cout << " huli test 444:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  800. if ( m_dispatch_command.check_export_id_is_ready(m_dispatch_manager_id*2+2) == Error_code::SUCCESS )
  801. {
  802. std::cout << " huli test 555:::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  803. return m_dispatch_manager_id*2+2;
  804. }
  805. }
  806. else
  807. {
  808. return 0;
  809. }
  810. }
  811. #endif //CHUTIAN_PROJECT_PROJECT
  812. #ifdef SHANGGUJIE_PROJECT_PROJECT
  813. if ( (m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0x30) == 0x10 )
  814. {
  815. return 3;
  816. }
  817. else if ( (m_dispatch_plc.m_dispatch_plc_status_from_plc_to_manager.m_plc_passway_status & 0xC0) == 0x40 )
  818. {
  819. return 4;
  820. }
  821. else
  822. {
  823. return 0;
  824. }
  825. #endif//SHANGGUJIE_PROJECT_PROJECT
  826. return 0;
  827. }
  828. Dispatch_manager::Dispatch_manager_status Dispatch_manager::get_dispatch_manager_status()
  829. {
  830. return m_dispatch_manager_status;
  831. }
  832. int Dispatch_manager::get_dispatch_manager_id()
  833. {
  834. return m_dispatch_manager_id;
  835. }
  836. void Dispatch_manager::set_dispatch_manager_id(int dispatch_manager_id)
  837. {
  838. m_dispatch_manager_id = dispatch_manager_id;
  839. }
  840. //资源分配
  841. //void Dispatch_manager::resource_allocation()
  842. //{
  843. // return;
  844. //
  845. // LOG(INFO) << " Dispatch_manager::resource_allocation() start " << this;
  846. // Error_manager t_error;
  847. //
  848. //
  849. // while (m_dispatch_manager_condition.is_alive())
  850. // {
  851. // m_dispatch_manager_condition.wait();
  852. // if ( m_dispatch_manager_condition.is_alive() )
  853. // {
  854. // std::this_thread::sleep_for(std::chrono::microseconds(1));
  855. // std::this_thread::sleep_for(std::chrono::milliseconds(100));
  856. //// std::this_thread::sleep_for(std::chrono::seconds(1));
  857. // std::this_thread::yield();
  858. // std::unique_lock<std::mutex> t_lock(m_lock);
  859. //
  860. // //排序和资源分配
  861. // if ( m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_READY )
  862. // {
  863. // //补全 id_struct
  864. // if ( m_dispatch_motion_direction_next == Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_PICKUP)
  865. // {
  866. // //判断2个出口是否空闲, 在资源分配时,提前分配好出口终端号
  867. // if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[2].is_outlet_ready() )
  868. // {
  869. // auto iter = m_dispatch_request_pickup_list.begin();
  870. // if ( iter != m_dispatch_request_pickup_list.end() )
  871. // {
  872. // iter->mutable_id_struct()->set_terminal_id(m_dispatch_manager_id*2);
  873. // m_dispatch_plc.execute_for_dispatch_request_msg(*iter);
  874. // m_dispatch_manager_status = E_DISPATCH_MANAGER_PICKUP;
  875. // m_dispatch_request_pickup_list.erase(iter);
  876. // m_pickup_updata_time = std::chrono::system_clock::now();
  877. // }
  878. // }
  879. // else if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[3].is_outlet_ready() )
  880. // {
  881. // auto iter = m_dispatch_request_pickup_list.begin();
  882. // if ( iter != m_dispatch_request_pickup_list.end() )
  883. // {
  884. // iter->mutable_id_struct()->set_terminal_id(m_dispatch_manager_id*2+1);
  885. // m_dispatch_plc.execute_for_dispatch_request_msg(*iter);
  886. // m_dispatch_manager_status = E_DISPATCH_MANAGER_PICKUP;
  887. // m_dispatch_request_pickup_list.erase(iter);
  888. // m_pickup_updata_time = std::chrono::system_clock::now();
  889. // }
  890. // }
  891. // //else什么也不做,直接切换到存车就行
  892. //
  893. // m_dispatch_motion_direction_next = Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_STORE;
  894. // }
  895. // else if ( m_dispatch_motion_direction_next == Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_STORE )
  896. // {
  897. // auto iter = m_dispatch_request_store_list.begin();
  898. // if ( iter != m_dispatch_request_store_list.end() )
  899. // {
  900. // iter->mutable_id_struct()->set_unit_id(m_dispatch_manager_id );
  901. // m_dispatch_plc.execute_for_dispatch_request_msg(*iter);
  902. // m_dispatch_manager_status = E_DISPATCH_MANAGER_STORE;
  903. // m_dispatch_request_store_list.erase(iter);
  904. // m_store_updata_time = std::chrono::system_clock::now();
  905. // }
  906. // m_dispatch_motion_direction_next = Common_data::Dispatch_motion_direction::DISPATCH_MOTION_DIRECTION_PICKUP;
  907. // }
  908. // else
  909. // {
  910. // ///////
  911. // }
  912. // }
  913. // else if(m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_READY)
  914. // {
  915. // m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  916. // }
  917. // else if(m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_BUSY)
  918. // {
  919. // m_dispatch_manager_status = E_DISPATCH_MANAGER_BUSY;
  920. // }
  921. // else if(m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::Dispatch_plc_status::DISPATCH_PLC_DISCONNECT)
  922. // {
  923. // m_dispatch_manager_status = E_DISPATCH_MANAGER_DISCONNECT;
  924. // }
  925. // else
  926. // {
  927. // m_dispatch_manager_status = E_DISPATCH_MANAGER_FAULT;
  928. // }
  929. //
  930. //
  931. // //检查时间, 并删除存车完成
  932. // for (auto iter = m_dispatch_response_store_map.begin(); iter != m_dispatch_response_store_map.end();)
  933. // {
  934. // if ( std::chrono::system_clock::now() - iter->first > std::chrono::seconds(10) )
  935. // {
  936. // iter = m_dispatch_response_store_map.erase(iter);
  937. // m_store_updata_time = std::chrono::system_clock::now();
  938. // }
  939. // else
  940. // {
  941. // ++iter;
  942. // }
  943. // }
  944. //
  945. // //检查出口, 并删除取车完成 //判断2个出口是否空闲
  946. // if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[2].is_outlet_ready() )
  947. // {
  948. // if ( m_dispatch_response_pickup_map.find(m_dispatch_manager_id*2) != m_dispatch_response_pickup_map.end() )
  949. // {
  950. // m_dispatch_response_pickup_map.erase(m_dispatch_manager_id*2);
  951. // m_pickup_updata_time = std::chrono::system_clock::now();
  952. // }
  953. // }
  954. // else if ( Dispatch_manager::get_instance_references().m_dispatch_singlechip[3].is_outlet_ready() )
  955. // {
  956. // if ( m_dispatch_response_pickup_map.find(m_dispatch_manager_id*2+1) != m_dispatch_response_pickup_map.end() )
  957. // {
  958. // m_dispatch_response_pickup_map.erase(m_dispatch_manager_id*2+1);
  959. // m_pickup_updata_time = std::chrono::system_clock::now();
  960. // }
  961. // }
  962. //
  963. // }
  964. // }
  965. //
  966. // LOG(INFO) << " Dispatch_manager::resource_allocation() end "<< this;
  967. //
  968. // return;
  969. //}
  970. //
  971. ////新版流程控制
  972. //void Dispatch_manager::process_control()
  973. //{
  974. // LOG(INFO) << " Dispatch_manager::process_control() start " << this;
  975. // Error_manager t_error;
  976. //
  977. // while (m_dispatch_manager_condition.is_alive())
  978. // {
  979. // m_dispatch_manager_condition.wait();
  980. // if (m_dispatch_manager_condition.is_alive())
  981. // {
  982. // std::this_thread::sleep_for(std::chrono::microseconds(1));
  983. // std::this_thread::sleep_for(std::chrono::milliseconds(1));
  984. //// std::this_thread::sleep_for(std::chrono::seconds(1));
  985. // std::this_thread::yield();
  986. // std::unique_lock<std::mutex> t_lock(m_lock);
  987. //
  988. // static int t_count = 0;
  989. // if (t_count % 1000 == 0 )
  990. // {
  991. // std::cout << " huli test :::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  992. // std::cout << " huli test :::: " << " m_dispatch_manager_status = " << m_dispatch_manager_status << std::endl;
  993. // }
  994. // t_count++;
  995. //
  996. // switch ( m_dispatch_manager_status )
  997. // {
  998. // case E_DISPATCH_MANAGER_READY:
  999. // {
  1000. // //等待 count_command_signal_1_port 的消息
  1001. // if ( m_count_flag )
  1002. // {
  1003. // m_dispatch_manager_status = E_DISPATCH_MANAGER_COUNT_NEW;
  1004. // }
  1005. // if ( m_post_flag )
  1006. // {
  1007. // m_dispatch_manager_status = E_DISPATCH_MANAGER_POST_NEW;
  1008. // }
  1009. // break;
  1010. // }
  1011. // case E_DISPATCH_MANAGER_COUNT_NEW:
  1012. // {
  1013. // //目前不用解析 m_count_command_signal_msg ,只要收到 count_command_signal_1_port, 直接进行下一步
  1014. // //发送调度任务申请
  1015. // char t_buf[256] = {0};
  1016. // sprintf(t_buf, "%d-%d", m_dispatch_manager_id+1, m_device_floor);
  1017. // std::string t_string(t_buf);
  1018. // System_communication::get_instance_references().encapsulate_task_msg(t_string, 0);
  1019. // std::cout << " huli test :::: " << " m_request_command_msg = " << t_string << std::endl;
  1020. // m_dispatch_manager_status = E_DISPATCH_MANAGER_REQUEST_NEW;
  1021. // break;
  1022. // }
  1023. // case E_DISPATCH_MANAGER_REQUEST_NEW:
  1024. // {
  1025. // //等待 post_command_1_port 的消息
  1026. // if ( m_post_flag )
  1027. // {
  1028. // m_dispatch_manager_status = E_DISPATCH_MANAGER_POST_NEW;
  1029. // }
  1030. // break;
  1031. // }
  1032. // case E_DISPATCH_MANAGER_POST_NEW:
  1033. // {
  1034. // //解析 m_post_command_msg
  1035. // std::string t_string = m_post_command_msg.m_message_buf;
  1036. // //检索字符串的内容,
  1037. // if ( t_string.find("entrance_measure_info") != std::string::npos )
  1038. // {
  1039. // //entrance_measure_info 是 park_table 特有的
  1040. // if(! google::protobuf::TextFormat::ParseFromString(t_string, &m_park_table_msg))
  1041. // {
  1042. // //答复错误
  1043. // }
  1044. // else
  1045. // {
  1046. //// LOG(INFO) << " m_park_table_msg = "<< m_park_table_msg.DebugString() << " --- " << this;
  1047. // m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE;
  1048. //
  1049. // //根据雷达x坐标, 计算入口id
  1050. // int t_terminal = 0;
  1051. // if (m_park_table_msg.entrance_measure_info().cx()<0)
  1052. // {
  1053. // t_terminal = m_dispatch_manager_id*2+1;
  1054. // }
  1055. // else if(m_park_table_msg.entrance_measure_info().cx()>0)
  1056. // {
  1057. // t_terminal = m_dispatch_manager_id*2+2;
  1058. // }
  1059. // m_park_table_msg.set_terminal_id(t_terminal);
  1060. // m_dispatch_plc.execute_for_dispatch_request_msg(m_park_table_msg, m_dispatch_process_type, m_car_type);
  1061. // m_device_floor = m_park_table_msg.allocated_space_info().floor();
  1062. // m_dispatch_manager_status = E_DISPATCH_MANAGER_COMPLETED_NEW;
  1063. // }
  1064. // }
  1065. // else
  1066. // {
  1067. // if ( get_outlet_for_ready() !=0 )
  1068. // {
  1069. // if(! google::protobuf::TextFormat::ParseFromString(t_string, &m_pick_table_msg))
  1070. // {
  1071. // //答复错误
  1072. // }
  1073. // else
  1074. // {
  1075. // m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP;
  1076. // m_pick_table_msg.set_terminal_id(get_outlet_for_ready());
  1077. // m_dispatch_plc.execute_for_dispatch_request_msg(m_pick_table_msg, m_dispatch_process_type, m_car_type);
  1078. // m_device_floor = 1;
  1079. // m_dispatch_manager_status = E_DISPATCH_MANAGER_COMPLETED_NEW;
  1080. // }
  1081. // }
  1082. // //else 没有空闲出口,就无限等待
  1083. // }
  1084. // break;
  1085. // }
  1086. // case E_DISPATCH_MANAGER_COMPLETED_NEW:
  1087. // {
  1088. // //等待dispatch_plc执行,然后ack里面切回ready
  1089. // break;
  1090. // }
  1091. // default:
  1092. // {
  1093. // std::cout << " huli test :::: " << " Dispatch_manager::process_control() error, m_dispatch_manager_status = "
  1094. // << m_dispatch_manager_status << std::endl;
  1095. // break;
  1096. // }
  1097. // }
  1098. // }
  1099. // }
  1100. // LOG(INFO) << " Dispatch_manager::process_control() end "<< this;
  1101. // return;
  1102. //}
  1103. #ifdef CHUTIAN_PROJECT_PROJECT
  1104. //新版流程控制
  1105. void Dispatch_manager::process_sql()
  1106. {
  1107. LOG(INFO) << " Dispatch_manager::process_sql() start " << this;
  1108. Error_manager t_error;
  1109. while (m_dispatch_manager_condition.is_alive())
  1110. {
  1111. m_dispatch_manager_condition.wait();
  1112. if (m_dispatch_manager_condition.is_alive())
  1113. {
  1114. std::this_thread::sleep_for(std::chrono::microseconds(1));
  1115. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  1116. // std::this_thread::sleep_for(std::chrono::seconds(1));
  1117. std::this_thread::yield();
  1118. std::unique_lock<std::mutex> t_lock(m_lock);
  1119. static auto t_update_time = std::chrono::system_clock::now();
  1120. if(std::chrono::system_clock::now() - t_update_time > std::chrono::seconds(1))
  1121. {
  1122. t_update_time = std::chrono::system_clock::now();
  1123. std::cout << " huli test :::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  1124. std::cout << " huli test :::: " << " m_dispatch_manager_status = " << m_dispatch_manager_status << std::endl;
  1125. std::cout << " huli test :::: " << " xxxxxxxxx get_outlet_for_ready() = " << get_outlet_for_ready() << std::endl;
  1126. }
  1127. switch ( m_dispatch_manager_status )
  1128. {
  1129. case E_DISPATCH_MANAGER_READY:
  1130. case E_DISPATCH_MANAGER_REQUEST:
  1131. {
  1132. //循环请求, 请求周期1秒
  1133. // std::this_thread::sleep_for(std::chrono::seconds(1));
  1134. if ( std::chrono::system_clock::now() - m_request_updata_time > std::chrono::seconds(1) )
  1135. {
  1136. m_request_updata_time = std::chrono::system_clock::now();
  1137. //调度开始前, 向数据库发送请求的相关操作, 输入 穿梭机所在的楼层, 调度id 0~2, 空闲出口id, 如果不是0,就表示有空闲的出口
  1138. t_error = m_dispatch_command.dispatch_request_to_sql(m_device_floor, m_dispatch_manager_id, get_outlet_for_ready());
  1139. //std::cout << " huli test :::: " << " sssssssssssssssssssssssssssssssssss dispatch_request_to_sql = " << t_error << std::endl;
  1140. if ( t_error == Error_code::SUCCESS )
  1141. {
  1142. //如果找到了合适的指令, 那么交给plc来执行
  1143. if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_STORE )
  1144. {
  1145. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE;
  1146. m_park_table_msg = m_dispatch_command.m_park_table_msg;
  1147. m_car_type = m_dispatch_command.m_car_type;
  1148. m_dispatch_plc.execute_for_dispatch_request_msg(m_park_table_msg, m_dispatch_process_type, m_car_type);
  1149. m_device_floor = m_park_table_msg.allocated_space_info().floor();
  1150. }
  1151. else if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_PICKUP )
  1152. {
  1153. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP;
  1154. m_pick_table_msg = m_dispatch_command.m_pick_table_msg;
  1155. m_car_type = m_dispatch_command.m_car_type;
  1156. m_dispatch_plc.execute_for_dispatch_request_msg(m_pick_table_msg, m_dispatch_process_type, m_car_type);
  1157. m_device_floor = 1;
  1158. }
  1159. //切换到工作状态
  1160. m_dispatch_manager_status = E_DISPATCH_MANAGER_WORKING;
  1161. }
  1162. else if(t_error != Error_code::NODATA)
  1163. {
  1164. LOG(INFO) << " dispatch_request_to_sql error = " << t_error << this;
  1165. }
  1166. //else NODATA 无限循环
  1167. }
  1168. //else 等待
  1169. break;
  1170. }
  1171. case E_DISPATCH_MANAGER_WORKING:
  1172. {
  1173. //等待dispatch_plc执行, 完成后切换到 E_DISPATCH_MANAGER_RESPONSE
  1174. if ( m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::DISPATCH_PLC_READY ||
  1175. m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::DISPATCH_PLC_FAULT)
  1176. {
  1177. if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MIN_CAR )
  1178. {
  1179. //切换到 重新分配
  1180. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1181. m_car_type = Common_data::Car_type::MIN_CAR;
  1182. }
  1183. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MID_CAR )
  1184. {
  1185. //切换到 重新分配
  1186. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1187. m_car_type = Common_data::Car_type::MID_CAR;
  1188. }
  1189. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_BIG_CAR )
  1190. {
  1191. //切换到 重新分配
  1192. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1193. m_car_type = Common_data::Car_type::BIG_CAR;
  1194. }
  1195. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_HUGE_CAR )
  1196. {
  1197. //切换到 重新分配
  1198. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1199. m_car_type = Common_data::Car_type::HUGE_CAR;
  1200. }
  1201. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_FAULT_CAR )
  1202. {
  1203. //切换到 重新分配
  1204. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1205. m_car_type = Common_data::Car_type::FAULT_CAR;
  1206. }
  1207. else
  1208. {
  1209. //切换到答复状态
  1210. m_dispatch_manager_status = E_DISPATCH_MANAGER_RESPONSE;
  1211. }
  1212. }
  1213. //else 无限等待
  1214. break;
  1215. }
  1216. case E_DISPATCH_MANAGER_REALLOCATE:
  1217. {
  1218. //调度 , 向数据库 重新分配车位,
  1219. t_error = m_dispatch_command.dispatch_reallocate_to_sql(m_car_type, get_outlet_for_ready());
  1220. if ( t_error == Error_code::SUCCESS )
  1221. {
  1222. //如果找到了合适的车位, 那么交给plc来执行
  1223. if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_REALLOCATE )
  1224. {
  1225. m_dispatch_process_type = m_dispatch_command.m_dispatch_process_type;
  1226. m_park_table_msg = m_dispatch_command.m_park_table_msg;
  1227. m_car_type = m_dispatch_command.m_car_type;
  1228. m_dispatch_plc.execute_for_dispatch_request_msg(m_park_table_msg, m_dispatch_process_type, m_car_type);
  1229. m_device_floor = m_park_table_msg.allocated_space_info().floor();
  1230. }
  1231. //没有找到合适的车位, 那么放到出口
  1232. else if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_REVOCATION )
  1233. {
  1234. m_dispatch_process_type = m_dispatch_command.m_dispatch_process_type;
  1235. m_pick_table_msg = m_dispatch_command.m_pick_table_msg;
  1236. m_car_type = m_dispatch_command.m_car_type;
  1237. m_dispatch_plc.execute_for_dispatch_request_msg(m_pick_table_msg,m_dispatch_process_type, m_car_type);
  1238. m_device_floor = 1;
  1239. }
  1240. //切换到工作状态
  1241. m_dispatch_manager_status = E_DISPATCH_MANAGER_WORKING;
  1242. }
  1243. else if(t_error != Error_code::NODATA)
  1244. {
  1245. LOG(INFO) << " dispatch_request_to_sql error = " << t_error << this;
  1246. }
  1247. //else NODATA 无限循环
  1248. break;
  1249. break;
  1250. }
  1251. case E_DISPATCH_MANAGER_RESPONSE:
  1252. {
  1253. //调度完成后, 向数据库发送答复的相关操作
  1254. t_error = m_dispatch_command.dispatch_response_to_sql(m_dispatch_plc.get_result());
  1255. if(t_error != Error_code::SUCCESS)
  1256. {
  1257. LOG(INFO) << " dispatch_response_to_sql error = " << t_error << this;
  1258. }
  1259. //切换到ready状态
  1260. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  1261. break;
  1262. }
  1263. default:
  1264. {
  1265. std::cout << " huli test :::: " << " Dispatch_manager::process_control() error, m_dispatch_manager_status = "
  1266. << m_dispatch_manager_status << std::endl;
  1267. break;
  1268. }
  1269. }
  1270. }
  1271. }
  1272. LOG(INFO) << " Dispatch_manager::process_sql() end "<< this;
  1273. return;
  1274. }
  1275. #endif//CHUTIAN_PROJECT_PROJECT
  1276. #ifdef SHANGGUJIE_PROJECT_PROJECT
  1277. //新版流程控制
  1278. void Dispatch_manager::process_sql_shanggujie()
  1279. {
  1280. LOG(INFO) << " Dispatch_manager::process_sql() start " << this;
  1281. Error_manager t_error;
  1282. while (m_dispatch_manager_condition.is_alive())
  1283. {
  1284. m_dispatch_manager_condition.wait();
  1285. if (m_dispatch_manager_condition.is_alive())
  1286. {
  1287. std::this_thread::sleep_for(std::chrono::microseconds(1));
  1288. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  1289. // std::this_thread::sleep_for(std::chrono::seconds(1));
  1290. std::this_thread::yield();
  1291. std::unique_lock<std::mutex> t_lock(m_lock);
  1292. static auto t_update_time = std::chrono::system_clock::now();
  1293. if(std::chrono::system_clock::now() - t_update_time > std::chrono::seconds(1))
  1294. {
  1295. t_update_time = std::chrono::system_clock::now();
  1296. std::cout << " huli test :::: " << " m_dispatch_manager --------------------------------------------------------------------= " << 999 << std::endl;
  1297. std::cout << " huli test :::: " << " m_dispatch_manager_id = " << m_dispatch_manager_id << std::endl;
  1298. std::cout << " huli test :::: " << " m_dispatch_manager_status = " << m_dispatch_manager_status << std::endl;
  1299. std::cout << " huli test :::: " << " xxxxxxxxx get_outlet_for_ready() = " << get_outlet_for_ready() << std::endl;
  1300. }
  1301. //huli need
  1302. // continue;
  1303. switch ( m_dispatch_manager_status )
  1304. {
  1305. case E_DISPATCH_MANAGER_READY:
  1306. case E_DISPATCH_MANAGER_REQUEST:
  1307. {
  1308. //循环请求, 请求周期1秒
  1309. // std::this_thread::sleep_for(std::chrono::seconds(1));
  1310. if ( std::chrono::system_clock::now() - m_request_updata_time > std::chrono::seconds(1) )
  1311. {
  1312. m_request_updata_time = std::chrono::system_clock::now();
  1313. //检查plc搬运器的状态, 如果是维护, 修改所有指令为故障状态.(同单元的所有指令)
  1314. if ( Dispatch_manager::get_instance_references().m_dispatch_plc.get_plc_carrier_status() == 4 ||
  1315. Dispatch_manager::get_instance_references().m_dispatch_plc.get_plc_carrier_status() == 0 )
  1316. {
  1317. // m_dispatch_command.update_command_queue_from_wait_to_fault_for_unit(m_dispatch_manager_id);
  1318. t_error = Error_manager(Error_code::ERROR, Error_level::MINOR_ERROR,
  1319. " get_plc_carrier_status() error ");
  1320. LOG(INFO) << " get_plc_carrier_status error = " << Dispatch_manager::get_instance_references().m_dispatch_plc.get_plc_carrier_status()<< " " << this;
  1321. break;
  1322. }
  1323. else
  1324. {
  1325. //调度开始前, 向数据库发送请求的相关操作, 输入 穿梭机所在的楼层, 调度id 0~2, 空闲出口id, 如果不是0,就表示有空闲的出口
  1326. t_error = m_dispatch_command.dispatch_request_to_sql(m_device_floor, m_dispatch_manager_id, get_outlet_for_ready());
  1327. // std::cout << " huli test :::: " << " sssssssssssssssssssssssssssssssssss dispatch_request_to_sql = " << t_error << std::endl;
  1328. if ( t_error == Error_code::SUCCESS )
  1329. {
  1330. //如果找到了合适的指令, 那么交给plc来执行
  1331. if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_STORE )
  1332. {
  1333. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_STORE;
  1334. m_park_table_msg = m_dispatch_command.m_park_table_msg;
  1335. m_car_type = m_dispatch_command.m_car_type;
  1336. m_dispatch_plc.execute_for_dispatch_request_msg(m_park_table_msg, m_dispatch_process_type, m_car_type);
  1337. m_device_floor = m_park_table_msg.allocated_space_info().floor();
  1338. }
  1339. else if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_PICKUP )
  1340. {
  1341. m_dispatch_process_type = Common_data::Dispatch_process_type::DISPATCH_PROCESS_PICKUP;
  1342. m_pick_table_msg = m_dispatch_command.m_pick_table_msg;
  1343. m_car_type = m_dispatch_command.m_car_type;
  1344. m_dispatch_plc.execute_for_dispatch_request_msg(m_pick_table_msg, m_dispatch_process_type, m_car_type);
  1345. m_device_floor = 1;
  1346. }
  1347. //切换到工作状态
  1348. m_dispatch_manager_status = E_DISPATCH_MANAGER_WORKING;
  1349. }
  1350. else if(t_error != Error_code::NODATA)
  1351. {
  1352. LOG(INFO) << " dispatch_request_to_sql error = " << t_error << this;
  1353. }
  1354. //else NODATA 无限循环
  1355. }
  1356. }
  1357. //else 等待
  1358. break;
  1359. }
  1360. case E_DISPATCH_MANAGER_WORKING:
  1361. {
  1362. //等待dispatch_plc执行, 完成后切换到 E_DISPATCH_MANAGER_RESPONSE
  1363. if ( m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::DISPATCH_PLC_READY ||
  1364. m_dispatch_plc.get_dispatch_plc_status() == Dispatch_plc::DISPATCH_PLC_FAULT)
  1365. {
  1366. if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MIN_SHORT_CAR )
  1367. {
  1368. //切换到 重新分配
  1369. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1370. m_car_type = Common_data::Car_type::MIN_SHORT_CAR;
  1371. }
  1372. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MID_SHORT_CAR )
  1373. {
  1374. //切换到 重新分配
  1375. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1376. m_car_type = Common_data::Car_type::MID_SHORT_CAR;
  1377. }
  1378. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_BIG_SHORT_CAR )
  1379. {
  1380. //切换到 重新分配
  1381. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1382. m_car_type = Common_data::Car_type::BIG_SHORT_CAR;
  1383. }
  1384. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_HUGE_SHORT_CAR )
  1385. {
  1386. //切换到 重新分配
  1387. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1388. m_car_type = Common_data::Car_type::HUGE_SHORT_CAR;
  1389. }
  1390. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_FAULT_SHORT_CAR )
  1391. {
  1392. //切换到 重新分配
  1393. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1394. m_car_type = Common_data::Car_type::FAULT_SHORT_CAR;
  1395. }
  1396. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MIN_LONG_CAR )
  1397. {
  1398. //切换到 重新分配
  1399. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1400. m_car_type = Common_data::Car_type::MIN_LONG_CAR;
  1401. }
  1402. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_MID_LONG_CAR )
  1403. {
  1404. //切换到 重新分配
  1405. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1406. m_car_type = Common_data::Car_type::MID_LONG_CAR;
  1407. }
  1408. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_BIG_LONG_CAR )
  1409. {
  1410. //切换到 重新分配
  1411. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1412. m_car_type = Common_data::Car_type::BIG_LONG_CAR;
  1413. }
  1414. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_HUGE_LONG_CAR )
  1415. {
  1416. //切换到 重新分配
  1417. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1418. m_car_type = Common_data::Car_type::HUGE_LONG_CAR;
  1419. }
  1420. else if ( m_dispatch_plc.get_result() == DISPATCH_PLC_REALLOCATE_FAULT_LONG_CAR )
  1421. {
  1422. //切换到 重新分配
  1423. m_dispatch_manager_status = E_DISPATCH_MANAGER_REALLOCATE;
  1424. m_car_type = Common_data::Car_type::FAULT_LONG_CAR;
  1425. }
  1426. else
  1427. {
  1428. //切换到答复状态
  1429. m_dispatch_manager_status = E_DISPATCH_MANAGER_RESPONSE;
  1430. }
  1431. }
  1432. //else 无限等待
  1433. break;
  1434. }
  1435. case E_DISPATCH_MANAGER_REALLOCATE:
  1436. {
  1437. //调度 , 向数据库 重新分配车位,
  1438. t_error = m_dispatch_command.dispatch_reallocate_to_sql(m_car_type, get_outlet_for_ready());
  1439. if ( t_error == Error_code::SUCCESS )
  1440. {
  1441. //如果找到了合适的车位, 那么交给plc来执行
  1442. if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_REALLOCATE )
  1443. {
  1444. m_dispatch_process_type = m_dispatch_command.m_dispatch_process_type;
  1445. m_park_table_msg = m_dispatch_command.m_park_table_msg;
  1446. m_car_type = m_dispatch_command.m_car_type;
  1447. m_dispatch_plc.execute_for_dispatch_request_msg(m_park_table_msg, m_dispatch_process_type, m_car_type);
  1448. m_device_floor = m_park_table_msg.allocated_space_info().floor();
  1449. }
  1450. //没有找到合适的车位, 那么放到出口
  1451. else if ( m_dispatch_command.m_dispatch_process_type == Common_data::DISPATCH_PROCESS_REVOCATION )
  1452. {
  1453. m_dispatch_process_type = m_dispatch_command.m_dispatch_process_type;
  1454. m_pick_table_msg = m_dispatch_command.m_pick_table_msg;
  1455. m_car_type = m_dispatch_command.m_car_type;
  1456. m_dispatch_plc.execute_for_dispatch_request_msg(m_pick_table_msg,m_dispatch_process_type, m_car_type);
  1457. m_device_floor = 1;
  1458. }
  1459. //切换到工作状态
  1460. m_dispatch_manager_status = E_DISPATCH_MANAGER_WORKING;
  1461. }
  1462. else if(t_error != Error_code::NODATA)
  1463. {
  1464. LOG(INFO) << " dispatch_request_to_sql error = " << t_error << this;
  1465. }
  1466. //else NODATA 无限循环
  1467. break;
  1468. break;
  1469. }
  1470. case E_DISPATCH_MANAGER_RESPONSE:
  1471. {
  1472. //调度完成后, 向数据库发送答复的相关操作
  1473. t_error = m_dispatch_command.dispatch_response_to_sql(m_dispatch_plc.get_result());
  1474. if(t_error != Error_code::SUCCESS)
  1475. {
  1476. LOG(INFO) << " dispatch_response_to_sql error = " << t_error << this;
  1477. }
  1478. //切换到ready状态
  1479. m_dispatch_manager_status = E_DISPATCH_MANAGER_READY;
  1480. break;
  1481. }
  1482. default:
  1483. {
  1484. std::cout << " huli test :::: " << " Dispatch_manager::process_control() error, m_dispatch_manager_status = "
  1485. << m_dispatch_manager_status << std::endl;
  1486. break;
  1487. }
  1488. }
  1489. }
  1490. }
  1491. LOG(INFO) << " Dispatch_manager::process_sql() end "<< this;
  1492. return;
  1493. }
  1494. #endif//SHANGGUJIE_PROJECT_PROJECT