/************************* sick 511 �״� tcpЭ�����ӿ��ư� *************************/ #pragma once #include "Laser.h" #include #include #include #include #include #define LASER_DATA_TIME_OUT 10000 class CTcpLaser : public Laser_base { public: CTcpLaser(int id, Laser_proto::laser_parameter laser_param); ~CTcpLaser(); //雷达链接设备,为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& points); private: bool Send(const char* sendbuf, int len); // ����ָ�� int Recv(char* recvbuf, int len); // �������� static int FindHead(char* buf, int b_len); static int FindTail(char* buf, int b_len); private: bool GetData(Binary_buf* pData, std::vector& distance, float& freq, float& start_angle); long Str0x2Long(const char* data, int len); private: #pragma region udp��ر��� int m_socket; //WSADATA m_wsd; struct sockaddr_in m_send_addr; std::mutex m_mutex; clock_t m_last_data_time; #pragma endregion };