Files
GPS-Navigator-/ETH/UdpServer/User/interface.h
2025-11-07 10:31:57 +08:00

333 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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-FFFFFFFF表示全部帧
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_ */