@@ -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
0 commit comments