diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-07-26 11:23:36 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-07-26 11:23:36 +1000 |
| commit | f94be3db2f2bb6c1b359744cb915683095e4ee80 (patch) | |
| tree | 79d335db661720947c518a535bdde733fe669032 /src/system_fsm | |
| parent | d8194135bbaad97d1f3428a74c7fc54ba3f604ec (diff) | |
| download | tangara-fw-f94be3db2f2bb6c1b359744cb915683095e4ee80.tar.gz | |
make event queue go faster
Diffstat (limited to 'src/system_fsm')
| -rw-r--r-- | src/system_fsm/booting.cpp | 31 | ||||
| -rw-r--r-- | src/system_fsm/include/system_fsm.hpp | 2 | ||||
| -rw-r--r-- | src/system_fsm/running.cpp | 20 | ||||
| -rw-r--r-- | src/system_fsm/system_fsm.cpp | 27 |
4 files changed, 41 insertions, 39 deletions
diff --git a/src/system_fsm/booting.cpp b/src/system_fsm/booting.cpp index 076f4570..4686748e 100644 --- a/src/system_fsm/booting.cpp +++ b/src/system_fsm/booting.cpp @@ -29,36 +29,22 @@ namespace states { static const char kTag[] = "BOOT"; -static std::function<void(void)> sGpiosCallback = []() { - events::EventQueue::GetInstance().DispatchFromISR(internal::GpioInterrupt{}); -}; - auto Booting::entry() -> void { ESP_LOGI(kTag, "beginning tangara boot"); ESP_LOGI(kTag, "installing early drivers"); // I2C and SPI are both always needed. We can't even power down or show an // error without these. - ESP_ERROR_CHECK(drivers::init_i2c()); ESP_ERROR_CHECK(drivers::init_spi()); - - // These drivers are the bare minimum to even show an error. If these fail, - // then the system is completely hosed. - sGpios.reset(drivers::Gpios::Create()); - assert(sGpios != nullptr); - - sGpios->set_listener(&sGpiosCallback); + sGpios->InstallReadPendingISR(); // Start bringing up LVGL now, since we have all of its prerequisites. sTrackQueue.reset(new audio::TrackQueue()); - /* ESP_LOGI(kTag, "starting ui"); if (!ui::UiState::Init(sGpios.get(), sTrackQueue.get())) { - events::Dispatch<FatalError, SystemState, ui::UiState, audio::AudioState>( - FatalError()); + events::System().Dispatch(FatalError{}); return; } - */ // Install everything else that is certain to be needed. ESP_LOGI(kTag, "installing remaining drivers"); @@ -67,8 +53,8 @@ auto Booting::entry() -> void { sTagParser.reset(new database::TagParserImpl()); if (!sSamd || !sBattery) { - events::Dispatch<FatalError, SystemState, ui::UiState, audio::AudioState>( - FatalError()); + events::System().Dispatch(FatalError{}); + events::Ui().Dispatch(FatalError{}); return; } @@ -78,13 +64,14 @@ auto Booting::entry() -> void { ESP_LOGI(kTag, "starting audio"); if (!audio::AudioState::Init(sGpios.get(), sDatabase, sTagParser, sTrackQueue.get())) { - events::Dispatch<FatalError, SystemState, ui::UiState, audio::AudioState>( - FatalError()); + events::System().Dispatch(FatalError{}); + events::Ui().Dispatch(FatalError{}); return; } - events::Dispatch<BootComplete, SystemState, ui::UiState, audio::AudioState>( - BootComplete()); + events::System().Dispatch(BootComplete{}); + events::Audio().Dispatch(BootComplete{}); + events::Ui().Dispatch(BootComplete{}); } auto Booting::exit() -> void { diff --git a/src/system_fsm/include/system_fsm.hpp b/src/system_fsm/include/system_fsm.hpp index 03b25156..6f0eb563 100644 --- a/src/system_fsm/include/system_fsm.hpp +++ b/src/system_fsm/include/system_fsm.hpp @@ -33,6 +33,8 @@ class SystemState : public tinyfsm::Fsm<SystemState> { public: virtual ~SystemState() {} + static auto early_init_gpios() -> drivers::Gpios*; + virtual void entry() {} virtual void exit() {} diff --git a/src/system_fsm/running.cpp b/src/system_fsm/running.cpp index a46cb8dc..0e988193 100644 --- a/src/system_fsm/running.cpp +++ b/src/system_fsm/running.cpp @@ -33,8 +33,10 @@ void Running::entry() { auto storage_res = drivers::SdStorage::Create(sGpios.get()); if (storage_res.has_error()) { ESP_LOGW(kTag, "failed to mount!"); - events::Dispatch<StorageError, SystemState, audio::AudioState, ui::UiState>( - StorageError()); + + events::System().Dispatch(StorageError{}); + events::Audio().Dispatch(StorageError{}); + events::Ui().Dispatch(StorageError{}); return; } sStorage.reset(storage_res.value()); @@ -45,16 +47,19 @@ void Running::entry() { auto database_res = database::Database::Open(sFileGatherer, sTagParser.get()); if (database_res.has_error()) { ESP_LOGW(kTag, "failed to open!"); - events::Dispatch<StorageError, SystemState, audio::AudioState, ui::UiState>( - StorageError()); + events::System().Dispatch(StorageError{}); + events::Audio().Dispatch(StorageError{}); + events::Ui().Dispatch(StorageError{}); return; } sDatabase.reset(database_res.value()); console::AppConsole::sDatabase = sDatabase; ESP_LOGI(kTag, "storage loaded okay"); - events::Dispatch<StorageMounted, SystemState, audio::AudioState, ui::UiState>( - StorageMounted{.db = sDatabase}); + StorageMounted ev{.db = sDatabase}; + events::System().Dispatch(ev); + events::Audio().Dispatch(ev); + events::Ui().Dispatch(ev); } void Running::exit() { @@ -63,8 +68,7 @@ void Running::exit() { } void Running::react(const StorageUnmountRequested& ev) { - events::Dispatch<internal::ReadyToUnmount, SystemState>( - internal::ReadyToUnmount()); + events::System().Dispatch(internal::ReadyToUnmount{}); } void Running::react(const internal::ReadyToUnmount& ev) { diff --git a/src/system_fsm/system_fsm.cpp b/src/system_fsm/system_fsm.cpp index c029c6bf..27e57b22 100644 --- a/src/system_fsm/system_fsm.cpp +++ b/src/system_fsm/system_fsm.cpp @@ -7,6 +7,7 @@ #include "system_fsm.hpp" #include "audio_fsm.hpp" #include "event_queue.hpp" +#include "gpios.hpp" #include "relative_wheel.hpp" #include "system_events.hpp" #include "tag_parser.hpp" @@ -30,13 +31,18 @@ std::shared_ptr<audio::TrackQueue> SystemState::sTrackQueue; console::AppConsole* SystemState::sAppConsole; +auto SystemState::early_init_gpios() -> drivers::Gpios* { + sGpios.reset(drivers::Gpios::Create()); + return sGpios.get(); +} + void SystemState::react(const FatalError& err) { if (!is_in_state<states::Error>()) { transit<states::Error>(); } } -void SystemState::react(const internal::GpioInterrupt& ev) { +void SystemState::react(const internal::GpioInterrupt&) { bool prev_key_up = sGpios->Get(drivers::Gpios::Pin::kKeyUp); bool prev_key_down = sGpios->Get(drivers::Gpios::Pin::kKeyDown); bool prev_key_lock = sGpios->Get(drivers::Gpios::Pin::kKeyLock); @@ -50,20 +56,23 @@ void SystemState::react(const internal::GpioInterrupt& ev) { bool has_headphones = !sGpios->Get(drivers::Gpios::Pin::kPhoneDetect); if (key_up != prev_key_up) { - events::Dispatch<KeyUpChanged, audio::AudioState, ui::UiState>( - {.falling = prev_key_up}); + KeyUpChanged ev{.falling = prev_key_up}; + events::Audio().Dispatch(ev); + events::Ui().Dispatch(ev); } if (key_down != prev_key_down) { - events::Dispatch<KeyDownChanged, audio::AudioState, ui::UiState>( - {.falling = prev_key_down}); + KeyDownChanged ev{.falling = prev_key_up}; + events::Audio().Dispatch(ev); + events::Ui().Dispatch(ev); } if (key_lock != prev_key_lock) { - events::Dispatch<KeyLockChanged, SystemState, ui::UiState>( - {.falling = prev_key_lock}); + KeyLockChanged ev{.falling = prev_key_up}; + events::System().Dispatch(ev); + events::Ui().Dispatch(ev); } if (has_headphones != prev_has_headphones) { - events::Dispatch<HasPhonesChanged, audio::AudioState>( - {.falling = prev_has_headphones}); + HasPhonesChanged ev{.falling = prev_key_up}; + events::Audio().Dispatch(ev); } } |
