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

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

#include "laser_task_command.h"
//构造函数，构造函数锁定任务类型为LASER_TASK，后续不允许更改
Laser_task::Laser_task()
{
    //构造函数锁定任务类型为LASER_TASK，后续不允许更改
    m_task_type = LASER_TASK;
    m_task_statu = TASK_CREATED;
    //m_task_statu_information默认为空

    m_task_frame_maxnum = 0;
    mp_task_point_cloud = NULL;
    //m_task_error_manager 默认为空
    mp_task_cloud_lock=NULL;
}
//析构函数
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 Laser_task::task_init(Task_statu task_statu,
                                    pcl::PointCloud<pcl::PointXYZ>* p_task_point_cloud,
                                    std::mutex* p_task_cloud_lock)
{
    if(p_task_point_cloud == NULL)
    {
        return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
                             "Laser_task::task_init p_task_point_cloud is null");
    }
    if(p_task_cloud_lock==NULL)
    {
        return Error_manager(POINTER_IS_NULL,MINOR_ERROR,"laser task input lock is null");
    }

    m_task_statu = task_statu;
    m_task_statu_information.clear();

    m_task_frame_maxnum = TASK_FRAME_MAXNUM_DEFAULT;
    mp_task_cloud_lock=p_task_cloud_lock;
    mp_task_point_cloud = p_task_point_cloud;
    m_task_error_manager.error_manager_clear_all();

    return Error_code::SUCCESS;
}

//初始化任务单，必须初始化之后才可以使用，（可选参数）
//    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 Laser_task::task_init(Task_statu task_statu,
                                    std::string & task_statu_information,
                                    unsigned int task_frame_maxnum,
                                    pcl::PointCloud<pcl::PointXYZ>* p_task_point_cloud,
                                    std::mutex* p_task_cloud_lock)
{
    if(p_task_point_cloud == NULL)
    {
        return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
                             "Laser_task::task_init p_task_point_cloud is null");
    }
    if(p_task_cloud_lock==NULL)
    {
        return Error_manager(POINTER_IS_NULL,MINOR_ERROR,"laser task input lock is null");
    }

    m_task_statu = task_statu;
    m_task_statu_information = task_statu_information;

    if(task_frame_maxnum == 0)
    {
        m_task_frame_maxnum = TASK_FRAME_MAXNUM_DEFAULT;
    }
    else
    {
        m_task_frame_maxnum = task_frame_maxnum;
    }
    mp_task_cloud_lock=p_task_cloud_lock;
    mp_task_point_cloud = p_task_point_cloud;
    m_task_error_manager.error_manager_clear_all();

    return Error_code::SUCCESS;
}

//push点云，把 point_xyz 添加到 p_task_point_cloud 里面。
Error_manager Laser_task::task_push_point(pcl::PointXYZ point_xyz)
{
    if(mp_task_cloud_lock==NULL)
    {
        return Error_manager(POINTER_IS_NULL,MINOR_ERROR,
                             "push_point laser task input lock is null");
    }
    if(mp_task_point_cloud==NULL)
    {
        return Error_manager(Error_code::POINTER_IS_NULL, Error_level::MINOR_ERROR,
                             "Laser_task::task_push_point p_task_point_cloud is null");
    }
    //加锁，并添加三维点。
    mp_task_cloud_lock->lock();
    mp_task_point_cloud->push_back(point_xyz);
    mp_task_cloud_lock->unlock();
    return SUCCESS;
}




//获取 点云的采集帧数最大值
unsigned int Laser_task::get_task_frame_maxnum()
{
    return m_task_frame_maxnum;
}
//获取采集的点云保存路径
std::string Laser_task::get_task_save_path()
{
    return m_task_save_path;
}
//获取 三维点云容器的智能指针
pcl::PointCloud<pcl::PointXYZ>* Laser_task::get_task_point_cloud()
{
    return mp_task_point_cloud;
}




//设置 任务状态
void Laser_task::set_task_statu(Task_statu task_statu)
{
    m_task_statu = task_statu;
}
//设置 任务状态说明
void Laser_task::set_task_statu_information(std::string & task_statu_information)
{
    m_task_statu_information = task_statu_information;
}
//设置 点云的采集帧数最大值
void Laser_task::set_task_frame_maxnum(unsigned int task_frame_maxnum)
{
    m_task_frame_maxnum = task_frame_maxnum;

}
//设置采集的点云保存路径
void Laser_task::set_task_save_path(std::string task_save_path)
{
    m_task_save_path=task_save_path;
}
//设置 三维点云容器的智能指针
void Laser_task::set_task_point_cloud(pcl::PointCloud<pcl::PointXYZ>* p_task_point_cloud)
{
    mp_task_point_cloud = p_task_point_cloud;
}
//设置 错误码
void Laser_task::set_task_error_manager(Error_manager & error_manager)
{
    m_task_error_manager = error_manager;
}

//获取采集的点云保存路径
std::string Laser_task::get_save_path()
{
    return m_save_path;
}
//设置采集的点云保存路径
void Laser_task::set_save_path(std::string save_path)
{
    m_save_path=save_path;
}






