diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-09-24 13:28:42 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-09-24 13:28:42 +1000 |
| commit | 94ccd405e37bd1cfc74b9f173bdd31c6f16ef890 (patch) | |
| tree | 4e0b2b02c57017dc5d65ecf49f7f15f0c300da8d /src/tangara/system_fsm | |
| parent | ec4fb715d0817814f5f32eb1b17eefff7e3104f3 (diff) | |
| download | tangara-fw-94ccd405e37bd1cfc74b9f173bdd31c6f16ef890.tar.gz | |
Retry SD card mounting a few times when talking to the card fails
Diffstat (limited to 'src/tangara/system_fsm')
| -rw-r--r-- | src/tangara/system_fsm/running.cpp | 20 | ||||
| -rw-r--r-- | src/tangara/system_fsm/system_events.hpp | 4 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/tangara/system_fsm/running.cpp b/src/tangara/system_fsm/running.cpp index 33c6c7dc..f065737b 100644 --- a/src/tangara/system_fsm/running.cpp +++ b/src/tangara/system_fsm/running.cpp @@ -40,7 +40,7 @@ void Running::entry() { sUnmountTimer = xTimerCreate("unmount_timeout", kTicksBeforeUnmount, false, NULL, timer_callback); } - events::System().Dispatch(internal::Mount{}); + events::System().Dispatch(internal::Mount{.attempt = 1}); } void Running::exit() { @@ -72,7 +72,7 @@ void Running::react(const SdDetectChanged& ev) { } if (ev.has_sd_card && !sStorage) { - events::System().Dispatch(internal::Mount{}); + events::System().Dispatch(internal::Mount{.attempt = 1}); return; } @@ -121,7 +121,7 @@ void Running::react(const SamdUsbMscChanged& ev) { gpios.WriteSync(drivers::IGpios::Pin::kSdPowerEnable, 0); // Now it's ready for us. - events::System().Dispatch(internal::Mount{}); + events::System().Dispatch(internal::Mount{.attempt = 1}); } } @@ -146,13 +146,18 @@ auto Running::updateSdState(drivers::SdState state) -> void { events::System().Dispatch(SdStateChanged{}); } -void Running::react(const internal::Mount&) { +void Running::react(const internal::Mount& ev) { // Only mount our storage if we know it's not currently in use by the SAMD. if (sServices->samd().UsbMassStorage()) { updateSdState(drivers::SdState::kNotMounted); return; } + if (ev.attempt > 3) { + updateSdState(drivers::SdState::kNotPresent); + return; + } + ESP_LOGI(kTag, "mounting sd card"); auto storage_res = drivers::SdStorage::Create(sServices->gpios()); if (storage_res.has_error()) { @@ -163,7 +168,12 @@ void Running::react(const internal::Mount&) { break; case drivers::SdStorage::FAILED_TO_READ: default: - updateSdState(drivers::SdState::kNotPresent); + if (!sServices->gpios().Get(drivers::Gpios::Pin::kSdCardDetect)) { + vTaskDelay(pdMS_TO_TICKS(100)); + events::System().Dispatch(internal::Mount{.attempt = ev.attempt + 1}); + } else { + updateSdState(drivers::SdState::kNotPresent); + } break; } return; diff --git a/src/tangara/system_fsm/system_events.hpp b/src/tangara/system_fsm/system_events.hpp index c93c14d5..c2e3a2ab 100644 --- a/src/tangara/system_fsm/system_events.hpp +++ b/src/tangara/system_fsm/system_events.hpp @@ -82,7 +82,9 @@ struct SamdInterrupt : tinyfsm::Event {}; struct IdleTimeout : tinyfsm::Event {}; struct UnmountTimeout : tinyfsm::Event {}; -struct Mount : tinyfsm::Event {}; +struct Mount : tinyfsm::Event { + int attempt; +}; } // namespace internal |
