diff --git a/Firmware/RTK_Everywhere/AP-Config/index.html b/Firmware/RTK_Everywhere/AP-Config/index.html
index f6b381e36..7022277ca 100644
--- a/Firmware/RTK_Everywhere/AP-Config/index.html
+++ b/Firmware/RTK_Everywhere/AP-Config/index.html
@@ -363,7 +363,7 @@
-
+
diff --git a/Firmware/RTK_Everywhere/AP-Config/src/main.js b/Firmware/RTK_Everywhere/AP-Config/src/main.js
index 2e98cde03..ea8b2fa4d 100644
--- a/Firmware/RTK_Everywhere/AP-Config/src/main.js
+++ b/Firmware/RTK_Everywhere/AP-Config/src/main.js
@@ -112,7 +112,7 @@ function parseIncoming(msg) {
hide("externalPortOptions");
show("logToSDCard");
hide("galileoHasSetting");
- hide("useMSM7Setting");
+ hide("lg290pGnssSettings");
hide("tiltConfig");
hide("beeperControl");
show("measurementRateInput");
@@ -146,7 +146,7 @@ function parseIncoming(msg) {
show("externalPortOptions");
show("logToSDCard");
hide("galileoHasSetting");
- hide("useMSM7Setting");
+ hide("lg290pGnssSettings");
hide("tiltConfig");
hide("beeperControl");
show("measurementRateInput");
@@ -167,7 +167,7 @@ function parseIncoming(msg) {
show("externalPortOptions");
show("logToSDCard");
hide("galileoHasSetting");
- hide("useMSM7Setting");
+ hide("lg290pGnssSettings");
hide("tiltConfig");
hide("beeperControl");
hide("measurementRateInput");
@@ -257,8 +257,8 @@ function parseIncoming(msg) {
show("externalPortOptions");
show("logToSDCard");
- hide("galileoHasSetting");
- show("useMSM7Setting");
+ show("galileoHasSetting");
+ show("lg290pGnssSettings");
hide("tiltConfig");
hide("beeperControl");
@@ -273,8 +273,8 @@ function parseIncoming(msg) {
show("constellationNavic");
hide("dynamicModelDropdown"); //Not supported on LG290P
- hide("minElevConfig"); //Not supported on LG290P
- hide("minCNOConfig"); //Not supported on LG290P
+ show("minElevConfig");
+ show("minCNOConfig");
ge("rtcmRateInfoText").setAttribute('data-bs-original-title', 'RTCM is transmitted by the base at a default of 1Hz for messages 1005, 1074, 1084, 1094, 1114, 1124, 1134. This can be lowered for radios with low bandwidth or tailored to transmit any/all RTCM messages. Limits: 0 to 20. Note: The measurement rate is overridden to 1Hz when in Base mode.');
@@ -327,8 +327,8 @@ function parseIncoming(msg) {
hide("constellationSbas"); //Not supported on LG290P
show("constellationNavic");
- hide("galileoHasSetting"); //Not supported on LG290P
- show("useMSM7Setting");
+ show("galileoHasSetting");
+ show("lg290pGnssSettings");
hide("tiltConfig"); //Not supported on Torch X2
show("measurementRateInput");
@@ -341,8 +341,8 @@ function parseIncoming(msg) {
hide("enableNmeaOnRadio");
hide("dynamicModelDropdown"); //Not supported on LG290P
- hide("minElevConfig"); //Not supported on LG290P
- hide("minCNOConfig"); //Not supported on LG290P
+ show("minElevConfig");
+ show("minCNOConfig");
ge("rtcmRateInfoText").setAttribute('data-bs-original-title', 'RTCM is transmitted by the base at a default of 1Hz for messages 1005, 1074, 1084, 1094, 1124, and 0.1Hz for 1033. This can be lowered for radios with low bandwidth or tailored to transmit any/all RTCM messages. Limits: 0 to 20. Note: The measurement rate is overridden to 1Hz when in Base mode.');
@@ -714,6 +714,13 @@ function show(id) {
ge(id).style.display = "block";
}
+function isElementShown(id) {
+ if (ge(id).style.display == "block") {
+ return (true);
+ }
+ return (false);
+}
+
//Create CSV of all setting data
function sendData() {
var settingCSV = "";
@@ -841,6 +848,9 @@ function validateFields() {
checkElementValue("minElev", 0, 90, "Must be between 0 and 90", "collapseGNSSConfig");
checkElementValue("minCNO", 0, 90, "Must be between 0 and 90", "collapseGNSSConfig");
+ if (isElementShown("lg290pGnssSettings") == true) {
+ checkElementValue("rtcmMinElev", -90, 90, "Must be between -90 and 90", "collapseGNSSConfig");
+ }
if (ge("enableNtripClient").checked == true) {
checkElementString("ntripClientCasterHost", 1, 45, "Must be 1 to 45 characters", "collapseGNSSConfig");
diff --git a/Firmware/RTK_Everywhere/GNSS_LG290P.ino b/Firmware/RTK_Everywhere/GNSS_LG290P.ino
index bc8e432f1..025cdfae5 100644
--- a/Firmware/RTK_Everywhere/GNSS_LG290P.ino
+++ b/Firmware/RTK_Everywhere/GNSS_LG290P.ino
@@ -116,7 +116,8 @@ void GNSS_LG290P::begin()
lg290pFirmwareVersion, gnssFirmwareVersion);
// Determine if the "LG290P03AANR01A03S_PPP_TEMP0812 2025/08/12" firmware is present
- // This version has support for testing out E6/HAS PPP, but confusingly was released after v05.
+ // Or "LG290P03AANR01A06S_PPP_TEMP0829 2025/08/29 17:08:39"
+ // The 03S_PPP_TEMP version has support for testing out E6/HAS PPP, but confusingly was released after v05.
if (strstr(gnssFirmwareVersion, "PPP_TEMP") != nullptr)
{
present.galileoHasCapable = true;
@@ -793,6 +794,8 @@ bool GNSS_LG290P::enableRTCMBase()
int portNumber = 1;
+ int minimumRtcmRate = 1000;
+
while (portNumber < 4)
{
for (int messageNumber = 0; messageNumber < MAX_LG290P_RTCM_MSG; messageNumber++)
@@ -843,7 +846,12 @@ bool GNSS_LG290P::enableRTCMBase()
// If any message is enabled, enable RTCM output
if (settings.lg290pMessageRatesRTCMBase[messageNumber] > 0)
+ {
enableRTCM = true;
+ // Capture the message with the lowest rate
+ if (settings.lg290pMessageRatesRTCMBase[messageNumber] < minimumRtcmRate)
+ minimumRtcmRate = settings.lg290pMessageRatesRTCMBase[messageNumber];
+ }
}
}
@@ -857,11 +865,14 @@ bool GNSS_LG290P::enableRTCMBase()
if (enableRTCM == true)
{
if (settings.debugGnss)
- systemPrintln("Enabling Base RTCM output");
+ systemPrintf("Enabling Base RTCM MSM%c output with rate of %d\r\n",
+ settings.useMSM7 ? '7' : '4', minimumRtcmRate);
// PQTMCFGRTCM fails to respond with OK over UART2 of LG290P, so don't look for it
char cfgRtcm[40];
- snprintf(cfgRtcm, sizeof(cfgRtcm), "PQTMCFGRTCM,W,%c,0,-90,07,06,2,1", settings.useMSM7 ? '7' : '4');
+ snprintf(cfgRtcm, sizeof(cfgRtcm), "PQTMCFGRTCM,W,%c,0,%d,07,06,2,%d",
+ settings.useMSM7 ? '7' : '4', settings.rtcmMinElev,
+ minimumRtcmRate);
_lg290p->sendOkCommand(
cfgRtcm); // Enable MSM4/7, output regular intervals, interval (seconds)
}
@@ -1016,15 +1027,16 @@ bool GNSS_LG290P::enableRTCMRover()
if (enableRTCM == true)
{
if (settings.debugCorrections)
- systemPrintf("Enabling Rover RTCM MSM output with rate of %d\r\n", minimumRtcmRate);
+ systemPrintf("Enabling Rover RTCM MSM%c output with rate of %d\r\n",
+ settings.useMSM7 ? '7' : '4', minimumRtcmRate);
// Enable MSM4/7 (for faster PPP CSRS results), output at a rate equal to the minimum RTCM rate (EPH Mode = 2)
// PQTMCFGRTCM, W, , , , , , ,
// Set MSM_ElevThd to 15 degrees from rftop suggestion
char msmCommand[40] = {0};
- snprintf(msmCommand, sizeof(msmCommand), "PQTMCFGRTCM,W,%c,0,15,07,06,2,%d",
- settings.useMSM7 ? '7' : '4', minimumRtcmRate);
+ snprintf(msmCommand, sizeof(msmCommand), "PQTMCFGRTCM,W,%c,0,%d,07,06,2,%d",
+ settings.useMSM7 ? '7' : '4', settings.rtcmMinElev, minimumRtcmRate);
// PQTMCFGRTCM fails to respond with OK over UART2 of LG290P, so don't look for it
_lg290p->sendOkCommand(msmCommand);
@@ -1921,6 +1933,8 @@ void GNSS_LG290P::menuMessages()
if (namedSettingAvailableOnPlatform("useMSM7")) // Redundant - but good practice for code reuse
systemPrintf("13) MSM Selection: MSM%c\r\n", settings.useMSM7 ? '7' : '4');
+ if (namedSettingAvailableOnPlatform("rtcmMinElev")) // Redundant - but good practice for code reuse
+ systemPrintf("14) Minimum Elevation for RTCM: %d\r\n", settings.rtcmMinElev);
systemPrintln("x) Exit");
@@ -1997,6 +2011,17 @@ void GNSS_LG290P::menuMessages()
}
else if ((incoming == 13) && (namedSettingAvailableOnPlatform("useMSM7"))) // Redundant - but good practice for code reuse)
settings.useMSM7 ^= 1;
+ else if ((incoming == 14) && (namedSettingAvailableOnPlatform("rtcmMinElev")))
+ {
+ systemPrintf("Enter minimum elevation for RTCM: ");
+
+ int elevation = getUserInputNumber(); // Returns EXIT, TIMEOUT, or long
+
+ if (elevation >= -90 && elevation <= 90)
+ {
+ settings.rtcmMinElev = elevation;
+ }
+ }
else if (incoming == INPUT_RESPONSE_GETNUMBER_EXIT)
break;
@@ -2353,7 +2378,7 @@ bool GNSS_LG290P::setHighAccuracyService(bool enableGalileoHas)
{
bool result = true;
- // E6 reception requires version v03 with 'PPP_TEMP' in firmware title
+ // E6 reception requires version v03/v06 with 'PPP_TEMP' in firmware title
// Present is set during LG290P begin()
if (present.galileoHasCapable == false)
return (result); // We are unable to set this setting to report success
diff --git a/Firmware/RTK_Everywhere/HTTP_Client.ino b/Firmware/RTK_Everywhere/HTTP_Client.ino
index 9ef212ed3..03bb8a7b5 100644
--- a/Firmware/RTK_Everywhere/HTTP_Client.ino
+++ b/Firmware/RTK_Everywhere/HTTP_Client.ino
@@ -693,7 +693,7 @@ void httpClientUpdate()
}
// Periodically display the HTTP client state
- if (PERIODIC_DISPLAY(PD_HTTP_CLIENT_STATE))
+ if (PERIODIC_DISPLAY(PD_HTTP_CLIENT_STATE) && !inMainMenu)
{
const char *line = "";
httpClientEnabled(&line);
diff --git a/Firmware/RTK_Everywhere/MQTT_Client.ino b/Firmware/RTK_Everywhere/MQTT_Client.ino
index 41836db86..63bdf2352 100644
--- a/Firmware/RTK_Everywhere/MQTT_Client.ino
+++ b/Firmware/RTK_Everywhere/MQTT_Client.ino
@@ -1169,7 +1169,7 @@ void mqttClientUpdate()
}
// Periodically display the MQTT client state
- if (PERIODIC_DISPLAY(PD_MQTT_CLIENT_STATE))
+ if (PERIODIC_DISPLAY(PD_MQTT_CLIENT_STATE) && !inMainMenu)
{
const char *line = "";
mqttClientEnabled(&line);
diff --git a/Firmware/RTK_Everywhere/NTP.ino b/Firmware/RTK_Everywhere/NTP.ino
index 33f8dabfe..ee392b811 100644
--- a/Firmware/RTK_Everywhere/NTP.ino
+++ b/Firmware/RTK_Everywhere/NTP.ino
@@ -963,7 +963,7 @@ void ntpServerUpdate()
}
// Periodically display the NTP server state
- if (PERIODIC_DISPLAY(PD_NTP_SERVER_STATE))
+ if (PERIODIC_DISPLAY(PD_NTP_SERVER_STATE) && !inMainMenu)
{
const char * line = "";
if (NEQ_RTK_MODE(ntpServerMode))
diff --git a/Firmware/RTK_Everywhere/NtripClient.ino b/Firmware/RTK_Everywhere/NtripClient.ino
index 1f633c1f3..8ef050044 100644
--- a/Firmware/RTK_Everywhere/NtripClient.ino
+++ b/Firmware/RTK_Everywhere/NtripClient.ino
@@ -955,7 +955,7 @@ void ntripClientUpdate()
}
// Periodically display the NTRIP client state
- if (PERIODIC_DISPLAY(PD_NTRIP_CLIENT_STATE))
+ if (PERIODIC_DISPLAY(PD_NTRIP_CLIENT_STATE) && !inMainMenu)
{
systemPrintf("NTRIP Client state: %s%s\r\n", ntripClientStateName[ntripClientState], line);
PERIODIC_CLEAR(PD_NTRIP_CLIENT_STATE);
diff --git a/Firmware/RTK_Everywhere/NtripServer.ino b/Firmware/RTK_Everywhere/NtripServer.ino
index 4a800b747..39ffc4ff9 100644
--- a/Firmware/RTK_Everywhere/NtripServer.ino
+++ b/Firmware/RTK_Everywhere/NtripServer.ino
@@ -845,7 +845,7 @@ void ntripServerUpdate(int serverIndex)
}
// Periodically display the state
- if (PERIODIC_DISPLAY(PD_NTRIP_SERVER_STATE))
+ if (PERIODIC_DISPLAY(PD_NTRIP_SERVER_STATE) && !inMainMenu)
{
systemPrintf("NTRIP Server %d state: %s%s\r\n", serverIndex,
ntripServerStateName[ntripServer->state], line);
diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino
index a09968d15..ee8bbdf1e 100644
--- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino
+++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino
@@ -13,7 +13,7 @@ void updatePplTask(void *e)
while (task.updatePplTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_UPDATE_PPL))
+ if (PERIODIC_DISPLAY(PD_TASK_UPDATE_PPL) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_UPDATE_PPL);
systemPrintln("UpdatePplTask running");
diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino
index ce314d703..54ab9569b 100644
--- a/Firmware/RTK_Everywhere/States.ino
+++ b/Firmware/RTK_Everywhere/States.ino
@@ -773,10 +773,11 @@ typedef struct _RTK_MODE_ENTRY
} RTK_MODE_ENTRY;
const RTK_MODE_ENTRY stateModeTable[] = {{"Rover", STATE_ROVER_NOT_STARTED, STATE_ROVER_RTK_FIX},
+ {"Base Caster", STATE_BASE_CASTER_NOT_STARTED, STATE_BASE_CASTER_NOT_STARTED},
{"Base", STATE_BASE_NOT_STARTED, STATE_BASE_FIXED_TRANSMITTING},
- {"Setup", STATE_DISPLAY_SETUP, STATE_PROFILE},
- {"ESPNOW Pairing", STATE_ESPNOW_PAIRING_NOT_STARTED, STATE_ESPNOW_PAIRING},
+ {"Setup", STATE_DISPLAY_SETUP, STATE_PROFILE}, // Covers SETUP, WEB_CONFIG, TEST
{"Provisioning", STATE_KEYS_REQUESTED, STATE_KEYS_REQUESTED},
+ {"ESPNOW Pairing", STATE_ESPNOW_PAIRING_NOT_STARTED, STATE_ESPNOW_PAIRING},
{"NTP", STATE_NTPSERVER_NOT_STARTED, STATE_NTPSERVER_SYNC},
{"Shutdown", STATE_SHUTDOWN, STATE_SHUTDOWN}};
const int stateModeTableEntries = sizeof(stateModeTable) / sizeof(stateModeTable[0]);
diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino
index 20cf524c7..94f67353c 100644
--- a/Firmware/RTK_Everywhere/System.ino
+++ b/Firmware/RTK_Everywhere/System.ino
@@ -414,6 +414,16 @@ void printReports()
if (bluetoothCommandIsConnected() == true)
return;
+ if (inMainMenu)
+ return;
+
+ // Periodically display the firmware mode
+ if (PERIODIC_DISPLAY(PD_FIRMWARE_MODE))
+ {
+ PERIODIC_CLEAR(PD_FIRMWARE_MODE);
+ systemPrintf("Firmware mode: %s\r\n", stateToRtkMode(systemState));
+ }
+
// Periodically print the position
if (settings.enablePrintPosition && ((millis() - lastPrintPosition) > 15000))
{
diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino
index 3b4c4c8f0..3f6eabc9a 100644
--- a/Firmware/RTK_Everywhere/Tasks.ino
+++ b/Firmware/RTK_Everywhere/Tasks.ino
@@ -166,7 +166,7 @@ void btReadTask(void *e)
while (task.btReadTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_BLUETOOTH_READ))
+ if (PERIODIC_DISPLAY(PD_TASK_BLUETOOTH_READ) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_BLUETOOTH_READ);
systemPrintln("btReadTask running");
@@ -236,7 +236,7 @@ void btReadTask(void *e)
} // End btPrintEcho == false && bluetoothRxDataAvailable()
- if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_RX))
+ if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_RX) && !inMainMenu)
{
PERIODIC_CLEAR(PD_BLUETOOTH_DATA_RX);
systemPrintf("Bluetooth received %d bytes\r\n", rxBytes);
@@ -415,7 +415,7 @@ void gnssReadTask(void *e)
while (task.gnssReadTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_GNSS_READ))
+ if (PERIODIC_DISPLAY(PD_TASK_GNSS_READ) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_GNSS_READ);
systemPrintln("gnssReadTask running");
@@ -426,7 +426,7 @@ void gnssReadTask(void *e)
// Display the RX byte count
static uint32_t totalRxByteCount = 0;
- if (PERIODIC_DISPLAY(PD_GNSS_DATA_RX_BYTE_COUNT))
+ if (PERIODIC_DISPLAY(PD_GNSS_DATA_RX_BYTE_COUNT) && !inMainMenu)
{
PERIODIC_CLEAR(PD_GNSS_DATA_RX_BYTE_COUNT);
systemPrintf("gnssReadTask total byte count: %d\r\n", totalRxByteCount);
@@ -1345,7 +1345,7 @@ void handleGnssDataTask(void *e)
while (task.handleGnssDataTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_HANDLE_GNSS_DATA))
+ if (PERIODIC_DISPLAY(PD_TASK_HANDLE_GNSS_DATA) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_HANDLE_GNSS_DATA);
systemPrintln("handleGnssDataTask running");
@@ -1414,7 +1414,7 @@ void handleGnssDataTask(void *e)
maxMillis[RBC_BLUETOOTH] = deltaMillis;
// Display the data movement
- if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_TX))
+ if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_TX) && !inMainMenu)
{
PERIODIC_CLEAR(PD_BLUETOOTH_DATA_TX);
systemPrintf("Bluetooth: %d bytes written\r\n", bytesToSend);
@@ -1760,7 +1760,7 @@ void handleGnssDataTask(void *e)
// Display the millisecond values for the different ring buffer consumers
//----------------------------------------------------------------------
- if (PERIODIC_DISPLAY(PD_RING_BUFFER_MILLIS))
+ if (PERIODIC_DISPLAY(PD_RING_BUFFER_MILLIS) && !inMainMenu)
{
int milliseconds;
int seconds;
@@ -1991,7 +1991,7 @@ void buttonCheckTask(void *e)
while (task.buttonCheckTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_BUTTON_CHECK))
+ if (PERIODIC_DISPLAY(PD_TASK_BUTTON_CHECK) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_BUTTON_CHECK);
systemPrintln("ButtonCheckTask running");
@@ -2486,7 +2486,7 @@ void sdSizeCheckTask(void *e)
while (task.sdSizeCheckTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_SD_SIZE_CHECK))
+ if (PERIODIC_DISPLAY(PD_TASK_SD_SIZE_CHECK) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_SD_SIZE_CHECK);
systemPrintln("sdSizeCheckTask running");
@@ -2567,7 +2567,7 @@ void bluetoothCommandTask(void *pvParameters)
while (task.bluetoothCommandTaskStopRequest == false)
{
// Display an alive message
- if (PERIODIC_DISPLAY(PD_TASK_BLUETOOTH_READ))
+ if (PERIODIC_DISPLAY(PD_TASK_BLUETOOTH_READ) && !inMainMenu)
{
PERIODIC_CLEAR(PD_TASK_BLUETOOTH_READ);
systemPrintln("bluetoothCommandTask running");
@@ -2590,7 +2590,7 @@ void bluetoothCommandTask(void *pvParameters)
}
}
- if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_RX))
+ if (PERIODIC_DISPLAY(PD_BLUETOOTH_DATA_RX) && !inMainMenu)
{
PERIODIC_CLEAR(PD_BLUETOOTH_DATA_RX);
systemPrintf("Bluetooth received %d bytes\r\n", rxSpot);
diff --git a/Firmware/RTK_Everywhere/TcpClient.ino b/Firmware/RTK_Everywhere/TcpClient.ino
index 1e2ff2706..690e872ac 100644
--- a/Firmware/RTK_Everywhere/TcpClient.ino
+++ b/Firmware/RTK_Everywhere/TcpClient.ino
@@ -571,7 +571,7 @@ void tcpClientUpdate()
}
// Periodically display the TCP client state
- if (PERIODIC_DISPLAY(PD_TCP_CLIENT_STATE))
+ if (PERIODIC_DISPLAY(PD_TCP_CLIENT_STATE) && !inMainMenu)
{
systemPrintf("TCP Client state: %s%s\r\n",
tcpClientStateName[tcpClientState], line);
diff --git a/Firmware/RTK_Everywhere/WiFi.ino b/Firmware/RTK_Everywhere/WiFi.ino
index 77967ac0a..9eacc55d5 100644
--- a/Firmware/RTK_Everywhere/WiFi.ino
+++ b/Firmware/RTK_Everywhere/WiFi.ino
@@ -1198,7 +1198,7 @@ void wifiStationUpdate()
}
// Periodically display the WiFi state
- if (PERIODIC_DISPLAY(PD_WIFI_STATE))
+ if (PERIODIC_DISPLAY(PD_WIFI_STATE) && !inMainMenu)
{
systemPrintf("WiFi station state: %s%s\r\n", wifiStationStateName[wifiStationState], reason);
PERIODIC_CLEAR(PD_WIFI_STATE);
diff --git a/Firmware/RTK_Everywhere/menuMain.ino b/Firmware/RTK_Everywhere/menuMain.ino
index e9db3dc93..7f28a8db5 100644
--- a/Firmware/RTK_Everywhere/menuMain.ino
+++ b/Firmware/RTK_Everywhere/menuMain.ino
@@ -126,6 +126,7 @@ void menuMain()
firmwareVersionGet(versionString, sizeof(versionString), true);
RTKBrandAttribute *brandAttributes = getBrandAttributeFromBrand(present.brand);
systemPrintf("%s RTK %s %s\r\n", brandAttributes->name, platformPrefix, versionString);
+ systemPrintf("Mode: %s\r\n", stateToRtkMode(systemState));
#ifdef COMPILE_BT
diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino
index 611120311..f7730f1ab 100644
--- a/Firmware/RTK_Everywhere/menuMessages.ino
+++ b/Firmware/RTK_Everywhere/menuMessages.ino
@@ -232,6 +232,8 @@ void menuMessagesBaseRTCM()
if (namedSettingAvailableOnPlatform("useMSM7"))
systemPrintf("4) MSM Selection: MSM%c\r\n", settings.useMSM7 ? '7' : '4');
+ if (namedSettingAvailableOnPlatform("rtcmMinElev"))
+ systemPrintf("5) Minimum Elevation for RTCM: %d\r\n", settings.rtcmMinElev);
systemPrintln("x) Exit");
@@ -261,6 +263,18 @@ void menuMessagesBaseRTCM()
settings.useMSM7 ^= 1;
restartBase = true;
}
+ else if ((incoming == 5) && (namedSettingAvailableOnPlatform("rtcmMinElev")))
+ {
+ systemPrintf("Enter minimum elevation for RTCM: ");
+
+ int elevation = getUserInputNumber(); // Returns EXIT, TIMEOUT, or long
+
+ if (elevation >= -90 && elevation <= 90)
+ {
+ settings.rtcmMinElev = elevation;
+ restartBase = true;
+ }
+ }
else if (incoming == INPUT_RESPONSE_GETNUMBER_EXIT)
break;
@@ -872,7 +886,7 @@ void checkGNSSArrayDefaults()
}
else if (present.gnss_lg290p)
{
- // settings.minCNO = 10; // Not yet supported
+ settings.minCNO = 10; // Default 10 dBHz
settings.surveyInStartingAccuracy = 2.0; // Default 2m
settings.measurementRateMs = 500; // Default 2Hz.
}
diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino
index f491ab1c3..76028074c 100644
--- a/Firmware/RTK_Everywhere/menuPP.ino
+++ b/Firmware/RTK_Everywhere/menuPP.ino
@@ -1626,7 +1626,7 @@ void provisioningUpdate()
}
// Periodically display the provisioning state
- if (PERIODIC_DISPLAY(PD_PROVISIONING_STATE))
+ if (PERIODIC_DISPLAY(PD_PROVISIONING_STATE) && !inMainMenu)
{
systemPrintf("Provisioning state: %s%s\r\n", provisioningStateName[provisioningState], line);
PERIODIC_CLEAR(PD_PROVISIONING_STATE);
diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino
index f51a3daf2..4729e01f3 100644
--- a/Firmware/RTK_Everywhere/menuSystem.ino
+++ b/Firmware/RTK_Everywhere/menuSystem.ino
@@ -1224,6 +1224,9 @@ void menuPeriodicPrint()
systemPrint("27) RTK correction source: ");
systemPrintf("%s\r\n", PERIODIC_SETTING(PD_CORRECTION_SOURCE) ? "Enabled" : "Disabled");
+ systemPrint("28) Firmware mode: ");
+ systemPrintf("%s\r\n", PERIODIC_SETTING(PD_FIRMWARE_MODE) ? "Enabled" : "Disabled");
+
systemPrintln("------ Clients -----");
systemPrint("40) NTP server data: ");
systemPrintf("%s\r\n", PERIODIC_SETTING(PD_NTP_SERVER_DATA) ? "Enabled" : "Disabled");
@@ -1356,6 +1359,8 @@ void menuPeriodicPrint()
settings.enablePrintStates ^= 1;
else if (incoming == 27)
PERIODIC_TOGGLE(PD_CORRECTION_SOURCE);
+ else if (incoming == 28)
+ PERIODIC_TOGGLE(PD_FIRMWARE_MODE);
else if (incoming == 40)
PERIODIC_TOGGLE(PD_NTP_SERVER_DATA);
diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h
index 33efb9b1a..687efc033 100644
--- a/Firmware/RTK_Everywhere/settings.h
+++ b/Firmware/RTK_Everywhere/settings.h
@@ -372,6 +372,8 @@ enum PeriodDisplayValues
PD_WEB_SERVER_STATE, // 39
PD_OTA_STATE, // 40
+
+ PD_FIRMWARE_MODE, // 41
// Add new values before this line
};
@@ -695,6 +697,7 @@ struct Settings
// ZED (it has separate messages for MSM4 vs. MSM7)
// UM980 (it has separate messages for MSM4 vs. MSM7)
bool useMSM7 = false;
+ int rtcmMinElev = -90; // LG290P - minimum elevation for RTCM (PQTMCFGRTCM)
// Battery
bool enablePrintBatteryMessages = true;
@@ -1021,7 +1024,7 @@ struct Settings
bool enableImuCompensationDebug = false;
bool enableImuDebug = false; // Turn on to display IMU library debug messages
bool enableTiltCompensation = true; // Allow user to disable tilt compensation on the models that have an IMU
- bool enableGalileoHas = true; // Allow E6 corrections if possible
+ bool enableGalileoHas = true; // Allow E6 corrections if possible. Also needed on LG290P
#ifdef COMPILE_UM980
uint8_t um980Constellations[MAX_UM980_CONSTELLATIONS] = {254}; // Mark first record with key so defaults will be applied.
float um980MessageRatesNMEA[MAX_UM980_NMEA_MSG] = {254}; // Mark first record with key so defaults will be applied.
@@ -1201,6 +1204,7 @@ typedef enum
ALL = (1 << 5) - 1, // ALL - must be the highest single variant
ZED = ZF9 | ZX2, // Hybrids are possible (enums don't have to be consecutive)
MSM = L29, // Platforms which require parameter selection of MSM7 over MSM4
+ HAS = L29, // Platforms which support Galileo HAS
} Facet_Flex_Variant;
typedef bool (* AFTER_CMD)(int cmdIndex);
@@ -1321,7 +1325,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] =
// n a f t s o B c F h
// f n f E a r a a l
// i d i v V i c n r e X
-// g s x k 2 c h d d x 2 Type Qual Variable Name
+// g s x k 2 c h d d x 2 Type Qual Variable Name afterSetCmd
// Antenna
{ 1, 1, 0, 1, 1, 1, 1, 1, 1, ALL, 1, _int16_t, 0, & settings.antennaHeight_mm, "antennaHeight_mm", nullptr, },
@@ -1343,6 +1347,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] =
{ 1, 1, 0, 1, 1, 1, 1, 1, 1, ALL, 1, _float, 2, & settings.observationPositionAccuracy, "observationPositionAccuracy", nullptr, },
{ 0, 1, 0, 1, 1, 0, 1, 1, 1, ALL, 1, _float, 1, & settings.surveyInStartingAccuracy, "surveyInStartingAccuracy", nullptr, },
{ 0, 1, 0, 0, 0, 0, 0, 0, 1, MSM, 1, _bool, 0, & settings.useMSM7, "useMSM7", nullptr, },
+ { 0, 1, 0, 0, 0, 0, 0, 0, 1, MSM, 1, _int, 0, & settings.rtcmMinElev, "rtcmMinElev", nullptr, },
// Battery
{ 0, 0, 0, 0, 1, 1, 1, 1, 1, ALL, 1, _bool, 0, & settings.enablePrintBatteryMessages, "enablePrintBatteryMessages", nullptr, },
@@ -1780,7 +1785,7 @@ const RTK_Settings_Entry rtkSettingsEntries[] =
// g s x k 2 c h d d x 2 Type Qual Variable Name afterSetCmd
// UM980 GNSS Receiver - TODO these apply to more than UM980
- { 1, 1, 0, 0, 0, 0, 1, 0, 1, NON, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", nullptr, },
+ { 1, 1, 0, 0, 0, 0, 1, 0, 1, HAS, 1, _bool, 0, & settings.enableGalileoHas, "enableGalileoHas", nullptr, },
{ 1, 1, 0, 0, 0, 0, 1, 0, 0, ALL, 0, _bool, 3, & settings.enableMultipathMitigation, "enableMultipathMitigation", nullptr, },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, ALL, 0, _bool, 0, & settings.enableImuCompensationDebug, "enableImuCompensationDebug", nullptr, },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, ALL, 0, _bool, 0, & settings.enableImuDebug, "enableImuDebug", nullptr, },