@@ -224,24 +224,32 @@ bool GNSS_LG290P::configureOnce()
224224
225225 bool response = true ;
226226
227- 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 );
228236 if (settings.debugGnss && response == false )
229- systemPrintln (" ConfigureOnce : Enter config mode failed" );
237+ systemPrintln (" configureOnce : Enter config mode failed" );
230238
231239 response &= setDataBaudRate (settings.dataPortBaud ); // LG290P UART1 is connected to CH342 (Port B)
232240 response &= _lg290p->setPortBaudrate (2 , 115200 * 4 ); // LG290P UART2 is connected to the ESP32 UART1
233241 response &= setRadioBaudRate (settings.radioPortBaud ); // LG290P UART3 is connected to the locking JST connector
234242 if (settings.debugGnss && response == false )
235- systemPrintln (" ConfigureOnce : setBauds failed" );
243+ systemPrintln (" configureOnce : setBauds failed" );
236244
237245 // Enable PPS signal with a width of 200ms
238246 response &= _lg290p->setPPS (200 , false , true ); // duration time ms, alwaysOutput, polarity
239247 if (settings.debugGnss && response == false )
240- systemPrintln (" ConfigureOnce : setPPS failed" );
248+ systemPrintln (" configureOnce : setPPS failed" );
241249
242250 response &= setConstellations ();
243251 if (settings.debugGnss && response == false )
244- systemPrintln (" ConfigureOnce : setConstellations failed" );
252+ systemPrintln (" configureOnce : setConstellations failed" );
245253
246254 // We do not set Rover or fix rate here because fix rate only applies in rover mode.
247255
@@ -291,9 +299,17 @@ bool GNSS_LG290P::configureRover()
291299
292300 serialGNSS->flush (); // Remove any incoming characters
293301
294- 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 );
295311 if (settings.debugGnss && response == false )
296- systemPrintln (" Rover : Enter config mode failed" );
312+ systemPrintln (" configureRover : Enter config mode failed" );
297313
298314 // We must force receiver into Rover mode so that we can set fix rate
299315 int currentMode = getMode ();
@@ -304,21 +320,21 @@ bool GNSS_LG290P::configureRover()
304320 // fail because NMEA is not present.
305321 _lg290p->setModeRover (); // Wait for save and reset
306322 if (settings.debugGnss && response == false )
307- systemPrintln (" Rover : Set mode rover failed" );
323+ systemPrintln (" configureRover : Set mode rover failed" );
308324 }
309325
310326 // Set the fix rate. Default on LG290P is 10Hz so set accordingly.
311327 response &= setRate (settings.measurementRateMs / 1000.0 ); // May require save/reset
312328 if (settings.debugGnss && response == false )
313- systemPrintln (" Rover : Set rate failed" );
329+ systemPrintln (" configureRover : Set rate failed" );
314330
315331 response &= enableRTCMRover ();
316332 if (settings.debugGnss && response == false )
317- systemPrintln (" Rover : Enable RTCM failed" );
333+ systemPrintln (" configureRover : Enable RTCM failed" );
318334
319335 response &= enableNMEA ();
320336 if (settings.debugGnss && response == false )
321- systemPrintln (" Rover : Enable NMEA failed" );
337+ systemPrintln (" configureRover : Enable NMEA failed" );
322338
323339 response &= exitConfigMode (); // We must exit config before we save otherwise we will save with NMEA/RTCM off
324340
@@ -371,9 +387,17 @@ bool GNSS_LG290P::configureBase()
371387
372388 serialGNSS->flush (); // Remove any incoming characters
373389
374- 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 );
375399 if (settings.debugGnss && response == false )
376- systemPrintln (" Base : Enter config mode failed" );
400+ systemPrintln (" configureBase : Enter config mode failed" );
377401
378402 // "When set to Base Station mode, the receiver will automatically disable NMEA message output and enable RTCM MSM4
379403 // and RTCM3-1005 message output."
@@ -391,7 +415,7 @@ bool GNSS_LG290P::configureBase()
391415 // fail because NMEA is not present.
392416 _lg290p->setModeBase (false ); // Don't save and reset
393417 if (settings.debugGnss && response == false )
394- systemPrintln (" Base : Set mode base failed" );
418+ systemPrintln (" configureBase : Set mode base failed" );
395419
396420 // Device should now have survey mode disabled
397421 }
@@ -405,16 +429,16 @@ bool GNSS_LG290P::configureBase()
405429 // fail because NMEA is not present.
406430 disableSurveyIn (false ); // Don't save and reset
407431 if (settings.debugGnss && response == false )
408- systemPrintln (" Base : disable survey in failed" );
432+ systemPrintln (" configureBase : disable survey in failed" );
409433 }
410434
411435 response &= enableRTCMBase (); // Set RTCM messages
412436 if (settings.debugGnss && response == false )
413- systemPrintln (" Base : Enable RTCM failed" );
437+ systemPrintln (" configureBase : Enable RTCM failed" );
414438
415439 response &= enableNMEA (); // Set NMEA messages
416440 if (settings.debugGnss && response == false )
417- systemPrintln (" Base : Enable NMEA failed" );
441+ systemPrintln (" configureBase : Enable NMEA failed" );
418442
419443 response &= exitConfigMode (); // We must exit config before we save otherwise we will save with NMEA/RTCM off
420444
@@ -464,11 +488,20 @@ bool GNSS_LG290P::configureNtpMode()
464488// ----------------------------------------
465489// Disable NMEA and RTCM on UART2 to reduce the serial traffic
466490// ----------------------------------------
467- bool GNSS_LG290P::enterConfigMode ()
491+ bool GNSS_LG290P::enterConfigMode (unsigned long waitForSemaphoreTimeout_millis )
468492{
469493 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...
470502 return (_lg290p->sendOkCommand (" $PQTMCFGPROT" ,
471503 " ,W,1,2,00000000,00000000" )); // Disable NMEA and RTCM on the LG290P UART2
504+ }
472505 return (false );
473506}
474507
0 commit comments