333 lines
14 KiB
C
333 lines
14 KiB
C
#ifndef _INTERFACE_H_
|
||
#define _INTERFACE_H_
|
||
|
||
#include "stdint.h"
|
||
|
||
#include "app_config.h" // 假设包含基础配置和宏定义
|
||
#include "interface_config.h"
|
||
#include "debug.h"
|
||
|
||
|
||
|
||
#pragma pack(1)//数据结构一个字节对齐
|
||
|
||
|
||
#define request_read_id un_request_frame.bit_data.request_id//读取ID
|
||
#define request_header_id un_request_frame.bit_data.frame_header//帧头
|
||
|
||
|
||
#define FAULT 0
|
||
#define NORMAL 1
|
||
|
||
#define NMEA_BUF_SIZE 128
|
||
|
||
#define RX_BUFFER_LEN 1400
|
||
#define IMU_LEN 90
|
||
#define IMU_FRAME_LEN 42
|
||
|
||
|
||
|
||
|
||
typedef struct StrInfNavigationOutput
|
||
{
|
||
uint16_t frame_header; // 帧头 固定值0xAACC
|
||
uint16_t frame_type; // 帧类型 固定值0x0027
|
||
uint16_t frame_length; // 帧长 固定值49
|
||
uint8_t accumulated; // 累加值 按帧累加
|
||
|
||
/* 陀螺仪数据 (6字节) */
|
||
int16_t gyroscope_x_axis; // 陀螺X轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
int16_t gyroscope_y_axis; // 陀螺Y轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
int16_t gyroscope_z_axis; // 陀螺Z轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
|
||
/* 加速度计数据 (6字节) */
|
||
int16_t acceleration_x_axis; // 加表X轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
int16_t acceleration_y_axis; // 加表Y轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
int16_t acceleration_z_axis; // 加表Z轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
|
||
|
||
/* 磁力计数据 (6字节) */
|
||
int16_t magnetic_x_axis; // 磁力计X轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
int16_t magnetic_y_axis; // 磁力计Y轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
int16_t magnetic_z_axis; // 磁力计Z轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
|
||
/* 定位数据 (12字节) */
|
||
int32_t lon; // 经度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg
|
||
int32_t lat; // 纬度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg
|
||
int32_t high; // 高度 | 偏移量0 | 实际值=原始值×1e-3+0 | 单位:m
|
||
|
||
/* 导航数据 (11字节) */
|
||
uint8_t rtk_state; // RTK状态 | 偏移量0 | 0=不定位,1=单点,2=DGPS,4=RTK固定解,5=RTK浮点解
|
||
int16_t gps_speed; // GPS速度 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s
|
||
int16_t car_speed; // 车速 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s
|
||
int16_t dual_antenna_heading; // 双天线航向 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:度
|
||
int32_t time; // 时间 | 偏移量0 | 实际值=原始值/4000+0 | 单位:秒
|
||
|
||
/* 校验位 (1字节) */
|
||
uint8_t crc1; // CRC按照字节来接,取低8位 | 偏移量0
|
||
} StrInfNavigationOutput;
|
||
|
||
typedef union _UnInfNavigationOutput
|
||
{
|
||
StrInfNavigationOutput bit_data; // 使用定义的结构体变量名
|
||
unsigned char arr[sizeof(StrInfNavigationOutput)]; // 通过结构体类型确定大小
|
||
} UnInfNavigationOutput;
|
||
|
||
|
||
typedef struct {
|
||
/* 帧头 (3字节) */
|
||
// uint8_t header[3]; // 固定值0xBD 0xDB 0x0B
|
||
|
||
uint8_t header1; // 固定值0xBD 0xDB 0x0B
|
||
uint8_t header2; // 固定值0xBD 0xDB 0x0B
|
||
uint8_t header3; // 固定值0xBD 0xDB 0x0B
|
||
|
||
/* 姿态数据 (6字节) */
|
||
int16_t roll; // 横滚角 实际值=原始值×(360/32768) 单位:deg
|
||
int16_t pitch; // 俯仰角 实际值=原始值×(360/32768) 单位:deg
|
||
int16_t yaw; // 方位角 实际值=原始值×(360/32768) 单位:deg
|
||
|
||
/* 陀螺仪数据 (6字节) */
|
||
int16_t gyro_x; // 陀螺X轴 实际值=原始值×(300/32768) 单位:deg/s
|
||
int16_t gyro_y; // 陀螺Y轴 实际值=原始值×(300/32768) 单位:deg/s
|
||
int16_t gyro_z; // 陀螺Z轴 实际值=原始值×(300/32768) 单位:deg/s
|
||
|
||
/* 加速度计数据 (6字节) */
|
||
int16_t accel_x; // 加表X轴 实际值=原始值×(12/32768) 单位:g
|
||
int16_t accel_y; // 加表Y轴 实际值=原始值×(12/32768) 单位:g
|
||
int16_t accel_z; // 加表Z轴 实际值=原始值×(12/32768) 单位:g
|
||
|
||
/* 定位数据 (12字节) */
|
||
int32_t latitude; // 纬度 实际值=原始值×1e-7 单位:deg
|
||
int32_t longitude; // 经度 实际值=原始值×1e-7 单位:deg
|
||
int32_t altitude; // 高度 实际值=原始值×1e-3 单位:m
|
||
|
||
/* 速度数据 (6字节) */
|
||
int16_t velocity_north; // 北向速度 实际值=原始值×(100/32768) 单位:m/s
|
||
int16_t velocity_east; // 东向速度 实际值=原始值×(100/32768) 单位:m/s
|
||
int16_t velocity_down; // 地向速度 实际值=原始值×(100/32768) 单位:m/s
|
||
|
||
/* 状态数据 (5字节) */
|
||
uint8_t init_status; // Bit0:位置 Bit1:速度 Bit2:俯仰/横滚 Bit3:航向 (1=完成初始化)
|
||
uint8_t rtk_status; // 0:不定位 1:单点 2:DGPS 4:RTK固定解 5:RTK浮点解
|
||
uint8_t reserved[3]; // 预留字节
|
||
|
||
/* 导航数据 (10字节) */
|
||
uint16_t nav_status; // 导航状态位 (包含50、51、62等状态)
|
||
int16_t gps_speed; // GPS速度 实际值=原始值×0.01 单位:m/s
|
||
int16_t vehicle_speed; // 车速 实际值=原始值×0.01 单位:m/s
|
||
uint16_t dual_heading; // 双天线航向 实际值=原始值×0.01 单位:度
|
||
uint32_t timestamp; // 时间 实际值=原始值/4000 单位:秒
|
||
|
||
/* 类型和校验 (2字节) */
|
||
uint8_t data_type; // 数据类型
|
||
uint8_t checksum; // 异或校验 (0~56字节)
|
||
} StrInfNavigationRS232Output;
|
||
|
||
typedef union {
|
||
StrInfNavigationRS232Output bit_data;
|
||
uint8_t arr[sizeof(StrInfNavigationRS232Output)];
|
||
} UnInfNavigationRS232Output;
|
||
|
||
|
||
|
||
|
||
|
||
typedef struct StrInfNavigationOutputC
|
||
{
|
||
uint16_t frame_header; // 帧头 固定值0xAACC
|
||
uint16_t frame_type; // 帧类型 固定值0x0027
|
||
uint16_t frame_length; // 帧长 固定值49
|
||
uint8_t accumulated; // 累加值 按帧累加
|
||
|
||
/* 陀螺仪数据 (6字节) */
|
||
int16_t gyroscope_x_axis; // 陀螺X轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
int16_t gyroscope_y_axis; // 陀螺Y轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
int16_t gyroscope_z_axis; // 陀螺Z轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s
|
||
|
||
/* 加速度计数据 (6字节) */
|
||
int16_t acceleration_x_axis; // 加表X轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
int16_t acceleration_y_axis; // 加表Y轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
int16_t acceleration_z_axis; // 加表Z轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g
|
||
|
||
/* 四元数 (16字节) */
|
||
uint32_t q0; // 四元数标量分量(w) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲
|
||
uint32_t q1; // 四元数向量分量(x) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲
|
||
uint32_t q2; // 四元数向量分量(y) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲
|
||
uint32_t q3; // 四元数向量分量(z) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲
|
||
|
||
/* 磁力计数据 (6字节) */
|
||
int16_t magnetic_x_axis; // 磁力计X轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
int16_t magnetic_y_axis; // 磁力计Y轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
int16_t magnetic_z_axis; // 磁力计Z轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT
|
||
|
||
/* 定位数据 (12字节) */
|
||
int32_t lon; // 经度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg
|
||
int32_t lat; // 纬度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg
|
||
int32_t high; // 高度 | 偏移量0 | 实际值=原始值×1e-3+0 | 单位:m
|
||
|
||
/* 导航数据 (11字节) */
|
||
uint8_t rtk_state; // RTK状态 | 偏移量0 | 0=不定位,1=单点,2=DGPS,4=RTK固定解,5=RTK浮点解
|
||
int16_t gps_speed; // GPS速度 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s
|
||
int16_t car_speed; // 车速 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s
|
||
int16_t dual_antenna_heading; // 双天线航向 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:度
|
||
int32_t time; // 时间 | 偏移量0 | 实际值=原始值/4000+0 | 单位:秒
|
||
|
||
/* 校验位 (1字节) */
|
||
uint8_t crc1; // CRC按照字节来接,取低8位 | 偏移量0
|
||
} StrInfNavigationOutputC;
|
||
|
||
|
||
typedef union _UnInfNavigationOutputC
|
||
{
|
||
StrInfNavigationOutputC bit_data; // 使用定义的结构体变量名
|
||
unsigned char arr[sizeof(StrInfNavigationOutputC)]; // 通过结构体类型确定大小
|
||
} UnInfNavigationOutputC;
|
||
|
||
|
||
/* 车辆轮速输入数据结构体 */
|
||
typedef struct {
|
||
/* 四轮速度数据 (8字节) */
|
||
int16_t front_left_speed; // 左前轮速 单位:km/h
|
||
int16_t front_right_speed; // 右前轮速 单位:km/h
|
||
int16_t rear_left_speed; // 左后轮速 单位:km/h
|
||
int16_t rear_right_speed; // 右后轮速 单位:km/h
|
||
} StrVehicleWheelSpeedInput;
|
||
|
||
/* 轮速数据联合体(用于原始字节访问) */
|
||
typedef union {
|
||
StrVehicleWheelSpeedInput speed_data; // 结构化轮速数据
|
||
uint8_t arr[sizeof(StrVehicleWheelSpeedInput)]; // 原始字节数组
|
||
} UnWheelSpeedInput;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
typedef enum {
|
||
NMEA_TYPE_UNKNOWN = 0, // 未确定
|
||
NMEA_TYPE_GGA, // GGA协议
|
||
NMEA_TYPE_VTG, // VTG协议
|
||
NMEA_TYPE_THS // THS协议
|
||
} NMEA_FrameType;
|
||
|
||
|
||
typedef struct StrInfNMEAOutput
|
||
{
|
||
char buffer[NMEA_BUF_SIZE];
|
||
NMEA_FrameType frame_ready; // 0:未确定 1:GGA 2:VTG 3:THS
|
||
} StrInfNMEAOutput;
|
||
|
||
|
||
|
||
// 接收请求帧
|
||
typedef struct _StrRequestFrame
|
||
{
|
||
//--------------------------------------------------
|
||
unsigned int frame_header : 16; // 帧头 固定值0x0080
|
||
unsigned int frame_type : 16; // 帧类型 固定值0x0029
|
||
unsigned int frame_length : 16; // 帧长 固定值10
|
||
unsigned int accumulated : 8; // 累加值 按帧累加
|
||
unsigned int request_id : 16; // 请求帧ID 请求ID 0-FFFF,FFFF表示全部帧
|
||
unsigned int crc : 8; // CRC 按字节累加之和 取低8位
|
||
} StrRequestFrame;
|
||
|
||
typedef union _UnRequestFrame
|
||
{
|
||
StrRequestFrame bit_data; // 使用定义的结构体变量名
|
||
unsigned char arr[sizeof(StrRequestFrame)]; // 通过结构体类型确定大小
|
||
} UnRequestFrame;
|
||
|
||
|
||
// 接收请求帧
|
||
typedef struct _StrRequestMessage
|
||
{
|
||
uint8_t ip_adesser[8]; // IP地址
|
||
uint16_t port;
|
||
} StrRequestMessage;
|
||
|
||
|
||
// typedef struct {
|
||
// uint8_t data_id;
|
||
// uint8_t data_len;
|
||
// uint8_t data[4];
|
||
// }YisDateFrame;
|
||
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t dma_buffer[2][RX_BUFFER_LEN]; // 双缓冲
|
||
volatile uint8_t active_buf; // 当前活跃缓冲区索引
|
||
volatile uint16_t buf_len; // 当前活跃缓冲区索引
|
||
} rtcmBuffer;
|
||
|
||
|
||
typedef enum{
|
||
IIM46234 = 0,
|
||
YIS321,
|
||
}imu_type;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
uint8_t dma_buffer[2][IMU_LEN]; // 双缓冲
|
||
volatile uint8_t active_buf; // 当前活跃缓冲区索引
|
||
volatile uint16_t buf_len; // 当前活跃缓冲区索引
|
||
volatile imu_type type; // 类型
|
||
} imuBuffer;
|
||
|
||
|
||
|
||
|
||
//外部数据结构声明
|
||
|
||
|
||
// 设置输出加速度角速度数据
|
||
extern uint8_t set_output_data[20];
|
||
// 设定输出频率
|
||
extern uint8_t set_rate[20];
|
||
// 保存配置
|
||
extern uint8_t save_cmd[20];
|
||
// 进入流控模式,输出数据
|
||
extern uint8_t stream_cmd[20];
|
||
|
||
|
||
//变量
|
||
extern uint8_t test_app[26];
|
||
|
||
// 设置输出加速度角速度数据
|
||
extern uint8_t set_output_data[20];
|
||
// 设定输出频率
|
||
extern uint8_t set_rate[20];
|
||
// 保存配置
|
||
extern uint8_t save_cmd[20];
|
||
// 进入流控模式,输出数据
|
||
extern uint8_t stream_cmd[20];
|
||
|
||
extern UnInfNavigationOutput navigation_output1;
|
||
extern UnInfNavigationOutput navigation_output2;
|
||
extern UnInfNavigationOutputC navigation_outputC1;
|
||
extern StrInfNMEAOutput nema_output1 ;
|
||
|
||
extern UnInfNavigationRS232Output navigation_rs232_output;//串口输出数据
|
||
|
||
extern UnRequestFrame un_request_frame;//请求帧
|
||
|
||
extern StrRequestMessage str_RequestMessage;//请求信息
|
||
|
||
extern rtcmBuffer RTCM_Buffer1;
|
||
extern imuBuffer imu_buffer1;
|
||
|
||
|
||
//函数
|
||
void canSendAll(void *signal_id);
|
||
void ethernetSendAll(void *signal_id);
|
||
|
||
#pragma pack()
|
||
|
||
#endif /* _INTERFACE_H_ */
|