From 35b59a64edaae89486bb8383015627539349c63a Mon Sep 17 00:00:00 2001 From: Michael Sauer Date: Fri, 11 Sep 2026 13:35:56 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Zustands-Log=20bei=20fehlgeschlagenem=20?= =?UTF-8?q?L=C3=B6schen=20neu=20einlesen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/nl_state_log.c | 15 ++++++++++----- test/test_state_log.c | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/config/nl_state_log.c b/src/config/nl_state_log.c index 9b24fff..b75adfd 100644 --- a/src/config/nl_state_log.c +++ b/src/config/nl_state_log.c @@ -144,9 +144,14 @@ int nl_state_log_erase(void) { int r0 = nl_flash_erase_sector(s_sector[0]); int r1 = nl_flash_erase_sector(s_sector[1]); - s_have = false; - s_seq = 0; - s_active = 0; - s_next = 0; - return (r0 == 0 && r1 == 0) ? 0 : -1; + if (r0 == 0 && r1 == 0) { + s_have = false; + s_seq = 0; + s_active = 0; + s_next = 0; + return 0; + } + /* If erase failed, re-scan the flash to restore consistency */ + nl_state_log_init(s_sector[0], s_sector[1]); + return -1; } diff --git a/test/test_state_log.c b/test/test_state_log.c index 534e6f2..9e3a57a 100644 --- a/test/test_state_log.c +++ b/test/test_state_log.c @@ -126,6 +126,21 @@ static void test_erase(void) TEST_ASSERT_FALSE(nl_state_log_load(&out)); } +static void test_erase_failure_rescans_flash(void) +{ + nl_light_state_t old = st(10), new = st(20), out; + TEST_ASSERT_EQUAL_INT(0, nl_state_log_append(&old)); + fake_flash_fail_after(0); + TEST_ASSERT_NOT_EQUAL(0, nl_state_log_erase()); + fake_flash_fail_after(-1); + TEST_ASSERT_TRUE(nl_state_log_load(&out)); + TEST_ASSERT_EQUAL_UINT8(10, out.brightness); + TEST_ASSERT_EQUAL_INT(0, nl_state_log_append(&new)); + reboot(); + TEST_ASSERT_TRUE(nl_state_log_load(&out)); + TEST_ASSERT_EQUAL_UINT8(20, out.brightness); +} + int main(void) { UNITY_BEGIN(); @@ -137,5 +152,6 @@ int main(void) RUN_TEST(test_power_loss_during_append); RUN_TEST(test_garbage_in_empty_log_is_erased_first); RUN_TEST(test_erase); + RUN_TEST(test_erase_failure_rescans_flash); return UNITY_END(); }