diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/include/drivers/nvs.hpp | 4 | ||||
| -rw-r--r-- | src/drivers/nvs.cpp | 19 | ||||
| -rw-r--r-- | src/tangara/system_fsm/booting.cpp | 2 | ||||
| -rw-r--r-- | src/tangara/tts/events.hpp | 11 | ||||
| -rw-r--r-- | src/tangara/tts/provider.cpp | 9 | ||||
| -rw-r--r-- | src/tangara/tts/provider.hpp | 5 | ||||
| -rw-r--r-- | src/tangara/ui/ui_fsm.cpp | 12 | ||||
| -rw-r--r-- | src/tangara/ui/ui_fsm.hpp | 1 |
8 files changed, 58 insertions, 5 deletions
diff --git a/src/drivers/include/drivers/nvs.hpp b/src/drivers/include/drivers/nvs.hpp index e3a105f8..21d32f42 100644 --- a/src/drivers/include/drivers/nvs.hpp +++ b/src/drivers/include/drivers/nvs.hpp @@ -122,6 +122,9 @@ class NvsStorage { auto ScreenBrightness() -> uint_fast8_t; auto ScreenBrightness(uint_fast8_t) -> void; + auto UITextToSpeech() -> bool; + auto UITextToSpeech(bool) -> void; + auto InterfaceTheme() -> std::optional<std::string>; auto InterfaceTheme(std::string) -> void; @@ -179,6 +182,7 @@ class NvsStorage { Setting<uint8_t> fast_charge_; Setting<uint8_t> brightness_; + Setting<uint8_t> text_to_speech_; Setting<uint8_t> sensitivity_; Setting<uint16_t> amp_max_vol_; Setting<uint16_t> amp_cur_vol_; diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp index 04a93fd9..3250e556 100644 --- a/src/drivers/nvs.cpp +++ b/src/drivers/nvs.cpp @@ -29,6 +29,7 @@ static constexpr char kKeyBluetoothVolumes[] = "bt_vols"; static constexpr char kKeyBluetoothNames[] = "bt_names"; static constexpr char kKeyOutput[] = "out"; static constexpr char kKeyBrightness[] = "bright"; +static constexpr char kKeyTextToSpeech[] = "tts"; static constexpr char kKeyInterfaceTheme[] = "ui_theme"; static constexpr char kKeyAmpMaxVolume[] = "hp_vol_max"; static constexpr char kKeyAmpCurrentVolume[] = "hp_vol"; @@ -269,6 +270,7 @@ NvsStorage::NvsStorage(nvs_handle_t handle) lra_calibration_(kKeyLraCalibration), fast_charge_(kKeyFastCharge), brightness_(kKeyBrightness), + text_to_speech_(kKeyTextToSpeech), sensitivity_(kKeyScrollSensitivity), amp_max_vol_(kKeyAmpMaxVolume), amp_cur_vol_(kKeyAmpCurrentVolume), @@ -299,6 +301,7 @@ auto NvsStorage::Read() -> void { lra_calibration_.read(handle_); fast_charge_.read(handle_); brightness_.read(handle_); + text_to_speech_.read(handle_); sensitivity_.read(handle_); amp_max_vol_.read(handle_); amp_cur_vol_.read(handle_); @@ -324,6 +327,7 @@ auto NvsStorage::Write() -> bool { lra_calibration_.write(handle_); fast_charge_.write(handle_); brightness_.write(handle_); + text_to_speech_.write(handle_); sensitivity_.write(handle_); amp_max_vol_.write(handle_); amp_cur_vol_.write(handle_); @@ -532,6 +536,21 @@ auto NvsStorage::ScreenBrightness(uint_fast8_t val) -> void { brightness_.set(val); } +auto NvsStorage::UITextToSpeech() -> bool { + std::lock_guard<std::mutex> lock{mutex_}; + + // Default to enabling text-to-speech if not set; this may need to be + // revisited if we end up adding on-device speech generation, but in a world + // where speech samples need to be loaded onto the SD card, it makes sense to + // enable this by default, as it'll only work if speech samples are present. + return text_to_speech_.get().value_or(true); +} + +auto NvsStorage::UITextToSpeech(bool val) -> void { + std::lock_guard<std::mutex> lock{mutex_}; + text_to_speech_.set(val); +} + auto NvsStorage::InterfaceTheme() -> std::optional<std::string> { std::lock_guard<std::mutex> lock{mutex_}; return theme_.get(); diff --git a/src/tangara/system_fsm/booting.cpp b/src/tangara/system_fsm/booting.cpp index b909e1ba..0bc6da8e 100644 --- a/src/tangara/system_fsm/booting.cpp +++ b/src/tangara/system_fsm/booting.cpp @@ -100,7 +100,7 @@ auto Booting::entry() -> void { sServices->bg_worker(), sServices->database(), sServices->nvs())); sServices->tag_parser(std::make_unique<database::TagParserImpl>()); sServices->collator(locale::CreateCollator()); - sServices->tts(std::make_unique<tts::Provider>()); + sServices->tts(std::make_unique<tts::Provider>(sServices->nvs())); ESP_LOGI(kTag, "init bluetooth"); sServices->bluetooth(std::make_unique<drivers::Bluetooth>( diff --git a/src/tangara/tts/events.hpp b/src/tangara/tts/events.hpp index 21199db1..595ff181 100644 --- a/src/tangara/tts/events.hpp +++ b/src/tangara/tts/events.hpp @@ -36,6 +36,15 @@ struct SelectionChanged { std::optional<Selection> new_selection; }; -using Event = std::variant<SimpleEvent, SelectionChanged>; +/* + Event emitted when a user enables or disables the 'Spoken Interface' (TTS) + setting on the device. This is used to convey the new state to the + tts::Provider, but will not stop the current sample from being played. +*/ +struct TtsEnabledChanged { + bool tts_enabled; +}; + +using Event = std::variant<SimpleEvent, SelectionChanged, TtsEnabledChanged>; } // namespace tts diff --git a/src/tangara/tts/provider.cpp b/src/tangara/tts/provider.cpp index eedfe959..2fb6c426 100644 --- a/src/tangara/tts/provider.cpp +++ b/src/tangara/tts/provider.cpp @@ -36,7 +36,9 @@ static auto textToFile(const std::string& text) -> std::optional<std::string> { return stream.str(); } -Provider::Provider() {} +Provider::Provider(drivers::NvsStorage& nvs) : nvs_(nvs) { + tts_enabled_ = nvs_.UITextToSpeech(); +} auto Provider::player(std::unique_ptr<Player> p) -> void { player_ = std::move(p); @@ -45,6 +47,9 @@ auto Provider::player(std::unique_ptr<Player> p) -> void { auto Provider::feed(const Event& e) -> void { if (std::holds_alternative<SimpleEvent>(e)) { // ESP_LOGI(kTag, "context changed"); + } else if (std::holds_alternative<TtsEnabledChanged>(e)) { + auto ev = std::get<TtsEnabledChanged>(e); + tts_enabled_ = ev.tts_enabled; } else if (std::holds_alternative<SelectionChanged>(e)) { auto ev = std::get<SelectionChanged>(e); if (!ev.new_selection) { @@ -63,7 +68,7 @@ auto Provider::feed(const Event& e) -> void { return; } - if (player_) { + if (player_ && tts_enabled_) { player_->playFile(*text, *file); } } diff --git a/src/tangara/tts/provider.hpp b/src/tangara/tts/provider.hpp index 8fe143cc..3a16d5a9 100644 --- a/src/tangara/tts/provider.hpp +++ b/src/tangara/tts/provider.hpp @@ -13,6 +13,7 @@ #include "tts/events.hpp" #include "tts/player.hpp" +#include "drivers/nvs.hpp" namespace tts { @@ -23,7 +24,7 @@ namespace tts { */ class Provider { public: - Provider(); + Provider(drivers::NvsStorage& nvs); auto player(std::unique_ptr<Player>) -> void; @@ -34,7 +35,9 @@ class Provider { Provider& operator=(const Provider&) = delete; private: + drivers::NvsStorage& nvs_; std::unique_ptr<Player> player_; + bool tts_enabled_; }; } // namespace tts diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp index b974da53..a22c704b 100644 --- a/src/tangara/ui/ui_fsm.cpp +++ b/src/tangara/ui/ui_fsm.cpp @@ -295,6 +295,16 @@ lua::Property UiState::sDisplayBrightness{ return true; }}; +lua::Property UiState::sDisplayTextToSpeech{ + false, [](const lua::LuaValue& val) { + if (!std::holds_alternative<bool>(val)) { + return false; + } + sServices->nvs().UITextToSpeech(std::get<bool>(val)); + sServices->tts().feed(tts::TtsEnabledChanged{.tts_enabled = std::get<bool>(val)}); + return true; + }}; + lua::Property UiState::sLockSwitch{false}; lua::Property UiState::sDatabaseUpdating{false}; @@ -661,6 +671,7 @@ void Lua::entry() { registry.AddPropertyModule("display", { {"brightness", &sDisplayBrightness}, + {"text_to_speech", &sDisplayTextToSpeech}, }); registry.AddPropertyModule( @@ -721,6 +732,7 @@ void Lua::entry() { sBluetoothKnownDevices.setDirect(bt.knownDevices()); sPowerFastChargeEnabled.setDirect(sServices->nvs().FastCharge()); + sDisplayTextToSpeech.setDirect(sServices->nvs().UITextToSpeech()); if (sServices->sd() == drivers::SdState::kMounted) { sLua->RunScript("/sd/config.lua"); diff --git a/src/tangara/ui/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp index 53252a8d..aae69f94 100644 --- a/src/tangara/ui/ui_fsm.hpp +++ b/src/tangara/ui/ui_fsm.hpp @@ -130,6 +130,7 @@ class UiState : public tinyfsm::Fsm<UiState> { static lua::Property sVolumeLimit; static lua::Property sDisplayBrightness; + static lua::Property sDisplayTextToSpeech; static lua::Property sLockSwitch; |
