dispatch_device_base.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. //
  2. // Created by huli on 2021/3/3.
  3. //
  4. #include "dispatch_device_base.h"
  5. Dispatch_device_base::Dispatch_device_base()
  6. {
  7. m_dispatch_device_status = DISPATCH_DEVICE_UNKNOW;
  8. m_device_id = -1;
  9. mp_execute_thread = NULL;
  10. }
  11. Dispatch_device_base::~Dispatch_device_base()
  12. {
  13. dispatch_device_base_uninit();
  14. }
  15. //设备 初始化
  16. Error_manager Dispatch_device_base::dispatch_device_base_init(int device_id)
  17. {
  18. m_device_id = device_id;
  19. // 线程默认开启
  20. m_execute_condition.reset(false, true, false);
  21. mp_execute_thread = new std::thread(&Dispatch_device_base::execute_thread_fun, this);
  22. m_dispatch_device_status = DISPATCH_DEVICE_READY;
  23. return Error_code::SUCCESS;
  24. }
  25. //设备 反初始化
  26. Error_manager Dispatch_device_base::dispatch_device_base_uninit()
  27. {
  28. if (mp_execute_thread)
  29. {
  30. m_execute_condition.kill_all();
  31. }
  32. if (mp_execute_thread)
  33. {
  34. mp_execute_thread->join();
  35. delete mp_execute_thread;
  36. mp_execute_thread = NULL;
  37. }
  38. m_dispatch_device_status = DISPATCH_DEVICE_UNKNOW;
  39. return Error_code::SUCCESS;
  40. }
  41. //执行任务
  42. Error_manager Dispatch_device_base::execute_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level)
  43. {
  44. LOG(INFO) << " ---Dispatch_device_base::execute_task ---"<< this;
  45. Error_manager t_error;
  46. Error_manager t_result;
  47. //检查指针
  48. if (p_task.get() == NULL) {
  49. return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
  50. "Dispatch_device_base::execute_task failed, POINTER_IS_NULL");
  51. }
  52. //检查任务类型,
  53. t_error = check_task_type(p_task);
  54. if ( t_error != Error_code::SUCCESS )
  55. {
  56. return t_error;
  57. }
  58. //检查接收方能否接受任务
  59. t_error = check_task_level(dispatch_task_level);
  60. if ( t_error != SUCCESS )
  61. {
  62. t_result.compare_and_cover_error(t_error);
  63. }
  64. else
  65. {
  66. //接受任务,并将任务的状态改为TASK_SIGNED已签收
  67. t_error = sign_for_task(p_task, dispatch_task_level);
  68. if ( t_error != Error_code::SUCCESS )
  69. {
  70. return t_error;
  71. }
  72. //这里不用检查任务内容, 直接下发给底层设备
  73. //永远启动到三级任务工作状态.
  74. // 启动定位管理模块,的核心工作线程
  75. m_dispatch_device_status = DISPATCH_DEVICE_THREE_LEVEL_WORK;
  76. m_execute_condition.notify_all(true);
  77. //通知 thread_work 子线程启动。
  78. //只签收,并不一定进入工作状态, 在线程真正的执行的时候,才改为工作中, (执行线程可能会先处理更高优先级的任务单)
  79. }
  80. if ( t_result != Error_code::SUCCESS )
  81. {
  82. return t_result;
  83. }
  84. return Error_code::SUCCESS;
  85. }
  86. //检查任务类型, 子类必须重载, 用来检查输入的任务是否为子类所需的.
  87. Error_manager Dispatch_device_base::check_task_type(std::shared_ptr<Task_Base> p_task)
  88. {
  89. //检查任务类型,
  90. // if (p_task->get_task_type() != CARRIER_TASK)
  91. // {
  92. // return Error_manager(Error_code::CARRIER_TASK_TYPE_ERROR, Error_level::MINOR_ERROR,
  93. // "Dispatch_device_base::execute_one_level_task get_task_type() != CARRIER_TASK ");
  94. // }
  95. return Error_code::SUCCESS;
  96. }
  97. //判断能否执行任务
  98. Error_manager Dispatch_device_base::check_task_level(Dispatch_task_level dispatch_task_level)
  99. {
  100. // std::cout << " huli test :::: " << " m_dispatch_device_status = " << m_dispatch_device_status << std::endl;
  101. //加锁
  102. std::unique_lock<std::mutex> t_lock(m_lock);
  103. //只有当状态 不是正在执行当前等级的任务,并且当前等级的任务为空. 此时返回成功, 才能接受新的任务
  104. if ( m_dispatch_device_status >= DISPATCH_DEVICE_READY && m_dispatch_device_status <= DISPATCH_DEVICE_THREE_LEVEL_WORK )
  105. {
  106. switch ( dispatch_task_level )
  107. {
  108. case DISPATCH_TASK_ONE_LEVEL:
  109. {
  110. if ( ( m_dispatch_device_status == DISPATCH_DEVICE_READY ) && mp_device_one_level_task.get() == NULL)
  111. {
  112. return Error_code::SUCCESS;
  113. }
  114. break;
  115. }
  116. case DISPATCH_TASK_TWO_LEVEL:
  117. {
  118. if ( ( m_dispatch_device_status == DISPATCH_DEVICE_READY ||
  119. m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_WORK ||
  120. m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER ) && mp_device_two_level_task.get() == NULL)
  121. {
  122. return Error_code::SUCCESS;
  123. }
  124. break;
  125. }
  126. case DISPATCH_TASK_THREE_LEVEL:
  127. {
  128. if ( ( m_dispatch_device_status == DISPATCH_DEVICE_READY ||
  129. m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER ) && mp_device_three_level_task.get() == NULL)
  130. {
  131. return Error_code::SUCCESS;
  132. }
  133. break;
  134. }
  135. default:
  136. {
  137. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  138. " Dispatch_device_base::check_task PARAMETER_ERROR ");
  139. break;
  140. }
  141. }
  142. return Error_manager(Error_code::DISPATCH_DEVICE_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
  143. " Dispatch_device_base::check_task is busy ");
  144. }
  145. else
  146. {
  147. // std::cout << " huli test :::: " << " 777777777777777777777777777777777777 = " << 777 << std::endl;
  148. // std::cout << " huli test :::: " << " m_dispatch_device_status = " << m_dispatch_device_status << std::endl;
  149. // std::cout << " huli test :::: " << " id = " << m_device_id << std::endl;
  150. return Error_manager(Error_code::DISPATCH_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
  151. " Dispatch_device_base::check_task error ");
  152. }
  153. return Error_code::SUCCESS;
  154. }
  155. //签收任务
  156. Error_manager Dispatch_device_base::sign_for_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level)
  157. {
  158. //加锁
  159. std::unique_lock<std::mutex> t_lock(m_lock);
  160. switch ( dispatch_task_level )
  161. {
  162. case DISPATCH_TASK_ONE_LEVEL:
  163. {
  164. mp_device_one_level_task = p_task;
  165. mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  166. break;
  167. }
  168. case DISPATCH_TASK_TWO_LEVEL:
  169. {
  170. mp_device_two_level_task = p_task;
  171. mp_device_two_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  172. break;
  173. }
  174. case DISPATCH_TASK_THREE_LEVEL:
  175. {
  176. mp_device_three_level_task = p_task;
  177. mp_device_three_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  178. break;
  179. }
  180. default:
  181. {
  182. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  183. " Dispatch_device_base::check_task PARAMETER_ERROR ");
  184. break;
  185. }
  186. }
  187. return Error_code::SUCCESS;
  188. }
  189. //检查状态,是否正常运行. (工作状态 和 是否能接受对应的任务无关)
  190. Error_manager Dispatch_device_base::check_status()
  191. {
  192. if ( m_dispatch_device_status == DISPATCH_DEVICE_READY )
  193. {
  194. return Error_code::SUCCESS;
  195. }
  196. else if ( m_dispatch_device_status >= DISPATCH_DEVICE_BUSY && m_dispatch_device_status <= DISPATCH_DEVICE_THREE_LEVEL_WORK)
  197. {
  198. return Error_manager(Error_code::DISPATCH_DEVICE_STATUS_BUSY, Error_level::NEGLIGIBLE_ERROR,
  199. " Dispatch_device_base::check_status is busy ");
  200. }
  201. else
  202. {
  203. return Error_manager(Error_code::DISPATCH_DEVICE_STATUS_ERROR, Error_level::MINOR_ERROR,
  204. " Dispatch_device_base::check_status error ");
  205. }
  206. return Error_code::SUCCESS;
  207. }
  208. //判断是否为待机,如果已经准备好,则可以执行任务。
  209. bool Dispatch_device_base::is_ready()
  210. {
  211. return (m_dispatch_device_status == DISPATCH_DEVICE_READY);
  212. }
  213. //结束任务单,里面会根据任务的故障等级修正 任务单的状态
  214. Error_manager Dispatch_device_base::end_task(std::shared_ptr<Task_Base> p_task)
  215. {
  216. LOG(INFO) << " ---Dispatch_device_base::end_task ---"<< this;
  217. std::unique_lock<std::mutex> t_lock(m_lock);
  218. //注:这里只修改任务单的状态, 搬运器的状态不管
  219. //在结束任务单时,将雷达任务状态改为 TASK_OVER 已结束
  220. //判断任务单的错误等级,
  221. if ( p_task->get_task_error_manager().get_error_level() < Error_level::MINOR_ERROR)
  222. {
  223. //强制改为TASK_OVER,不管它当前在做什么。
  224. p_task->set_task_statu(Task_Base::Task_statu::TASK_OVER);
  225. }
  226. else
  227. {
  228. //强制改为 TASK_ERROR,不管它当前在做什么。
  229. p_task->set_task_statu(Task_Base::Task_statu::TASK_ERROR);
  230. }
  231. return Error_code::SUCCESS;
  232. }
  233. //取消任务单,由发送方提前取消任务单
  234. Error_manager Dispatch_device_base::cancel_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level)
  235. {
  236. //找到对应的任务单
  237. switch ( dispatch_task_level )
  238. {
  239. case DISPATCH_TASK_ONE_LEVEL:
  240. {
  241. if ( m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_ONE_LEVEL_OVER )
  242. {
  243. //如果正在执行一级任务, 那么取消当前指令, 然后降级
  244. m_execute_condition.notify_all(false);
  245. //确保内部线程已经停下
  246. while (m_execute_condition.is_working())
  247. {
  248. }
  249. cancel_command();
  250. {
  251. std::unique_lock<std::mutex> t_lock(m_lock);
  252. mp_device_one_level_task.reset();
  253. m_dispatch_device_status = DISPATCH_DEVICE_READY;
  254. }
  255. m_execute_condition.notify_all(true);
  256. }
  257. else
  258. {
  259. std::unique_lock<std::mutex> t_lock(m_lock);
  260. //否则直接销毁任务单
  261. mp_device_one_level_task.reset();
  262. }
  263. break;
  264. }
  265. case DISPATCH_TASK_TWO_LEVEL:
  266. {
  267. if ( m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_TWO_LEVEL_OVER )
  268. {
  269. //如果正在执行一级任务, 那么取消当前指令, 然后降级
  270. m_execute_condition.notify_all(false);
  271. //确保内部线程已经停下
  272. while (m_execute_condition.is_working())
  273. {
  274. }
  275. cancel_command();
  276. {
  277. std::unique_lock<std::mutex> t_lock(m_lock);
  278. mp_device_two_level_task.reset();
  279. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
  280. }
  281. m_execute_condition.notify_all(true);
  282. }
  283. else
  284. {
  285. std::unique_lock<std::mutex> t_lock(m_lock);
  286. //否则直接销毁任务单
  287. mp_device_one_level_task.reset();
  288. }
  289. break;
  290. }
  291. case DISPATCH_TASK_THREE_LEVEL:
  292. {
  293. if ( m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_WORK || m_dispatch_device_status == DISPATCH_DEVICE_THREE_LEVEL_OVER )
  294. {
  295. //如果正在执行一级任务, 那么取消当前指令, 然后降级
  296. m_execute_condition.notify_all(false);
  297. //确保内部线程已经停下
  298. while (m_execute_condition.is_working())
  299. {
  300. }
  301. cancel_command();
  302. {
  303. std::unique_lock<std::mutex> t_lock(m_lock);
  304. mp_device_three_level_task.reset();
  305. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
  306. }
  307. m_execute_condition.notify_all(true);
  308. }
  309. else
  310. {
  311. std::unique_lock<std::mutex> t_lock(m_lock);
  312. //否则直接销毁任务单
  313. mp_device_one_level_task.reset();
  314. }
  315. break;
  316. }
  317. default:
  318. {
  319. return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR,
  320. " Dispatch_device_base::cancel_task PARAMETER_ERROR ");
  321. break;
  322. }
  323. }
  324. //上级的任务单指针,改为死亡,表示任务已经失效.
  325. p_task->set_task_statu(Task_Base::Task_statu::TASK_DEAD);
  326. return Error_code::SUCCESS;
  327. }
  328. Dispatch_device_base::Dispatch_device_status Dispatch_device_base::get_dispatch_device_status()
  329. {
  330. return m_dispatch_device_status;
  331. }
  332. //获取硬件设备的状态, 必须子类继承
  333. Dispatch_device_base::Hardware_device_status Dispatch_device_base::get_actual_device_status()
  334. {
  335. return HARDWARE_DEVICE_UNKNOWN;
  336. }
  337. int Dispatch_device_base::get_device_id()
  338. {
  339. return m_device_id;
  340. }
  341. //执行外界任务的执行函数
  342. void Dispatch_device_base::execute_thread_fun()
  343. {
  344. LOG(INFO) << " Dispatch_device_base::execute_thread_fun() start " << this;
  345. Error_manager t_error;
  346. while (m_execute_condition.is_alive())
  347. {
  348. m_execute_condition.wait();
  349. if ( m_execute_condition.is_alive() )
  350. {
  351. std::this_thread::sleep_for(std::chrono::microseconds(1));
  352. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  353. // std::this_thread::sleep_for(std::chrono::seconds(1));
  354. std::this_thread::yield();
  355. // std::cout << " huli test :::: " << " m_device_id = " << m_device_id << std::endl;
  356. // std::cout << " huli test :::: " << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa m_dispatch_device_status = " << m_dispatch_device_status << std::endl;
  357. switch ( (Dispatch_device_status)m_dispatch_device_status )
  358. {
  359. //核心任务, (三级任务)
  360. case DISPATCH_DEVICE_THREE_LEVEL_WORK:
  361. {
  362. if ( mp_device_three_level_task.get() != NULL )
  363. {
  364. mp_device_three_level_task->set_task_statu(Task_Base::Task_statu::TASK_WORKING);
  365. //执行三级任务
  366. write_task_to_memory(mp_device_three_level_task);
  367. //更新通信
  368. update_device_communication();
  369. //从内存中读数据到任务单
  370. t_error = check_and_read_memory_to_task(mp_device_three_level_task);
  371. if (t_error == NODATA)
  372. {
  373. //设备正常运行
  374. //延时1ms, snap7的通信效率偏慢, 不需要高频率检查
  375. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  376. }
  377. else
  378. {
  379. if (t_error != SUCCESS)
  380. {
  381. mp_device_three_level_task->set_task_error_manager(t_error);
  382. }
  383. end_task(mp_device_three_level_task);
  384. m_dispatch_device_status = DISPATCH_DEVICE_THREE_LEVEL_OVER;
  385. }
  386. }
  387. else
  388. {
  389. //直接降级
  390. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
  391. }
  392. break;
  393. }
  394. case DISPATCH_DEVICE_THREE_LEVEL_OVER:
  395. {
  396. //更新通信
  397. update_device_communication();
  398. if ( mp_device_three_level_task.get() != NULL )
  399. {
  400. //检查任务状态,
  401. //在 E_THREE_LEVEL_WORK 里面, 已经 设为 TASK_OVER 了.
  402. //等待发送方的新指令, (发送方会把状态改为回收, 表示这个任务结束)
  403. if ( mp_device_three_level_task->get_task_statu() == Task_Base::Task_statu::TASK_WITHDRAW )
  404. {
  405. //这里会通知任务已经释放, 然后销毁任务单, 并降级
  406. mp_device_three_level_task->set_task_statu(Task_Base::Task_statu::TASK_FREE);
  407. mp_device_three_level_task.reset();
  408. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
  409. }
  410. //任务单重新创建, 调度创建的新的任务,那么回去继续工作
  411. else if ( mp_device_three_level_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED )
  412. {
  413. mp_device_three_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  414. m_dispatch_device_status = DISPATCH_DEVICE_THREE_LEVEL_WORK;
  415. }
  416. //else //保持不动, 直到发送方给定新的任务,
  417. }
  418. else
  419. {
  420. //直接降级
  421. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
  422. }
  423. break;
  424. }
  425. case DISPATCH_DEVICE_TWO_LEVEL_WORK:
  426. {
  427. if ( mp_device_two_level_task.get() != NULL )
  428. {
  429. mp_device_two_level_task->set_task_statu(Task_Base::Task_statu::TASK_WORKING);
  430. //执行二级任务
  431. write_task_to_memory(mp_device_two_level_task);
  432. //更新通信
  433. update_device_communication();
  434. //从内存中读数据到任务单
  435. t_error = check_and_read_memory_to_task(mp_device_two_level_task);
  436. if (t_error == NODATA)
  437. {
  438. //设备正常运行
  439. //延时1ms, snap7的通信效率偏慢, 不需要高频率检查
  440. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  441. }
  442. else
  443. {
  444. if (t_error != SUCCESS)
  445. {
  446. mp_device_two_level_task->set_task_error_manager(t_error);
  447. }
  448. end_task(mp_device_two_level_task);
  449. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_OVER;
  450. }
  451. }
  452. else
  453. {
  454. //直接降级
  455. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
  456. }
  457. break;
  458. }
  459. case DISPATCH_DEVICE_TWO_LEVEL_OVER:
  460. {
  461. //更新通信
  462. update_device_communication();
  463. if ( mp_device_two_level_task.get() != NULL )
  464. {
  465. //检查任务状态,
  466. //在 E_TWO_LEVEL_WORK 里面, 已经 设为 TASK_OVER 了.
  467. //等待发送方的新指令, (发送方会把状态改为回收, 表示这个任务结束)
  468. if ( mp_device_two_level_task->get_task_statu() == Task_Base::Task_statu::TASK_WITHDRAW )
  469. {
  470. //这里会通知任务已经释放, 然后销毁任务单, 并降级
  471. mp_device_two_level_task->set_task_statu(Task_Base::Task_statu::TASK_FREE);
  472. mp_device_two_level_task.reset();
  473. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
  474. }
  475. //任务单重新创建, 调度创建的新的任务,那么回去继续工作
  476. else if ( mp_device_two_level_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED )
  477. {
  478. mp_device_two_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  479. m_dispatch_device_status = DISPATCH_DEVICE_TWO_LEVEL_WORK;
  480. }
  481. //else //保持不动, 直到发送方给定新的任务,
  482. }
  483. else
  484. {
  485. //直接降级
  486. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
  487. }
  488. break;
  489. }
  490. case DISPATCH_DEVICE_ONE_LEVEL_WORK:
  491. {
  492. if ( mp_device_one_level_task.get() != NULL )
  493. {
  494. mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_WORKING);
  495. //执行一级任务,
  496. write_task_to_memory(mp_device_one_level_task);
  497. //更新通信
  498. update_device_communication();
  499. //从内存中读数据到任务单
  500. t_error = check_and_read_memory_to_task(mp_device_one_level_task);
  501. // std::cout << " huli test :::: " << " 1111111111111111111111111111111111111111 = " << 111 << std::endl;
  502. // std::cout << " huli test :::: " << " 12312312313131 = " << 123 << std::endl;
  503. // std::cout << " huli test :::: " << " t_error = " << t_error.to_string() << std::endl;
  504. // std::cout << " huli test :::: " << " 2222222222222222222222222222222222222222 = " << 222 << std::endl;
  505. if ( t_error == NODATA )
  506. {
  507. //设备正常运行
  508. //延时1ms, snap7的通信效率偏慢, 不需要高频率检查
  509. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  510. }
  511. else
  512. {
  513. if ( t_error != SUCCESS )
  514. {
  515. mp_device_one_level_task->set_task_error_manager(t_error);
  516. }
  517. end_task(mp_device_one_level_task);
  518. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_OVER;
  519. }
  520. }
  521. else
  522. {
  523. //直接降级
  524. m_dispatch_device_status = DISPATCH_DEVICE_READY;
  525. }
  526. break;
  527. }
  528. case DISPATCH_DEVICE_ONE_LEVEL_OVER:
  529. {
  530. //更新通信
  531. update_device_communication();
  532. if ( mp_device_one_level_task.get() != NULL )
  533. {
  534. //检查任务状态,
  535. //在 E_ONE_LEVEL_WORK 里面, 已经 设为 TASK_OVER 了.
  536. //等待发送方的新指令, (发送方会把状态改为回收, 表示这个任务结束)
  537. if ( mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_WITHDRAW )
  538. {
  539. //这里会通知任务已经释放, 然后销毁任务单, 并降级
  540. mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_FREE);
  541. mp_device_one_level_task.reset();
  542. m_dispatch_device_status = DISPATCH_DEVICE_READY;
  543. }
  544. //任务单重新创建, 调度创建的新的任务,那么回去继续工作
  545. else if ( mp_device_one_level_task->get_task_statu() == Task_Base::Task_statu::TASK_CREATED )
  546. {
  547. mp_device_one_level_task->set_task_statu(Task_Base::Task_statu::TASK_SIGNED);
  548. m_dispatch_device_status = DISPATCH_DEVICE_ONE_LEVEL_WORK;
  549. }
  550. //else //保持不动, 直到发送方给定新的任务,
  551. }
  552. else
  553. {
  554. //直接降级
  555. m_dispatch_device_status = DISPATCH_DEVICE_READY;
  556. }
  557. break;
  558. }
  559. case DISPATCH_DEVICE_FAULT:
  560. {
  561. //更新通信
  562. update_device_communication();
  563. //所有任务报错, 并销毁任务.
  564. if ( mp_device_one_level_task.get() != NULL )
  565. {
  566. //添加错误码
  567. Error_manager t_error(DISPATCH_DEVICE_STATUS_ERROR, MINOR_ERROR, "m_respons_status is error");
  568. mp_device_one_level_task->set_task_error_manager(t_error);
  569. end_task(mp_device_one_level_task);
  570. mp_device_one_level_task.reset();
  571. }
  572. if ( mp_device_two_level_task.get() != NULL )
  573. {
  574. //添加错误码
  575. Error_manager t_error(DISPATCH_DEVICE_STATUS_ERROR, MINOR_ERROR, "m_respons_status is error");
  576. mp_device_two_level_task->set_task_error_manager(t_error);
  577. end_task(mp_device_two_level_task);
  578. mp_device_two_level_task.reset();
  579. }
  580. if ( mp_device_three_level_task.get() != NULL )
  581. {
  582. //添加错误码
  583. Error_manager t_error(DISPATCH_DEVICE_STATUS_ERROR, MINOR_ERROR, "m_respons_status is error");
  584. mp_device_three_level_task->set_task_error_manager(t_error);
  585. end_task(mp_device_three_level_task);
  586. mp_device_three_level_task.reset();
  587. }
  588. break;
  589. }
  590. case DISPATCH_DEVICE_DISCONNECT:
  591. {
  592. //更新通信
  593. update_device_communication();
  594. //所有任务报错, 并销毁任务.
  595. if ( mp_device_one_level_task.get() != NULL )
  596. {
  597. //添加错误码
  598. Error_manager t_error(DISPATCH_DEVICE_STATUS_DISCONNECT, MINOR_ERROR, "m_respons_status is error");
  599. mp_device_one_level_task->set_task_error_manager(t_error);
  600. end_task(mp_device_one_level_task);
  601. mp_device_one_level_task.reset();
  602. }
  603. if ( mp_device_two_level_task.get() != NULL )
  604. {
  605. //添加错误码
  606. Error_manager t_error(DISPATCH_DEVICE_STATUS_DISCONNECT, MINOR_ERROR, "m_respons_status is error");
  607. mp_device_two_level_task->set_task_error_manager(t_error);
  608. end_task(mp_device_two_level_task);
  609. mp_device_two_level_task.reset();
  610. }
  611. if ( mp_device_three_level_task.get() != NULL )
  612. {
  613. //添加错误码
  614. Error_manager t_error(DISPATCH_DEVICE_STATUS_DISCONNECT, MINOR_ERROR, "m_respons_status is error");
  615. mp_device_three_level_task->set_task_error_manager(t_error);
  616. end_task(mp_device_three_level_task);
  617. mp_device_three_level_task.reset();
  618. }
  619. break;
  620. }
  621. case DISPATCH_DEVICE_READY:
  622. {
  623. //更新通信
  624. update_device_communication();
  625. break;
  626. }
  627. default:
  628. {
  629. break;
  630. }
  631. }
  632. }
  633. }
  634. LOG(INFO) << " Dispatch_device_base::execute_thread_fun() end "<< this;
  635. return;
  636. }
  637. //执行线程工作函数, 正在执行任务单.
  638. Error_manager Dispatch_device_base::execute_thread_working(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & device_status)
  639. {
  640. return Error_code::SUCCESS;
  641. }
  642. //执行线程工作函数, 已经完成任务单. 等待新的指令
  643. Error_manager Dispatch_device_base::execute_thread_over(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & device_status)
  644. {
  645. return Error_code::SUCCESS;
  646. }
  647. //把任务单写入到内存中, 子类必须重载
  648. Error_manager Dispatch_device_base::write_task_to_memory(std::shared_ptr<Task_Base> p_task)
  649. {
  650. return Error_code::SUCCESS;
  651. }
  652. //更新设备底层通信数据, 子类必须重载
  653. Error_manager Dispatch_device_base::update_device_communication()
  654. {
  655. return Error_code::SUCCESS;
  656. }
  657. //从内存中读数据到任务单, 子类必须重载
  658. Error_manager Dispatch_device_base::check_and_read_memory_to_task(std::shared_ptr<Task_Base> p_task)
  659. {
  660. return Error_code::SUCCESS;
  661. }
  662. //取消下发的指令
  663. Error_manager Dispatch_device_base::cancel_command()
  664. {
  665. //以后再写 need programe
  666. //目前调度和plc的通信指令做的很简单,没有暂停和急停 复位等操作.
  667. //这里先空着,以后再写.
  668. //调度模块单方面销毁任务, 不管底层plc的执行情况, 也不去告知plc任务取消.
  669. return Error_code::SUCCESS;
  670. }