Update navigation_fixedwing.c
[inav.git] / src / main / io / gps.h
blobe887dae254bee968abe95d174f0c94c2c0023faf
1 /*
2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
18 #pragma once
20 #include <stdbool.h>
22 #include "config/parameter_group.h"
24 #include "common/time.h"
26 #define GPS_DBHZ_MIN 0
27 #define GPS_DBHZ_MAX 55
29 #define LAT 0
30 #define LON 1
32 #define GPS_DEGREES_DIVIDER 10000000L
34 typedef enum {
35 GPS_NMEA = 0,
36 GPS_UBLOX,
37 GPS_UBLOX7PLUS,
38 GPS_MSP,
39 GPS_PROVIDER_COUNT
40 } gpsProvider_e;
42 typedef enum {
43 SBAS_AUTO = 0,
44 SBAS_EGNOS,
45 SBAS_WAAS,
46 SBAS_MSAS,
47 SBAS_GAGAN,
48 SBAS_NONE
49 } sbasMode_e;
51 #define SBAS_MODE_MAX SBAS_GAGAN
53 typedef enum {
54 GPS_BAUDRATE_115200 = 0,
55 GPS_BAUDRATE_57600,
56 GPS_BAUDRATE_38400,
57 GPS_BAUDRATE_19200,
58 GPS_BAUDRATE_9600,
59 GPS_BAUDRATE_230400,
60 GPS_BAUDRATE_COUNT
61 } gpsBaudRate_e;
63 typedef enum {
64 GPS_AUTOCONFIG_OFF = 0,
65 GPS_AUTOCONFIG_ON,
66 } gpsAutoConfig_e;
68 typedef enum {
69 GPS_AUTOBAUD_OFF = 0,
70 GPS_AUTOBAUD_ON
71 } gpsAutoBaud_e;
73 typedef enum {
74 GPS_DYNMODEL_PEDESTRIAN = 0,
75 GPS_DYNMODEL_AIR_1G,
76 GPS_DYNMODEL_AIR_4G,
77 } gpsDynModel_e;
79 typedef enum {
80 GPS_NO_FIX = 0,
81 GPS_FIX_2D,
82 GPS_FIX_3D
83 } gpsFixType_e;
85 #define GPS_BAUDRATE_MAX GPS_BAUDRATE_9600
87 typedef struct gpsConfig_s {
88 gpsProvider_e provider;
89 sbasMode_e sbasMode;
90 gpsAutoConfig_e autoConfig;
91 gpsAutoBaud_e autoBaud;
92 gpsDynModel_e dynModel;
93 bool ubloxUseGalileo;
94 uint8_t gpsMinSats;
95 } gpsConfig_t;
97 PG_DECLARE(gpsConfig_t, gpsConfig);
99 typedef struct gpsCoordinateDDDMMmmmm_s {
100 int16_t dddmm;
101 int16_t mmmm;
102 } gpsCoordinateDDDMMmmmm_t;
104 /* LLH Location in NEU axis system */
105 typedef struct gpsLocation_s {
106 int32_t lat; // Latitude * 1e+7
107 int32_t lon; // Longitude * 1e+7
108 int32_t alt; // Altitude in centimeters (meters * 100)
109 } gpsLocation_t;
111 #define HDOP_SCALE (100)
113 typedef struct gpsSolutionData_s {
114 struct {
115 bool hasNewData;
116 bool gpsHeartbeat; // Toggle each update
117 bool validVelNE;
118 bool validVelD;
119 bool validMag;
120 bool validEPE; // EPH/EPV values are valid - actual accuracy
121 bool validTime;
122 } flags;
124 gpsFixType_e fixType;
125 uint8_t numSat;
127 gpsLocation_t llh;
128 int16_t magData[3];
129 int16_t velNED[3];
131 int16_t groundSpeed;
132 int16_t groundCourse;
134 uint16_t eph; // horizontal accuracy (cm)
135 uint16_t epv; // vertical accuracy (cm)
137 uint16_t hdop; // generic HDOP value (*HDOP_SCALE)
139 dateTime_t time; // GPS time in UTC
141 } gpsSolutionData_t;
143 typedef struct {
144 uint16_t lastMessageDt;
145 uint32_t errors; // gps error counter - crc error/lost of data/sync etc..
146 uint32_t timeouts;
147 uint32_t packetCount;
148 } gpsStatistics_t;
150 extern gpsSolutionData_t gpsSol;
151 extern gpsStatistics_t gpsStats;
153 struct magDev_s;
154 void gpsPreInit(void);
155 void gpsInit(void);
156 // Called periodically from GPS task. Returns true iff the GPS
157 // information was updated.
158 bool gpsUpdate(void);
159 void updateGpsIndicator(timeUs_t currentTimeUs);
160 bool isGPSHealthy(void);
161 bool isGPSHeadingValid(void);
162 struct serialPort_s;
163 void gpsEnablePassthrough(struct serialPort_s *gpsPassthroughPort);
164 void mspGPSReceiveNewData(const uint8_t * bufferPtr);