// // Created by huli on 2020/9/9. // #ifndef NNXX_TESTS_WANJI_MANAGER_H #define NNXX_TESTS_WANJI_MANAGER_H #include "../tool/thread_condition.h" #include "../tool/singleton.h" #include "../error_code/error_code.h" #include #include #include "../wanji_lidar/wanji_lidar_device.h" #include "../wanji_lidar/region_worker.h" #include "../wanji_lidar/wanji_manager_task.h" #include "../wanji_lidar/wj_lidar_conf.pb.h" class Wanji_manager:public Singleton { public: // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。 friend class Singleton; //万集管理任务超时时间1000ms, #define WANJI_MANAGER_EXECUTE_TIMEOUT_MS 1000 //万集配置参数的默认路径 #define WANJI_MANAGER_PARAMETER_PATH "../setting/wanji_manager.prototxt" public: //雷达管理的状态 enum Wanji_manager_status { E_UNKNOWN = 0, //未知 E_READY = 1, //准备,待机 E_BUSY = 2, //工作正忙 E_ISSUED_SCAN = 3, //下发任务, 获取点云 E_WAIT_SCAN = 4, //等待任务, 扫描点云 E_ISSUED_DETECT = 5, //下发任务, 算法预测 E_WAIT_DETECT = 6, //等待任务, 算法预测 E_FAULT = 10, //故障 }; private: Wanji_manager(); public: Wanji_manager(const Wanji_manager& other)= delete; Wanji_manager& operator =(const Wanji_manager& other)= delete; ~Wanji_manager(); public://API functions //初始化 雷达 管理模块。如下三选一 Error_manager wanji_manager_init(); //初始化 雷达 管理模块。从文件读取 Error_manager wanji_manager_init_from_protobuf(std::string prototxt_path); //初始化 雷达 管理模块。从protobuf读取 Error_manager wanji_manager_init_from_protobuf(wj::wjManagerParams& wanji_parameters); //反初始化 雷达 管理模块。 Error_manager wanji_manager_uninit(); //对外的接口函数,负责接受并处理任务单, Error_manager execute_task(Task_Base* p_wanji_manager_task); //结束任务单,里面会根据任务的故障等级修正雷达管理模块的状态和任务单的状态 Error_manager end_task(); //取消任务单,由发送方提前取消任务单 Error_manager cancel_task(Task_Base* p_wanji_manager_task); //检查雷达状态,是否正常运行 Error_manager check_status(); //判断是否为待机,如果已经准备好,则可以执行任务。 bool is_ready(); public://get or set member variable Wanji_manager_status get_status(); std::map & get_wanji_lidar_device_map(); std::map & get_region_worker_map(); protected://member functions //自动收集点云的线程函数 void collect_cloud_thread_fun(); //开始自动预测的算法线程 Error_manager start_auto_detect(); //关闭自动预测的算法线程 Error_manager stop_auto_detect(); //执行外界任务的执行函数 void execute_thread_fun(); protected://member variable //状态 Wanji_manager_status m_wanji_manager_status; //万集管理模块的状态 std::map m_wanji_lidar_device_map; // 万集雷达实例指针数组, 内存由本类管理 std::map m_region_worker_map; // 区域功能实例指针数组, 内存由本类管理 //万集雷达的自动功能, 定时收集所有点云, 然后通知detect去计算车轮信息. std::mutex m_cloud_collection_mutex; // 点云更新互斥锁 pcl::PointCloud::Ptr mp_cloud_collection; //扫描点的点云集合, 内存由本类管理 std::chrono::system_clock::time_point m_cloud_updata_time; //扫描点的更新时间. std::thread* mp_collect_cloud_thread; //收集点云的线程指针,内存由本类管理 Thread_condition m_collect_cloud_condition; //收集点云的条件变量 //任务执行线程 std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理 Thread_condition m_execute_condition; //执行的条件变量 Wanji_manager_task* mp_wanji_manager_task; //万集管理模块的任务单的指针,内存由发送方管理。 private: }; #endif //NNXX_TESTS_WANJI_MANAGER_H