dispatch_device_base.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. //
  2. // Created by huli on 2021/3/3.
  3. //
  4. #ifndef NNXX_TESTS_DISPATCH_DEVICE_BASE_H
  5. #define NNXX_TESTS_DISPATCH_DEVICE_BASE_H
  6. #include "../error_code/error_code.h"
  7. #include <glog/logging.h>
  8. #include <thread>
  9. #include <mutex>
  10. #include "../tool/thread_condition.h"
  11. #include "../tool/common_data.h"
  12. #include "../tool/time_tool.h"
  13. #include "../task/task_base.h"
  14. #include "../dispatch/dispatch_communication.h"
  15. #include "../dispatch/dispatch_coordinates.h"
  16. //调度设备的基类.
  17. class Dispatch_device_base
  18. {
  19. public:
  20. //设备底层通信延时5000ms
  21. #define COMMUNICATION_OVER_TIME_MS 5000
  22. //调度默认 差值 2mm (运动过程中进行比较, 对精度要求较高)
  23. #define DISPATCH_DEFAULT_DIFFERENCE 2
  24. //调度设备类型
  25. enum Dispatch_device_type
  26. {
  27. DISPATCH_DEVICE_UNKNOWN = 0,
  28. DISPATCH_DEVICE_ROBOT_1 = 101,
  29. DISPATCH_DEVICE_ROBOT_2 = 102,
  30. DISPATCH_DEVICE_CARRIER_1 = 200,
  31. DISPATCH_DEVICE_CARRIER_2 = 207,
  32. DISPATCH_DEVICE_CARRIER_3 = 203,
  33. DISPATCH_DEVICE_PASSAGEWAY_0 = 300,
  34. DISPATCH_DEVICE_PASSAGEWAY_1 = 301,
  35. DISPATCH_DEVICE_PASSAGEWAY_2 = 302,
  36. DISPATCH_DEVICE_PASSAGEWAY_3 = 303,
  37. DISPATCH_DEVICE_PASSAGEWAY_4 = 304,
  38. DISPATCH_DEVICE_PASSAGEWAY_5 = 305,
  39. DISPATCH_DEVICE_PASSAGEWAY_6 = 306,
  40. DISPATCH_DEVICE_PASSAGEWAY_7 = 307,
  41. };
  42. //设备状态,这个类的总状态,这里指工作任务流程
  43. enum Dispatch_device_status
  44. {
  45. DISPATCH_DEVICE_UNKNOW = 0, //未知
  46. DISPATCH_DEVICE_READY = 1, //准备,待机
  47. DISPATCH_DEVICE_BUSY = 2, //工作正忙
  48. DISPATCH_DEVICE_ONE_LEVEL_OVER = 3, //一级工作完成,
  49. DISPATCH_DEVICE_ONE_LEVEL_WORK = 4, //一级工作状态, 就是普通的移动任务
  50. DISPATCH_DEVICE_TWO_LEVEL_OVER = 5, //二级工作完成,
  51. DISPATCH_DEVICE_TWO_LEVEL_WORK = 6, //二级工作状态, 就是紧急避让, 插队任务(会在执行一级任务的过程中, 插队并优先执行二级任务)
  52. DISPATCH_DEVICE_THREE_LEVEL_OVER = 7, //三级工作完成,
  53. DISPATCH_DEVICE_THREE_LEVEL_WORK = 8, //三级工作任务, 就是锁定硬件资源, 不让插队, (除非急停或者取消任务)
  54. DISPATCH_DEVICE_FAULT = 100, //故障
  55. DISPATCH_DEVICE_DISCONNECT = 101, //通信故障
  56. };
  57. //调度任务的等级
  58. enum Dispatch_task_level
  59. {
  60. // DISPATCH_TASK_UNKNOW_LEVEL = 0, //无效任务
  61. DISPATCH_TASK_ONE_LEVEL = 1, //一级任务
  62. DISPATCH_TASK_TWO_LEVEL = 2, //二级任务
  63. DISPATCH_TASK_THREE_LEVEL = 3, //三级任务
  64. };
  65. //抓车的夹杆
  66. enum Clamp_motion
  67. {
  68. E_CLAMP_NO_ACTION = 0, //无动作.
  69. E_CLAMP_TIGHT = 1, //夹紧夹杆
  70. E_CLAMP_LOOSE = 2, //松开夹杆
  71. };
  72. //中跑车和平层轨道的对接
  73. enum Joint_motion
  74. {
  75. E_JOINT_NO_ACTION = 0, //无动作.
  76. E_JOINT_HOLD_OUT = 1, //伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
  77. E_JOINT_TAKE_BACK = 2, //收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
  78. };
  79. //小跑车的位置,是否在中跑车上面
  80. enum Small_sports_car_motion
  81. {
  82. E_SMALL_SPORTS_NO_ACTION = 0, //无动作.
  83. E_SMALL_SPORTS_CAR_GET_AWAY = 1, //小跑车离开中跑车
  84. E_SMALL_SPORTS_CAR_GET_BACK = 2, //小跑车返回中跑车
  85. };
  86. //指令完成状态, 设备答复指令, 返回任务完成的情况
  87. enum Respons_status
  88. {
  89. RESPONS_WORKING = 0, //任务进行中
  90. RESPONS_OVER = 1, //任务完成
  91. RESPONS_MINOR_ERROR = 100, //一般故障, 可恢复
  92. RESPONS_CRITICAL_ERROR = 101, //致命故障,不可恢复
  93. };
  94. //设备的硬件设备状态
  95. enum Hardware_device_status
  96. {
  97. HARDWARE_DEVICE_UNKNOWN = 0, //设备未知
  98. HARDWARE_DEVICE_READY = 1, //设备空闲(可以接受新的指令任务)
  99. HARDWARE_DEVICE_WORKING = 2, //设备工作中
  100. HARDWARE_DEVICE_EMERGENCY_STOP = 3, //设备急停
  101. HARDWARE_DEVICE_UNSAFETY = 4, //设备不安全(暂时不考虑是否处于安全位置)
  102. HARDWARE_DEVICE_COLLISION = 5, //设备发生碰撞
  103. HARDWARE_DEVICE_FAULT = 6, //设备故障
  104. };
  105. //设备的负载状态, 小跑车上面是否有车.
  106. enum Load_status
  107. {
  108. LOAD_UNKNOWN = 0, //负载未知
  109. HAVE_CAR = 1, //有车
  110. NO_CAR = 2, //没车
  111. };
  112. //7号出口 转台方向
  113. enum Turntable_direction
  114. {
  115. TURNTABLE_DIRECTION_UNKNOWN = 0, //方向未知,
  116. TURNTABLE_DIRECTION_INSIDE = 1, //方向朝里,对接内门的小跑车
  117. TURNTABLE_DIRECTION_OUTSIDE = 2, //没车朝外,对接外门的出口
  118. };
  119. //出入口 门的开关状态
  120. enum Door_motion
  121. {
  122. DOOR_UNKNOWN = 0, //门的开关状态 未知, 或者工作到一半,正在工作中.
  123. DOOR_OPEN = 1, //开门
  124. DOOR_CLOSE = 2, //关门
  125. DOOR_ERROR = 3, //
  126. };
  127. //边界判断,是否超界
  128. enum Overstep_the_boundary
  129. {
  130. BOUNDARY_NORMAL = 0, //边界 正常
  131. BOUNDARY_OVERSTEP = 1, //超界
  132. };
  133. //机器手朝向角度
  134. #define CATCHER_DIRECTION_POSITIVE_MIN 70
  135. #define CATCHER_DIRECTION_POSITIVE_CENTER 90
  136. #define CATCHER_DIRECTION_POSITIVE_MAX 110
  137. #define CATCHER_DIRECTION_NEGATIVE_MIN 250
  138. #define CATCHER_DIRECTION_NEGATIVE_CENTER 270
  139. #define CATCHER_DIRECTION_NEGATIVE_MAX 290
  140. //机器手朝向
  141. enum Catcher_direction
  142. {
  143. CATCHER_DIRECTION_UNKNOW = 0, //
  144. CATCHER_DIRECTION_POSITIVE = 1, //朝正, 70~110度
  145. CATCHER_DIRECTION_NEGATIVE = 2, //朝反, 250~290度
  146. };
  147. public:
  148. Dispatch_device_base();
  149. Dispatch_device_base(const Dispatch_device_base& other)= default;
  150. Dispatch_device_base& operator =(const Dispatch_device_base& other)= default;
  151. ~Dispatch_device_base();
  152. public://API functions
  153. //设备 初始化
  154. virtual Error_manager dispatch_device_base_init(int device_id, int device_key);
  155. //设备 反初始化
  156. virtual Error_manager dispatch_device_base_uninit();
  157. //执行任务//注意了, 调度任务允许同时接受多个任务
  158. virtual Error_manager execute_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
  159. //执行任务//注意了, 调度任务允许同时接受多个任务
  160. virtual Error_manager execute_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level, std::string command_key, Common_data::Dispatch_process_type process_type);
  161. //检查任务类型, 子类必须重载, 用来检查输入的任务是否为子类所需的.
  162. virtual Error_manager check_task_type(std::shared_ptr<Task_Base> p_task);
  163. //判断能否执行任务
  164. virtual Error_manager check_task_level(Dispatch_task_level dispatch_task_level);
  165. //签收任务
  166. virtual Error_manager sign_for_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
  167. //签收任务 覆盖预约
  168. virtual Error_manager sign_for_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level, std::string command_key, Common_data::Dispatch_process_type process_type);
  169. //检查状态,是否正常运行. (工作状态 和 是否能接受对应的任务无关)
  170. virtual Error_manager check_status();
  171. //结束任务单,里面会根据任务的故障等级修正 任务单的状态
  172. virtual Error_manager end_task(std::shared_ptr<Task_Base> p_task);
  173. //取消任务单,由发送方提前取消任务单
  174. virtual Error_manager cancel_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
  175. //判断是否为待机,如果已经准备好,则可以执行任务。
  176. virtual bool is_ready();
  177. //判断是否可以执行存车任务。
  178. virtual bool is_able_excute_store();
  179. //判断是否可以执行取车任务。
  180. virtual bool is_able_excute_pickup();
  181. //判断是否已经预约了任务, return false没有预约任务, return true已经预约了任务
  182. virtual bool is_has_appoint_task(Dispatch_task_level dispatch_task_level);
  183. //预约任务
  184. virtual Error_manager appoint_task(std::string command_key, Common_data::Dispatch_process_type process_type, Dispatch_task_level dispatch_task_level);
  185. //修改任务等级
  186. virtual Error_manager change_task_level(Dispatch_task_level dispatch_task_level_source, Dispatch_task_level dispatch_task_level_target);
  187. public://get or set member variable
  188. Dispatch_device_status get_dispatch_device_status();
  189. //获取硬件设备的状态, 必须子类继承
  190. virtual Hardware_device_status get_actual_device_status();
  191. int get_device_id();
  192. bool get_break_flag();
  193. void set_break_flag(bool break_flag);
  194. virtual std::string get_current_command_key();
  195. protected://member functions
  196. //执行外界任务的执行函数
  197. void execute_thread_fun();
  198. //执行线程工作函数, 正在执行任务单.
  199. virtual Error_manager execute_thread_working(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & carrier_status);
  200. //执行线程工作函数, 已经完成任务单. 等待新的指令
  201. virtual Error_manager execute_thread_over(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & carrier_status);
  202. //把任务单写入到内存中, 子类必须重载
  203. virtual Error_manager write_task_to_memory(std::shared_ptr<Task_Base> p_task);
  204. //更新设备底层通信数据, 子类必须重载
  205. virtual Error_manager update_device_communication();
  206. //从内存中读数据到任务单, 子类必须重载
  207. virtual Error_manager check_and_read_memory_to_task(std::shared_ptr<Task_Base> p_task);
  208. //取消下发的指令, 子类必须重载, 用来向下发送命令取消任务.
  209. virtual Error_manager cancel_command();
  210. protected://member variable
  211. public:
  212. std::atomic<Dispatch_device_status> m_dispatch_device_status; //设备总状态, 控制任务流程(长流程)
  213. int m_device_id; //设备id, 索引
  214. int m_device_key; //设备唯一码, 自定义
  215. Dispatch_device_type m_dispatch_device_type;
  216. std::mutex m_lock; //锁
  217. //任务执行线程
  218. std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
  219. Thread_condition m_execute_condition; //执行的条件变量
  220. std::string m_device_one_level_command_key; //设备任务的唯一码, (用作任务预约)
  221. Common_data::Dispatch_process_type m_device_one_level_process_type; //调度任务类型
  222. std::shared_ptr<Task_Base> mp_device_one_level_task; //设备的普通任务, (一般移动和等待指令, 允许被打断)
  223. std::string m_device_two_level_command_key; //设备任务的唯一码, (用作任务预约)
  224. Common_data::Dispatch_process_type m_device_two_level_process_type; //调度任务类型
  225. std::shared_ptr<Task_Base> mp_device_two_level_task; //设备的优先任务, (紧急避让和插队指令, 允许打断普通任务)
  226. std::string m_device_three_level_command_key; //设备任务的唯一码, (用作任务预约)
  227. Common_data::Dispatch_process_type m_device_three_level_process_type; //调度任务类型
  228. std::shared_ptr<Task_Base> mp_device_three_level_task; //设备的核心任务, (锁定位置进行抓车和放车, 最高任务, 不允许打断和被打断)
  229. //task任务的流程由Dispatch_process来管理
  230. std::atomic<bool> m_break_flag; //打断标记位, 当接受2级任务时, 标记位改为true
  231. private:
  232. };
  233. #endif //NNXX_TESTS_DISPATCH_DEVICE_BASE_H