//
// Created by huli on 2020/9/8.
//

#include "wanji_lidar_scan_task.h"

//构造函数，构造函数锁定任务类型为LASER_TASK，后续不允许更改
Wanji_lidar_scan_task::Wanji_lidar_scan_task()
{
	//构造函数锁定任务类型为 WANJI_LIDAR_SCAN，后续不允许更改
	m_task_type = WANJI_LIDAR_SCAN;
	m_task_statu = TASK_CREATED;
	m_task_statu_information.clear();
	m_task_error_manager.error_manager_clear_all();

	mp_task_point_cloud = NULL;
	mp_task_cloud_lock = NULL;
}
//析构函数
Wanji_lidar_scan_task::~Wanji_lidar_scan_task()
{

}

//初始化任务单，必须初始化之后才可以使用，（必选参数）
// input:p_task_cloud_lock 三维点云的数据保护锁
// output:p_task_point_cloud 三维点云容器的智能指针
//注：task_frame_maxnum默认为0，如果为0，则使用laser默认的点云的采集帧数最大值 TASK_FRAME_MAXNUM_DEFAULT
Error_manager Wanji_lidar_scan_task::task_init(std::chrono::system_clock::time_point command_time,
											   std::mutex* p_task_cloud_lock,
											   pcl::PointCloud<pcl::PointXYZ>::Ptr p_task_point_cloud)
{
	if(p_task_point_cloud.get() == NULL)
	{
		return Error_manager(POINTER_IS_NULL, MINOR_ERROR,
							 "Wanji_lidar_scan_task::task_init p_task_point_cloud is null");
	}
	if(p_task_cloud_lock==NULL)
	{
		return Error_manager(POINTER_IS_NULL,MINOR_ERROR,
							 "Laser_manager_task::task_init p_task_cloud_lock is null");
	}

	m_task_statu = TASK_CREATED;
	m_task_statu_information.clear();
	m_task_error_manager.error_manager_clear_all();

	m_command_time = command_time;
	mp_task_cloud_lock=p_task_cloud_lock;
	mp_task_point_cloud = p_task_point_cloud;

	return Error_code::SUCCESS;
}

//初始化任务单，必须初始化之后才可以使用，（可选参数）
//    input:task_statu 任务状态
//    input:task_statu_information 状态说明
//    input:tast_receiver 接受对象
//    input:task_over_time 超时时间
//    input:task_frame_maxnum 点云的采集帧数最大值
//    input:task_save_flag 是否保存
//    input:task_save_path 保存路径
//    input:p_task_cloud_lock 三维点云的数据保护锁
//    output:p_task_point_cloud 三维点云容器的智能指针
//注：task_frame_maxnum默认为0，如果为0，则使用laser默认的点云的采集帧数最大值 TASK_FRAME_MAXNUM_DEFAULT
Error_manager Wanji_lidar_scan_task::task_init(Task_statu task_statu,
											   std::string task_statu_information,
											   void* p_tast_receiver,
											   std::chrono::milliseconds task_over_time,
											   std::chrono::system_clock::time_point command_time,
											   std::mutex* p_task_cloud_lock,
											   pcl::PointCloud<pcl::PointXYZ>::Ptr p_task_point_cloud
)
{
	if(p_task_point_cloud.get() == NULL)
	{
		return Error_manager(POINTER_IS_NULL, MINOR_ERROR,
							 "Wanji_lidar_scan_task::task_init p_task_point_cloud is null");
	}
	if(p_task_cloud_lock==NULL)
	{
		return Error_manager(POINTER_IS_NULL,MINOR_ERROR,
							 "Laser_manager_task::task_init p_task_cloud_lock is null");
	}

	m_task_statu = task_statu;
	m_task_statu_information = task_statu_information;
	mp_tast_receiver = p_tast_receiver;
	m_task_over_time = task_over_time;
	m_task_error_manager.error_manager_clear_all();

	m_command_time = command_time;
	mp_task_cloud_lock=p_task_cloud_lock;
	mp_task_point_cloud = p_task_point_cloud;

	return Error_code::SUCCESS;
}

std::chrono::system_clock::time_point Wanji_lidar_scan_task::get_command_time()
{
	return m_command_time;
}


//获取 三维点云容器的智能指针
std::mutex*  Wanji_lidar_scan_task::get_task_cloud_lock()
{
	return mp_task_cloud_lock;
}
//获取 三维点云容器的智能指针
pcl::PointCloud<pcl::PointXYZ>::Ptr Wanji_lidar_scan_task::get_task_point_cloud()
{
	return mp_task_point_cloud;
}
