wanji_lidar_device.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef WJ_LIDAR_ENCAPSULATION_HH
  2. #define WJ_LIDAR_ENCAPSULATION_HH
  3. #include "async_client.h"
  4. #include "wj_716_lidar_protocol.h"
  5. #include "../error_code/error_code.h"
  6. #include "../tool/binary_buf.h"
  7. #include "../tool/thread_safe_queue.h"
  8. #include "wanji_lidar_scan_task.h"
  9. class Wanji_lidar_device
  10. {
  11. public:
  12. enum Wanji_lidar_device_status
  13. {//default = 0
  14. E_UNKNOWN = 0, //未知
  15. E_READY = 1, //正常待机
  16. E_DISCONNECT = 2, //断连
  17. E_BUSY = 3, //工作正忙
  18. E_FAULT =10, //故障
  19. };
  20. public:
  21. // 无参构造函数
  22. Wanji_lidar_device();
  23. // 析构函数
  24. ~Wanji_lidar_device();
  25. // 初始化
  26. Error_manager init(wj::wjLidarParams params);
  27. //反初始化
  28. Error_manager uninit();
  29. //对外的接口函数,负责接受并处理任务单,
  30. Error_manager execute_task(Task_Base* p_wanji_lidar_scan_task);
  31. //检查雷达状态,是否正常运行
  32. Error_manager check_status();
  33. //结束任务单,里面会根据任务的故障等级修正雷达管理模块的状态和任务单的状态
  34. Error_manager end_task();
  35. //取消任务单,由发送方提前取消任务单
  36. Error_manager cancel_task(Task_Base* p_wanji_lidar_scan_task);
  37. //判断是否为待机,如果已经准备好,则可以执行任务。
  38. bool is_ready();
  39. // 外部调用获取点云, 获取最新的, 如果没有就会等待点云刷新
  40. //input: p_mutex : 输入点云锁的指针
  41. //output: cloud : 输出点云智能指针, 本函数会将点云添加到cloud里面
  42. //input: command_time: 触发执行的时间点. 从command_time提前一个扫描周期, 然后取最新的点
  43. //input: timeout_ms:超时时间, 超时之后自动退出, 返回错误
  44. Error_manager get_latest_cloud(std::mutex* p_mutex, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  45. std::chrono::system_clock::time_point command_time, int timeout_ms=1500);
  46. //外部获取当前的点云, 就是往前一个周期内的, 如果没有就会报错, 不会等待
  47. Error_manager get_current_cloud(std::mutex* p_mutex, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud,
  48. std::chrono::system_clock::time_point command_time);
  49. public:
  50. Wanji_lidar_device_status get_status();
  51. protected:
  52. void updata_status();
  53. //mp_laser_manager_thread 线程执行函数,
  54. //thread_work 内部线程负责获取点云结果
  55. void execute_thread_fun();
  56. protected:
  57. //状态
  58. Wanji_lidar_device_status m_wanji_lidar_device_status;
  59. //子模块
  60. Async_Client m_async_client; //异步客户端, 负责雷达通信, 接受雷达数据
  61. Wj_716_lidar_protocol m_protocol; // 万集雷达协议
  62. //中间缓存
  63. Thread_safe_queue<Binary_buf*> m_communication_data_queue; //通信数据队列
  64. //任务执行线程
  65. std::thread* mp_execute_thread; //执行的线程指针,内存由本类管理
  66. Thread_condition m_execute_condition; //执行的条件变量
  67. Wanji_lidar_scan_task * mp_wanji_lidar_scan_task; //雷达设备任务单的指针,内存由发送方管理。
  68. };
  69. #endif // !WJ_LIDAR_ENCAPSULATION_HH