Skip to content

Commit 7d9129b

Browse files
committed
Config ZED only when needed to reduce boot time
1 parent 4b0d14c commit 7d9129b

File tree

7 files changed

+249
-38
lines changed

7 files changed

+249
-38
lines changed

Firmware/RTK_Surveyor/Base.ino

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,25 @@ bool configureUbloxModuleBase()
77
bool response = true;
88
int maxWait = 2000;
99

10+
//If our settings haven't changed, and this is first config since power on, trust ZED's settings
11+
if(updateZEDSettings == false && firstPowerOn == true)
12+
{
13+
firstPowerOn = false; //Next time user switches modes, new settings will be applied
14+
log_d("Skipping ZED Base configuration");
15+
return(true);
16+
}
17+
18+
//The first thing we do is go to 1Hz to lighten any I2C traffic from a previous configuration
19+
if (i2cGNSS.getNavigationFrequency(maxWait) != 1)
20+
response &= i2cGNSS.setNavigationFrequency(1, maxWait);
21+
if (response == false)
22+
Serial.println(F("Set rate failed"));
23+
1024
i2cGNSS.checkUblox(); //Regularly poll to get latest data and any RTCM
1125

1226
if (i2cGNSS.getSurveyInActive() == true)
1327
{
28+
log_d("Disabling survey");
1429
response = i2cGNSS.disableSurveyMode(maxWait); //Disable survey
1530
if (response == false)
1631
Serial.println(F("Disable Survey failed"));
@@ -61,6 +76,10 @@ bool configureUbloxModuleBase()
6176
return (false);
6277
}
6378

79+
response &= i2cGNSS.saveConfiguration(); //Save the current settings to flash and BBR
80+
if (response == false)
81+
Serial.println(F("Module failed to save."));
82+
6483
return (response);
6584
}
6685

Firmware/RTK_Surveyor/Begin.ino

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ void beginGNSS()
354354
{
355355
if (i2cGNSS.begin() == false)
356356
{
357+
log_d("GNSS Failed to begin. Trying again.");
358+
357359
//Try again with power on delay
358360
delay(1000); //Wait for ZED-F9P to power up before it can respond to ACK
359361
if (i2cGNSS.begin() == false)
@@ -413,6 +415,15 @@ void beginGNSS()
413415
//Configuration can take >1s so configure during splash
414416
void configureGNSS()
415417
{
418+
//Configuring the ZED can take more than 2000ms. We save configuration to
419+
//ZED so there is no need to update settings unless user has modified
420+
//the settings file or internal settings.
421+
if (updateZEDSettings == false)
422+
{
423+
log_d("Skipping ZED configuration");
424+
return;
425+
}
426+
416427
bool response = configureUbloxModule();
417428
if (response == false)
418429
{
@@ -525,7 +536,12 @@ void beginSystemState()
525536
{
526537
if (productVariant == RTK_SURVEYOR)
527538
{
528-
systemState = STATE_ROVER_NOT_STARTED; //Assume Rover. ButtonCheckTask_Switch() will correct as needed.
539+
//If the rocker switch was moved while off, force module settings
540+
//When switch is set to '1' = BASE, pin will be shorted to ground
541+
if (settings.lastState == STATE_ROVER_NOT_STARTED && digitalRead(pin_setupButton) == LOW) updateZEDSettings = true;
542+
else if (settings.lastState == STATE_BASE_NOT_STARTED && digitalRead(pin_setupButton) == HIGH) updateZEDSettings = true;
543+
544+
systemState = STATE_ROVER_NOT_STARTED; //Assume Rover. ButtonCheckTask() will correct as needed.
529545

530546
setupBtn = new Button(pin_setupButton); //Create the button in memory
531547
}
@@ -571,10 +587,16 @@ void beginSystemState()
571587

572588
//Setup the timepulse output on the PPS pin for external triggering
573589
//Setup TM2 time stamp input as need
574-
void beginExternalTriggers()
590+
bool beginExternalTriggers()
575591
{
576-
if (online.gnss == false)
577-
return;
592+
if (online.gnss == false) return (false);
593+
594+
//If our settings haven't changed, trust ZED's settings
595+
if (updateZEDSettings == false)
596+
{
597+
log_d("Skipping ZED Trigger configuration");
598+
return (true);
599+
}
578600

579601
UBX_CFG_TP5_data_t timePulseParameters;
580602

@@ -604,4 +626,10 @@ void beginExternalTriggers()
604626
i2cGNSS.setAutoTIMTM2callback(&eventTriggerReceived); //Enable automatic TIM TM2 messages with callback to eventTriggerReceived
605627
else
606628
i2cGNSS.setAutoTIMTM2callback(NULL);
629+
630+
bool response = i2cGNSS.saveConfiguration(); //Save the current settings to flash and BBR
631+
if (response == false)
632+
Serial.println(F("Module failed to save."));
633+
634+
return (response);
607635
}

Firmware/RTK_Surveyor/NVM.ino

Lines changed: 159 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -541,25 +541,85 @@ bool parseLine(char* str) {
541541
else if (strcmp(settingName, "maxLogLength_minutes") == 0)
542542
settings.maxLogLength_minutes = d;
543543
else if (strcmp(settingName, "observationSeconds") == 0)
544-
settings.observationSeconds = d;
544+
{
545+
if (settings.observationSeconds != d) //If a setting for the ZED has changed, apply, and trigger module config update
546+
{
547+
settings.observationSeconds = d;
548+
updateZEDSettings = true;
549+
}
550+
}
545551
else if (strcmp(settingName, "observationPositionAccuracy") == 0)
546-
settings.observationPositionAccuracy = d;
552+
{
553+
if (settings.observationPositionAccuracy != d)
554+
{
555+
settings.observationPositionAccuracy = d;
556+
updateZEDSettings = true;
557+
}
558+
}
547559
else if (strcmp(settingName, "fixedBase") == 0)
548-
settings.fixedBase = d;
560+
{
561+
if (settings.fixedBase != d)
562+
{
563+
settings.fixedBase = d;
564+
updateZEDSettings = true;
565+
}
566+
}
549567
else if (strcmp(settingName, "fixedBaseCoordinateType") == 0)
550-
settings.fixedBaseCoordinateType = d;
568+
{
569+
if (settings.fixedBaseCoordinateType != d)
570+
{
571+
settings.fixedBaseCoordinateType = d;
572+
updateZEDSettings = true;
573+
}
574+
}
551575
else if (strcmp(settingName, "fixedEcefX") == 0)
552-
settings.fixedEcefX = d;
576+
{
577+
if (settings.fixedEcefX != d)
578+
{
579+
settings.fixedEcefX = d;
580+
updateZEDSettings = true;
581+
}
582+
}
553583
else if (strcmp(settingName, "fixedEcefY") == 0)
554-
settings.fixedEcefY = d;
584+
{
585+
if (settings.fixedEcefY != d)
586+
{
587+
settings.fixedEcefY = d;
588+
updateZEDSettings = true;
589+
}
590+
}
555591
else if (strcmp(settingName, "fixedEcefZ") == 0)
556-
settings.fixedEcefZ = d;
592+
{
593+
if (settings.fixedEcefZ != d)
594+
{
595+
settings.fixedEcefZ = d;
596+
updateZEDSettings = true;
597+
}
598+
}
557599
else if (strcmp(settingName, "fixedLat") == 0)
558-
settings.fixedLat = d;
600+
{
601+
if (settings.fixedLat != d)
602+
{
603+
settings.fixedLat = d;
604+
updateZEDSettings = true;
605+
}
606+
}
559607
else if (strcmp(settingName, "fixedLong") == 0)
560-
settings.fixedLong = d;
608+
{
609+
if (settings.fixedLong != d)
610+
{
611+
settings.fixedLong = d;
612+
updateZEDSettings = true;
613+
}
614+
}
561615
else if (strcmp(settingName, "fixedAltitude") == 0)
562-
settings.fixedAltitude = d;
616+
{
617+
if (settings.fixedAltitude != d)
618+
{
619+
settings.fixedAltitude = d;
620+
updateZEDSettings = true;
621+
}
622+
}
563623
else if (strcmp(settingName, "dataPortBaud") == 0)
564624
settings.dataPortBaud = d;
565625
else if (strcmp(settingName, "radioPortBaud") == 0)
@@ -570,7 +630,6 @@ bool parseLine(char* str) {
570630
strcpy(settings.casterHost, settingValue);
571631
else if (strcmp(settingName, "casterPort") == 0)
572632
settings.casterPort = d;
573-
574633
else if (strcmp(settingName, "casterUser") == 0)
575634
strcpy(settings.casterUser, settingValue);
576635
else if (strcmp(settingName, "casterUserPW") == 0)
@@ -592,9 +651,21 @@ bool parseLine(char* str) {
592651
else if (strcmp(settingName, "surveyInStartingAccuracy") == 0)
593652
settings.surveyInStartingAccuracy = d;
594653
else if (strcmp(settingName, "measurementRate") == 0)
595-
settings.measurementRate = d;
654+
{
655+
if (settings.measurementRate != d)
656+
{
657+
settings.measurementRate = d;
658+
updateZEDSettings = true;
659+
}
660+
}
596661
else if (strcmp(settingName, "navigationRate") == 0)
597-
settings.navigationRate = d;
662+
{
663+
if (settings.navigationRate != d)
664+
{
665+
settings.navigationRate = d;
666+
updateZEDSettings = true;
667+
}
668+
}
598669
else if (strcmp(settingName, "enableI2Cdebug") == 0)
599670
settings.enableI2Cdebug = d;
600671
else if (strcmp(settingName, "enableHeapReport") == 0)
@@ -612,27 +683,81 @@ bool parseLine(char* str) {
612683
else if (strcmp(settingName, "sppTxQueueSize") == 0)
613684
settings.sppTxQueueSize = d;
614685
else if (strcmp(settingName, "dynamicModel") == 0)
615-
settings.dynamicModel = d;
686+
{
687+
if (settings.dynamicModel != d)
688+
{
689+
settings.dynamicModel = d;
690+
updateZEDSettings = true;
691+
}
692+
}
616693
else if (strcmp(settingName, "lastState") == 0)
617-
settings.lastState = (SystemState)d;
694+
{
695+
if (settings.lastState != (SystemState)d)
696+
{
697+
settings.lastState = (SystemState)d;
698+
updateZEDSettings = true;
699+
}
700+
}
618701
else if (strcmp(settingName, "throttleDuringSPPCongestion") == 0)
619702
settings.throttleDuringSPPCongestion = d;
620703
else if (strcmp(settingName, "enableSensorFusion") == 0)
621-
settings.enableSensorFusion = d;
704+
{
705+
if (settings.enableSensorFusion != d)
706+
{
707+
settings.enableSensorFusion = d;
708+
updateZEDSettings = true;
709+
}
710+
}
622711
else if (strcmp(settingName, "autoIMUmountAlignment") == 0)
623-
settings.autoIMUmountAlignment = d;
712+
{
713+
if (settings.autoIMUmountAlignment != d)
714+
{
715+
settings.autoIMUmountAlignment = d;
716+
updateZEDSettings = true;
717+
}
718+
}
624719
else if (strcmp(settingName, "enableResetDisplay") == 0)
625720
settings.enableResetDisplay = d;
626721
else if (strcmp(settingName, "enableExternalPulse") == 0)
627-
settings.enableExternalPulse = d;
722+
{
723+
if (settings.enableExternalPulse != d)
724+
{
725+
settings.enableExternalPulse = d;
726+
updateZEDSettings = true;
727+
}
728+
}
628729
else if (strcmp(settingName, "externalPulseTimeBetweenPulse_us") == 0)
629-
settings.externalPulseTimeBetweenPulse_us = d;
730+
{
731+
if (settings.externalPulseTimeBetweenPulse_us != d)
732+
{
733+
settings.externalPulseTimeBetweenPulse_us = d;
734+
updateZEDSettings = true;
735+
}
736+
}
630737
else if (strcmp(settingName, "externalPulseLength_us") == 0)
631-
settings.externalPulseLength_us = d;
738+
{
739+
if (settings.externalPulseLength_us != d)
740+
{
741+
settings.externalPulseLength_us = d;
742+
updateZEDSettings = true;
743+
}
744+
}
632745
else if (strcmp(settingName, "externalPulsePolarity") == 0)
633-
settings.externalPulsePolarity = (pulseEdgeType_e)d;
746+
{
747+
if (settings.externalPulsePolarity != (pulseEdgeType_e)d)
748+
{
749+
settings.externalPulsePolarity = (pulseEdgeType_e)d;
750+
updateZEDSettings = true;
751+
}
752+
}
634753
else if (strcmp(settingName, "enableExternalHardwareEventLogging") == 0)
635-
settings.enableExternalHardwareEventLogging = d;
754+
{
755+
if (settings.enableExternalHardwareEventLogging != d)
756+
{
757+
settings.enableExternalHardwareEventLogging = d;
758+
updateZEDSettings = true;
759+
}
760+
}
636761
else if (strcmp(settingName, "profileName") == 0)
637762
strcpy(settings.profileName, settingValue);
638763

@@ -652,7 +777,12 @@ bool parseLine(char* str) {
652777

653778
if (strcmp(settingName, tempString) == 0)
654779
{
655-
settings.ubxConstellations[x].enabled = d;
780+
if (settings.ubxConstellations[x].enabled != d)
781+
{
782+
settings.ubxConstellations[x].enabled = d;
783+
updateZEDSettings = true;
784+
}
785+
656786
knownSetting = true;
657787
break;
658788
}
@@ -669,7 +799,12 @@ bool parseLine(char* str) {
669799

670800
if (strcmp(settingName, tempString) == 0)
671801
{
672-
settings.ubxMessages[x].msgRate = d;
802+
if (settings.ubxMessages[x].msgRate != d)
803+
{
804+
settings.ubxMessages[x].msgRate = d;
805+
updateZEDSettings = true;
806+
}
807+
673808
knownSetting = true;
674809
break;
675810
}

Firmware/RTK_Surveyor/RTK_Surveyor.ino

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
const int FIRMWARE_VERSION_MAJOR = 1;
5151
const int FIRMWARE_VERSION_MINOR = 11;
5252

53-
//#define COMPILE_WIFI //Comment out to remove all WiFi functionality
54-
//#define COMPILE_BT //Comment out to disable all Bluetooth
53+
#define COMPILE_WIFI //Comment out to remove all WiFi functionality
54+
#define COMPILE_BT //Comment out to disable all Bluetooth
5555
#define ENABLE_DEVELOPER //Uncomment this line to enable special developer modes (don't check power button at startup)
5656

5757
//Define the RTK board identifier:
@@ -399,6 +399,8 @@ bool newAPSettings = false; //Goes true when new setting is received via AP conf
399399

400400
unsigned int binBytesSent = 0; //Tracks firmware bytes sent over WiFi OTA update via AP config.
401401
int binBytesLastUpdate = 0; //Allows websocket notification to be sent every 100k bytes
402+
bool updateZEDSettings = false; //If settings from file are different from LittleFS, config the ZED
403+
bool firstPowerOn = true; //After boot, apply new settings to ZED if user switches between base or rover
402404

403405
unsigned long startTime = 0; //Used for checking longest running functions
404406
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@@ -438,6 +440,8 @@ void setup()
438440

439441
Serial.flush(); //Complete any previous prints
440442

443+
log_d("Boot time: %d", millis());
444+
441445
danceLEDs(); //Turn on LEDs like a car dashboard
442446
}
443447

0 commit comments

Comments
 (0)