From f91540243053d9fa300f9a28ea3d6b1fe9fbb2e4 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 11 Jan 2024 13:19:05 -0700 Subject: [PATCH] Update test sketch with new variants --- Firmware/Test Sketches/System_Check/Begin.ino | 320 ++++++++++++------ .../System_Check/System_Check.ino | 55 +-- .../System_Check/menuFirmware.ino | 32 ++ .../Test Sketches/System_Check/menuSystem.ino | 30 -- .../Test Sketches/System_Check/settings.h | 17 + 5 files changed, 296 insertions(+), 158 deletions(-) create mode 100644 Firmware/Test Sketches/System_Check/menuFirmware.ino diff --git a/Firmware/Test Sketches/System_Check/Begin.ino b/Firmware/Test Sketches/System_Check/Begin.ino index 781e2a254..0073adaee 100644 --- a/Firmware/Test Sketches/System_Check/Begin.ino +++ b/Firmware/Test Sketches/System_Check/Begin.ino @@ -1,37 +1,128 @@ -void beginBoard() + +#define MAX_ADC_VOLTAGE 3300 // Millivolts + +// Testing shows the combined ADC+resistors is under a 1% window +#define TOLERANCE 5.20 // Percent: 94.8% - 105.2% + +//---------------------------------------- +// Hardware initialization functions +//---------------------------------------- +// Determine if the measured value matches the product ID value +// idWithAdc applies resistor tolerance using worst-case tolerances: +// Upper threshold: R1 down by TOLERANCE, R2 up by TOLERANCE +// Lower threshold: R1 up by TOLERANCE, R2 down by TOLERANCE +bool idWithAdc(uint16_t mvMeasured, float r1, float r2) { - //Use ADC to check 50% resistor divider - int pin_adc_rtk_facet = 35; - uint16_t idValue = analogReadMilliVolts(pin_adc_rtk_facet); - log_d("Board ADC ID: %d", idValue); + float lowerThreshold; + float upperThreshold; - if (idValue > (3300 / 2 * 0.9) && idValue < (3300 / 2 * 1.1)) - { - productVariant = RTK_FACET; - } - else if (idValue > (3300 * 2 / 3 * 0.9) && idValue < (3300 * 2 / 3 * 1.1)) + // ADC input + // r1 KOhms | r2 KOhms + // MAX_ADC_VOLTAGE -----/\/\/\/\-----+-----/\/\/\/\----- Ground + + // Return true if the mvMeasured value is within the tolerance range + // of the mvProduct value + upperThreshold = ceil(MAX_ADC_VOLTAGE * (r2 * (1.0 + (TOLERANCE / 100.0))) / + ((r1 * (1.0 - (TOLERANCE / 100.0))) + (r2 * (1.0 + (TOLERANCE / 100.0))))); + lowerThreshold = floor(MAX_ADC_VOLTAGE * (r2 * (1.0 - (TOLERANCE / 100.0))) / + ((r1 * (1.0 + (TOLERANCE / 100.0))) + (r2 * (1.0 - (TOLERANCE / 100.0))))); + + // Serial.printf("r1: %0.2f r2: %0.2f lowerThreshold: %0.0f mvMeasured: %d upperThreshold: %0.0f\r\n", r1, r2, + // lowerThreshold, mvMeasured, upperThreshold); + + return (upperThreshold > mvMeasured) && (mvMeasured > lowerThreshold); +} + +// Use a pair of resistors on pin 35 to ID the board type +// If the ID resistors are not available then use a variety of other methods +// (I2C, GPIO test, etc) to ID the board. +// Assume no hardware interfaces have been started so we need to start/stop any hardware +// used in tests accordingly. +void identifyBoard() +{ + // Use ADC to check the resistor divider + int pin_deviceID = 35; + uint16_t idValue = analogReadMilliVolts(pin_deviceID); + Serial.printf("Board ADC ID (mV): %d\r\n", idValue); + + // Order the following ID checks, by millivolt values high to low + + // Facet L-Band Direct: 4.7/1 --> 534mV < 579mV < 626mV + if (idWithAdc(idValue, 4.7, 1)) { - productVariant = RTK_FACET_LBAND; + Serial.println("Found LBand Direct"); + productVariant = RTK_FACET_LBAND_DIRECT; } - else if (idValue > (3300 * 3.3 / 13.3 * 0.9) && idValue < (3300 * 3.3 / 13.3 * 1.1)) + + // Express: 10/3.3 --> 761mV < 819mV < 879mV + else if (idWithAdc(idValue, 10, 3.3)) { + Serial.println("Found Express"); productVariant = RTK_EXPRESS; } - else if (idValue > (3300 * 10 / 13.3 * 0.9) && idValue < (3300 * 10 / 13.3 * 1.1)) + + // Reference Station: 20/10 --> 1031mV < 1100mV < 1171mV + else if (idWithAdc(idValue, 20, 10)) { - productVariant = RTK_EXPRESS_PLUS; + productVariant = REFERENCE_STATION; + // We can't auto-detect the ZED version if the firmware is in configViaEthernet mode, + // so fake it here - otherwise messageSupported always returns false + zedFirmwareVersionInt = 112; } - else if (isConnected(0x19) == true) //Check for accelerometer + // Facet: 10/10 --> 1571mV < 1650mV < 1729mV + else if (idWithAdc(idValue, 10, 10)) + productVariant = RTK_FACET; + + // Facet L-Band: 10/20 --> 2129mV < 2200mV < 2269mV + else if (idWithAdc(idValue, 10, 20)) + productVariant = RTK_FACET_LBAND; + + // Express+: 3.3/10 --> 2421mV < 2481mV < 2539mV + else if (idWithAdc(idValue, 3.3, 10)) + productVariant = RTK_EXPRESS_PLUS; + + // ID resistors do not exist for the following: + // Surveyor + // Unknown + else { - if (zedModuleType == PLATFORM_F9P) productVariant = RTK_EXPRESS; - else if (zedModuleType == PLATFORM_F9R) productVariant = RTK_EXPRESS_PLUS; + Serial.println("Out of band or nonexistent resistor IDs"); + productVariant = RTK_UNKNOWN; // Need to wait until the GNSS and Accel have been initialized } - else +} + +void beginBoard() +{ + if (productVariant == RTK_UNKNOWN) { - productVariant = RTK_SURVEYOR; + if (isConnected(0x19) == true) // Check for accelerometer + { + if (zedModuleType == PLATFORM_F9P) + productVariant = RTK_EXPRESS; + else if (zedModuleType == PLATFORM_F9R) + productVariant = RTK_EXPRESS_PLUS; + } + else + { + // Detect RTK Expresses (v1.3 and below) that do not have an accel or device ID resistors + + // On a Surveyor, pin 34 is not connected. On Express, 34 is connected to ZED_TX_READY + const int pin_ZedTxReady = 34; + uint16_t pinValue = analogReadMilliVolts(pin_ZedTxReady); + log_d("Alternate ID pinValue (mV): %d\r\n", pinValue); // Surveyor = 142 to 152, //Express = 3129 + if (pinValue > 3000) + { + if (zedModuleType == PLATFORM_F9P) + productVariant = RTK_EXPRESS; + else if (zedModuleType == PLATFORM_F9R) + productVariant = RTK_EXPRESS_PLUS; + } + else + productVariant = RTK_SURVEYOR; + } } - //Setup hardware pins + // Setup hardware pins if (productVariant == RTK_SURVEYOR) { pin_batteryLevelLED_Red = 32; @@ -46,13 +137,10 @@ void beginBoard() pin_zed_tx_ready = 26; pin_zed_reset = 27; pin_batteryLevel_alert = 36; - // - // //Bug in ZED-F9P v1.13 firmware causes RTK LED to not light when RTK Floating with SBAS on. - // //The following changes the POR default but will be overwritten by settings in NVM or settings file - // settings.ubxConstellations[1].enabled = false; - strcpy(platformFilePrefix, "SFE_Surveyor"); - strcpy(platformPrefix, "Surveyor"); + // Bug in ZED-F9P v1.13 firmware causes RTK LED to not light when RTK Floating with SBAS on. + // The following changes the POR default but will be overwritten by settings in NVM or settings file + settings.ubxConstellations[1].enabled = false; } else if (productVariant == RTK_EXPRESS || productVariant == RTK_EXPRESS_PLUS) { @@ -67,30 +155,20 @@ void beginBoard() pinMode(pin_powerSenseAndControl, INPUT_PULLUP); pinMode(pin_powerFastOff, INPUT); - // + // if (esp_reset_reason() == ESP_RST_POWERON) // { - // powerOnCheck(); //Only do check if we POR start + // powerOnCheck(); // Only do check if we POR start // } - // - // pinMode(pin_setupButton, INPUT_PULLUP); - // - // setMuxport(settings.dataPortChannel); //Set mux to user's choice: NMEA, I2C, PPS, or DAC - if (productVariant == RTK_EXPRESS) - { - strcpy(platformFilePrefix, "SFE_Express"); - strcpy(platformPrefix, "Express"); - } - else if (productVariant == RTK_EXPRESS_PLUS) - { - strcpy(platformFilePrefix, "SFE_Express_Plus"); - strcpy(platformPrefix, "Express Plus"); - } + pinMode(pin_setupButton, INPUT_PULLUP); + + //setMuxport(settings.dataPortChannel); // Set mux to user's choice: NMEA, I2C, PPS, or DAC } - else if (productVariant == RTK_FACET || productVariant == RTK_FACET_LBAND) + else if (productVariant == RTK_FACET || productVariant == RTK_FACET_LBAND || + productVariant == RTK_FACET_LBAND_DIRECT) { - // //v11 + // v11 pin_muxA = 2; pin_muxB = 0; pin_powerSenseAndControl = 13; @@ -105,81 +183,113 @@ void beginBoard() pin_radio_rst = 15; pin_radio_pwr = 4; pin_radio_cts = 5; - //pin_radio_rts = 255; //Not implemented + // pin_radio_rts = 255; //Not implemented pinMode(pin_powerSenseAndControl, INPUT_PULLUP); pinMode(pin_powerFastOff, INPUT); // if (esp_reset_reason() == ESP_RST_POWERON) // { - // powerOnCheck(); //Only do check if we POR start + // powerOnCheck(); // Only do check if we POR start // } - // - // pinMode(pin_peripheralPowerControl, OUTPUT); - // digitalWrite(pin_peripheralPowerControl, HIGH); //Turn on SD, ZED, etc - // - // setMuxport(settings.dataPortChannel); //Set mux to user's choice: NMEA, I2C, PPS, or DAC - // - // //CTS is active low. ESP32 pin 5 has pullup at POR. We must drive it low. - // pinMode(pin_radio_cts, OUTPUT); - // digitalWrite(pin_radio_cts, LOW); - if (productVariant == RTK_FACET) + pinMode(pin_peripheralPowerControl, OUTPUT); + digitalWrite(pin_peripheralPowerControl, HIGH); // Turn on SD, ZED, etc + + //setMuxport(settings.dataPortChannel); // Set mux to user's choice: NMEA, I2C, PPS, or DAC + + // CTS is active low. ESP32 pin 5 has pullup at POR. We must drive it low. + pinMode(pin_radio_cts, OUTPUT); + digitalWrite(pin_radio_cts, LOW); + + if (productVariant == RTK_FACET_LBAND_DIRECT) { - strcpy(platformFilePrefix, "SFE_Facet"); - strcpy(platformPrefix, "Facet"); + // Override the default setting if a user has not explicitly configured the setting + // if (settings.useI2cForLbandCorrectionsConfigured == false) + // settings.useI2cForLbandCorrections = false; } - else if (productVariant == RTK_FACET_LBAND) + } + else if (productVariant == REFERENCE_STATION) + { + // No powerOnCheck + + //settings.enablePrintBatteryMessages = false; // No pesky battery messages + } + + char versionString[21]; + getFirmwareVersion(versionString, sizeof(versionString), true); + Serial.printf("SparkFun RTK %s %s\r\n", platformPrefix, versionString); + + // Get unit MAC address + esp_read_mac(wifiMACAddress, ESP_MAC_WIFI_STA); + memcpy(btMACAddress, wifiMACAddress, sizeof(wifiMACAddress)); + btMACAddress[5] += + 2; // Convert MAC address to Bluetooth MAC (add 2): + // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system.html#mac-address + memcpy(ethernetMACAddress, wifiMACAddress, sizeof(wifiMACAddress)); + ethernetMACAddress[5] += 3; // Convert MAC address to Ethernet MAC (add 3) + + // For all boards, check reset reason. If reset was due to wdt or panic, append last log + //loadSettingsPartial(); // Loads settings from LFS + if ((esp_reset_reason() == ESP_RST_POWERON) || (esp_reset_reason() == ESP_RST_SW)) + { + //reuseLastLog = false; // Start new log + + if (settings.enableResetDisplay == true) { - strcpy(platformFilePrefix, "SFE_Facet_LBand"); - strcpy(platformPrefix, "Facet L-Band"); + settings.resetCount = 0; + // recordSystemSettingsToFileLFS(settingsFileName); // Avoid overwriting LittleFS settings onto SD } + settings.resetCount = 0; } + else + { + //reuseLastLog = true; // Attempt to reuse previous log + + if (settings.enableResetDisplay == true) + { + settings.resetCount++; + Serial.printf("resetCount: %d\r\n", settings.resetCount); + //recordSystemSettingsToFileLFS(settingsFileName); // Avoid overwriting LittleFS settings onto SD + } - //Get unit MAC address - esp_read_mac(unitMACAddress, ESP_MAC_WIFI_STA); - unitMACAddress[5] += 2; //Convert MAC address to Bluetooth MAC (add 2): https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system.html#mac-address - - // //For all boards, check reset reason. If reset was due to wdt or panic, append last log - // if (esp_reset_reason() == ESP_RST_POWERON) - // { - // reuseLastLog = false; //Start new log - // - // loadSettingsPartial(); - // if (settings.enableResetDisplay == true) - // { - // settings.resetCount = 0; - // recordSystemSettings(); //Record to NVM - // } - // } - // else - // { - // reuseLastLog = true; //Attempt to reuse previous log - // - // loadSettingsPartial(); - // if (settings.enableResetDisplay == true) - // { - // settings.resetCount++; - // Serial.printf("resetCount: %d\n\r", settings.resetCount); - // recordSystemSettings(); //Record to NVM - // } - // - // Serial.print("Reset reason: "); - // switch (esp_reset_reason()) - // { - // case ESP_RST_UNKNOWN: Serial.println(F("ESP_RST_UNKNOWN")); break; - // case ESP_RST_POWERON : Serial.println(F("ESP_RST_POWERON")); break; - // case ESP_RST_SW : Serial.println(F("ESP_RST_SW")); break; - // case ESP_RST_PANIC : Serial.println(F("ESP_RST_PANIC")); break; - // case ESP_RST_INT_WDT : Serial.println(F("ESP_RST_INT_WDT")); break; - // case ESP_RST_TASK_WDT : Serial.println(F("ESP_RST_TASK_WDT")); break; - // case ESP_RST_WDT : Serial.println(F("ESP_RST_WDT")); break; - // case ESP_RST_DEEPSLEEP : Serial.println(F("ESP_RST_DEEPSLEEP")); break; - // case ESP_RST_BROWNOUT : Serial.println(F("ESP_RST_BROWNOUT")); break; - // case ESP_RST_SDIO : Serial.println(F("ESP_RST_SDIO")); break; - // default : Serial.println(F("Unknown")); - // } - // } + Serial.print("Reset reason: "); + switch (esp_reset_reason()) + { + case ESP_RST_UNKNOWN: + Serial.println("ESP_RST_UNKNOWN"); + break; + case ESP_RST_POWERON: + Serial.println("ESP_RST_POWERON"); + break; + case ESP_RST_SW: + Serial.println("ESP_RST_SW"); + break; + case ESP_RST_PANIC: + Serial.println("ESP_RST_PANIC"); + break; + case ESP_RST_INT_WDT: + Serial.println("ESP_RST_INT_WDT"); + break; + case ESP_RST_TASK_WDT: + Serial.println("ESP_RST_TASK_WDT"); + break; + case ESP_RST_WDT: + Serial.println("ESP_RST_WDT"); + break; + case ESP_RST_DEEPSLEEP: + Serial.println("ESP_RST_DEEPSLEEP"); + break; + case ESP_RST_BROWNOUT: + Serial.println("ESP_RST_BROWNOUT"); + break; + case ESP_RST_SDIO: + Serial.println("ESP_RST_SDIO"); + break; + default: + Serial.println("Unknown"); + } + } } diff --git a/Firmware/Test Sketches/System_Check/System_Check.ino b/Firmware/Test Sketches/System_Check/System_Check.ino index 7105725f8..8d7cbd6f9 100644 --- a/Firmware/Test Sketches/System_Check/System_Check.ino +++ b/Firmware/Test Sketches/System_Check/System_Check.ino @@ -101,25 +101,25 @@ uint8_t zedModuleType = PLATFORM_F9P; //Controls which messages are supported an class SFE_UBLOX_GNSS_SUPER_DERIVED : public SFE_UBLOX_GNSS_SUPER { -public: - volatile bool _iAmLocked = false; - bool lock(void) - { - if (_iAmLocked) + public: + volatile bool _iAmLocked = false; + bool lock(void) { - unsigned long startTime = millis(); - while (_iAmLocked && (millis() < (startTime + 2100))) - delay(1); //YIELD if (_iAmLocked) - return false; + { + unsigned long startTime = millis(); + while (_iAmLocked && (millis() < (startTime + 2100))) + delay(1); //YIELD + if (_iAmLocked) + return false; + } + _iAmLocked = true; + return true; + } + void unlock(void) + { + _iAmLocked = false; } - _iAmLocked = true; - return true; - } - void unlock(void) - { - _iAmLocked = false; - } }; SFE_UBLOX_GNSS_SUPER_DERIVED theGNSS; @@ -227,7 +227,12 @@ char deviceName[30]; //The serial string that is broadcast. Ex: 'Surveyor Base-B const byte menuTimeout = 250; //Menus will exit/timeout after this number of seconds unsigned long splashStart = 0; //Controls how long the splash is displayed for. Currently min of 2s. -char platformPrefix[40] = "Surveyor"; //Sets the prefix for broadcast names +uint8_t wifiMACAddress[6]; // Display this address in the system menu +uint8_t btMACAddress[6]; // Display this address when Bluetooth is enabled, otherwise display wifiMACAddress +uint8_t ethernetMACAddress[6]; // Display this address when Ethernet is enabled, otherwise display wifiMACAddress + +#define platformPrefix platformPrefixTable[productVariant] // Sets the prefix for broadcast names + bool zedUartPassed = false; //Goes true during testing if ESP can communicate with ZED over UART //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -235,6 +240,8 @@ void setup() { Serial.begin(115200); delay(250); + Serial.println(); + Serial.println(F("SparkFun RTK System Check Tool")); // int pinNumber1 = 21; // int pinNumber2 = 22; @@ -280,12 +287,14 @@ void setup() unsigned long startTime = millis(); Wire.beginTransmission(0x15); //Dummy address int endValue = Wire.endTransmission(); - Serial.printf("Response time: %d endValue: %d\n\r", millis() - startTime, endValue); + Serial.printf("Response time: %ld endValue: %d\n\r", millis() - startTime, endValue); if (endValue == 2) online.i2c = true; else if (endValue == 5) Serial.println("It appears something is shorting the I2C lines."); + identifyBoard(); // Determine what hardware platform we are running on + beginBoard(); //Determine what hardware platform we are running on and check on button beginSD(); //Test if SD is present @@ -337,12 +346,12 @@ void setup() } //Select port 0 on MUX so UART1 is connected to ZED if bootloading is needed - if(pin_muxA >= 0) + if (pin_muxA >= 0) { pinMode(pin_muxA, OUTPUT); digitalWrite(pin_muxA, LOW); } - if(pin_muxB >= 0) + if (pin_muxB >= 0) { pinMode(pin_muxB, OUTPUT); digitalWrite(pin_muxB, LOW); @@ -356,13 +365,13 @@ void loop() { delay(10); - if(pin_powerSenseAndControl >= 0) + if (pin_powerSenseAndControl >= 0) { - if(digitalRead(pin_powerSenseAndControl) == LOW) + if (digitalRead(pin_powerSenseAndControl) == LOW) { Serial.println("Power button pressed"); ESP.restart(); //Use the power button as a reset } - + } } diff --git a/Firmware/Test Sketches/System_Check/menuFirmware.ino b/Firmware/Test Sketches/System_Check/menuFirmware.ino new file mode 100644 index 000000000..7986e8fde --- /dev/null +++ b/Firmware/Test Sketches/System_Check/menuFirmware.ino @@ -0,0 +1,32 @@ +// Format the firmware version +void formatFirmwareVersion(uint8_t major, uint8_t minor, char *buffer, int bufferLength, bool includeDate) +{ + char prefix; + + // Construct the full or release candidate version number + prefix = 'd'; + // if (enableRCFirmware && (bufferLength >= 21)) + // // 123456789012345678901 + // // pxxx.yyy-dd-mmm-yyyy0 + // snprintf(buffer, bufferLength, "%c%d.%d-%s", prefix, major, minor, __DATE__); + + // Construct a truncated version number + if (bufferLength >= 9) + // 123456789 + // pxxx.yyy0 + snprintf(buffer, bufferLength, "%c%d.%d", prefix, major, minor); + + // The buffer is too small for the version number + else + { + Serial.printf("ERROR: Buffer too small for version number!\r\n"); + if (bufferLength > 0) + *buffer = 0; + } +} + +// Get the current firmware version +void getFirmwareVersion(char *buffer, int bufferLength, bool includeDate) +{ + formatFirmwareVersion(FIRMWARE_VERSION_MAJOR, FIRMWARE_VERSION_MINOR, buffer, bufferLength, includeDate); +} diff --git a/Firmware/Test Sketches/System_Check/menuSystem.ino b/Firmware/Test Sketches/System_Check/menuSystem.ino index 6d3bcf24a..4ca21dfff 100644 --- a/Firmware/Test Sketches/System_Check/menuSystem.ino +++ b/Firmware/Test Sketches/System_Check/menuSystem.ino @@ -5,36 +5,6 @@ void menuSystem() while (1) { - Serial.println(); - Serial.println(F("SparkFun RTK System Check Tool")); - - //Use ADC to check resistor divider - int pin_adc_rtk_facet = 35; - uint16_t idValue = analogReadMilliVolts(pin_adc_rtk_facet); - - Serial.print("Board ID: "); - if (idValue > (3300 / 2 * 0.9) && idValue < (3300 / 2 * 1.1)) - Serial.print("I think this is a RTK Facet because resistor divider ID matches."); - else if (idValue > (3300 * 2 / 3 * 0.9) && idValue < (3300 * 2 / 3 * 1.1)) - Serial.print("I think this is a RTK Facet L-Band because resistor divider ID matches."); - else if (idValue > (3300 * 3.3 / 13.3 * 0.9) && idValue < (3300 * 3.3 / 13.3 * 1.1)) - Serial.print("I think this is a RTK Express because resistor divider ID matches."); - else if (idValue > (3300 * 10 / 13.3 * 0.9) && idValue < (3300 * 10 / 13.3 * 1.1)) - Serial.print("I think this is a RTK Express Plus because resistor divider ID matches."); - else if (isConnected(0x19) == true) //Check for accelerometer - { - if (zedModuleType == PLATFORM_F9P) - Serial.print("I think this is a RTK Express because the accelerometer is present and the ZED is F9P."); - else if (zedModuleType == PLATFORM_F9R) - Serial.print("I think this is a RTK Express Plus because the accelerometer is present and the ZED is F9R."); - } - else - { - Serial.print("I don't know what board this is. No ADC value matches."); - } - Serial.println(); - Serial.printf("Board ADC ID: %d\r\n", idValue); - if (online.i2c == false) { Serial.println("I2C: Offline - Something is causing bus problems"); diff --git a/Firmware/Test Sketches/System_Check/settings.h b/Firmware/Test Sketches/System_Check/settings.h index b7c831ca9..702fdb99d 100644 --- a/Firmware/Test Sketches/System_Check/settings.h +++ b/Firmware/Test Sketches/System_Check/settings.h @@ -51,6 +51,19 @@ SystemState lastSystemState = STATE_ROVER_NOT_STARTED; SystemState requestedSystemState = STATE_ROVER_NOT_STARTED; bool newSystemStateRequested = false; +const char *const platformPrefixTable[] = { + "Surveyor", + "Express", + "Facet", + "Express Plus", + "Facet L-Band", + "Reference Station", + "Facet L-Band Direct", + // Add new values just above this line + "Unknown", +}; +const int platformPrefixTableEntries = sizeof(platformPrefixTable) / sizeof(platformPrefixTable[0]); + //The setup display can show a limited set of states //When user pauses for X amount of time, system will enter that state SystemState setupState = STATE_MARK_EVENT; @@ -62,6 +75,10 @@ typedef enum RTK_FACET, RTK_EXPRESS_PLUS, RTK_FACET_LBAND, + REFERENCE_STATION, + RTK_FACET_LBAND_DIRECT, + // Add new values just above this line + RTK_UNKNOWN, } ProductVariant; ProductVariant productVariant = RTK_SURVEYOR;