60
60
#include "fc/runtime_config.h"
61
61
62
62
typedef struct {
63
+ bool isDriverBased ;
63
64
portMode_t portMode ; // Port mode RX/TX (only for serial based)
64
65
bool hasCompass ; // Has a compass (NAZA)
65
66
void (* restart )(void ); // Restart protocol driver thread
@@ -77,42 +78,48 @@ baudRate_e gpsToSerialBaudRate[GPS_BAUDRATE_COUNT] = { BAUD_115200, BAUD_57600,
77
78
static gpsProviderDescriptor_t gpsProviders [GPS_PROVIDER_COUNT ] = {
78
79
/* NMEA GPS */
79
80
#ifdef USE_GPS_PROTO_NMEA
80
- { MODE_RX , false, & gpsRestartNMEA_MTK , & gpsHandleNMEA },
81
+ { false, MODE_RX , false, & gpsRestartNMEA_MTK , & gpsHandleNMEA },
81
82
#else
82
- { 0 , false, NULL , NULL },
83
+ { false, 0 , false, NULL , NULL },
83
84
#endif
84
85
85
86
/* UBLOX binary */
86
87
#ifdef USE_GPS_PROTO_UBLOX
87
- { MODE_RXTX , false, & gpsRestartUBLOX , & gpsHandleUBLOX },
88
+ { false, MODE_RXTX , false, & gpsRestartUBLOX , & gpsHandleUBLOX },
88
89
#else
89
- { 0 , false, NULL , NULL },
90
+ { false, 0 , false, NULL , NULL },
90
91
#endif
91
92
92
93
/* Stub */
93
- { 0 , false, NULL , NULL },
94
+ { false, 0 , false, NULL , NULL },
94
95
95
96
/* NAZA GPS module */
96
97
#ifdef USE_GPS_PROTO_NAZA
97
- { MODE_RX , true, & gpsRestartNAZA , & gpsHandleNAZA },
98
+ { false, MODE_RX , true, & gpsRestartNAZA , & gpsHandleNAZA },
98
99
#else
99
- { 0 , false, NULL , NULL },
100
+ { false, 0 , false, NULL , NULL },
100
101
#endif
101
102
102
103
/* UBLOX7PLUS binary */
103
104
#ifdef USE_GPS_PROTO_UBLOX
104
- { MODE_RXTX , false, & gpsRestartUBLOX , & gpsHandleUBLOX },
105
+ { false, MODE_RXTX , false, & gpsRestartUBLOX , & gpsHandleUBLOX },
105
106
#else
106
- { 0 , false, NULL , NULL },
107
+ { false, 0 , false, NULL , NULL },
107
108
#endif
108
109
109
110
/* MTK GPS */
110
111
#ifdef USE_GPS_PROTO_MTK
111
- { MODE_RXTX , false, & gpsRestartNMEA_MTK , & gpsHandleMTK },
112
+ { false, MODE_RXTX , false, & gpsRestartNMEA_MTK , & gpsHandleMTK },
112
113
#else
113
- { 0 , false, NULL , NULL },
114
+ { false, 0 , false, NULL , NULL },
114
115
#endif
115
116
117
+ /* MSP GPS */
118
+ #ifdef USE_GPS_PROTO_MSP
119
+ { true, 0 , false, & gpsRestartMSP , & gpsHandleMSP },
120
+ #else
121
+ { false, 0 , false, NULL , NULL },
122
+ #endif
116
123
};
117
124
118
125
PG_REGISTER_WITH_RESET_TEMPLATE (gpsConfig_t , gpsConfig , PG_GPS_CONFIG , 0 );
@@ -135,7 +142,7 @@ void gpsSetState(gpsState_e state)
135
142
136
143
static void gpsUpdateTime (void )
137
144
{
138
- if (!rtcHasTime () && gpsSol .flags .validTime ) {
145
+ if (!rtcHasTime () && gpsSol .flags .validTime && gpsSol . time . year != 0 ) {
139
146
rtcSetDateTime (& gpsSol .time );
140
147
}
141
148
}
@@ -220,6 +227,12 @@ void gpsInit(void)
220
227
return ;
221
228
}
222
229
230
+ // Shortcut for driver-based GPS (MSP)
231
+ if (gpsProviders [gpsState .gpsConfig -> provider ].isDriverBased ) {
232
+ gpsSetState (GPS_INITIALIZING );
233
+ return ;
234
+ }
235
+
223
236
serialPortConfig_t * gpsPortConfig = findSerialPortConfig (FUNCTION_GPS );
224
237
if (!gpsPortConfig ) {
225
238
featureClear (FEATURE_GPS );
0 commit comments