diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-08-21 15:43:23 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-08-21 15:43:23 +1000 |
| commit | 764b01e913d0123747757e5efd3545d46e921848 (patch) | |
| tree | 76f0a1d2afb4b60818cc46fd5649938713f2f261 /src/system_fsm | |
| parent | 27f329a9dbf18a046ade534c9330b03e586cdb98 (diff) | |
| download | tangara-fw-764b01e913d0123747757e5efd3545d46e921848.tar.gz | |
Add idle->standby support when locked and no music
Diffstat (limited to 'src/system_fsm')
| -rw-r--r-- | src/system_fsm/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/system_fsm/booting.cpp | 10 | ||||
| -rw-r--r-- | src/system_fsm/include/system_events.hpp | 18 | ||||
| -rw-r--r-- | src/system_fsm/include/system_fsm.hpp | 24 | ||||
| -rw-r--r-- | src/system_fsm/running.cpp | 12 |
5 files changed, 32 insertions, 34 deletions
diff --git a/src/system_fsm/CMakeLists.txt b/src/system_fsm/CMakeLists.txt index d59bd799..037e72c7 100644 --- a/src/system_fsm/CMakeLists.txt +++ b/src/system_fsm/CMakeLists.txt @@ -3,7 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-only idf_component_register( - SRCS "system_fsm.cpp" "running.cpp" "booting.cpp" + SRCS "system_fsm.cpp" "running.cpp" "booting.cpp" "idle.cpp" INCLUDE_DIRS "include" REQUIRES "tinyfsm" "drivers" "database" "ui" "result" "events" "audio" "app_console") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/system_fsm/booting.cpp b/src/system_fsm/booting.cpp index 6720fb4a..27f2b9c9 100644 --- a/src/system_fsm/booting.cpp +++ b/src/system_fsm/booting.cpp @@ -94,13 +94,11 @@ auto Booting::exit() -> void { auto Booting::react(const BootComplete& ev) -> void { ESP_LOGI(kTag, "bootup completely successfully"); - // It's possible that the SAMD is currently exposing the SD card as a USB - // device. Make sure we don't immediately try to claim it. - if (sSamd && - sSamd->GetUsbStatus() == drivers::Samd::UsbStatus::kAttachedMounted) { - transit<Unmounted>(); + if (sGpios->Get(drivers::Gpios::Pin::kKeyLock)) { + transit<Running>(); + } else { + transit<Idle>(); } - transit<Running>(); } } // namespace states diff --git a/src/system_fsm/include/system_events.hpp b/src/system_fsm/include/system_events.hpp index 87461f0b..f62da801 100644 --- a/src/system_fsm/include/system_events.hpp +++ b/src/system_fsm/include/system_events.hpp @@ -28,15 +28,7 @@ struct BootComplete : tinyfsm::Event {}; */ struct FatalError : tinyfsm::Event {}; -/* - * Sent before unmounting the system storage. Storage will not be unmounted - * until each reaction to this even has returned. FSMs should immediately cease - * their usage of storage. - * - * May be emitted either by UiState in response to user action, or by SysState - * as a part of either entering low-power standby or powering off. - */ -struct StorageUnmountRequested : tinyfsm::Event {}; +struct OnIdle : tinyfsm::Event {}; /* * Sent by SysState when the system storage has been successfully mounted. @@ -64,15 +56,11 @@ struct ChargingStatusChanged : tinyfsm::Event {}; namespace internal { -/* - * Sent when the actual unmount operation should be performed. Always dispatched - * by SysState in response to StoragePrepareToUnmount. - */ -struct ReadyToUnmount : tinyfsm::Event {}; - struct GpioInterrupt : tinyfsm::Event {}; struct SamdInterrupt : tinyfsm::Event {}; +struct IdleTimeout : tinyfsm::Event {}; + } // namespace internal } // namespace system_fsm diff --git a/src/system_fsm/include/system_fsm.hpp b/src/system_fsm/include/system_fsm.hpp index b31cc6b7..0698be9b 100644 --- a/src/system_fsm/include/system_fsm.hpp +++ b/src/system_fsm/include/system_fsm.hpp @@ -22,6 +22,9 @@ #include "tinyfsm.hpp" #include "touchwheel.hpp" +#include "freertos/FreeRTOS.h" +#include "freertos/timers.h" + #include "system_events.hpp" #include "track_queue.hpp" @@ -47,10 +50,10 @@ class SystemState : public tinyfsm::Fsm<SystemState> { virtual void react(const DisplayReady&) {} virtual void react(const BootComplete&) {} - virtual void react(const StorageUnmountRequested&) {} - virtual void react(const internal::ReadyToUnmount&) {} virtual void react(const StorageMounted&) {} virtual void react(const StorageError&) {} + virtual void react(const KeyLockChanged&) {} + virtual void react(const internal::IdleTimeout&) {} protected: static std::shared_ptr<drivers::Gpios> sGpios; @@ -95,13 +98,24 @@ class Running : public SystemState { void entry() override; void exit() override; - void react(const StorageUnmountRequested&) override; - void react(const internal::ReadyToUnmount&) override; + void react(const KeyLockChanged&) override; void react(const StorageError&) override; using SystemState::react; }; -class Unmounted : public SystemState {}; +class Idle : public SystemState { + public: + void entry() override; + void exit() override; + + void react(const KeyLockChanged&) override; + void react(const internal::IdleTimeout&) override; + + using SystemState::react; + + private: + TimerHandle_t sIdleTimeout; +}; /* * Something unrecoverably bad went wrong. Shows an error (if possible), awaits diff --git a/src/system_fsm/running.cpp b/src/system_fsm/running.cpp index 0e988193..9e250c9b 100644 --- a/src/system_fsm/running.cpp +++ b/src/system_fsm/running.cpp @@ -67,17 +67,15 @@ void Running::exit() { sStorage.reset(); } -void Running::react(const StorageUnmountRequested& ev) { - events::System().Dispatch(internal::ReadyToUnmount{}); -} - -void Running::react(const internal::ReadyToUnmount& ev) { - transit<Unmounted>(); +void Running::react(const KeyLockChanged& ev) { + if (!ev.falling && audio::AudioState::is_in_state<audio::states::Standby>()) { + transit<Idle>(); + } } void Running::react(const StorageError& ev) { ESP_LOGW(kTag, "error loading storage"); - transit<Unmounted>(); + // TODO. } } // namespace states |
