summaryrefslogtreecommitdiff
path: root/src/system_fsm
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-21 15:43:23 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-21 15:43:23 +1000
commit764b01e913d0123747757e5efd3545d46e921848 (patch)
tree76f0a1d2afb4b60818cc46fd5649938713f2f261 /src/system_fsm
parent27f329a9dbf18a046ade534c9330b03e586cdb98 (diff)
downloadtangara-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.txt2
-rw-r--r--src/system_fsm/booting.cpp10
-rw-r--r--src/system_fsm/include/system_events.hpp18
-rw-r--r--src/system_fsm/include/system_fsm.hpp24
-rw-r--r--src/system_fsm/running.cpp12
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