@@ -590,8 +590,16 @@ void setupBLE() {
590
590
591
591
// Read saved data from Preferences
592
592
void refreshDeviceData () {
593
+ // Try to initialize preferences, with corruption recovery
593
594
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" ));
595
603
resetDeviceData ();
596
604
return ;
597
605
}
@@ -604,7 +612,9 @@ void refreshDeviceData() {
604
612
return ;
605
613
}
606
614
607
- // Load all values from preferences
615
+ // Load all values from preferences with validation
616
+ bool dataValid = true ;
617
+
608
618
deviceData.version_major = preferences.getUChar (KEY_VERSION_MAJOR, VERSION_MAJOR);
609
619
deviceData.version_minor = preferences.getUChar (KEY_VERSION_MINOR, VERSION_MINOR);
610
620
deviceData.screen_rotation = preferences.getUChar (KEY_SCREEN_ROTATION, DEFAULT_SCREEN_ROTATION);
@@ -617,10 +627,24 @@ void refreshDeviceData() {
617
627
deviceData.revision = preferences.getUChar (KEY_REVISION, 3 ); // Default to ESP32-S3
618
628
deviceData.timezone_offset = preferences.getInt (KEY_TIMEZONE_OFFSET, 0 );
619
629
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
+
620
643
preferences.end ();
621
644
622
645
// Ensure values are within valid ranges
623
- if (sanitizeDeviceData ()) {
646
+ if (sanitizeDeviceData () || !dataValid) {
647
+ USBSerial.println (F (" Sanitized corrupted preference values" ));
624
648
writeDeviceData (); // Save sanitized values
625
649
}
626
650
@@ -634,21 +658,27 @@ void writeDeviceData() {
634
658
return ;
635
659
}
636
660
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
+ }
652
682
}
653
683
654
684
// Reset Preferences and deviceData to factory defaults
@@ -689,9 +719,9 @@ void parse_serial_commands() {
689
719
690
720
DeserializationError error = deserializeJson (doc, USBSerial);
691
721
722
+ // Handle parsing results
692
723
if (error) {
693
- USBSerial.print (" JSON parse error: " );
694
- USBSerial.println (error.c_str ());
724
+ // Silently ignore non-JSON input or parsing errors
695
725
return ;
696
726
}
697
727
@@ -738,8 +768,8 @@ void parse_serial_commands() {
738
768
739
769
sanitizeDeviceData ();
740
770
writeDeviceData ();
741
- // resetRotation(deviceData.screen_rotation);
742
- // setTheme(deviceData.theme);
771
+ // resetRotation(deviceData.screen_rotation);
772
+ // setTheme(deviceData.theme);
743
773
744
774
send_device_data ();
745
775
}
0 commit comments