/* * Laser_manager 是雷达模块的总管理类。 * Laser_manager 作为一个单例,全局可以使用。 get_instance 系列的函数可获取唯一的实例。 * 它作为一个独立的模块,不和外部有直接的联系。 * 对外只有一个接口函数 execute_task 用以执行 任务单 Laser_manager_task * * Laser_manager 模块内部包含了所有的雷达指针。 * 还自带一个线程,用来控制雷达。 * * 注意了: * std::vector m_laser_vector; //雷达的对象实例,内存由本类管理 * Livox_driver 单例 大疆雷达的底层驱动 * 这2个平级, 都归 Laser_manager 控制管理. * * */ #ifndef LASER_MANAGER_H #define LASER_MANAGER_H #include "../error_code/error_code.h" #include "../tool/singleton.h" #include "../tool/thread_condition.h" #include "../laser/Laser.h" #include "../laser/laser_manager_task.h" #define LASER_PARAMETER_PATH "../setting/laser.prototxt" class Laser_manager:public Singleton { // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。 friend class Singleton; public: //雷达管理模块的工作状态 enum Laser_manager_status {//default LASER_MANAGER_UNKNOW = 0 LASER_MANAGER_UNKNOW = 0, //未知 LASER_MANAGER_READY = 1, //准备,待机 LASER_MANAGER_ISSUED_TASK = 2, //工作下发任务 LASER_MANAGER_WAIT_REPLY = 3, //工作等待答复 LASER_MANAGER_FAULT = 4, //故障 }; private: // 父类的构造函数必须保护,子类的构造函数必须私有。 Laser_manager(); public: // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。 Laser_manager(const Laser_manager&)=delete; Laser_manager& operator =(const Laser_manager&)= delete; ~Laser_manager(); public: //API 对外接口 //初始化 雷达 管理模块。如下三选一 Error_manager laser_manager_init(); //初始化 雷达 管理模块。从文件读取 Error_manager laser_manager_init_from_protobuf(std::string prototxt_path); //初始化 雷达 管理模块。从protobuf读取 Error_manager laser_manager_init_from_protobuf(Laser_proto::Laser_parameter_all& laser_parameters); //反初始化 雷达 管理模块。 Error_manager laser_manager_uninit(); //对外的接口函数,负责接受并处理任务单, //input:p_laser_task 雷达任务单,基类的指针,指向子类的实例,(多态) Error_manager execute_task(Task_Base* p_laser_task); //检查雷达状态,是否正常运行 Error_manager check_status(); //结束任务单,里面会根据任务的故障等级修正雷达管理模块的状态和任务单的状态 Error_manager end_task(); //取消任务单,由发送方提前取消任务单 Error_manager cancel_task(); //释放下发的任务单 Error_manager laser_task_map_clear_and_delete(); //判断是否为待机,如果已经准备好,则可以执行任务。 bool is_ready(); public://get or set member variable Laser_manager_status get_laser_manager_status(); std::vector & get_laser_vector(); protected: //下发给子雷达任务。这里为下发雷达任务分配内存, 后续要记得回收 m_laser_task_map 。 Error_manager issued_task(int laser_index); //故障处理,下发任务的故障处理. Error_manager troubleshoot_for_issued_task(Error_manager error, int laser_index); //mp_laser_manager_thread 线程执行函数, //thread_work 内部线程负责分发扫描任务给下面的雷达,并且回收汇总雷达的数据 void thread_work(); protected://member variable //子雷达 // int m_laser_number; //雷达的个数 std::vector m_laser_vector; //雷达的对象实例,内存由本类管理 //注意:里面的Laser_base*是在init里面new出来的,析构之前必须使用ununit来销毁 Laser_manager_status m_laser_manager_status; //雷达管理模块的工作状态 std::atomic m_laser_manager_working_flag; //雷达管理的工作使能标志位 map m_laser_task_map; //雷达管理下发给雷达子模块的任务map,内存由本类管理 std::thread* mp_laser_manager_thread; //雷达管理的线程指针,内存由本类管理 Thread_condition m_laser_manager_condition; //雷达管理的条件变量 //雷达管理的任务单指针,实际内存由发送方控制管理,//接受任务后,指向新的任务单 Laser_manager_task * mp_laser_manager_task; //雷达管理任务单的指针,内存由发送方管理。 private: }; #endif //LASER_MANAGER_H