From f78de39a750d58bfe883a789aa6cc4b0a5d9b9e7 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 12 Jul 2024 14:40:54 +1000 Subject: Give Bluetooth settings a bit of a refresh It's now a bit more responsive to stuff happening, gives you more information, and remembers your previously paired devices for faster switching between them. --- src/drivers/bluetooth.cpp | 24 +++++++++-------- src/drivers/include/drivers/nvs.hpp | 2 +- src/drivers/nvs.cpp | 2 +- src/tangara/lua/property.cpp | 51 +++++++++++++++++++------------------ 4 files changed, 42 insertions(+), 37 deletions(-) (limited to 'src') diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp index 2edf5ad9..a0a318e9 100644 --- a/src/drivers/bluetooth.cpp +++ b/src/drivers/bluetooth.cpp @@ -603,16 +603,21 @@ void Disabled::react(const events::Enable&) { void Idle::entry() { ESP_LOGI(kTag, "bt is idle"); + std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); } -void Idle::exit() {} +void Idle::exit() { + std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); +} void Idle::react(const events::Disable& ev) { transit(); } void Idle::react(const events::PairedDeviceChanged& ev) { - connect(*sPairedWith_); + if (sPairedWith_) { + connect(*sPairedWith_); + } } void Idle::react(events::internal::Gap ev) { @@ -633,18 +638,10 @@ void Connecting::entry() { sTimeoutTimer = xTimerCreate("bt_timeout", pdMS_TO_TICKS(15000), false, NULL, timeoutCallback); xTimerStart(sTimeoutTimer, portMAX_DELAY); - - if (sEventHandler_) { - std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); - } } void Connecting::exit() { xTimerDelete(sTimeoutTimer, portMAX_DELAY); - - if (sEventHandler_) { - std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); - } } void Connecting::react(const events::ConnectTimedOut& ev) { @@ -751,12 +748,16 @@ void Connected::entry() { sStorage_->PreferredBluetoothDevice(sPairedWith_); } + std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); + // TODO: if we already have a source, immediately start playing } void Connected::exit() { ESP_LOGI(kTag, "exiting connected state"); esp_a2d_source_disconnect(connected_to_.data()); + + std::invoke(sEventHandler_, SimpleEvent::kConnectionStateChanged); } void Connected::react(const events::Disable& ev) { @@ -765,6 +766,9 @@ void Connected::react(const events::Disable& ev) { void Connected::react(const events::PairedDeviceChanged& ev) { transit(); + if (sPairedWith_) { + connect(*sPairedWith_); + } } void Connected::react(const events::SourceChanged& ev) { diff --git a/src/drivers/include/drivers/nvs.hpp b/src/drivers/include/drivers/nvs.hpp index 2bc77a31..8eb28cc9 100644 --- a/src/drivers/include/drivers/nvs.hpp +++ b/src/drivers/include/drivers/nvs.hpp @@ -34,7 +34,7 @@ class Setting { dirty_ = true; } } - auto get() -> std::optional& { return val_; } + auto get() -> std::optional { return val_; } /* Reads the stored value from NVS and parses it into the correct type. */ auto load(nvs_handle_t) -> std::optional; diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp index c4d8dedc..e3c4aa06 100644 --- a/src/drivers/nvs.cpp +++ b/src/drivers/nvs.cpp @@ -391,7 +391,7 @@ auto NvsStorage::BluetoothNames() -> std::vector { auto NvsStorage::BluetoothName(const bluetooth::mac_addr_t& mac, std::optional name) -> void { std::lock_guard lock{mutex_}; - auto& val = bt_names_.get(); + auto val = bt_names_.get(); if (!val) { val.emplace(); } diff --git a/src/tangara/lua/property.cpp b/src/tangara/lua/property.cpp index 7b4f0b97..1be1fd2d 100644 --- a/src/tangara/lua/property.cpp +++ b/src/tangara/lua/property.cpp @@ -371,33 +371,34 @@ auto popRichType(lua_State* L) -> LuaValue { } auto Property::popValue(lua_State& s) -> bool { - LuaValue new_val; - switch (lua_type(&s, 2)) { - case LUA_TNIL: - new_val = std::monostate{}; - break; - case LUA_TNUMBER: - if (lua_isinteger(&s, 2)) { - new_val = lua_tointeger(&s, 2); - } else { - new_val = static_cast(std::round(lua_tonumber(&s, 2))); - } - break; - case LUA_TBOOLEAN: - new_val = static_cast(lua_toboolean(&s, 2)); - break; - case LUA_TSTRING: - new_val = lua_tostring(&s, 2); - break; - default: - if (lua_istable(&s, 2)) { - new_val = popRichType(&s); - if (std::holds_alternative(new_val)) { + LuaValue new_val{std::monostate{}}; + if (lua_gettop(&s) >= 2) { + switch (lua_type(&s, 2)) { + case LUA_TNIL: + break; + case LUA_TNUMBER: + if (lua_isinteger(&s, 2)) { + new_val = lua_tointeger(&s, 2); + } else { + new_val = static_cast(std::round(lua_tonumber(&s, 2))); + } + break; + case LUA_TBOOLEAN: + new_val = static_cast(lua_toboolean(&s, 2)); + break; + case LUA_TSTRING: + new_val = lua_tostring(&s, 2); + break; + default: + if (lua_istable(&s, 2)) { + new_val = popRichType(&s); + if (std::holds_alternative(new_val)) { + return false; + } + } else { return false; } - } else { - return false; - } + } } return set(new_val); -- cgit v1.2.3