yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/*******************************************************************************
 * File Name         : GPS.h
 * Description       :
 * Created on        : 2019��3��11��
 * Author            : www.hido-studio.com
 *******************************************************************************/
#ifndef _GPS_H_
#define _GPS_H_
 
/*******************************************************************************
 *                              Include Files                                  *
 *******************************************************************************/
#include "HIDO_TypeDef.h"
#include "GPIO.h"
 
/*******************************************************************************
 *                                  Macro                                      *
 *******************************************************************************/
/* IM23A NAVI 数据 STATUS 状态字定义 */
#define IM23A_STATUS_FINIT          (0x00000001U) // 1  滤波器未初始化标志
#define IM23A_STATUS_READY          (0x00000002U) // 2  滤波器收敛完成标志
#define IM23A_STATUS_INACCURATE     (0x00000004U) // 3  滤波器收敛过程中
#define IM23A_STATUS_TILT_REJECT    (0x00000008U) // 4  倾角过大标志位
#define IM23A_STATUS_GNSS_REJECT    (0x00000010U) // 5  GNSS 定位数据差标志位
#define IM23A_STATUS_FRESET         (0x00000020U) // 6  滤波器重置标志位
#define IM23A_STATUS_FIX_RLS1       (0x00000040U) // 7  倾斜测量安装角估计阶段 1
#define IM23A_STATUS_FIX_RLS2       (0x00000080U) // 8  倾斜测量安装角估计阶段 2
#define IM23A_STATUS_FIX_RLS3       (0x00000100U) // 9  倾斜测量安装角估计阶段 3
#define IM23A_STATUS_FIX_RLS4       (0x00000200U) // 10 倾斜测量安装角估计阶段 4
#define IM23A_STATUS_FIX_RLS_OK     (0x00000400U) // 11 倾斜测量安装角估计完成
#define IM23A_STATUS_DIR1           (0x00002000U) // 12 初始化晃动方向 1
#define IM23A_STATUS_DIR2           (0x00004000U) // 13 初始化晃动方向 2
#define IM23A_STATUS_GNSS_LOST      (0x00010000U) // 14 滤波器判定 GNSS 数据无效
#define IM23A_STATUS_FINIT_OK       (0x00020000U) // 15 初始化完成标志
#define IM23A_STATUS_PPS_READY      (0x00040000U) // 16 收到 PPS 信号
#define IM23A_STATUS_SYNC_READY     (0x00080000U) // 17 模块时间同步成功
#define IM23A_STATUS_GNSS_CONNECT   (0x00100000U) // 18 模块解析到 RTK 数据
 
/*******************************************************************************
 *                             Type Definition                                 *
 *******************************************************************************/
typedef enum
{
    GPS_STATE_INVALID = 0,
    GPS_STATE_VALID,
} E_GPSState;
 
typedef enum
{
    GPS_LAT_SIGN_NORTH = 0,
    GPS_LAT_SIGN_SOUTH,
} E_GPSLatSign;
 
typedef enum
{
    GPS_LON_SIGN_EAST = 0,
    GPS_LON_SIGN_WEST,
} E_GPSLonSign;
 
typedef enum
{
    GPS_PIN_REST,
    GPS_PIN_EN,
 
    GPS_PIN_LAST,
} E_GPSPin;
 
typedef struct
{
    HIDO_UINT16 m_u16Speed;
    HIDO_UINT16 m_u16Dir; //direction
    HIDO_DOUBLE m_dLat; //latitude
    HIDO_DOUBLE m_dLon; //longitude
    E_GPSState m_eState;
    HIDO_UINT16 m_u16Year;
    HIDO_UINT8 m_u8Mon; //month
    HIDO_UINT8 m_u8Day;
    HIDO_UINT8 m_u8Hour;
    HIDO_UINT8 m_u8Min; //minute
    HIDO_UINT8 m_u8Sec; //second
}ST_GPS;
 
/* GPRMI数据包结构 */
typedef struct
{
    HIDO_UINT32 m_u32UTCTime;            // <1> UTC时间, hhmmss.ss格式 (centisecond)
    HIDO_UINT16 m_u16WeekNumber;         // <2> 周数 (IM23A无此字段, 默认0)
    HIDO_UINT32 m_u32TimeOfWeek;         // <3> 周内秒 (IM23A无此字段, 默认0)
    HIDO_DOUBLE m_dLatitude;             // <4> 纬度(°), 正数为北纬
    HIDO_DOUBLE m_dLongitude;            // <5> 经度(°), 正数为东经
    HIDO_FLOAT m_fAltitude;              // <6> 高程(m)
    HIDO_FLOAT m_fLatStdDev;             // <7> 纬度标准差(m) / 预留
    HIDO_FLOAT m_fLonStdDev;             // <8> 经度标准差(m) / 预留
    HIDO_FLOAT m_fAltStdDev;             // <9> 高程标准差(m) / 预留
    HIDO_FLOAT m_fEastVelocity;          // <10> 东方向速度(m/s)
    HIDO_FLOAT m_fNorthVelocity;         // <11> 北方向速度(m/s)
    HIDO_FLOAT m_fUpVelocity;            // <12> 天顶方向速度(m/s)
    HIDO_FLOAT m_fHorizontalVelStdDev;   // <13> 定位精度(来自IM23A字段11)
    HIDO_FLOAT m_fHeadingAngle;          // <14> 航向角(°) [IM23A原始为弧度,已转换为0-360°]
    HIDO_FLOAT m_fPitchAngle;            // <15> 俯仰角(°) [IM23A原始为弧度,已转换]
    HIDO_FLOAT m_fRollAngle;             // <16> 横滚角(°) [IM23A原始为弧度,已转换]
    HIDO_FLOAT m_fHeadingAngleStdDev;    // <17> 航向角标准差(°) / 预留
    HIDO_FLOAT m_fPitchAngleStdDev;      // <18> 俯仰角标准差(°) / 预留
    HIDO_FLOAT m_fRollAngleStdDev;       // <19> 横滚角标准差(°) / 预留
    HIDO_FLOAT m_fBaselineDistance;      // <20> 基线距离(m) / 预留
    HIDO_UINT8 m_u8SatelliteCount;       // <21> 卫星数量(如协议缺省则返回0)
    HIDO_UINT8 m_u8FixedAmbiguityCount;  // <22> 载波整周固定观测量个数(默认0)
    HIDO_UINT8 m_u8PositionQuality;      // <23> 定位质量指示(来自状态字低8位)
    HIDO_BOOL m_bValid;                  // 数据有效标志
 
    /* IM23A扩展字段 */
    HIDO_FLOAT m_fAccelBiasX;            // 加速度计 X 零偏
    HIDO_FLOAT m_fAccelBiasY;            // 加速度计 Y 零偏
    HIDO_FLOAT m_fAccelBiasZ;            // 加速度计 Z 零偏
    HIDO_FLOAT m_fGyroBiasX;             // 陀螺仪 X 零偏
    HIDO_FLOAT m_fGyroBiasY;             // 陀螺仪 Y 零偏
    HIDO_FLOAT m_fGyroBiasZ;             // 陀螺仪 Z 零偏
    HIDO_FLOAT m_fImuTemperature;        // 传感器温度(°C)
    HIDO_UINT32 m_u32StatusFlags;        // 状态字段(参见IM23A_STATUS_xxx宏定义)
}ST_GPRMI;
 
/* GPIMU数据包结构 */
typedef struct
{
    HIDO_UINT32 m_u32UTCTime;           // <1> UTC时间, hhmmss.sss格式
    HIDO_FLOAT m_fAccelX;                // <2> x轴加速度(g)
    HIDO_FLOAT m_fAccelY;                // <3> y轴加速度(g)
    HIDO_FLOAT m_fAccelZ;                // <4> z轴加速度(g)
    HIDO_FLOAT m_fGyroX;                 // <5> 陀螺x轴角速度(°/s)
    HIDO_FLOAT m_fGyroY;                 // <6> 陀螺y轴角速度(°/s)
    HIDO_FLOAT m_fGyroZ;                 // <7> 陀螺z轴角速度(°/s)
    HIDO_FLOAT m_fTemperature;           // <8> 传感器温度(℃)
    HIDO_UINT8 m_u8Checksum;             // <9> 异或校验和
    HIDO_BOOL m_bValid;                  // 数据有效标志
}ST_GPIMU;
 
/* GPGIG数据包结构 (fmig报文,包含位置信息、解状态和差分龄期) */
typedef struct
{
    HIDO_UINT32 m_u32UTCTime;           // UTC时间
    HIDO_DOUBLE m_dLatitude;            // 纬度(°), 正数为北纬
    HIDO_DOUBLE m_dLongitude;           // 经度(°), 正数为东经
    HIDO_UINT8 m_u8SatelliteCount;      // 卫星数量
    HIDO_UINT8 m_u8SolutionStatus;      // 解状态 (0=无效, 1=单点, 2=伪距差分, 4=RTK固定解, 5=RTK浮点解)
    HIDO_UINT8 m_u8DifferentialAge;     // 差分龄期(秒)
    HIDO_FLOAT m_fHRMS;                  // 水平精度HRMS
    HIDO_FLOAT m_fVRMS;                  // 垂直精度VRMS
    HIDO_FLOAT m_fHDOP;                  // 水平精度因子
    HIDO_FLOAT m_fVDOP;                  // 垂直精度因子
    HIDO_BOOL m_bValid;                  // 数据有效标志
}ST_GPGIG;
 
/*******************************************************************************
 *                             Global Function                                 *
 *******************************************************************************/
 
/*******************************************************************************
 * Function Name     : GPS_GetState
 * Description       : ��ȡGPS��λ״̬
 * Input             : None
 * Output            : None
 * Return            : ��λ״̬ 0 1 2 3
 * Author            : www.hido-studio.com
 * Modified Date:    : 2021��1��8��
 *******************************************************************************/
HIDO_UINT8 GPS_GetState(HIDO_VOID);
 
/*******************************************************************************
 * Function Name     : GPS_PinRegister
 * Description       : GPSģ��ܽ�ע��
 * Input             : _ePin �ܽŶ���
 *                   : _pstGPIOx GPIOx
 *                   : _u16GPIOPin GPIO_PIN_x
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2021��1��8��
 *******************************************************************************/
HIDO_VOID GPS_PinRegister(E_GPSPin _ePin, GPIO_TypeDef *_pstGPIOx, HIDO_UINT16 _u16GPIOPin);
 
/*******************************************************************************
 * Function Name     : GPS_Poll
 * Description       : GPS��ѯ����
 * Input             : None
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2021��1��8��
 *******************************************************************************/
HIDO_VOID GPS_Poll(void);
 
/*******************************************************************************
 * Function Name     : GPS_Init
 * Description       : GPSģ���ʼ��
 * Input             : None
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2021��1��8��
 *******************************************************************************/
HIDO_VOID GPS_Init(void);
 
/*******************************************************************************
 * Function Name     : GPS_GetGPRMI
 * Description       : 获取最新的GPRMI数据
 * Input             : _pstGPRMI - 存储GPRMI数据的结构体指针
 * Output            : None
 * Return            : HIDO_OK - 成功, HIDO_ERR - 失败
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年11月11日
 *******************************************************************************/
HIDO_INT32 GPS_GetGPRMI(ST_GPRMI *_pstGPRMI);
 
/*******************************************************************************
 * Function Name     : GPS_GetGPIMU
 * Description       : 获取最新的GPIMU数据
 * Input             : _pstGPIMU - 存储GPIMU数据的结构体指针
 * Output            : None
 * Return            : HIDO_OK - 成功, HIDO_ERR - 失败
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年11月11日
 *******************************************************************************/
HIDO_INT32 GPS_GetGPIMU(ST_GPIMU *_pstGPIMU);
 
/*******************************************************************************
 * Function Name     : GPS_GetCurrentENU
 * Description       : 获取当前ENU坐标(相对于开机后第一个固定解)
 * Input             : _enu - 存储ENU坐标的数组指针 [东, 北, 天]
 * Output            : None
 * Return            : HIDO_OK - 成功, HIDO_ERR - 失败或原点未初始化
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年12月3日
 *******************************************************************************/
HIDO_INT32 GPS_GetCurrentENU(float _enu[3]);
 
/*******************************************************************************
 * Function Name     : GPS_GetGPGIG
 * Description       : 获取最新的GPGIG数据(fmig报文,包含位置信息、解状态和差分龄期)
 * Input             : _pstGPGIG - 存储GPGIG数据的结构体指针
 * Output            : None
 * Return            : HIDO_OK - 成功, HIDO_ERR - 失败或数据无效
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年12月4日
 *******************************************************************************/
HIDO_INT32 GPS_GetGPGIG(ST_GPGIG *_pstGPGIG);
 
/*******************************************************************************
 * Function Name     : GPS_UploadGGA
 * Description       : 每秒上传一次GGA报文到4G(拼接fmin和fmig数据,经纬度来自fmig)
 * Input             : None
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年12月4日
 *******************************************************************************/
HIDO_VOID GPS_UploadGGA(HIDO_VOID);
 
/*******************************************************************************
 * Function Name     : GPS_FormatGGA
 * Description       : 将fmin和fmig数据格式化为标准GGA报文(经纬度优先使用fmig数据)
 * Input             : _pstGPRMI - fmin数据
 *                   : _pstGPGIG - fmig数据(包含经纬度信息)
 *                   : _pcBuffer - 输出缓冲区
 *                   : _u32BufferSize - 缓冲区大小
 * Output            : _pcBuffer
 * Return            : 实际写入的字符数,失败返回0
 * Author            : www.hido-studio.com
 * Modified Date:    : 2025年12月4日
 *******************************************************************************/
HIDO_UINT32 GPS_FormatGGA(const ST_GPRMI *_pstGPRMI, const ST_GPGIG *_pstGPGIG, 
                          HIDO_CHAR *_pcBuffer, HIDO_UINT32 _u32BufferSize);
 
#endif /* _GPS_H_ */