carrier_base.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // Created by huli on 2020/7/20.
  3. //
  4. #ifndef NNXX_TESTS_CARRIER_BASE_H
  5. #define NNXX_TESTS_CARRIER_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 "../dispatch/carrier_task.h"
  12. //搬运器的基类, 楚天项目就是电梯和中跑车的合并
  13. class Carrier_base
  14. {
  15. public:
  16. //搬运器底层通信延时5000ms
  17. #define CARRIER_COMMUNICATION_OVER_TIME_MS 5000
  18. //搬运器状态,
  19. enum Carrier_status
  20. {
  21. E_UNKNOW = 0, //未知
  22. E_READY = 1, //准备,待机
  23. E_BUSY = 2, //工作正忙
  24. E_ONE_LEVEL_WORK = 3, //一级工作状态, 就是普通的移动任务
  25. E_ONE_LEVEL_OVER = 4, //一级工作完成,
  26. E_TWO_LEVEL_WORK = 5, //二级工作状态, 就是紧急避让, 插队任务(会在执行一级任务的过程中, 插队并优先执行二级任务)
  27. E_TWO_LEVEL_OVER = 6, //一级工作完成,
  28. E_THREE_LEVEL_WORK = 7, //三级工作任务, 就是锁定硬件资源, 不让插队, (除非急停或者取消任务)
  29. E_THREE_LEVEL_OVER = 8, //一级工作完成,
  30. E_FAULT = 100, //故障
  31. E_DISCONNECT = 101, //通信故障
  32. };
  33. //指令完成状态, 搬运器答复指令, 返回任务完成的情况
  34. enum Respons_status
  35. {
  36. RESPONS_NORMAL = 0, //正常
  37. RESPONS_OVER = 1, //任务完成
  38. RESPONS_MINOR_ERROR = 100, //一般故障, 可恢复
  39. RESPONS_CRITICAL_ERROR = 101, //致命故障,不可恢复
  40. };
  41. public:
  42. Carrier_base();
  43. Carrier_base(const Carrier_base& other)= default;
  44. Carrier_base& operator =(const Carrier_base& other)= default;
  45. ~Carrier_base();
  46. public://API functions
  47. //搬运器 初始化
  48. virtual Error_manager carrier_base_init();
  49. //搬运器 反初始化
  50. virtual Error_manager carrier_base_uninit();
  51. //处理一级任务, 普通任务
  52. virtual Error_manager execute_one_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  53. //处理二级任务, 插队任务
  54. virtual Error_manager execute_two_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  55. //处理三级任务, 核心任务
  56. virtual Error_manager execute_three_level_task(std::shared_ptr<Carrier_task> p_carrier_task);
  57. //检查状态,是否正常运行
  58. Error_manager check_status();
  59. //注意了, 调度任务允许同时接受多个任务
  60. //判断能否执行一级任务
  61. Error_manager check_one_level_task();
  62. //判断能否执行二级任务
  63. Error_manager check_two_level_task();
  64. //判断能否执行三级任务
  65. Error_manager check_three_level_task();
  66. //结束任务单,里面会根据任务的故障等级修正 任务单的状态
  67. Error_manager end_task(std::shared_ptr<Carrier_task> carrier_task);
  68. //取消任务单,由发送方提前取消任务单
  69. Error_manager cancel_task(std::shared_ptr<Carrier_task> carrier_task);
  70. //判断是否为待机,如果已经准备好,则可以执行任务。
  71. bool is_ready();
  72. public://get or set member variable
  73. Carrier_status get_carrier_status();
  74. protected://member functions
  75. //执行外界任务的执行函数
  76. void execute_thread_fun();
  77. //更新设备底层通信数据
  78. virtual Error_manager update_device_communication();
  79. //取消下发的指令
  80. virtual Error_manager cancel_command();
  81. protected://member variable
  82. std::atomic<Carrier_status> m_carrier_status; //搬运器总状态, 控制任务流程
  83. int m_carrier_id; //搬运器id, (楚天项目和单元号对应)
  84. //下发到硬件
  85. //搬运器的目标车位
  86. unsigned short m_parkspace_unit_id; //车位单元号(楚天项目为1~3)
  87. unsigned short m_parkspace_floor_id; //车位楼层号(楚天项目为1~14)
  88. unsigned short m_parkspace_room_id; //车位同层的房间号 (楚天项目一楼为1~4, 楼上为1~6)
  89. std::string m_command_key; //任务唯一码, 用作识别
  90. unsigned char m_motion_direction; //调度方向, 根据停车取车选择出入口, 1=入口,0=非入口
  91. float m_car_center_x; //汽车的中心坐标x
  92. float m_car_center_y; //汽车的中心坐标y
  93. float m_car_angle; //汽车的旋转角(角度-90~90)
  94. //硬件反馈
  95. //搬运器当前坐标
  96. std::string m_respons_key; //应答的唯一码, 用作识别
  97. Respons_status m_respons_status; //指令完成状态, 搬运器答复指令, 返回任务完成的情况
  98. //硬件状态, 目前只做显示判断
  99. std::chrono::system_clock::time_point m_status_updata_time; //状态更新时间点
  100. unsigned char m_last_heartbeat; //上一次的心跳
  101. //硬件坐标,
  102. float m_carrier_coordinate_x; //搬运器坐标x轴, 中跑车控制横向移动
  103. float m_carrier_coordinate_y; //搬运器坐标y轴, (本模块默认为0, 由AGV模块去控制纵向移动)
  104. float m_carrier_coordinate_z; //搬运器坐标z轴, 电梯控制上下移动
  105. float m_carrier_angle; //搬运器角度
  106. //搬运器设备的状态(0bit为1:急停正常, 1bit为1:处于安全位置, 2bit为1:静止状态, 3bit为1:可执行新指令, 4bit为1:存在故障)
  107. unsigned char m_carrier_device_status; //搬运器设备的状态, 楚天项目就是中跑车
  108. unsigned char m_carrier_error_code[50]; //搬运器设备的报警信息位
  109. std::string m_carrier_error_description;//搬运器设备的报警状态描述
  110. //升降机设备的状态(0bit为1:急停正常, 1bit为1:处于安全位置, 2bit为1:静止状态, 3bit为1:可执行新指令, 4bit为1:存在故障)
  111. unsigned char m_elevator_device_status; //升降机设备状态, 楚天项目就是电梯
  112. unsigned char m_elevator_error_code[50]; //升降机设备的报警信息位
  113. std::string m_elevator_error_description;//升降机设备的报警状态描述
  114. //任务执行线程
  115. std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
  116. Thread_condition m_execute_condition; //执行的条件变量
  117. std::shared_ptr<Carrier_task> mp_carrier_one_level_task; //搬运器的普通任务, (一般移动和等待指令, 允许被打断)
  118. std::shared_ptr<Carrier_task> mp_carrier_two_level_task; //搬运器的优先任务, (紧急避让和插队指令, 允许打断普通任务)
  119. std::shared_ptr<Carrier_task> mp_carrier_three_level_task; //搬运器的核心任务, (锁定位置进行抓车和放车, 最高任务, 不允许打断和被打断)
  120. private:
  121. };
  122. #endif //NNXX_TESTS_CARRIER_BASE_H