Skip to content

Commit d43913e

Browse files
committed
Improve preferences handling and validation
Adds corruption recovery and validation for device preferences, ensuring critical settings are within valid ranges and providing error checking when saving. Also silences JSON parse errors in serial command handling and removes debug output from button handler.
1 parent c45810e commit d43913e

File tree

2 files changed

+52
-34
lines changed

2 files changed

+52
-34
lines changed

src/sp140/extra-data.ino

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,16 @@ void setupBLE() {
590590

591591
// Read saved data from Preferences
592592
void refreshDeviceData() {
593+
// Try to initialize preferences, with corruption recovery
593594
if (!preferences.begin(PREFS_NAMESPACE, false)) {
594-
USBSerial.println(F("Failed to initialize Preferences"));
595+
USBSerial.println(F("Failed to initialize Preferences - may be corrupted"));
596+
597+
// Try to clear corrupted preferences and start fresh
598+
preferences.begin(PREFS_NAMESPACE, false);
599+
preferences.clear();
600+
preferences.end();
601+
602+
USBSerial.println(F("Cleared potentially corrupted preferences, using defaults"));
595603
resetDeviceData();
596604
return;
597605
}
@@ -604,7 +612,9 @@ void refreshDeviceData() {
604612
return;
605613
}
606614

607-
// Load all values from preferences
615+
// Load all values from preferences with validation
616+
bool dataValid = true;
617+
608618
deviceData.version_major = preferences.getUChar(KEY_VERSION_MAJOR, VERSION_MAJOR);
609619
deviceData.version_minor = preferences.getUChar(KEY_VERSION_MINOR, VERSION_MINOR);
610620
deviceData.screen_rotation = preferences.getUChar(KEY_SCREEN_ROTATION, DEFAULT_SCREEN_ROTATION);
@@ -617,10 +627,24 @@ void refreshDeviceData() {
617627
deviceData.revision = preferences.getUChar(KEY_REVISION, 3); // Default to ESP32-S3
618628
deviceData.timezone_offset = preferences.getInt(KEY_TIMEZONE_OFFSET, 0);
619629

630+
// Validate critical display-related settings
631+
if (deviceData.screen_rotation != 1 && deviceData.screen_rotation != 3) {
632+
USBSerial.println(F("Warning: Invalid screen rotation detected, using default"));
633+
deviceData.screen_rotation = DEFAULT_SCREEN_ROTATION;
634+
dataValid = false;
635+
}
636+
637+
if (deviceData.theme > 1) {
638+
USBSerial.println(F("Warning: Invalid theme detected, using default"));
639+
deviceData.theme = DEFAULT_THEME;
640+
dataValid = false;
641+
}
642+
620643
preferences.end();
621644

622645
// Ensure values are within valid ranges
623-
if (sanitizeDeviceData()) {
646+
if (sanitizeDeviceData() || !dataValid) {
647+
USBSerial.println(F("Sanitized corrupted preference values"));
624648
writeDeviceData(); // Save sanitized values
625649
}
626650

@@ -634,21 +658,27 @@ void writeDeviceData() {
634658
return;
635659
}
636660

637-
// Save all values to preferences
638-
preferences.putUChar(KEY_VERSION_MAJOR, deviceData.version_major);
639-
preferences.putUChar(KEY_VERSION_MINOR, deviceData.version_minor);
640-
preferences.putUChar(KEY_SCREEN_ROTATION, deviceData.screen_rotation);
641-
preferences.putFloat(KEY_SEA_PRESSURE, deviceData.sea_pressure);
642-
preferences.putBool(KEY_METRIC_TEMP, deviceData.metric_temp);
643-
preferences.putBool(KEY_METRIC_ALT, deviceData.metric_alt);
644-
preferences.putUChar(KEY_PERFORMANCE_MODE, deviceData.performance_mode);
645-
preferences.putUChar(KEY_THEME, deviceData.theme);
646-
preferences.putUShort(KEY_ARMED_TIME, deviceData.armed_time);
647-
preferences.putUChar(KEY_REVISION, deviceData.revision);
648-
preferences.putInt(KEY_TIMEZONE_OFFSET, deviceData.timezone_offset);
649-
650-
preferences.end();
651-
USBSerial.println(F("Device data saved to Preferences"));
661+
// Save all values to preferences with error checking
662+
bool success = true;
663+
success &= (preferences.putUChar(KEY_VERSION_MAJOR, deviceData.version_major) > 0);
664+
success &= (preferences.putUChar(KEY_VERSION_MINOR, deviceData.version_minor) > 0);
665+
success &= (preferences.putUChar(KEY_SCREEN_ROTATION, deviceData.screen_rotation) > 0);
666+
success &= (preferences.putFloat(KEY_SEA_PRESSURE, deviceData.sea_pressure) > 0);
667+
success &= (preferences.putBool(KEY_METRIC_TEMP, deviceData.metric_temp) > 0);
668+
success &= (preferences.putBool(KEY_METRIC_ALT, deviceData.metric_alt) > 0);
669+
success &= (preferences.putUChar(KEY_PERFORMANCE_MODE, deviceData.performance_mode) > 0);
670+
success &= (preferences.putUChar(KEY_THEME, deviceData.theme) > 0);
671+
success &= (preferences.putUShort(KEY_ARMED_TIME, deviceData.armed_time) > 0);
672+
success &= (preferences.putUChar(KEY_REVISION, deviceData.revision) > 0);
673+
success &= (preferences.putInt(KEY_TIMEZONE_OFFSET, deviceData.timezone_offset) > 0);
674+
675+
if (success) {
676+
preferences.end();
677+
USBSerial.println(F("Device data saved to Preferences"));
678+
} else {
679+
preferences.end();
680+
USBSerial.println(F("Warning: Some preferences may not have been saved correctly"));
681+
}
652682
}
653683

654684
// Reset Preferences and deviceData to factory defaults
@@ -689,9 +719,9 @@ void parse_serial_commands() {
689719

690720
DeserializationError error = deserializeJson(doc, USBSerial);
691721

722+
// Handle parsing results
692723
if (error) {
693-
USBSerial.print("JSON parse error: ");
694-
USBSerial.println(error.c_str());
724+
// Silently ignore non-JSON input or parsing errors
695725
return;
696726
}
697727

@@ -738,8 +768,8 @@ void parse_serial_commands() {
738768

739769
sanitizeDeviceData();
740770
writeDeviceData();
741-
//resetRotation(deviceData.screen_rotation);
742-
//setTheme(deviceData.theme);
771+
// resetRotation(deviceData.screen_rotation);
772+
// setTheme(deviceData.theme);
743773

744774
send_device_data();
745775
}

src/sp140/sp140.ino

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -874,18 +874,6 @@ void buttonHandlerTask(void* parameter) {
874874
buttonPressStartTime = currentTime;
875875
}
876876
}
877-
878-
// Debug current state
879-
if (buttonPressed) {
880-
uint32_t currentHoldTime = currentTime - buttonPressStartTime;
881-
if (currentHoldTime % 500 == 0) { // Print every 500ms
882-
USBSerial.print("Current hold time: ");
883-
USBSerial.print(currentHoldTime);
884-
USBSerial.println("ms");
885-
USBSerial.print("Arm sequence: ");
886-
USBSerial.println(armSequenceStarted ? "ACTIVE" : "INACTIVE");
887-
}
888-
}
889877
}
890878

891879
vTaskDelay(pdMS_TO_TICKS(10));

0 commit comments

Comments
 (0)