#ifndef RB_LIDAR_H #define RB_LIDAR_H #ifdef __cplusplus extern "C" { #endif #include // 包含标准整数类型 #include // 用于线程支持 typedef void (*callback_t)(const char* data, int length); // 配置常量 #define CONFIG_BLOCK_COUNT (16) #define CONFIG_UDP_BLOCKS (12) #define FRAME_POINT_COUNT (3600) #define SUBPKT_BUF_COUNT (300) #define UDP_BUF_SIZE (1206) // 结构体对齐设置 #pragma pack(push) #pragma pack(1) // 原始点数据结构 typedef struct { uint16_t dist_0; // 第一个距离 uint8_t rssi_0; // 第一个RSSI值 uint16_t dist_1; // 第二个距离 uint8_t rssi_1; // 第二个RSSI值 } raw_point_t; // 子包结构 typedef struct { uint16_t header; // 子包头 uint16_t azimuth; // 方位角 raw_point_t point[CONFIG_BLOCK_COUNT]; // 点数据数组 } sub_packet_t; // UDP包结构 typedef struct { sub_packet_t sub_packet[CONFIG_UDP_BLOCKS]; // 子包数组 uint32_t timestamp; // 时间戳 uint16_t factory_byte; // 工厂字节 } udp_packet_t; // 点数据结构 typedef struct { uint16_t azimuth; // 方位角 uint16_t dist; // 距离 uint16_t rssi; // RSSI值 uint32_t timestamp; // 时间戳 } point_data_t; // 帧数据结构 typedef struct { point_data_t pointcloud[FRAME_POINT_COUNT]; // 深度数据点云 } frame_data_t; #pragma pack(pop) // RBLidar 结构体 typedef struct { char* ip; int port; callback_t callback; sub_packet_t buffer[2][SUBPKT_BUF_COUNT]; // 双缓冲区 int current; // 当前缓冲区索引 int valid_count[2]; // 每个缓冲区中有效数据的数量 pthread_mutex_t mutex; pthread_cond_t cond; } RBLidar; // 创建 RBLidar 实例 RBLidar* rblidar_create(const char* ip, int port, callback_t callback); // 释放 RBLidar 实例 void rblidar_destroy(RBLidar* lidar); #ifdef __cplusplus } #endif #endif // RB_LIDAR_H