@@ -165,13 +165,6 @@ bool GNSS_LG290P::checkPPPRates()
165
165
// ----------------------------------------
166
166
bool GNSS_LG290P::configureGNSS ()
167
167
{
168
- // Skip configuring the GNSS receiver if no new changes are necessary
169
- if (settings.updateGNSSSettings == false )
170
- {
171
- systemPrintln (" LG290P configuration maintained" );
172
- return (true );
173
- }
174
-
175
168
for (int x = 0 ; x < 3 ; x++)
176
169
{
177
170
// Wait up to 5 seconds for device to come online
@@ -218,31 +211,45 @@ bool GNSS_LG290P::configureOnce()
218
211
Enable selected RTCM messages on COM2
219
212
*/
220
213
214
+ if (settings.gnssConfiguredOnce )
215
+ {
216
+ systemPrintln (" LG290P configuration maintained" );
217
+ return (true );
218
+ }
219
+
221
220
if (settings.debugGnss )
222
221
debuggingEnable (); // Print all debug to Serial
223
222
224
223
serialGNSS->flush (); // Remove any incoming characters
225
224
226
225
bool response = true ;
227
226
228
- response &= enterConfigMode ();
227
+ uint8_t retries = 4 ;
228
+
229
+ while ((retries > 0 ) && (!enterConfigMode (500 )))
230
+ {
231
+ retries--;
232
+ systemPrintf (" configureOnce: Enter config mode failed. %d retries remaining\r\n " , retries);
233
+ }
234
+
235
+ response &= (retries > 0 );
229
236
if (settings.debugGnss && response == false )
230
- systemPrintln (" ConfigureOnce : Enter config mode failed" );
237
+ systemPrintln (" configureOnce : Enter config mode failed" );
231
238
232
239
response &= setDataBaudRate (settings.dataPortBaud ); // LG290P UART1 is connected to CH342 (Port B)
233
240
response &= _lg290p->setPortBaudrate (2 , 115200 * 4 ); // LG290P UART2 is connected to the ESP32 UART1
234
241
response &= setRadioBaudRate (settings.radioPortBaud ); // LG290P UART3 is connected to the locking JST connector
235
242
if (settings.debugGnss && response == false )
236
- systemPrintln (" ConfigureOnce : setBauds failed" );
243
+ systemPrintln (" configureOnce : setBauds failed" );
237
244
238
245
// Enable PPS signal with a width of 200ms
239
246
response &= _lg290p->setPPS (200 , false , true ); // duration time ms, alwaysOutput, polarity
240
247
if (settings.debugGnss && response == false )
241
- systemPrintln (" ConfigureOnce : setPPS failed" );
248
+ systemPrintln (" configureOnce : setPPS failed" );
242
249
243
250
response &= setConstellations ();
244
251
if (settings.debugGnss && response == false )
245
- systemPrintln (" ConfigureOnce : setConstellations failed" );
252
+ systemPrintln (" configureOnce : setConstellations failed" );
246
253
247
254
// We do not set Rover or fix rate here because fix rate only applies in rover mode.
248
255
@@ -255,14 +262,13 @@ bool GNSS_LG290P::configureOnce()
255
262
systemPrintln (" LG290P configuration updated" );
256
263
257
264
// Save the current configuration into non-volatile memory (NVM)
258
- // We don't need to re-configure the LG290P at next boot
259
- bool settingsWereSaved = saveConfiguration ();
260
- if (settingsWereSaved)
261
- settings.updateGNSSSettings = false ;
265
+ response &= saveConfiguration ();
262
266
}
263
267
else
264
268
online.gnss = false ; // Take it offline
265
269
270
+ settings.gnssConfiguredOnce = response;
271
+
266
272
return (response);
267
273
}
268
274
@@ -282,13 +288,28 @@ bool GNSS_LG290P::configureRover()
282
288
return (false );
283
289
}
284
290
291
+ // If our settings haven't changed, trust GNSS's settings
292
+ if (settings.gnssConfiguredRover )
293
+ {
294
+ systemPrintln (" Skipping LG290P Rover configuration" );
295
+ return (true );
296
+ }
297
+
285
298
bool response = true ;
286
299
287
300
serialGNSS->flush (); // Remove any incoming characters
288
301
289
- response &= enterConfigMode ();
302
+ uint8_t retries = 4 ;
303
+
304
+ while ((retries > 0 ) && (!enterConfigMode (500 )))
305
+ {
306
+ retries--;
307
+ systemPrintf (" configureRover: Enter config mode failed. %d retries remaining\r\n " , retries);
308
+ }
309
+
310
+ response &= (retries > 0 );
290
311
if (settings.debugGnss && response == false )
291
- systemPrintln (" Rover : Enter config mode failed" );
312
+ systemPrintln (" configureRover : Enter config mode failed" );
292
313
293
314
// We must force receiver into Rover mode so that we can set fix rate
294
315
int currentMode = getMode ();
@@ -299,21 +320,21 @@ bool GNSS_LG290P::configureRover()
299
320
// fail because NMEA is not present.
300
321
_lg290p->setModeRover (); // Wait for save and reset
301
322
if (settings.debugGnss && response == false )
302
- systemPrintln (" Rover : Set mode rover failed" );
323
+ systemPrintln (" configureRover : Set mode rover failed" );
303
324
}
304
325
305
326
// Set the fix rate. Default on LG290P is 10Hz so set accordingly.
306
327
response &= setRate (settings.measurementRateMs / 1000.0 ); // May require save/reset
307
328
if (settings.debugGnss && response == false )
308
- systemPrintln (" Rover : Set rate failed" );
329
+ systemPrintln (" configureRover : Set rate failed" );
309
330
310
331
response &= enableRTCMRover ();
311
332
if (settings.debugGnss && response == false )
312
- systemPrintln (" Rover : Enable RTCM failed" );
333
+ systemPrintln (" configureRover : Enable RTCM failed" );
313
334
314
335
response &= enableNMEA ();
315
336
if (settings.debugGnss && response == false )
316
- systemPrintln (" Rover : Enable NMEA failed" );
337
+ systemPrintln (" configureRover : Enable NMEA failed" );
317
338
318
339
response &= exitConfigMode (); // We must exit config before we save otherwise we will save with NMEA/RTCM off
319
340
@@ -324,18 +345,17 @@ bool GNSS_LG290P::configureRover()
324
345
else
325
346
{
326
347
// Save the current configuration into non-volatile memory (NVM)
327
- // We don't need to re-configure the LG290P at next boot
328
- bool settingsWereSaved = saveConfiguration ();
329
- if (settingsWereSaved)
330
- settings.updateGNSSSettings = false ;
348
+ response &= saveConfiguration ();
331
349
332
350
// For RTCM and MSM messages to take effect (ie, PointPerfect is active) we must save/reset
333
351
softwareReset ();
334
352
335
- if (settings.debugGnss )
353
+ if (settings.debugGnss && response )
336
354
systemPrintln (" LG290P Rover configured" );
337
355
}
338
356
357
+ settings.gnssConfiguredRover = response;
358
+
339
359
return (response);
340
360
}
341
361
@@ -356,13 +376,28 @@ bool GNSS_LG290P::configureBase()
356
376
return (false );
357
377
}
358
378
379
+ if (settings.gnssConfiguredBase )
380
+ {
381
+ if (settings.debugGnss )
382
+ systemPrintln (" Skipping LG290P Base configuration" );
383
+ return true ;
384
+ }
385
+
359
386
bool response = true ;
360
387
361
388
serialGNSS->flush (); // Remove any incoming characters
362
389
363
- response &= enterConfigMode ();
390
+ uint8_t retries = 4 ;
391
+
392
+ while ((retries > 0 ) && (!enterConfigMode (500 )))
393
+ {
394
+ retries--;
395
+ systemPrintf (" configureBase: Enter config mode failed. %d retries remaining\r\n " , retries);
396
+ }
397
+
398
+ response &= (retries > 0 );
364
399
if (settings.debugGnss && response == false )
365
- systemPrintln (" Base : Enter config mode failed" );
400
+ systemPrintln (" configureBase : Enter config mode failed" );
366
401
367
402
// "When set to Base Station mode, the receiver will automatically disable NMEA message output and enable RTCM MSM4
368
403
// and RTCM3-1005 message output."
@@ -380,7 +415,7 @@ bool GNSS_LG290P::configureBase()
380
415
// fail because NMEA is not present.
381
416
_lg290p->setModeBase (false ); // Don't save and reset
382
417
if (settings.debugGnss && response == false )
383
- systemPrintln (" Base : Set mode base failed" );
418
+ systemPrintln (" configureBase : Set mode base failed" );
384
419
385
420
// Device should now have survey mode disabled
386
421
}
@@ -394,16 +429,16 @@ bool GNSS_LG290P::configureBase()
394
429
// fail because NMEA is not present.
395
430
disableSurveyIn (false ); // Don't save and reset
396
431
if (settings.debugGnss && response == false )
397
- systemPrintln (" Base : disable survey in failed" );
432
+ systemPrintln (" configureBase : disable survey in failed" );
398
433
}
399
434
400
435
response &= enableRTCMBase (); // Set RTCM messages
401
436
if (settings.debugGnss && response == false )
402
- systemPrintln (" Base : Enable RTCM failed" );
437
+ systemPrintln (" configureBase : Enable RTCM failed" );
403
438
404
439
response &= enableNMEA (); // Set NMEA messages
405
440
if (settings.debugGnss && response == false )
406
- systemPrintln (" Base : Enable NMEA failed" );
441
+ systemPrintln (" configureBase : Enable NMEA failed" );
407
442
408
443
response &= exitConfigMode (); // We must exit config before we save otherwise we will save with NMEA/RTCM off
409
444
@@ -414,21 +449,20 @@ bool GNSS_LG290P::configureBase()
414
449
else
415
450
{
416
451
// Save the current configuration into non-volatile memory (NVM)
417
- // We don't need to re-configure the LG290P at next boot
418
- bool settingsWereSaved = saveConfiguration ();
419
- if (settingsWereSaved)
420
- settings.updateGNSSSettings = false ;
452
+ response &= saveConfiguration ();
421
453
422
454
softwareReset ();
423
455
424
456
// When a device is changed from Rover to Base, NMEA messages settings do not survive PQTMSAVEPAR
425
457
// Re-enable NMEA post reset
426
- enableNMEA (); // Set NMEA messages
458
+ response &= enableNMEA (); // Set NMEA messages
427
459
428
- if (settings.debugGnss )
460
+ if (settings.debugGnss && response )
429
461
systemPrintln (" LG290P Base configured" );
430
462
}
431
463
464
+ settings.gnssConfiguredBase = response;
465
+
432
466
return (response);
433
467
}
434
468
@@ -454,11 +488,20 @@ bool GNSS_LG290P::configureNtpMode()
454
488
// ----------------------------------------
455
489
// Disable NMEA and RTCM on UART2 to reduce the serial traffic
456
490
// ----------------------------------------
457
- bool GNSS_LG290P::enterConfigMode ()
491
+ bool GNSS_LG290P::enterConfigMode (unsigned long waitForSemaphoreTimeout_millis )
458
492
{
459
493
if (online.gnss )
494
+ {
495
+ unsigned long start = millis ();
496
+ bool isBlocking;
497
+ do { // Wait for up to waitForSemaphoreTimeout for library to stop blocking
498
+ isBlocking = _lg290p->isBlocking ();
499
+ } while (isBlocking && (millis () < (start + waitForSemaphoreTimeout_millis)));
500
+
501
+ // This will fail if the library is still blocking, but it is worth a punt...
460
502
return (_lg290p->sendOkCommand (" $PQTMCFGPROT" ,
461
503
" ,W,1,2,00000000,00000000" )); // Disable NMEA and RTCM on the LG290P UART2
504
+ }
462
505
return (false );
463
506
}
464
507
@@ -1757,7 +1800,9 @@ void GNSS_LG290P::menuMessagesSubtype(int *localMessageRate, const char *message
1757
1800
printUnknown (incoming);
1758
1801
}
1759
1802
1760
- settings.updateGNSSSettings = true ; // Update the GNSS config at the next boot
1803
+ settings.gnssConfiguredOnce = false ; // Update the GNSS config at the next boot
1804
+ settings.gnssConfiguredBase = false ;
1805
+ settings.gnssConfiguredRover = false ;
1761
1806
1762
1807
clearBuffer (); // Empty buffer of any newline chars
1763
1808
}
0 commit comments