123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- //
- // Created by huli on 2021/3/3.
- //
- #ifndef NNXX_TESTS_DISPATCH_DEVICE_BASE_H
- #define NNXX_TESTS_DISPATCH_DEVICE_BASE_H
- #include "../error_code/error_code.h"
- #include <glog/logging.h>
- #include <thread>
- #include <mutex>
- #include "../tool/thread_condition.h"
- #include "../task/task_base.h"
- #include "../dispatch/dispatch_communication.h"
- //调度设备的基类.
- class Dispatch_device_base
- {
- public:
- //设备底层通信延时5000ms
- #define COMMUNICATION_OVER_TIME_MS 5000
- //设备状态,这个类的总状态,这里指工作任务流程
- enum Dispatch_device_status
- {
- E_UNKNOW = 0, //未知
- E_READY = 1, //准备,待机
- E_BUSY = 2, //工作正忙
- E_ONE_LEVEL_OVER = 3, //一级工作完成,
- E_ONE_LEVEL_WORK = 4, //一级工作状态, 就是普通的移动任务
- E_TWO_LEVEL_OVER = 5, //一级工作完成,
- E_TWO_LEVEL_WORK = 6, //二级工作状态, 就是紧急避让, 插队任务(会在执行一级任务的过程中, 插队并优先执行二级任务)
- E_THREE_LEVEL_OVER = 7, //一级工作完成,
- E_THREE_LEVEL_WORK = 8, //三级工作任务, 就是锁定硬件资源, 不让插队, (除非急停或者取消任务)
- E_FAULT = 100, //故障
- E_DISCONNECT = 101, //通信故障
- };
-
- //调度任务的等级
- enum Dispatch_task_level
- {
- // E_UNKNOW_LEVEL = 0, //无效任务
- E_ONE_LEVEL = 1, //一级任务
- E_TWO_LEVEL = 2, //二级任务
- E_THREE_LEVEL = 3, //三级任务
- };
- //抓车的夹杆
- enum Clamp_motion
- {
- E_CLAMP_NO_ACTION = 0, //无动作.
- E_CLAMP_TIGHT = 1, //夹紧夹杆
- E_CLAMP_LOOSE = 2, //松开夹杆
- };
- //中跑车和平层轨道的对接
- enum Joint_motion
- {
- E_JOINT_NO_ACTION = 0, //无动作.
- E_JOINT_HOLD_OUT = 1, //伸出对接,之后中跑车可以x轴移动,电梯不能Z轴移动
- E_JOINT_TAKE_BACK = 2, //收回对接,之后中跑车固定在电梯上不能X轴移动,电梯可以Z轴移动
- };
- //小跑车的位置,是否在中跑车上面
- enum Small_sports_car_motion
- {
- E_SMALL_SPORTS_NO_ACTION = 0, //无动作.
- E_SMALL_SPORTS_CAR_GET_AWAY = 1, //小跑车离开中跑车
- E_SMALL_SPORTS_CAR_GET_BACK = 2, //小跑车返回中跑车
- };
- //指令完成状态, 设备答复指令, 返回任务完成的情况
- enum Respons_status
- {
- RESPONS_WORKING = 0, //任务进行中
- RESPONS_OVER = 1, //任务完成
- RESPONS_MINOR_ERROR = 100, //一般故障, 可恢复
- RESPONS_CRITICAL_ERROR = 101, //致命故障,不可恢复
- };
- //设备的硬件设备状态
- enum Device_status
- {
- DEVICE_UNKNOWN = 0, //设备未知
- DEVICE_READY = 1, //设备空闲(可以接受新的指令任务)
- DEVICE_WORKING = 2, //设备工作中
- DEVICE_EMERGENCY_STOP = 3, //设备急停
- DEVICE_UNSAFETY = 4, //设备不安全(暂时不考虑是否处于安全位置)
- DEVICE_COLLISION = 5, //设备发生碰撞
- DEVICE_FAULT = 6, //设备故障
- };
- //设备的负载状态, 小跑车上面是否有车.
- enum Load_status
- {
- LOAD_UNKNOWN = 0, //负载未知
- HAVE_CAR = 1, //有车
- NO_CAR = 2, //没车
- };
- public:
- Dispatch_device_base();
- Dispatch_device_base(const Dispatch_device_base& other)= default;
- Dispatch_device_base& operator =(const Dispatch_device_base& other)= default;
- ~Dispatch_device_base();
- public://API functions
- //设备 初始化
- virtual Error_manager dispatch_device_base_init(int device_id);
- //设备 反初始化
- virtual Error_manager dispatch_device_base_uninit();
- //执行任务//注意了, 调度任务允许同时接受多个任务
- virtual Error_manager execute_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
- //检查任务类型, 子类必须重载, 用来检查输入的任务是否为子类所需的.
- virtual Error_manager check_task_type(std::shared_ptr<Task_Base> p_task);
- //判断能否执行任务
- virtual Error_manager check_task_level(Dispatch_task_level dispatch_task_level);
- //签收任务
- virtual Error_manager sign_for_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
- //检查状态,是否正常运行. (工作状态 和 是否能接受对应的任务无关)
- virtual Error_manager check_status();
- //判断是否为待机,如果已经准备好,则可以执行任务。
- virtual bool is_ready();
- //结束任务单,里面会根据任务的故障等级修正 任务单的状态
- virtual Error_manager end_task(std::shared_ptr<Task_Base> p_task);
- //取消任务单,由发送方提前取消任务单
- virtual Error_manager cancel_task(std::shared_ptr<Task_Base> p_task, Dispatch_task_level dispatch_task_level);
- public://get or set member variable
- Dispatch_device_status get_dispatch_device_status();
- //获取硬件设备的状态, 必须子类继承
- virtual Device_status get_actual_device_status();
- protected://member functions
- //执行外界任务的执行函数
- void execute_thread_fun();
- //执行线程工作函数, 正在执行任务单.
- virtual Error_manager execute_thread_working(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & carrier_status);
- //执行线程工作函数, 已经完成任务单. 等待新的指令
- virtual Error_manager execute_thread_over(std::shared_ptr<Task_Base> p_task, Dispatch_device_status & carrier_status);
- //把任务单写入到内存中, 子类必须重载
- virtual Error_manager write_task_to_memory(std::shared_ptr<Task_Base> p_task);
- //更新设备底层通信数据, 子类必须重载
- virtual Error_manager update_device_communication();
- //从内存中读数据到任务单, 子类必须重载
- virtual Error_manager check_and_read_memory_to_task(std::shared_ptr<Task_Base> p_task);
- //取消下发的指令, 子类必须重载, 用来向下发送命令取消任务.
- virtual Error_manager cancel_command();
- protected://member variable
- std::atomic<Dispatch_device_status> m_dispatch_device_status; //设备总状态, 控制任务流程
- int m_device_id; //设备id,
- std::mutex m_lock; //锁
- //任务执行线程
- std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
- Thread_condition m_execute_condition; //执行的条件变量
- std::shared_ptr<Task_Base> mp_device_one_level_task; //设备的普通任务, (一般移动和等待指令, 允许被打断)
- std::shared_ptr<Task_Base> mp_device_two_level_task; //设备的优先任务, (紧急避让和插队指令, 允许打断普通任务)
- std::shared_ptr<Task_Base> mp_device_three_level_task; //设备的核心任务, (锁定位置进行抓车和放车, 最高任务, 不允许打断和被打断)
- private:
- };
- #endif //NNXX_TESTS_DISPATCH_DEVICE_BASE_H
|