summaryrefslogtreecommitdiff
path: root/src/system_fsm
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-26 11:23:36 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-26 11:23:36 +1000
commitf94be3db2f2bb6c1b359744cb915683095e4ee80 (patch)
tree79d335db661720947c518a535bdde733fe669032 /src/system_fsm
parentd8194135bbaad97d1f3428a74c7fc54ba3f604ec (diff)
downloadtangara-fw-f94be3db2f2bb6c1b359744cb915683095e4ee80.tar.gz
make event queue go faster
Diffstat (limited to 'src/system_fsm')
-rw-r--r--src/system_fsm/booting.cpp31
-rw-r--r--src/system_fsm/include/system_fsm.hpp2
-rw-r--r--src/system_fsm/running.cpp20
-rw-r--r--src/system_fsm/system_fsm.cpp27
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);
}
}