Respond to sd card mounts and unmounts within lua

Includes no longer blocking the main menu on an sd card being inserted!!
custom
jacqueline 1 year ago
parent 3ceb8025ee
commit 344a46d066
  1. 16
      lua/main.lua
  2. 13
      src/tangara/audio/audio_fsm.cpp
  3. 10
      src/tangara/audio/audio_fsm.hpp
  4. 58
      src/tangara/system_fsm/running.cpp
  5. 10
      src/tangara/system_fsm/system_events.hpp
  6. 8
      src/tangara/system_fsm/system_fsm.hpp
  7. 99
      src/tangara/ui/ui_fsm.cpp
  8. 20
      src/tangara/ui/ui_fsm.hpp

@ -3,12 +3,15 @@ local vol = require("volume")
local theme = require("theme") local theme = require("theme")
local controls = require("controls") local controls = require("controls")
local time = require("time") local time = require("time")
local sd_card = require("sd_card")
local lock_time = time.ticks() local backstack = require("backstack")
local main_menu = require("main_menu")
local theme_dark = require("theme_dark") local theme_dark = require("theme_dark")
theme.set(theme_dark) theme.set(theme_dark)
local lock_time = time.ticks()
-- Set up property bindings that are used across every screen. -- Set up property bindings that are used across every screen.
GLOBAL_BINDINGS = { GLOBAL_BINDINGS = {
-- Show an alert with the current volume whenever the volume changes -- Show an alert with the current volume whenever the volume changes
@ -52,9 +55,8 @@ GLOBAL_BINDINGS = {
end end
end end
end), end),
sd_card.mounted:bind(function(mounted)
print("reset ui stack")
backstack.reset(main_menu:new())
end),
} }
local backstack = require("backstack")
local main_menu = require("main_menu")
backstack.push(main_menu)

@ -15,6 +15,7 @@
#include "cppbor.h" #include "cppbor.h"
#include "cppbor_parse.h" #include "cppbor_parse.h"
#include "drivers/bluetooth_types.hpp" #include "drivers/bluetooth_types.hpp"
#include "drivers/storage.hpp"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_log.h" #include "esp_log.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
@ -500,7 +501,11 @@ void Standby::react(const system_fsm::KeyLockChanged& ev) {
}); });
} }
void Standby::react(const system_fsm::StorageMounted& ev) { void Standby::react(const system_fsm::SdStateChanged& ev) {
auto state = sServices->sd();
if (state != drivers::SdState::kMounted) {
return;
}
sServices->bg_worker().Dispatch<void>([]() { sServices->bg_worker().Dispatch<void>([]() {
auto db = sServices->database().lock(); auto db = sServices->database().lock();
if (!db) { if (!db) {
@ -568,6 +573,12 @@ void Playback::exit() {
events::Ui().Dispatch(event); events::Ui().Dispatch(event);
} }
void Playback::react(const system_fsm::SdStateChanged& ev) {
if (sServices->sd() != drivers::SdState::kMounted) {
transit<Standby>();
}
}
} // namespace states } // namespace states
} // namespace audio } // namespace audio

@ -61,8 +61,8 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
void react(const OutputModeChanged&); void react(const OutputModeChanged&);
virtual void react(const system_fsm::BootComplete&) {} virtual void react(const system_fsm::BootComplete&) {}
virtual void react(const system_fsm::KeyLockChanged&) {}; virtual void react(const system_fsm::KeyLockChanged&){};
virtual void react(const system_fsm::StorageMounted&) {} virtual void react(const system_fsm::SdStateChanged&) {}
virtual void react(const system_fsm::BluetoothEvent&); virtual void react(const system_fsm::BluetoothEvent&);
protected: protected:
@ -103,7 +103,7 @@ namespace states {
class Uninitialised : public AudioState { class Uninitialised : public AudioState {
public: public:
void react(const system_fsm::BootComplete&) override; void react(const system_fsm::BootComplete&) override;
void react(const system_fsm::BluetoothEvent&) override {}; void react(const system_fsm::BluetoothEvent&) override{};
using AudioState::react; using AudioState::react;
}; };
@ -111,7 +111,7 @@ class Uninitialised : public AudioState {
class Standby : public AudioState { class Standby : public AudioState {
public: public:
void react(const system_fsm::KeyLockChanged&) override; void react(const system_fsm::KeyLockChanged&) override;
void react(const system_fsm::StorageMounted&) override; void react(const system_fsm::SdStateChanged&) override;
using AudioState::react; using AudioState::react;
}; };
@ -121,6 +121,8 @@ class Playback : public AudioState {
void entry() override; void entry() override;
void exit() override; void exit() override;
void react(const system_fsm::SdStateChanged&) override;
using AudioState::react; using AudioState::react;
}; };

@ -10,6 +10,7 @@
#include "database/db_events.hpp" #include "database/db_events.hpp"
#include "database/file_gatherer.hpp" #include "database/file_gatherer.hpp"
#include "drivers/gpios.hpp" #include "drivers/gpios.hpp"
#include "drivers/spi.hpp"
#include "ff.h" #include "ff.h"
#include "freertos/portmacro.h" #include "freertos/portmacro.h"
#include "freertos/projdefs.h" #include "freertos/projdefs.h"
@ -42,11 +43,7 @@ void Running::entry() {
sUnmountTimer = xTimerCreate("unmount_timeout", kTicksBeforeUnmount, false, sUnmountTimer = xTimerCreate("unmount_timeout", kTicksBeforeUnmount, false,
NULL, timer_callback); NULL, timer_callback);
} }
// Only mount our storage immediately if we know it's not currently in use
// by the SAMD.
if (!sServices->samd().UsbMassStorage()) {
mountStorage(); mountStorage();
}
} }
void Running::exit() { void Running::exit() {
@ -80,10 +77,28 @@ void Running::react(const SdDetectChanged& ev) {
if (ev.has_sd_card && !sStorage) { if (ev.has_sd_card && !sStorage) {
mountStorage(); mountStorage();
} }
// Don't automatically unmount, since this event seems to occasionally happen // Don't automatically unmount, since this event seems to occasionally happen
// supriously. FIXME: Why? // supriously. FIXME: Why?
// (It doesn't matter too much; by the time we get this event the SD card has // Instead, check whether or not the card has actually gone away.
// already been disconnected electrically.) if (sStorage) {
FRESULT res;
FF_DIR dir;
{
auto lock = drivers::acquire_spi();
res = f_opendir(&dir, "/");
}
if (res != FR_OK) {
ESP_LOGW(kTag, "sd card ejected unsafely!");
unmountStorage();
}
{
auto lock = drivers::acquire_spi();
f_closedir(&dir);
}
}
} }
void Running::react(const SamdUsbMscChanged& ev) { void Running::react(const SamdUsbMscChanged& ev) {
@ -134,25 +149,37 @@ auto Running::checkIdle() -> void {
} }
} }
auto Running::mountStorage() -> bool { auto Running::updateSdState(drivers::SdState state) -> void {
sServices->sd(state);
events::Ui().Dispatch(SdStateChanged{});
events::Audio().Dispatch(SdStateChanged{});
events::System().Dispatch(SdStateChanged{});
}
auto Running::mountStorage() -> void {
// Only mount our storage if we know it's not currently in use by the SAMD.
if (sServices->samd().UsbMassStorage()) {
updateSdState(drivers::SdState::kNotMounted);
return;
}
ESP_LOGI(kTag, "mounting sd card"); ESP_LOGI(kTag, "mounting sd card");
auto storage_res = drivers::SdStorage::Create(sServices->gpios()); auto storage_res = drivers::SdStorage::Create(sServices->gpios());
if (storage_res.has_error()) { if (storage_res.has_error()) {
ESP_LOGW(kTag, "failed to mount!"); ESP_LOGW(kTag, "failed to mount!");
switch (storage_res.error()) { switch (storage_res.error()) {
case drivers::SdStorage::FAILED_TO_MOUNT: case drivers::SdStorage::FAILED_TO_MOUNT:
sServices->sd(drivers::SdState::kNotFormatted); updateSdState(drivers::SdState::kNotFormatted);
break; break;
case drivers::SdStorage::FAILED_TO_READ: case drivers::SdStorage::FAILED_TO_READ:
default: default:
sServices->sd(drivers::SdState::kNotPresent); updateSdState(drivers::SdState::kNotPresent);
break; break;
} }
return false; return;
} }
sStorage.reset(storage_res.value()); sStorage.reset(storage_res.value());
sServices->sd(drivers::SdState::kMounted);
ESP_LOGI(kTag, "opening database"); ESP_LOGI(kTag, "opening database");
sFileGatherer = new database::FileGathererImpl(); sFileGatherer = new database::FileGathererImpl();
@ -161,16 +188,14 @@ auto Running::mountStorage() -> bool {
sServices->collator(), sServices->bg_worker()); sServices->collator(), sServices->bg_worker());
if (database_res.has_error()) { if (database_res.has_error()) {
unmountStorage(); unmountStorage();
return false; return;
} }
sServices->database( sServices->database(
std::unique_ptr<database::Database>{database_res.value()}); std::unique_ptr<database::Database>{database_res.value()});
ESP_LOGI(kTag, "storage loaded okay"); ESP_LOGI(kTag, "storage loaded okay");
events::Ui().Dispatch(StorageMounted{}); updateSdState(drivers::SdState::kMounted);
events::Audio().Dispatch(StorageMounted{});
events::System().Dispatch(StorageMounted{});
// Tell the database to refresh so that we pick up any changes from the newly // Tell the database to refresh so that we pick up any changes from the newly
// mounted card. // mounted card.
@ -183,14 +208,13 @@ auto Running::mountStorage() -> bool {
db->updateIndexes(); db->updateIndexes();
}); });
} }
return true;
} }
auto Running::unmountStorage() -> void { auto Running::unmountStorage() -> void {
ESP_LOGW(kTag, "unmounting storage"); ESP_LOGW(kTag, "unmounting storage");
sServices->database({}); sServices->database({});
sStorage.reset(); sStorage.reset();
updateSdState(drivers::SdState::kNotMounted);
} }
} // namespace states } // namespace states

@ -9,11 +9,12 @@
#include <memory> #include <memory>
#include "battery/battery.hpp" #include "battery/battery.hpp"
#include "drivers/bluetooth_types.hpp"
#include "database/database.hpp" #include "database/database.hpp"
#include "ff.h" #include "drivers/bluetooth_types.hpp"
#include "drivers/haptics.hpp" #include "drivers/haptics.hpp"
#include "drivers/samd.hpp" #include "drivers/samd.hpp"
#include "drivers/storage.hpp"
#include "ff.h"
#include "system_fsm/service_locator.hpp" #include "system_fsm/service_locator.hpp"
#include "tinyfsm.hpp" #include "tinyfsm.hpp"
@ -38,10 +39,7 @@ struct FatalError : tinyfsm::Event {};
struct OnIdle : tinyfsm::Event {}; struct OnIdle : tinyfsm::Event {};
/* struct SdStateChanged : tinyfsm::Event {};
* Sent by SysState when the system storage has been successfully mounted.
*/
struct StorageMounted : tinyfsm::Event {};
struct StorageError : tinyfsm::Event { struct StorageError : tinyfsm::Event {
FRESULT error; FRESULT error;

@ -15,19 +15,19 @@
#include "audio/audio_events.hpp" #include "audio/audio_events.hpp"
#include "audio/track_queue.hpp" #include "audio/track_queue.hpp"
#include "battery/battery.hpp" #include "battery/battery.hpp"
#include "drivers/bluetooth.hpp"
#include "database/database.hpp" #include "database/database.hpp"
#include "database/db_events.hpp" #include "database/db_events.hpp"
#include "database/tag_parser.hpp" #include "database/tag_parser.hpp"
#include "drivers/bluetooth.hpp"
#include "drivers/display.hpp" #include "drivers/display.hpp"
#include "drivers/gpios.hpp" #include "drivers/gpios.hpp"
#include "drivers/nvs.hpp" #include "drivers/nvs.hpp"
#include "drivers/samd.hpp" #include "drivers/samd.hpp"
#include "drivers/storage.hpp" #include "drivers/storage.hpp"
#include "drivers/touchwheel.hpp"
#include "system_fsm/service_locator.hpp" #include "system_fsm/service_locator.hpp"
#include "system_fsm/system_events.hpp" #include "system_fsm/system_events.hpp"
#include "tinyfsm.hpp" #include "tinyfsm.hpp"
#include "drivers/touchwheel.hpp"
namespace system_fsm { namespace system_fsm {
@ -55,7 +55,6 @@ class SystemState : public tinyfsm::Fsm<SystemState> {
virtual void react(const DisplayReady&) {} virtual void react(const DisplayReady&) {}
virtual void react(const BootComplete&) {} virtual void react(const BootComplete&) {}
virtual void react(const StorageMounted&) {}
virtual void react(const StorageError&) {} virtual void react(const StorageError&) {}
virtual void react(const KeyLockChanged&) {} virtual void react(const KeyLockChanged&) {}
virtual void react(const SdDetectChanged&) {} virtual void react(const SdDetectChanged&) {}
@ -110,7 +109,8 @@ class Running : public SystemState {
private: private:
auto checkIdle() -> void; auto checkIdle() -> void;
auto mountStorage() -> bool; auto updateSdState(drivers::SdState) -> void;
auto mountStorage() -> void;
auto unmountStorage() -> void; auto unmountStorage() -> void;
bool storage_mounted_; bool storage_mounted_;

@ -10,56 +10,56 @@
#include <memory_resource> #include <memory_resource>
#include <variant> #include <variant>
#include "database/db_events.hpp" #include "FreeRTOSConfig.h"
#include "drivers/bluetooth_types.hpp" #include "lvgl.h"
#include "drivers/display_init.hpp"
#include "esp_spp_api.h"
#include "freertos/portmacro.h"
#include "freertos/projdefs.h"
#include "input/device_factory.hpp"
#include "input/feedback_haptics.hpp"
#include "input/input_device.hpp"
#include "input/input_touch_wheel.hpp"
#include "input/input_volume_buttons.hpp"
#include "lua.h"
#include "lua.hpp"
#include "audio/audio_fsm.hpp"
#include "battery/battery.hpp"
#include "core/lv_group.h" #include "core/lv_group.h"
#include "core/lv_obj.h" #include "core/lv_obj.h"
#include "core/lv_obj_tree.h" #include "core/lv_obj_tree.h"
#include "database/database.hpp"
#include "drivers/haptics.hpp"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_spp_api.h"
#include "esp_timer.h" #include "esp_timer.h"
#include "input/lvgl_input_driver.hpp" #include "freertos/portmacro.h"
#include "lauxlib.h" #include "freertos/projdefs.h"
#include "lua/lua_thread.hpp" #include "lua.hpp"
#include "luavgl.h" #include "luavgl.h"
#include "memory_resource.hpp"
#include "misc/lv_gc.h" #include "misc/lv_gc.h"
#include "tinyfsm.hpp"
#include "widgets/lv_label.h"
#include "audio/audio_events.hpp" #include "audio/audio_events.hpp"
#include "audio/audio_fsm.hpp"
#include "audio/track_queue.hpp" #include "audio/track_queue.hpp"
#include "battery/battery.hpp"
#include "database/database.hpp"
#include "database/db_events.hpp"
#include "drivers/bluetooth_types.hpp"
#include "drivers/display.hpp" #include "drivers/display.hpp"
#include "drivers/display_init.hpp"
#include "drivers/gpios.hpp" #include "drivers/gpios.hpp"
#include "drivers/haptics.hpp"
#include "drivers/nvs.hpp" #include "drivers/nvs.hpp"
#include "drivers/samd.hpp" #include "drivers/samd.hpp"
#include "drivers/spiffs.hpp" #include "drivers/spiffs.hpp"
#include "drivers/storage.hpp" #include "drivers/storage.hpp"
#include "drivers/touchwheel.hpp" #include "drivers/touchwheel.hpp"
#include "events/event_queue.hpp" #include "events/event_queue.hpp"
#include "input/device_factory.hpp"
#include "input/feedback_haptics.hpp"
#include "input/input_device.hpp"
#include "input/input_touch_wheel.hpp"
#include "input/input_volume_buttons.hpp"
#include "input/lvgl_input_driver.hpp"
#include "lua/lua_registry.hpp" #include "lua/lua_registry.hpp"
#include "lua/lua_thread.hpp"
#include "lua/property.hpp" #include "lua/property.hpp"
#include "memory_resource.hpp"
#include "system_fsm/system_events.hpp" #include "system_fsm/system_events.hpp"
#include "tinyfsm.hpp"
#include "ui/lvgl_task.hpp" #include "ui/lvgl_task.hpp"
#include "ui/screen.hpp" #include "ui/screen.hpp"
#include "ui/screen_lua.hpp" #include "ui/screen_lua.hpp"
#include "ui/screen_splash.hpp" #include "ui/screen_splash.hpp"
#include "ui/ui_events.hpp" #include "ui/ui_events.hpp"
#include "widgets/lv_label.h"
namespace ui { namespace ui {
@ -253,6 +253,8 @@ lua::Property UiState::sDatabaseAutoUpdate{
return true; return true;
}}; }};
lua::Property UiState::sSdMounted{false};
lua::Property UiState::sUsbMassStorageEnabled{ lua::Property UiState::sUsbMassStorageEnabled{
false, [](const lua::LuaValue& val) { false, [](const lua::LuaValue& val) {
if (!std::holds_alternative<bool>(val)) { if (!std::holds_alternative<bool>(val)) {
@ -266,8 +268,8 @@ lua::Property UiState::sUsbMassStorageEnabled{
lua::Property UiState::sUsbMassStorageBusy{false}; lua::Property UiState::sUsbMassStorageBusy{false};
auto UiState::InitBootSplash(drivers::IGpios& gpios, auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs)
drivers::NvsStorage& nvs) -> bool { -> bool {
events::Ui().Dispatch(internal::InitDisplay{ events::Ui().Dispatch(internal::InitDisplay{
.gpios = gpios, .gpios = gpios,
.nvs = nvs, .nvs = nvs,
@ -334,6 +336,10 @@ void UiState::react(const system_fsm::SamdUsbStatusChanged& ev) {
drivers::Samd::UsbStatus::kAttachedBusy); drivers::Samd::UsbStatus::kAttachedBusy);
} }
void UiState::react(const system_fsm::SdStateChanged&) {
sSdMounted.setDirect(sServices->sd() == drivers::SdState::kMounted);
}
void UiState::react(const database::event::UpdateStarted&) { void UiState::react(const database::event::UpdateStarted&) {
sDatabaseUpdating.setDirect(true); sDatabaseUpdating.setDirect(true);
} }
@ -444,7 +450,8 @@ void Splash::react(const system_fsm::BootComplete& ev) {
sTask->input(sInput); sTask->input(sInput);
} }
void Splash::react(const system_fsm::StorageMounted&) { void Splash::react(const system_fsm::SdStateChanged& ev) {
UiState::react(ev);
transit<Lua>(); transit<Lua>();
} }
@ -517,6 +524,7 @@ void Lua::entry() {
{ {
{"push", [&](lua_State* s) { return PushLuaScreen(s); }}, {"push", [&](lua_State* s) { return PushLuaScreen(s); }},
{"pop", [&](lua_State* s) { return PopLuaScreen(s); }}, {"pop", [&](lua_State* s) { return PopLuaScreen(s); }},
{"reset", [&](lua_State* s) { return ResetLuaScreen(s); }},
}); });
registry.AddPropertyModule( registry.AddPropertyModule(
"alerts", { "alerts", {
@ -533,6 +541,9 @@ void Lua::entry() {
{"updating", &sDatabaseUpdating}, {"updating", &sDatabaseUpdating},
{"auto_update", &sDatabaseAutoUpdate}, {"auto_update", &sDatabaseAutoUpdate},
}); });
registry.AddPropertyModule("sd_card", {
{"mounted", &sSdMounted},
});
registry.AddPropertyModule("usb", registry.AddPropertyModule("usb",
{ {
{"msc_enabled", &sUsbMassStorageEnabled}, {"msc_enabled", &sUsbMassStorageEnabled},
@ -547,7 +558,9 @@ void Lua::entry() {
sBluetoothDevices.setDirect(bt.KnownDevices()); sBluetoothDevices.setDirect(bt.KnownDevices());
sCurrentScreen.reset(); sCurrentScreen.reset();
if (sServices->sd() == drivers::SdState::kMounted) {
sLua->RunScript("/sdcard/config.lua"); sLua->RunScript("/sdcard/config.lua");
}
sLua->RunScript("/lua/main.lua"); sLua->RunScript("/lua/main.lua");
} }
} }
@ -587,16 +600,6 @@ auto Lua::PushLuaScreen(lua_State* s) -> int {
return 0; return 0;
} }
auto Lua::QueueNext(lua_State*) -> int {
sServices->track_queue().next();
return 0;
}
auto Lua::QueuePrevious(lua_State*) -> int {
sServices->track_queue().previous();
return 0;
}
auto Lua::PopLuaScreen(lua_State* s) -> int { auto Lua::PopLuaScreen(lua_State* s) -> int {
if (!sCurrentScreen->canPop()) { if (!sCurrentScreen->canPop()) {
return 0; return 0;
@ -607,6 +610,30 @@ auto Lua::PopLuaScreen(lua_State* s) -> int {
return 0; return 0;
} }
auto Lua::ResetLuaScreen(lua_State* s) -> int {
if (sCurrentScreen) {
if (!sCurrentScreen->canPop()) {
ESP_LOGW(kTag, "ignoring reset as popping is blocked");
return 0;
}
sCurrentScreen->onHidden();
}
while (!sScreens.empty()) {
sScreens.pop();
}
return PushLuaScreen(s);
}
auto Lua::QueueNext(lua_State*) -> int {
sServices->track_queue().next();
return 0;
}
auto Lua::QueuePrevious(lua_State*) -> int {
sServices->track_queue().previous();
return 0;
}
auto Lua::Ticks(lua_State* s) -> int { auto Lua::Ticks(lua_State* s) -> int {
lua_pushinteger(s, esp_timer_get_time() / 1000); lua_pushinteger(s, esp_timer_get_time() / 1000);
return 1; return 1;

@ -10,6 +10,8 @@
#include <memory> #include <memory>
#include <stack> #include <stack>
#include "tinyfsm.hpp"
#include "audio/audio_events.hpp" #include "audio/audio_events.hpp"
#include "audio/track_queue.hpp" #include "audio/track_queue.hpp"
#include "battery/battery.hpp" #include "battery/battery.hpp"
@ -17,6 +19,9 @@
#include "database/track.hpp" #include "database/track.hpp"
#include "drivers/display.hpp" #include "drivers/display.hpp"
#include "drivers/gpios.hpp" #include "drivers/gpios.hpp"
#include "drivers/nvs.hpp"
#include "drivers/storage.hpp"
#include "drivers/touchwheel.hpp"
#include "input/device_factory.hpp" #include "input/device_factory.hpp"
#include "input/feedback_haptics.hpp" #include "input/feedback_haptics.hpp"
#include "input/input_touch_wheel.hpp" #include "input/input_touch_wheel.hpp"
@ -24,12 +29,8 @@
#include "input/lvgl_input_driver.hpp" #include "input/lvgl_input_driver.hpp"
#include "lua/lua_thread.hpp" #include "lua/lua_thread.hpp"
#include "lua/property.hpp" #include "lua/property.hpp"
#include "drivers/nvs.hpp"
#include "drivers/storage.hpp"
#include "system_fsm/service_locator.hpp" #include "system_fsm/service_locator.hpp"
#include "system_fsm/system_events.hpp" #include "system_fsm/system_events.hpp"
#include "tinyfsm.hpp"
#include "drivers/touchwheel.hpp"
#include "ui/lvgl_task.hpp" #include "ui/lvgl_task.hpp"
#include "ui/modal.hpp" #include "ui/modal.hpp"
#include "ui/screen.hpp" #include "ui/screen.hpp"
@ -57,7 +58,7 @@ class UiState : public tinyfsm::Fsm<UiState> {
virtual void react(const DumpLuaStack&) {} virtual void react(const DumpLuaStack&) {}
virtual void react(const internal::BackPressed&) {} virtual void react(const internal::BackPressed&) {}
virtual void react(const system_fsm::BootComplete&) {} virtual void react(const system_fsm::BootComplete&) {}
virtual void react(const system_fsm::StorageMounted&) {} virtual void react(const system_fsm::SdStateChanged&);
void react(const system_fsm::BatteryStateChanged&); void react(const system_fsm::BatteryStateChanged&);
void react(const audio::PlaybackUpdate&); void react(const audio::PlaybackUpdate&);
@ -74,7 +75,7 @@ class UiState : public tinyfsm::Fsm<UiState> {
void react(const internal::DismissAlerts&); void react(const internal::DismissAlerts&);
void react(const database::event::UpdateStarted&); void react(const database::event::UpdateStarted&);
void react(const database::event::UpdateProgress&) {}; void react(const database::event::UpdateProgress&){};
void react(const database::event::UpdateFinished&); void react(const database::event::UpdateFinished&);
void react(const system_fsm::BluetoothEvent&); void react(const system_fsm::BluetoothEvent&);
@ -86,7 +87,7 @@ class UiState : public tinyfsm::Fsm<UiState> {
sCurrentModal.reset(); sCurrentModal.reset();
} }
void react(const internal::ReindexDatabase&) {}; void react(const internal::ReindexDatabase&){};
protected: protected:
void PushScreen(std::shared_ptr<Screen>); void PushScreen(std::shared_ptr<Screen>);
@ -136,6 +137,8 @@ class UiState : public tinyfsm::Fsm<UiState> {
static lua::Property sDatabaseUpdating; static lua::Property sDatabaseUpdating;
static lua::Property sDatabaseAutoUpdate; static lua::Property sDatabaseAutoUpdate;
static lua::Property sSdMounted;
static lua::Property sUsbMassStorageEnabled; static lua::Property sUsbMassStorageEnabled;
static lua::Property sUsbMassStorageBusy; static lua::Property sUsbMassStorageBusy;
}; };
@ -147,7 +150,7 @@ class Splash : public UiState {
void exit() override; void exit() override;
void react(const system_fsm::BootComplete&) override; void react(const system_fsm::BootComplete&) override;
void react(const system_fsm::StorageMounted&) override; void react(const system_fsm::SdStateChanged&) override;
using UiState::react; using UiState::react;
}; };
@ -166,6 +169,7 @@ class Lua : public UiState {
private: private:
auto PushLuaScreen(lua_State*) -> int; auto PushLuaScreen(lua_State*) -> int;
auto PopLuaScreen(lua_State*) -> int; auto PopLuaScreen(lua_State*) -> int;
auto ResetLuaScreen(lua_State*) -> int;
auto ShowAlert(lua_State*) -> int; auto ShowAlert(lua_State*) -> int;
auto HideAlert(lua_State*) -> int; auto HideAlert(lua_State*) -> int;

Loading…
Cancel
Save