@startuml
skinparam classAttributeIconSize 0

<<<<<<< HEAD
title  Laser_task 雷达模块的任务指令
=======
title  binary_buf是二进制缓存
>>>>>>> origin/hl

note left of Laser_task
//laser_task_command，是雷达任务指令的相关功能
//功能：用作应用层向laser模块传输任务，的指令消息

//用法：应用层直接调用laser的接口函数，并将Laser_task类作为参数传递
//CLaser类则按照Laser_task的功能码和指定的参数，执行相应的功能
//并将结果填充到Laser_task，返回给应用层
end note


class Laser_task
{
//雷达模块的任务指令，从Task_Base继承，
//补充了雷达专属的数据输入和输出
==public:==
    //构造函数，构造函数锁定任务类型为LASER_TASK，后续不允许更改
    Laser_task();
    //析构函数
    ~Laser_task();
..
    //初始化任务单，必须初始化之后才可以使用，（必选参数）
    // input:task_statu 任务状态
    // output:p_task_point_cloud 三维点云容器的智能指针
    // input:p_task_cloud_lock 三维点云的数据保护锁
    //注：task_frame_maxnum默认为0，如果为0，则使用laser默认的点云的采集帧数最大值 TASK_FRAME_MAXNUM_DEFAULT
    Error_manager task_init(Task_statu task_statu,
                            pcl::PointCloud<pcl::PointXYZ>::Ptr p_task_point_cloud,
                            std::mutex* p_task_cloud_lock);
..
    //初始化任务单，必须初始化之后才可以使用，（可选参数）
    //    input:task_statu任务状态
    //    input:task_statu_information状态说明
    //    input:task_frame_maxnum点云的采集帧数最大值
    //    output:p_task_point_cloud 三维点云容器的智能指针
    // input:p_task_cloud_lock 三维点云的数据保护锁
    //注：task_frame_maxnum默认为0，如果为0，则使用laser默认的点云的采集帧数最大值 TASK_FRAME_MAXNUM_DEFAULT
    Error_manager task_init(Task_statu task_statu,
                            std::string & task_statu_information,
                            unsigned int task_frame_maxnum,
                            pcl::PointCloud<pcl::PointXYZ>::Ptr p_task_point_cloud,
                            std::mutex* p_task_cloud_lock);
..
    //push点云，把 point_xyz 添加到 p_task_point_cloud 里面。
    Error_manager task_push_point(pcl::PointXYZ point_xyz);
==public:==
    //获取 点云的采集帧数最大值
    unsigned int get_task_frame_maxnum();
    //获取采集的点云保存路径
    std::string get_task_save_path();
    //获取 三维点云容器的智能指针
    pcl::PointCloud<pcl::PointXYZ>::Ptr get_task_point_cloud();
..
    //设置 任务状态
    void set_task_statu(Task_statu task_statu);
    //设置 任务状态说明
    void set_task_statu_information(std::string & task_statu_information);
    //设置 点云的采集帧数最大值
    void set_task_frame_maxnum(unsigned int task_frame_maxnum);
    //设置采集的点云保存路径
    void set_task_save_path(std::string task_save_path);
    //设置 三维点云容器的智能指针
    void set_task_point_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr p_task_point_cloud);
    //设置 错误码
    void set_task_error_manager(Error_manager & error_manager);
==protected:==
    //点云的采集帧数最大值，任务输入
    unsigned int                    m_task_frame_maxnum;
    //点云保存文件的路径，任务输入
    std::string                     m_task_save_path;
    //三维点云的数据保护锁，任务输入
    std::mutex*                     mp_task_cloud_lock;
    //采集结果，三维点云容器的智能指针，任务输出
    //这里只是指针，实际内存由应用层管理，初始化时必须保证内存有效。
    pcl::PointCloud<pcl::PointXYZ>::Ptr        mp_task_point_cloud;
}


class Task_Base
{
//任务单基类
==public:==
    //初始化任务单,初始任务单类型为 UNKONW_TASK
    virtual Error_manager init();
..
    //更新任务单
    Error_manager update_statu(Task_statu task_statu,std::string statu_information="");
..
    //获取任务类型
    Task_type   get_task_type();
..
    //获取任务单状态
    Task_statu  get_statu();
..
    //获取状态说明
    std::string get_statu_information();
==protected:==
    Task_type                   m_task_type;                    //任务类型
    Task_statu                  m_task_statu;                   //任务状态
    std::string                 m_task_statu_information;       //任务状态说明
	Error_manager               m_task_error_manager;//错误码，任务故障信息，任务输出
}

Laser_task <-- Task_Base : inherit

@enduml