@@ -590,8 +590,16 @@ void setupBLE() {
590590
591591// Read saved data from Preferences
592592void 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 }
0 commit comments