Skip to content

Commit d397f88

Browse files
committed
LG290P : add isBlocking checks and retries for enterConfigMode
1 parent 9210942 commit d397f88

File tree

2 files changed

+52
-19
lines changed

2 files changed

+52
-19
lines changed

Firmware/RTK_Everywhere/GNSS_LG290P.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class GNSS_LG290P : GNSS
176176
// Returns true if successfully started and false upon failure
177177
bool enableRTCMTest();
178178

179-
bool enterConfigMode();
179+
bool enterConfigMode(unsigned long waitForSemaphoreTimeout_millis);
180180

181181
bool exitConfigMode();
182182

Firmware/RTK_Everywhere/GNSS_LG290P.ino

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)