Skip to content

Commit f915402

Browse files
committed
Update test sketch with new variants
1 parent bbd830f commit f915402

File tree

5 files changed

+296
-158
lines changed

5 files changed

+296
-158
lines changed

Firmware/Test Sketches/System_Check/Begin.ino

Lines changed: 215 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,128 @@
1-
void beginBoard()
1+
2+
#define MAX_ADC_VOLTAGE 3300 // Millivolts
3+
4+
// Testing shows the combined ADC+resistors is under a 1% window
5+
#define TOLERANCE 5.20 // Percent: 94.8% - 105.2%
6+
7+
//----------------------------------------
8+
// Hardware initialization functions
9+
//----------------------------------------
10+
// Determine if the measured value matches the product ID value
11+
// idWithAdc applies resistor tolerance using worst-case tolerances:
12+
// Upper threshold: R1 down by TOLERANCE, R2 up by TOLERANCE
13+
// Lower threshold: R1 up by TOLERANCE, R2 down by TOLERANCE
14+
bool idWithAdc(uint16_t mvMeasured, float r1, float r2)
215
{
3-
//Use ADC to check 50% resistor divider
4-
int pin_adc_rtk_facet = 35;
5-
uint16_t idValue = analogReadMilliVolts(pin_adc_rtk_facet);
6-
log_d("Board ADC ID: %d", idValue);
16+
float lowerThreshold;
17+
float upperThreshold;
718

8-
if (idValue > (3300 / 2 * 0.9) && idValue < (3300 / 2 * 1.1))
9-
{
10-
productVariant = RTK_FACET;
11-
}
12-
else if (idValue > (3300 * 2 / 3 * 0.9) && idValue < (3300 * 2 / 3 * 1.1))
19+
// ADC input
20+
// r1 KOhms | r2 KOhms
21+
// MAX_ADC_VOLTAGE -----/\/\/\/\-----+-----/\/\/\/\----- Ground
22+
23+
// Return true if the mvMeasured value is within the tolerance range
24+
// of the mvProduct value
25+
upperThreshold = ceil(MAX_ADC_VOLTAGE * (r2 * (1.0 + (TOLERANCE / 100.0))) /
26+
((r1 * (1.0 - (TOLERANCE / 100.0))) + (r2 * (1.0 + (TOLERANCE / 100.0)))));
27+
lowerThreshold = floor(MAX_ADC_VOLTAGE * (r2 * (1.0 - (TOLERANCE / 100.0))) /
28+
((r1 * (1.0 + (TOLERANCE / 100.0))) + (r2 * (1.0 - (TOLERANCE / 100.0)))));
29+
30+
// Serial.printf("r1: %0.2f r2: %0.2f lowerThreshold: %0.0f mvMeasured: %d upperThreshold: %0.0f\r\n", r1, r2,
31+
// lowerThreshold, mvMeasured, upperThreshold);
32+
33+
return (upperThreshold > mvMeasured) && (mvMeasured > lowerThreshold);
34+
}
35+
36+
// Use a pair of resistors on pin 35 to ID the board type
37+
// If the ID resistors are not available then use a variety of other methods
38+
// (I2C, GPIO test, etc) to ID the board.
39+
// Assume no hardware interfaces have been started so we need to start/stop any hardware
40+
// used in tests accordingly.
41+
void identifyBoard()
42+
{
43+
// Use ADC to check the resistor divider
44+
int pin_deviceID = 35;
45+
uint16_t idValue = analogReadMilliVolts(pin_deviceID);
46+
Serial.printf("Board ADC ID (mV): %d\r\n", idValue);
47+
48+
// Order the following ID checks, by millivolt values high to low
49+
50+
// Facet L-Band Direct: 4.7/1 --> 534mV < 579mV < 626mV
51+
if (idWithAdc(idValue, 4.7, 1))
1352
{
14-
productVariant = RTK_FACET_LBAND;
53+
Serial.println("Found LBand Direct");
54+
productVariant = RTK_FACET_LBAND_DIRECT;
1555
}
16-
else if (idValue > (3300 * 3.3 / 13.3 * 0.9) && idValue < (3300 * 3.3 / 13.3 * 1.1))
56+
57+
// Express: 10/3.3 --> 761mV < 819mV < 879mV
58+
else if (idWithAdc(idValue, 10, 3.3))
1759
{
60+
Serial.println("Found Express");
1861
productVariant = RTK_EXPRESS;
1962
}
20-
else if (idValue > (3300 * 10 / 13.3 * 0.9) && idValue < (3300 * 10 / 13.3 * 1.1))
63+
64+
// Reference Station: 20/10 --> 1031mV < 1100mV < 1171mV
65+
else if (idWithAdc(idValue, 20, 10))
2166
{
22-
productVariant = RTK_EXPRESS_PLUS;
67+
productVariant = REFERENCE_STATION;
68+
// We can't auto-detect the ZED version if the firmware is in configViaEthernet mode,
69+
// so fake it here - otherwise messageSupported always returns false
70+
zedFirmwareVersionInt = 112;
2371
}
24-
else if (isConnected(0x19) == true) //Check for accelerometer
72+
// Facet: 10/10 --> 1571mV < 1650mV < 1729mV
73+
else if (idWithAdc(idValue, 10, 10))
74+
productVariant = RTK_FACET;
75+
76+
// Facet L-Band: 10/20 --> 2129mV < 2200mV < 2269mV
77+
else if (idWithAdc(idValue, 10, 20))
78+
productVariant = RTK_FACET_LBAND;
79+
80+
// Express+: 3.3/10 --> 2421mV < 2481mV < 2539mV
81+
else if (idWithAdc(idValue, 3.3, 10))
82+
productVariant = RTK_EXPRESS_PLUS;
83+
84+
// ID resistors do not exist for the following:
85+
// Surveyor
86+
// Unknown
87+
else
2588
{
26-
if (zedModuleType == PLATFORM_F9P) productVariant = RTK_EXPRESS;
27-
else if (zedModuleType == PLATFORM_F9R) productVariant = RTK_EXPRESS_PLUS;
89+
Serial.println("Out of band or nonexistent resistor IDs");
90+
productVariant = RTK_UNKNOWN; // Need to wait until the GNSS and Accel have been initialized
2891
}
29-
else
92+
}
93+
94+
void beginBoard()
95+
{
96+
if (productVariant == RTK_UNKNOWN)
3097
{
31-
productVariant = RTK_SURVEYOR;
98+
if (isConnected(0x19) == true) // Check for accelerometer
99+
{
100+
if (zedModuleType == PLATFORM_F9P)
101+
productVariant = RTK_EXPRESS;
102+
else if (zedModuleType == PLATFORM_F9R)
103+
productVariant = RTK_EXPRESS_PLUS;
104+
}
105+
else
106+
{
107+
// Detect RTK Expresses (v1.3 and below) that do not have an accel or device ID resistors
108+
109+
// On a Surveyor, pin 34 is not connected. On Express, 34 is connected to ZED_TX_READY
110+
const int pin_ZedTxReady = 34;
111+
uint16_t pinValue = analogReadMilliVolts(pin_ZedTxReady);
112+
log_d("Alternate ID pinValue (mV): %d\r\n", pinValue); // Surveyor = 142 to 152, //Express = 3129
113+
if (pinValue > 3000)
114+
{
115+
if (zedModuleType == PLATFORM_F9P)
116+
productVariant = RTK_EXPRESS;
117+
else if (zedModuleType == PLATFORM_F9R)
118+
productVariant = RTK_EXPRESS_PLUS;
119+
}
120+
else
121+
productVariant = RTK_SURVEYOR;
122+
}
32123
}
33124

34-
//Setup hardware pins
125+
// Setup hardware pins
35126
if (productVariant == RTK_SURVEYOR)
36127
{
37128
pin_batteryLevelLED_Red = 32;
@@ -46,13 +137,10 @@ void beginBoard()
46137
pin_zed_tx_ready = 26;
47138
pin_zed_reset = 27;
48139
pin_batteryLevel_alert = 36;
49-
//
50-
// //Bug in ZED-F9P v1.13 firmware causes RTK LED to not light when RTK Floating with SBAS on.
51-
// //The following changes the POR default but will be overwritten by settings in NVM or settings file
52-
// settings.ubxConstellations[1].enabled = false;
53140

54-
strcpy(platformFilePrefix, "SFE_Surveyor");
55-
strcpy(platformPrefix, "Surveyor");
141+
// Bug in ZED-F9P v1.13 firmware causes RTK LED to not light when RTK Floating with SBAS on.
142+
// The following changes the POR default but will be overwritten by settings in NVM or settings file
143+
settings.ubxConstellations[1].enabled = false;
56144
}
57145
else if (productVariant == RTK_EXPRESS || productVariant == RTK_EXPRESS_PLUS)
58146
{
@@ -67,30 +155,20 @@ void beginBoard()
67155

68156
pinMode(pin_powerSenseAndControl, INPUT_PULLUP);
69157
pinMode(pin_powerFastOff, INPUT);
70-
//
158+
71159
// if (esp_reset_reason() == ESP_RST_POWERON)
72160
// {
73-
// powerOnCheck(); //Only do check if we POR start
161+
// powerOnCheck(); // Only do check if we POR start
74162
// }
75-
//
76-
// pinMode(pin_setupButton, INPUT_PULLUP);
77-
//
78-
// setMuxport(settings.dataPortChannel); //Set mux to user's choice: NMEA, I2C, PPS, or DAC
79163

80-
if (productVariant == RTK_EXPRESS)
81-
{
82-
strcpy(platformFilePrefix, "SFE_Express");
83-
strcpy(platformPrefix, "Express");
84-
}
85-
else if (productVariant == RTK_EXPRESS_PLUS)
86-
{
87-
strcpy(platformFilePrefix, "SFE_Express_Plus");
88-
strcpy(platformPrefix, "Express Plus");
89-
}
164+
pinMode(pin_setupButton, INPUT_PULLUP);
165+
166+
//setMuxport(settings.dataPortChannel); // Set mux to user's choice: NMEA, I2C, PPS, or DAC
90167
}
91-
else if (productVariant == RTK_FACET || productVariant == RTK_FACET_LBAND)
168+
else if (productVariant == RTK_FACET || productVariant == RTK_FACET_LBAND ||
169+
productVariant == RTK_FACET_LBAND_DIRECT)
92170
{
93-
// //v11
171+
// v11
94172
pin_muxA = 2;
95173
pin_muxB = 0;
96174
pin_powerSenseAndControl = 13;
@@ -105,81 +183,113 @@ void beginBoard()
105183
pin_radio_rst = 15;
106184
pin_radio_pwr = 4;
107185
pin_radio_cts = 5;
108-
//pin_radio_rts = 255; //Not implemented
186+
// pin_radio_rts = 255; //Not implemented
109187

110188
pinMode(pin_powerSenseAndControl, INPUT_PULLUP);
111189
pinMode(pin_powerFastOff, INPUT);
112190

113191
// if (esp_reset_reason() == ESP_RST_POWERON)
114192
// {
115-
// powerOnCheck(); //Only do check if we POR start
193+
// powerOnCheck(); // Only do check if we POR start
116194
// }
117-
//
118-
// pinMode(pin_peripheralPowerControl, OUTPUT);
119-
// digitalWrite(pin_peripheralPowerControl, HIGH); //Turn on SD, ZED, etc
120-
//
121-
// setMuxport(settings.dataPortChannel); //Set mux to user's choice: NMEA, I2C, PPS, or DAC
122-
//
123-
// //CTS is active low. ESP32 pin 5 has pullup at POR. We must drive it low.
124-
// pinMode(pin_radio_cts, OUTPUT);
125-
// digitalWrite(pin_radio_cts, LOW);
126195

127-
if (productVariant == RTK_FACET)
196+
pinMode(pin_peripheralPowerControl, OUTPUT);
197+
digitalWrite(pin_peripheralPowerControl, HIGH); // Turn on SD, ZED, etc
198+
199+
//setMuxport(settings.dataPortChannel); // Set mux to user's choice: NMEA, I2C, PPS, or DAC
200+
201+
// CTS is active low. ESP32 pin 5 has pullup at POR. We must drive it low.
202+
pinMode(pin_radio_cts, OUTPUT);
203+
digitalWrite(pin_radio_cts, LOW);
204+
205+
if (productVariant == RTK_FACET_LBAND_DIRECT)
128206
{
129-
strcpy(platformFilePrefix, "SFE_Facet");
130-
strcpy(platformPrefix, "Facet");
207+
// Override the default setting if a user has not explicitly configured the setting
208+
// if (settings.useI2cForLbandCorrectionsConfigured == false)
209+
// settings.useI2cForLbandCorrections = false;
131210
}
132-
else if (productVariant == RTK_FACET_LBAND)
211+
}
212+
else if (productVariant == REFERENCE_STATION)
213+
{
214+
// No powerOnCheck
215+
216+
//settings.enablePrintBatteryMessages = false; // No pesky battery messages
217+
}
218+
219+
char versionString[21];
220+
getFirmwareVersion(versionString, sizeof(versionString), true);
221+
Serial.printf("SparkFun RTK %s %s\r\n", platformPrefix, versionString);
222+
223+
// Get unit MAC address
224+
esp_read_mac(wifiMACAddress, ESP_MAC_WIFI_STA);
225+
memcpy(btMACAddress, wifiMACAddress, sizeof(wifiMACAddress));
226+
btMACAddress[5] +=
227+
2; // Convert MAC address to Bluetooth MAC (add 2):
228+
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system.html#mac-address
229+
memcpy(ethernetMACAddress, wifiMACAddress, sizeof(wifiMACAddress));
230+
ethernetMACAddress[5] += 3; // Convert MAC address to Ethernet MAC (add 3)
231+
232+
// For all boards, check reset reason. If reset was due to wdt or panic, append last log
233+
//loadSettingsPartial(); // Loads settings from LFS
234+
if ((esp_reset_reason() == ESP_RST_POWERON) || (esp_reset_reason() == ESP_RST_SW))
235+
{
236+
//reuseLastLog = false; // Start new log
237+
238+
if (settings.enableResetDisplay == true)
133239
{
134-
strcpy(platformFilePrefix, "SFE_Facet_LBand");
135-
strcpy(platformPrefix, "Facet L-Band");
240+
settings.resetCount = 0;
241+
// recordSystemSettingsToFileLFS(settingsFileName); // Avoid overwriting LittleFS settings onto SD
136242
}
243+
settings.resetCount = 0;
137244
}
245+
else
246+
{
247+
//reuseLastLog = true; // Attempt to reuse previous log
248+
249+
if (settings.enableResetDisplay == true)
250+
{
251+
settings.resetCount++;
252+
Serial.printf("resetCount: %d\r\n", settings.resetCount);
253+
//recordSystemSettingsToFileLFS(settingsFileName); // Avoid overwriting LittleFS settings onto SD
254+
}
138255

139-
//Get unit MAC address
140-
esp_read_mac(unitMACAddress, ESP_MAC_WIFI_STA);
141-
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
142-
143-
// //For all boards, check reset reason. If reset was due to wdt or panic, append last log
144-
// if (esp_reset_reason() == ESP_RST_POWERON)
145-
// {
146-
// reuseLastLog = false; //Start new log
147-
//
148-
// loadSettingsPartial();
149-
// if (settings.enableResetDisplay == true)
150-
// {
151-
// settings.resetCount = 0;
152-
// recordSystemSettings(); //Record to NVM
153-
// }
154-
// }
155-
// else
156-
// {
157-
// reuseLastLog = true; //Attempt to reuse previous log
158-
//
159-
// loadSettingsPartial();
160-
// if (settings.enableResetDisplay == true)
161-
// {
162-
// settings.resetCount++;
163-
// Serial.printf("resetCount: %d\n\r", settings.resetCount);
164-
// recordSystemSettings(); //Record to NVM
165-
// }
166-
//
167-
// Serial.print("Reset reason: ");
168-
// switch (esp_reset_reason())
169-
// {
170-
// case ESP_RST_UNKNOWN: Serial.println(F("ESP_RST_UNKNOWN")); break;
171-
// case ESP_RST_POWERON : Serial.println(F("ESP_RST_POWERON")); break;
172-
// case ESP_RST_SW : Serial.println(F("ESP_RST_SW")); break;
173-
// case ESP_RST_PANIC : Serial.println(F("ESP_RST_PANIC")); break;
174-
// case ESP_RST_INT_WDT : Serial.println(F("ESP_RST_INT_WDT")); break;
175-
// case ESP_RST_TASK_WDT : Serial.println(F("ESP_RST_TASK_WDT")); break;
176-
// case ESP_RST_WDT : Serial.println(F("ESP_RST_WDT")); break;
177-
// case ESP_RST_DEEPSLEEP : Serial.println(F("ESP_RST_DEEPSLEEP")); break;
178-
// case ESP_RST_BROWNOUT : Serial.println(F("ESP_RST_BROWNOUT")); break;
179-
// case ESP_RST_SDIO : Serial.println(F("ESP_RST_SDIO")); break;
180-
// default : Serial.println(F("Unknown"));
181-
// }
182-
// }
256+
Serial.print("Reset reason: ");
257+
switch (esp_reset_reason())
258+
{
259+
case ESP_RST_UNKNOWN:
260+
Serial.println("ESP_RST_UNKNOWN");
261+
break;
262+
case ESP_RST_POWERON:
263+
Serial.println("ESP_RST_POWERON");
264+
break;
265+
case ESP_RST_SW:
266+
Serial.println("ESP_RST_SW");
267+
break;
268+
case ESP_RST_PANIC:
269+
Serial.println("ESP_RST_PANIC");
270+
break;
271+
case ESP_RST_INT_WDT:
272+
Serial.println("ESP_RST_INT_WDT");
273+
break;
274+
case ESP_RST_TASK_WDT:
275+
Serial.println("ESP_RST_TASK_WDT");
276+
break;
277+
case ESP_RST_WDT:
278+
Serial.println("ESP_RST_WDT");
279+
break;
280+
case ESP_RST_DEEPSLEEP:
281+
Serial.println("ESP_RST_DEEPSLEEP");
282+
break;
283+
case ESP_RST_BROWNOUT:
284+
Serial.println("ESP_RST_BROWNOUT");
285+
break;
286+
case ESP_RST_SDIO:
287+
Serial.println("ESP_RST_SDIO");
288+
break;
289+
default:
290+
Serial.println("Unknown");
291+
}
292+
}
183293
}
184294

185295

0 commit comments

Comments
 (0)