From 5f1a6507d8f7a0f9ecea179f94aeb182eac77cfe Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 8 Apr 2024 13:50:35 +1000 Subject: [PATCH] Warn and block MSC disable if the sd card is busy --- lua/settings.lua | 21 ++++++++++++++++++--- src/drivers/include/samd.hpp | 4 ++-- src/drivers/samd.cpp | 2 +- src/system_fsm/include/system_events.hpp | 4 ++++ src/system_fsm/system_fsm.cpp | 2 +- src/ui/include/ui_fsm.hpp | 2 ++ src/ui/ui_fsm.cpp | 9 +++++++++ 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lua/settings.lua b/lua/settings.lua index 1e2debea..1a306dcf 100644 --- a/lua/settings.lua +++ b/lua/settings.lua @@ -282,10 +282,10 @@ local MassStorageSettings = screen:new { createUi = function(self) self.menu = SettingsScreen("USB Storage") local version = require("version").samd() - if tonumber(version) < 2 then + if tonumber(version) < 3 then self.menu.content:Label { w = lvgl.PCT(100), - text = "Usb Mass Storage requires a SAMD21 firmware version >=2." + text = "Usb Mass Storage requires a SAMD21 firmware version >=3." } return end @@ -304,6 +304,12 @@ local MassStorageSettings = screen:new { enable_container:Label { text = "Enable", flex_grow = 1 } local enable_sw = enable_container:Switch {} + local busy_text = self.menu.content:Label { + w = lvgl.PCT(100), + text = "USB is currently busy. Do not unplug or remove the SD card.", + long_mode = lvgl.LABEL.LONG_WRAP, + } + local bind_switch = function() if usb.msc_enabled:get() then enable_sw:add_state(lvgl.STATE.CHECKED) @@ -313,12 +319,21 @@ local MassStorageSettings = screen:new { end enable_sw:onevent(lvgl.EVENT.VALUE_CHANGED, function() - usb.msc_enabled:set(enable_sw:enabled()) + if not usb.msc_busy:get() then + usb.msc_enabled:set(enable_sw:enabled()) + end bind_switch() end) self.bindings = { usb.msc_enabled:bind(bind_switch), + usb.msc_busy:bind(function(busy) + if busy then + busy_text:clear_flag(lvgl.FLAG.HIDDEN) + else + busy_text:add_flag(lvgl.FLAG.HIDDEN) + end + end) } end, canPop = function() diff --git a/src/drivers/include/samd.hpp b/src/drivers/include/samd.hpp index ac265950..55ea513c 100644 --- a/src/drivers/include/samd.hpp +++ b/src/drivers/include/samd.hpp @@ -48,8 +48,8 @@ class Samd { // There is a compatible usb host attached, but USB MSC is not currently // in use by the SAMD. kAttachedIdle, - // The SAMD is currently exposing the SD card via USB MSC. - kAttachedMounted, + // The SAMD is currently writing to the SD card via USB MSC. + kAttachedBusy, }; auto GetUsbStatus() -> UsbStatus; diff --git a/src/drivers/samd.cpp b/src/drivers/samd.cpp index b631b4fb..e47d9cfe 100644 --- a/src/drivers/samd.cpp +++ b/src/drivers/samd.cpp @@ -113,7 +113,7 @@ auto Samd::UpdateUsbStatus() -> void { usb_status_ = UsbStatus::kDetached; } usb_status_ = - (raw_res & 0b10) ? UsbStatus::kAttachedMounted : UsbStatus::kAttachedIdle; + (raw_res & 0b10) ? UsbStatus::kAttachedBusy : UsbStatus::kAttachedIdle; } auto Samd::ResetToFlashSamd() -> void { diff --git a/src/system_fsm/include/system_events.hpp b/src/system_fsm/include/system_events.hpp index 1be03f82..f9ab9e11 100644 --- a/src/system_fsm/include/system_events.hpp +++ b/src/system_fsm/include/system_events.hpp @@ -12,6 +12,7 @@ #include "bluetooth_types.hpp" #include "database.hpp" #include "haptics.hpp" +#include "samd.hpp" #include "service_locator.hpp" #include "tinyfsm.hpp" @@ -56,6 +57,9 @@ struct SdDetectChanged : tinyfsm::Event { struct SamdUsbMscChanged : tinyfsm::Event { bool en; }; +struct SamdUsbStatusChanged : tinyfsm::Event { + drivers::Samd::UsbStatus new_status; +}; struct BatteryStateChanged : tinyfsm::Event { battery::Battery::BatteryState new_state; diff --git a/src/system_fsm/system_fsm.cpp b/src/system_fsm/system_fsm.cpp index 5a1ccf8c..f502b49a 100644 --- a/src/system_fsm/system_fsm.cpp +++ b/src/system_fsm/system_fsm.cpp @@ -88,7 +88,7 @@ void SystemState::react(const internal::SamdInterrupt&) { sServices->battery().Update(); } if (usb_status != prev_usb_status) { - ESP_LOGI(kTag, "usb status changed"); + events::Ui().Dispatch(SamdUsbStatusChanged{.new_status = usb_status}); } } diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp index 9f9aa9b9..2bab487d 100644 --- a/src/ui/include/ui_fsm.hpp +++ b/src/ui/include/ui_fsm.hpp @@ -65,6 +65,7 @@ class UiState : public tinyfsm::Fsm { void react(const audio::VolumeLimitChanged&); void react(const system_fsm::KeyLockChanged&); + void react(const system_fsm::SamdUsbStatusChanged&); void react(const internal::DismissAlerts&); void react(const internal::ControlSchemeChanged&); @@ -133,6 +134,7 @@ class UiState : public tinyfsm::Fsm { static lua::Property sDatabaseAutoUpdate; static lua::Property sUsbMassStorageEnabled; + static lua::Property sUsbMassStorageBusy; }; namespace states { diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp index bb1503b2..28733123 100644 --- a/src/ui/ui_fsm.cpp +++ b/src/ui/ui_fsm.cpp @@ -43,6 +43,7 @@ #include "nvs.hpp" #include "property.hpp" #include "relative_wheel.hpp" +#include "samd.hpp" #include "screen.hpp" #include "screen_lua.hpp" #include "screen_splash.hpp" @@ -302,6 +303,8 @@ lua::Property UiState::sUsbMassStorageEnabled{ return true; }}; +lua::Property UiState::sUsbMassStorageBusy{false}; + auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs) -> bool { // Init LVGL first, since the display driver registers itself with LVGL. @@ -360,6 +363,11 @@ void UiState::react(const system_fsm::KeyLockChanged& ev) { sLockSwitch.Update(ev.locking); } +void UiState::react(const system_fsm::SamdUsbStatusChanged& ev) { + sUsbMassStorageBusy.Update(ev.new_status == + drivers::Samd::UsbStatus::kAttachedBusy); +} + void UiState::react(const internal::ControlSchemeChanged&) { if (!sInput) { return; @@ -573,6 +581,7 @@ void Lua::entry() { registry.AddPropertyModule("usb", { {"msc_enabled", &sUsbMassStorageEnabled}, + {"msc_busy", &sUsbMassStorageBusy}, }); sDatabaseAutoUpdate.Update(sServices->nvs().DbAutoIndex());