/*************************
sick 511 �״� �ļ����ݽ���
*************************/
#ifndef __SICK_511_LASER_FILE__HH
#define __SICK_511_LASER_FILE__HH
#include "Laser.h"
#include <fstream>
class CSick511FileLaser :
	public Laser_base
{
public:
	CSick511FileLaser(int id, Laser_proto::laser_parameter laser_param);
	virtual ~CSick511FileLaser();

	//雷达链接设备，为3个线程添加线程执行函数。
	virtual Error_manager connect_laser();
	//雷达断开链接，释放3个线程
	virtual Error_manager disconnect_laser();
	//对外的接口函数，负责接受并处理任务单，
	//input：p_laser_task 雷达任务单，基类的指针，指向子类的实例，（多态）
	//注：这个函数为虚函数，实际的处理任务的代码由子类重载并实现。
	virtual Error_manager execute_task(Task_Base* p_laser_task);
	//检查雷达状态,是否正常运行
	virtual Error_manager check_laser();
	//雷达的启动接口函数， 让雷达进行扫描，一般需要子类重载，不同的雷达开始方式不同。
	virtual Error_manager start_scan();
	//雷达的停止接口函数， 让雷达停止扫描，一般需要子类重载，不同的雷达结束方式不同。
	virtual Error_manager stop_scan();
	//结束任务单，stop之后，要检查线程状态和数据结果，然后才能 end_task
	virtual Error_manager end_task();

protected:
	//接受二进制消息的功能函数，每次只接受一个CBinaryData
	// 纯虚函数，必须由子类重载，
	virtual bool receive_buf_to_queue(Binary_buf& data);
	//将二进制消息转化为三维点云的功能函数，每次只转化一个CBinaryData，
	// 纯虚函数，必须由子类重载，
	virtual Buf_type transform_buf_to_points(Binary_buf* pData, std::vector<CPoint3D>& points);


protected:
	int FindHead(char* buf, int b_len);
	int FindTail(char* buf, int b_len);
protected:
	virtual bool GetData(Binary_buf* pData, std::vector<float>& distance,
		float& freq, float& start_angle);
	long Str0x2Long(const char* data, int len);

protected:
	std::ifstream	m_stream_read;
	std::string		m_file;
	bool			m_start_read;
	std::mutex		m_mutex;
};
#endif
