// // Created by huli on 2020/7/20. // #ifndef NNXX_TESTS_DISPATCH_MANAGER_H #define NNXX_TESTS_DISPATCH_MANAGER_H #include "../error_code/error_code.h" #include "../communication/communication_message.h" #include "../system/system_communication.h" #include "../tool/singleton.h" #include "../tool/thread_condition.h" #include "../tool/TaskQueue/TQFactory.h" #include "../tool/TaskQueue/BaseTask.h" //#include "../dispatch/carrier.h" //#include "../dispatch/catcher.h" //#include "../dispatch/passageway.h" //#include "../dispatch/dispatch_process.h" #include "../message/dispatch_control.pb.h" #include "../message/dispatch_message.pb.h" #include "../dispatch/dispatch_parameter.pb.h" #include "../dispatch/dispatch_plc.h" #include "../dispatch/dispatch_ground_lidar.h" #include "../dispatch/dispatch_singlechip.h" #include "../message/measure_message.pb.h" #include #include #include //lacate测量结果结构体, 整车的信息, typedef struct Locate_information { float locate_x; //整车的中心点x值, 四轮的中心 float locate_y; //整车的中心点y值, 四轮的中心 float locate_angle; //整车的旋转角, 四轮的旋转角 float locate_length; //整车的长度, 用于规避碰撞 float locate_width; //整车的宽度, 用于规避碰撞 float locate_height; //整车的高度, 用于规避碰撞 float locate_wheel_base; //整车的轮距, 前后轮的距离, 用于机器人或agv的抓车 float locate_wheel_width; //整车的轮距, 左右轮的距离, 用于机器人或agv的抓车 bool locate_correct; //整车的校准标记位 //注:理论上, 车宽和左右轮距应该是一样的, 但是实际上车宽比左右轮距略大, }Locate_information; //调度管理模块 class Dispatch_manager:public Singleton { // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。 friend class Singleton; public: //调度设备参数 #define DISPATCH_DEVICE_PARAMETER_PATH "../setting/dispatch_device.prototxt" //存车任务数量的限制, 大于等于限则, 则使用缓存位, 默认5个 #define DISPATCH_MANAHER_STORE_LIST_SIZE_LIMIT 5 //调度管理 的状态 enum Dispatch_manager_status { E_DISPATCH_MANAGER_UNKNOW = 0, //未知 E_DISPATCH_MANAGER_READY = 1, //准备,待机 E_DISPATCH_MANAGER_STORE = 2, //正在存车 E_DISPATCH_MANAGER_PICKUP = 3, //正在取车 E_DISPATCH_MANAGER_FAULT = 10, //故障 }; //调度方向, 停车取车 enum Dispatch_motion_direction { E_STORE_CAR =0, //停车, 出入口 -> 停车位 E_PICKUP_CAR =1, //取车, 停车位 -> 出入口 }; private: // 父类的构造函数必须保护,子类的构造函数必须私有。 Dispatch_manager(); public: //必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。 Dispatch_manager(const Dispatch_manager& other) = delete; Dispatch_manager& operator =(const Dispatch_manager& other) = delete; ~Dispatch_manager(); public://API functions //调度管理 初始化 Error_manager dispatch_manager_init(int dispatch_manager_id); Error_manager dispatch_manager_init(); //初始化 调度管理 模块。从文件读取 Error_manager dispatch_manager_init_from_protobuf(std::string prototxt_path); //初始化 调度管理 模块。从protobuf读取 Error_manager dispatch_manager_init_from_protobuf(Dispatch_proto::Dispatch_device_parameter_all& dispatch_device_parameter_all); //调度管理 反初始化 Error_manager dispatch_manager_uninit(); //调度管理 设备复位 Error_manager dispatch_manager_device_reset(); //对外的接口函数,负责接受并处理任务单, Error_manager execute_task(Dispatch_manager::Dispatch_motion_direction dispatch_motion_direction); //检查能否执行消息指令 Error_manager check_execute_msg(Communication_message* p_msg); //检查状态 Error_manager check_status(); //调度模块 //执行搬运请求(主控->调度管理) Error_manager execute_for_dispatch_request_msg(message::Dispatch_request_msg &dispatch_request_msg); //调度模块 答复数据异常 Error_manager send_dispatch_response_msg_with_error(message::Dispatch_request_msg &dispatch_request_msg, Error_manager error); //调度模块 //调度总规划的答复(调度算法->调度管理) Error_manager execute_for_dispatch_plan_response_msg(message::Dispatch_plan_response_msg &dispatch_plan_response_msg); //调度模块 //调度控制的任务请求(调度算法->调度管理) Error_manager execute_for_dispatch_control_request_msg(message::Dispatch_control_request_msg &dispatch_control_request_msg); //定时发送 调度管理的状态 Error_manager encapsulate_send_dispatch_manager_status(); //在流程的map 里面释放指定的流程 Error_manager release_dispatch_process(std::string command_key); //调度模块 ///地面雷达的状态消息(地面雷达->null) Error_manager execute_for_ground_status_msg(message::Ground_status_msg ground_status_msg); //调度模块 ///单片机的状态消息 Error_manager execute_for_singlechip_data_msg(message::Singlechip_data singlechip_data_msg, bool validity); public://get or set member variable Dispatch_manager_status get_dispatch_manager_status(); int get_dispatch_manager_id(); void set_dispatch_manager_id(int dispatch_id); protected: //资源分配 void resource_allocation(); public://member variable Dispatch_manager_status m_dispatch_manager_status; //调度管理 的状态 int m_dispatch_manager_id; //调度模块的id, (楚天项目就是单元号, 0~2) //流程控制 std::mutex m_lock; //线程池的锁, 增删流程时要加锁. //调度plc Dispatch_plc m_dispatch_plc; //调度plc Dispatch_ground_lidar m_dispatch_ground_lidar[2]; //调度地面雷达 Dispatch_singlechip m_dispatch_singlechip[4]; //调度单片机 //请求指令的list, 按照创建顺序排序, 先来后到, 停车和停车不能插队, 但是停车和取车可以插队. std::list m_dispatch_request_store_list; //存车请求指令的list, 内存由线程池管理 std::list m_dispatch_request_pickup_list; //取车请求指令的list, 内存由线程池管理 Common_data::Dispatch_motion_direction m_dispatch_motion_direction_next; //下一次的调度方向, 保证存车取车交替进行 std::map m_dispatch_response_store_map; //存车dafu de map, 内存由线程池管理, time_point std::map m_dispatch_response_pickup_map; //取车dafu de map, 内存由线程池管理, int:outlet_id std::chrono::system_clock::time_point m_store_updata_time; // std::chrono::system_clock::time_point m_pickup_updata_time; // //调度总管理的线程, 负责资源分配 std::thread* m_dispatch_manager_thread; //调度总管理的线程, 总控全局, 控制每个流程的先后顺序, 并合理的分配资源. Thread_condition m_dispatch_manager_condition; //调度总管理的条件变量, 总控全局, 控制每个流程的先后顺序, 并合理的分配资源. private: }; #endif //NNXX_TESTS_DISPATCH_MANAGER_H