Skip to content

Commit 1bc7f69

Browse files
committed
Add support for PPP on LG290P
1 parent d1fa72f commit 1bc7f69

File tree

3 files changed

+77
-10
lines changed

3 files changed

+77
-10
lines changed

Firmware/RTK_Everywhere/GNSS_LG290P.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ class GNSS_LG290P : GNSS
450450
// elevationDegrees: The elevation value in degrees
451451
bool setElevation(uint8_t elevationDegrees);
452452

453+
bool setHighAccuracyService(bool enableGalileoHas);
454+
453455
// Enable all the valid messages for this platform
454456
bool setMessages(int maxRetries);
455457

Firmware/RTK_Everywhere/GNSS_LG290P.ino

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void GNSS_LG290P::baseRtcmLowDataRate()
3939
settings.lg290pMessageRatesRTCMBase[x] = 0;
4040

4141
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-1005")] =
42-
10; // 1005 0.1Hz - Exclude antenna height
42+
10; // 1005 0.1Hz - Exclude antenna height
4343
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-107X")] = 2; // 1074 0.5Hz
4444
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-108X")] = 2; // 1084 0.5Hz
4545
settings.lg290pMessageRatesRTCMBase[getRtcmMessageNumberByName("RTCM3-109X")] = 2; // 1094 0.5Hz
@@ -114,6 +114,14 @@ void GNSS_LG290P::begin()
114114
"update the "
115115
"firmware on your LG290P to allow for these features. Please see https://bit.ly/sfe-rtk-lg290p-update\r\n",
116116
lg290pFirmwareVersion, gnssFirmwareVersion);
117+
118+
// Determine if the "LG290P03AANR01A03S_PPP_TEMP0812 2025/08/12" firmware is present
119+
// This version has support for testing out E6/HAS PPP, but confusingly was released after v05.
120+
if (strstr(gnssFirmwareVersion, "PPP_TEMP") != nullptr)
121+
{
122+
present.galileoHasCapable = true;
123+
systemPrintln("PPP trial firmware detected. HAS settings will now be available.");
124+
}
117125
}
118126
if (lg290pFirmwareVersion < 5)
119127
{
@@ -362,6 +370,8 @@ bool GNSS_LG290P::configureRover()
362370
if (settings.debugGnss && response == false)
363371
systemPrintln("configureRover: Set rate failed");
364372

373+
response &= setHighAccuracyService(settings.enableGalileoHas);
374+
365375
response &= enableRTCMRover();
366376
if (settings.debugGnss && response == false)
367377
systemPrintln("configureRover: Enable RTCM failed");
@@ -476,6 +486,8 @@ bool GNSS_LG290P::configureBase()
476486

477487
response &= setMinCnoRadio(settings.minCNO);
478488

489+
response &= setHighAccuracyService(settings.enableGalileoHas);
490+
479491
response &= enableRTCMBase(); // Set RTCM messages
480492
if (settings.debugGnss && response == false)
481493
systemPrintln("configureBase: Enable RTCM failed");
@@ -826,7 +838,8 @@ bool GNSS_LG290P::enableRTCMRover()
826838
// So we set all RTCM to 1, and set PQTMCFGRTCM to the lowest value found
827839

828840
// Capture the message with the lowest rate
829-
if (settings.lg290pMessageRatesRTCMRover[messageNumber] > 0 && settings.lg290pMessageRatesRTCMRover[messageNumber] < minimumRtcmRate)
841+
if (settings.lg290pMessageRatesRTCMRover[messageNumber] > 0 &&
842+
settings.lg290pMessageRatesRTCMRover[messageNumber] < minimumRtcmRate)
830843
minimumRtcmRate = settings.lg290pMessageRatesRTCMRover[messageNumber];
831844

832845
// Force all RTCM messages to 1 or 0. See above for reasoning.
@@ -847,13 +860,11 @@ bool GNSS_LG290P::enableRTCMRover()
847860
if (lg290pFirmwareVersion >= 4)
848861
{
849862
// If any one of the commands fails, report failure overall
850-
response &= _lg290p->setMessageRateOnPort(lgMessagesRTCM[messageNumber].msgTextName,
851-
rate,
852-
portNumber);
863+
response &=
864+
_lg290p->setMessageRateOnPort(lgMessagesRTCM[messageNumber].msgTextName, rate, portNumber);
853865
}
854866
else
855-
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName,
856-
rate);
867+
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName, rate);
857868

858869
if (response == false && settings.debugGnss)
859870
systemPrintf("Enable RTCM failed at messageNumber %d %s\r\n", messageNumber,
@@ -874,8 +885,7 @@ bool GNSS_LG290P::enableRTCMRover()
874885
}
875886
else
876887
response &= _lg290p->setMessageRate(lgMessagesRTCM[messageNumber].msgTextName,
877-
settings.lg290pMessageRatesRTCMRover[messageNumber],
878-
0);
888+
settings.lg290pMessageRatesRTCMRover[messageNumber], 0);
879889

880890
if (response == false && settings.debugGnss)
881891
systemPrintf("Enable RTCM failed at messageNumber %d %s\r\n", messageNumber,
@@ -1754,6 +1764,12 @@ void GNSS_LG290P::menuConstellations()
17541764
systemPrintln();
17551765
}
17561766

1767+
if (present.galileoHasCapable)
1768+
{
1769+
systemPrintf("%d) Galileo E6 Corrections: %s\r\n", MAX_LG290P_CONSTELLATIONS + 1,
1770+
settings.enableGalileoHas ? "Enabled" : "Disabled");
1771+
}
1772+
17571773
systemPrintln("x) Exit");
17581774

17591775
int incoming = getUserInputNumber(); // Returns EXIT, TIMEOUT, or long
@@ -1764,6 +1780,10 @@ void GNSS_LG290P::menuConstellations()
17641780

17651781
settings.lg290pConstellations[incoming] ^= 1;
17661782
}
1783+
else if ((incoming == MAX_LG290P_CONSTELLATIONS + 1) && present.galileoHasCapable)
1784+
{
1785+
settings.enableGalileoHas ^= 1;
1786+
}
17671787
else if (incoming == INPUT_RESPONSE_GETNUMBER_EXIT)
17681788
break;
17691789
else if (incoming == INPUT_RESPONSE_GETNUMBER_TIMEOUT)
@@ -1775,6 +1795,8 @@ void GNSS_LG290P::menuConstellations()
17751795
// Apply current settings to module
17761796
gnss->setConstellations();
17771797

1798+
setHighAccuracyService(settings.enableGalileoHas);
1799+
17781800
clearBuffer(); // Empty buffer of any newline chars
17791801
}
17801802

@@ -2221,6 +2243,49 @@ bool GNSS_LG290P::setElevation(uint8_t elevationDegrees)
22212243
return true;
22222244
}
22232245

2246+
//----------------------------------------
2247+
bool GNSS_LG290P::setHighAccuracyService(bool enableGalileoHas)
2248+
{
2249+
bool result = true;
2250+
2251+
// E6 reception requires version v03 with 'PPP_TEMP' in firmware title
2252+
// Present is set during LG290P begin()
2253+
if (present.galileoHasCapable == false)
2254+
return (result); // We are unable to set this setting to report success
2255+
2256+
// Enable E6 and PPP if enabled
2257+
if (settings.enableGalileoHas)
2258+
{
2259+
// $PQTMCFGPPP,W,2,1,120,0.10,0.15*68
2260+
// Enable E6 HAS, WGS84, 120 timeout, 0.10m Horizontal convergence accuracy threshold, 0.15m Vertical threshold
2261+
if (_lg290p->sendOkCommand("$PQTMCFGPPP", ",W,2,1,120,0.10,0.15") == true)
2262+
{
2263+
systemPrintln("Galileo E6 HAS service enabled");
2264+
}
2265+
else
2266+
{
2267+
systemPrintln("Galileo E6 HAS service failed to enable");
2268+
result = false;
2269+
}
2270+
}
2271+
else
2272+
{
2273+
// Turn off HAS/E6
2274+
// $PQTMCFGPPP,W,0*
2275+
if (_lg290p->sendOkCommand("$PQTMCFGPPP", ",W,0") == true)
2276+
{
2277+
systemPrintln("Galileo E6 HAS service disabled");
2278+
}
2279+
else
2280+
{
2281+
systemPrintln("Galileo E6 HAS service failed to disable");
2282+
result = false;
2283+
}
2284+
}
2285+
2286+
return (result);
2287+
}
2288+
22242289
//----------------------------------------
22252290
// Enable all the valid messages for this platform
22262291
// There are many messages so split into batches. VALSET is limited to 64 max per batch

Firmware/RTK_Everywhere/settings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1712,7 +1712,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] =
17121712
// g s x k 2 c h d d x Type Qual Variable Name
17131713

17141714
// UM980 GNSS Receiver - TODO these apply to more than UM980
1715-
{ 1, 1, 0, 0, 0, 0, 1, 0, 0, NON, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", },
1715+
{ 1, 1, 0, 0, 0, 0, 1, 0, 1, NON, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", },
17161716
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, ALL, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", },
17171717
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, ALL, _bool, 0, & settings.enableImuDebug, "enableImuDebug", },
17181718
{ 1, 1, 0, 0, 0, 0, 1, 0, 0, ALL, _bool, 0, & settings.enableTiltCompensation, "enableTiltCompensation", },

0 commit comments

Comments
 (0)