From b255ea799eead9668e7fd69a286349ac4a74a73c Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 29 Apr 2024 12:42:16 +1000 Subject: [PATCH 01/15] Add lua bindings for override input hooks --- src/input/include/input_device.hpp | 4 +- src/input/include/input_hook.hpp | 10 +- src/input/include/input_nav_buttons.hpp | 2 +- src/input/include/input_touch_dpad.hpp | 2 +- src/input/include/input_touch_wheel.hpp | 2 +- src/input/include/input_volume_buttons.hpp | 2 +- src/input/include/lvgl_input_driver.hpp | 52 ++++++++ src/input/input_hook.cpp | 19 +-- src/input/input_nav_buttons.cpp | 3 +- src/input/input_touch_dpad.cpp | 3 +- src/input/input_touch_wheel.cpp | 3 +- src/input/input_volume_buttons.cpp | 3 +- src/input/lvgl_input_driver.cpp | 137 ++++++++++++++++++++- 13 files changed, 212 insertions(+), 30 deletions(-) diff --git a/src/input/include/input_device.hpp b/src/input/include/input_device.hpp index 59456351..d944c3bf 100644 --- a/src/input/include/input_device.hpp +++ b/src/input/include/input_device.hpp @@ -29,7 +29,9 @@ class IInputDevice { virtual auto read(lv_indev_data_t* data) -> void = 0; virtual auto name() -> std::string = 0; - virtual auto hooks() -> std::vector { return {}; } + virtual auto triggers() -> std::vector> { + return {}; + } }; } // namespace input diff --git a/src/input/include/input_hook.hpp b/src/input/include/input_hook.hpp index 81eb80d9..a257c04a 100644 --- a/src/input/include/input_hook.hpp +++ b/src/input/include/input_hook.hpp @@ -32,6 +32,10 @@ class Hook { auto name() const -> const std::string& { return name_; } auto callback() -> std::optional; + // Not copyable or movable. + Hook(const Hook&) = delete; + Hook& operator=(const Hook&) = delete; + private: std::string name_; std::optional default_; @@ -51,7 +55,11 @@ class TriggerHooks { auto override(Trigger::State, std::optional) -> void; auto name() const -> const std::string&; - auto pushHooks(lua_State*) -> void; + auto hooks() -> std::vector>; + + // Not copyable or movable. + TriggerHooks(const TriggerHooks&) = delete; + TriggerHooks& operator=(const TriggerHooks&) = delete; private: std::string name_; diff --git a/src/input/include/input_nav_buttons.hpp b/src/input/include/input_nav_buttons.hpp index 4e4952c9..9feeb375 100644 --- a/src/input/include/input_nav_buttons.hpp +++ b/src/input/include/input_nav_buttons.hpp @@ -26,7 +26,7 @@ class NavButtons : public IInputDevice { auto read(lv_indev_data_t* data) -> void override; auto name() -> std::string override; - auto hooks() -> std::vector override; + auto triggers() -> std::vector> override; private: drivers::IGpios& gpios_; diff --git a/src/input/include/input_touch_dpad.hpp b/src/input/include/input_touch_dpad.hpp index 691e3243..0c45b2d9 100644 --- a/src/input/include/input_touch_dpad.hpp +++ b/src/input/include/input_touch_dpad.hpp @@ -25,7 +25,7 @@ class TouchDPad : public IInputDevice { auto read(lv_indev_data_t* data) -> void override; auto name() -> std::string override; - auto hooks() -> std::vector override; + auto triggers() -> std::vector> override; private: drivers::TouchWheel& wheel_; diff --git a/src/input/include/input_touch_wheel.hpp b/src/input/include/input_touch_wheel.hpp index 1f116da9..764cc68d 100644 --- a/src/input/include/input_touch_wheel.hpp +++ b/src/input/include/input_touch_wheel.hpp @@ -28,7 +28,7 @@ class TouchWheel : public IInputDevice { auto read(lv_indev_data_t* data) -> void override; auto name() -> std::string override; - auto hooks() -> std::vector override; + auto triggers() -> std::vector> override; auto sensitivity() -> lua::Property&; diff --git a/src/input/include/input_volume_buttons.hpp b/src/input/include/input_volume_buttons.hpp index a684aa48..e3246df4 100644 --- a/src/input/include/input_volume_buttons.hpp +++ b/src/input/include/input_volume_buttons.hpp @@ -25,7 +25,7 @@ class VolumeButtons : public IInputDevice { auto read(lv_indev_data_t* data) -> void override; auto name() -> std::string override; - auto hooks() -> std::vector override; + auto triggers() -> std::vector> override; private: drivers::IGpios& gpios_; diff --git a/src/input/include/lvgl_input_driver.hpp b/src/input/include/lvgl_input_driver.hpp index 9f43d27f..9adaf143 100644 --- a/src/input/include/lvgl_input_driver.hpp +++ b/src/input/include/lvgl_input_driver.hpp @@ -18,6 +18,8 @@ #include "hal/lv_hal_indev.h" #include "input_device.hpp" +#include "input_hook.hpp" +#include "lua_thread.hpp" #include "nvs.hpp" #include "property.hpp" #include "touchwheel.hpp" @@ -54,6 +56,56 @@ class LvglInputDriver { std::vector> inputs_; std::vector> feedbacks_; + /* + * Key for identifying which device, trigger, and specific hook are being + * overriden by Lua. + */ + struct OverrideSelector { + std::string device_name; + std::string trigger_name; + std::string hook_name; + + friend bool operator<(const OverrideSelector& l, + const OverrideSelector& r) { + return std::tie(l.device_name, l.trigger_name, l.hook_name) < + std::tie(r.device_name, r.trigger_name, r.hook_name); + } + }; + + /* Userdata object for tracking the Lua mirror of a TriggerHooks object. */ + class LuaTrigger { + public: + LuaTrigger(LvglInputDriver&, IInputDevice&, TriggerHooks&); + + static auto get(lua_State*, int idx) -> LuaTrigger&; + static auto luaGc(lua_State*) -> int; + static auto luaToString(lua_State*) -> int; + static auto luaNewIndex(lua_State*) -> int; + + static constexpr struct luaL_Reg kFuncs[] = {{"__gc", luaGc}, + {"__tostring", luaToString}, + {"__newindex", luaNewIndex}, + {NULL, NULL}}; + + private: + LvglInputDriver* driver_; + + std::string device_; + std::string trigger_; + std::map hooks_; + }; + + /* A hook override implemented as a lua callback */ + struct LuaOverride { + lua_State* L; + int ref; + }; + + std::map overrides_; + + auto setOverride(lua_State* L, const OverrideSelector&) -> void; + auto applyOverride(const OverrideSelector&, LuaOverride&) -> void; + bool is_locked_; }; diff --git a/src/input/input_hook.cpp b/src/input/input_hook.cpp index 1bb92196..48d6c2a4 100644 --- a/src/input/input_hook.cpp +++ b/src/input/input_hook.cpp @@ -85,23 +85,8 @@ auto TriggerHooks::name() const -> const std::string& { return name_; } -auto TriggerHooks::pushHooks(lua_State* L) -> void { - lua_newtable(L); - - auto add_trigger = [&](Hook& h) { - lua_pushlstring(L, h.name().data(), h.name().size()); - auto cb = h.callback(); - if (cb) { - lua_pushlstring(L, cb->name.data(), cb->name.size()); - } else { - lua_pushnil(L); - } - lua_rawset(L, -3); - }; - - add_trigger(click_); - add_trigger(long_press_); - add_trigger(repeat_); +auto TriggerHooks::hooks() -> std::vector> { + return {click_, long_press_, repeat_}; } } // namespace input diff --git a/src/input/input_nav_buttons.cpp b/src/input/input_nav_buttons.cpp index 7e579a16..522f8d6e 100644 --- a/src/input/input_nav_buttons.cpp +++ b/src/input/input_nav_buttons.cpp @@ -27,7 +27,8 @@ auto NavButtons::name() -> std::string { return "buttons"; } -auto NavButtons::hooks() -> std::vector { +auto NavButtons::triggers() + -> std::vector> { return {up_, down_}; } diff --git a/src/input/input_touch_dpad.cpp b/src/input/input_touch_dpad.cpp index f0805993..d8eff09b 100644 --- a/src/input/input_touch_dpad.cpp +++ b/src/input/input_touch_dpad.cpp @@ -55,7 +55,8 @@ auto TouchDPad::name() -> std::string { return "dpad"; } -auto TouchDPad::hooks() -> std::vector { +auto TouchDPad::triggers() + -> std::vector> { return {centre_, up_, right_, down_, left_}; } diff --git a/src/input/input_touch_wheel.cpp b/src/input/input_touch_wheel.cpp index 121b1ee5..67cab3bf 100644 --- a/src/input/input_touch_wheel.cpp +++ b/src/input/input_touch_wheel.cpp @@ -92,7 +92,8 @@ auto TouchWheel::name() -> std::string { return "wheel"; } -auto TouchWheel::hooks() -> std::vector { +auto TouchWheel::triggers() + -> std::vector> { return {centre_, up_, right_, down_, left_}; } diff --git a/src/input/input_volume_buttons.cpp b/src/input/input_volume_buttons.cpp index 607f81f1..37cf90e5 100644 --- a/src/input/input_volume_buttons.cpp +++ b/src/input/input_volume_buttons.cpp @@ -25,7 +25,8 @@ auto VolumeButtons::name() -> std::string { return "buttons"; } -auto VolumeButtons::hooks() -> std::vector { +auto VolumeButtons::triggers() + -> std::vector> { return {up_, down_}; } diff --git a/src/input/lvgl_input_driver.cpp b/src/input/lvgl_input_driver.cpp index 61a85fa5..a82b7438 100644 --- a/src/input/lvgl_input_driver.cpp +++ b/src/input/lvgl_input_driver.cpp @@ -13,17 +13,22 @@ #include "device_factory.hpp" #include "feedback_haptics.hpp" +#include "input_hook.hpp" #include "input_touch_wheel.hpp" #include "input_trigger.hpp" #include "input_volume_buttons.hpp" #include "lauxlib.h" #include "lua.h" +#include "lua_thread.hpp" #include "lvgl.h" #include "nvs.hpp" #include "property.hpp" [[maybe_unused]] static constexpr char kTag[] = "input"; +static constexpr char kLuaTriggerMetatableName[] = "input_trigger"; +static constexpr char kLuaOverrideText[] = "lua_callback"; + namespace input { static void read_cb(lv_indev_drv_t* drv, lv_indev_data_t* data) { @@ -106,22 +111,148 @@ auto LvglInputDriver::feedback(uint8_t event) -> void { } } +LvglInputDriver::LuaTrigger::LuaTrigger(LvglInputDriver& driver, + IInputDevice& dev, + TriggerHooks& trigger) + : driver_(&driver), device_(dev.name()), trigger_(trigger.name()) { + for (auto& hook : trigger.hooks()) { + auto cb = hook.get().callback(); + if (cb) { + hooks_[hook.get().name()] = hook.get().callback()->name; + } else { + hooks_[hook.get().name()] = ""; + } + } +} + +auto LvglInputDriver::LuaTrigger::get(lua_State* L, int idx) -> LuaTrigger& { + return **reinterpret_cast( + luaL_checkudata(L, idx, kLuaTriggerMetatableName)); +} + +auto LvglInputDriver::LuaTrigger::luaGc(lua_State* L) -> int { + LuaTrigger& trigger = LuaTrigger::get(L, 1); + delete &trigger; + return 0; +} + +auto LvglInputDriver::LuaTrigger::luaToString(lua_State* L) -> int { + LuaTrigger& trigger = LuaTrigger::get(L, 1); + std::stringstream out; + out << "{ "; + for (const auto& hook : trigger.hooks_) { + if (!hook.second.empty()) { + out << hook.first << "=" << hook.second << " "; + } + } + out << "}"; + lua_pushlstring(L, out.str().data(), out.str().size()); + return 1; +} + +auto LvglInputDriver::LuaTrigger::luaNewIndex(lua_State* L) -> int { + LuaTrigger& trigger = LuaTrigger::get(L, 1); + luaL_checktype(L, 3, LUA_TFUNCTION); + + size_t len = 0; + const char* str = luaL_checklstring(L, 2, &len); + if (!str) { + return 0; + } + OverrideSelector selector{ + .device_name = trigger.device_, + .trigger_name = trigger.trigger_, + .hook_name = std::string{str, len}, + }; + for (const auto& hook : trigger.hooks_) { + if (hook.first == selector.hook_name) { + trigger.driver_->setOverride(L, selector); + trigger.hooks_[hook.first] = kLuaOverrideText; + return 0; + } + } + return 0; +} + auto LvglInputDriver::pushHooks(lua_State* L) -> int { + if (luaL_getmetatable(L, kLuaTriggerMetatableName) == LUA_TNIL) { + luaL_newmetatable(L, kLuaTriggerMetatableName); + luaL_setfuncs(L, LuaTrigger::kFuncs, 0); + lua_pop(L, 1); + } + lua_pop(L, 1); + lua_newtable(L); for (auto& dev : inputs_) { lua_pushlstring(L, dev->name().data(), dev->name().size()); lua_newtable(L); - for (auto& hook : dev->hooks()) { - lua_pushlstring(L, hook.name().data(), hook.name().size()); - hook.pushHooks(L); + for (auto& trigger : dev->triggers()) { + lua_pushlstring(L, trigger.get().name().data(), + trigger.get().name().size()); + LuaTrigger** lua_obj = reinterpret_cast( + lua_newuserdatauv(L, sizeof(LuaTrigger*), 0)); + *lua_obj = new LuaTrigger(*this, *dev, trigger); + luaL_setmetatable(L, kLuaTriggerMetatableName); lua_rawset(L, -3); } lua_rawset(L, -3); } + return 1; } +auto LvglInputDriver::setOverride(lua_State* L, + const OverrideSelector& selector) -> void { + if (overrides_.contains(selector)) { + LuaOverride& prev = overrides_[selector]; + luaL_unref(prev.L, LUA_REGISTRYINDEX, prev.ref); + } + + int ref = luaL_ref(L, LUA_REGISTRYINDEX); + LuaOverride override{ + .L = L, + .ref = ref, + }; + overrides_[selector] = override; + applyOverride(selector, override); +} + +auto LvglInputDriver::applyOverride(const OverrideSelector& selector, + LuaOverride& override) -> void { + // In general, this algorithm is a very slow approach. We could do better + // by maintaing maps from [device|trigger|hook]_name to the relevant + // trigger, but in practice I expect maybe like 5 overrides total ever, + // spread across 2 devices with 2 or 5 hooks each. So it's not that big a + // deal. Don't worry about it!! + + // Look for a matching device. + for (auto& device : inputs_) { + if (device->name() != selector.device_name) { + continue; + } + // Look for a matching trigger + for (auto& trigger : device->triggers()) { + if (trigger.get().name() != selector.trigger_name) { + continue; + } + // Look for a matching hook + for (auto& hook : trigger.get().hooks()) { + if (hook.get().name() != selector.hook_name) { + continue; + } + // We found the target! Apply the override. + auto lua_callback = [=](lv_indev_data_t* d) { + lua_rawgeti(override.L, LUA_REGISTRYINDEX, override.ref); + lua::CallProtected(override.L, 0, 0); + }; + hook.get().override( + HookCallback{.name = kLuaOverrideText, .fn = lua_callback}); + } + } + } +} + } // namespace input From 1736f7874b8f651ae42a21f48b6a15d90f30974a Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 29 Apr 2024 13:53:11 +1000 Subject: [PATCH 02/15] Use double-clicks instead of long-presses for wheel shortcuts --- src/input/include/input_hook.hpp | 4 ++- src/input/include/input_trigger.hpp | 7 ++++- src/input/input_hook.cpp | 5 ++++ src/input/input_nav_buttons.cpp | 4 +-- src/input/input_touch_dpad.cpp | 4 +-- src/input/input_touch_wheel.cpp | 13 +++++---- src/input/input_trigger.cpp | 44 ++++++++++++++++++++--------- 7 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/input/include/input_hook.hpp b/src/input/include/input_hook.hpp index a257c04a..a8705210 100644 --- a/src/input/include/input_hook.hpp +++ b/src/input/include/input_hook.hpp @@ -45,9 +45,10 @@ class Hook { class TriggerHooks { public: TriggerHooks(std::string name, std::optional cb) - : TriggerHooks(name, cb, cb, cb) {} + : TriggerHooks(name, cb, cb, cb, cb) {} TriggerHooks(std::string name, std::optional click, + std::optional double_click, std::optional long_press, std::optional repeat); @@ -66,6 +67,7 @@ class TriggerHooks { Trigger trigger_; Hook click_; + Hook double_click_; Hook long_press_; Hook repeat_; }; diff --git a/src/input/include/input_trigger.hpp b/src/input/include/input_trigger.hpp index 599b796b..bcafa8ad 100644 --- a/src/input/include/input_trigger.hpp +++ b/src/input/include/input_trigger.hpp @@ -13,6 +13,7 @@ namespace input { +const uint16_t kDoubleClickDelayMs = 500; const uint16_t kLongPressDelayMs = LV_INDEV_DEF_LONG_PRESS_TIME; const uint16_t kRepeatDelayMs = LV_INDEV_DEF_LONG_PRESS_REP_TIME; @@ -21,6 +22,7 @@ class Trigger { enum class State { kNone, kClick, + kDoubleClick, kLongPress, kRepeatPress, }; @@ -31,7 +33,10 @@ class Trigger { private: std::optional touch_time_ms_; - uint16_t times_fired_; + bool was_pressed_; + + bool was_double_click_; + uint16_t times_long_pressed_; }; } // namespace input diff --git a/src/input/input_hook.cpp b/src/input/input_hook.cpp index 48d6c2a4..bf9f3596 100644 --- a/src/input/input_hook.cpp +++ b/src/input/input_hook.cpp @@ -39,10 +39,12 @@ auto Hook::callback() -> std::optional { TriggerHooks::TriggerHooks(std::string name, std::optional click, + std::optional double_click, std::optional long_press, std::optional repeat) : name_(name), click_("click", click), + double_click_("double_click", double_click), long_press_("long_press", long_press), repeat_("repeat", repeat) {} @@ -51,6 +53,9 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { case Trigger::State::kClick: click_.invoke(d); break; + case Trigger::State::kDoubleClick: + double_click_.invoke(d); + break; case Trigger::State::kLongPress: long_press_.invoke(d); break; diff --git a/src/input/input_nav_buttons.cpp b/src/input/input_nav_buttons.cpp index 522f8d6e..61d80075 100644 --- a/src/input/input_nav_buttons.cpp +++ b/src/input/input_nav_buttons.cpp @@ -15,8 +15,8 @@ namespace input { NavButtons::NavButtons(drivers::IGpios& gpios) : gpios_(gpios), - up_("upper", actions::scrollUp(), actions::select(), {}), - down_("lower", actions::scrollDown(), actions::select(), {}) {} + up_("upper", {}, actions::scrollUp(), actions::select(), {}), + down_("lower", {}, actions::scrollDown(), actions::select(), {}) {} auto NavButtons::read(lv_indev_data_t* data) -> void { up_.update(!gpios_.Get(drivers::IGpios::Pin::kKeyUp), data); diff --git a/src/input/input_touch_dpad.cpp b/src/input/input_touch_dpad.cpp index d8eff09b..df17d766 100644 --- a/src/input/input_touch_dpad.cpp +++ b/src/input/input_touch_dpad.cpp @@ -21,9 +21,9 @@ namespace input { TouchDPad::TouchDPad(drivers::TouchWheel& wheel) : wheel_(wheel), - centre_("centre", actions::select(), {}, {}), + centre_("centre", actions::select(), {}, {}, {}), up_("up", actions::scrollUp()), - right_("right", {}, {}, {}), + right_("right", {}), down_("down", actions::scrollDown()), left_("left", actions::goBack()) {} diff --git a/src/input/input_touch_wheel.cpp b/src/input/input_touch_wheel.cpp index 67cab3bf..41fd73bc 100644 --- a/src/input/input_touch_wheel.cpp +++ b/src/input/input_touch_wheel.cpp @@ -39,11 +39,11 @@ TouchWheel::TouchWheel(drivers::NvsStorage& nvs, drivers::TouchWheel& wheel) threshold_ = calculateThreshold(int_val); return true; }), - centre_("centre", actions::select(), {}, {}), - up_("up", {}, actions::scrollToTop(), actions::scrollUp()), - right_("right", {}, {}, {}), - down_("down", {}, actions::scrollToBottom(), actions::scrollDown()), - left_("left", {}, actions::goBack(), {}), + centre_("centre", actions::select(), {}, {}, {}), + up_("up", {}, actions::scrollToTop(), {}, {}), + right_("right", {}), + down_("down", {}, actions::scrollToBottom(), {}, {}), + left_("left", {}, actions::goBack(), {}, {}), is_scrolling_(false), threshold_(calculateThreshold(nvs.ScrollSensitivity())), is_first_read_(true), @@ -68,7 +68,8 @@ auto TouchWheel::read(lv_indev_data_t* data) -> void { data->enc_diff = 0; } - centre_.update(!is_scrolling_ && wheel_data.is_button_touched, data); + centre_.update(wheel_data.is_button_touched && !wheel_data.is_wheel_touched, + data); // If the user is touching the wheel but not scrolling, then they may be // clicking on one of the wheel's cardinal directions. diff --git a/src/input/input_trigger.cpp b/src/input/input_trigger.cpp index 9485ecb4..00d4a32d 100644 --- a/src/input/input_trigger.cpp +++ b/src/input/input_trigger.cpp @@ -8,34 +8,50 @@ #include #include -#include "esp_log.h" #include "esp_timer.h" namespace input { -Trigger::Trigger() : touch_time_ms_(), times_fired_(0) {} +Trigger::Trigger() + : touch_time_ms_(), + was_pressed_(false), + was_double_click_(false), + times_long_pressed_(0) {} auto Trigger::update(bool is_pressed) -> State { // Bail out early if we're in a steady-state of not pressed. - if (!is_pressed && !touch_time_ms_) { + if (!is_pressed && !was_pressed_) { + was_double_click_ = false; + times_long_pressed_ = 0; return State::kNone; } uint64_t now_ms = esp_timer_get_time() / 1000; - // Initial press of this key: record the current time, and report that we - // haven't triggered yet. - if (is_pressed && !touch_time_ms_) { + // This key wasn't being pressed, but now it is. + if (is_pressed && !was_pressed_) { + // Is this a double click? + if (now_ms - *touch_time_ms_ < kDoubleClickDelayMs) { + // Don't update touch_time_ms_, since we don't want triple clicks to + // register as double clicks. + was_double_click_ = true; + was_pressed_ = true; + return State::kDoubleClick; + } + // Not a double click; update our accounting info and wait for the next + // call. touch_time_ms_ = now_ms; - times_fired_ = 0; + was_double_click_ = false; + times_long_pressed_ = 0; + was_pressed_ = true; return State::kNone; } // The key was released. If there were no long-press events fired during the // press, then this was a standard click. - if (!is_pressed && touch_time_ms_) { - touch_time_ms_.reset(); - if (times_fired_ == 0) { + if (!is_pressed && was_pressed_) { + was_pressed_ = false; + if (!was_double_click_ && times_long_pressed_ == 0) { return State::kClick; } else { return State::kNone; @@ -43,10 +59,10 @@ auto Trigger::update(bool is_pressed) -> State { } // Now the more complicated case: the user is continuing to press the button. - if (times_fired_ == 0) { + if (times_long_pressed_ == 0) { // We haven't fired yet, so we wait for the long-press event. if (now_ms - *touch_time_ms_ >= kLongPressDelayMs) { - times_fired_++; + times_long_pressed_++; return State::kLongPress; } } else { @@ -60,8 +76,8 @@ auto Trigger::update(bool is_pressed) -> State { // kRepeatDelayMs since the long-press event. uint16_t expected_times_fired = 1 + (time_since_long_press / kRepeatDelayMs); - if (times_fired_ < expected_times_fired) { - times_fired_++; + if (times_long_pressed_ < expected_times_fired) { + times_long_pressed_++; return State::kRepeatPress; } } From f852e447159757a92564327c6b114f929200b3a0 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 29 Apr 2024 13:54:32 +1000 Subject: [PATCH 03/15] version bump --- tools/cmake/common.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cmake/common.cmake b/tools/cmake/common.cmake index 896dabf3..c7137694 100644 --- a/tools/cmake/common.cmake +++ b/tools/cmake/common.cmake @@ -5,7 +5,7 @@ # For more information about build system see # https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html -set(PROJECT_VER "0.8.3") +set(PROJECT_VER "0.9.0") # esp-idf sets the C++ standard weird. Set cmake vars to match. set(CMAKE_CXX_STANDARD 23) From a231fd1c8afedbeb14b0bc77d76bad61db986059 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 17:06:25 +1000 Subject: [PATCH 04/15] Replace cpp::span shim with std::span --- .reuse/dep5 | 4 - lib/span/CMakeLists.txt | 5 - lib/span/LICENSE.txt | 23 - lib/span/include/span.hpp | 618 ------------------------- lua/licenses.lua | 13 - src/audio/CMakeLists.txt | 2 +- src/audio/audio_converter.cpp | 8 +- src/audio/audio_decoder.cpp | 3 +- src/audio/audio_source.cpp | 2 +- src/audio/fatfs_audio_input.cpp | 8 +- src/audio/fatfs_source.cpp | 2 +- src/audio/include/audio_converter.hpp | 12 +- src/audio/include/audio_decoder.hpp | 2 +- src/audio/include/audio_source.hpp | 2 +- src/audio/include/fatfs_source.hpp | 2 +- src/audio/include/readahead_source.hpp | 2 +- src/audio/include/resample.hpp | 8 +- src/audio/readahead_source.cpp | 2 +- src/audio/resample.cpp | 4 +- src/codecs/CMakeLists.txt | 2 +- src/codecs/dr_flac.cpp | 2 +- src/codecs/include/codec.hpp | 13 +- src/codecs/include/dr_flac.hpp | 8 +- src/codecs/include/mad.hpp | 4 +- src/codecs/include/opus.hpp | 6 +- src/codecs/include/source_buffer.hpp | 9 +- src/codecs/include/vorbis.hpp | 6 +- src/codecs/include/wav.hpp | 2 +- src/codecs/mad.cpp | 10 +- src/codecs/opus.cpp | 2 +- src/codecs/source_buffer.cpp | 6 +- src/codecs/test/test_mad.cpp | 6 +- src/codecs/vorbis.cpp | 2 +- src/codecs/wav.cpp | 59 +-- src/database/CMakeLists.txt | 2 +- src/database/include/records.hpp | 2 +- src/database/include/track.hpp | 9 +- src/database/index.cpp | 10 +- src/database/records.cpp | 2 +- src/database/track.cpp | 8 +- src/drivers/CMakeLists.txt | 2 +- src/drivers/i2s_dac.cpp | 2 +- src/drivers/include/i2s_dac.hpp | 4 +- src/locale/CMakeLists.txt | 2 +- src/locale/include/collation.hpp | 2 +- src/lua/property.cpp | 2 +- src/memory/include/himem.hpp | 6 +- src/tasks/CMakeLists.txt | 2 +- src/tasks/tasks.cpp | 10 +- src/tasks/tasks.hpp | 8 +- src/util/CMakeLists.txt | 2 +- src/util/include/debug.hpp | 5 +- tools/cmake/common.cmake | 1 - 53 files changed, 137 insertions(+), 803 deletions(-) delete mode 100644 lib/span/CMakeLists.txt delete mode 100644 lib/span/LICENSE.txt delete mode 100644 lib/span/include/span.hpp diff --git a/.reuse/dep5 b/.reuse/dep5 index 71ca581e..615c30c4 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -66,10 +66,6 @@ Files: lib/result/include/* Copyright: 2017-2021 Matthew Rodusek License: MIT -Files: lib/span/include/* -Copyright: 2018 Tristan Brindle -License: BSL-1.0 - Files: lib/speexdsp/* Copyright: 2002-2008 Xiph.org Foundation 2002-2008 Jean-Marc Valin diff --git a/lib/span/CMakeLists.txt b/lib/span/CMakeLists.txt deleted file mode 100644 index 57871f57..00000000 --- a/lib/span/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register(INCLUDE_DIRS "include") diff --git a/lib/span/LICENSE.txt b/lib/span/LICENSE.txt deleted file mode 100644 index 36b7cd93..00000000 --- a/lib/span/LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/lib/span/include/span.hpp b/lib/span/include/span.hpp deleted file mode 100644 index fdc3a988..00000000 --- a/lib/span/include/span.hpp +++ /dev/null @@ -1,618 +0,0 @@ - -/* -This is an implementation of C++20's std::span -http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4820.pdf -*/ - -// Copyright Tristan Brindle 2018. -// Distributed under the Boost Software License, Version 1.0. -// (See accompanying file ../../LICENSE_1_0.txt or copy at -// https://www.boost.org/LICENSE_1_0.txt) - -#ifndef TCB_SPAN_HPP_INCLUDED -#define TCB_SPAN_HPP_INCLUDED - -#include -#include -#include -#include - -#ifndef TCB_SPAN_NO_EXCEPTIONS -// Attempt to discover whether we're being compiled with exception support -#if !(defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) -#define TCB_SPAN_NO_EXCEPTIONS -#endif -#endif - -#ifndef TCB_SPAN_NO_EXCEPTIONS -#include -#include -#endif - -// Various feature test macros - -#ifndef TCB_SPAN_NAMESPACE_NAME -#define TCB_SPAN_NAMESPACE_NAME tcb -#endif - -#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) -#define TCB_SPAN_HAVE_CPP17 -#endif - -#if __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) -#define TCB_SPAN_HAVE_CPP14 -#endif - -namespace TCB_SPAN_NAMESPACE_NAME { - -// Establish default contract checking behavior -#if !defined(TCB_SPAN_THROW_ON_CONTRACT_VIOLATION) && \ - !defined(TCB_SPAN_TERMINATE_ON_CONTRACT_VIOLATION) && \ - !defined(TCB_SPAN_NO_CONTRACT_CHECKING) -#if defined(NDEBUG) || !defined(TCB_SPAN_HAVE_CPP14) -#define TCB_SPAN_NO_CONTRACT_CHECKING -#else -#define TCB_SPAN_TERMINATE_ON_CONTRACT_VIOLATION -#endif -#endif - -#if defined(TCB_SPAN_THROW_ON_CONTRACT_VIOLATION) -struct contract_violation_error : std::logic_error { - explicit contract_violation_error(const char* msg) : std::logic_error(msg) - {} -}; - -inline void contract_violation(const char* msg) -{ - throw contract_violation_error(msg); -} - -#elif defined(TCB_SPAN_TERMINATE_ON_CONTRACT_VIOLATION) -[[noreturn]] inline void contract_violation(const char* /*unused*/) -{ - std::terminate(); -} -#endif - -#if !defined(TCB_SPAN_NO_CONTRACT_CHECKING) -#define TCB_SPAN_STRINGIFY(cond) #cond -#define TCB_SPAN_EXPECT(cond) \ - cond ? (void) 0 : contract_violation("Expected " TCB_SPAN_STRINGIFY(cond)) -#else -#define TCB_SPAN_EXPECT(cond) -#endif - -#if defined(TCB_SPAN_HAVE_CPP17) || defined(__cpp_inline_variables) -#define TCB_SPAN_INLINE_VAR inline -#else -#define TCB_SPAN_INLINE_VAR -#endif - -#if defined(TCB_SPAN_HAVE_CPP14) || \ - (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) -#define TCB_SPAN_HAVE_CPP14_CONSTEXPR -#endif - -#if defined(TCB_SPAN_HAVE_CPP14_CONSTEXPR) -#define TCB_SPAN_CONSTEXPR14 constexpr -#else -#define TCB_SPAN_CONSTEXPR14 -#endif - -#if defined(TCB_SPAN_HAVE_CPP14_CONSTEXPR) && \ - (!defined(_MSC_VER) || _MSC_VER > 1900) -#define TCB_SPAN_CONSTEXPR_ASSIGN constexpr -#else -#define TCB_SPAN_CONSTEXPR_ASSIGN -#endif - -#if defined(TCB_SPAN_NO_CONTRACT_CHECKING) -#define TCB_SPAN_CONSTEXPR11 constexpr -#else -#define TCB_SPAN_CONSTEXPR11 TCB_SPAN_CONSTEXPR14 -#endif - -#if defined(TCB_SPAN_HAVE_CPP17) || defined(__cpp_deduction_guides) -#define TCB_SPAN_HAVE_DEDUCTION_GUIDES -#endif - -#if defined(TCB_SPAN_HAVE_CPP17) || defined(__cpp_lib_byte) -#define TCB_SPAN_HAVE_STD_BYTE -#endif - -#if defined(TCB_SPAN_HAVE_CPP17) || defined(__cpp_lib_array_constexpr) -#define TCB_SPAN_HAVE_CONSTEXPR_STD_ARRAY_ETC -#endif - -#if defined(TCB_SPAN_HAVE_CONSTEXPR_STD_ARRAY_ETC) -#define TCB_SPAN_ARRAY_CONSTEXPR constexpr -#else -#define TCB_SPAN_ARRAY_CONSTEXPR -#endif - -#ifdef TCB_SPAN_HAVE_STD_BYTE -using byte = std::byte; -#else -using byte = unsigned char; -#endif - -#if defined(TCB_SPAN_HAVE_CPP17) -#define TCB_SPAN_NODISCARD [[nodiscard]] -#else -#define TCB_SPAN_NODISCARD -#endif - -TCB_SPAN_INLINE_VAR constexpr std::size_t dynamic_extent = SIZE_MAX; - -template -class span; - -namespace detail { - -template -struct span_storage { - constexpr span_storage() noexcept = default; - - constexpr span_storage(E* p_ptr, std::size_t /*unused*/) noexcept - : ptr(p_ptr) - {} - - E* ptr = nullptr; - static constexpr std::size_t size = S; -}; - -template -struct span_storage { - constexpr span_storage() noexcept = default; - - constexpr span_storage(E* p_ptr, std::size_t p_size) noexcept - : ptr(p_ptr), size(p_size) - {} - - E* ptr = nullptr; - std::size_t size = 0; -}; - -// Reimplementation of C++17 std::size() and std::data() -#if defined(TCB_SPAN_HAVE_CPP17) || \ - defined(__cpp_lib_nonmember_container_access) -using std::data; -using std::size; -#else -template -constexpr auto size(const C& c) -> decltype(c.size()) -{ - return c.size(); -} - -template -constexpr std::size_t size(const T (&)[N]) noexcept -{ - return N; -} - -template -constexpr auto data(C& c) -> decltype(c.data()) -{ - return c.data(); -} - -template -constexpr auto data(const C& c) -> decltype(c.data()) -{ - return c.data(); -} - -template -constexpr T* data(T (&array)[N]) noexcept -{ - return array; -} - -template -constexpr const E* data(std::initializer_list il) noexcept -{ - return il.begin(); -} -#endif // TCB_SPAN_HAVE_CPP17 - -#if defined(TCB_SPAN_HAVE_CPP17) || defined(__cpp_lib_void_t) -using std::void_t; -#else -template -using void_t = void; -#endif - -template -using uncvref_t = - typename std::remove_cv::type>::type; - -template -struct is_span : std::false_type {}; - -template -struct is_span> : std::true_type {}; - -template -struct is_std_array : std::false_type {}; - -template -struct is_std_array> : std::true_type {}; - -template -struct has_size_and_data : std::false_type {}; - -template -struct has_size_and_data())), - decltype(detail::data(std::declval()))>> - : std::true_type {}; - -template > -struct is_container { - static constexpr bool value = - !is_span::value && !is_std_array::value && - !std::is_array::value && has_size_and_data::value; -}; - -template -using remove_pointer_t = typename std::remove_pointer::type; - -template -struct is_container_element_type_compatible : std::false_type {}; - -template -struct is_container_element_type_compatible< - T, E, - typename std::enable_if< - !std::is_same< - typename std::remove_cv()))>::type, - void>::value && - std::is_convertible< - remove_pointer_t()))> (*)[], - E (*)[]>::value - >::type> - : std::true_type {}; - -template -struct is_complete : std::false_type {}; - -template -struct is_complete : std::true_type {}; - -} // namespace detail - -template -class span { - static_assert(std::is_object::value, - "A span's ElementType must be an object type (not a " - "reference type or void)"); - static_assert(detail::is_complete::value, - "A span's ElementType must be a complete type (not a forward " - "declaration)"); - static_assert(!std::is_abstract::value, - "A span's ElementType cannot be an abstract class type"); - - using storage_type = detail::span_storage; - -public: - // constants and types - using element_type = ElementType; - using value_type = typename std::remove_cv::type; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; - using pointer = element_type*; - using const_pointer = const element_type*; - using reference = element_type&; - using const_reference = const element_type&; - using iterator = pointer; - using reverse_iterator = std::reverse_iterator; - - static constexpr size_type extent = Extent; - - // [span.cons], span constructors, copy, assignment, and destructor - template < - std::size_t E = Extent, - typename std::enable_if<(E == dynamic_extent || E <= 0), int>::type = 0> - constexpr span() noexcept - {} - - TCB_SPAN_CONSTEXPR11 span(pointer ptr, size_type count) - : storage_(ptr, count) - { - TCB_SPAN_EXPECT(extent == dynamic_extent || count == extent); - } - - TCB_SPAN_CONSTEXPR11 span(pointer first_elem, pointer last_elem) - : storage_(first_elem, last_elem - first_elem) - { - TCB_SPAN_EXPECT(extent == dynamic_extent || - last_elem - first_elem == - static_cast(extent)); - } - - template ::value, - int>::type = 0> - constexpr span(element_type (&arr)[N]) noexcept : storage_(arr, N) - {} - - template &, ElementType>::value, - int>::type = 0> - TCB_SPAN_ARRAY_CONSTEXPR span(std::array& arr) noexcept - : storage_(arr.data(), N) - {} - - template &, ElementType>::value, - int>::type = 0> - TCB_SPAN_ARRAY_CONSTEXPR span(const std::array& arr) noexcept - : storage_(arr.data(), N) - {} - - template < - typename Container, std::size_t E = Extent, - typename std::enable_if< - E == dynamic_extent && detail::is_container::value && - detail::is_container_element_type_compatible< - Container&, ElementType>::value, - int>::type = 0> - constexpr span(Container& cont) - : storage_(detail::data(cont), detail::size(cont)) - {} - - template < - typename Container, std::size_t E = Extent, - typename std::enable_if< - E == dynamic_extent && detail::is_container::value && - detail::is_container_element_type_compatible< - const Container&, ElementType>::value, - int>::type = 0> - constexpr span(const Container& cont) - : storage_(detail::data(cont), detail::size(cont)) - {} - - constexpr span(const span& other) noexcept = default; - - template ::value, - int>::type = 0> - constexpr span(const span& other) noexcept - : storage_(other.data(), other.size()) - {} - - ~span() noexcept = default; - - TCB_SPAN_CONSTEXPR_ASSIGN span& - operator=(const span& other) noexcept = default; - - // [span.sub], span subviews - template - TCB_SPAN_CONSTEXPR11 span first() const - { - TCB_SPAN_EXPECT(Count <= size()); - return {data(), Count}; - } - - template - TCB_SPAN_CONSTEXPR11 span last() const - { - TCB_SPAN_EXPECT(Count <= size()); - return {data() + (size() - Count), Count}; - } - - template - using subspan_return_t = - span; - - template - TCB_SPAN_CONSTEXPR11 subspan_return_t subspan() const - { - TCB_SPAN_EXPECT(Offset <= size() && - (Count == dynamic_extent || Offset + Count <= size())); - return {data() + Offset, - Count != dynamic_extent ? Count : size() - Offset}; - } - - TCB_SPAN_CONSTEXPR11 span - first(size_type count) const - { - TCB_SPAN_EXPECT(count <= size()); - return {data(), count}; - } - - TCB_SPAN_CONSTEXPR11 span - last(size_type count) const - { - TCB_SPAN_EXPECT(count <= size()); - return {data() + (size() - count), count}; - } - - TCB_SPAN_CONSTEXPR11 span - subspan(size_type offset, size_type count = dynamic_extent) const - { - TCB_SPAN_EXPECT(offset <= size() && - (count == dynamic_extent || offset + count <= size())); - return {data() + offset, - count == dynamic_extent ? size() - offset : count}; - } - - // [span.obs], span observers - constexpr size_type size() const noexcept { return storage_.size; } - - constexpr size_type size_bytes() const noexcept - { - return size() * sizeof(element_type); - } - - TCB_SPAN_NODISCARD constexpr bool empty() const noexcept - { - return size() == 0; - } - - // [span.elem], span element access - TCB_SPAN_CONSTEXPR11 reference operator[](size_type idx) const - { - TCB_SPAN_EXPECT(idx < size()); - return *(data() + idx); - } - - TCB_SPAN_CONSTEXPR11 reference front() const - { - TCB_SPAN_EXPECT(!empty()); - return *data(); - } - - TCB_SPAN_CONSTEXPR11 reference back() const - { - TCB_SPAN_EXPECT(!empty()); - return *(data() + (size() - 1)); - } - - constexpr pointer data() const noexcept { return storage_.ptr; } - - // [span.iterators], span iterator support - constexpr iterator begin() const noexcept { return data(); } - - constexpr iterator end() const noexcept { return data() + size(); } - - TCB_SPAN_ARRAY_CONSTEXPR reverse_iterator rbegin() const noexcept - { - return reverse_iterator(end()); - } - - TCB_SPAN_ARRAY_CONSTEXPR reverse_iterator rend() const noexcept - { - return reverse_iterator(begin()); - } - -private: - storage_type storage_{}; -}; - -#ifdef TCB_SPAN_HAVE_DEDUCTION_GUIDES - -/* Deduction Guides */ -template -span(T (&)[N])->span; - -template -span(std::array&)->span; - -template -span(const std::array&)->span; - -template -span(Container&)->span()))>::type>; - -template -span(const Container&)->span; - -#endif // TCB_HAVE_DEDUCTION_GUIDES - -template -constexpr span -make_span(span s) noexcept -{ - return s; -} - -template -constexpr span make_span(T (&arr)[N]) noexcept -{ - return {arr}; -} - -template -TCB_SPAN_ARRAY_CONSTEXPR span make_span(std::array& arr) noexcept -{ - return {arr}; -} - -template -TCB_SPAN_ARRAY_CONSTEXPR span -make_span(const std::array& arr) noexcept -{ - return {arr}; -} - -template -constexpr span()))>::type> -make_span(Container& cont) -{ - return {cont}; -} - -template -constexpr span -make_span(const Container& cont) -{ - return {cont}; -} - -template -span -as_bytes(span s) noexcept -{ - return {reinterpret_cast(s.data()), s.size_bytes()}; -} - -template < - class ElementType, size_t Extent, - typename std::enable_if::value, int>::type = 0> -span -as_writable_bytes(span s) noexcept -{ - return {reinterpret_cast(s.data()), s.size_bytes()}; -} - -template -constexpr auto get(span s) -> decltype(s[N]) -{ - return s[N]; -} - -} // namespace TCB_SPAN_NAMESPACE_NAME - -namespace std { - -template -class tuple_size> - : public integral_constant {}; - -template -class tuple_size>; // not defined - -template -class tuple_element> { -public: - static_assert(Extent != TCB_SPAN_NAMESPACE_NAME::dynamic_extent && - I < Extent, - ""); - using type = ElementType; -}; - -} // end namespace std - -#endif // TCB_SPAN_HPP_INCLUDED diff --git a/lua/licenses.lua b/lua/licenses.lua index 8d5813c4..b8c71f36 100644 --- a/lua/licenses.lua +++ b/lua/licenses.lua @@ -63,16 +63,6 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.]]) end -local function boost(copyright) - show_license(copyright .. [[ - -Boost Software License - Version 1.0 - August 17th, 2003 -Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: -The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.]]) -end - - return function(self) local container = self.root:Object { flex = { @@ -159,9 +149,6 @@ return function(self) library("result", "MIT", function() mit("Copyright (c) 2017-2021 Matthew Rodusek") end) - library("span", "Boost", function() - boost("Copyright Tristan Brindle 2018") - end) library("speexdsp", "bsd", function() xiphbsd( "Copyright 2002-2008 Xiph.org Foundation, Copyright 2002-2008 Jean-Marc Valin, Copyright 2005-2007 Analog Devices Inc., Copyright 2005-2008 Commonwealth Scientific and Industrial Research, Organisation (CSIRO), Copyright 1993, 2002, 2006 David Rowe, Copyright 2003 EpicGames, Copyright 1992-1994 Jutta Degener, Carsten Bormann") diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt index 8ed5efbb..635320f4 100644 --- a/src/audio/CMakeLists.txt +++ b/src/audio/CMakeLists.txt @@ -8,7 +8,7 @@ idf_component_register( "fatfs_source.cpp" "bt_audio_output.cpp" "readahead_source.cpp" "audio_source.cpp" INCLUDE_DIRS "include" - REQUIRES "codecs" "drivers" "cbor" "result" "tasks" "span" "memory" "tinyfsm" + REQUIRES "codecs" "drivers" "cbor" "result" "tasks" "memory" "tinyfsm" "database" "system_fsm" "speexdsp" "millershuffle" "libcppbor") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/audio/audio_converter.cpp b/src/audio/audio_converter.cpp index eb1cde80..d2edb0b3 100644 --- a/src/audio/audio_converter.cpp +++ b/src/audio/audio_converter.cpp @@ -76,7 +76,7 @@ auto SampleConverter::beginStream(std::shared_ptr track) -> void { xQueueSend(commands_, &args, portMAX_DELAY); } -auto SampleConverter::continueStream(cpp::span input) -> void { +auto SampleConverter::continueStream(std::span input) -> void { Args args{ .track = nullptr, .samples_available = input.size(), @@ -182,7 +182,7 @@ auto SampleConverter::handleContinueStream(size_t samples_available) -> void { } } -auto SampleConverter::handleSamples(cpp::span input) -> size_t { +auto SampleConverter::handleSamples(std::span input) -> size_t { if (source_format_ == target_format_) { // The happiest possible case: the input format matches the output // format already. @@ -192,7 +192,7 @@ auto SampleConverter::handleSamples(cpp::span input) -> size_t { size_t samples_used = 0; while (samples_used < input.size()) { - cpp::span output_source; + std::span output_source; if (source_format_.sample_rate != target_format_.sample_rate) { if (resampler_ == nullptr) { ESP_LOGI(kTag, "creating new resampler for %lu -> %lu", @@ -245,7 +245,7 @@ auto SampleConverter::handleEndStream() -> void { events::Audio().Dispatch(internal::StreamEnded{}); } -auto SampleConverter::sendToSink(cpp::span samples) -> void { +auto SampleConverter::sendToSink(std::span samples) -> void { // Update the number of samples sunk so far *before* actually sinking them, // since writing to the stream buffer will block when the buffer gets full. samples_sunk_ += samples.size(); diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp index 90c69c16..baf17e7a 100644 --- a/src/audio/audio_decoder.cpp +++ b/src/audio/audio_decoder.cpp @@ -5,7 +5,6 @@ */ #include "audio_decoder.hpp" -#include #include #include @@ -17,6 +16,7 @@ #include #include #include +#include #include #include "cbor.h" @@ -28,7 +28,6 @@ #include "freertos/queue.h" #include "freertos/ringbuf.h" #include "i2s_dac.hpp" -#include "span.hpp" #include "audio_converter.hpp" #include "audio_events.hpp" diff --git a/src/audio/audio_source.cpp b/src/audio/audio_source.cpp index d9e8e04a..ee2f617f 100644 --- a/src/audio/audio_source.cpp +++ b/src/audio/audio_source.cpp @@ -20,7 +20,7 @@ auto TaggedStream::tags() -> std::shared_ptr { return tags_; } -auto TaggedStream::Read(cpp::span dest) -> ssize_t { +auto TaggedStream::Read(std::span dest) -> ssize_t { return wrapped_->Read(dest); } diff --git a/src/audio/fatfs_audio_input.cpp b/src/audio/fatfs_audio_input.cpp index 29d32390..e5fb3b21 100644 --- a/src/audio/fatfs_audio_input.cpp +++ b/src/audio/fatfs_audio_input.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -23,7 +24,6 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "readahead_source.hpp" -#include "span.hpp" #include "audio_events.hpp" #include "audio_fsm.hpp" @@ -61,7 +61,8 @@ auto FatfsAudioInput::SetPath(std::optional path) -> void { } } -auto FatfsAudioInput::SetPath(const std::string& path,uint32_t offset) -> void { +auto FatfsAudioInput::SetPath(const std::string& path, uint32_t offset) + -> void { std::lock_guard guard{new_stream_mutex_}; if (OpenFile(path, offset)) { has_new_stream_ = true; @@ -102,7 +103,8 @@ auto FatfsAudioInput::NextStream() -> std::shared_ptr { } } -auto FatfsAudioInput::OpenFile(const std::string& path,uint32_t offset) -> bool { +auto FatfsAudioInput::OpenFile(const std::string& path, uint32_t offset) + -> bool { ESP_LOGI(kTag, "opening file %s", path.c_str()); auto tags = tag_parser_.ReadAndParseTags(path); diff --git a/src/audio/fatfs_source.cpp b/src/audio/fatfs_source.cpp index 72c3940d..dccdd581 100644 --- a/src/audio/fatfs_source.cpp +++ b/src/audio/fatfs_source.cpp @@ -33,7 +33,7 @@ FatfsSource::~FatfsSource() { f_close(file_.get()); } -auto FatfsSource::Read(cpp::span dest) -> ssize_t { +auto FatfsSource::Read(std::span dest) -> ssize_t { auto lock = drivers::acquire_spi(); if (f_eof(file_.get())) { return 0; diff --git a/src/audio/include/audio_converter.hpp b/src/audio/include/audio_converter.hpp index 232b5d8e..163c6836 100644 --- a/src/audio/include/audio_converter.hpp +++ b/src/audio/include/audio_converter.hpp @@ -33,7 +33,7 @@ class SampleConverter { auto SetOutput(std::shared_ptr) -> void; auto beginStream(std::shared_ptr) -> void; - auto continueStream(cpp::span) -> void; + auto continueStream(std::span) -> void; auto endStream() -> void; private: @@ -43,9 +43,9 @@ class SampleConverter { auto handleContinueStream(size_t samples_available) -> void; auto handleEndStream() -> void; - auto handleSamples(cpp::span) -> size_t; + auto handleSamples(std::span) -> size_t; - auto sendToSink(cpp::span) -> void; + auto sendToSink(std::span) -> void; struct Args { std::shared_ptr* track; @@ -57,10 +57,10 @@ class SampleConverter { std::unique_ptr resampler_; StreamBufferHandle_t source_; - cpp::span input_buffer_; - cpp::span input_buffer_as_bytes_; + std::span input_buffer_; + std::span input_buffer_as_bytes_; - cpp::span resampled_buffer_; + std::span resampled_buffer_; std::shared_ptr sink_; IAudioOutput::Format source_format_; diff --git a/src/audio/include/audio_decoder.hpp b/src/audio/include/audio_decoder.hpp index 89f0f43c..8e955f74 100644 --- a/src/audio/include/audio_decoder.hpp +++ b/src/audio/include/audio_decoder.hpp @@ -50,7 +50,7 @@ class Decoder { std::optional current_format_; std::optional current_sink_format_; - cpp::span codec_buffer_; + std::span codec_buffer_; }; } // namespace audio diff --git a/src/audio/include/audio_source.hpp b/src/audio/include/audio_source.hpp index b38acd7a..f6a34300 100644 --- a/src/audio/include/audio_source.hpp +++ b/src/audio/include/audio_source.hpp @@ -23,7 +23,7 @@ class TaggedStream : public codecs::IStream { auto tags() -> std::shared_ptr; - auto Read(cpp::span dest) -> ssize_t override; + auto Read(std::span dest) -> ssize_t override; auto CanSeek() -> bool override; diff --git a/src/audio/include/fatfs_source.hpp b/src/audio/include/fatfs_source.hpp index 45ab34c6..ce9b4db8 100644 --- a/src/audio/include/fatfs_source.hpp +++ b/src/audio/include/fatfs_source.hpp @@ -26,7 +26,7 @@ class FatfsSource : public codecs::IStream { FatfsSource(codecs::StreamType, std::unique_ptr file); ~FatfsSource(); - auto Read(cpp::span dest) -> ssize_t override; + auto Read(std::span dest) -> ssize_t override; auto CanSeek() -> bool override; diff --git a/src/audio/include/readahead_source.hpp b/src/audio/include/readahead_source.hpp index 3e18a989..74a30e1b 100644 --- a/src/audio/include/readahead_source.hpp +++ b/src/audio/include/readahead_source.hpp @@ -30,7 +30,7 @@ class ReadaheadSource : public codecs::IStream { ReadaheadSource(tasks::WorkerPool&, std::unique_ptr); ~ReadaheadSource(); - auto Read(cpp::span dest) -> ssize_t override; + auto Read(std::span dest) -> ssize_t override; auto CanSeek() -> bool override; diff --git a/src/audio/include/resample.hpp b/src/audio/include/resample.hpp index a9464cb1..4d48d47f 100644 --- a/src/audio/include/resample.hpp +++ b/src/audio/include/resample.hpp @@ -7,9 +7,9 @@ #pragma once #include +#include #include -#include "span.hpp" #include "speex/speex_resampler.h" #include "sample.hpp" @@ -24,8 +24,8 @@ class Resampler { ~Resampler(); - auto Process(cpp::span input, - cpp::span output, + auto Process(std::span input, + std::span output, bool end_of_data) -> std::pair; private: @@ -34,4 +34,4 @@ class Resampler { uint8_t num_channels_; }; -} // namespace audio \ No newline at end of file +} // namespace audio diff --git a/src/audio/readahead_source.cpp b/src/audio/readahead_source.cpp index fe7ac3bd..6276907a 100644 --- a/src/audio/readahead_source.cpp +++ b/src/audio/readahead_source.cpp @@ -41,7 +41,7 @@ ReadaheadSource::~ReadaheadSource() { vStreamBufferDeleteWithCaps(buffer_); } -auto ReadaheadSource::Read(cpp::span dest) -> ssize_t { +auto ReadaheadSource::Read(std::span dest) -> ssize_t { size_t bytes_written = 0; // Fill the destination from our buffer, until either the buffer is drained // or the destination is full. diff --git a/src/audio/resample.cpp b/src/audio/resample.cpp index a3a34ee7..1e20392b 100644 --- a/src/audio/resample.cpp +++ b/src/audio/resample.cpp @@ -38,8 +38,8 @@ Resampler::~Resampler() { speex_resampler_destroy(resampler_); } -auto Resampler::Process(cpp::span input, - cpp::span output, +auto Resampler::Process(std::span input, + std::span output, bool end_of_data) -> std::pair { uint32_t samples_used = input.size() / num_channels_; uint32_t samples_produced = output.size() / num_channels_; diff --git a/src/codecs/CMakeLists.txt b/src/codecs/CMakeLists.txt index b6481bd1..a1221adf 100644 --- a/src/codecs/CMakeLists.txt +++ b/src/codecs/CMakeLists.txt @@ -6,7 +6,7 @@ idf_component_register( SRCS "dr_flac.cpp" "codec.cpp" "mad.cpp" "opus.cpp" "vorbis.cpp" "source_buffer.cpp" "sample.cpp" "wav.cpp" INCLUDE_DIRS "include" - REQUIRES "result" "span" "libmad" "drflac" "tremor" "opusfile" "memory" "util" + REQUIRES "result" "libmad" "drflac" "tremor" "opusfile" "memory" "util" "komihash") target_compile_options("${COMPONENT_LIB}" PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/codecs/dr_flac.cpp b/src/codecs/dr_flac.cpp index 2f9acf8c..9341e938 100644 --- a/src/codecs/dr_flac.cpp +++ b/src/codecs/dr_flac.cpp @@ -100,7 +100,7 @@ auto DrFlacDecoder::OpenStream(std::shared_ptr input, uint32_t offset) return format; } -auto DrFlacDecoder::DecodeTo(cpp::span output) +auto DrFlacDecoder::DecodeTo(std::span output) -> cpp::result { size_t frames_to_read = output.size() / flac_->channels / 2; diff --git a/src/codecs/include/codec.hpp b/src/codecs/include/codec.hpp index e48e3c58..4d588a98 100644 --- a/src/codecs/include/codec.hpp +++ b/src/codecs/include/codec.hpp @@ -6,19 +6,16 @@ #pragma once -#include -#include - #include #include #include #include +#include #include #include #include "result.hpp" #include "sample.hpp" -#include "span.hpp" #include "types.hpp" #include "memory_resource.hpp" @@ -35,7 +32,7 @@ class IStream { auto type() -> StreamType { return t_; } - virtual auto Read(cpp::span dest) -> ssize_t = 0; + virtual auto Read(std::span dest) -> ssize_t = 0; virtual auto CanSeek() -> bool = 0; @@ -54,7 +51,7 @@ class IStream { /* * Called by codecs to indicate that they've finished parsing any header data * within this stream, and are about to begin decoding. - * + * * Currently used as a hint to the readahead stream to begin prefetching file * data. */ @@ -117,7 +114,7 @@ class ICodec { * Decodes metadata or headers from the given input stream, and returns the * format for the samples that will be decoded from it. */ - virtual auto OpenStream(std::shared_ptr input,uint32_t offset) + virtual auto OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result = 0; struct OutputInfo { @@ -128,7 +125,7 @@ class ICodec { /* * Writes PCM samples to the given output buffer. */ - virtual auto DecodeTo(cpp::span destination) + virtual auto DecodeTo(std::span destination) -> cpp::result = 0; }; diff --git a/src/codecs/include/dr_flac.hpp b/src/codecs/include/dr_flac.hpp index 547876f4..ac46e92f 100644 --- a/src/codecs/include/dr_flac.hpp +++ b/src/codecs/include/dr_flac.hpp @@ -10,13 +10,13 @@ #include #include #include +#include #include #include #include "dr_flac.h" #include "sample.hpp" #include "source_buffer.hpp" -#include "span.hpp" #include "codec.hpp" @@ -27,10 +27,10 @@ class DrFlacDecoder : public ICodec { DrFlacDecoder(); ~DrFlacDecoder(); - auto OpenStream(std::shared_ptr input,uint32_t offset) + auto OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result override; - auto DecodeTo(cpp::span destination) + auto DecodeTo(std::span destination) -> cpp::result override; DrFlacDecoder(const DrFlacDecoder&) = delete; @@ -38,7 +38,7 @@ class DrFlacDecoder : public ICodec { private: std::shared_ptr input_; - drflac *flac_; + drflac* flac_; }; } // namespace codecs diff --git a/src/codecs/include/mad.hpp b/src/codecs/include/mad.hpp index ead0b2a2..d1d0aac5 100644 --- a/src/codecs/include/mad.hpp +++ b/src/codecs/include/mad.hpp @@ -11,11 +11,11 @@ #include #include #include +#include #include "mad.h" #include "sample.hpp" #include "source_buffer.hpp" -#include "span.hpp" #include "codec.hpp" @@ -29,7 +29,7 @@ class MadMp3Decoder : public ICodec { auto OpenStream(std::shared_ptr input,uint32_t offset) -> cpp::result override; - auto DecodeTo(cpp::span destination) + auto DecodeTo(std::span destination) -> cpp::result override; MadMp3Decoder(const MadMp3Decoder&) = delete; diff --git a/src/codecs/include/opus.hpp b/src/codecs/include/opus.hpp index de2f7131..200b2d44 100644 --- a/src/codecs/include/opus.hpp +++ b/src/codecs/include/opus.hpp @@ -10,12 +10,12 @@ #include #include #include +#include #include #include #include "opusfile.h" #include "sample.hpp" -#include "span.hpp" #include "codec.hpp" @@ -26,10 +26,10 @@ class XiphOpusDecoder : public ICodec { XiphOpusDecoder(); ~XiphOpusDecoder(); - auto OpenStream(std::shared_ptr input,uint32_t offset) + auto OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result override; - auto DecodeTo(cpp::span destination) + auto DecodeTo(std::span destination) -> cpp::result override; XiphOpusDecoder(const XiphOpusDecoder&) = delete; diff --git a/src/codecs/include/source_buffer.hpp b/src/codecs/include/source_buffer.hpp index 7834834d..6444dd2c 100644 --- a/src/codecs/include/source_buffer.hpp +++ b/src/codecs/include/source_buffer.hpp @@ -9,8 +9,7 @@ #include #include #include - -#include "span.hpp" +#include #include "codec.hpp" @@ -22,15 +21,15 @@ class SourceBuffer { ~SourceBuffer(); auto Refill(IStream* src) -> bool; - auto AddBytes(std::function)> writer) -> void; - auto ConsumeBytes(std::function)> reader) -> void; + auto AddBytes(std::function)> writer) -> void; + auto ConsumeBytes(std::function)> reader) -> void; auto Empty() -> void; SourceBuffer(const SourceBuffer&) = delete; SourceBuffer& operator=(const SourceBuffer&) = delete; private: - const cpp::span buffer_; + const std::span buffer_; size_t bytes_in_buffer_; size_t offset_of_bytes_; }; diff --git a/src/codecs/include/vorbis.hpp b/src/codecs/include/vorbis.hpp index 3cf0f9ce..e6f393dc 100644 --- a/src/codecs/include/vorbis.hpp +++ b/src/codecs/include/vorbis.hpp @@ -10,12 +10,12 @@ #include #include #include +#include #include #include #include "ivorbisfile.h" #include "sample.hpp" -#include "span.hpp" #include "codec.hpp" @@ -26,10 +26,10 @@ class TremorVorbisDecoder : public ICodec { TremorVorbisDecoder(); ~TremorVorbisDecoder(); - auto OpenStream(std::shared_ptr input,uint32_t offset) + auto OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result override; - auto DecodeTo(cpp::span destination) + auto DecodeTo(std::span destination) -> cpp::result override; TremorVorbisDecoder(const TremorVorbisDecoder&) = delete; diff --git a/src/codecs/include/wav.hpp b/src/codecs/include/wav.hpp index 40138968..c09a3bb3 100644 --- a/src/codecs/include/wav.hpp +++ b/src/codecs/include/wav.hpp @@ -34,7 +34,7 @@ class WavDecoder : public ICodec { auto OpenStream(std::shared_ptr input,uint32_t offset) -> cpp::result override; - auto DecodeTo(cpp::span destination) + auto DecodeTo(std::span destination) -> cpp::result override; WavDecoder(const WavDecoder&) = delete; diff --git a/src/codecs/mad.cpp b/src/codecs/mad.cpp index e44e9922..01b2f721 100644 --- a/src/codecs/mad.cpp +++ b/src/codecs/mad.cpp @@ -74,7 +74,7 @@ auto MadMp3Decoder::OpenStream(std::shared_ptr input, uint32_t offset) while (!eof && !got_header) { eof = buffer_.Refill(input_.get()); - buffer_.ConsumeBytes([&](cpp::span buf) -> size_t { + buffer_.ConsumeBytes([&](std::span buf) -> size_t { mad_stream_buffer(stream_.get(), reinterpret_cast(buf.data()), buf.size_bytes()); @@ -130,7 +130,7 @@ auto MadMp3Decoder::OpenStream(std::shared_ptr input, uint32_t offset) } need_refill = false; - buffer_.ConsumeBytes([&](cpp::span buf) -> size_t { + buffer_.ConsumeBytes([&](std::span buf) -> size_t { mad_stream_buffer(stream_.get(), reinterpret_cast(buf.data()), buf.size()); @@ -156,13 +156,13 @@ auto MadMp3Decoder::OpenStream(std::shared_ptr input, uint32_t offset) return output; } -auto MadMp3Decoder::DecodeTo(cpp::span output) +auto MadMp3Decoder::DecodeTo(std::span output) -> cpp::result { if (current_sample_ < 0 && !is_eos_) { if (!is_eof_) { is_eof_ = buffer_.Refill(input_.get()); if (is_eof_) { - buffer_.AddBytes([&](cpp::span buf) -> size_t { + buffer_.AddBytes([&](std::span buf) -> size_t { if (buf.size() < MAD_BUFFER_GUARD) { is_eof_ = false; return 0; @@ -174,7 +174,7 @@ auto MadMp3Decoder::DecodeTo(cpp::span output) } } - buffer_.ConsumeBytes([&](cpp::span buf) -> size_t { + buffer_.ConsumeBytes([&](std::span buf) -> size_t { mad_stream_buffer(stream_.get(), reinterpret_cast(buf.data()), buf.size()); diff --git a/src/codecs/opus.cpp b/src/codecs/opus.cpp index a5220c4b..b5e7c3fc 100644 --- a/src/codecs/opus.cpp +++ b/src/codecs/opus.cpp @@ -140,7 +140,7 @@ auto XiphOpusDecoder::OpenStream(std::shared_ptr input, }; } -auto XiphOpusDecoder::DecodeTo(cpp::span output) +auto XiphOpusDecoder::DecodeTo(std::span output) -> cpp::result { int samples_written = op_read_stereo(opus_, output.data(), output.size()); diff --git a/src/codecs/source_buffer.cpp b/src/codecs/source_buffer.cpp index 0a986bc3..538d7f47 100644 --- a/src/codecs/source_buffer.cpp +++ b/src/codecs/source_buffer.cpp @@ -39,7 +39,7 @@ auto SourceBuffer::Refill(IStream* src) -> bool { return false; } bool eof = false; - AddBytes([&](cpp::span buf) -> size_t { + AddBytes([&](std::span buf) -> size_t { ssize_t bytes_read = src->Read(buf); // Treat read errors as EOF. eof = bytes_read <= 0; @@ -48,7 +48,7 @@ auto SourceBuffer::Refill(IStream* src) -> bool { return eof; } -auto SourceBuffer::AddBytes(std::function)> writer) +auto SourceBuffer::AddBytes(std::function)> writer) -> void { if (offset_of_bytes_ > 0) { std::memmove(buffer_.data(), buffer_.data() + offset_of_bytes_, @@ -61,7 +61,7 @@ auto SourceBuffer::AddBytes(std::function)> writer) } auto SourceBuffer::ConsumeBytes( - std::function)> reader) -> void { + std::function)> reader) -> void { size_t bytes_consumed = std::invoke( reader, buffer_.subspan(offset_of_bytes_, bytes_in_buffer_)); assert(bytes_consumed <= bytes_in_buffer_); diff --git a/src/codecs/test/test_mad.cpp b/src/codecs/test/test_mad.cpp index e8c714e7..15c96eae 100644 --- a/src/codecs/test/test_mad.cpp +++ b/src/codecs/test/test_mad.cpp @@ -8,14 +8,14 @@ #include #include +#include #include "catch2/catch.hpp" -#include "span.hpp" #include "test.mp3.hpp" -void load_mp3(cpp::span dest) { - cpp::span src(reinterpret_cast(test_mp3), +void load_mp3(std::span dest) { + std::span src(reinterpret_cast(test_mp3), test_mp3_len); std::copy(src.begin(), src.begin() + dest.size(), dest.begin()); } diff --git a/src/codecs/vorbis.cpp b/src/codecs/vorbis.cpp index 9131451b..0b2af691 100644 --- a/src/codecs/vorbis.cpp +++ b/src/codecs/vorbis.cpp @@ -129,7 +129,7 @@ auto TremorVorbisDecoder::OpenStream(std::shared_ptr input, }; } -auto TremorVorbisDecoder::DecodeTo(cpp::span output) +auto TremorVorbisDecoder::DecodeTo(std::span output) -> cpp::result { int unused = 0; long bytes_written = diff --git a/src/codecs/wav.cpp b/src/codecs/wav.cpp index 714ec237..f5b9d789 100644 --- a/src/codecs/wav.cpp +++ b/src/codecs/wav.cpp @@ -20,24 +20,24 @@ namespace codecs { [[maybe_unused]] static const char kTag[] = "wav"; -static inline auto bytes_to_u16(cpp::span bytes) +static inline auto bytes_to_u16(std::span bytes) -> uint16_t { return (uint16_t)bytes[0] | (uint16_t)bytes[1] << 8; } -static inline auto bytes_to_u32(cpp::span bytes) +static inline auto bytes_to_u32(std::span bytes) -> uint32_t { return (uint32_t)bytes[0] | (uint32_t)bytes[1] << 8 | (uint32_t)bytes[2] << 16 | (uint32_t)bytes[3] << 24; } -static inline auto bytes_to_str(cpp::span bytes) +static inline auto bytes_to_str(std::span bytes) -> std::string { return std::string(reinterpret_cast(bytes.data()), - bytes.size_bytes()); + bytes.size_bytes()); } -static int16_t convert_f32_to_16_bit(cpp::span bytes) { +static int16_t convert_f32_to_16_bit(std::span bytes) { uint64_t val = 0; val = (uint8_t)bytes[3]; val = (val << 8) | (uint8_t)bytes[2]; @@ -57,7 +57,7 @@ static int16_t convert_f32_to_16_bit(cpp::span bytes) { return sample::FromDouble(*fval); } -static int16_t convert_f64_to_16_bit(cpp::span bytes) { +static int16_t convert_f64_to_16_bit(std::span bytes) { uint64_t val = 0; val = (uint8_t)bytes[7]; val = (val << 8) | (uint8_t)bytes[6]; @@ -71,7 +71,7 @@ static int16_t convert_f64_to_16_bit(cpp::span bytes) { return sample::FromDouble(*fval); } -static int16_t convert_to_16_bit(cpp::span bytes) { +static int16_t convert_to_16_bit(std::span bytes) { int depth = bytes.size(); int32_t val = 0; // If 8-bit Assume Unsigned @@ -82,10 +82,13 @@ static int16_t convert_to_16_bit(cpp::span bytes) { switch (depth) { case 4: val = (uint8_t)bytes[3]; + [[fallthrough]]; case 3: val = (val << 8) | (uint8_t)bytes[2]; + [[fallthrough]]; case 2: val = (val << 8) | (uint8_t)bytes[1]; + [[fallthrough]]; case 1: val = (val << 8) | (uint8_t)bytes[0]; } @@ -98,7 +101,7 @@ WavDecoder::WavDecoder() : input_(), buffer_() {} WavDecoder::~WavDecoder() {} -auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) +auto WavDecoder::OpenStream(std::shared_ptr input, uint32_t offset) -> cpp::result { input_ = input; @@ -123,7 +126,7 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) // - end of this part, next header we care about is 'data' // - and then the next 4 bytes = 32 bit int = size of data - auto buffer_span = cpp::span{buf}; + auto buffer_span = std::span{buf}; std::string riff = bytes_to_str(buffer_span.subspan(0, 4)); if (riff != "RIFF") { @@ -131,7 +134,7 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) return cpp::fail(Error::kMalformedData); } - uint32_t file_size = bytes_to_u32(buffer_span.subspan(4, 4)) + 8; + // uint32_t file_size = bytes_to_u32(buffer_span.subspan(4, 4)) + 8; std::string fmt_header = bytes_to_str(buffer_span.subspan(12, 4)); ESP_LOGI(kTag, "fmt header found? %s", @@ -142,9 +145,9 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) } // Size of the fmt header, should be 16, 18 or 40 - uint32_t fmt_header_size = bytes_to_u32(buffer_span.subspan(16, 4)); + // uint32_t fmt_header_size = bytes_to_u32(buffer_span.subspan(16, 4)); - wave_format_ = bytes_to_u16(buffer_span.subspan(20, 2)); + wave_format_ = bytes_to_u16(buffer_span.subspan<20, 2>()); if (wave_format_ == kWaveFormatPCM) { ESP_LOGD(kTag, "wave format: PCM"); } else if (wave_format_ == kWaveFormatExtensible) { @@ -156,17 +159,17 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) return cpp::fail(Error::kUnsupportedFormat); } - num_channels_ = bytes_to_u16(buffer_span.subspan(22, 2)); + num_channels_ = bytes_to_u16(buffer_span.subspan<22, 2>()); - uint32_t samples_per_second = bytes_to_u32(buffer_span.subspan(24, 4)); + uint32_t samples_per_second = bytes_to_u32(buffer_span.subspan<24, 4>()); - uint32_t avg_bytes_per_second = bytes_to_u32(buffer_span.subspan(28, 4)); + // uint32_t avg_bytes_per_second = bytes_to_u32(buffer_span.subspan(28, 4)); - uint16_t block_align = bytes_to_u16(buffer_span.subspan(32, 2)); + uint16_t block_align = bytes_to_u16(buffer_span.subspan<32, 2>()); bytes_per_sample_ = block_align / num_channels_; - uint16_t bits_per_sample = bytes_to_u16(buffer_span.subspan(34, 2)); + // uint16_t bits_per_sample = bytes_to_u16(buffer_span.subspan(34, 2)); // find the start of the data chunk std::array data_tag = {std::byte{0x64}, std::byte{0x61}, @@ -180,7 +183,7 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) int data_chunk_index = std::distance(buffer_span.begin(), data_loc.begin()); uint32_t data_chunk_size = - bytes_to_u32(buffer_span.subspan(data_chunk_index + 4, 4)); + bytes_to_u32(buffer_span.subspan(data_chunk_index + 4, 4).first<4>()); // calculate number of samples int number_of_samples = data_chunk_size / bytes_per_sample_; @@ -188,20 +191,20 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) // extension to the fmt chunk size (0 or 22) uint16_t extension_size = 0; if (wave_format_ == kWaveFormatExtensible) { - extension_size = bytes_to_u16(buffer_span.subspan(36, 2)); + extension_size = bytes_to_u16(buffer_span.subspan<36, 2>()); } // Parse extension if applicable if (extension_size == 22) { // Valid bits per sample - uint16_t valid_bits_per_sample = bytes_to_u16(buffer_span.subspan(38, 2)); + // uint16_t valid_bits_per_sample = bytes_to_u16(buffer_span.subspan(38, + // 2)); - uint32_t speaker_mask = bytes_to_u32(buffer_span.subspan(40, 4)); + // uint32_t speaker_mask = bytes_to_u32(buffer_span.subspan(40, 4)); // Parse subformat - subformat_ = bytes_to_u16(buffer_span.subspan(44, 2)); - if (!(subformat_ == kWaveFormatPCM || - subformat_ == kWaveFormatIEEEFloat)) { + subformat_ = bytes_to_u16(buffer_span.subspan<44, 2>()); + if (!(subformat_ == kWaveFormatPCM || subformat_ == kWaveFormatIEEEFloat)) { ESP_LOGW(kTag, "WAVE extensible subformat_ not supported"); return cpp::fail(Error::kUnsupportedFormat); } @@ -210,7 +213,8 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) int64_t data_offset = offset * samples_per_second * bytes_per_sample_; // Seek track to start of data - input->SeekTo(data_chunk_index + 8 + data_offset, IStream::SeekFrom::kStartOfStream); + input->SeekTo(data_chunk_index + 8 + data_offset, + IStream::SeekFrom::kStartOfStream); output_format_ = {.num_channels = (uint8_t)num_channels_, .sample_rate_hz = samples_per_second, @@ -219,12 +223,12 @@ auto WavDecoder::OpenStream(std::shared_ptr input,uint32_t offset) return output_format_; } -auto WavDecoder::DecodeTo(cpp::span output) +auto WavDecoder::DecodeTo(std::span output) -> cpp::result { bool is_eof = buffer_.Refill(input_.get()); size_t samples_written = 0; - buffer_.ConsumeBytes([&](cpp::span buf) -> size_t { + buffer_.ConsumeBytes([&](std::span buf) -> size_t { size_t bytes_read = buf.size_bytes(); size_t frames_read = bytes_read / bytes_per_sample_ / output_format_.num_channels; @@ -254,7 +258,6 @@ auto WavDecoder::DecodeTo(cpp::span output) return samples_written * bytes_per_sample_; }); - return OutputInfo{.samples_written = samples_written, .is_stream_finished = samples_written == 0 && is_eof}; } diff --git a/src/database/CMakeLists.txt b/src/database/CMakeLists.txt index 26c14815..248ca3d7 100644 --- a/src/database/CMakeLists.txt +++ b/src/database/CMakeLists.txt @@ -6,7 +6,7 @@ idf_component_register( SRCS "env_esp.cpp" "database.cpp" "track.cpp" "records.cpp" "file_gatherer.cpp" "tag_parser.cpp" "index.cpp" INCLUDE_DIRS "include" - REQUIRES "result" "span" "esp_psram" "fatfs" "libtags" "komihash" "cbor" + REQUIRES "result" "esp_psram" "fatfs" "libtags" "komihash" "cbor" "tasks" "memory" "util" "tinyfsm" "events" "opusfile" "libcppbor") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/database/include/records.hpp b/src/database/include/records.hpp index 87034059..3ca68fea 100644 --- a/src/database/include/records.hpp +++ b/src/database/include/records.hpp @@ -80,6 +80,6 @@ auto TrackIdToBytes(TrackId id) -> std::string; * Converts a track id encoded via TrackIdToBytes back into a TrackId. May * return nullopt if parsing fails. */ -auto BytesToTrackId(cpp::span bytes) -> std::optional; +auto BytesToTrackId(std::span bytes) -> std::optional; } // namespace database diff --git a/src/database/include/track.hpp b/src/database/include/track.hpp index 76b1c56e..b097ab52 100644 --- a/src/database/include/track.hpp +++ b/src/database/include/track.hpp @@ -6,12 +6,12 @@ #pragma once -#include -#include +#include #include #include #include +#include #include #include #include @@ -19,7 +19,6 @@ #include "leveldb/db.h" #include "memory_resource.hpp" -#include "span.hpp" namespace database { @@ -62,7 +61,7 @@ enum class Tag { using TagValue = std::variant>; + std::span>; auto tagName(Tag) -> std::string; auto tagHash(const TagValue&) -> uint64_t; @@ -112,7 +111,7 @@ class TrackTags { auto albumOrder() const -> uint32_t; - auto genres() const -> cpp::span; + auto genres() const -> std::span; auto genres(const std::string_view) -> void; /* diff --git a/src/database/index.cpp b/src/database/index.cpp index 857fbcc5..328c3b43 100644 --- a/src/database/index.cpp +++ b/src/database/index.cpp @@ -61,11 +61,11 @@ class Indexer { private: auto handleLevel(const IndexKey::Header& header, - cpp::span components) -> void; + std::span components) -> void; auto handleItem(const IndexKey::Header& header, std::variant item, - cpp::span components) -> void; + std::span components) -> void; auto missing_value(Tag tag) -> TagValue { switch (tag) { @@ -111,7 +111,7 @@ auto Indexer::index() -> std::vector> { } auto Indexer::handleLevel(const IndexKey::Header& header, - cpp::span components) -> void { + std::span components) -> void { Tag component = components.front(); TagValue value = track_.tags().get(component); if (std::holds_alternative(value)) { @@ -129,7 +129,7 @@ auto Indexer::handleLevel(const IndexKey::Header& header, } else if constexpr (std::is_same_v) { handleItem(header, arg, components); } else if constexpr (std::is_same_v< - T, cpp::span>) { + T, std::span>) { for (const auto& i : arg) { handleItem(header, i, components); } @@ -140,7 +140,7 @@ auto Indexer::handleLevel(const IndexKey::Header& header, auto Indexer::handleItem(const IndexKey::Header& header, std::variant item, - cpp::span components) -> void { + std::span components) -> void { IndexKey key{ .header = header, .item = {}, diff --git a/src/database/records.cpp b/src/database/records.cpp index a1efb568..b086be3b 100644 --- a/src/database/records.cpp +++ b/src/database/records.cpp @@ -248,7 +248,7 @@ auto TrackIdToBytes(TrackId id) -> std::string { return cppbor::Uint{id}.toString(); } -auto BytesToTrackId(cpp::span bytes) -> std::optional { +auto BytesToTrackId(std::span bytes) -> std::optional { auto [res, unused, err] = cppbor::parse( reinterpret_cast(bytes.data()), bytes.size()); if (!res || res->type() != cppbor::UINT) { diff --git a/src/database/track.cpp b/src/database/track.cpp index a2bd05d3..1b1442a1 100644 --- a/src/database/track.cpp +++ b/src/database/track.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -16,7 +17,6 @@ #include "komihash.h" #include "memory_resource.hpp" -#include "span.hpp" namespace database { @@ -55,7 +55,7 @@ auto tagHash(const TagValue& t) -> uint64_t { } else if constexpr (std::is_same_v) { return komihash(&arg, sizeof(arg), 0); } else if constexpr (std::is_same_v< - T, cpp::span>) { + T, std::span>) { komihash_stream_t hash; komihash_stream_init(&hash, 0); for (const auto& i : arg) { @@ -79,7 +79,7 @@ auto tagToString(const TagValue& val) -> std::string { } else if constexpr (std::is_same_v) { return std::to_string(arg); } else if constexpr (std::is_same_v< - T, cpp::span>) { + T, std::span>) { std::ostringstream builder{}; for (const auto& str : arg) { builder << std::string{str.data(), str.size()} << ","; @@ -225,7 +225,7 @@ auto TrackTags::albumOrder() const -> uint32_t { return (disc_.value_or(0) << 16) | track_.value_or(0); } -auto TrackTags::genres() const -> cpp::span { +auto TrackTags::genres() const -> std::span { return genres_; } diff --git a/src/drivers/CMakeLists.txt b/src/drivers/CMakeLists.txt index 891115d4..c2018d3f 100644 --- a/src/drivers/CMakeLists.txt +++ b/src/drivers/CMakeLists.txt @@ -7,6 +7,6 @@ idf_component_register( "i2c.cpp" "bluetooth.cpp" "spi.cpp" "display.cpp" "display_init.cpp" "samd.cpp" "wm8523.cpp" "nvs.cpp" "haptics.cpp" "spiffs.cpp" INCLUDE_DIRS "include" - REQUIRES "esp_adc" "fatfs" "result" "lvgl" "span" "tasks" "nvs_flash" "spiffs" + REQUIRES "esp_adc" "fatfs" "result" "lvgl" "tasks" "nvs_flash" "spiffs" "bt" "tinyfsm" "util") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/drivers/i2s_dac.cpp b/src/drivers/i2s_dac.cpp index aef466c2..7fe5547d 100644 --- a/src/drivers/i2s_dac.cpp +++ b/src/drivers/i2s_dac.cpp @@ -207,7 +207,7 @@ auto I2SDac::Reconfigure(Channels ch, BitsPerSample bps, SampleRate rate) } } -auto I2SDac::WriteData(const cpp::span& data) -> void { +auto I2SDac::WriteData(const std::span& data) -> void { std::size_t bytes_written = 0; esp_err_t err = i2s_channel_write(i2s_handle_, data.data(), data.size_bytes(), &bytes_written, portMAX_DELAY); diff --git a/src/drivers/include/i2s_dac.hpp b/src/drivers/include/i2s_dac.hpp index bd837ca0..569f0a9a 100644 --- a/src/drivers/include/i2s_dac.hpp +++ b/src/drivers/include/i2s_dac.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "driver/i2s_std.h" #include "driver/i2s_types.h" @@ -20,7 +21,6 @@ #include "freertos/portmacro.h" #include "freertos/stream_buffer.h" #include "result.hpp" -#include "span.hpp" #include "gpios.hpp" #include "sys/_stdint.h" @@ -68,7 +68,7 @@ class I2SDac { auto Reconfigure(Channels ch, BitsPerSample bps, SampleRate rate) -> void; - auto WriteData(const cpp::span& data) -> void; + auto WriteData(const std::span& data) -> void; auto SetSource(StreamBufferHandle_t buffer) -> void; // Not copyable or movable. diff --git a/src/locale/CMakeLists.txt b/src/locale/CMakeLists.txt index 627ca314..9c1c2619 100644 --- a/src/locale/CMakeLists.txt +++ b/src/locale/CMakeLists.txt @@ -6,6 +6,6 @@ idf_component_register( SRCS "collation.cpp" "strxfrm_l.c" INCLUDE_DIRS "include" PRIV_INCLUDE_DIRS "priv_include" - REQUIRES "span" "esp_partition" "spi_flash") + REQUIRES "esp_partition" "spi_flash") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/locale/include/collation.hpp b/src/locale/include/collation.hpp index b666860d..88f499c4 100644 --- a/src/locale/include/collation.hpp +++ b/src/locale/include/collation.hpp @@ -9,10 +9,10 @@ #include #include #include +#include #include #include "esp_partition.h" -#include "span.hpp" #include "strxfrm.h" diff --git a/src/lua/property.cpp b/src/lua/property.cpp index 634a6a26..9f4a1908 100644 --- a/src/lua/property.cpp +++ b/src/lua/property.cpp @@ -247,7 +247,7 @@ static auto pushTagValue(lua_State* L, const database::TagValue& val) -> void { if constexpr (std::is_same_v) { lua_pushlstring(L, arg.data(), arg.size()); } else if constexpr (std::is_same_v< - T, cpp::span>) { + T, std::span>) { lua_createtable(L, 0, arg.size()); for (const auto& i : arg) { lua_pushlstring(L, i.data(), i.size()); diff --git a/src/memory/include/himem.hpp b/src/memory/include/himem.hpp index 81166e0d..f70648a9 100644 --- a/src/memory/include/himem.hpp +++ b/src/memory/include/himem.hpp @@ -8,9 +8,9 @@ #include #include +#include #include "esp32/himem.h" -#include "span.hpp" /* * Wrapper around an ESP-IDF himem allocation, which uses RAII to clean up after @@ -62,14 +62,14 @@ class MappableRegion { } } - auto Get() -> cpp::span { + auto Get() -> std::span { if (bytes_ == nullptr) { return {}; } return {bytes_, size}; } - auto Map(const HimemAlloc& alloc) -> cpp::span { + auto Map(const HimemAlloc& alloc) -> std::span { assert(bytes_ == nullptr); ESP_ERROR_CHECK(esp_himem_map(alloc.handle, range_handle, 0, 0, size, 0, reinterpret_cast(&bytes_))); diff --git a/src/tasks/CMakeLists.txt b/src/tasks/CMakeLists.txt index 0fdacf78..814c9943 100644 --- a/src/tasks/CMakeLists.txt +++ b/src/tasks/CMakeLists.txt @@ -1,5 +1,5 @@ # Copyright 2023 jacqueline # # SPDX-License-Identifier: GPL-3.0-only -idf_component_register(SRCS "tasks.cpp" INCLUDE_DIRS "." REQUIRES "span" "memory") +idf_component_register(SRCS "tasks.cpp" INCLUDE_DIRS "." REQUIRES "memory") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/tasks/tasks.cpp b/src/tasks/tasks.cpp index aa382655..d3937c68 100644 --- a/src/tasks/tasks.cpp +++ b/src/tasks/tasks.cpp @@ -33,12 +33,12 @@ auto Name() -> std::pmr::string { } template -auto AllocateStack() -> cpp::span; +auto AllocateStack() -> std::span; // Decoders often require a very large amount of stack space, since they aren't // usually written with embedded use cases in mind. template <> -auto AllocateStack() -> cpp::span { +auto AllocateStack() -> std::span { constexpr std::size_t size = 20 * 1024; static StackType_t sStack[size]; return {sStack, size}; @@ -46,14 +46,14 @@ auto AllocateStack() -> cpp::span { // LVGL requires only a relatively small stack. Lua's stack is allocated // separately. template <> -auto AllocateStack() -> cpp::span { +auto AllocateStack() -> std::span { constexpr std::size_t size = 14 * 1024; static StackType_t sStack[size]; return {sStack, size}; } template <> // PCM conversion and resampling uses a very small amount of stack. -auto AllocateStack() -> cpp::span { +auto AllocateStack() -> std::span { constexpr std::size_t size = 4 * 1024; static StackType_t sStack[size]; return {sStack, size}; @@ -63,7 +63,7 @@ auto AllocateStack() -> cpp::span { // cases, where large stack usage isn't so much of a concern. It therefore uses // an eye-wateringly large amount of stack. template <> -auto AllocateStack() -> cpp::span { +auto AllocateStack() -> std::span { std::size_t size = 64 * 1024; return {static_cast(heap_caps_malloc(size, MALLOC_CAP_SPIRAM)), size}; diff --git a/src/tasks/tasks.hpp b/src/tasks/tasks.hpp index 47f26837..566b5706 100644 --- a/src/tasks/tasks.hpp +++ b/src/tasks/tasks.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include "esp_heap_caps.h" @@ -19,7 +20,6 @@ #include "freertos/projdefs.h" #include "freertos/queue.h" #include "freertos/task.h" -#include "span.hpp" namespace tasks { @@ -46,7 +46,7 @@ enum class Type { template auto Name() -> std::pmr::string; template -auto AllocateStack() -> cpp::span; +auto AllocateStack() -> std::span; template auto Priority() -> UBaseType_t; @@ -56,7 +56,7 @@ template auto StartPersistent(const std::function& fn) -> void { StaticTask_t* task_buffer = static_cast(heap_caps_malloc( sizeof(StaticTask_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)); - cpp::span stack = AllocateStack(); + std::span stack = AllocateStack(); xTaskCreateStatic(&PersistentMain, Name().c_str(), stack.size(), new std::function(fn), Priority(), stack.data(), task_buffer); @@ -67,7 +67,7 @@ auto StartPersistent(BaseType_t core, const std::function& fn) -> void { StaticTask_t* task_buffer = static_cast(heap_caps_malloc( sizeof(StaticTask_t), MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)); - cpp::span stack = AllocateStack(); + std::span stack = AllocateStack(); xTaskCreateStaticPinnedToCore(&PersistentMain, Name().c_str(), stack.size(), new std::function(fn), Priority(), stack.data(), task_buffer, core); diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index bb4ce320..e1913920 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-only -idf_component_register(SRCS INCLUDE_DIRS "include" REQUIRES "database" "span") +idf_component_register(SRCS INCLUDE_DIRS "include" REQUIRES "database") diff --git a/src/util/include/debug.hpp b/src/util/include/debug.hpp index 620b0974..27fb2999 100644 --- a/src/util/include/debug.hpp +++ b/src/util/include/debug.hpp @@ -8,13 +8,12 @@ #include #include - +#include #include -#include "span.hpp" namespace util { -inline std::string format_hex_string(cpp::span data) { +inline std::string format_hex_string(std::span data) { std::ostringstream oss; std::ostringstream ascii_values; int count = 0; diff --git a/tools/cmake/common.cmake b/tools/cmake/common.cmake index c7137694..7087e896 100644 --- a/tools/cmake/common.cmake +++ b/tools/cmake/common.cmake @@ -33,7 +33,6 @@ list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/drflac") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/ogg") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/opusfile") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/result") -list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/span") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/speexdsp") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/tinyfsm") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/tremor") From 1573a8c4cde1cd9528b422b2dcc598e37ffe94a7 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 19:12:26 +1000 Subject: [PATCH 05/15] WIP merge cyclically dependent components into one big component --- lib/lvgl/env_support/cmake/esp.cmake | 1 - lib/lvgl/lv_conf.h | 3 +- src/app_console/CMakeLists.txt | 9 ---- src/audio/CMakeLists.txt | 14 ----- src/battery/CMakeLists.txt | 10 ---- src/database/CMakeLists.txt | 22 -------- src/dev_console/CMakeLists.txt | 9 ---- src/drivers/CMakeLists.txt | 4 +- src/drivers/bluetooth.cpp | 1 - src/drivers/include/nvs.hpp | 1 - src/drivers/nvs.cpp | 3 -- src/events/CMakeLists.txt | 9 ---- src/input/CMakeLists.txt | 13 ----- src/lua/CMakeLists.txt | 13 ----- src/main/CMakeLists.txt | 5 +- src/system_fsm/CMakeLists.txt | 11 ---- src/tangara/CMakeLists.txt | 23 ++++++++ src/{ => tangara}/app_console/app_console.cpp | 32 +++++------ .../app_console}/app_console.hpp | 0 src/{ => tangara}/audio/README.md | 0 src/{ => tangara}/audio/audio_converter.cpp | 0 .../audio}/audio_converter.hpp | 0 src/{ => tangara}/audio/audio_decoder.cpp | 7 +-- .../audio}/audio_decoder.hpp | 0 .../audio}/audio_events.hpp | 0 src/{ => tangara}/audio/audio_fsm.cpp | 0 .../include => tangara/audio}/audio_fsm.hpp | 0 .../include => tangara/audio}/audio_sink.hpp | 0 src/{ => tangara}/audio/audio_source.cpp | 0 .../audio}/audio_source.hpp | 0 src/{ => tangara}/audio/bt_audio_output.cpp | 0 .../audio}/bt_audio_output.hpp | 0 src/{ => tangara}/audio/fatfs_audio_input.cpp | 0 .../audio}/fatfs_audio_input.hpp | 0 src/{ => tangara}/audio/fatfs_source.cpp | 0 .../audio}/fatfs_source.hpp | 0 src/{ => tangara}/audio/i2s_audio_output.cpp | 0 .../audio}/i2s_audio_output.hpp | 0 src/{ => tangara}/audio/readahead_source.cpp | 0 .../audio}/readahead_source.hpp | 0 src/{ => tangara}/audio/resample.cpp | 0 .../include => tangara/audio}/resample.hpp | 0 src/{ => tangara}/audio/test/CMakeLists.txt | 0 src/{ => tangara}/audio/track_queue.cpp | 0 .../include => tangara/audio}/track_queue.hpp | 0 src/{ => tangara}/battery/battery.cpp | 0 .../include => tangara/battery}/battery.hpp | 0 src/{ => tangara}/database/database.cpp | 0 .../include => tangara/database}/database.hpp | 0 .../database}/db_events.hpp | 0 src/{ => tangara}/database/env_esp.cpp | 0 .../include => tangara/database}/env_esp.hpp | 0 src/{ => tangara}/database/file_gatherer.cpp | 0 .../database}/file_gatherer.hpp | 0 .../database}/future_fetcher.hpp | 0 src/{ => tangara}/database/index.cpp | 0 .../include => tangara/database}/index.hpp | 0 src/{ => tangara}/database/records.cpp | 0 .../include => tangara/database}/records.hpp | 0 src/{ => tangara}/database/tag_parser.cpp | 0 .../database}/tag_parser.hpp | 0 .../database/test/CMakeLists.txt | 0 .../database/test/test_database.cpp | 0 .../database/test/test_records.cpp | 0 src/{ => tangara}/database/track.cpp | 0 .../include => tangara/database}/track.hpp | 0 src/{ => tangara}/dev_console/console.cpp | 0 .../dev_console}/console.hpp | 0 src/{ => tangara}/events/event_queue.cpp | 2 +- .../events}/event_queue.hpp | 0 src/{ => tangara}/input/device_factory.cpp | 0 .../input}/device_factory.hpp | 0 .../input}/feedback_device.hpp | 0 src/{ => tangara}/input/feedback_haptics.cpp | 2 +- .../input}/feedback_haptics.hpp | 0 .../input}/input_device.hpp | 0 src/{ => tangara}/input/input_hook.cpp | 8 +-- .../include => tangara/input}/input_hook.hpp | 0 .../input/input_hook_actions.cpp | 6 +-- .../input}/input_hook_actions.hpp | 0 src/{ => tangara}/input/input_nav_buttons.cpp | 0 .../input}/input_nav_buttons.hpp | 0 src/{ => tangara}/input/input_touch_dpad.cpp | 11 ++-- .../input}/input_touch_dpad.hpp | 0 src/{ => tangara}/input/input_touch_wheel.cpp | 4 +- .../input}/input_touch_wheel.hpp | 0 src/{ => tangara}/input/input_trigger.cpp | 4 +- .../input}/input_trigger.hpp | 0 .../input/input_volume_buttons.cpp | 0 .../input}/input_volume_buttons.hpp | 0 src/{ => tangara}/input/lvgl_input_driver.cpp | 24 ++++----- .../input}/lvgl_input_driver.hpp | 0 src/{ => tangara}/lua/bridge.cpp | 0 src/{lua/include => tangara/lua}/bridge.hpp | 0 src/{ => tangara}/lua/lua_controls.cpp | 0 .../include => tangara/lua}/lua_controls.hpp | 0 src/{ => tangara}/lua/lua_database.cpp | 0 .../include => tangara/lua}/lua_database.hpp | 0 src/{ => tangara}/lua/lua_queue.cpp | 0 .../include => tangara/lua}/lua_queue.hpp | 0 .../include => tangara/lua}/lua_registry.hpp | 0 src/{ => tangara}/lua/lua_screen.cpp | 0 .../include => tangara/lua}/lua_screen.hpp | 0 src/{ => tangara}/lua/lua_theme.cpp | 0 .../include => tangara/lua}/lua_theme.hpp | 0 src/{ => tangara}/lua/lua_thread.cpp | 0 .../include => tangara/lua}/lua_thread.hpp | 0 src/{ => tangara}/lua/lua_version.cpp | 0 .../include => tangara/lua}/lua_version.hpp | 0 src/{ => tangara}/lua/property.cpp | 0 src/{lua/include => tangara/lua}/property.hpp | 0 src/{ => tangara}/lua/registry.cpp | 0 src/{ => tangara}/system_fsm/booting.cpp | 0 src/{ => tangara}/system_fsm/idle.cpp | 0 src/{ => tangara}/system_fsm/running.cpp | 0 .../system_fsm/service_locator.cpp | 0 .../system_fsm}/service_locator.hpp | 0 .../system_fsm}/system_events.hpp | 0 src/{ => tangara}/system_fsm/system_fsm.cpp | 0 .../system_fsm}/system_fsm.hpp | 0 src/{ => tangara}/ui/font_fusion_10.c | 0 src/{ => tangara}/ui/font_fusion_12.c | 0 src/{ => tangara}/ui/font_symbols.c | 0 src/{ui/include => tangara/ui}/fonts.hpp | 0 src/{ => tangara}/ui/lvgl_task.cpp | 0 src/{ui/include => tangara/ui}/lvgl_task.hpp | 0 src/{ => tangara}/ui/modal.cpp | 0 src/{ui/include => tangara/ui}/modal.hpp | 0 src/{ => tangara}/ui/screen.cpp | 0 src/{ui/include => tangara/ui}/screen.hpp | 0 src/{ => tangara}/ui/screen_lua.cpp | 0 src/{ui/include => tangara/ui}/screen_lua.hpp | 0 src/{ => tangara}/ui/screen_splash.cpp | 0 .../include => tangara/ui}/screen_splash.hpp | 0 src/{ => tangara}/ui/splash.c | 0 src/{ => tangara}/ui/themes.cpp | 0 src/{ui/include => tangara/ui}/themes.hpp | 0 src/{ui/include => tangara/ui}/ui_events.hpp | 0 src/{ => tangara}/ui/ui_fsm.cpp | 0 src/{ui/include => tangara/ui}/ui_fsm.hpp | 0 src/ui/CMakeLists.txt | 11 ---- src/ui/icons/battery_20.c | 52 ------------------ src/ui/icons/battery_40.c | 52 ------------------ src/ui/icons/battery_60.c | 52 ------------------ src/ui/icons/battery_80.c | 52 ------------------ src/ui/icons/battery_empty.c | 52 ------------------ src/ui/icons/battery_full.c | 52 ------------------ src/ui/icons/bluetooth.c | 54 ------------------- src/ui/icons/pause.c | 54 ------------------- src/ui/icons/play.c | 54 ------------------- src/ui/include/ui_tick.hpp | 11 ---- src/util/CMakeLists.txt | 2 +- 152 files changed, 79 insertions(+), 670 deletions(-) delete mode 100644 src/app_console/CMakeLists.txt delete mode 100644 src/audio/CMakeLists.txt delete mode 100644 src/battery/CMakeLists.txt delete mode 100644 src/database/CMakeLists.txt delete mode 100644 src/dev_console/CMakeLists.txt delete mode 100644 src/events/CMakeLists.txt delete mode 100644 src/input/CMakeLists.txt delete mode 100644 src/lua/CMakeLists.txt delete mode 100644 src/system_fsm/CMakeLists.txt create mode 100644 src/tangara/CMakeLists.txt rename src/{ => tangara}/app_console/app_console.cpp (98%) rename src/{app_console/include => tangara/app_console}/app_console.hpp (100%) rename src/{ => tangara}/audio/README.md (100%) rename src/{ => tangara}/audio/audio_converter.cpp (100%) rename src/{audio/include => tangara/audio}/audio_converter.hpp (100%) rename src/{ => tangara}/audio/audio_decoder.cpp (99%) rename src/{audio/include => tangara/audio}/audio_decoder.hpp (100%) rename src/{audio/include => tangara/audio}/audio_events.hpp (100%) rename src/{ => tangara}/audio/audio_fsm.cpp (100%) rename src/{audio/include => tangara/audio}/audio_fsm.hpp (100%) rename src/{audio/include => tangara/audio}/audio_sink.hpp (100%) rename src/{ => tangara}/audio/audio_source.cpp (100%) rename src/{audio/include => tangara/audio}/audio_source.hpp (100%) rename src/{ => tangara}/audio/bt_audio_output.cpp (100%) rename src/{audio/include => tangara/audio}/bt_audio_output.hpp (100%) rename src/{ => tangara}/audio/fatfs_audio_input.cpp (100%) rename src/{audio/include => tangara/audio}/fatfs_audio_input.hpp (100%) rename src/{ => tangara}/audio/fatfs_source.cpp (100%) rename src/{audio/include => tangara/audio}/fatfs_source.hpp (100%) rename src/{ => tangara}/audio/i2s_audio_output.cpp (100%) rename src/{audio/include => tangara/audio}/i2s_audio_output.hpp (100%) rename src/{ => tangara}/audio/readahead_source.cpp (100%) rename src/{audio/include => tangara/audio}/readahead_source.hpp (100%) rename src/{ => tangara}/audio/resample.cpp (100%) rename src/{audio/include => tangara/audio}/resample.hpp (100%) rename src/{ => tangara}/audio/test/CMakeLists.txt (100%) rename src/{ => tangara}/audio/track_queue.cpp (100%) rename src/{audio/include => tangara/audio}/track_queue.hpp (100%) rename src/{ => tangara}/battery/battery.cpp (100%) rename src/{battery/include => tangara/battery}/battery.hpp (100%) rename src/{ => tangara}/database/database.cpp (100%) rename src/{database/include => tangara/database}/database.hpp (100%) rename src/{database/include => tangara/database}/db_events.hpp (100%) rename src/{ => tangara}/database/env_esp.cpp (100%) rename src/{database/include => tangara/database}/env_esp.hpp (100%) rename src/{ => tangara}/database/file_gatherer.cpp (100%) rename src/{database/include => tangara/database}/file_gatherer.hpp (100%) rename src/{database/include => tangara/database}/future_fetcher.hpp (100%) rename src/{ => tangara}/database/index.cpp (100%) rename src/{database/include => tangara/database}/index.hpp (100%) rename src/{ => tangara}/database/records.cpp (100%) rename src/{database/include => tangara/database}/records.hpp (100%) rename src/{ => tangara}/database/tag_parser.cpp (100%) rename src/{database/include => tangara/database}/tag_parser.hpp (100%) rename src/{ => tangara}/database/test/CMakeLists.txt (100%) rename src/{ => tangara}/database/test/test_database.cpp (100%) rename src/{ => tangara}/database/test/test_records.cpp (100%) rename src/{ => tangara}/database/track.cpp (100%) rename src/{database/include => tangara/database}/track.hpp (100%) rename src/{ => tangara}/dev_console/console.cpp (100%) rename src/{dev_console/include => tangara/dev_console}/console.hpp (100%) rename src/{ => tangara}/events/event_queue.cpp (96%) rename src/{events/include => tangara/events}/event_queue.hpp (100%) rename src/{ => tangara}/input/device_factory.cpp (100%) rename src/{input/include => tangara/input}/device_factory.hpp (100%) rename src/{input/include => tangara/input}/feedback_device.hpp (100%) rename src/{ => tangara}/input/feedback_haptics.cpp (94%) rename src/{input/include => tangara/input}/feedback_haptics.hpp (100%) rename src/{input/include => tangara/input}/input_device.hpp (100%) rename src/{ => tangara}/input/input_hook.cpp (96%) rename src/{input/include => tangara/input}/input_hook.hpp (100%) rename src/{ => tangara}/input/input_hook_actions.cpp (95%) rename src/{input/include => tangara/input}/input_hook_actions.hpp (100%) rename src/{ => tangara}/input/input_nav_buttons.cpp (100%) rename src/{input/include => tangara/input}/input_nav_buttons.hpp (100%) rename src/{ => tangara}/input/input_touch_dpad.cpp (89%) rename src/{input/include => tangara/input}/input_touch_dpad.hpp (100%) rename src/{ => tangara}/input/input_touch_wheel.cpp (98%) rename src/{input/include => tangara/input}/input_touch_wheel.hpp (100%) rename src/{ => tangara}/input/input_trigger.cpp (97%) rename src/{input/include => tangara/input}/input_trigger.hpp (100%) rename src/{ => tangara}/input/input_volume_buttons.cpp (100%) rename src/{input/include => tangara/input}/input_volume_buttons.hpp (100%) rename src/{ => tangara}/input/lvgl_input_driver.cpp (95%) rename src/{input/include => tangara/input}/lvgl_input_driver.hpp (100%) rename src/{ => tangara}/lua/bridge.cpp (100%) rename src/{lua/include => tangara/lua}/bridge.hpp (100%) rename src/{ => tangara}/lua/lua_controls.cpp (100%) rename src/{lua/include => tangara/lua}/lua_controls.hpp (100%) rename src/{ => tangara}/lua/lua_database.cpp (100%) rename src/{lua/include => tangara/lua}/lua_database.hpp (100%) rename src/{ => tangara}/lua/lua_queue.cpp (100%) rename src/{lua/include => tangara/lua}/lua_queue.hpp (100%) rename src/{lua/include => tangara/lua}/lua_registry.hpp (100%) rename src/{ => tangara}/lua/lua_screen.cpp (100%) rename src/{lua/include => tangara/lua}/lua_screen.hpp (100%) rename src/{ => tangara}/lua/lua_theme.cpp (100%) rename src/{lua/include => tangara/lua}/lua_theme.hpp (100%) rename src/{ => tangara}/lua/lua_thread.cpp (100%) rename src/{lua/include => tangara/lua}/lua_thread.hpp (100%) rename src/{ => tangara}/lua/lua_version.cpp (100%) rename src/{lua/include => tangara/lua}/lua_version.hpp (100%) rename src/{ => tangara}/lua/property.cpp (100%) rename src/{lua/include => tangara/lua}/property.hpp (100%) rename src/{ => tangara}/lua/registry.cpp (100%) rename src/{ => tangara}/system_fsm/booting.cpp (100%) rename src/{ => tangara}/system_fsm/idle.cpp (100%) rename src/{ => tangara}/system_fsm/running.cpp (100%) rename src/{ => tangara}/system_fsm/service_locator.cpp (100%) rename src/{system_fsm/include => tangara/system_fsm}/service_locator.hpp (100%) rename src/{system_fsm/include => tangara/system_fsm}/system_events.hpp (100%) rename src/{ => tangara}/system_fsm/system_fsm.cpp (100%) rename src/{system_fsm/include => tangara/system_fsm}/system_fsm.hpp (100%) rename src/{ => tangara}/ui/font_fusion_10.c (100%) rename src/{ => tangara}/ui/font_fusion_12.c (100%) rename src/{ => tangara}/ui/font_symbols.c (100%) rename src/{ui/include => tangara/ui}/fonts.hpp (100%) rename src/{ => tangara}/ui/lvgl_task.cpp (100%) rename src/{ui/include => tangara/ui}/lvgl_task.hpp (100%) rename src/{ => tangara}/ui/modal.cpp (100%) rename src/{ui/include => tangara/ui}/modal.hpp (100%) rename src/{ => tangara}/ui/screen.cpp (100%) rename src/{ui/include => tangara/ui}/screen.hpp (100%) rename src/{ => tangara}/ui/screen_lua.cpp (100%) rename src/{ui/include => tangara/ui}/screen_lua.hpp (100%) rename src/{ => tangara}/ui/screen_splash.cpp (100%) rename src/{ui/include => tangara/ui}/screen_splash.hpp (100%) rename src/{ => tangara}/ui/splash.c (100%) rename src/{ => tangara}/ui/themes.cpp (100%) rename src/{ui/include => tangara/ui}/themes.hpp (100%) rename src/{ui/include => tangara/ui}/ui_events.hpp (100%) rename src/{ => tangara}/ui/ui_fsm.cpp (100%) rename src/{ui/include => tangara/ui}/ui_fsm.hpp (100%) delete mode 100644 src/ui/CMakeLists.txt delete mode 100644 src/ui/icons/battery_20.c delete mode 100644 src/ui/icons/battery_40.c delete mode 100644 src/ui/icons/battery_60.c delete mode 100644 src/ui/icons/battery_80.c delete mode 100644 src/ui/icons/battery_empty.c delete mode 100644 src/ui/icons/battery_full.c delete mode 100644 src/ui/icons/bluetooth.c delete mode 100644 src/ui/icons/pause.c delete mode 100644 src/ui/icons/play.c delete mode 100644 src/ui/include/ui_tick.hpp diff --git a/lib/lvgl/env_support/cmake/esp.cmake b/lib/lvgl/env_support/cmake/esp.cmake index 443fb514..4b4b91da 100644 --- a/lib/lvgl/env_support/cmake/esp.cmake +++ b/lib/lvgl/env_support/cmake/esp.cmake @@ -27,7 +27,6 @@ else() ${LVGL_ROOT_DIR} ${LVGL_ROOT_DIR}/src ${LVGL_ROOT_DIR}/../ - $ENV{PROJ_PATH}/src/ui/include/ REQUIRES esp_timer) target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLV_CONF_INCLUDE_SIMPLE") diff --git a/lib/lvgl/lv_conf.h b/lib/lvgl/lv_conf.h index fdaeb390..9617d253 100644 --- a/lib/lvgl/lv_conf.h +++ b/lib/lvgl/lv_conf.h @@ -87,7 +87,8 @@ *It removes the need to manually update the tick with `lv_tick_inc()`)*/ #define LV_TICK_CUSTOM 1 #if LV_TICK_CUSTOM - #define LV_TICK_CUSTOM_INCLUDE "ui_tick.hpp" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (esp_timer_get_time() / 1000) #endif /*LV_TICK_CUSTOM*/ /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. diff --git a/src/app_console/CMakeLists.txt b/src/app_console/CMakeLists.txt deleted file mode 100644 index 1a2ae8d6..00000000 --- a/src/app_console/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "app_console.cpp" - INCLUDE_DIRS "include" - REQUIRES "dev_console" "events" "database") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt deleted file mode 100644 index 635320f4..00000000 --- a/src/audio/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "audio_decoder.cpp" "fatfs_audio_input.cpp" "i2s_audio_output.cpp" - "track_queue.cpp" "audio_fsm.cpp" "audio_converter.cpp" "resample.cpp" - "fatfs_source.cpp" "bt_audio_output.cpp" "readahead_source.cpp" - "audio_source.cpp" - INCLUDE_DIRS "include" - REQUIRES "codecs" "drivers" "cbor" "result" "tasks" "memory" "tinyfsm" - "database" "system_fsm" "speexdsp" "millershuffle" "libcppbor") - -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/battery/CMakeLists.txt b/src/battery/CMakeLists.txt deleted file mode 100644 index 313a3731..00000000 --- a/src/battery/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "battery.cpp" - INCLUDE_DIRS "include" - REQUIRES "drivers" "events") - -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/database/CMakeLists.txt b/src/database/CMakeLists.txt deleted file mode 100644 index 248ca3d7..00000000 --- a/src/database/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "env_esp.cpp" "database.cpp" "track.cpp" "records.cpp" - "file_gatherer.cpp" "tag_parser.cpp" "index.cpp" - INCLUDE_DIRS "include" - REQUIRES "result" "esp_psram" "fatfs" "libtags" "komihash" "cbor" - "tasks" "memory" "util" "tinyfsm" "events" "opusfile" "libcppbor") - -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) - -set(LEVELDB_BUILD_TESTS OFF) -set(LEVELDB_BUILD_BENCHMARKS OFF) -set(LEVELDB_INSTALL OFF) - -set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) - -add_subdirectory($ENV{PROJ_PATH}/lib/leveldb ${CMAKE_CURRENT_BINARY_DIR}/leveldb) - -target_link_libraries(${COMPONENT_LIB} PUBLIC leveldb) diff --git a/src/dev_console/CMakeLists.txt b/src/dev_console/CMakeLists.txt deleted file mode 100644 index 5555bf61..00000000 --- a/src/dev_console/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "console.cpp" - INCLUDE_DIRS "include" - REQUIRES "console" "memory") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/drivers/CMakeLists.txt b/src/drivers/CMakeLists.txt index c2018d3f..91534edb 100644 --- a/src/drivers/CMakeLists.txt +++ b/src/drivers/CMakeLists.txt @@ -7,6 +7,6 @@ idf_component_register( "i2c.cpp" "bluetooth.cpp" "spi.cpp" "display.cpp" "display_init.cpp" "samd.cpp" "wm8523.cpp" "nvs.cpp" "haptics.cpp" "spiffs.cpp" INCLUDE_DIRS "include" - REQUIRES "esp_adc" "fatfs" "result" "lvgl" "tasks" "nvs_flash" "spiffs" - "bt" "tinyfsm" "util") + REQUIRES "esp_adc" "fatfs" "result" "lvgl" "nvs_flash" "spiffs" "bt" + "tasks" "tinyfsm" "util" "libcppbor") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp index 5d1b35fa..40be530e 100644 --- a/src/drivers/bluetooth.cpp +++ b/src/drivers/bluetooth.cpp @@ -25,7 +25,6 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "freertos/timers.h" -#include "sample.hpp" #include "tinyfsm/include/tinyfsm.hpp" #include "bluetooth_types.hpp" diff --git a/src/drivers/include/nvs.hpp b/src/drivers/include/nvs.hpp index 7c74ceb0..ac1a1096 100644 --- a/src/drivers/include/nvs.hpp +++ b/src/drivers/include/nvs.hpp @@ -15,7 +15,6 @@ #include "bluetooth_types.hpp" #include "lru_cache.hpp" -#include "tasks.hpp" namespace drivers { diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp index c8befe48..0aaf79f0 100644 --- a/src/drivers/nvs.cpp +++ b/src/drivers/nvs.cpp @@ -5,8 +5,6 @@ */ #include "nvs.hpp" -#include -#include #include #include @@ -18,7 +16,6 @@ #include "esp_log.h" #include "nvs.h" #include "nvs_flash.h" -#include "tasks.hpp" #include "wm8523.hpp" namespace drivers { diff --git a/src/events/CMakeLists.txt b/src/events/CMakeLists.txt deleted file mode 100644 index 132c39c7..00000000 --- a/src/events/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "event_queue.cpp" - INCLUDE_DIRS "include" - REQUIRES "tinyfsm" "ui") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/input/CMakeLists.txt b/src/input/CMakeLists.txt deleted file mode 100644 index 4754ba47..00000000 --- a/src/input/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "input_touch_wheel.cpp" "input_touch_dpad.cpp" "input_trigger.cpp" - "input_volume_buttons.cpp" "lvgl_input_driver.cpp" "feedback_haptics.cpp" - "device_factory.cpp" "input_nav_buttons.cpp" "input_hook.cpp" - "input_hook_actions.cpp" - INCLUDE_DIRS "include" - REQUIRES "drivers" "lvgl" "events" "system_fsm") - -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/lua/CMakeLists.txt b/src/lua/CMakeLists.txt deleted file mode 100644 index 0240a50c..00000000 --- a/src/lua/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "lua_theme.cpp" "lua_thread.cpp" "bridge.cpp" "property.cpp" "lua_database.cpp" - "lua_queue.cpp" "lua_version.cpp" "lua_theme.cpp" "lua_controls.cpp" "registry.cpp" - "lua_screen.cpp" - INCLUDE_DIRS "include" - REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" - "esp_timer" "battery" "esp-idf-lua" "luavgl" "lua-linenoise" "lua-term" - "esp_app_format") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt index 3ae92ac2..9019c254 100644 --- a/src/main/CMakeLists.txt +++ b/src/main/CMakeLists.txt @@ -2,8 +2,5 @@ # # SPDX-License-Identifier: GPL-3.0-only -idf_component_register( - SRCS "main.cpp" - INCLUDE_DIRS "." - REQUIRES "audio" "ui" "system_fsm" "events") +idf_component_register(SRCS "main.cpp" INCLUDE_DIRS "." REQUIRES "tangara") target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/system_fsm/CMakeLists.txt b/src/system_fsm/CMakeLists.txt deleted file mode 100644 index e98d4653..00000000 --- a/src/system_fsm/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "system_fsm.cpp" "running.cpp" "booting.cpp" "idle.cpp" - "service_locator.cpp" - INCLUDE_DIRS "include" - REQUIRES "tinyfsm" "drivers" "database" "ui" "result" "events" "audio" - "app_console" "battery" "locale") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/tangara/CMakeLists.txt b/src/tangara/CMakeLists.txt new file mode 100644 index 00000000..6bd648eb --- /dev/null +++ b/src/tangara/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright 2024 jacqueline +# +# SPDX-License-Identifier: GPL-3.0-only + +idf_component_register( + SRC_DIRS "app_console" "audio" "battery" "database" "dev_console" "events" + "input" "lua" "system_fsm" "ui" + INCLUDE_DIRS "." "app_console" "audio" "battery" "database" "dev_console" + "events" "input" "lua" "system_fsm" "ui" + REQUIRES "codecs" "drivers" "locale" "memory" "tasks" "util" + "tinyfsm" "lvgl" "esp_timer" "luavgl" "esp_app_format" "libcppbor" "libtags" + "komihash" "result" "esp_psram" "fatfs" "millershuffle" "speexdsp" "console" + "esp-idf-lua" "lua-linenoise" "lua-term") +target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) + +set(LEVELDB_BUILD_TESTS OFF) +set(LEVELDB_BUILD_BENCHMARKS OFF) +set(LEVELDB_INSTALL OFF) + +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) + +add_subdirectory($ENV{PROJ_PATH}/lib/leveldb ${CMAKE_CURRENT_BINARY_DIR}/leveldb) +target_link_libraries(${COMPONENT_LIB} PUBLIC leveldb) diff --git a/src/app_console/app_console.cpp b/src/tangara/app_console/app_console.cpp similarity index 98% rename from src/app_console/app_console.cpp rename to src/tangara/app_console/app_console.cpp index 7c7c1abc..09f267d8 100644 --- a/src/app_console/app_console.cpp +++ b/src/tangara/app_console/app_console.cpp @@ -4,11 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "app_console.hpp" +#include "app_console/app_console.hpp" #include -#include -#include #include #include @@ -21,11 +19,7 @@ #include #include "FreeRTOSConfig.h" -#include "audio_events.hpp" -#include "audio_fsm.hpp" -#include "bluetooth.hpp" -#include "bluetooth_types.hpp" -#include "database.hpp" + #include "esp_app_desc.h" #include "esp_console.h" #include "esp_err.h" @@ -34,19 +28,25 @@ #include "esp_intr_alloc.h" #include "esp_log.h" #include "esp_system.h" -#include "event_queue.hpp" #include "ff.h" -#include "freertos/FreeRTOSConfig_arch.h" #include "freertos/projdefs.h" + +#include "bluetooth.hpp" +#include "bluetooth_types.hpp" #include "haptics.hpp" -#include "index.hpp" -#include "lua_registry.hpp" #include "memory_resource.hpp" #include "samd.hpp" -#include "service_locator.hpp" -#include "system_events.hpp" -#include "track.hpp" -#include "ui_events.hpp" + +#include "audio/audio_events.hpp" +#include "audio/audio_fsm.hpp" +#include "database/database.hpp" +#include "database/index.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" +#include "lua/lua_registry.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" +#include "ui/ui_events.hpp" namespace console { diff --git a/src/app_console/include/app_console.hpp b/src/tangara/app_console/app_console.hpp similarity index 100% rename from src/app_console/include/app_console.hpp rename to src/tangara/app_console/app_console.hpp diff --git a/src/audio/README.md b/src/tangara/audio/README.md similarity index 100% rename from src/audio/README.md rename to src/tangara/audio/README.md diff --git a/src/audio/audio_converter.cpp b/src/tangara/audio/audio_converter.cpp similarity index 100% rename from src/audio/audio_converter.cpp rename to src/tangara/audio/audio_converter.cpp diff --git a/src/audio/include/audio_converter.hpp b/src/tangara/audio/audio_converter.hpp similarity index 100% rename from src/audio/include/audio_converter.hpp rename to src/tangara/audio/audio_converter.hpp diff --git a/src/audio/audio_decoder.cpp b/src/tangara/audio/audio_decoder.cpp similarity index 99% rename from src/audio/audio_decoder.cpp rename to src/tangara/audio/audio_decoder.cpp index baf17e7a..bf2d3fbe 100644 --- a/src/audio/audio_decoder.cpp +++ b/src/tangara/audio/audio_decoder.cpp @@ -6,20 +6,17 @@ #include "audio_decoder.hpp" -#include -#include - #include #include #include #include +#include #include #include #include #include #include -#include "cbor.h" #include "esp_err.h" #include "esp_heap_caps.h" #include "esp_log.h" @@ -27,7 +24,6 @@ #include "freertos/projdefs.h" #include "freertos/queue.h" #include "freertos/ringbuf.h" -#include "i2s_dac.hpp" #include "audio_converter.hpp" #include "audio_events.hpp" @@ -37,6 +33,7 @@ #include "codec.hpp" #include "event_queue.hpp" #include "fatfs_audio_input.hpp" +#include "i2s_dac.hpp" #include "sample.hpp" #include "tasks.hpp" #include "track.hpp" diff --git a/src/audio/include/audio_decoder.hpp b/src/tangara/audio/audio_decoder.hpp similarity index 100% rename from src/audio/include/audio_decoder.hpp rename to src/tangara/audio/audio_decoder.hpp diff --git a/src/audio/include/audio_events.hpp b/src/tangara/audio/audio_events.hpp similarity index 100% rename from src/audio/include/audio_events.hpp rename to src/tangara/audio/audio_events.hpp diff --git a/src/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp similarity index 100% rename from src/audio/audio_fsm.cpp rename to src/tangara/audio/audio_fsm.cpp diff --git a/src/audio/include/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp similarity index 100% rename from src/audio/include/audio_fsm.hpp rename to src/tangara/audio/audio_fsm.hpp diff --git a/src/audio/include/audio_sink.hpp b/src/tangara/audio/audio_sink.hpp similarity index 100% rename from src/audio/include/audio_sink.hpp rename to src/tangara/audio/audio_sink.hpp diff --git a/src/audio/audio_source.cpp b/src/tangara/audio/audio_source.cpp similarity index 100% rename from src/audio/audio_source.cpp rename to src/tangara/audio/audio_source.cpp diff --git a/src/audio/include/audio_source.hpp b/src/tangara/audio/audio_source.hpp similarity index 100% rename from src/audio/include/audio_source.hpp rename to src/tangara/audio/audio_source.hpp diff --git a/src/audio/bt_audio_output.cpp b/src/tangara/audio/bt_audio_output.cpp similarity index 100% rename from src/audio/bt_audio_output.cpp rename to src/tangara/audio/bt_audio_output.cpp diff --git a/src/audio/include/bt_audio_output.hpp b/src/tangara/audio/bt_audio_output.hpp similarity index 100% rename from src/audio/include/bt_audio_output.hpp rename to src/tangara/audio/bt_audio_output.hpp diff --git a/src/audio/fatfs_audio_input.cpp b/src/tangara/audio/fatfs_audio_input.cpp similarity index 100% rename from src/audio/fatfs_audio_input.cpp rename to src/tangara/audio/fatfs_audio_input.cpp diff --git a/src/audio/include/fatfs_audio_input.hpp b/src/tangara/audio/fatfs_audio_input.hpp similarity index 100% rename from src/audio/include/fatfs_audio_input.hpp rename to src/tangara/audio/fatfs_audio_input.hpp diff --git a/src/audio/fatfs_source.cpp b/src/tangara/audio/fatfs_source.cpp similarity index 100% rename from src/audio/fatfs_source.cpp rename to src/tangara/audio/fatfs_source.cpp diff --git a/src/audio/include/fatfs_source.hpp b/src/tangara/audio/fatfs_source.hpp similarity index 100% rename from src/audio/include/fatfs_source.hpp rename to src/tangara/audio/fatfs_source.hpp diff --git a/src/audio/i2s_audio_output.cpp b/src/tangara/audio/i2s_audio_output.cpp similarity index 100% rename from src/audio/i2s_audio_output.cpp rename to src/tangara/audio/i2s_audio_output.cpp diff --git a/src/audio/include/i2s_audio_output.hpp b/src/tangara/audio/i2s_audio_output.hpp similarity index 100% rename from src/audio/include/i2s_audio_output.hpp rename to src/tangara/audio/i2s_audio_output.hpp diff --git a/src/audio/readahead_source.cpp b/src/tangara/audio/readahead_source.cpp similarity index 100% rename from src/audio/readahead_source.cpp rename to src/tangara/audio/readahead_source.cpp diff --git a/src/audio/include/readahead_source.hpp b/src/tangara/audio/readahead_source.hpp similarity index 100% rename from src/audio/include/readahead_source.hpp rename to src/tangara/audio/readahead_source.hpp diff --git a/src/audio/resample.cpp b/src/tangara/audio/resample.cpp similarity index 100% rename from src/audio/resample.cpp rename to src/tangara/audio/resample.cpp diff --git a/src/audio/include/resample.hpp b/src/tangara/audio/resample.hpp similarity index 100% rename from src/audio/include/resample.hpp rename to src/tangara/audio/resample.hpp diff --git a/src/audio/test/CMakeLists.txt b/src/tangara/audio/test/CMakeLists.txt similarity index 100% rename from src/audio/test/CMakeLists.txt rename to src/tangara/audio/test/CMakeLists.txt diff --git a/src/audio/track_queue.cpp b/src/tangara/audio/track_queue.cpp similarity index 100% rename from src/audio/track_queue.cpp rename to src/tangara/audio/track_queue.cpp diff --git a/src/audio/include/track_queue.hpp b/src/tangara/audio/track_queue.hpp similarity index 100% rename from src/audio/include/track_queue.hpp rename to src/tangara/audio/track_queue.hpp diff --git a/src/battery/battery.cpp b/src/tangara/battery/battery.cpp similarity index 100% rename from src/battery/battery.cpp rename to src/tangara/battery/battery.cpp diff --git a/src/battery/include/battery.hpp b/src/tangara/battery/battery.hpp similarity index 100% rename from src/battery/include/battery.hpp rename to src/tangara/battery/battery.hpp diff --git a/src/database/database.cpp b/src/tangara/database/database.cpp similarity index 100% rename from src/database/database.cpp rename to src/tangara/database/database.cpp diff --git a/src/database/include/database.hpp b/src/tangara/database/database.hpp similarity index 100% rename from src/database/include/database.hpp rename to src/tangara/database/database.hpp diff --git a/src/database/include/db_events.hpp b/src/tangara/database/db_events.hpp similarity index 100% rename from src/database/include/db_events.hpp rename to src/tangara/database/db_events.hpp diff --git a/src/database/env_esp.cpp b/src/tangara/database/env_esp.cpp similarity index 100% rename from src/database/env_esp.cpp rename to src/tangara/database/env_esp.cpp diff --git a/src/database/include/env_esp.hpp b/src/tangara/database/env_esp.hpp similarity index 100% rename from src/database/include/env_esp.hpp rename to src/tangara/database/env_esp.hpp diff --git a/src/database/file_gatherer.cpp b/src/tangara/database/file_gatherer.cpp similarity index 100% rename from src/database/file_gatherer.cpp rename to src/tangara/database/file_gatherer.cpp diff --git a/src/database/include/file_gatherer.hpp b/src/tangara/database/file_gatherer.hpp similarity index 100% rename from src/database/include/file_gatherer.hpp rename to src/tangara/database/file_gatherer.hpp diff --git a/src/database/include/future_fetcher.hpp b/src/tangara/database/future_fetcher.hpp similarity index 100% rename from src/database/include/future_fetcher.hpp rename to src/tangara/database/future_fetcher.hpp diff --git a/src/database/index.cpp b/src/tangara/database/index.cpp similarity index 100% rename from src/database/index.cpp rename to src/tangara/database/index.cpp diff --git a/src/database/include/index.hpp b/src/tangara/database/index.hpp similarity index 100% rename from src/database/include/index.hpp rename to src/tangara/database/index.hpp diff --git a/src/database/records.cpp b/src/tangara/database/records.cpp similarity index 100% rename from src/database/records.cpp rename to src/tangara/database/records.cpp diff --git a/src/database/include/records.hpp b/src/tangara/database/records.hpp similarity index 100% rename from src/database/include/records.hpp rename to src/tangara/database/records.hpp diff --git a/src/database/tag_parser.cpp b/src/tangara/database/tag_parser.cpp similarity index 100% rename from src/database/tag_parser.cpp rename to src/tangara/database/tag_parser.cpp diff --git a/src/database/include/tag_parser.hpp b/src/tangara/database/tag_parser.hpp similarity index 100% rename from src/database/include/tag_parser.hpp rename to src/tangara/database/tag_parser.hpp diff --git a/src/database/test/CMakeLists.txt b/src/tangara/database/test/CMakeLists.txt similarity index 100% rename from src/database/test/CMakeLists.txt rename to src/tangara/database/test/CMakeLists.txt diff --git a/src/database/test/test_database.cpp b/src/tangara/database/test/test_database.cpp similarity index 100% rename from src/database/test/test_database.cpp rename to src/tangara/database/test/test_database.cpp diff --git a/src/database/test/test_records.cpp b/src/tangara/database/test/test_records.cpp similarity index 100% rename from src/database/test/test_records.cpp rename to src/tangara/database/test/test_records.cpp diff --git a/src/database/track.cpp b/src/tangara/database/track.cpp similarity index 100% rename from src/database/track.cpp rename to src/tangara/database/track.cpp diff --git a/src/database/include/track.hpp b/src/tangara/database/track.hpp similarity index 100% rename from src/database/include/track.hpp rename to src/tangara/database/track.hpp diff --git a/src/dev_console/console.cpp b/src/tangara/dev_console/console.cpp similarity index 100% rename from src/dev_console/console.cpp rename to src/tangara/dev_console/console.cpp diff --git a/src/dev_console/include/console.hpp b/src/tangara/dev_console/console.hpp similarity index 100% rename from src/dev_console/include/console.hpp rename to src/tangara/dev_console/console.hpp diff --git a/src/events/event_queue.cpp b/src/tangara/events/event_queue.cpp similarity index 96% rename from src/events/event_queue.cpp rename to src/tangara/events/event_queue.cpp index d3a62ef6..f8f5b1ee 100644 --- a/src/events/event_queue.cpp +++ b/src/tangara/events/event_queue.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "audio_fsm.hpp" #include "freertos/FreeRTOS.h" diff --git a/src/events/include/event_queue.hpp b/src/tangara/events/event_queue.hpp similarity index 100% rename from src/events/include/event_queue.hpp rename to src/tangara/events/event_queue.hpp diff --git a/src/input/device_factory.cpp b/src/tangara/input/device_factory.cpp similarity index 100% rename from src/input/device_factory.cpp rename to src/tangara/input/device_factory.cpp diff --git a/src/input/include/device_factory.hpp b/src/tangara/input/device_factory.hpp similarity index 100% rename from src/input/include/device_factory.hpp rename to src/tangara/input/device_factory.hpp diff --git a/src/input/include/feedback_device.hpp b/src/tangara/input/feedback_device.hpp similarity index 100% rename from src/input/include/feedback_device.hpp rename to src/tangara/input/feedback_device.hpp diff --git a/src/input/feedback_haptics.cpp b/src/tangara/input/feedback_haptics.cpp similarity index 94% rename from src/input/feedback_haptics.cpp rename to src/tangara/input/feedback_haptics.cpp index 5e83d0d6..90a912ec 100644 --- a/src/input/feedback_haptics.cpp +++ b/src/tangara/input/feedback_haptics.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "feedback_haptics.hpp" +#include "input/feedback_haptics.hpp" #include diff --git a/src/input/include/feedback_haptics.hpp b/src/tangara/input/feedback_haptics.hpp similarity index 100% rename from src/input/include/feedback_haptics.hpp rename to src/tangara/input/feedback_haptics.hpp diff --git a/src/input/include/input_device.hpp b/src/tangara/input/input_device.hpp similarity index 100% rename from src/input/include/input_device.hpp rename to src/tangara/input/input_device.hpp diff --git a/src/input/input_hook.cpp b/src/tangara/input/input_hook.cpp similarity index 96% rename from src/input/input_hook.cpp rename to src/tangara/input/input_hook.cpp index bf9f3596..d346b863 100644 --- a/src/input/input_hook.cpp +++ b/src/tangara/input/input_hook.cpp @@ -4,13 +4,15 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_hook.hpp" +#include "input/input_hook.hpp" #include #include + #include "hal/lv_hal_indev.h" -#include "input_trigger.hpp" -#include "lua.h" +#include "lua.hpp" + +#include "input/input_trigger.hpp" namespace input { diff --git a/src/input/include/input_hook.hpp b/src/tangara/input/input_hook.hpp similarity index 100% rename from src/input/include/input_hook.hpp rename to src/tangara/input/input_hook.hpp diff --git a/src/input/input_hook_actions.cpp b/src/tangara/input/input_hook_actions.cpp similarity index 95% rename from src/input/input_hook_actions.cpp rename to src/tangara/input/input_hook_actions.cpp index 26075c4c..bc3760ac 100644 --- a/src/input/input_hook_actions.cpp +++ b/src/tangara/input/input_hook_actions.cpp @@ -4,14 +4,14 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_hook_actions.hpp" +#include "input/input_hook_actions.hpp" #include #include "hal/lv_hal_indev.h" -#include "event_queue.hpp" -#include "ui_events.hpp" +#include "events/event_queue.hpp" +#include "ui/ui_events.hpp" namespace input { namespace actions { diff --git a/src/input/include/input_hook_actions.hpp b/src/tangara/input/input_hook_actions.hpp similarity index 100% rename from src/input/include/input_hook_actions.hpp rename to src/tangara/input/input_hook_actions.hpp diff --git a/src/input/input_nav_buttons.cpp b/src/tangara/input/input_nav_buttons.cpp similarity index 100% rename from src/input/input_nav_buttons.cpp rename to src/tangara/input/input_nav_buttons.cpp diff --git a/src/input/include/input_nav_buttons.hpp b/src/tangara/input/input_nav_buttons.hpp similarity index 100% rename from src/input/include/input_nav_buttons.hpp rename to src/tangara/input/input_nav_buttons.hpp diff --git a/src/input/input_touch_dpad.cpp b/src/tangara/input/input_touch_dpad.cpp similarity index 89% rename from src/input/input_touch_dpad.cpp rename to src/tangara/input/input_touch_dpad.cpp index df17d766..f7e12fc5 100644 --- a/src/input/input_touch_dpad.cpp +++ b/src/tangara/input/input_touch_dpad.cpp @@ -4,19 +4,20 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_touch_dpad.hpp" +#include "input/input_touch_dpad.hpp" #include #include "hal/lv_hal_indev.h" -#include "event_queue.hpp" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook_actions.hpp" -#include "input_touch_dpad.hpp" #include "touchwheel.hpp" +#include "events/event_queue.hpp" +#include "input/input_device.hpp" +#include "input/input_hook_actions.hpp" +#include "input/input_touch_dpad.hpp" + namespace input { TouchDPad::TouchDPad(drivers::TouchWheel& wheel) diff --git a/src/input/include/input_touch_dpad.hpp b/src/tangara/input/input_touch_dpad.hpp similarity index 100% rename from src/input/include/input_touch_dpad.hpp rename to src/tangara/input/input_touch_dpad.hpp diff --git a/src/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp similarity index 98% rename from src/input/input_touch_wheel.cpp rename to src/tangara/input/input_touch_wheel.cpp index 41fd73bc..e6a3b880 100644 --- a/src/input/input_touch_wheel.cpp +++ b/src/tangara/input/input_touch_wheel.cpp @@ -4,14 +4,14 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_touch_wheel.hpp" +#include "input/input_touch_wheel.hpp" #include #include #include "hal/lv_hal_indev.h" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "haptics.hpp" #include "input_device.hpp" #include "input_hook_actions.hpp" diff --git a/src/input/include/input_touch_wheel.hpp b/src/tangara/input/input_touch_wheel.hpp similarity index 100% rename from src/input/include/input_touch_wheel.hpp rename to src/tangara/input/input_touch_wheel.hpp diff --git a/src/input/input_trigger.cpp b/src/tangara/input/input_trigger.cpp similarity index 97% rename from src/input/input_trigger.cpp rename to src/tangara/input/input_trigger.cpp index 00d4a32d..11b4dbe9 100644 --- a/src/input/input_trigger.cpp +++ b/src/tangara/input/input_trigger.cpp @@ -4,10 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_trigger.hpp" -#include +#include "input/input_trigger.hpp" #include + #include "esp_timer.h" namespace input { diff --git a/src/input/include/input_trigger.hpp b/src/tangara/input/input_trigger.hpp similarity index 100% rename from src/input/include/input_trigger.hpp rename to src/tangara/input/input_trigger.hpp diff --git a/src/input/input_volume_buttons.cpp b/src/tangara/input/input_volume_buttons.cpp similarity index 100% rename from src/input/input_volume_buttons.cpp rename to src/tangara/input/input_volume_buttons.cpp diff --git a/src/input/include/input_volume_buttons.hpp b/src/tangara/input/input_volume_buttons.hpp similarity index 100% rename from src/input/include/input_volume_buttons.hpp rename to src/tangara/input/input_volume_buttons.hpp diff --git a/src/input/lvgl_input_driver.cpp b/src/tangara/input/lvgl_input_driver.cpp similarity index 95% rename from src/input/lvgl_input_driver.cpp rename to src/tangara/input/lvgl_input_driver.cpp index a82b7438..1cd7167b 100644 --- a/src/input/lvgl_input_driver.cpp +++ b/src/tangara/input/lvgl_input_driver.cpp @@ -4,25 +4,25 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lvgl_input_driver.hpp" -#include +#include "input/lvgl_input_driver.hpp" #include #include #include -#include "device_factory.hpp" -#include "feedback_haptics.hpp" -#include "input_hook.hpp" -#include "input_touch_wheel.hpp" -#include "input_trigger.hpp" -#include "input_volume_buttons.hpp" -#include "lauxlib.h" -#include "lua.h" -#include "lua_thread.hpp" +#include "lua.hpp" #include "lvgl.h" + #include "nvs.hpp" -#include "property.hpp" + +#include "input/device_factory.hpp" +#include "input/feedback_haptics.hpp" +#include "input/input_hook.hpp" +#include "input/input_touch_wheel.hpp" +#include "input/input_trigger.hpp" +#include "input/input_volume_buttons.hpp" +#include "lua/lua_thread.hpp" +#include "lua/property.hpp" [[maybe_unused]] static constexpr char kTag[] = "input"; diff --git a/src/input/include/lvgl_input_driver.hpp b/src/tangara/input/lvgl_input_driver.hpp similarity index 100% rename from src/input/include/lvgl_input_driver.hpp rename to src/tangara/input/lvgl_input_driver.hpp diff --git a/src/lua/bridge.cpp b/src/tangara/lua/bridge.cpp similarity index 100% rename from src/lua/bridge.cpp rename to src/tangara/lua/bridge.cpp diff --git a/src/lua/include/bridge.hpp b/src/tangara/lua/bridge.hpp similarity index 100% rename from src/lua/include/bridge.hpp rename to src/tangara/lua/bridge.hpp diff --git a/src/lua/lua_controls.cpp b/src/tangara/lua/lua_controls.cpp similarity index 100% rename from src/lua/lua_controls.cpp rename to src/tangara/lua/lua_controls.cpp diff --git a/src/lua/include/lua_controls.hpp b/src/tangara/lua/lua_controls.hpp similarity index 100% rename from src/lua/include/lua_controls.hpp rename to src/tangara/lua/lua_controls.hpp diff --git a/src/lua/lua_database.cpp b/src/tangara/lua/lua_database.cpp similarity index 100% rename from src/lua/lua_database.cpp rename to src/tangara/lua/lua_database.cpp diff --git a/src/lua/include/lua_database.hpp b/src/tangara/lua/lua_database.hpp similarity index 100% rename from src/lua/include/lua_database.hpp rename to src/tangara/lua/lua_database.hpp diff --git a/src/lua/lua_queue.cpp b/src/tangara/lua/lua_queue.cpp similarity index 100% rename from src/lua/lua_queue.cpp rename to src/tangara/lua/lua_queue.cpp diff --git a/src/lua/include/lua_queue.hpp b/src/tangara/lua/lua_queue.hpp similarity index 100% rename from src/lua/include/lua_queue.hpp rename to src/tangara/lua/lua_queue.hpp diff --git a/src/lua/include/lua_registry.hpp b/src/tangara/lua/lua_registry.hpp similarity index 100% rename from src/lua/include/lua_registry.hpp rename to src/tangara/lua/lua_registry.hpp diff --git a/src/lua/lua_screen.cpp b/src/tangara/lua/lua_screen.cpp similarity index 100% rename from src/lua/lua_screen.cpp rename to src/tangara/lua/lua_screen.cpp diff --git a/src/lua/include/lua_screen.hpp b/src/tangara/lua/lua_screen.hpp similarity index 100% rename from src/lua/include/lua_screen.hpp rename to src/tangara/lua/lua_screen.hpp diff --git a/src/lua/lua_theme.cpp b/src/tangara/lua/lua_theme.cpp similarity index 100% rename from src/lua/lua_theme.cpp rename to src/tangara/lua/lua_theme.cpp diff --git a/src/lua/include/lua_theme.hpp b/src/tangara/lua/lua_theme.hpp similarity index 100% rename from src/lua/include/lua_theme.hpp rename to src/tangara/lua/lua_theme.hpp diff --git a/src/lua/lua_thread.cpp b/src/tangara/lua/lua_thread.cpp similarity index 100% rename from src/lua/lua_thread.cpp rename to src/tangara/lua/lua_thread.cpp diff --git a/src/lua/include/lua_thread.hpp b/src/tangara/lua/lua_thread.hpp similarity index 100% rename from src/lua/include/lua_thread.hpp rename to src/tangara/lua/lua_thread.hpp diff --git a/src/lua/lua_version.cpp b/src/tangara/lua/lua_version.cpp similarity index 100% rename from src/lua/lua_version.cpp rename to src/tangara/lua/lua_version.cpp diff --git a/src/lua/include/lua_version.hpp b/src/tangara/lua/lua_version.hpp similarity index 100% rename from src/lua/include/lua_version.hpp rename to src/tangara/lua/lua_version.hpp diff --git a/src/lua/property.cpp b/src/tangara/lua/property.cpp similarity index 100% rename from src/lua/property.cpp rename to src/tangara/lua/property.cpp diff --git a/src/lua/include/property.hpp b/src/tangara/lua/property.hpp similarity index 100% rename from src/lua/include/property.hpp rename to src/tangara/lua/property.hpp diff --git a/src/lua/registry.cpp b/src/tangara/lua/registry.cpp similarity index 100% rename from src/lua/registry.cpp rename to src/tangara/lua/registry.cpp diff --git a/src/system_fsm/booting.cpp b/src/tangara/system_fsm/booting.cpp similarity index 100% rename from src/system_fsm/booting.cpp rename to src/tangara/system_fsm/booting.cpp diff --git a/src/system_fsm/idle.cpp b/src/tangara/system_fsm/idle.cpp similarity index 100% rename from src/system_fsm/idle.cpp rename to src/tangara/system_fsm/idle.cpp diff --git a/src/system_fsm/running.cpp b/src/tangara/system_fsm/running.cpp similarity index 100% rename from src/system_fsm/running.cpp rename to src/tangara/system_fsm/running.cpp diff --git a/src/system_fsm/service_locator.cpp b/src/tangara/system_fsm/service_locator.cpp similarity index 100% rename from src/system_fsm/service_locator.cpp rename to src/tangara/system_fsm/service_locator.cpp diff --git a/src/system_fsm/include/service_locator.hpp b/src/tangara/system_fsm/service_locator.hpp similarity index 100% rename from src/system_fsm/include/service_locator.hpp rename to src/tangara/system_fsm/service_locator.hpp diff --git a/src/system_fsm/include/system_events.hpp b/src/tangara/system_fsm/system_events.hpp similarity index 100% rename from src/system_fsm/include/system_events.hpp rename to src/tangara/system_fsm/system_events.hpp diff --git a/src/system_fsm/system_fsm.cpp b/src/tangara/system_fsm/system_fsm.cpp similarity index 100% rename from src/system_fsm/system_fsm.cpp rename to src/tangara/system_fsm/system_fsm.cpp diff --git a/src/system_fsm/include/system_fsm.hpp b/src/tangara/system_fsm/system_fsm.hpp similarity index 100% rename from src/system_fsm/include/system_fsm.hpp rename to src/tangara/system_fsm/system_fsm.hpp diff --git a/src/ui/font_fusion_10.c b/src/tangara/ui/font_fusion_10.c similarity index 100% rename from src/ui/font_fusion_10.c rename to src/tangara/ui/font_fusion_10.c diff --git a/src/ui/font_fusion_12.c b/src/tangara/ui/font_fusion_12.c similarity index 100% rename from src/ui/font_fusion_12.c rename to src/tangara/ui/font_fusion_12.c diff --git a/src/ui/font_symbols.c b/src/tangara/ui/font_symbols.c similarity index 100% rename from src/ui/font_symbols.c rename to src/tangara/ui/font_symbols.c diff --git a/src/ui/include/fonts.hpp b/src/tangara/ui/fonts.hpp similarity index 100% rename from src/ui/include/fonts.hpp rename to src/tangara/ui/fonts.hpp diff --git a/src/ui/lvgl_task.cpp b/src/tangara/ui/lvgl_task.cpp similarity index 100% rename from src/ui/lvgl_task.cpp rename to src/tangara/ui/lvgl_task.cpp diff --git a/src/ui/include/lvgl_task.hpp b/src/tangara/ui/lvgl_task.hpp similarity index 100% rename from src/ui/include/lvgl_task.hpp rename to src/tangara/ui/lvgl_task.hpp diff --git a/src/ui/modal.cpp b/src/tangara/ui/modal.cpp similarity index 100% rename from src/ui/modal.cpp rename to src/tangara/ui/modal.cpp diff --git a/src/ui/include/modal.hpp b/src/tangara/ui/modal.hpp similarity index 100% rename from src/ui/include/modal.hpp rename to src/tangara/ui/modal.hpp diff --git a/src/ui/screen.cpp b/src/tangara/ui/screen.cpp similarity index 100% rename from src/ui/screen.cpp rename to src/tangara/ui/screen.cpp diff --git a/src/ui/include/screen.hpp b/src/tangara/ui/screen.hpp similarity index 100% rename from src/ui/include/screen.hpp rename to src/tangara/ui/screen.hpp diff --git a/src/ui/screen_lua.cpp b/src/tangara/ui/screen_lua.cpp similarity index 100% rename from src/ui/screen_lua.cpp rename to src/tangara/ui/screen_lua.cpp diff --git a/src/ui/include/screen_lua.hpp b/src/tangara/ui/screen_lua.hpp similarity index 100% rename from src/ui/include/screen_lua.hpp rename to src/tangara/ui/screen_lua.hpp diff --git a/src/ui/screen_splash.cpp b/src/tangara/ui/screen_splash.cpp similarity index 100% rename from src/ui/screen_splash.cpp rename to src/tangara/ui/screen_splash.cpp diff --git a/src/ui/include/screen_splash.hpp b/src/tangara/ui/screen_splash.hpp similarity index 100% rename from src/ui/include/screen_splash.hpp rename to src/tangara/ui/screen_splash.hpp diff --git a/src/ui/splash.c b/src/tangara/ui/splash.c similarity index 100% rename from src/ui/splash.c rename to src/tangara/ui/splash.c diff --git a/src/ui/themes.cpp b/src/tangara/ui/themes.cpp similarity index 100% rename from src/ui/themes.cpp rename to src/tangara/ui/themes.cpp diff --git a/src/ui/include/themes.hpp b/src/tangara/ui/themes.hpp similarity index 100% rename from src/ui/include/themes.hpp rename to src/tangara/ui/themes.hpp diff --git a/src/ui/include/ui_events.hpp b/src/tangara/ui/ui_events.hpp similarity index 100% rename from src/ui/include/ui_events.hpp rename to src/tangara/ui/ui_events.hpp diff --git a/src/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp similarity index 100% rename from src/ui/ui_fsm.cpp rename to src/tangara/ui/ui_fsm.cpp diff --git a/src/ui/include/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp similarity index 100% rename from src/ui/include/ui_fsm.hpp rename to src/tangara/ui/ui_fsm.hpp diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt deleted file mode 100644 index 3814e9d5..00000000 --- a/src/ui/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright 2023 jacqueline -# -# SPDX-License-Identifier: GPL-3.0-only - -idf_component_register( - SRCS "lvgl_task.cpp" "ui_fsm.cpp" "screen_splash.cpp" "themes.cpp" - "screen.cpp" "modal.cpp" "screen_lua.cpp" "splash.c" "font_fusion_12.c" - "font_fusion_10.c" - INCLUDE_DIRS "include" - REQUIRES "drivers" "lvgl" "tinyfsm" "events" "system_fsm" "database" "esp_timer" "battery" "lua" "luavgl" "esp_app_format" "input") -target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) diff --git a/src/ui/icons/battery_20.c b/src/ui/icons/battery_20.c deleted file mode 100644 index 3be6b614..00000000 --- a/src/ui/icons/battery_20.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_20 -#define LV_ATTRIBUTE_IMG_BATTERY_20 -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_20 uint8_t battery_20_map[] = { - 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ - 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ - 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ - 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ - - 0x55, 0x00, 0x55, - 0x54, 0x00, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0x00, 0x15, -}; - -const lv_img_dsc_t kIconBattery20 = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_20_map, -}; diff --git a/src/ui/icons/battery_40.c b/src/ui/icons/battery_40.c deleted file mode 100644 index 4a6ead0c..00000000 --- a/src/ui/icons/battery_40.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_40 -#define LV_ATTRIBUTE_IMG_BATTERY_40 -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_40 uint8_t battery_40_map[] = { - 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ - 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ - 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ - 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ - - 0x55, 0x00, 0x55, - 0x54, 0x00, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0x00, 0x15, -}; - -const lv_img_dsc_t kIconBattery40 = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_40_map, -}; diff --git a/src/ui/icons/battery_60.c b/src/ui/icons/battery_60.c deleted file mode 100644 index 4695cb73..00000000 --- a/src/ui/icons/battery_60.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_60 -#define LV_ATTRIBUTE_IMG_BATTERY_60 -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_60 uint8_t battery_60_map[] = { - 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ - 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ - 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ - 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ - - 0x55, 0x00, 0x55, - 0x54, 0x00, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0x00, 0x15, -}; - -const lv_img_dsc_t kIconBattery60 = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_60_map, -}; diff --git a/src/ui/icons/battery_80.c b/src/ui/icons/battery_80.c deleted file mode 100644 index e0b60dfe..00000000 --- a/src/ui/icons/battery_80.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_80 -#define LV_ATTRIBUTE_IMG_BATTERY_80 -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_80 uint8_t battery_80_map[] = { - 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ - 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ - 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ - 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ - - 0x55, 0x00, 0x55, - 0x54, 0x00, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0x55, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0x00, 0x15, -}; - -const lv_img_dsc_t kIconBattery80 = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_80_map, -}; diff --git a/src/ui/icons/battery_empty.c b/src/ui/icons/battery_empty.c deleted file mode 100644 index 26f84863..00000000 --- a/src/ui/icons/battery_empty.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_EMPTY -#define LV_ATTRIBUTE_IMG_BATTERY_EMPTY -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_EMPTY uint8_t battery_empty_map[] = { - 0xfd, 0xfd, 0xfd, 0xff, /*Color of index 0*/ - 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ - 0x26, 0x2c, 0xfa, 0xff, /*Color of index 2*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ - - 0x00, 0x55, 0x00, - 0x01, 0x55, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0x00, 0x40, - 0x01, 0xaa, 0x40, - 0x01, 0xaa, 0x40, - 0x01, 0x55, 0x40, -}; - -const lv_img_dsc_t kIconBatteryEmpty = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_empty_map, -}; diff --git a/src/ui/icons/battery_full.c b/src/ui/icons/battery_full.c deleted file mode 100644 index 1e3b17e3..00000000 --- a/src/ui/icons/battery_full.c +++ /dev/null @@ -1,52 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BATTERY_FULL -#define LV_ATTRIBUTE_IMG_BATTERY_FULL -#endif - -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATTERY_FULL uint8_t battery_full_map[] = { - 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ - 0xfd, 0xfe, 0xfd, 0xff, /*Color of index 1*/ - 0x26, 0xc1, 0x38, 0xff, /*Color of index 2*/ - 0x01, 0xbe, 0x37, 0xff, /*Color of index 3*/ - - 0x55, 0x00, 0x55, - 0x54, 0x00, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xaa, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0xff, 0x15, - 0x54, 0x00, 0x15, -}; - -const lv_img_dsc_t kIconBatteryFull = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 12, - .header.h = 12, - .data_size = 52, - .data = battery_full_map, -}; diff --git a/src/ui/icons/bluetooth.c b/src/ui/icons/bluetooth.c deleted file mode 100644 index 66322f8f..00000000 --- a/src/ui/icons/bluetooth.c +++ /dev/null @@ -1,54 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH -#define LV_ATTRIBUTE_IMG_BLUETOOTH -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH uint8_t bluetooth_map[] = { - 0xfe, 0xfe, 0xfe, 0xff, /*Color of index 0*/ - 0xff, 0x75, 0x00, 0xff, /*Color of index 1*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 2*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ - - 0x00, 0x55, 0x40, 0x00, - 0x01, 0x51, 0x50, 0x00, - 0x05, 0x50, 0x54, 0x00, - 0x05, 0x51, 0x14, 0x00, - 0x05, 0x11, 0x04, 0x00, - 0x15, 0x40, 0x15, 0x00, - 0x15, 0x50, 0x55, 0x00, - 0x15, 0x40, 0x15, 0x00, - 0x05, 0x11, 0x04, 0x00, - 0x05, 0x51, 0x14, 0x00, - 0x05, 0x50, 0x54, 0x00, - 0x01, 0x51, 0x50, 0x00, - 0x00, 0x55, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t kIconBluetooth = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 14, - .header.h = 14, - .data_size = 72, - .data = bluetooth_map, -}; diff --git a/src/ui/icons/pause.c b/src/ui/icons/pause.c deleted file mode 100644 index 8201b5bb..00000000 --- a/src/ui/icons/pause.c +++ /dev/null @@ -1,54 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_PAUSE -#define LV_ATTRIBUTE_IMG_PAUSE -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_PAUSE uint8_t pause_map[] = { - 0xfe, 0xfe, 0xfe, 0xff, /*Color of index 0*/ - 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 2*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ - - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x50, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t kIconPause = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 14, - .header.h = 14, - .data_size = 72, - .data = pause_map, -}; diff --git a/src/ui/icons/play.c b/src/ui/icons/play.c deleted file mode 100644 index 8984eae4..00000000 --- a/src/ui/icons/play.c +++ /dev/null @@ -1,54 +0,0 @@ -#ifdef __has_include - #if __has_include("lvgl.h") - #ifndef LV_LVGL_H_INCLUDE_SIMPLE - #define LV_LVGL_H_INCLUDE_SIMPLE - #endif - #endif -#endif - -#if defined(LV_LVGL_H_INCLUDE_SIMPLE) - #include "lvgl.h" -#else - #include "lvgl/lvgl.h" -#endif - - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -#ifndef LV_ATTRIBUTE_IMG_PLAY -#define LV_ATTRIBUTE_IMG_PLAY -#endif - -static const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_PLAY uint8_t play_map[] = { - 0xfe, 0xfe, 0xfe, 0xff, /*Color of index 0*/ - 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 2*/ - 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ - - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, - 0x00, 0x55, 0x00, 0x00, - 0x00, 0x55, 0x50, 0x00, - 0x00, 0x55, 0x54, 0x00, - 0x00, 0x55, 0x54, 0x00, - 0x00, 0x55, 0x50, 0x00, - 0x00, 0x55, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, -}; - -const lv_img_dsc_t kIconPlay = { - .header.cf = LV_IMG_CF_INDEXED_2BIT, - .header.always_zero = 0, - .header.reserved = 0, - .header.w = 14, - .header.h = 14, - .data_size = 72, - .data = play_map, -}; diff --git a/src/ui/include/ui_tick.hpp b/src/ui/include/ui_tick.hpp deleted file mode 100644 index 37f8a8bd..00000000 --- a/src/ui/include/ui_tick.hpp +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2023 jacqueline - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#pragma once - -#include "esp_timer.h" - -#define LV_TICK_CUSTOM_SYS_TIME_EXPR (esp_timer_get_time() / 1000) diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index e1913920..49554be8 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -2,4 +2,4 @@ # # SPDX-License-Identifier: GPL-3.0-only -idf_component_register(SRCS INCLUDE_DIRS "include" REQUIRES "database") +idf_component_register(SRCS INCLUDE_DIRS "include" REQUIRES "memory") From 7d7f7755d17e1e0a2348d75d797097f166b70471 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 21:41:56 +1000 Subject: [PATCH 06/15] start moving include files into subdirs --- src/main/main.cpp | 12 ++--- src/tangara/CMakeLists.txt | 3 +- src/tangara/app_console/app_console.hpp | 8 ++-- src/tangara/audio/audio_converter.cpp | 10 ++--- src/tangara/audio/audio_converter.hpp | 8 ++-- src/tangara/audio/audio_decoder.cpp | 20 ++++----- src/tangara/audio/audio_decoder.hpp | 10 ++--- src/tangara/audio/audio_events.hpp | 4 +- src/tangara/audio/audio_fsm.cpp | 28 ++++++------ src/tangara/audio/audio_fsm.hpp | 28 ++++++------ src/tangara/audio/audio_source.cpp | 8 +++- src/tangara/audio/audio_source.hpp | 5 +-- src/tangara/audio/bt_audio_output.cpp | 2 +- src/tangara/audio/bt_audio_output.hpp | 2 +- src/tangara/audio/fatfs_audio_input.cpp | 28 ++++++------ src/tangara/audio/fatfs_audio_input.hpp | 10 ++--- src/tangara/audio/fatfs_source.cpp | 8 ++-- src/tangara/audio/fatfs_source.hpp | 2 +- src/tangara/audio/i2s_audio_output.cpp | 9 ++-- src/tangara/audio/i2s_audio_output.hpp | 2 +- src/tangara/audio/readahead_source.cpp | 4 +- src/tangara/audio/readahead_source.hpp | 2 +- src/tangara/audio/resample.cpp | 2 +- src/tangara/audio/track_queue.cpp | 14 +++--- src/tangara/audio/track_queue.hpp | 6 +-- src/tangara/battery/battery.cpp | 6 +-- src/tangara/database/database.cpp | 22 ++++----- src/tangara/database/database.hpp | 10 ++--- src/tangara/database/env_esp.cpp | 4 +- src/tangara/database/file_gatherer.cpp | 2 +- src/tangara/database/file_gatherer.hpp | 12 +++-- src/tangara/database/future_fetcher.hpp | 2 +- src/tangara/database/index.cpp | 11 ++--- src/tangara/database/index.hpp | 7 +-- src/tangara/database/records.cpp | 6 +-- src/tangara/database/records.hpp | 4 +- src/tangara/database/tag_parser.cpp | 2 +- src/tangara/database/tag_parser.hpp | 2 +- src/tangara/database/test/test_database.cpp | 16 +++---- src/tangara/database/test/test_records.cpp | 2 +- src/tangara/database/track.cpp | 2 +- src/tangara/dev_console/console.cpp | 2 +- src/tangara/events/event_queue.cpp | 7 +-- src/tangara/events/event_queue.hpp | 6 +-- src/tangara/input/device_factory.cpp | 14 +++--- src/tangara/input/device_factory.hpp | 8 ++-- src/tangara/input/feedback_haptics.hpp | 2 +- src/tangara/input/input_device.hpp | 4 +- src/tangara/input/input_hook.hpp | 2 +- src/tangara/input/input_hook_actions.hpp | 2 +- src/tangara/input/input_nav_buttons.cpp | 6 +-- src/tangara/input/input_nav_buttons.hpp | 6 +-- src/tangara/input/input_touch_dpad.hpp | 6 +-- src/tangara/input/input_touch_wheel.cpp | 10 ++--- src/tangara/input/input_touch_wheel.hpp | 8 ++-- src/tangara/input/input_volume_buttons.cpp | 6 +-- src/tangara/input/input_volume_buttons.hpp | 4 +- src/tangara/input/lvgl_input_driver.hpp | 12 ++--- src/tangara/lua/bridge.cpp | 28 ++++++------ src/tangara/lua/bridge.hpp | 9 ++-- src/tangara/lua/lua_controls.cpp | 4 +- src/tangara/lua/lua_database.cpp | 36 +++++++-------- src/tangara/lua/lua_database.hpp | 2 +- src/tangara/lua/lua_queue.cpp | 20 ++++----- src/tangara/lua/lua_registry.hpp | 6 +-- src/tangara/lua/lua_screen.cpp | 20 ++++----- src/tangara/lua/lua_theme.cpp | 25 ++++++----- src/tangara/lua/lua_thread.cpp | 16 ++++--- src/tangara/lua/lua_thread.hpp | 2 +- src/tangara/lua/lua_version.cpp | 6 +-- src/tangara/lua/property.cpp | 8 ++-- src/tangara/lua/property.hpp | 4 +- src/tangara/lua/registry.cpp | 10 ++--- src/tangara/system_fsm/booting.cpp | 18 ++++---- src/tangara/system_fsm/idle.cpp | 14 +++--- src/tangara/system_fsm/running.cpp | 20 ++++----- src/tangara/system_fsm/service_locator.cpp | 2 +- src/tangara/system_fsm/service_locator.hpp | 8 ++-- src/tangara/system_fsm/system_events.hpp | 6 +-- src/tangara/system_fsm/system_fsm.cpp | 14 +++--- src/tangara/system_fsm/system_fsm.hpp | 25 +++++------ src/tangara/ui/lvgl_task.cpp | 10 ++--- src/tangara/ui/lvgl_task.hpp | 6 +-- src/tangara/ui/modal.cpp | 14 +++--- src/tangara/ui/modal.hpp | 2 +- src/tangara/ui/screen.cpp | 2 +- src/tangara/ui/screen_lua.cpp | 8 ++-- src/tangara/ui/screen_lua.hpp | 4 +- src/tangara/ui/screen_splash.cpp | 2 +- src/tangara/ui/screen_splash.hpp | 2 +- src/tangara/ui/themes.cpp | 25 +++++------ src/tangara/ui/themes.hpp | 3 +- src/tangara/ui/ui_events.hpp | 6 +-- src/tangara/ui/ui_fsm.cpp | 50 ++++++++++----------- src/tangara/ui/ui_fsm.hpp | 40 ++++++++--------- 95 files changed, 465 insertions(+), 462 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index cf27b132..811f2709 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -7,14 +7,14 @@ #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" -#include "i2c.hpp" -#include "system_events.hpp" #include "tinyfsm.hpp" -#include "audio_fsm.hpp" -#include "event_queue.hpp" -#include "system_fsm.hpp" -#include "ui_fsm.hpp" +#include "audio/audio_fsm.hpp" +#include "events/event_queue.hpp" +#include "i2c.hpp" +#include "system_fsm/system_events.hpp" +#include "system_fsm/system_fsm.hpp" +#include "ui/ui_fsm.hpp" extern "C" void app_main(void) { ESP_ERROR_CHECK(drivers::init_i2c()); diff --git a/src/tangara/CMakeLists.txt b/src/tangara/CMakeLists.txt index 6bd648eb..5f2dfca8 100644 --- a/src/tangara/CMakeLists.txt +++ b/src/tangara/CMakeLists.txt @@ -5,8 +5,7 @@ idf_component_register( SRC_DIRS "app_console" "audio" "battery" "database" "dev_console" "events" "input" "lua" "system_fsm" "ui" - INCLUDE_DIRS "." "app_console" "audio" "battery" "database" "dev_console" - "events" "input" "lua" "system_fsm" "ui" + INCLUDE_DIRS "." REQUIRES "codecs" "drivers" "locale" "memory" "tasks" "util" "tinyfsm" "lvgl" "esp_timer" "luavgl" "esp_app_format" "libcppbor" "libtags" "komihash" "result" "esp_psram" "fatfs" "millershuffle" "speexdsp" "console" diff --git a/src/tangara/app_console/app_console.hpp b/src/tangara/app_console/app_console.hpp index 5981cc04..07f764f5 100644 --- a/src/tangara/app_console/app_console.hpp +++ b/src/tangara/app_console/app_console.hpp @@ -8,12 +8,12 @@ #include +#include "audio/track_queue.hpp" #include "bluetooth.hpp" -#include "console.hpp" -#include "database.hpp" +#include "dev_console/console.hpp" +#include "database/database.hpp" #include "samd.hpp" -#include "service_locator.hpp" -#include "track_queue.hpp" +#include "system_fsm/service_locator.hpp" namespace console { diff --git a/src/tangara/audio/audio_converter.cpp b/src/tangara/audio/audio_converter.cpp index d2edb0b3..0690b8d3 100644 --- a/src/tangara/audio/audio_converter.cpp +++ b/src/tangara/audio/audio_converter.cpp @@ -4,23 +4,23 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "audio_converter.hpp" +#include "audio/audio_converter.hpp" #include #include #include #include -#include "audio_events.hpp" -#include "audio_sink.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_sink.hpp" #include "esp_heap_caps.h" #include "esp_log.h" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "i2s_dac.hpp" -#include "resample.hpp" +#include "audio/resample.hpp" #include "sample.hpp" #include "tasks.hpp" diff --git a/src/tangara/audio/audio_converter.hpp b/src/tangara/audio/audio_converter.hpp index 163c6836..bf5edd43 100644 --- a/src/tangara/audio/audio_converter.hpp +++ b/src/tangara/audio/audio_converter.hpp @@ -10,11 +10,11 @@ #include #include -#include "audio_events.hpp" -#include "audio_sink.hpp" -#include "audio_source.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_sink.hpp" +#include "audio/audio_source.hpp" +#include "audio/resample.hpp" #include "codec.hpp" -#include "resample.hpp" #include "sample.hpp" namespace audio { diff --git a/src/tangara/audio/audio_decoder.cpp b/src/tangara/audio/audio_decoder.cpp index bf2d3fbe..1ef30b2c 100644 --- a/src/tangara/audio/audio_decoder.cpp +++ b/src/tangara/audio/audio_decoder.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "audio_decoder.hpp" +#include "audio/audio_decoder.hpp" #include #include @@ -25,20 +25,20 @@ #include "freertos/queue.h" #include "freertos/ringbuf.h" -#include "audio_converter.hpp" -#include "audio_events.hpp" -#include "audio_fsm.hpp" -#include "audio_sink.hpp" -#include "audio_source.hpp" +#include "audio/audio_converter.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_fsm.hpp" +#include "audio/audio_sink.hpp" +#include "audio/audio_source.hpp" +#include "audio/fatfs_audio_input.hpp" #include "codec.hpp" -#include "event_queue.hpp" -#include "fatfs_audio_input.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" #include "i2s_dac.hpp" #include "sample.hpp" #include "tasks.hpp" -#include "track.hpp" #include "types.hpp" -#include "ui_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace audio { diff --git a/src/tangara/audio/audio_decoder.hpp b/src/tangara/audio/audio_decoder.hpp index 8e955f74..dfd6f403 100644 --- a/src/tangara/audio/audio_decoder.hpp +++ b/src/tangara/audio/audio_decoder.hpp @@ -9,12 +9,12 @@ #include #include -#include "audio_converter.hpp" -#include "audio_events.hpp" -#include "audio_sink.hpp" -#include "audio_source.hpp" +#include "audio/audio_converter.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_sink.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" -#include "track.hpp" +#include "database/track.hpp" #include "types.hpp" namespace audio { diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp index b8a0dba6..b2975cbc 100644 --- a/src/tangara/audio/audio_events.hpp +++ b/src/tangara/audio/audio_events.hpp @@ -12,10 +12,10 @@ #include #include -#include "audio_sink.hpp" +#include "audio/audio_sink.hpp" #include "tinyfsm.hpp" -#include "track.hpp" +#include "database/track.hpp" #include "types.hpp" namespace audio { diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index ffb462f8..349f49b3 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -4,14 +4,14 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "audio_fsm.hpp" +#include "audio/audio_fsm.hpp" #include #include #include #include -#include "audio_sink.hpp" +#include "audio/audio_sink.hpp" #include "bluetooth_types.hpp" #include "cppbor.h" #include "cppbor_parse.h" @@ -21,23 +21,23 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "audio_converter.hpp" -#include "audio_decoder.hpp" -#include "audio_events.hpp" +#include "audio/audio_converter.hpp" +#include "audio/audio_decoder.hpp" +#include "audio/audio_events.hpp" +#include "audio/bt_audio_output.hpp" +#include "audio/fatfs_audio_input.hpp" +#include "audio/i2s_audio_output.hpp" +#include "audio/track_queue.hpp" #include "bluetooth.hpp" -#include "bt_audio_output.hpp" -#include "event_queue.hpp" -#include "fatfs_audio_input.hpp" -#include "future_fetcher.hpp" -#include "i2s_audio_output.hpp" +#include "database/future_fetcher.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" #include "i2s_dac.hpp" #include "nvs.hpp" #include "sample.hpp" -#include "service_locator.hpp" -#include "system_events.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "track.hpp" -#include "track_queue.hpp" #include "wm8523.hpp" namespace audio { diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index 60afb321..6f14d2d9 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -11,24 +11,24 @@ #include #include -#include "audio_sink.hpp" -#include "service_locator.hpp" +#include "audio/audio_sink.hpp" +#include "system_fsm/service_locator.hpp" #include "tinyfsm.hpp" -#include "audio_decoder.hpp" -#include "audio_events.hpp" -#include "bt_audio_output.hpp" -#include "database.hpp" +#include "audio/audio_decoder.hpp" +#include "audio/audio_events.hpp" +#include "audio/bt_audio_output.hpp" +#include "audio/fatfs_audio_input.hpp" +#include "audio/i2s_audio_output.hpp" +#include "audio/track_queue.hpp" +#include "database/database.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" #include "display.hpp" -#include "fatfs_audio_input.hpp" #include "gpios.hpp" -#include "i2s_audio_output.hpp" #include "i2s_dac.hpp" #include "storage.hpp" -#include "system_events.hpp" -#include "tag_parser.hpp" -#include "track.hpp" -#include "track_queue.hpp" +#include "system_fsm/system_events.hpp" namespace audio { @@ -61,7 +61,7 @@ class AudioState : public tinyfsm::Fsm { void react(const OutputModeChanged&); 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::BluetoothEvent&); @@ -103,7 +103,7 @@ namespace states { class Uninitialised : public AudioState { public: void react(const system_fsm::BootComplete&) override; - void react(const system_fsm::BluetoothEvent&) override{}; + void react(const system_fsm::BluetoothEvent&) override {}; using AudioState::react; }; diff --git a/src/tangara/audio/audio_source.cpp b/src/tangara/audio/audio_source.cpp index ee2f617f..4989c470 100644 --- a/src/tangara/audio/audio_source.cpp +++ b/src/tangara/audio/audio_source.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "audio_source.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" #include "types.hpp" @@ -14,7 +14,11 @@ TaggedStream::TaggedStream(std::shared_ptr t, std::unique_ptr w, std::string filepath, uint32_t offset) - : codecs::IStream(w->type()), tags_(t), wrapped_(std::move(w)), filepath_(filepath), offset_(offset) {} + : codecs::IStream(w->type()), + tags_(t), + wrapped_(std::move(w)), + filepath_(filepath), + offset_(offset) {} auto TaggedStream::tags() -> std::shared_ptr { return tags_; diff --git a/src/tangara/audio/audio_source.hpp b/src/tangara/audio/audio_source.hpp index f6a34300..2433da46 100644 --- a/src/tangara/audio/audio_source.hpp +++ b/src/tangara/audio/audio_source.hpp @@ -8,7 +8,7 @@ #include #include "codec.hpp" -#include "track.hpp" +#include "database/track.hpp" #include "types.hpp" namespace audio { @@ -18,8 +18,7 @@ class TaggedStream : public codecs::IStream { TaggedStream(std::shared_ptr, std::unique_ptr wrapped, std::string path, - uint32_t offset = 0 - ); + uint32_t offset = 0); auto tags() -> std::shared_ptr; diff --git a/src/tangara/audio/bt_audio_output.cpp b/src/tangara/audio/bt_audio_output.cpp index 229a38bb..b4bcaae8 100644 --- a/src/tangara/audio/bt_audio_output.cpp +++ b/src/tangara/audio/bt_audio_output.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "bt_audio_output.hpp" +#include "audio/bt_audio_output.hpp" #include #include diff --git a/src/tangara/audio/bt_audio_output.hpp b/src/tangara/audio/bt_audio_output.hpp index cc3b2462..0818d0d7 100644 --- a/src/tangara/audio/bt_audio_output.hpp +++ b/src/tangara/audio/bt_audio_output.hpp @@ -13,7 +13,7 @@ #include "result.hpp" -#include "audio_sink.hpp" +#include "audio/audio_sink.hpp" #include "bluetooth.hpp" #include "gpios.hpp" #include "i2s_dac.hpp" diff --git a/src/tangara/audio/fatfs_audio_input.cpp b/src/tangara/audio/fatfs_audio_input.cpp index e5fb3b21..0868d71a 100644 --- a/src/tangara/audio/fatfs_audio_input.cpp +++ b/src/tangara/audio/fatfs_audio_input.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "fatfs_audio_input.hpp" +#include "audio/fatfs_audio_input.hpp" #include #include @@ -18,24 +18,24 @@ #include #include +#include "audio/readahead_source.hpp" #include "esp_heap_caps.h" #include "esp_log.h" #include "ff.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "readahead_source.hpp" -#include "audio_events.hpp" -#include "audio_fsm.hpp" -#include "audio_source.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_fsm.hpp" +#include "audio/audio_source.hpp" +#include "audio/fatfs_source.hpp" #include "codec.hpp" -#include "event_queue.hpp" -#include "fatfs_source.hpp" -#include "future_fetcher.hpp" +#include "database/future_fetcher.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" #include "spi.hpp" -#include "tag_parser.hpp" #include "tasks.hpp" -#include "track.hpp" #include "types.hpp" [[maybe_unused]] static const char* kTag = "SRC"; @@ -61,8 +61,8 @@ auto FatfsAudioInput::SetPath(std::optional path) -> void { } } -auto FatfsAudioInput::SetPath(const std::string& path, uint32_t offset) - -> void { +auto FatfsAudioInput::SetPath(const std::string& path, + uint32_t offset) -> void { std::lock_guard guard{new_stream_mutex_}; if (OpenFile(path, offset)) { has_new_stream_ = true; @@ -103,8 +103,8 @@ auto FatfsAudioInput::NextStream() -> std::shared_ptr { } } -auto FatfsAudioInput::OpenFile(const std::string& path, uint32_t offset) - -> bool { +auto FatfsAudioInput::OpenFile(const std::string& path, + uint32_t offset) -> bool { ESP_LOGI(kTag, "opening file %s", path.c_str()); auto tags = tag_parser_.ReadAndParseTags(path); diff --git a/src/tangara/audio/fatfs_audio_input.hpp b/src/tangara/audio/fatfs_audio_input.hpp index 10b7433e..deeeb094 100644 --- a/src/tangara/audio/fatfs_audio_input.hpp +++ b/src/tangara/audio/fatfs_audio_input.hpp @@ -15,10 +15,10 @@ #include "ff.h" #include "freertos/portmacro.h" -#include "audio_source.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" -#include "future_fetcher.hpp" -#include "tag_parser.hpp" +#include "database/future_fetcher.hpp" +#include "database/tag_parser.hpp" #include "tasks.hpp" #include "types.hpp" @@ -39,7 +39,7 @@ class FatfsAudioInput : public IAudioSource { * given file path. */ auto SetPath(std::optional) -> void; - auto SetPath(const std::string&,uint32_t offset = 0) -> void; + auto SetPath(const std::string&, uint32_t offset = 0) -> void; auto SetPath() -> void; auto HasNewStream() -> bool override; @@ -49,7 +49,7 @@ class FatfsAudioInput : public IAudioSource { FatfsAudioInput& operator=(const FatfsAudioInput&) = delete; private: - auto OpenFile(const std::string& path,uint32_t offset) -> bool; + auto OpenFile(const std::string& path, uint32_t offset) -> bool; auto ContainerToStreamType(database::Container) -> std::optional; diff --git a/src/tangara/audio/fatfs_source.cpp b/src/tangara/audio/fatfs_source.cpp index dccdd581..645e0a1e 100644 --- a/src/tangara/audio/fatfs_source.cpp +++ b/src/tangara/audio/fatfs_source.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "fatfs_source.hpp" +#include "audio/fatfs_source.hpp" #include #include @@ -12,13 +12,13 @@ #include #include "esp_log.h" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "ff.h" -#include "audio_source.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" #include "spi.hpp" -#include "system_events.hpp" +#include "system_fsm/system_events.hpp" #include "types.hpp" namespace audio { diff --git a/src/tangara/audio/fatfs_source.hpp b/src/tangara/audio/fatfs_source.hpp index ce9b4db8..32650880 100644 --- a/src/tangara/audio/fatfs_source.hpp +++ b/src/tangara/audio/fatfs_source.hpp @@ -13,7 +13,7 @@ #include "codec.hpp" #include "ff.h" -#include "audio_source.hpp" +#include "audio/audio_source.hpp" namespace audio { diff --git a/src/tangara/audio/i2s_audio_output.cpp b/src/tangara/audio/i2s_audio_output.cpp index bf1c3e5e..4f03c1a5 100644 --- a/src/tangara/audio/i2s_audio_output.cpp +++ b/src/tangara/audio/i2s_audio_output.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "i2s_audio_output.hpp" +#include "audio/i2s_audio_output.hpp" #include #include @@ -18,7 +18,7 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "audio_sink.hpp" +#include "audio/audio_sink.hpp" #include "gpios.hpp" #include "i2c.hpp" #include "i2s_dac.hpp" @@ -120,7 +120,7 @@ auto I2SAudioOutput::SetVolumePct(uint_fast8_t val) -> bool { if (val > 100) { return false; } - uint16_t vol = (val * (max_volume_ - kMinVolume))/100 + kMinVolume; + uint16_t vol = (val * (max_volume_ - kMinVolume)) / 100 + kMinVolume; SetVolume(vol); return true; } @@ -133,7 +133,8 @@ auto I2SAudioOutput::GetVolumeDb() -> int_fast16_t { } auto I2SAudioOutput::SetVolumeDb(int_fast16_t val) -> bool { - SetVolume(val * 4 + static_cast(drivers::wm8523::kLineLevelReferenceVolume) - 2); + SetVolume(val * 4 + + static_cast(drivers::wm8523::kLineLevelReferenceVolume) - 2); return true; } diff --git a/src/tangara/audio/i2s_audio_output.hpp b/src/tangara/audio/i2s_audio_output.hpp index 7954257a..13494a6c 100644 --- a/src/tangara/audio/i2s_audio_output.hpp +++ b/src/tangara/audio/i2s_audio_output.hpp @@ -11,7 +11,7 @@ #include #include -#include "audio_sink.hpp" +#include "audio/audio_sink.hpp" #include "gpios.hpp" #include "i2s_dac.hpp" #include "result.hpp" diff --git a/src/tangara/audio/readahead_source.cpp b/src/tangara/audio/readahead_source.cpp index 6276907a..71684ddb 100644 --- a/src/tangara/audio/readahead_source.cpp +++ b/src/tangara/audio/readahead_source.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "readahead_source.hpp" +#include "audio/readahead_source.hpp" #include #include @@ -14,7 +14,7 @@ #include "esp_log.h" #include "ff.h" -#include "audio_source.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" #include "freertos/portmacro.h" #include "spi.hpp" diff --git a/src/tangara/audio/readahead_source.hpp b/src/tangara/audio/readahead_source.hpp index 74a30e1b..bbaf9f75 100644 --- a/src/tangara/audio/readahead_source.hpp +++ b/src/tangara/audio/readahead_source.hpp @@ -15,7 +15,7 @@ #include "ff.h" #include "freertos/stream_buffer.h" -#include "audio_source.hpp" +#include "audio/audio_source.hpp" #include "codec.hpp" #include "tasks.hpp" diff --git a/src/tangara/audio/resample.cpp b/src/tangara/audio/resample.cpp index 1e20392b..143ce230 100644 --- a/src/tangara/audio/resample.cpp +++ b/src/tangara/audio/resample.cpp @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: GPL-3.0-only */ -#include "resample.hpp" +#include "audio/resample.hpp" #include #include diff --git a/src/tangara/audio/track_queue.cpp b/src/tangara/audio/track_queue.cpp index dbe283c4..603b0de1 100644 --- a/src/tangara/audio/track_queue.cpp +++ b/src/tangara/audio/track_queue.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "track_queue.hpp" +#include "audio/track_queue.hpp" #include #include @@ -18,16 +18,16 @@ #include "MillerShuffle.h" #include "esp_random.h" -#include "audio_events.hpp" -#include "audio_fsm.hpp" +#include "audio/audio_events.hpp" +#include "audio/audio_fsm.hpp" #include "cppbor.h" #include "cppbor_parse.h" -#include "database.hpp" -#include "event_queue.hpp" +#include "database/database.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" #include "memory_resource.hpp" #include "tasks.hpp" -#include "track.hpp" -#include "ui_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace audio { diff --git a/src/tangara/audio/track_queue.hpp b/src/tangara/audio/track_queue.hpp index 5b7c9448..427d5f75 100644 --- a/src/tangara/audio/track_queue.hpp +++ b/src/tangara/audio/track_queue.hpp @@ -12,11 +12,11 @@ #include #include -#include "audio_events.hpp" +#include "audio/audio_events.hpp" #include "cppbor_parse.h" -#include "database.hpp" +#include "database/database.hpp" +#include "database/track.hpp" #include "tasks.hpp" -#include "track.hpp" namespace audio { diff --git a/src/tangara/battery/battery.cpp b/src/tangara/battery/battery.cpp index debef9e6..f75914ba 100644 --- a/src/tangara/battery/battery.cpp +++ b/src/tangara/battery/battery.cpp @@ -4,15 +4,15 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "battery.hpp" +#include "battery/battery.hpp" #include #include "adc.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "freertos/portmacro.h" #include "samd.hpp" -#include "system_events.hpp" +#include "system_fsm/system_events.hpp" namespace battery { diff --git a/src/tangara/database/database.cpp b/src/tangara/database/database.cpp index 48fb0c63..ddb63907 100644 --- a/src/tangara/database/database.cpp +++ b/src/tangara/database/database.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "database.hpp" +#include "database/database.hpp" #include #include @@ -23,10 +23,10 @@ #include "collation.hpp" #include "cppbor.h" #include "cppbor_parse.h" +#include "database/index.hpp" #include "esp_log.h" #include "ff.h" #include "freertos/projdefs.h" -#include "index.hpp" #include "komihash.h" #include "leveldb/cache.h" #include "leveldb/db.h" @@ -36,17 +36,17 @@ #include "leveldb/status.h" #include "leveldb/write_batch.h" -#include "db_events.hpp" -#include "env_esp.hpp" -#include "event_queue.hpp" -#include "file_gatherer.hpp" +#include "database/db_events.hpp" +#include "database/env_esp.hpp" +#include "database/file_gatherer.hpp" +#include "database/records.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" #include "memory_resource.hpp" -#include "records.hpp" #include "result.hpp" #include "spi.hpp" -#include "tag_parser.hpp" #include "tasks.hpp" -#include "track.hpp" namespace database { @@ -63,8 +63,8 @@ static const char kKeyTrackId[] = "next_track_id"; static std::atomic sIsDbOpen(false); -static auto CreateNewDatabase(leveldb::Options& options, locale::ICollator& col) - -> leveldb::DB* { +static auto CreateNewDatabase(leveldb::Options& options, + locale::ICollator& col) -> leveldb::DB* { Database::Destroy(); leveldb::DB* db; options.create_if_missing = true; diff --git a/src/tangara/database/database.hpp b/src/tangara/database/database.hpp index 35b76a13..d2de7c72 100644 --- a/src/tangara/database/database.hpp +++ b/src/tangara/database/database.hpp @@ -19,19 +19,19 @@ #include "collation.hpp" #include "cppbor.h" -#include "file_gatherer.hpp" -#include "index.hpp" +#include "database/file_gatherer.hpp" +#include "database/index.hpp" +#include "database/records.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" #include "leveldb/cache.h" #include "leveldb/db.h" #include "leveldb/iterator.h" #include "leveldb/options.h" #include "leveldb/slice.h" #include "memory_resource.hpp" -#include "records.hpp" #include "result.hpp" -#include "tag_parser.hpp" #include "tasks.hpp" -#include "track.hpp" namespace database { diff --git a/src/tangara/database/env_esp.cpp b/src/tangara/database/env_esp.cpp index f7a5637a..2cf74c3e 100644 --- a/src/tangara/database/env_esp.cpp +++ b/src/tangara/database/env_esp.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "env_esp.hpp" +#include "database/env_esp.hpp" #include #include @@ -41,7 +41,7 @@ namespace leveldb { -tasks::WorkerPool *sBackgroundThread = nullptr; +tasks::WorkerPool* sBackgroundThread = nullptr; std::string ErrToStr(FRESULT err) { switch (err) { diff --git a/src/tangara/database/file_gatherer.cpp b/src/tangara/database/file_gatherer.cpp index b7b7271e..141259c2 100644 --- a/src/tangara/database/file_gatherer.cpp +++ b/src/tangara/database/file_gatherer.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "file_gatherer.hpp" +#include "database/file_gatherer.hpp" #include #include diff --git a/src/tangara/database/file_gatherer.hpp b/src/tangara/database/file_gatherer.hpp index 685bdb2c..38558b9e 100644 --- a/src/tangara/database/file_gatherer.hpp +++ b/src/tangara/database/file_gatherer.hpp @@ -17,20 +17,18 @@ namespace database { class IFileGatherer { public: - virtual ~IFileGatherer(){}; + virtual ~IFileGatherer() {}; virtual auto FindFiles( const std::string& root, - std::function cb) - -> void = 0; + std::function cb) -> void = 0; }; class FileGathererImpl : public IFileGatherer { public: - virtual auto FindFiles( - const std::string& root, - std::function cb) - -> void override; + virtual auto FindFiles(const std::string& root, + std::function + cb) -> void override; }; } // namespace database diff --git a/src/tangara/database/future_fetcher.hpp b/src/tangara/database/future_fetcher.hpp index e8ce9729..a27101f1 100644 --- a/src/tangara/database/future_fetcher.hpp +++ b/src/tangara/database/future_fetcher.hpp @@ -9,7 +9,7 @@ #include #include -#include "database.hpp" +#include "database/database.hpp" namespace database { diff --git a/src/tangara/database/index.cpp b/src/tangara/database/index.cpp index 328c3b43..93a2b1c2 100644 --- a/src/tangara/database/index.cpp +++ b/src/tangara/database/index.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "index.hpp" +#include "database/index.hpp" #include #include @@ -21,8 +21,8 @@ #include "komihash.h" #include "leveldb/write_batch.h" -#include "records.hpp" -#include "track.hpp" +#include "database/records.hpp" +#include "database/track.hpp" namespace database { @@ -183,8 +183,9 @@ auto Indexer::handleItem(const IndexKey::Header& header, } } -auto Index(locale::ICollator& c, const IndexInfo& i, const Track& t) - -> std::vector> { +auto Index(locale::ICollator& c, + const IndexInfo& i, + const Track& t) -> std::vector> { Indexer indexer{c, t, i}; return indexer.index(); } diff --git a/src/tangara/database/index.hpp b/src/tangara/database/index.hpp index 45dae464..8f78439b 100644 --- a/src/tangara/database/index.hpp +++ b/src/tangara/database/index.hpp @@ -17,9 +17,9 @@ #include "leveldb/db.h" #include "leveldb/slice.h" +#include "database/track.hpp" #include "leveldb/write_batch.h" #include "memory_resource.hpp" -#include "track.hpp" namespace database { @@ -61,8 +61,9 @@ struct IndexKey { std::optional track; }; -auto Index(locale::ICollator&, const IndexInfo&, const Track&) - -> std::vector>; +auto Index(locale::ICollator&, + const IndexInfo&, + const Track&) -> std::vector>; auto ExpandHeader(const IndexKey::Header&, const std::optional&) -> IndexKey::Header; diff --git a/src/tangara/database/records.cpp b/src/tangara/database/records.cpp index b086be3b..88ddbd91 100644 --- a/src/tangara/database/records.cpp +++ b/src/tangara/database/records.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "records.hpp" +#include "database/records.hpp" #include #include @@ -21,10 +21,10 @@ #include "cppbor_parse.h" #include "esp_log.h" -#include "index.hpp" +#include "database/index.hpp" +#include "database/track.hpp" #include "komihash.h" #include "memory_resource.hpp" -#include "track.hpp" // As LevelDB is a key-value store, each record in the database consists of a // key and an optional value. diff --git a/src/tangara/database/records.hpp b/src/tangara/database/records.hpp index 3ca68fea..db18fe2f 100644 --- a/src/tangara/database/records.hpp +++ b/src/tangara/database/records.hpp @@ -15,9 +15,9 @@ #include "leveldb/db.h" #include "leveldb/slice.h" -#include "index.hpp" +#include "database/index.hpp" +#include "database/track.hpp" #include "memory_resource.hpp" -#include "track.hpp" namespace database { diff --git a/src/tangara/database/tag_parser.cpp b/src/tangara/database/tag_parser.cpp index cbcbdcb5..86bd6443 100644 --- a/src/tangara/database/tag_parser.cpp +++ b/src/tangara/database/tag_parser.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "tag_parser.hpp" +#include "database/tag_parser.hpp" #include #include diff --git a/src/tangara/database/tag_parser.hpp b/src/tangara/database/tag_parser.hpp index 966258b5..ccbc0ea9 100644 --- a/src/tangara/database/tag_parser.hpp +++ b/src/tangara/database/tag_parser.hpp @@ -8,8 +8,8 @@ #include +#include "database/track.hpp" #include "lru_cache.hpp" -#include "track.hpp" namespace database { diff --git a/src/tangara/database/test/test_database.cpp b/src/tangara/database/test/test_database.cpp index 6aec9bfb..09e19a43 100644 --- a/src/tangara/database/test/test_database.cpp +++ b/src/tangara/database/test/test_database.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "database.hpp" +#include "database/database.hpp" #include #include @@ -13,14 +13,14 @@ #include #include "catch2/catch.hpp" +#include "database/file_gatherer.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" #include "driver_cache.hpp" #include "esp_log.h" -#include "file_gatherer.hpp" #include "i2c_fixture.hpp" #include "leveldb/db.h" #include "spi_fixture.hpp" -#include "tag_parser.hpp" -#include "track.hpp" namespace database { @@ -28,8 +28,8 @@ class TestBackends : public IFileGatherer, public ITagParser { public: std::map tracks; - auto MakeTrack(const std::pmr::string& path, const std::pmr::string& title) - -> void { + auto MakeTrack(const std::pmr::string& path, + const std::pmr::string& title) -> void { TrackTags tags; tags.encoding = Encoding::kMp3; tags.title = title; @@ -44,8 +44,8 @@ class TestBackends : public IFileGatherer, public ITagParser { } } - auto ReadAndParseTags(const std::pmr::string& path, TrackTags* out) - -> bool override { + auto ReadAndParseTags(const std::pmr::string& path, + TrackTags* out) -> bool override { if (tracks.contains(path)) { *out = tracks.at(path); return true; diff --git a/src/tangara/database/test/test_records.cpp b/src/tangara/database/test/test_records.cpp index 2f59489c..f8eb980f 100644 --- a/src/tangara/database/test/test_records.cpp +++ b/src/tangara/database/test/test_records.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "records.hpp" +#include "database/records.hpp" #include #include diff --git a/src/tangara/database/track.cpp b/src/tangara/database/track.cpp index 1b1442a1..5bf8c3e2 100644 --- a/src/tangara/database/track.cpp +++ b/src/tangara/database/track.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "track.hpp" +#include "database/track.hpp" #include #include diff --git a/src/tangara/dev_console/console.cpp b/src/tangara/dev_console/console.cpp index f2b1efea..cee68b49 100644 --- a/src/tangara/dev_console/console.cpp +++ b/src/tangara/dev_console/console.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "console.hpp" +#include "dev_console/console.hpp" #include #include diff --git a/src/tangara/events/event_queue.cpp b/src/tangara/events/event_queue.cpp index f8f5b1ee..e4751398 100644 --- a/src/tangara/events/event_queue.cpp +++ b/src/tangara/events/event_queue.cpp @@ -6,12 +6,13 @@ #include "events/event_queue.hpp" -#include "audio_fsm.hpp" #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/queue.h" -#include "system_fsm.hpp" -#include "ui_fsm.hpp" + +#include "audio/audio_fsm.hpp" +#include "system_fsm/system_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace events { diff --git a/src/tangara/events/event_queue.hpp b/src/tangara/events/event_queue.hpp index 78b21d53..aa7f472d 100644 --- a/src/tangara/events/event_queue.hpp +++ b/src/tangara/events/event_queue.hpp @@ -11,14 +11,14 @@ #include #include -#include "audio_fsm.hpp" +#include "audio/audio_fsm.hpp" #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/queue.h" -#include "system_fsm.hpp" +#include "system_fsm/system_fsm.hpp" #include "tinyfsm.hpp" -#include "ui_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace events { diff --git a/src/tangara/input/device_factory.cpp b/src/tangara/input/device_factory.cpp index 65f4d785..8e1c5155 100644 --- a/src/tangara/input/device_factory.cpp +++ b/src/tangara/input/device_factory.cpp @@ -4,16 +4,16 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "device_factory.hpp" +#include "input/device_factory.hpp" #include -#include "feedback_haptics.hpp" -#include "input_device.hpp" -#include "input_nav_buttons.hpp" -#include "input_touch_dpad.hpp" -#include "input_touch_wheel.hpp" -#include "input_volume_buttons.hpp" +#include "input/feedback_haptics.hpp" +#include "input/input_device.hpp" +#include "input/input_nav_buttons.hpp" +#include "input/input_touch_dpad.hpp" +#include "input/input_touch_wheel.hpp" +#include "input/input_volume_buttons.hpp" namespace input { diff --git a/src/tangara/input/device_factory.hpp b/src/tangara/input/device_factory.hpp index dd9c7133..862c8728 100644 --- a/src/tangara/input/device_factory.hpp +++ b/src/tangara/input/device_factory.hpp @@ -9,11 +9,11 @@ #include #include -#include "feedback_device.hpp" -#include "input_device.hpp" -#include "input_touch_wheel.hpp" +#include "input/feedback_device.hpp" +#include "input/input_device.hpp" +#include "input/input_touch_wheel.hpp" #include "nvs.hpp" -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" namespace input { diff --git a/src/tangara/input/feedback_haptics.hpp b/src/tangara/input/feedback_haptics.hpp index a307a429..5727c0f3 100644 --- a/src/tangara/input/feedback_haptics.hpp +++ b/src/tangara/input/feedback_haptics.hpp @@ -8,8 +8,8 @@ #include -#include "feedback_device.hpp" #include "haptics.hpp" +#include "input/feedback_device.hpp" namespace input { diff --git a/src/tangara/input/input_device.hpp b/src/tangara/input/input_device.hpp index d944c3bf..e3d17c6c 100644 --- a/src/tangara/input/input_device.hpp +++ b/src/tangara/input/input_device.hpp @@ -11,8 +11,8 @@ #include #include "hal/lv_hal_indev.h" -#include "input_hook.hpp" -#include "property.hpp" +#include "input/input_hook.hpp" +#include "lua/property.hpp" namespace input { diff --git a/src/tangara/input/input_hook.hpp b/src/tangara/input/input_hook.hpp index a8705210..3dc8a2c8 100644 --- a/src/tangara/input/input_hook.hpp +++ b/src/tangara/input/input_hook.hpp @@ -13,7 +13,7 @@ #include "hal/lv_hal_indev.h" #include "lua.hpp" -#include "input_trigger.hpp" +#include "input/input_trigger.hpp" namespace input { diff --git a/src/tangara/input/input_hook_actions.hpp b/src/tangara/input/input_hook_actions.hpp index 105bd10d..71a560bc 100644 --- a/src/tangara/input/input_hook_actions.hpp +++ b/src/tangara/input/input_hook_actions.hpp @@ -7,7 +7,7 @@ #pragma once #include "hal/lv_hal_indev.h" -#include "input_hook.hpp" +#include "input/input_hook.hpp" namespace input { namespace actions { diff --git a/src/tangara/input/input_nav_buttons.cpp b/src/tangara/input/input_nav_buttons.cpp index 61d80075..28711e4e 100644 --- a/src/tangara/input/input_nav_buttons.cpp +++ b/src/tangara/input/input_nav_buttons.cpp @@ -4,12 +4,12 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_nav_buttons.hpp" +#include "input/input_nav_buttons.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "gpios.hpp" #include "hal/lv_hal_indev.h" -#include "input_hook_actions.hpp" +#include "input/input_hook_actions.hpp" namespace input { diff --git a/src/tangara/input/input_nav_buttons.hpp b/src/tangara/input/input_nav_buttons.hpp index 9feeb375..1349ff72 100644 --- a/src/tangara/input/input_nav_buttons.hpp +++ b/src/tangara/input/input_nav_buttons.hpp @@ -12,9 +12,9 @@ #include "hal/lv_hal_indev.h" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook.hpp" -#include "input_trigger.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" +#include "input/input_trigger.hpp" #include "touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_touch_dpad.hpp b/src/tangara/input/input_touch_dpad.hpp index 0c45b2d9..a0406e2b 100644 --- a/src/tangara/input/input_touch_dpad.hpp +++ b/src/tangara/input/input_touch_dpad.hpp @@ -11,9 +11,9 @@ #include "hal/lv_hal_indev.h" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook.hpp" -#include "input_trigger.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" +#include "input/input_trigger.hpp" #include "touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp index e6a3b880..a496e882 100644 --- a/src/tangara/input/input_touch_wheel.cpp +++ b/src/tangara/input/input_touch_wheel.cpp @@ -13,13 +13,13 @@ #include "events/event_queue.hpp" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook_actions.hpp" -#include "input_trigger.hpp" +#include "input/input_device.hpp" +#include "input/input_hook_actions.hpp" +#include "input/input_trigger.hpp" +#include "lua/property.hpp" #include "nvs.hpp" -#include "property.hpp" #include "touchwheel.hpp" -#include "ui_events.hpp" +#include "ui/ui_events.hpp" namespace input { diff --git a/src/tangara/input/input_touch_wheel.hpp b/src/tangara/input/input_touch_wheel.hpp index 764cc68d..b45ba361 100644 --- a/src/tangara/input/input_touch_wheel.hpp +++ b/src/tangara/input/input_touch_wheel.hpp @@ -12,11 +12,11 @@ #include "hal/lv_hal_indev.h" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook.hpp" -#include "input_trigger.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" +#include "input/input_trigger.hpp" +#include "lua/property.hpp" #include "nvs.hpp" -#include "property.hpp" #include "touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_volume_buttons.cpp b/src/tangara/input/input_volume_buttons.cpp index 37cf90e5..16267ef6 100644 --- a/src/tangara/input/input_volume_buttons.cpp +++ b/src/tangara/input/input_volume_buttons.cpp @@ -4,10 +4,10 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "input_volume_buttons.hpp" -#include "event_queue.hpp" +#include "input/input_volume_buttons.hpp" +#include "events/event_queue.hpp" #include "gpios.hpp" -#include "input_hook_actions.hpp" +#include "input/input_hook_actions.hpp" namespace input { diff --git a/src/tangara/input/input_volume_buttons.hpp b/src/tangara/input/input_volume_buttons.hpp index e3246df4..8a0ed18d 100644 --- a/src/tangara/input/input_volume_buttons.hpp +++ b/src/tangara/input/input_volume_buttons.hpp @@ -12,8 +12,8 @@ #include "hal/lv_hal_indev.h" #include "haptics.hpp" -#include "input_device.hpp" -#include "input_hook.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" #include "touchwheel.hpp" namespace input { diff --git a/src/tangara/input/lvgl_input_driver.hpp b/src/tangara/input/lvgl_input_driver.hpp index 9adaf143..6be24f7f 100644 --- a/src/tangara/input/lvgl_input_driver.hpp +++ b/src/tangara/input/lvgl_input_driver.hpp @@ -12,16 +12,16 @@ #include #include "core/lv_group.h" -#include "device_factory.hpp" -#include "feedback_device.hpp" #include "gpios.hpp" #include "hal/lv_hal_indev.h" +#include "input/device_factory.hpp" +#include "input/feedback_device.hpp" -#include "input_device.hpp" -#include "input_hook.hpp" -#include "lua_thread.hpp" +#include "input/input_device.hpp" +#include "input/input_hook.hpp" +#include "lua/lua_thread.hpp" +#include "lua/property.hpp" #include "nvs.hpp" -#include "property.hpp" #include "touchwheel.hpp" namespace input { diff --git a/src/tangara/lua/bridge.cpp b/src/tangara/lua/bridge.cpp index cfa9d5f7..17dd41cc 100644 --- a/src/tangara/lua/bridge.cpp +++ b/src/tangara/lua/bridge.cpp @@ -4,33 +4,33 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "bridge.hpp" -#include +#include "lua/bridge.hpp" +#include #include #include -#include "database.hpp" +#include "database/database.hpp" +#include "database/index.hpp" #include "esp_log.h" -#include "index.hpp" #include "lauxlib.h" #include "lua.h" #include "lua.hpp" -#include "lua_controls.hpp" -#include "lua_database.hpp" -#include "lua_queue.hpp" -#include "lua_screen.hpp" -#include "lua_version.hpp" -#include "lua_theme.hpp" +#include "lua/lua_controls.hpp" +#include "lua/lua_database.hpp" +#include "lua/lua_queue.hpp" +#include "lua/lua_screen.hpp" +#include "lua/lua_theme.hpp" +#include "lua/lua_version.hpp" #include "lvgl.h" #include "font/lv_font_loader.h" #include "luavgl.h" -#include "event_queue.hpp" -#include "property.hpp" -#include "service_locator.hpp" -#include "ui_events.hpp" +#include "events/event_queue.hpp" +#include "lua/property.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" extern "C" { int luaopen_linenoise(lua_State* L); diff --git a/src/tangara/lua/bridge.hpp b/src/tangara/lua/bridge.hpp index 64f14e0e..b4cfe503 100644 --- a/src/tangara/lua/bridge.hpp +++ b/src/tangara/lua/bridge.hpp @@ -10,9 +10,9 @@ #include #include "lua.hpp" +#include "lua/property.hpp" #include "lvgl.h" -#include "property.hpp" -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" namespace lua { @@ -39,9 +39,8 @@ class Bridge { auto installPropertyModule( lua_State* L, const std::string&, - std::vector< - std::pair>>&) - -> void; + std::vector>>&) -> void; Bridge(const Bridge&) = delete; Bridge& operator=(const Bridge&) = delete; diff --git a/src/tangara/lua/lua_controls.cpp b/src/tangara/lua/lua_controls.cpp index 2da0ed11..ab5b3c02 100644 --- a/src/tangara/lua/lua_controls.cpp +++ b/src/tangara/lua/lua_controls.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_controls.hpp" +#include "lua/lua_controls.hpp" #include #include @@ -17,7 +17,7 @@ #include "lvgl.h" #include "nvs.hpp" -#include "ui_events.hpp" +#include "ui/ui_events.hpp" namespace lua { diff --git a/src/tangara/lua/lua_database.cpp b/src/tangara/lua/lua_database.cpp index d0612fdd..1afb01f0 100644 --- a/src/tangara/lua/lua_database.cpp +++ b/src/tangara/lua/lua_database.cpp @@ -4,30 +4,30 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_database.hpp" +#include "lua/lua_database.hpp" #include #include #include #include -#include "bridge.hpp" #include "lua.hpp" +#include "lua/bridge.hpp" #include "esp_log.h" #include "lauxlib.h" #include "lua.h" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include "lvgl.h" -#include "database.hpp" -#include "event_queue.hpp" -#include "index.hpp" -#include "property.hpp" -#include "records.hpp" -#include "service_locator.hpp" -#include "track.hpp" -#include "ui_events.hpp" +#include "database/database.hpp" +#include "database/index.hpp" +#include "database/records.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" +#include "lua/property.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" namespace lua { @@ -152,8 +152,8 @@ auto db_check_iterator(lua_State* L, int stack_pos) -> database::Iterator* { return it; } -static auto push_iterator(lua_State* state, const database::Iterator& it) - -> void { +static auto push_iterator(lua_State* state, + const database::Iterator& it) -> void { database::Iterator** data = reinterpret_cast( lua_newuserdata(state, sizeof(uintptr_t))); *data = new database::Iterator(it); @@ -198,12 +198,10 @@ static auto db_iterator_gc(lua_State* state) -> int { return 0; } -static const struct luaL_Reg kDbIteratorFuncs[] = {{"next", db_iterate}, - {"prev", db_iterate_prev}, - {"clone", db_iterator_clone}, - {"__call", db_iterate}, - {"__gc", db_iterator_gc}, - {NULL, NULL}}; +static const struct luaL_Reg kDbIteratorFuncs[] = { + {"next", db_iterate}, {"prev", db_iterate_prev}, + {"clone", db_iterator_clone}, {"__call", db_iterate}, + {"__gc", db_iterator_gc}, {NULL, NULL}}; static auto record_text(lua_State* state) -> int { LuaRecord* data = reinterpret_cast( diff --git a/src/tangara/lua/lua_database.hpp b/src/tangara/lua/lua_database.hpp index b0d2acbd..328004ef 100644 --- a/src/tangara/lua/lua_database.hpp +++ b/src/tangara/lua/lua_database.hpp @@ -8,7 +8,7 @@ #include "lua.hpp" -#include "database.hpp" +#include "database/database.hpp" namespace lua { diff --git a/src/tangara/lua/lua_queue.cpp b/src/tangara/lua/lua_queue.cpp index dfb820c2..bc393aa5 100644 --- a/src/tangara/lua/lua_queue.cpp +++ b/src/tangara/lua/lua_queue.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_database.hpp" +#include "lua/lua_database.hpp" #include #include @@ -16,15 +16,15 @@ #include "lua.h" #include "lvgl.h" -#include "bridge.hpp" -#include "database.hpp" -#include "event_queue.hpp" -#include "index.hpp" -#include "property.hpp" -#include "service_locator.hpp" -#include "track.hpp" -#include "track_queue.hpp" -#include "ui_events.hpp" +#include "audio/track_queue.hpp" +#include "database/database.hpp" +#include "database/index.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" +#include "lua/bridge.hpp" +#include "lua/property.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" namespace lua { diff --git a/src/tangara/lua/lua_registry.hpp b/src/tangara/lua/lua_registry.hpp index abc5063e..e556b6eb 100644 --- a/src/tangara/lua/lua_registry.hpp +++ b/src/tangara/lua/lua_registry.hpp @@ -11,9 +11,9 @@ #include "lua.hpp" -#include "bridge.hpp" -#include "lua_thread.hpp" -#include "service_locator.hpp" +#include "lua/bridge.hpp" +#include "lua/lua_thread.hpp" +#include "system_fsm/service_locator.hpp" namespace lua { diff --git a/src/tangara/lua/lua_screen.cpp b/src/tangara/lua/lua_screen.cpp index f17f6b1a..8d87eebd 100644 --- a/src/tangara/lua/lua_screen.cpp +++ b/src/tangara/lua/lua_screen.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_screen.hpp" +#include "lua/lua_screen.hpp" #include #include @@ -16,15 +16,15 @@ #include "lua.h" #include "lvgl.h" -#include "bridge.hpp" -#include "database.hpp" -#include "event_queue.hpp" -#include "index.hpp" -#include "property.hpp" -#include "service_locator.hpp" -#include "track.hpp" -#include "track_queue.hpp" -#include "ui_events.hpp" +#include "audio/track_queue.hpp" +#include "database/database.hpp" +#include "database/index.hpp" +#include "database/track.hpp" +#include "events/event_queue.hpp" +#include "lua/bridge.hpp" +#include "lua/property.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" namespace lua { diff --git a/src/tangara/lua/lua_theme.cpp b/src/tangara/lua/lua_theme.cpp index 72434d97..5edde104 100644 --- a/src/tangara/lua/lua_theme.cpp +++ b/src/tangara/lua/lua_theme.cpp @@ -5,20 +5,20 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_version.hpp" +#include "lua/lua_version.hpp" #include -#include "bridge.hpp" #include "lua.hpp" +#include "lua/bridge.hpp" #include "esp_app_desc.h" #include "esp_log.h" #include "lauxlib.h" #include "lua.h" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include "luavgl.h" -#include "themes.hpp" +#include "ui/themes.hpp" namespace lua { @@ -35,7 +35,7 @@ static auto set_style(lua_State* L) -> int { static auto set_theme(lua_State* L) -> int { std::string class_name; luaL_checktype(L, -1, LUA_TTABLE); - lua_pushnil(L); /* first key */ + lua_pushnil(L); /* first key */ while (lua_next(L, -2) != 0) { /* uses 'key' (at index -2) and 'value' (at index -1) */ if (lua_type(L, -2) == LUA_TSTRING) { @@ -43,11 +43,11 @@ static auto set_theme(lua_State* L) -> int { } if (lua_type(L, -1) == LUA_TTABLE) { // Nesting - lua_pushnil(L); // First key + lua_pushnil(L); // First key while (lua_next(L, -2) != 0) { // Nesting the second int selector = -1; - lua_pushnil(L); // First key + lua_pushnil(L); // First key while (lua_next(L, -2) != 0) { int idx = lua_tointeger(L, -2); if (idx == 1) { @@ -60,12 +60,13 @@ static auto set_theme(lua_State* L) -> int { ESP_LOGI("lua_theme", "Style was null or malformed"); return 0; } else { - ui::themes::Theme::instance()->AddStyle(class_name, selector, style); + ui::themes::Theme::instance()->AddStyle(class_name, selector, + style); } } - lua_pop(L, 1); + lua_pop(L, 1); } - lua_pop(L, 1); + lua_pop(L, 1); } } /* removes 'value'; keeps 'key' for next iteration */ @@ -74,7 +75,9 @@ static auto set_theme(lua_State* L) -> int { return 0; } -static const struct luaL_Reg kThemeFuncs[] = {{"set", set_theme}, {"set_style", set_style}, {NULL, NULL}}; +static const struct luaL_Reg kThemeFuncs[] = {{"set", set_theme}, + {"set_style", set_style}, + {NULL, NULL}}; static auto lua_theme(lua_State* L) -> int { luaL_newlib(L, kThemeFuncs); diff --git a/src/tangara/lua/lua_thread.cpp b/src/tangara/lua/lua_thread.cpp index dd72e41d..77a46b45 100644 --- a/src/tangara/lua/lua_thread.cpp +++ b/src/tangara/lua/lua_thread.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include #include @@ -13,11 +13,11 @@ #include "esp_log.h" #include "lua.hpp" -#include "bridge.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" +#include "lua/bridge.hpp" #include "memory_resource.hpp" -#include "service_locator.hpp" -#include "ui_events.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" namespace lua { @@ -42,8 +42,10 @@ class Allocator { size_t total_allocated_; }; -static auto lua_alloc(void* ud, void* ptr, size_t osize, size_t nsize) - -> void* { +static auto lua_alloc(void* ud, + void* ptr, + size_t osize, + size_t nsize) -> void* { Allocator* instance = reinterpret_cast(ud); return instance->alloc(ptr, osize, nsize); } diff --git a/src/tangara/lua/lua_thread.hpp b/src/tangara/lua/lua_thread.hpp index 384de61d..d7602c1e 100644 --- a/src/tangara/lua/lua_thread.hpp +++ b/src/tangara/lua/lua_thread.hpp @@ -11,7 +11,7 @@ #include "lua.hpp" -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" namespace lua { diff --git a/src/tangara/lua/lua_version.cpp b/src/tangara/lua/lua_version.cpp index e5f06bb5..b85a30a5 100644 --- a/src/tangara/lua/lua_version.cpp +++ b/src/tangara/lua/lua_version.cpp @@ -5,18 +5,18 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_version.hpp" +#include "lua/lua_version.hpp" #include -#include "bridge.hpp" #include "lua.hpp" +#include "lua/bridge.hpp" #include "esp_app_desc.h" #include "esp_log.h" #include "lauxlib.h" #include "lua.h" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" namespace lua { diff --git a/src/tangara/lua/property.cpp b/src/tangara/lua/property.cpp index 9f4a1908..951c225f 100644 --- a/src/tangara/lua/property.cpp +++ b/src/tangara/lua/property.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "property.hpp" +#include "lua/property.hpp" #include #include @@ -15,14 +15,14 @@ #include #include "bluetooth_types.hpp" +#include "database/track.hpp" #include "lauxlib.h" #include "lua.h" #include "lua.hpp" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include "lvgl.h" #include "memory_resource.hpp" -#include "service_locator.hpp" -#include "track.hpp" +#include "system_fsm/service_locator.hpp" #include "types.hpp" namespace lua { diff --git a/src/tangara/lua/property.hpp b/src/tangara/lua/property.hpp index 724261be..2df61bad 100644 --- a/src/tangara/lua/property.hpp +++ b/src/tangara/lua/property.hpp @@ -10,11 +10,11 @@ #include #include -#include "audio_events.hpp" +#include "audio/audio_events.hpp" #include "bluetooth_types.hpp" #include "lua.hpp" #include "lvgl.h" -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" namespace lua { diff --git a/src/tangara/lua/registry.cpp b/src/tangara/lua/registry.cpp index a6487858..d33594a3 100644 --- a/src/tangara/lua/registry.cpp +++ b/src/tangara/lua/registry.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lua_registry.hpp" +#include "lua/lua_registry.hpp" #include #include @@ -13,11 +13,11 @@ #include "esp_log.h" #include "lua.hpp" -#include "bridge.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" +#include "lua/bridge.hpp" #include "memory_resource.hpp" -#include "service_locator.hpp" -#include "ui_events.hpp" +#include "system_fsm/service_locator.hpp" +#include "ui/ui_events.hpp" namespace lua { diff --git a/src/tangara/system_fsm/booting.cpp b/src/tangara/system_fsm/booting.cpp index 44700cc4..d9e05c39 100644 --- a/src/tangara/system_fsm/booting.cpp +++ b/src/tangara/system_fsm/booting.cpp @@ -7,7 +7,7 @@ #include "collation.hpp" #include "haptics.hpp" #include "spiffs.hpp" -#include "system_fsm.hpp" +#include "system_fsm/system_fsm.hpp" #include #include @@ -21,24 +21,24 @@ #include "freertos/timers.h" #include "adc.hpp" -#include "audio_fsm.hpp" -#include "battery.hpp" +#include "audio/audio_fsm.hpp" +#include "audio/track_queue.hpp" +#include "battery/battery.hpp" #include "bluetooth.hpp" #include "bluetooth_types.hpp" +#include "database/tag_parser.hpp" #include "display_init.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "gpios.hpp" #include "i2c.hpp" #include "nvs.hpp" #include "samd.hpp" -#include "service_locator.hpp" #include "spi.hpp" -#include "system_events.hpp" -#include "tag_parser.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" #include "tasks.hpp" #include "touchwheel.hpp" -#include "track_queue.hpp" -#include "ui_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace system_fsm { namespace states { diff --git a/src/tangara/system_fsm/idle.cpp b/src/tangara/system_fsm/idle.cpp index e28864b3..243faa5b 100644 --- a/src/tangara/system_fsm/idle.cpp +++ b/src/tangara/system_fsm/idle.cpp @@ -4,20 +4,20 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "app_console.hpp" -#include "file_gatherer.hpp" +#include "app_console/app_console.hpp" +#include "database/file_gatherer.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "gpios.hpp" #include "result.hpp" -#include "audio_fsm.hpp" -#include "event_queue.hpp" +#include "audio/audio_fsm.hpp" +#include "events/event_queue.hpp" #include "samd.hpp" #include "storage.hpp" -#include "system_events.hpp" -#include "system_fsm.hpp" -#include "ui_fsm.hpp" +#include "system_fsm/system_events.hpp" +#include "system_fsm/system_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace system_fsm { namespace states { diff --git a/src/tangara/system_fsm/running.cpp b/src/tangara/system_fsm/running.cpp index 796c96dc..a19abdaf 100644 --- a/src/tangara/system_fsm/running.cpp +++ b/src/tangara/system_fsm/running.cpp @@ -4,23 +4,23 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "app_console.hpp" -#include "audio_events.hpp" -#include "database.hpp" -#include "db_events.hpp" +#include "app_console/app_console.hpp" +#include "audio/audio_events.hpp" +#include "database/database.hpp" +#include "database/db_events.hpp" +#include "database/file_gatherer.hpp" #include "ff.h" -#include "file_gatherer.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "gpios.hpp" #include "result.hpp" -#include "audio_fsm.hpp" -#include "event_queue.hpp" +#include "audio/audio_fsm.hpp" +#include "events/event_queue.hpp" #include "storage.hpp" -#include "system_events.hpp" -#include "system_fsm.hpp" -#include "ui_fsm.hpp" +#include "system_fsm/system_events.hpp" +#include "system_fsm/system_fsm.hpp" +#include "ui/ui_fsm.hpp" namespace system_fsm { namespace states { diff --git a/src/tangara/system_fsm/service_locator.cpp b/src/tangara/system_fsm/service_locator.cpp index d8dcf44a..610406f9 100644 --- a/src/tangara/system_fsm/service_locator.cpp +++ b/src/tangara/system_fsm/service_locator.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" #include diff --git a/src/tangara/system_fsm/service_locator.hpp b/src/tangara/system_fsm/service_locator.hpp index 5978578c..a76488ab 100644 --- a/src/tangara/system_fsm/service_locator.hpp +++ b/src/tangara/system_fsm/service_locator.hpp @@ -8,19 +8,19 @@ #include -#include "battery.hpp" +#include "audio/track_queue.hpp" +#include "battery/battery.hpp" #include "bluetooth.hpp" #include "collation.hpp" -#include "database.hpp" +#include "database/database.hpp" +#include "database/tag_parser.hpp" #include "gpios.hpp" #include "haptics.hpp" #include "nvs.hpp" #include "samd.hpp" #include "storage.hpp" -#include "tag_parser.hpp" #include "tasks.hpp" #include "touchwheel.hpp" -#include "track_queue.hpp" namespace system_fsm { diff --git a/src/tangara/system_fsm/system_events.hpp b/src/tangara/system_fsm/system_events.hpp index 22e3b6bd..4f1614bf 100644 --- a/src/tangara/system_fsm/system_events.hpp +++ b/src/tangara/system_fsm/system_events.hpp @@ -8,13 +8,13 @@ #include -#include "battery.hpp" +#include "battery/battery.hpp" #include "bluetooth_types.hpp" -#include "database.hpp" +#include "database/database.hpp" #include "ff.h" #include "haptics.hpp" #include "samd.hpp" -#include "service_locator.hpp" +#include "system_fsm/service_locator.hpp" #include "tinyfsm.hpp" namespace system_fsm { diff --git a/src/tangara/system_fsm/system_fsm.cpp b/src/tangara/system_fsm/system_fsm.cpp index 59d41c73..7b5e2234 100644 --- a/src/tangara/system_fsm/system_fsm.cpp +++ b/src/tangara/system_fsm/system_fsm.cpp @@ -4,15 +4,15 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "system_fsm.hpp" -#include "audio_fsm.hpp" +#include "system_fsm/system_fsm.hpp" +#include "audio/audio_fsm.hpp" +#include "audio/track_queue.hpp" +#include "database/tag_parser.hpp" #include "driver/gpio.h" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "gpios.hpp" -#include "service_locator.hpp" -#include "system_events.hpp" -#include "tag_parser.hpp" -#include "track_queue.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" [[maybe_unused]] static const char kTag[] = "system"; diff --git a/src/tangara/system_fsm/system_fsm.hpp b/src/tangara/system_fsm/system_fsm.hpp index f01afb3f..d2971734 100644 --- a/src/tangara/system_fsm/system_fsm.hpp +++ b/src/tangara/system_fsm/system_fsm.hpp @@ -8,28 +8,27 @@ #include -#include "app_console.hpp" -#include "audio_events.hpp" -#include "battery.hpp" +#include "freertos/FreeRTOS.h" +#include "freertos/timers.h" + +#include "app_console/app_console.hpp" +#include "audio/audio_events.hpp" +#include "audio/track_queue.hpp" +#include "battery/battery.hpp" #include "bluetooth.hpp" -#include "database.hpp" -#include "db_events.hpp" +#include "database/database.hpp" +#include "database/db_events.hpp" +#include "database/tag_parser.hpp" #include "display.hpp" #include "gpios.hpp" #include "nvs.hpp" #include "samd.hpp" -#include "service_locator.hpp" #include "storage.hpp" -#include "tag_parser.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" #include "touchwheel.hpp" -#include "freertos/FreeRTOS.h" -#include "freertos/timers.h" - -#include "system_events.hpp" -#include "track_queue.hpp" - namespace system_fsm { void check_interrupts_cb(TimerHandle_t timer); diff --git a/src/tangara/ui/lvgl_task.cpp b/src/tangara/ui/lvgl_task.cpp index 51da0179..33c3667d 100644 --- a/src/tangara/ui/lvgl_task.cpp +++ b/src/tangara/ui/lvgl_task.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "lvgl_task.hpp" +#include "ui/lvgl_task.hpp" #include #include @@ -21,7 +21,7 @@ #include "core/lv_obj_pos.h" #include "core/lv_obj_tree.h" #include "esp_log.h" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "extra/themes/basic/lv_theme_basic.h" #include "font/lv_font.h" #include "freertos/portmacro.h" @@ -30,17 +30,17 @@ #include "hal/gpio_types.h" #include "hal/lv_hal_indev.h" #include "hal/spi_types.h" +#include "input/lvgl_input_driver.hpp" #include "lua.h" #include "lv_api_map.h" #include "lvgl/lvgl.h" -#include "lvgl_input_driver.hpp" #include "misc/lv_color.h" #include "misc/lv_style.h" #include "misc/lv_timer.h" -#include "modal.hpp" #include "tasks.hpp" #include "touchwheel.hpp" -#include "ui_fsm.hpp" +#include "ui/modal.hpp" +#include "ui/ui_fsm.hpp" #include "widgets/lv_label.h" #include "display.hpp" diff --git a/src/tangara/ui/lvgl_task.hpp b/src/tangara/ui/lvgl_task.hpp index 8efcbf35..dc611d75 100644 --- a/src/tangara/ui/lvgl_task.hpp +++ b/src/tangara/ui/lvgl_task.hpp @@ -15,10 +15,10 @@ #include "freertos/timers.h" #include "display.hpp" -#include "lvgl_input_driver.hpp" -#include "screen.hpp" -#include "themes.hpp" +#include "input/lvgl_input_driver.hpp" #include "touchwheel.hpp" +#include "ui/screen.hpp" +#include "ui/themes.hpp" namespace ui { diff --git a/src/tangara/ui/modal.cpp b/src/tangara/ui/modal.cpp index ec541914..4f5a2432 100644 --- a/src/tangara/ui/modal.cpp +++ b/src/tangara/ui/modal.cpp @@ -5,7 +5,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "modal.hpp" +#include "ui/modal.hpp" #include "misc/lv_color.h" @@ -14,17 +14,17 @@ #include "core/lv_group.h" #include "core/lv_obj_pos.h" -#include "event_queue.hpp" +#include "database/index.hpp" +#include "events/event_queue.hpp" #include "extra/widgets/list/lv_list.h" #include "extra/widgets/menu/lv_menu.h" #include "extra/widgets/spinner/lv_spinner.h" #include "hal/lv_hal_disp.h" -#include "index.hpp" #include "misc/lv_area.h" -#include "screen.hpp" -#include "themes.hpp" -#include "ui_events.hpp" -#include "ui_fsm.hpp" +#include "ui/screen.hpp" +#include "ui/themes.hpp" +#include "ui/ui_events.hpp" +#include "ui/ui_fsm.hpp" #include "widgets/lv_label.h" namespace ui { diff --git a/src/tangara/ui/modal.hpp b/src/tangara/ui/modal.hpp index 6b7e792e..bd5209a7 100644 --- a/src/tangara/ui/modal.hpp +++ b/src/tangara/ui/modal.hpp @@ -13,7 +13,7 @@ #include "core/lv_obj_tree.h" #include "lvgl.h" -#include "screen.hpp" +#include "ui/screen.hpp" namespace ui { diff --git a/src/tangara/ui/screen.cpp b/src/tangara/ui/screen.cpp index a39aaf7e..8357cfbd 100644 --- a/src/tangara/ui/screen.cpp +++ b/src/tangara/ui/screen.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "screen.hpp" +#include "ui/screen.hpp" #include diff --git a/src/tangara/ui/screen_lua.cpp b/src/tangara/ui/screen_lua.cpp index 685e43cb..c6cda7ae 100644 --- a/src/tangara/ui/screen_lua.cpp +++ b/src/tangara/ui/screen_lua.cpp @@ -4,15 +4,15 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "screen_lua.hpp" +#include "ui/screen_lua.hpp" #include "core/lv_obj_tree.h" #include "lua.h" #include "lua.hpp" -#include "property.hpp" -#include "themes.hpp" +#include "lua/property.hpp" +#include "ui/themes.hpp" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include "luavgl.h" namespace ui { diff --git a/src/tangara/ui/screen_lua.hpp b/src/tangara/ui/screen_lua.hpp index 8a463bad..d6bc20a2 100644 --- a/src/tangara/ui/screen_lua.hpp +++ b/src/tangara/ui/screen_lua.hpp @@ -8,8 +8,8 @@ #include "lua.hpp" -#include "property.hpp" -#include "screen.hpp" +#include "lua/property.hpp" +#include "ui/screen.hpp" namespace ui { namespace screens { diff --git a/src/tangara/ui/screen_splash.cpp b/src/tangara/ui/screen_splash.cpp index 48cfef88..651f00dd 100644 --- a/src/tangara/ui/screen_splash.cpp +++ b/src/tangara/ui/screen_splash.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "screen_splash.hpp" +#include "ui/screen_splash.hpp" #include "core/lv_obj.h" #include "core/lv_obj_style.h" diff --git a/src/tangara/ui/screen_splash.hpp b/src/tangara/ui/screen_splash.hpp index 6e746345..e56c915f 100644 --- a/src/tangara/ui/screen_splash.hpp +++ b/src/tangara/ui/screen_splash.hpp @@ -10,7 +10,7 @@ #include "lvgl.h" -#include "screen.hpp" +#include "ui/screen.hpp" namespace ui { namespace screens { diff --git a/src/tangara/ui/themes.cpp b/src/tangara/ui/themes.cpp index b13f226a..44638c55 100644 --- a/src/tangara/ui/themes.cpp +++ b/src/tangara/ui/themes.cpp @@ -1,4 +1,4 @@ -#include "themes.hpp" +#include "ui/themes.hpp" #include "core/lv_obj.h" #include "core/lv_obj_style.h" #include "core/lv_obj_tree.h" @@ -35,9 +35,9 @@ void Theme::Apply(void) { void Theme::Callback(lv_obj_t* obj) { // Find and apply base styles if (auto search = style_map.find("base"); search != style_map.end()) { - for (const auto& pair : search->second) { - lv_obj_add_style(obj, pair.second, pair.first); - } + for (const auto& pair : search->second) { + lv_obj_add_style(obj, pair.second, pair.first); + } } // Determine class name @@ -60,19 +60,18 @@ void Theme::Callback(lv_obj_t* obj) { // Apply all styles from class if (auto search = style_map.find(class_name); search != style_map.end()) { - for (const auto& pair : search->second) { - lv_obj_add_style(obj, pair.second, pair.first); - } + for (const auto& pair : search->second) { + lv_obj_add_style(obj, pair.second, pair.first); + } } - } void Theme::ApplyStyle(lv_obj_t* obj, std::string style_key) { if (auto search = style_map.find(style_key); search != style_map.end()) { - for (const auto& pair : search->second) { - lv_obj_remove_style(obj, pair.second, pair.first); - lv_obj_add_style(obj, pair.second, pair.first); - } + for (const auto& pair : search->second) { + lv_obj_remove_style(obj, pair.second, pair.first); + lv_obj_add_style(obj, pair.second, pair.first); + } } } @@ -85,7 +84,7 @@ void Theme::AddStyle(std::string key, int selector, lv_style_t* style) { style_map.try_emplace(key, std::vector>{}); if (auto search = style_map.find(key); search != style_map.end()) { // Key exists - auto &vec = search->second; + auto& vec = search->second; // Add it to the list vec.push_back(std::make_pair(selector, style)); } diff --git a/src/tangara/ui/themes.hpp b/src/tangara/ui/themes.hpp index 09b9cdce..fd576478 100644 --- a/src/tangara/ui/themes.hpp +++ b/src/tangara/ui/themes.hpp @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include #include "lvgl.h" @@ -32,7 +32,6 @@ class Theme { Theme(); std::map>> style_map; lv_theme_t theme_; - }; } // namespace themes } // namespace ui diff --git a/src/tangara/ui/ui_events.hpp b/src/tangara/ui/ui_events.hpp index 3d794edc..613b9629 100644 --- a/src/tangara/ui/ui_events.hpp +++ b/src/tangara/ui/ui_events.hpp @@ -7,12 +7,12 @@ #pragma once #include -#include "database.hpp" +#include "database/database.hpp" +#include "database/index.hpp" #include "gpios.hpp" -#include "index.hpp" #include "nvs.hpp" -#include "screen.hpp" #include "tinyfsm.hpp" +#include "ui/screen.hpp" namespace ui { diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp index 1cbf1be4..614d5216 100644 --- a/src/tangara/ui/ui_fsm.cpp +++ b/src/tangara/ui/ui_fsm.cpp @@ -4,61 +4,61 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "ui_fsm.hpp" +#include "ui/ui_fsm.hpp" #include #include #include #include "bluetooth_types.hpp" -#include "db_events.hpp" -#include "device_factory.hpp" +#include "database/db_events.hpp" #include "display_init.hpp" #include "esp_spp_api.h" -#include "feedback_haptics.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "input_device.hpp" -#include "input_touch_wheel.hpp" -#include "input_volume_buttons.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 "lua.h" #include "lua.hpp" -#include "audio_fsm.hpp" -#include "battery.hpp" +#include "audio/audio_fsm.hpp" +#include "battery/battery.hpp" #include "core/lv_group.h" #include "core/lv_obj.h" #include "core/lv_obj_tree.h" -#include "database.hpp" +#include "database/database.hpp" #include "esp_heap_caps.h" #include "esp_timer.h" #include "haptics.hpp" +#include "input/lvgl_input_driver.hpp" #include "lauxlib.h" -#include "lua_thread.hpp" +#include "lua/lua_thread.hpp" #include "luavgl.h" -#include "lvgl_input_driver.hpp" #include "memory_resource.hpp" #include "misc/lv_gc.h" -#include "audio_events.hpp" +#include "audio/audio_events.hpp" +#include "audio/track_queue.hpp" #include "display.hpp" -#include "event_queue.hpp" +#include "events/event_queue.hpp" #include "gpios.hpp" -#include "lua_registry.hpp" -#include "lvgl_task.hpp" +#include "lua/lua_registry.hpp" +#include "lua/property.hpp" #include "nvs.hpp" -#include "property.hpp" #include "samd.hpp" -#include "screen.hpp" -#include "screen_lua.hpp" -#include "screen_splash.hpp" #include "spiffs.hpp" #include "storage.hpp" -#include "system_events.hpp" +#include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" #include "touchwheel.hpp" -#include "track_queue.hpp" -#include "ui_events.hpp" +#include "ui/lvgl_task.hpp" +#include "ui/screen.hpp" +#include "ui/screen_lua.hpp" +#include "ui/screen_splash.hpp" +#include "ui/ui_events.hpp" #include "widgets/lv_label.h" namespace ui { @@ -266,8 +266,8 @@ lua::Property UiState::sUsbMassStorageEnabled{ lua::Property UiState::sUsbMassStorageBusy{false}; -auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs) - -> bool { +auto UiState::InitBootSplash(drivers::IGpios& gpios, + drivers::NvsStorage& nvs) -> bool { events::Ui().Dispatch(internal::InitDisplay{ .gpios = gpios, .nvs = nvs, diff --git a/src/tangara/ui/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp index 325aea8f..e4f21ce0 100644 --- a/src/tangara/ui/ui_fsm.hpp +++ b/src/tangara/ui/ui_fsm.hpp @@ -10,30 +10,30 @@ #include #include -#include "audio_events.hpp" -#include "battery.hpp" -#include "db_events.hpp" -#include "device_factory.hpp" +#include "audio/audio_events.hpp" +#include "audio/track_queue.hpp" +#include "battery/battery.hpp" +#include "database/db_events.hpp" +#include "database/track.hpp" #include "display.hpp" -#include "feedback_haptics.hpp" #include "gpios.hpp" -#include "input_touch_wheel.hpp" -#include "input_volume_buttons.hpp" -#include "lua_thread.hpp" -#include "lvgl_input_driver.hpp" -#include "lvgl_task.hpp" -#include "modal.hpp" +#include "input/device_factory.hpp" +#include "input/feedback_haptics.hpp" +#include "input/input_touch_wheel.hpp" +#include "input/input_volume_buttons.hpp" +#include "input/lvgl_input_driver.hpp" +#include "lua/lua_thread.hpp" +#include "lua/property.hpp" #include "nvs.hpp" -#include "property.hpp" -#include "screen.hpp" -#include "service_locator.hpp" #include "storage.hpp" -#include "system_events.hpp" +#include "system_fsm/service_locator.hpp" +#include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" #include "touchwheel.hpp" -#include "track.hpp" -#include "track_queue.hpp" -#include "ui_events.hpp" +#include "ui/lvgl_task.hpp" +#include "ui/modal.hpp" +#include "ui/screen.hpp" +#include "ui/ui_events.hpp" namespace ui { @@ -74,7 +74,7 @@ class UiState : public tinyfsm::Fsm { void react(const internal::DismissAlerts&); 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 system_fsm::BluetoothEvent&); @@ -86,7 +86,7 @@ class UiState : public tinyfsm::Fsm { sCurrentModal.reset(); } - void react(const internal::ReindexDatabase&){}; + void react(const internal::ReindexDatabase&) {}; protected: void PushScreen(std::shared_ptr); From 26eb580043ad176bdc58d996f30d470e1073ef00 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 21:52:59 +1000 Subject: [PATCH 07/15] move driver includes into a subdir as well --- src/codecs/codec.cpp | 2 +- src/codecs/source_buffer.cpp | 4 ++-- src/drivers/adc.cpp | 2 +- src/drivers/bluetooth.cpp | 10 ++++---- src/drivers/display.cpp | 8 +++---- src/drivers/display_init.cpp | 2 +- src/drivers/gpios.cpp | 4 ++-- src/drivers/haptics.cpp | 12 +++++----- src/drivers/i2c.cpp | 2 +- src/drivers/i2s_dac.cpp | 13 +++++----- .../{ => drivers}/a2dp_audio_output.hpp | 0 src/drivers/include/{ => drivers}/adc.hpp | 0 .../include/{ => drivers}/bluetooth.hpp | 4 ++-- .../include/{ => drivers}/bluetooth_types.hpp | 0 src/drivers/include/{ => drivers}/display.hpp | 4 ++-- .../include/{ => drivers}/display_init.hpp | 0 .../{ => drivers}/fatfs_audio_input.hpp | 0 src/drivers/include/{ => drivers}/gpios.hpp | 0 src/drivers/include/{ => drivers}/haptics.hpp | 0 src/drivers/include/{ => drivers}/i2c.hpp | 0 src/drivers/include/{ => drivers}/i2s_dac.hpp | 2 +- src/drivers/include/{ => drivers}/nvs.hpp | 2 +- src/drivers/include/{ => drivers}/samd.hpp | 0 src/drivers/include/{ => drivers}/spi.hpp | 0 src/drivers/include/{ => drivers}/spiffs.hpp | 0 src/drivers/include/{ => drivers}/storage.hpp | 2 +- .../include/{ => drivers}/touchwheel.hpp | 2 +- src/drivers/include/{ => drivers}/wm8523.hpp | 0 src/drivers/nvs.cpp | 22 ++++++++--------- src/drivers/samd.cpp | 4 ++-- src/drivers/spi.cpp | 2 +- src/drivers/spiffs.cpp | 2 +- src/drivers/storage.cpp | 4 ++-- src/drivers/test/test_dac.cpp | 4 ++-- src/drivers/test/test_gpio_expander.cpp | 4 ++-- src/drivers/test/test_storage.cpp | 8 +++---- src/drivers/touchwheel.cpp | 4 ++-- src/drivers/wm8523.cpp | 4 ++-- src/main/main.cpp | 2 +- src/tangara/app_console/app_console.cpp | 8 +++---- src/tangara/app_console/app_console.hpp | 4 ++-- src/tangara/audio/audio_converter.cpp | 2 +- src/tangara/audio/audio_decoder.cpp | 2 +- src/tangara/audio/audio_fsm.cpp | 10 ++++---- src/tangara/audio/audio_fsm.hpp | 8 +++---- src/tangara/audio/bt_audio_output.cpp | 8 +++---- src/tangara/audio/bt_audio_output.hpp | 6 ++--- src/tangara/audio/fatfs_audio_input.cpp | 2 +- src/tangara/audio/fatfs_source.cpp | 2 +- src/tangara/audio/i2s_audio_output.cpp | 8 +++---- src/tangara/audio/i2s_audio_output.hpp | 4 ++-- src/tangara/audio/readahead_source.cpp | 2 +- src/tangara/battery/battery.cpp | 4 ++-- src/tangara/battery/battery.hpp | 4 ++-- src/tangara/database/database.cpp | 2 +- src/tangara/database/env_esp.cpp | 2 +- src/tangara/database/file_gatherer.cpp | 2 +- src/tangara/database/tag_parser.cpp | 2 +- src/tangara/input/device_factory.hpp | 2 +- src/tangara/input/feedback_haptics.cpp | 2 +- src/tangara/input/feedback_haptics.hpp | 2 +- src/tangara/input/input_hook.cpp | 4 ++-- src/tangara/input/input_nav_buttons.cpp | 2 +- src/tangara/input/input_nav_buttons.hpp | 6 ++--- src/tangara/input/input_touch_dpad.cpp | 4 ++-- src/tangara/input/input_touch_dpad.hpp | 4 ++-- src/tangara/input/input_touch_wheel.cpp | 6 ++--- src/tangara/input/input_touch_wheel.hpp | 6 ++--- src/tangara/input/input_volume_buttons.cpp | 2 +- src/tangara/input/input_volume_buttons.hpp | 6 ++--- src/tangara/input/lvgl_input_driver.cpp | 2 +- src/tangara/input/lvgl_input_driver.hpp | 6 ++--- src/tangara/lua/bridge.cpp | 5 ++-- src/tangara/lua/lua_controls.cpp | 2 +- src/tangara/lua/property.cpp | 2 +- src/tangara/lua/property.hpp | 2 +- src/tangara/system_fsm/booting.cpp | 24 +++++++++---------- src/tangara/system_fsm/idle.cpp | 6 ++--- src/tangara/system_fsm/running.cpp | 4 ++-- src/tangara/system_fsm/service_locator.cpp | 6 ++--- src/tangara/system_fsm/service_locator.hpp | 14 +++++------ src/tangara/system_fsm/system_events.hpp | 6 ++--- src/tangara/system_fsm/system_fsm.cpp | 2 +- src/tangara/system_fsm/system_fsm.hpp | 14 +++++------ src/tangara/ui/lvgl_task.cpp | 6 ++--- src/tangara/ui/lvgl_task.hpp | 4 ++-- src/tangara/ui/ui_events.hpp | 4 ++-- src/tangara/ui/ui_fsm.cpp | 20 ++++++++-------- src/tangara/ui/ui_fsm.hpp | 10 ++++---- src/util/random.cpp | 4 ++-- 90 files changed, 203 insertions(+), 203 deletions(-) rename src/drivers/include/{ => drivers}/a2dp_audio_output.hpp (100%) rename src/drivers/include/{ => drivers}/adc.hpp (100%) rename src/drivers/include/{ => drivers}/bluetooth.hpp (98%) rename src/drivers/include/{ => drivers}/bluetooth_types.hpp (100%) rename src/drivers/include/{ => drivers}/display.hpp (96%) rename src/drivers/include/{ => drivers}/display_init.hpp (100%) rename src/drivers/include/{ => drivers}/fatfs_audio_input.hpp (100%) rename src/drivers/include/{ => drivers}/gpios.hpp (100%) rename src/drivers/include/{ => drivers}/haptics.hpp (100%) rename src/drivers/include/{ => drivers}/i2c.hpp (100%) rename src/drivers/include/{ => drivers}/i2s_dac.hpp (98%) rename src/drivers/include/{ => drivers}/nvs.hpp (98%) rename src/drivers/include/{ => drivers}/samd.hpp (100%) rename src/drivers/include/{ => drivers}/spi.hpp (100%) rename src/drivers/include/{ => drivers}/spiffs.hpp (100%) rename src/drivers/include/{ => drivers}/storage.hpp (98%) rename src/drivers/include/{ => drivers}/touchwheel.hpp (97%) rename src/drivers/include/{ => drivers}/wm8523.hpp (100%) diff --git a/src/codecs/codec.cpp b/src/codecs/codec.cpp index a51c40d6..c8e1a72c 100644 --- a/src/codecs/codec.cpp +++ b/src/codecs/codec.cpp @@ -9,8 +9,8 @@ #include #include -#include "mad.hpp" #include "dr_flac.hpp" +#include "mad.hpp" #include "opus.hpp" #include "types.hpp" #include "vorbis.hpp" diff --git a/src/codecs/source_buffer.cpp b/src/codecs/source_buffer.cpp index 538d7f47..9cd648cd 100644 --- a/src/codecs/source_buffer.cpp +++ b/src/codecs/source_buffer.cpp @@ -62,8 +62,8 @@ auto SourceBuffer::AddBytes(std::function)> writer) auto SourceBuffer::ConsumeBytes( std::function)> reader) -> void { - size_t bytes_consumed = std::invoke( - reader, buffer_.subspan(offset_of_bytes_, bytes_in_buffer_)); + size_t bytes_consumed = + std::invoke(reader, buffer_.subspan(offset_of_bytes_, bytes_in_buffer_)); assert(bytes_consumed <= bytes_in_buffer_); bytes_in_buffer_ -= bytes_consumed; diff --git a/src/drivers/adc.cpp b/src/drivers/adc.cpp index 3379a1ae..3038f7f6 100644 --- a/src/drivers/adc.cpp +++ b/src/drivers/adc.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "adc.hpp" +#include "drivers/adc.hpp" #include #include "esp_adc/adc_cali.h" diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp index 40be530e..4caffae7 100644 --- a/src/drivers/bluetooth.cpp +++ b/src/drivers/bluetooth.cpp @@ -1,4 +1,4 @@ -#include "bluetooth.hpp" +#include "drivers/bluetooth.hpp" #include @@ -27,9 +27,9 @@ #include "freertos/timers.h" #include "tinyfsm/include/tinyfsm.hpp" -#include "bluetooth_types.hpp" +#include "drivers/bluetooth_types.hpp" +#include "drivers/nvs.hpp" #include "memory_resource.hpp" -#include "nvs.hpp" #include "tasks.hpp" namespace drivers { @@ -47,8 +47,8 @@ auto gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t* param) -> void { bluetooth::events::internal::Gap{.type = event, .param = param}); } -auto avrcp_cb(esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t* param) - -> void { +auto avrcp_cb(esp_avrc_ct_cb_event_t event, + esp_avrc_ct_cb_param_t* param) -> void { esp_avrc_ct_cb_param_t copy = *param; sBgWorker->Dispatch([=]() { auto lock = bluetooth::BluetoothState::lock(); diff --git a/src/drivers/display.cpp b/src/drivers/display.cpp index 5c686811..b0a97b30 100644 --- a/src/drivers/display.cpp +++ b/src/drivers/display.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "display.hpp" +#include "drivers/display.hpp" #include #include @@ -31,11 +31,11 @@ #include "hal/spi_types.h" #include "lvgl/lvgl.h" -#include "display_init.hpp" -#include "gpios.hpp" +#include "drivers/display_init.hpp" +#include "drivers/gpios.hpp" +#include "drivers/spi.hpp" #include "misc/lv_color.h" #include "soc/soc.h" -#include "spi.hpp" #include "tasks.hpp" [[maybe_unused]] static const char* kTag = "DISPLAY"; diff --git a/src/drivers/display_init.cpp b/src/drivers/display_init.cpp index a69826fa..edd36a8d 100644 --- a/src/drivers/display_init.cpp +++ b/src/drivers/display_init.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "display_init.hpp" +#include "drivers/display_init.hpp" namespace drivers { namespace displays { diff --git a/src/drivers/gpios.cpp b/src/drivers/gpios.cpp index aab932a7..64ba26a7 100644 --- a/src/drivers/gpios.cpp +++ b/src/drivers/gpios.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include @@ -15,7 +15,7 @@ #include "esp_intr_alloc.h" #include "hal/gpio_types.h" -#include "i2c.hpp" +#include "drivers/i2c.hpp" namespace drivers { diff --git a/src/drivers/haptics.cpp b/src/drivers/haptics.cpp index f7b18086..55fa9ad8 100644 --- a/src/drivers/haptics.cpp +++ b/src/drivers/haptics.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include #include @@ -21,7 +21,7 @@ #include "hal/gpio_types.h" #include "hal/i2c_types.h" -#include "i2c.hpp" +#include "drivers/i2c.hpp" namespace drivers { @@ -54,7 +54,8 @@ Haptics::Haptics(const std::variant& motor) { // Set library // TODO(robin): try the other libraries and test response. C is marginal, D // too much? - WriteRegister(Register::kWaveformLibrary, static_cast(kDefaultErmLibrary)); + WriteRegister(Register::kWaveformLibrary, + static_cast(kDefaultErmLibrary)); } else if (std::holds_alternative(motor)) { ESP_LOGI(kTag, "Setting up LRA motor..."); @@ -75,7 +76,8 @@ Haptics::Haptics(const std::variant& motor) { ControlMask::kLraOpenLoop); // Set library; only option is the LRA one for, well, LRA motors. - WriteRegister(Register::kWaveformLibrary, static_cast(Library::LRA)); + WriteRegister(Register::kWaveformLibrary, + static_cast(Library::LRA)); } // Set mode (internal trigger, on writing 1 to Go register) @@ -123,7 +125,6 @@ auto Haptics::SetWaveformEffect(Effect effect) -> void { current_effect_ = effect; } - auto Haptics::TourEffects() -> void { TourEffects(Effect::kFirst, Effect::kLast, kDefaultErmLibrary); } @@ -174,7 +175,6 @@ auto Haptics::TourLibraries(Effect from, Effect to) -> void { } } - auto Haptics::PowerDown() -> void { WriteRegister(Register::kMode, static_cast(Mode::kInternalTrigger) | ModeMask::kStandby); diff --git a/src/drivers/i2c.cpp b/src/drivers/i2c.cpp index 7d25717a..793ce9f9 100644 --- a/src/drivers/i2c.cpp +++ b/src/drivers/i2c.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "i2c.hpp" +#include "drivers/i2c.hpp" #include diff --git a/src/drivers/i2s_dac.cpp b/src/drivers/i2s_dac.cpp index 7fe5547d..a271fce0 100644 --- a/src/drivers/i2s_dac.cpp +++ b/src/drivers/i2s_dac.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "i2s_dac.hpp" +#include "drivers/i2s_dac.hpp" #include #include @@ -25,11 +25,11 @@ #include "hal/gpio_types.h" #include "hal/i2c_types.h" -#include "gpios.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" +#include "drivers/wm8523.hpp" #include "hal/i2s_types.h" -#include "i2c.hpp" #include "soc/clk_tree_defs.h" -#include "wm8523.hpp" namespace drivers { @@ -142,8 +142,9 @@ auto I2SDac::SetPaused(bool paused) -> void { static volatile bool sSwapWords = false; -auto I2SDac::Reconfigure(Channels ch, BitsPerSample bps, SampleRate rate) - -> void { +auto I2SDac::Reconfigure(Channels ch, + BitsPerSample bps, + SampleRate rate) -> void { std::lock_guard lock(configure_mutex_); if (i2s_active_) { diff --git a/src/drivers/include/a2dp_audio_output.hpp b/src/drivers/include/drivers/a2dp_audio_output.hpp similarity index 100% rename from src/drivers/include/a2dp_audio_output.hpp rename to src/drivers/include/drivers/a2dp_audio_output.hpp diff --git a/src/drivers/include/adc.hpp b/src/drivers/include/drivers/adc.hpp similarity index 100% rename from src/drivers/include/adc.hpp rename to src/drivers/include/drivers/adc.hpp diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/drivers/bluetooth.hpp similarity index 98% rename from src/drivers/include/bluetooth.hpp rename to src/drivers/include/drivers/bluetooth.hpp index 8da5ce2e..5960de7e 100644 --- a/src/drivers/include/bluetooth.hpp +++ b/src/drivers/include/drivers/bluetooth.hpp @@ -12,11 +12,11 @@ #include #include #include -#include "bluetooth_types.hpp" +#include "drivers/bluetooth_types.hpp" #include "esp_a2dp_api.h" #include "esp_avrc_api.h" #include "esp_gap_bt_api.h" -#include "nvs.hpp" +#include "drivers/nvs.hpp" #include "tasks.hpp" #include "tinyfsm.hpp" #include "tinyfsm/include/tinyfsm.hpp" diff --git a/src/drivers/include/bluetooth_types.hpp b/src/drivers/include/drivers/bluetooth_types.hpp similarity index 100% rename from src/drivers/include/bluetooth_types.hpp rename to src/drivers/include/drivers/bluetooth_types.hpp diff --git a/src/drivers/include/display.hpp b/src/drivers/include/drivers/display.hpp similarity index 96% rename from src/drivers/include/display.hpp rename to src/drivers/include/drivers/display.hpp index d2e18a5c..6dc78e01 100644 --- a/src/drivers/include/display.hpp +++ b/src/drivers/include/drivers/display.hpp @@ -15,8 +15,8 @@ #include "result.hpp" #include "tasks.hpp" -#include "display_init.hpp" -#include "gpios.hpp" +#include "drivers/display_init.hpp" +#include "drivers/gpios.hpp" namespace drivers { diff --git a/src/drivers/include/display_init.hpp b/src/drivers/include/drivers/display_init.hpp similarity index 100% rename from src/drivers/include/display_init.hpp rename to src/drivers/include/drivers/display_init.hpp diff --git a/src/drivers/include/fatfs_audio_input.hpp b/src/drivers/include/drivers/fatfs_audio_input.hpp similarity index 100% rename from src/drivers/include/fatfs_audio_input.hpp rename to src/drivers/include/drivers/fatfs_audio_input.hpp diff --git a/src/drivers/include/gpios.hpp b/src/drivers/include/drivers/gpios.hpp similarity index 100% rename from src/drivers/include/gpios.hpp rename to src/drivers/include/drivers/gpios.hpp diff --git a/src/drivers/include/haptics.hpp b/src/drivers/include/drivers/haptics.hpp similarity index 100% rename from src/drivers/include/haptics.hpp rename to src/drivers/include/drivers/haptics.hpp diff --git a/src/drivers/include/i2c.hpp b/src/drivers/include/drivers/i2c.hpp similarity index 100% rename from src/drivers/include/i2c.hpp rename to src/drivers/include/drivers/i2c.hpp diff --git a/src/drivers/include/i2s_dac.hpp b/src/drivers/include/drivers/i2s_dac.hpp similarity index 98% rename from src/drivers/include/i2s_dac.hpp rename to src/drivers/include/drivers/i2s_dac.hpp index 569f0a9a..5e81f875 100644 --- a/src/drivers/include/i2s_dac.hpp +++ b/src/drivers/include/drivers/i2s_dac.hpp @@ -22,7 +22,7 @@ #include "freertos/stream_buffer.h" #include "result.hpp" -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "sys/_stdint.h" namespace drivers { diff --git a/src/drivers/include/nvs.hpp b/src/drivers/include/drivers/nvs.hpp similarity index 98% rename from src/drivers/include/nvs.hpp rename to src/drivers/include/drivers/nvs.hpp index ac1a1096..83bb8097 100644 --- a/src/drivers/include/nvs.hpp +++ b/src/drivers/include/drivers/nvs.hpp @@ -13,7 +13,7 @@ #include "esp_err.h" #include "nvs.h" -#include "bluetooth_types.hpp" +#include "drivers/bluetooth_types.hpp" #include "lru_cache.hpp" namespace drivers { diff --git a/src/drivers/include/samd.hpp b/src/drivers/include/drivers/samd.hpp similarity index 100% rename from src/drivers/include/samd.hpp rename to src/drivers/include/drivers/samd.hpp diff --git a/src/drivers/include/spi.hpp b/src/drivers/include/drivers/spi.hpp similarity index 100% rename from src/drivers/include/spi.hpp rename to src/drivers/include/drivers/spi.hpp diff --git a/src/drivers/include/spiffs.hpp b/src/drivers/include/drivers/spiffs.hpp similarity index 100% rename from src/drivers/include/spiffs.hpp rename to src/drivers/include/drivers/spiffs.hpp diff --git a/src/drivers/include/storage.hpp b/src/drivers/include/drivers/storage.hpp similarity index 98% rename from src/drivers/include/storage.hpp rename to src/drivers/include/drivers/storage.hpp index 836bbbdc..3aefff2d 100644 --- a/src/drivers/include/storage.hpp +++ b/src/drivers/include/drivers/storage.hpp @@ -15,7 +15,7 @@ #include "ff.h" #include "result.hpp" -#include "gpios.hpp" +#include "drivers/gpios.hpp" namespace drivers { diff --git a/src/drivers/include/touchwheel.hpp b/src/drivers/include/drivers/touchwheel.hpp similarity index 97% rename from src/drivers/include/touchwheel.hpp rename to src/drivers/include/drivers/touchwheel.hpp index 18ace2b4..60902087 100644 --- a/src/drivers/include/touchwheel.hpp +++ b/src/drivers/include/drivers/touchwheel.hpp @@ -12,7 +12,7 @@ #include "esp_err.h" #include "result.hpp" -#include "gpios.hpp" +#include "drivers/gpios.hpp" namespace drivers { diff --git a/src/drivers/include/wm8523.hpp b/src/drivers/include/drivers/wm8523.hpp similarity index 100% rename from src/drivers/include/wm8523.hpp rename to src/drivers/include/drivers/wm8523.hpp diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp index 0aaf79f0..1389fd0d 100644 --- a/src/drivers/nvs.cpp +++ b/src/drivers/nvs.cpp @@ -4,19 +4,19 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "nvs.hpp" +#include "drivers/nvs.hpp" #include #include -#include "bluetooth.hpp" -#include "bluetooth_types.hpp" #include "cppbor.h" #include "cppbor_parse.h" +#include "drivers/bluetooth.hpp" +#include "drivers/bluetooth_types.hpp" +#include "drivers/wm8523.hpp" #include "esp_log.h" #include "nvs.h" #include "nvs_flash.h" -#include "wm8523.hpp" namespace drivers { @@ -39,8 +39,8 @@ static constexpr char kKeyDisplayRows[] = "disprows"; static constexpr char kKeyHapticMotorType[] = "hapticmtype"; static constexpr char kKeyDbAutoIndex[] = "dbautoindex"; -static auto nvs_get_string(nvs_handle_t nvs, const char* key) - -> std::optional { +static auto nvs_get_string(nvs_handle_t nvs, + const char* key) -> std::optional { size_t len = 0; if (nvs_get_blob(nvs, key, NULL, &len) != ESP_OK) { return {}; @@ -187,8 +187,7 @@ auto NvsStorage::Read() -> void { lock_polarity_.read(handle_); display_cols_.read(handle_); display_rows_.read(handle_); - haptic_motor_type_.read(handle_), - brightness_.read(handle_); + haptic_motor_type_.read(handle_), brightness_.read(handle_); sensitivity_.read(handle_); amp_max_vol_.read(handle_); amp_cur_vol_.read(handle_); @@ -205,8 +204,7 @@ auto NvsStorage::Write() -> bool { lock_polarity_.write(handle_); display_cols_.write(handle_); display_rows_.write(handle_); - haptic_motor_type_.write(handle_), - brightness_.write(handle_); + haptic_motor_type_.write(handle_), brightness_.write(handle_); sensitivity_.write(handle_); amp_max_vol_.write(handle_); amp_cur_vol_.write(handle_); @@ -287,8 +285,8 @@ auto NvsStorage::BluetoothVolume(const bluetooth::mac_addr_t& mac) -> uint8_t { return bt_volumes_.Get(mac).value_or(50); } -auto NvsStorage::BluetoothVolume(const bluetooth::mac_addr_t& mac, uint8_t vol) - -> void { +auto NvsStorage::BluetoothVolume(const bluetooth::mac_addr_t& mac, + uint8_t vol) -> void { std::lock_guard lock{mutex_}; bt_volumes_dirty_ = true; bt_volumes_.Put(mac, vol); diff --git a/src/drivers/samd.cpp b/src/drivers/samd.cpp index e47d9cfe..c5e8c08a 100644 --- a/src/drivers/samd.cpp +++ b/src/drivers/samd.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "samd.hpp" +#include "drivers/samd.hpp" #include #include @@ -15,7 +15,7 @@ #include "hal/gpio_types.h" #include "hal/i2c_types.h" -#include "i2c.hpp" +#include "drivers/i2c.hpp" enum Registers : uint8_t { kSamdFirmwareVersion = 0, diff --git a/src/drivers/spi.cpp b/src/drivers/spi.cpp index ae6f83a2..f4d3ea6e 100644 --- a/src/drivers/spi.cpp +++ b/src/drivers/spi.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "spi.hpp" +#include "drivers/spi.hpp" #include "driver/sdspi_host.h" #include "driver/spi_common.h" diff --git a/src/drivers/spiffs.cpp b/src/drivers/spiffs.cpp index f03d2f68..30a2db33 100644 --- a/src/drivers/spiffs.cpp +++ b/src/drivers/spiffs.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "spiffs.hpp" +#include "drivers/spiffs.hpp" #include "esp_err.h" #include "esp_log.h" diff --git a/src/drivers/storage.cpp b/src/drivers/storage.cpp index b3588130..b2b7174e 100644 --- a/src/drivers/storage.cpp +++ b/src/drivers/storage.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "storage.hpp" +#include "drivers/storage.hpp" #include #include @@ -23,7 +23,7 @@ #include "hal/spi_types.h" #include "sdmmc_cmd.h" -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "memory_resource.hpp" [[maybe_unused]] static const char* kTag = "SDSTORAGE"; diff --git a/src/drivers/test/test_dac.cpp b/src/drivers/test/test_dac.cpp index e8d8dd94..2269f280 100644 --- a/src/drivers/test/test_dac.cpp +++ b/src/drivers/test/test_dac.cpp @@ -10,8 +10,8 @@ #include "catch2/catch.hpp" -#include "gpios.hpp" -#include "i2c.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" #include "i2c_fixture.hpp" namespace drivers { diff --git a/src/drivers/test/test_gpio_expander.cpp b/src/drivers/test/test_gpio_expander.cpp index 972bcf09..7c323313 100644 --- a/src/drivers/test/test_gpio_expander.cpp +++ b/src/drivers/test/test_gpio_expander.cpp @@ -4,11 +4,11 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "catch2/catch.hpp" -#include "i2c.hpp" +#include "drivers/i2c.hpp" #include "i2c_fixture.hpp" namespace drivers { diff --git a/src/drivers/test/test_storage.cpp b/src/drivers/test/test_storage.cpp index 062de3af..f97a0a85 100644 --- a/src/drivers/test/test_storage.cpp +++ b/src/drivers/test/test_storage.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "storage.hpp" +#include "drivers/storage.hpp" #include @@ -14,10 +14,10 @@ #include "catch2/catch.hpp" -#include "gpios.hpp" -#include "i2c.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" +#include "drivers/spi.hpp" #include "i2c_fixture.hpp" -#include "spi.hpp" #include "spi_fixture.hpp" namespace drivers { diff --git a/src/drivers/touchwheel.cpp b/src/drivers/touchwheel.cpp index 41b9a6af..5d55c6f2 100644 --- a/src/drivers/touchwheel.cpp +++ b/src/drivers/touchwheel.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" #include #include @@ -18,7 +18,7 @@ #include "hal/gpio_types.h" #include "hal/i2c_types.h" -#include "i2c.hpp" +#include "drivers/i2c.hpp" namespace drivers { diff --git a/src/drivers/wm8523.cpp b/src/drivers/wm8523.cpp index 9fe3e001..26316387 100644 --- a/src/drivers/wm8523.cpp +++ b/src/drivers/wm8523.cpp @@ -3,14 +3,14 @@ * * SPDX-License-Identifier: GPL-3.0-only */ -#include "wm8523.hpp" +#include "drivers/wm8523.hpp" #include #include "esp_err.h" +#include "drivers/i2c.hpp" #include "hal/i2c_types.h" -#include "i2c.hpp" namespace drivers { namespace wm8523 { diff --git a/src/main/main.cpp b/src/main/main.cpp index 811f2709..8c7565f3 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -10,8 +10,8 @@ #include "tinyfsm.hpp" #include "audio/audio_fsm.hpp" +#include "drivers/i2c.hpp" #include "events/event_queue.hpp" -#include "i2c.hpp" #include "system_fsm/system_events.hpp" #include "system_fsm/system_fsm.hpp" #include "ui/ui_fsm.hpp" diff --git a/src/tangara/app_console/app_console.cpp b/src/tangara/app_console/app_console.cpp index 09f267d8..e3048ba2 100644 --- a/src/tangara/app_console/app_console.cpp +++ b/src/tangara/app_console/app_console.cpp @@ -31,11 +31,11 @@ #include "ff.h" #include "freertos/projdefs.h" -#include "bluetooth.hpp" -#include "bluetooth_types.hpp" -#include "haptics.hpp" +#include "drivers/bluetooth.hpp" +#include "drivers/bluetooth_types.hpp" +#include "drivers/haptics.hpp" +#include "drivers/samd.hpp" #include "memory_resource.hpp" -#include "samd.hpp" #include "audio/audio_events.hpp" #include "audio/audio_fsm.hpp" diff --git a/src/tangara/app_console/app_console.hpp b/src/tangara/app_console/app_console.hpp index 07f764f5..b88b1330 100644 --- a/src/tangara/app_console/app_console.hpp +++ b/src/tangara/app_console/app_console.hpp @@ -9,10 +9,10 @@ #include #include "audio/track_queue.hpp" -#include "bluetooth.hpp" +#include "drivers/bluetooth.hpp" #include "dev_console/console.hpp" #include "database/database.hpp" -#include "samd.hpp" +#include "drivers/samd.hpp" #include "system_fsm/service_locator.hpp" namespace console { diff --git a/src/tangara/audio/audio_converter.cpp b/src/tangara/audio/audio_converter.cpp index 0690b8d3..da8e3916 100644 --- a/src/tangara/audio/audio_converter.cpp +++ b/src/tangara/audio/audio_converter.cpp @@ -13,12 +13,12 @@ #include "audio/audio_events.hpp" #include "audio/audio_sink.hpp" +#include "drivers/i2s_dac.hpp" #include "esp_heap_caps.h" #include "esp_log.h" #include "events/event_queue.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "i2s_dac.hpp" #include "audio/resample.hpp" #include "sample.hpp" diff --git a/src/tangara/audio/audio_decoder.cpp b/src/tangara/audio/audio_decoder.cpp index 1ef30b2c..ae54a11c 100644 --- a/src/tangara/audio/audio_decoder.cpp +++ b/src/tangara/audio/audio_decoder.cpp @@ -33,8 +33,8 @@ #include "audio/fatfs_audio_input.hpp" #include "codec.hpp" #include "database/track.hpp" +#include "drivers/i2s_dac.hpp" #include "events/event_queue.hpp" -#include "i2s_dac.hpp" #include "sample.hpp" #include "tasks.hpp" #include "types.hpp" diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index 349f49b3..f504da2e 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -12,9 +12,9 @@ #include #include "audio/audio_sink.hpp" -#include "bluetooth_types.hpp" #include "cppbor.h" #include "cppbor_parse.h" +#include "drivers/bluetooth_types.hpp" #include "esp_heap_caps.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" @@ -28,17 +28,17 @@ #include "audio/fatfs_audio_input.hpp" #include "audio/i2s_audio_output.hpp" #include "audio/track_queue.hpp" -#include "bluetooth.hpp" #include "database/future_fetcher.hpp" #include "database/track.hpp" +#include "drivers/bluetooth.hpp" +#include "drivers/i2s_dac.hpp" +#include "drivers/nvs.hpp" +#include "drivers/wm8523.hpp" #include "events/event_queue.hpp" -#include "i2s_dac.hpp" -#include "nvs.hpp" #include "sample.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "wm8523.hpp" namespace audio { diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index 6f14d2d9..b3d64719 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -24,10 +24,10 @@ #include "database/database.hpp" #include "database/tag_parser.hpp" #include "database/track.hpp" -#include "display.hpp" -#include "gpios.hpp" -#include "i2s_dac.hpp" -#include "storage.hpp" +#include "drivers/display.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2s_dac.hpp" +#include "drivers/storage.hpp" #include "system_fsm/system_events.hpp" namespace audio { diff --git a/src/tangara/audio/bt_audio_output.cpp b/src/tangara/audio/bt_audio_output.cpp index b4bcaae8..637c0c9a 100644 --- a/src/tangara/audio/bt_audio_output.cpp +++ b/src/tangara/audio/bt_audio_output.cpp @@ -18,12 +18,12 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "gpios.hpp" -#include "i2c.hpp" -#include "i2s_dac.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" +#include "drivers/i2s_dac.hpp" +#include "drivers/wm8523.hpp" #include "result.hpp" #include "tasks.hpp" -#include "wm8523.hpp" [[maybe_unused]] static const char* kTag = "BTOUT"; diff --git a/src/tangara/audio/bt_audio_output.hpp b/src/tangara/audio/bt_audio_output.hpp index 0818d0d7..942715b7 100644 --- a/src/tangara/audio/bt_audio_output.hpp +++ b/src/tangara/audio/bt_audio_output.hpp @@ -14,9 +14,9 @@ #include "result.hpp" #include "audio/audio_sink.hpp" -#include "bluetooth.hpp" -#include "gpios.hpp" -#include "i2s_dac.hpp" +#include "drivers/bluetooth.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2s_dac.hpp" #include "tasks.hpp" namespace audio { diff --git a/src/tangara/audio/fatfs_audio_input.cpp b/src/tangara/audio/fatfs_audio_input.cpp index 0868d71a..dc9133ed 100644 --- a/src/tangara/audio/fatfs_audio_input.cpp +++ b/src/tangara/audio/fatfs_audio_input.cpp @@ -33,8 +33,8 @@ #include "database/future_fetcher.hpp" #include "database/tag_parser.hpp" #include "database/track.hpp" +#include "drivers/spi.hpp" #include "events/event_queue.hpp" -#include "spi.hpp" #include "tasks.hpp" #include "types.hpp" diff --git a/src/tangara/audio/fatfs_source.cpp b/src/tangara/audio/fatfs_source.cpp index 645e0a1e..fb6a684d 100644 --- a/src/tangara/audio/fatfs_source.cpp +++ b/src/tangara/audio/fatfs_source.cpp @@ -17,7 +17,7 @@ #include "audio/audio_source.hpp" #include "codec.hpp" -#include "spi.hpp" +#include "drivers/spi.hpp" #include "system_fsm/system_events.hpp" #include "types.hpp" diff --git a/src/tangara/audio/i2s_audio_output.cpp b/src/tangara/audio/i2s_audio_output.cpp index 4f03c1a5..20297193 100644 --- a/src/tangara/audio/i2s_audio_output.cpp +++ b/src/tangara/audio/i2s_audio_output.cpp @@ -19,11 +19,11 @@ #include "freertos/projdefs.h" #include "audio/audio_sink.hpp" -#include "gpios.hpp" -#include "i2c.hpp" -#include "i2s_dac.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" +#include "drivers/i2s_dac.hpp" +#include "drivers/wm8523.hpp" #include "result.hpp" -#include "wm8523.hpp" [[maybe_unused]] static const char* kTag = "I2SOUT"; diff --git a/src/tangara/audio/i2s_audio_output.hpp b/src/tangara/audio/i2s_audio_output.hpp index 13494a6c..f0ce2cf8 100644 --- a/src/tangara/audio/i2s_audio_output.hpp +++ b/src/tangara/audio/i2s_audio_output.hpp @@ -12,8 +12,8 @@ #include #include "audio/audio_sink.hpp" -#include "gpios.hpp" -#include "i2s_dac.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2s_dac.hpp" #include "result.hpp" namespace audio { diff --git a/src/tangara/audio/readahead_source.cpp b/src/tangara/audio/readahead_source.cpp index 71684ddb..602ec0b1 100644 --- a/src/tangara/audio/readahead_source.cpp +++ b/src/tangara/audio/readahead_source.cpp @@ -16,8 +16,8 @@ #include "audio/audio_source.hpp" #include "codec.hpp" +#include "drivers/spi.hpp" #include "freertos/portmacro.h" -#include "spi.hpp" #include "tasks.hpp" #include "types.hpp" diff --git a/src/tangara/battery/battery.cpp b/src/tangara/battery/battery.cpp index f75914ba..2d2fff56 100644 --- a/src/tangara/battery/battery.cpp +++ b/src/tangara/battery/battery.cpp @@ -8,10 +8,10 @@ #include -#include "adc.hpp" +#include "drivers/adc.hpp" +#include "drivers/samd.hpp" #include "events/event_queue.hpp" #include "freertos/portmacro.h" -#include "samd.hpp" #include "system_fsm/system_events.hpp" namespace battery { diff --git a/src/tangara/battery/battery.hpp b/src/tangara/battery/battery.hpp index 314cd373..80b0f2d2 100644 --- a/src/tangara/battery/battery.hpp +++ b/src/tangara/battery/battery.hpp @@ -11,8 +11,8 @@ #include "freertos/FreeRTOS.h" #include "freertos/timers.h" -#include "adc.hpp" -#include "samd.hpp" +#include "drivers/adc.hpp" +#include "drivers/samd.hpp" namespace battery { diff --git a/src/tangara/database/database.cpp b/src/tangara/database/database.cpp index ddb63907..4064c3ed 100644 --- a/src/tangara/database/database.cpp +++ b/src/tangara/database/database.cpp @@ -42,10 +42,10 @@ #include "database/records.hpp" #include "database/tag_parser.hpp" #include "database/track.hpp" +#include "drivers/spi.hpp" #include "events/event_queue.hpp" #include "memory_resource.hpp" #include "result.hpp" -#include "spi.hpp" #include "tasks.hpp" namespace database { diff --git a/src/tangara/database/env_esp.cpp b/src/tangara/database/env_esp.cpp index 2cf74c3e..86a30613 100644 --- a/src/tangara/database/env_esp.cpp +++ b/src/tangara/database/env_esp.cpp @@ -36,7 +36,7 @@ #include "leveldb/slice.h" #include "leveldb/status.h" -#include "spi.hpp" +#include "drivers/spi.hpp" #include "tasks.hpp" namespace leveldb { diff --git a/src/tangara/database/file_gatherer.cpp b/src/tangara/database/file_gatherer.cpp index 141259c2..75a1af27 100644 --- a/src/tangara/database/file_gatherer.cpp +++ b/src/tangara/database/file_gatherer.cpp @@ -13,8 +13,8 @@ #include "ff.h" +#include "drivers/spi.hpp" #include "memory_resource.hpp" -#include "spi.hpp" namespace database { diff --git a/src/tangara/database/tag_parser.cpp b/src/tangara/database/tag_parser.cpp index 86bd6443..2df2d90f 100644 --- a/src/tangara/database/tag_parser.cpp +++ b/src/tangara/database/tag_parser.cpp @@ -11,9 +11,9 @@ #include #include +#include "drivers/spi.hpp" #include "esp_log.h" #include "ff.h" -#include "spi.hpp" #include "tags.h" #include "memory_resource.hpp" diff --git a/src/tangara/input/device_factory.hpp b/src/tangara/input/device_factory.hpp index 862c8728..5044d025 100644 --- a/src/tangara/input/device_factory.hpp +++ b/src/tangara/input/device_factory.hpp @@ -12,7 +12,7 @@ #include "input/feedback_device.hpp" #include "input/input_device.hpp" #include "input/input_touch_wheel.hpp" -#include "nvs.hpp" +#include "drivers/nvs.hpp" #include "system_fsm/service_locator.hpp" namespace input { diff --git a/src/tangara/input/feedback_haptics.cpp b/src/tangara/input/feedback_haptics.cpp index 90a912ec..e690eb9f 100644 --- a/src/tangara/input/feedback_haptics.cpp +++ b/src/tangara/input/feedback_haptics.cpp @@ -13,7 +13,7 @@ #include "core/lv_event.h" #include "esp_log.h" -#include "haptics.hpp" +#include "drivers/haptics.hpp" namespace input { diff --git a/src/tangara/input/feedback_haptics.hpp b/src/tangara/input/feedback_haptics.hpp index 5727c0f3..bde5f345 100644 --- a/src/tangara/input/feedback_haptics.hpp +++ b/src/tangara/input/feedback_haptics.hpp @@ -8,7 +8,7 @@ #include -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include "input/feedback_device.hpp" namespace input { diff --git a/src/tangara/input/input_hook.cpp b/src/tangara/input/input_hook.cpp index d346b863..6946c07f 100644 --- a/src/tangara/input/input_hook.cpp +++ b/src/tangara/input/input_hook.cpp @@ -70,8 +70,8 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { } } -auto TriggerHooks::override(Trigger::State s, std::optional cb) - -> void { +auto TriggerHooks::override(Trigger::State s, + std::optional cb) -> void { switch (s) { case Trigger::State::kClick: click_.override(cb); diff --git a/src/tangara/input/input_nav_buttons.cpp b/src/tangara/input/input_nav_buttons.cpp index 28711e4e..ba1f4b74 100644 --- a/src/tangara/input/input_nav_buttons.cpp +++ b/src/tangara/input/input_nav_buttons.cpp @@ -6,8 +6,8 @@ #include "input/input_nav_buttons.hpp" +#include "drivers/gpios.hpp" #include "events/event_queue.hpp" -#include "gpios.hpp" #include "hal/lv_hal_indev.h" #include "input/input_hook_actions.hpp" diff --git a/src/tangara/input/input_nav_buttons.hpp b/src/tangara/input/input_nav_buttons.hpp index 1349ff72..ce2312a0 100644 --- a/src/tangara/input/input_nav_buttons.hpp +++ b/src/tangara/input/input_nav_buttons.hpp @@ -8,14 +8,14 @@ #include -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "hal/lv_hal_indev.h" -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include "input/input_device.hpp" #include "input/input_hook.hpp" #include "input/input_trigger.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_touch_dpad.cpp b/src/tangara/input/input_touch_dpad.cpp index f7e12fc5..9275b510 100644 --- a/src/tangara/input/input_touch_dpad.cpp +++ b/src/tangara/input/input_touch_dpad.cpp @@ -10,8 +10,8 @@ #include "hal/lv_hal_indev.h" -#include "haptics.hpp" -#include "touchwheel.hpp" +#include "drivers/haptics.hpp" +#include "drivers/touchwheel.hpp" #include "events/event_queue.hpp" #include "input/input_device.hpp" diff --git a/src/tangara/input/input_touch_dpad.hpp b/src/tangara/input/input_touch_dpad.hpp index a0406e2b..8fb14832 100644 --- a/src/tangara/input/input_touch_dpad.hpp +++ b/src/tangara/input/input_touch_dpad.hpp @@ -10,11 +10,11 @@ #include "hal/lv_hal_indev.h" -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include "input/input_device.hpp" #include "input/input_hook.hpp" #include "input/input_trigger.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp index a496e882..2c4a8b03 100644 --- a/src/tangara/input/input_touch_wheel.cpp +++ b/src/tangara/input/input_touch_wheel.cpp @@ -11,14 +11,14 @@ #include "hal/lv_hal_indev.h" +#include "drivers/haptics.hpp" +#include "drivers/nvs.hpp" +#include "drivers/touchwheel.hpp" #include "events/event_queue.hpp" -#include "haptics.hpp" #include "input/input_device.hpp" #include "input/input_hook_actions.hpp" #include "input/input_trigger.hpp" #include "lua/property.hpp" -#include "nvs.hpp" -#include "touchwheel.hpp" #include "ui/ui_events.hpp" namespace input { diff --git a/src/tangara/input/input_touch_wheel.hpp b/src/tangara/input/input_touch_wheel.hpp index b45ba361..d023873a 100644 --- a/src/tangara/input/input_touch_wheel.hpp +++ b/src/tangara/input/input_touch_wheel.hpp @@ -11,13 +11,13 @@ #include "hal/lv_hal_indev.h" -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include "input/input_device.hpp" #include "input/input_hook.hpp" #include "input/input_trigger.hpp" #include "lua/property.hpp" -#include "nvs.hpp" -#include "touchwheel.hpp" +#include "drivers/nvs.hpp" +#include "drivers/touchwheel.hpp" namespace input { diff --git a/src/tangara/input/input_volume_buttons.cpp b/src/tangara/input/input_volume_buttons.cpp index 16267ef6..3c3fb2a3 100644 --- a/src/tangara/input/input_volume_buttons.cpp +++ b/src/tangara/input/input_volume_buttons.cpp @@ -5,8 +5,8 @@ */ #include "input/input_volume_buttons.hpp" +#include "drivers/gpios.hpp" #include "events/event_queue.hpp" -#include "gpios.hpp" #include "input/input_hook_actions.hpp" namespace input { diff --git a/src/tangara/input/input_volume_buttons.hpp b/src/tangara/input/input_volume_buttons.hpp index 8a0ed18d..22a8acf2 100644 --- a/src/tangara/input/input_volume_buttons.hpp +++ b/src/tangara/input/input_volume_buttons.hpp @@ -8,13 +8,13 @@ #include -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "hal/lv_hal_indev.h" -#include "haptics.hpp" +#include "drivers/haptics.hpp" #include "input/input_device.hpp" #include "input/input_hook.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" namespace input { diff --git a/src/tangara/input/lvgl_input_driver.cpp b/src/tangara/input/lvgl_input_driver.cpp index 1cd7167b..8d10bb13 100644 --- a/src/tangara/input/lvgl_input_driver.cpp +++ b/src/tangara/input/lvgl_input_driver.cpp @@ -13,7 +13,7 @@ #include "lua.hpp" #include "lvgl.h" -#include "nvs.hpp" +#include "drivers/nvs.hpp" #include "input/device_factory.hpp" #include "input/feedback_haptics.hpp" diff --git a/src/tangara/input/lvgl_input_driver.hpp b/src/tangara/input/lvgl_input_driver.hpp index 6be24f7f..8ede1855 100644 --- a/src/tangara/input/lvgl_input_driver.hpp +++ b/src/tangara/input/lvgl_input_driver.hpp @@ -12,7 +12,7 @@ #include #include "core/lv_group.h" -#include "gpios.hpp" +#include "drivers/gpios.hpp" #include "hal/lv_hal_indev.h" #include "input/device_factory.hpp" #include "input/feedback_device.hpp" @@ -21,8 +21,8 @@ #include "input/input_hook.hpp" #include "lua/lua_thread.hpp" #include "lua/property.hpp" -#include "nvs.hpp" -#include "touchwheel.hpp" +#include "drivers/nvs.hpp" +#include "drivers/touchwheel.hpp" namespace input { diff --git a/src/tangara/lua/bridge.cpp b/src/tangara/lua/bridge.cpp index 17dd41cc..07c299a7 100644 --- a/src/tangara/lua/bridge.cpp +++ b/src/tangara/lua/bridge.cpp @@ -46,8 +46,9 @@ namespace lua { static constexpr char kBridgeKey[] = "bridge"; -static auto make_font_cb(const char* name, int size, int weight) - -> const lv_font_t* { +static auto make_font_cb(const char* name, + int size, + int weight) -> const lv_font_t* { if (std::string{"fusion"} == name) { if (size == 12) { return &font_fusion_12; diff --git a/src/tangara/lua/lua_controls.cpp b/src/tangara/lua/lua_controls.cpp index ab5b3c02..baf40891 100644 --- a/src/tangara/lua/lua_controls.cpp +++ b/src/tangara/lua/lua_controls.cpp @@ -16,7 +16,7 @@ #include "lua.h" #include "lvgl.h" -#include "nvs.hpp" +#include "drivers/nvs.hpp" #include "ui/ui_events.hpp" namespace lua { diff --git a/src/tangara/lua/property.cpp b/src/tangara/lua/property.cpp index 951c225f..2b93809d 100644 --- a/src/tangara/lua/property.cpp +++ b/src/tangara/lua/property.cpp @@ -14,8 +14,8 @@ #include #include -#include "bluetooth_types.hpp" #include "database/track.hpp" +#include "drivers/bluetooth_types.hpp" #include "lauxlib.h" #include "lua.h" #include "lua.hpp" diff --git a/src/tangara/lua/property.hpp b/src/tangara/lua/property.hpp index 2df61bad..9f925766 100644 --- a/src/tangara/lua/property.hpp +++ b/src/tangara/lua/property.hpp @@ -11,7 +11,7 @@ #include #include "audio/audio_events.hpp" -#include "bluetooth_types.hpp" +#include "drivers/bluetooth_types.hpp" #include "lua.hpp" #include "lvgl.h" #include "system_fsm/service_locator.hpp" diff --git a/src/tangara/system_fsm/booting.cpp b/src/tangara/system_fsm/booting.cpp index d9e05c39..58f14706 100644 --- a/src/tangara/system_fsm/booting.cpp +++ b/src/tangara/system_fsm/booting.cpp @@ -5,8 +5,8 @@ */ #include "collation.hpp" -#include "haptics.hpp" -#include "spiffs.hpp" +#include "drivers/haptics.hpp" +#include "drivers/spiffs.hpp" #include "system_fsm/system_fsm.hpp" #include @@ -20,24 +20,24 @@ #include "freertos/projdefs.h" #include "freertos/timers.h" -#include "adc.hpp" #include "audio/audio_fsm.hpp" #include "audio/track_queue.hpp" #include "battery/battery.hpp" -#include "bluetooth.hpp" -#include "bluetooth_types.hpp" #include "database/tag_parser.hpp" -#include "display_init.hpp" +#include "drivers/adc.hpp" +#include "drivers/bluetooth.hpp" +#include "drivers/bluetooth_types.hpp" +#include "drivers/display_init.hpp" +#include "drivers/gpios.hpp" +#include "drivers/i2c.hpp" +#include "drivers/nvs.hpp" +#include "drivers/samd.hpp" +#include "drivers/spi.hpp" +#include "drivers/touchwheel.hpp" #include "events/event_queue.hpp" -#include "gpios.hpp" -#include "i2c.hpp" -#include "nvs.hpp" -#include "samd.hpp" -#include "spi.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" #include "tasks.hpp" -#include "touchwheel.hpp" #include "ui/ui_fsm.hpp" namespace system_fsm { diff --git a/src/tangara/system_fsm/idle.cpp b/src/tangara/system_fsm/idle.cpp index 243faa5b..e499693d 100644 --- a/src/tangara/system_fsm/idle.cpp +++ b/src/tangara/system_fsm/idle.cpp @@ -6,15 +6,15 @@ #include "app_console/app_console.hpp" #include "database/file_gatherer.hpp" +#include "drivers/gpios.hpp" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "gpios.hpp" #include "result.hpp" #include "audio/audio_fsm.hpp" +#include "drivers/samd.hpp" +#include "drivers/storage.hpp" #include "events/event_queue.hpp" -#include "samd.hpp" -#include "storage.hpp" #include "system_fsm/system_events.hpp" #include "system_fsm/system_fsm.hpp" #include "ui/ui_fsm.hpp" diff --git a/src/tangara/system_fsm/running.cpp b/src/tangara/system_fsm/running.cpp index a19abdaf..82edd018 100644 --- a/src/tangara/system_fsm/running.cpp +++ b/src/tangara/system_fsm/running.cpp @@ -9,15 +9,15 @@ #include "database/database.hpp" #include "database/db_events.hpp" #include "database/file_gatherer.hpp" +#include "drivers/gpios.hpp" #include "ff.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "gpios.hpp" #include "result.hpp" #include "audio/audio_fsm.hpp" +#include "drivers/storage.hpp" #include "events/event_queue.hpp" -#include "storage.hpp" #include "system_fsm/system_events.hpp" #include "system_fsm/system_fsm.hpp" #include "ui/ui_fsm.hpp" diff --git a/src/tangara/system_fsm/service_locator.cpp b/src/tangara/system_fsm/service_locator.cpp index 610406f9..ef719930 100644 --- a/src/tangara/system_fsm/service_locator.cpp +++ b/src/tangara/system_fsm/service_locator.cpp @@ -8,9 +8,9 @@ #include -#include "nvs.hpp" -#include "storage.hpp" -#include "touchwheel.hpp" +#include "drivers/nvs.hpp" +#include "drivers/storage.hpp" +#include "drivers/touchwheel.hpp" namespace system_fsm { diff --git a/src/tangara/system_fsm/service_locator.hpp b/src/tangara/system_fsm/service_locator.hpp index a76488ab..5b2205eb 100644 --- a/src/tangara/system_fsm/service_locator.hpp +++ b/src/tangara/system_fsm/service_locator.hpp @@ -10,17 +10,17 @@ #include "audio/track_queue.hpp" #include "battery/battery.hpp" -#include "bluetooth.hpp" +#include "drivers/bluetooth.hpp" #include "collation.hpp" #include "database/database.hpp" #include "database/tag_parser.hpp" -#include "gpios.hpp" -#include "haptics.hpp" -#include "nvs.hpp" -#include "samd.hpp" -#include "storage.hpp" +#include "drivers/gpios.hpp" +#include "drivers/haptics.hpp" +#include "drivers/nvs.hpp" +#include "drivers/samd.hpp" +#include "drivers/storage.hpp" #include "tasks.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" namespace system_fsm { diff --git a/src/tangara/system_fsm/system_events.hpp b/src/tangara/system_fsm/system_events.hpp index 4f1614bf..c174a1da 100644 --- a/src/tangara/system_fsm/system_events.hpp +++ b/src/tangara/system_fsm/system_events.hpp @@ -9,11 +9,11 @@ #include #include "battery/battery.hpp" -#include "bluetooth_types.hpp" +#include "drivers/bluetooth_types.hpp" #include "database/database.hpp" #include "ff.h" -#include "haptics.hpp" -#include "samd.hpp" +#include "drivers/haptics.hpp" +#include "drivers/samd.hpp" #include "system_fsm/service_locator.hpp" #include "tinyfsm.hpp" diff --git a/src/tangara/system_fsm/system_fsm.cpp b/src/tangara/system_fsm/system_fsm.cpp index 7b5e2234..2e819569 100644 --- a/src/tangara/system_fsm/system_fsm.cpp +++ b/src/tangara/system_fsm/system_fsm.cpp @@ -9,8 +9,8 @@ #include "audio/track_queue.hpp" #include "database/tag_parser.hpp" #include "driver/gpio.h" +#include "drivers/gpios.hpp" #include "events/event_queue.hpp" -#include "gpios.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" diff --git a/src/tangara/system_fsm/system_fsm.hpp b/src/tangara/system_fsm/system_fsm.hpp index d2971734..d69141dd 100644 --- a/src/tangara/system_fsm/system_fsm.hpp +++ b/src/tangara/system_fsm/system_fsm.hpp @@ -15,19 +15,19 @@ #include "audio/audio_events.hpp" #include "audio/track_queue.hpp" #include "battery/battery.hpp" -#include "bluetooth.hpp" +#include "drivers/bluetooth.hpp" #include "database/database.hpp" #include "database/db_events.hpp" #include "database/tag_parser.hpp" -#include "display.hpp" -#include "gpios.hpp" -#include "nvs.hpp" -#include "samd.hpp" -#include "storage.hpp" +#include "drivers/display.hpp" +#include "drivers/gpios.hpp" +#include "drivers/nvs.hpp" +#include "drivers/samd.hpp" +#include "drivers/storage.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" namespace system_fsm { diff --git a/src/tangara/ui/lvgl_task.cpp b/src/tangara/ui/lvgl_task.cpp index 33c3667d..448aa261 100644 --- a/src/tangara/ui/lvgl_task.cpp +++ b/src/tangara/ui/lvgl_task.cpp @@ -20,6 +20,7 @@ #include "core/lv_obj.h" #include "core/lv_obj_pos.h" #include "core/lv_obj_tree.h" +#include "drivers/touchwheel.hpp" #include "esp_log.h" #include "events/event_queue.hpp" #include "extra/themes/basic/lv_theme_basic.h" @@ -38,13 +39,12 @@ #include "misc/lv_style.h" #include "misc/lv_timer.h" #include "tasks.hpp" -#include "touchwheel.hpp" #include "ui/modal.hpp" #include "ui/ui_fsm.hpp" #include "widgets/lv_label.h" -#include "display.hpp" -#include "gpios.hpp" +#include "drivers/display.hpp" +#include "drivers/gpios.hpp" namespace ui { diff --git a/src/tangara/ui/lvgl_task.hpp b/src/tangara/ui/lvgl_task.hpp index dc611d75..fcf00ab1 100644 --- a/src/tangara/ui/lvgl_task.hpp +++ b/src/tangara/ui/lvgl_task.hpp @@ -14,9 +14,9 @@ #include "freertos/task.h" #include "freertos/timers.h" -#include "display.hpp" +#include "drivers/display.hpp" #include "input/lvgl_input_driver.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" #include "ui/screen.hpp" #include "ui/themes.hpp" diff --git a/src/tangara/ui/ui_events.hpp b/src/tangara/ui/ui_events.hpp index 613b9629..cb446cd2 100644 --- a/src/tangara/ui/ui_events.hpp +++ b/src/tangara/ui/ui_events.hpp @@ -9,8 +9,8 @@ #include #include "database/database.hpp" #include "database/index.hpp" -#include "gpios.hpp" -#include "nvs.hpp" +#include "drivers/gpios.hpp" +#include "drivers/nvs.hpp" #include "tinyfsm.hpp" #include "ui/screen.hpp" diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp index 614d5216..17967e20 100644 --- a/src/tangara/ui/ui_fsm.cpp +++ b/src/tangara/ui/ui_fsm.cpp @@ -10,9 +10,9 @@ #include #include -#include "bluetooth_types.hpp" #include "database/db_events.hpp" -#include "display_init.hpp" +#include "drivers/bluetooth_types.hpp" +#include "drivers/display_init.hpp" #include "esp_spp_api.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" @@ -30,9 +30,9 @@ #include "core/lv_obj.h" #include "core/lv_obj_tree.h" #include "database/database.hpp" +#include "drivers/haptics.hpp" #include "esp_heap_caps.h" #include "esp_timer.h" -#include "haptics.hpp" #include "input/lvgl_input_driver.hpp" #include "lauxlib.h" #include "lua/lua_thread.hpp" @@ -42,18 +42,18 @@ #include "audio/audio_events.hpp" #include "audio/track_queue.hpp" -#include "display.hpp" +#include "drivers/display.hpp" +#include "drivers/gpios.hpp" +#include "drivers/nvs.hpp" +#include "drivers/samd.hpp" +#include "drivers/spiffs.hpp" +#include "drivers/storage.hpp" +#include "drivers/touchwheel.hpp" #include "events/event_queue.hpp" -#include "gpios.hpp" #include "lua/lua_registry.hpp" #include "lua/property.hpp" -#include "nvs.hpp" -#include "samd.hpp" -#include "spiffs.hpp" -#include "storage.hpp" #include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "touchwheel.hpp" #include "ui/lvgl_task.hpp" #include "ui/screen.hpp" #include "ui/screen_lua.hpp" diff --git a/src/tangara/ui/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp index e4f21ce0..54d8a9ac 100644 --- a/src/tangara/ui/ui_fsm.hpp +++ b/src/tangara/ui/ui_fsm.hpp @@ -15,8 +15,8 @@ #include "battery/battery.hpp" #include "database/db_events.hpp" #include "database/track.hpp" -#include "display.hpp" -#include "gpios.hpp" +#include "drivers/display.hpp" +#include "drivers/gpios.hpp" #include "input/device_factory.hpp" #include "input/feedback_haptics.hpp" #include "input/input_touch_wheel.hpp" @@ -24,12 +24,12 @@ #include "input/lvgl_input_driver.hpp" #include "lua/lua_thread.hpp" #include "lua/property.hpp" -#include "nvs.hpp" -#include "storage.hpp" +#include "drivers/nvs.hpp" +#include "drivers/storage.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "touchwheel.hpp" +#include "drivers/touchwheel.hpp" #include "ui/lvgl_task.hpp" #include "ui/modal.hpp" #include "ui/screen.hpp" diff --git a/src/util/random.cpp b/src/util/random.cpp index ae543765..2b2af9c7 100644 --- a/src/util/random.cpp +++ b/src/util/random.cpp @@ -29,8 +29,8 @@ auto Random::Next() -> std::uint64_t { return komirand(&seed1_, &seed2_); } -auto Random::RangeInclusive(std::uint64_t lower, std::uint64_t upper) - -> std::uint64_t { +auto Random::RangeInclusive(std::uint64_t lower, + std::uint64_t upper) -> std::uint64_t { return (Next() % (upper - lower + 1)) + lower; } From 9fafd797a5504f458b5fcae4a1d28a68da936315 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 3 May 2024 10:38:54 +1000 Subject: [PATCH 08/15] split c blobs of graphics data into their own component silences some compiler warnings from using c++ flags with c --- src/graphics/CMakeLists.txt | 7 + src/{tangara/ui => graphics}/font_fusion_10.c | 0 src/{tangara/ui => graphics}/font_fusion_12.c | 0 src/{tangara/ui => graphics}/splash.c | 0 src/tangara/CMakeLists.txt | 2 +- src/tangara/ui/font_symbols.c | 425 ------------------ 6 files changed, 8 insertions(+), 426 deletions(-) create mode 100644 src/graphics/CMakeLists.txt rename src/{tangara/ui => graphics}/font_fusion_10.c (100%) rename src/{tangara/ui => graphics}/font_fusion_12.c (100%) rename src/{tangara/ui => graphics}/splash.c (100%) delete mode 100644 src/tangara/ui/font_symbols.c diff --git a/src/graphics/CMakeLists.txt b/src/graphics/CMakeLists.txt new file mode 100644 index 00000000..5b2c5d58 --- /dev/null +++ b/src/graphics/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright 2024 jacqueline +# +# SPDX-License-Identifier: GPL-3.0-only + +idf_component_register( + SRCS "font_fusion_10.c" "font_fusion_12.c" "splash.c" + REQUIRES "lvgl") diff --git a/src/tangara/ui/font_fusion_10.c b/src/graphics/font_fusion_10.c similarity index 100% rename from src/tangara/ui/font_fusion_10.c rename to src/graphics/font_fusion_10.c diff --git a/src/tangara/ui/font_fusion_12.c b/src/graphics/font_fusion_12.c similarity index 100% rename from src/tangara/ui/font_fusion_12.c rename to src/graphics/font_fusion_12.c diff --git a/src/tangara/ui/splash.c b/src/graphics/splash.c similarity index 100% rename from src/tangara/ui/splash.c rename to src/graphics/splash.c diff --git a/src/tangara/CMakeLists.txt b/src/tangara/CMakeLists.txt index 5f2dfca8..fb8d1041 100644 --- a/src/tangara/CMakeLists.txt +++ b/src/tangara/CMakeLists.txt @@ -6,7 +6,7 @@ idf_component_register( SRC_DIRS "app_console" "audio" "battery" "database" "dev_console" "events" "input" "lua" "system_fsm" "ui" INCLUDE_DIRS "." - REQUIRES "codecs" "drivers" "locale" "memory" "tasks" "util" + REQUIRES "codecs" "drivers" "locale" "memory" "tasks" "util" "graphics" "tinyfsm" "lvgl" "esp_timer" "luavgl" "esp_app_format" "libcppbor" "libtags" "komihash" "result" "esp_psram" "fatfs" "millershuffle" "speexdsp" "console" "esp-idf-lua" "lua-linenoise" "lua-term") diff --git a/src/tangara/ui/font_symbols.c b/src/tangara/ui/font_symbols.c deleted file mode 100644 index abc380eb..00000000 --- a/src/tangara/ui/font_symbols.c +++ /dev/null @@ -1,425 +0,0 @@ -/******************************************************************************* - * Size: 12 px - * Bpp: 1 - * Opts: --font fonts/font-awesome/FontAwesome5-Solid+Brands+Regular.woff -r 0xf244,0xf243,0xf242,0xf241,0xf240 -r 0xf104,0xf0d7 -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465 -r 61468,61473,61478,61479,61480,61502,61512,61515,61516,61517 -r 61521,61522,61523,61524,61543,61544,61550,61552,61553,61556 -r 61559,61560,61561,61563,61587,61589,61636,61637,61639,61671 -r 61674,61683,61724,61732,61787,61931,62016,62017,62018,62019 -r 62020,62087,62099,62212,62189,62810,63426,63650 --size 12 --bpp 1 --format lvgl -o font_symbols.c - ******************************************************************************/ - -#ifdef LV_LVGL_H_INCLUDE_SIMPLE -#include "lvgl.h" -#else -#include "lvgl/lvgl.h" -#endif - -#ifndef FONT_SYMBOLS -#define FONT_SYMBOLS 1 -#endif - -#if FONT_SYMBOLS - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { - /* U+F001 "" */ - 0x0, 0x70, 0x3f, 0x1f, 0xf1, 0xfb, 0x1c, 0x31, - 0x83, 0x18, 0x31, 0x83, 0x19, 0xf7, 0x9f, 0xf8, - 0x47, 0x0, - - /* U+F008 "" */ - 0xbf, 0xde, 0x7, 0xa0, 0x5e, 0x7, 0xbf, 0xde, - 0x7, 0xa0, 0x5e, 0x7, 0xbf, 0xd0, - - /* U+F00B "" */ - 0xf7, 0xf7, 0xbf, 0xfd, 0xfe, 0x0, 0xf, 0x7f, - 0x7b, 0xff, 0xdf, 0xc0, 0x0, 0xf7, 0xf7, 0xbf, - 0xfd, 0xfc, - - /* U+F00C "" */ - 0x0, 0x20, 0x7, 0x0, 0xe4, 0x1c, 0xe3, 0x87, - 0x70, 0x3e, 0x1, 0xc0, 0x8, 0x0, - - /* U+F00D "" */ - 0xc3, 0xe7, 0x7e, 0x3c, 0x3c, 0x7e, 0xe7, 0xc3, - - /* U+F011 "" */ - 0x6, 0x2, 0x64, 0x76, 0xe6, 0x66, 0xc6, 0x3c, - 0x63, 0xc6, 0x3c, 0x3, 0x60, 0x67, 0xe, 0x3f, - 0xc0, 0xf0, - - /* U+F013 "" */ - 0xe, 0x4, 0xf0, 0x7f, 0xef, 0xfe, 0x71, 0xe7, - 0xc, 0x71, 0xef, 0xfe, 0x7f, 0xe4, 0xf0, 0xe, - 0x0, - - /* U+F015 "" */ - 0x3, 0x30, 0x1e, 0xc1, 0xcf, 0xc, 0xcc, 0x6f, - 0xdb, 0x7f, 0xb3, 0xff, 0xf, 0x3c, 0x3c, 0xf0, - 0xf3, 0xc0, - - /* U+F019 "" */ - 0xe, 0x0, 0xe0, 0xe, 0x0, 0xe0, 0x3f, 0xc3, - 0xf8, 0x1f, 0x0, 0xe0, 0xf5, 0xff, 0xff, 0xff, - 0x5f, 0xff, - - /* U+F01C "" */ - 0x1f, 0xe0, 0xc0, 0xc6, 0x1, 0x90, 0x2, 0xf8, - 0x7f, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - - /* U+F021 "" */ - 0x0, 0x31, 0xf3, 0x71, 0xfc, 0x7, 0xc3, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xfc, 0x3e, 0x3, 0xf8, - 0xec, 0xf8, 0xc0, 0x0, - - /* U+F026 "" */ - 0xc, 0x7f, 0xff, 0xff, 0xf1, 0xc3, - - /* U+F027 "" */ - 0xc, 0xe, 0x3f, 0x7f, 0x9f, 0xdf, 0xe0, 0x70, - 0x18, - - /* U+F028 "" */ - 0x0, 0x60, 0x1, 0x83, 0x34, 0x38, 0xdf, 0xda, - 0xfe, 0x57, 0xf6, 0xbf, 0x8d, 0x1c, 0xd0, 0x61, - 0x80, 0x18, - - /* U+F03E "" */ - 0xff, 0xf9, 0xff, 0x9f, 0xf9, 0xef, 0xfc, 0x7d, - 0x83, 0xc0, 0x38, 0x3, 0xff, 0xf0, - - /* U+F048 "" */ - 0xc3, 0xc7, 0xcf, 0xdf, 0xff, 0xff, 0xdf, 0xcf, - 0xc7, 0xc3, - - /* U+F04B "" */ - 0x0, 0x1c, 0x3, 0xe0, 0x7f, 0xf, 0xf9, 0xff, - 0xbf, 0xff, 0xfe, 0xff, 0x9f, 0xc3, 0xe0, 0x70, - 0x0, 0x0, - - /* U+F04C "" */ - 0xfb, 0xff, 0x7f, 0xef, 0xfd, 0xff, 0xbf, 0xf7, - 0xfe, 0xff, 0xdf, 0xfb, 0xff, 0x7c, - - /* U+F04D "" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - - /* U+F051 "" */ - 0xc3, 0xe3, 0xf3, 0xfb, 0xff, 0xff, 0xfb, 0xf3, - 0xe3, 0xc3, - - /* U+F052 "" */ - 0xc, 0x3, 0xc0, 0x7c, 0x1f, 0xc7, 0xfd, 0xff, - 0xbf, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, - - /* U+F053 "" */ - 0xc, 0x73, 0x9c, 0xe3, 0x87, 0xe, 0x1c, 0x30, - - /* U+F054 "" */ - 0x83, 0x87, 0xe, 0x1c, 0x73, 0x9c, 0xe2, 0x0, - - /* U+F067 "" */ - 0xe, 0x1, 0xc0, 0x38, 0x7, 0xf, 0xff, 0xff, - 0xc3, 0x80, 0x70, 0xe, 0x1, 0xc0, - - /* U+F068 "" */ - 0xff, 0xff, 0xfc, - - /* U+F06E "" */ - 0xf, 0x81, 0xc7, 0x1c, 0x1d, 0xc6, 0x7e, 0xfb, - 0xf7, 0xdd, 0xdd, 0xc7, 0x1c, 0xf, 0x80, - - /* U+F070 "" */ - 0x0, 0x1, 0xc0, 0x1, 0xdf, 0x0, 0xe3, 0x80, - 0xdb, 0x84, 0xfb, 0x9c, 0x77, 0x3c, 0x6e, 0x38, - 0x78, 0x38, 0x70, 0x1e, 0x30, 0x0, 0x30, 0x0, - 0x0, - - /* U+F071 "" */ - 0x3, 0x0, 0x1c, 0x0, 0xf8, 0x3, 0xf0, 0x1c, - 0xc0, 0x73, 0x83, 0xcf, 0x1f, 0xfc, 0x7c, 0xfb, - 0xf3, 0xef, 0xff, 0x80, - - /* U+F074 "" */ - 0x0, 0x0, 0x6, 0xe1, 0xff, 0x3f, 0x17, 0x60, - 0xe4, 0x1f, 0x6f, 0xbf, 0xf1, 0xf0, 0x6, 0x0, - 0x40, - - /* U+F077 "" */ - 0x0, 0x3, 0x1, 0xe0, 0xcc, 0x61, 0xb0, 0x30, - 0x0, - - /* U+F078 "" */ - 0x0, 0x30, 0x36, 0x18, 0xcc, 0x1e, 0x3, 0x0, - 0x0, - - /* U+F079 "" */ - 0x30, 0x0, 0xf7, 0xf3, 0xf0, 0x65, 0xa0, 0xc3, - 0x1, 0x86, 0xb, 0x4c, 0x1f, 0x9f, 0xde, 0x0, - 0x18, - - /* U+F07B "" */ - 0x78, 0xf, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+F093 "" */ - 0x6, 0x0, 0xf0, 0x1f, 0x83, 0xfc, 0x7, 0x0, - 0x70, 0x7, 0x0, 0x70, 0xf7, 0xff, 0xff, 0xff, - 0x5f, 0xff, - - /* U+F095 "" */ - 0x0, 0x0, 0xf, 0x0, 0xf0, 0x1f, 0x0, 0xf0, - 0x6, 0x0, 0xe0, 0x1c, 0x73, 0xcf, 0xf8, 0xfe, - 0xf, 0xc0, 0x40, 0x0, - - /* U+F0C4 "" */ - 0x70, 0x5b, 0x3f, 0x6f, 0x3f, 0xc1, 0xf0, 0x3e, - 0x1f, 0xe6, 0xde, 0xd9, 0xee, 0x8, - - /* U+F0C5 "" */ - 0x1f, 0x43, 0xef, 0x7f, 0xef, 0xfd, 0xff, 0xbf, - 0xf7, 0xfe, 0xff, 0xdf, 0xf8, 0x3, 0xfc, 0x0, - - /* U+F0C7 "" */ - 0xff, 0x98, 0x1b, 0x3, 0xe0, 0x7c, 0xf, 0xff, - 0xfe, 0x7f, 0x8f, 0xf9, 0xff, 0xfc, - - /* U+F0D7 "" */ - 0xfe, 0xf8, 0xe0, 0x80, - - /* U+F0E7 "" */ - 0x78, 0x78, 0xf8, 0xf0, 0xff, 0xfe, 0xfc, 0x1c, - 0x18, 0x18, 0x10, 0x30, - - /* U+F0EA "" */ - 0x18, 0x3b, 0x8e, 0xe3, 0xf8, 0xe0, 0x3b, 0xae, - 0xe7, 0xbf, 0xef, 0xfb, 0xf0, 0xfc, 0x3f, - - /* U+F0F3 "" */ - 0x4, 0x0, 0x80, 0x7c, 0x1f, 0xc3, 0xf8, 0x7f, - 0x1f, 0xf3, 0xfe, 0x7f, 0xdf, 0xfc, 0x0, 0x7, - 0x0, - - /* U+F104 "" */ - 0x17, 0xec, 0xe7, 0x10, - - /* U+F11C "" */ - 0xff, 0xff, 0x52, 0xbd, 0x4a, 0xff, 0xff, 0xeb, - 0x5f, 0xff, 0xfd, 0x2, 0xf4, 0xb, 0xff, 0xfc, - - /* U+F124 "" */ - 0x0, 0x0, 0xf, 0x3, 0xf0, 0xfe, 0x3f, 0xef, - 0xfc, 0xff, 0xc0, 0x78, 0x7, 0x80, 0x78, 0x7, - 0x0, 0x70, 0x2, 0x0, - - /* U+F15B "" */ - 0xfa, 0x7d, 0xbe, 0xff, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - - /* U+F1EB "" */ - 0x7, 0xc0, 0x7f, 0xf1, 0xe0, 0xf7, 0x0, 0x70, - 0x7c, 0x3, 0xfe, 0x6, 0xc, 0x0, 0x0, 0x3, - 0x80, 0x7, 0x0, 0xe, 0x0, - - /* U+F240 "" */ - 0xff, 0xff, 0x80, 0x1f, 0x7f, 0xfe, 0xff, 0xbd, - 0xff, 0xf8, 0x1, 0xff, 0xff, 0x80, - - /* U+F241 "" */ - 0xff, 0xff, 0x80, 0x1f, 0x7f, 0x3e, 0xfe, 0x3d, - 0xfc, 0xf8, 0x1, 0xff, 0xff, 0x80, - - /* U+F242 "" */ - 0xff, 0xff, 0x80, 0x1f, 0x78, 0x3e, 0xf0, 0x3d, - 0xe0, 0xf8, 0x1, 0xff, 0xff, 0x80, - - /* U+F243 "" */ - 0xff, 0xff, 0x80, 0x1f, 0x60, 0x3e, 0xc0, 0x3d, - 0x80, 0xf8, 0x1, 0xff, 0xff, 0x80, - - /* U+F244 "" */ - 0xff, 0xff, 0x80, 0x1f, 0x0, 0x3e, 0x0, 0x3c, - 0x0, 0xf8, 0x1, 0xff, 0xff, 0x80, - - /* U+F287 "" */ - 0x0, 0xc0, 0x7, 0x80, 0x10, 0x7, 0x20, 0x6f, - 0xff, 0xfc, 0x41, 0x80, 0x40, 0x0, 0xb8, 0x0, - 0xf0, - - /* U+F293 "" */ - 0x3e, 0x3b, 0x9c, 0xdb, 0x7c, 0xbf, 0x1f, 0x9f, - 0x87, 0xd5, 0xf9, 0x9d, 0xc7, 0xc0, - - /* U+F2ED "" */ - 0xe, 0x1f, 0xfc, 0x0, 0x0, 0x7, 0xfc, 0xd5, - 0x9a, 0xb3, 0x56, 0x6a, 0xcd, 0x59, 0xab, 0x3f, - 0xe0, - - /* U+F304 "" */ - 0x0, 0x40, 0xe, 0x0, 0xf0, 0x37, 0x7, 0xa0, - 0xfc, 0x1f, 0x83, 0xf0, 0x7e, 0xf, 0xc0, 0xf8, - 0xf, 0x0, 0x80, 0x0, - - /* U+F55A "" */ - 0xf, 0xfe, 0x3f, 0xfc, 0xfb, 0x3b, 0xf0, 0xff, - 0xf3, 0xef, 0xc3, 0xcf, 0xb7, 0x8f, 0xff, 0xf, - 0xfe, - - /* U+F7C2 "" */ - 0x1f, 0x9a, 0xbe, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - - /* U+F8A2 "" */ - 0x0, 0x0, 0x3, 0x30, 0x37, 0x3, 0xff, 0xff, - 0xff, 0x70, 0x3, 0x0 -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 32, .adv_w = 192, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 50, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 64, .adv_w = 132, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 72, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 90, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 107, .adv_w = 216, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 125, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 143, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 159, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 179, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 185, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 194, .adv_w = 216, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 212, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 226, .adv_w = 168, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 236, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 254, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 268, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 282, .adv_w = 168, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 292, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 308, .adv_w = 120, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 316, .adv_w = 120, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 324, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 338, .adv_w = 168, .box_w = 11, .box_h = 2, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 341, .adv_w = 216, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 356, .adv_w = 240, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 381, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 401, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 418, .adv_w = 168, .box_w = 10, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 427, .adv_w = 168, .box_w = 10, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 436, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 453, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 467, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 485, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 505, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 519, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 535, .adv_w = 168, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 549, .adv_w = 120, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 553, .adv_w = 120, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 565, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 580, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 597, .adv_w = 96, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 601, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 617, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 637, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 651, .adv_w = 240, .box_w = 15, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 672, .adv_w = 240, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 686, .adv_w = 240, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 700, .adv_w = 240, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 714, .adv_w = 240, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 728, .adv_w = 240, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 742, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 759, .adv_w = 168, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 773, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 790, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 810, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 827, .adv_w = 144, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 841, .adv_w = 193, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - -static const uint16_t unicode_list_0[] = { - 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, - 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, - 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, - 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, - 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xd6, 0xe6, - 0xe9, 0xf2, 0x103, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, - 0x240, 0x241, 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, - 0x559, 0x7c1, 0x8a1 -}; - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 61441, .range_length = 2210, .glyph_id_start = 1, - .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 59, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY - } -}; - - - -/*-------------------- - * ALL CUSTOM DATA - *--------------------*/ - -#if LV_VERSION_CHECK(8, 0, 0) -/*Store all the custom data of the font*/ -static lv_font_fmt_txt_glyph_cache_t cache; -static const lv_font_fmt_txt_dsc_t font_dsc = { -#else -static lv_font_fmt_txt_dsc_t font_dsc = { -#endif - .glyph_bitmap = glyph_bitmap, - .glyph_dsc = glyph_dsc, - .cmaps = cmaps, - .kern_dsc = NULL, - .kern_scale = 0, - .cmap_num = 1, - .bpp = 1, - .kern_classes = 0, - .bitmap_format = 0, -#if LV_VERSION_CHECK(8, 0, 0) - .cache = &cache -#endif -}; - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -#if LV_VERSION_CHECK(8, 0, 0) -const lv_font_t font_symbols = { -#else -lv_font_t font_symbols = { -#endif - .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ - .line_height = 13, /*The maximum line height required by the font*/ - .base_line = 2, /*Baseline measured from the bottom of the line*/ -#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) - .subpx = LV_FONT_SUBPX_NONE, -#endif -#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 - .underline_position = -4, - .underline_thickness = 1, -#endif - .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ -}; - - - -#endif /*#if FONT_SYMBOLS*/ - From 964da15a0b84f8e5f00e8abac2f7dfda0bf60488 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 3 May 2024 12:37:23 +1000 Subject: [PATCH 09/15] Add the collation partition to the build Includes a small linux-only bash script to generate locale partitions --- CMakeLists.txt | 7 ++++++- tools/collate/Generic.LC_COLLATE | Bin 0 -> 2586938 bytes tools/collate/README.md | 24 ++++++++++++++++++++++++ tools/collate/mkcollator.sh | 16 ++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tools/collate/Generic.LC_COLLATE create mode 100644 tools/collate/README.md create mode 100755 tools/collate/mkcollator.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 89ebf8aa..f9d1f72c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,10 +16,15 @@ list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src") project(tangara) +# 'collate' partition on internal flash. Contains collation data for sorting +# strings across languages (defaults to a generic dataset based on ISO14651). +get_filename_component(collate_full_path "tools/collate/Generic.LC_COLLATE" ABSOLUTE) +esptool_py_flash_to_partition(flash "collate" ${collate_full_path}) + # /lua partition on internal flash, for storing the lua application spiffs_create_partition_image(lua lua FLASH_IN_PROJECT) -# /repl partition on internal flash, for storing the developer repl and its deps. +# /repl partition on internal flash, for storing the developer repl and its deps file(COPY lib/lua-repl/repl DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/repl) file(COPY lib/lua-term/term DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/repl) spiffs_create_partition_image(repl ${CMAKE_CURRENT_BINARY_DIR}/repl FLASH_IN_PROJECT) diff --git a/tools/collate/Generic.LC_COLLATE b/tools/collate/Generic.LC_COLLATE new file mode 100644 index 0000000000000000000000000000000000000000..aa21717af7c94c8d10bd7aaf75c6aa964a678ae6 GIT binary patch literal 2586938 zcmeFa`*Wq)THhxv^_gJ~hwC{QVh(WNB!(VXl`&CO~oN}tEaa}l`Hwdl}f5o6~~j$ zvz}+aYflK3e;_^e?s?Ytec$!IYpw71yVm=zwY7ibSAOGHzVhpTyYHL7{!?H0Y+qmB z&$4})?U!V`(bt#%)wlb;{NU}rfA;j#pV+?V?|yCH_&0sA@2kG!i+x}IlV9xndA85} z>=*lf|9@or{V(=???3+TK2GoJcm1F0@9+N)8jBSc-mTi%3l`YPe zWqZI@WUI5i%XY~2jO~)`_t;*u{ZDNF3)}z7_J6SbE4CZ`eSKfc_APAR#rC~yKfw0G zY(LKSvuwY>_G@gv!S)Z?ew%HOZIo?_ZLYtse~m56mS=0Sy~p;P?f2OJfbCzf{hw_A z^5c&`{!^~6{|DLr1Gb-H`#H8>X8TRH-)6hTHp8~cmSroj?Xx{`eSJ^aF4+DDwkx(j zVEdoh_rJ4!%=XSeU;k&>zK!jB*#0crUt;?)wx4CY=K7=jf0k{HEyq@5YqK4)U9i1k z`{!)`8{5ZhpT5!8|4nRPpyB@n+xN14AKMSI{r~^822QEheYOW|Yiv_&zr*(T*?ykw zC)xf2+xN14p6v$P@BgchKR#u9z_!LV#r8XFzs&Ym*gntpFaNKPKmKQIb+%2mCALAf zUt{|++mEt+{$G&(=O2Ik^?&g3$Dg5rmpUJRJoEbFkH=qf?C*X2@o)Y2|G$I&0gmYxE_gfWe@mjb<>Ra5;~n`BYj96)`%jUudot}mWB&6F zpZ#AgAD@wruaS?hl@D=~{;!vhZ;+2~ln-&UezBPTZ<3EcCLiA{AKxM$;ye9+Tt2>4 zK0eQfdotrc#WviNIsbXL|MNJQ8+bFciHJz4Xg z_xj#2s?kWg|Hm{MP4@q|M&pJ4pU`M>um2}Cn#%S6HH~8T`hQBJJJtTb zuF>pb|4(Z)SN2!h@Sk!2ned-U|C#ciY5$q&{~6ACd*IDZtp67@dJyaXb&Iz9zoOB@ z+x@?5QNg{tpy6)Xy}NE<+r7K3;a>dwVxaS^^X;>I_k7owl=~;Se$i_cP-p;kJ}oSX54!#8kT3>dszz~y7wMvSh?xmpRjP-y}zVkHRj$= zS(tb4H#Dr}+y}!N)<@k3qZTII2X`!NxepdKY-n>zKjNO`{O6|s-148>{&UAyECrmO z^A$_9u1MVy<3%z z)cV99O6g(ux3yyBm|d+{!i_DhSi*Q(E0!=hrWGq;T`QI_bw?|fFg>poOPIN<6-$`C zr4>tnA+>^Y7GJfd)*X85ikdHqhAKxt>-y0bBD<6M>5BH?tKa2g}s%0A5>i;&2 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 qbo^;HlVL+br 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 z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU z{|o;w*ZT4Q!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po z|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wSNie)!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?t zzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wSNie)!v72Z zFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X9 z3;!?tzwrOU{|o;wm-_Ml!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3 z!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wm-_Ml!v72ZFZ{po|HA(Z|1bQ% z@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w z7y9x4!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z z|1bQ%@c+X93;!?tzwrOU{|o;w7y9x4!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU z{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w=lb#g!v72ZFZ{po z|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?t zzwrOU{|o;w=lb#g!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72Z zFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wXZrE~!v72ZFZ{po|HA(Z|1bQ%@c+X9 z3;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wXZrE~ z!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w{J-%3!v72ZFZ{po|HA(Z|1bQ% z@c+X93;!?tzwrOU{|o;wr~2{#!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;w z{J-%3!v72ZFZ{po|HA(Z|1bQ%@c+X93;!?tzwrOU{|o;wr~2{#!v72ZFZ{po|HA(Z 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ᏇBr}UNRA(eD8$Yd|s<6rKm^^ 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 LDwT_-$sXW8&i~g3 literal 0 HcmV?d00001 diff --git a/tools/collate/README.md b/tools/collate/README.md new file mode 100644 index 00000000..268db5fd --- /dev/null +++ b/tools/collate/README.md @@ -0,0 +1,24 @@ +This tool, which only works on Linux, uses your system's locale data to +generate a collator partition for Tangara. This partition is uses to sort +database information (album names, etc.) in a way that makes sense to humans. + +Because this script isn't portable, `Generic.LC_COLLATE` is included as a +pregenerated collator partition that should work well for most people's +music libraries. + +## Partition format + +The collator partition has 3MiB reserved for it in the partition table, which +is enough to hold the compiled collation data for ISO14651 character sorting, +plus a small amount of free space. + +The first 8 bytes of the partition are reserved for a partition name; usually +the name of the locale that the collation data was compiled for, or 'Generic' +for ISO14651 data. + +Following the 8 byte name, is a complete LC_COLLATE file, as generate by GNU +libc's `localedef` utility. Debian's version 2.37 of this utility is known to +work. + +FIXME: We should vendor this version of the tool, so that our format remains +stable across glibc changes. diff --git a/tools/collate/mkcollator.sh b/tools/collate/mkcollator.sh new file mode 100755 index 00000000..e5962429 --- /dev/null +++ b/tools/collate/mkcollator.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -eu + +if [ -z "${2:-}" ]; then + name="Generic" + locale="iso14651_t1" +else + name="$1" + locale="$2" +fi + +working_dir=$(mktemp -d) + +echo -n "$name" | dd iflag=fullblock bs=8 count=1 conv=sync of="$working_dir/name" +localedef -f UTF-8 -i "$locale" --no-archive "$working_dir" || true +cat "$working_dir/name" "$working_dir/LC_COLLATE" > "$name.LC_COLLATE" From 344a46d0664eb75d232eacea91a4957a25e071f6 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 3 May 2024 16:40:39 +1000 Subject: [PATCH 10/15] Respond to sd card mounts and unmounts within lua Includes no longer blocking the main menu on an sd card being inserted!! --- lua/main.lua | 16 ++-- src/tangara/audio/audio_fsm.cpp | 13 ++- src/tangara/audio/audio_fsm.hpp | 10 ++- src/tangara/system_fsm/running.cpp | 60 ++++++++++---- src/tangara/system_fsm/system_events.hpp | 10 +-- src/tangara/system_fsm/system_fsm.hpp | 8 +- src/tangara/ui/ui_fsm.cpp | 101 ++++++++++++++--------- src/tangara/ui/ui_fsm.hpp | 20 +++-- 8 files changed, 153 insertions(+), 85 deletions(-) diff --git a/lua/main.lua b/lua/main.lua index dc73c964..e5adcaae 100644 --- a/lua/main.lua +++ b/lua/main.lua @@ -3,12 +3,15 @@ local vol = require("volume") local theme = require("theme") local controls = require("controls") local time = require("time") - -local lock_time = time.ticks() +local sd_card = require("sd_card") +local backstack = require("backstack") +local main_menu = require("main_menu") local theme_dark = require("theme_dark") theme.set(theme_dark) +local lock_time = time.ticks() + -- Set up property bindings that are used across every screen. GLOBAL_BINDINGS = { -- Show an alert with the current volume whenever the volume changes @@ -52,9 +55,8 @@ GLOBAL_BINDINGS = { 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) diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index f504da2e..7e74b706 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -15,6 +15,7 @@ #include "cppbor.h" #include "cppbor_parse.h" #include "drivers/bluetooth_types.hpp" +#include "drivers/storage.hpp" #include "esp_heap_caps.h" #include "esp_log.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([]() { auto db = sServices->database().lock(); if (!db) { @@ -568,6 +573,12 @@ void Playback::exit() { events::Ui().Dispatch(event); } +void Playback::react(const system_fsm::SdStateChanged& ev) { + if (sServices->sd() != drivers::SdState::kMounted) { + transit(); + } +} + } // namespace states } // namespace audio diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index b3d64719..7a3aa56e 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -61,8 +61,8 @@ class AudioState : public tinyfsm::Fsm { void react(const OutputModeChanged&); virtual void react(const system_fsm::BootComplete&) {} - virtual void react(const system_fsm::KeyLockChanged&) {}; - virtual void react(const system_fsm::StorageMounted&) {} + virtual void react(const system_fsm::KeyLockChanged&){}; + virtual void react(const system_fsm::SdStateChanged&) {} virtual void react(const system_fsm::BluetoothEvent&); protected: @@ -103,7 +103,7 @@ namespace states { class Uninitialised : public AudioState { public: void react(const system_fsm::BootComplete&) override; - void react(const system_fsm::BluetoothEvent&) override {}; + void react(const system_fsm::BluetoothEvent&) override{}; using AudioState::react; }; @@ -111,7 +111,7 @@ class Uninitialised : public AudioState { class Standby : public AudioState { public: void react(const system_fsm::KeyLockChanged&) override; - void react(const system_fsm::StorageMounted&) override; + void react(const system_fsm::SdStateChanged&) override; using AudioState::react; }; @@ -121,6 +121,8 @@ class Playback : public AudioState { void entry() override; void exit() override; + void react(const system_fsm::SdStateChanged&) override; + using AudioState::react; }; diff --git a/src/tangara/system_fsm/running.cpp b/src/tangara/system_fsm/running.cpp index 82edd018..ac36ec64 100644 --- a/src/tangara/system_fsm/running.cpp +++ b/src/tangara/system_fsm/running.cpp @@ -10,6 +10,7 @@ #include "database/db_events.hpp" #include "database/file_gatherer.hpp" #include "drivers/gpios.hpp" +#include "drivers/spi.hpp" #include "ff.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" @@ -42,11 +43,7 @@ void Running::entry() { sUnmountTimer = xTimerCreate("unmount_timeout", kTicksBeforeUnmount, false, 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() { @@ -80,10 +77,28 @@ void Running::react(const SdDetectChanged& ev) { if (ev.has_sd_card && !sStorage) { mountStorage(); } + // Don't automatically unmount, since this event seems to occasionally happen // supriously. FIXME: Why? - // (It doesn't matter too much; by the time we get this event the SD card has - // already been disconnected electrically.) + // Instead, check whether or not the card has actually gone away. + 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) { @@ -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"); auto storage_res = drivers::SdStorage::Create(sServices->gpios()); if (storage_res.has_error()) { ESP_LOGW(kTag, "failed to mount!"); switch (storage_res.error()) { case drivers::SdStorage::FAILED_TO_MOUNT: - sServices->sd(drivers::SdState::kNotFormatted); + updateSdState(drivers::SdState::kNotFormatted); break; case drivers::SdStorage::FAILED_TO_READ: default: - sServices->sd(drivers::SdState::kNotPresent); + updateSdState(drivers::SdState::kNotPresent); break; } - return false; + return; } sStorage.reset(storage_res.value()); - sServices->sd(drivers::SdState::kMounted); ESP_LOGI(kTag, "opening database"); sFileGatherer = new database::FileGathererImpl(); @@ -161,16 +188,14 @@ auto Running::mountStorage() -> bool { sServices->collator(), sServices->bg_worker()); if (database_res.has_error()) { unmountStorage(); - return false; + return; } sServices->database( std::unique_ptr{database_res.value()}); ESP_LOGI(kTag, "storage loaded okay"); - events::Ui().Dispatch(StorageMounted{}); - events::Audio().Dispatch(StorageMounted{}); - events::System().Dispatch(StorageMounted{}); + updateSdState(drivers::SdState::kMounted); // Tell the database to refresh so that we pick up any changes from the newly // mounted card. @@ -183,14 +208,13 @@ auto Running::mountStorage() -> bool { db->updateIndexes(); }); } - - return true; } auto Running::unmountStorage() -> void { ESP_LOGW(kTag, "unmounting storage"); sServices->database({}); sStorage.reset(); + updateSdState(drivers::SdState::kNotMounted); } } // namespace states diff --git a/src/tangara/system_fsm/system_events.hpp b/src/tangara/system_fsm/system_events.hpp index c174a1da..3452e58e 100644 --- a/src/tangara/system_fsm/system_events.hpp +++ b/src/tangara/system_fsm/system_events.hpp @@ -9,11 +9,12 @@ #include #include "battery/battery.hpp" -#include "drivers/bluetooth_types.hpp" #include "database/database.hpp" -#include "ff.h" +#include "drivers/bluetooth_types.hpp" #include "drivers/haptics.hpp" #include "drivers/samd.hpp" +#include "drivers/storage.hpp" +#include "ff.h" #include "system_fsm/service_locator.hpp" #include "tinyfsm.hpp" @@ -38,10 +39,7 @@ struct FatalError : tinyfsm::Event {}; struct OnIdle : tinyfsm::Event {}; -/* - * Sent by SysState when the system storage has been successfully mounted. - */ -struct StorageMounted : tinyfsm::Event {}; +struct SdStateChanged : tinyfsm::Event {}; struct StorageError : tinyfsm::Event { FRESULT error; diff --git a/src/tangara/system_fsm/system_fsm.hpp b/src/tangara/system_fsm/system_fsm.hpp index d69141dd..5c4157cd 100644 --- a/src/tangara/system_fsm/system_fsm.hpp +++ b/src/tangara/system_fsm/system_fsm.hpp @@ -15,19 +15,19 @@ #include "audio/audio_events.hpp" #include "audio/track_queue.hpp" #include "battery/battery.hpp" -#include "drivers/bluetooth.hpp" #include "database/database.hpp" #include "database/db_events.hpp" #include "database/tag_parser.hpp" +#include "drivers/bluetooth.hpp" #include "drivers/display.hpp" #include "drivers/gpios.hpp" #include "drivers/nvs.hpp" #include "drivers/samd.hpp" #include "drivers/storage.hpp" +#include "drivers/touchwheel.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" #include "tinyfsm.hpp" -#include "drivers/touchwheel.hpp" namespace system_fsm { @@ -55,7 +55,6 @@ class SystemState : public tinyfsm::Fsm { virtual void react(const DisplayReady&) {} virtual void react(const BootComplete&) {} - virtual void react(const StorageMounted&) {} virtual void react(const StorageError&) {} virtual void react(const KeyLockChanged&) {} virtual void react(const SdDetectChanged&) {} @@ -110,7 +109,8 @@ class Running : public SystemState { private: auto checkIdle() -> void; - auto mountStorage() -> bool; + auto updateSdState(drivers::SdState) -> void; + auto mountStorage() -> void; auto unmountStorage() -> void; bool storage_mounted_; diff --git a/src/tangara/ui/ui_fsm.cpp b/src/tangara/ui/ui_fsm.cpp index 17967e20..17d6c511 100644 --- a/src/tangara/ui/ui_fsm.cpp +++ b/src/tangara/ui/ui_fsm.cpp @@ -10,56 +10,56 @@ #include #include -#include "database/db_events.hpp" -#include "drivers/bluetooth_types.hpp" -#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 "FreeRTOSConfig.h" +#include "lvgl.h" -#include "audio/audio_fsm.hpp" -#include "battery/battery.hpp" #include "core/lv_group.h" #include "core/lv_obj.h" #include "core/lv_obj_tree.h" -#include "database/database.hpp" -#include "drivers/haptics.hpp" #include "esp_heap_caps.h" +#include "esp_spp_api.h" #include "esp_timer.h" -#include "input/lvgl_input_driver.hpp" -#include "lauxlib.h" -#include "lua/lua_thread.hpp" +#include "freertos/portmacro.h" +#include "freertos/projdefs.h" +#include "lua.hpp" #include "luavgl.h" -#include "memory_resource.hpp" #include "misc/lv_gc.h" +#include "tinyfsm.hpp" +#include "widgets/lv_label.h" #include "audio/audio_events.hpp" +#include "audio/audio_fsm.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_init.hpp" #include "drivers/gpios.hpp" +#include "drivers/haptics.hpp" #include "drivers/nvs.hpp" #include "drivers/samd.hpp" #include "drivers/spiffs.hpp" #include "drivers/storage.hpp" #include "drivers/touchwheel.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_thread.hpp" #include "lua/property.hpp" +#include "memory_resource.hpp" #include "system_fsm/system_events.hpp" -#include "tinyfsm.hpp" #include "ui/lvgl_task.hpp" #include "ui/screen.hpp" #include "ui/screen_lua.hpp" #include "ui/screen_splash.hpp" #include "ui/ui_events.hpp" -#include "widgets/lv_label.h" namespace ui { @@ -253,6 +253,8 @@ lua::Property UiState::sDatabaseAutoUpdate{ return true; }}; +lua::Property UiState::sSdMounted{false}; + lua::Property UiState::sUsbMassStorageEnabled{ false, [](const lua::LuaValue& val) { if (!std::holds_alternative(val)) { @@ -266,8 +268,8 @@ lua::Property UiState::sUsbMassStorageEnabled{ lua::Property UiState::sUsbMassStorageBusy{false}; -auto UiState::InitBootSplash(drivers::IGpios& gpios, - drivers::NvsStorage& nvs) -> bool { +auto UiState::InitBootSplash(drivers::IGpios& gpios, drivers::NvsStorage& nvs) + -> bool { events::Ui().Dispatch(internal::InitDisplay{ .gpios = gpios, .nvs = nvs, @@ -334,6 +336,10 @@ void UiState::react(const system_fsm::SamdUsbStatusChanged& ev) { 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&) { sDatabaseUpdating.setDirect(true); } @@ -444,7 +450,8 @@ void Splash::react(const system_fsm::BootComplete& ev) { sTask->input(sInput); } -void Splash::react(const system_fsm::StorageMounted&) { +void Splash::react(const system_fsm::SdStateChanged& ev) { + UiState::react(ev); transit(); } @@ -517,6 +524,7 @@ void Lua::entry() { { {"push", [&](lua_State* s) { return PushLuaScreen(s); }}, {"pop", [&](lua_State* s) { return PopLuaScreen(s); }}, + {"reset", [&](lua_State* s) { return ResetLuaScreen(s); }}, }); registry.AddPropertyModule( "alerts", { @@ -533,6 +541,9 @@ void Lua::entry() { {"updating", &sDatabaseUpdating}, {"auto_update", &sDatabaseAutoUpdate}, }); + registry.AddPropertyModule("sd_card", { + {"mounted", &sSdMounted}, + }); registry.AddPropertyModule("usb", { {"msc_enabled", &sUsbMassStorageEnabled}, @@ -547,7 +558,9 @@ void Lua::entry() { sBluetoothDevices.setDirect(bt.KnownDevices()); sCurrentScreen.reset(); - sLua->RunScript("/sdcard/config.lua"); + if (sServices->sd() == drivers::SdState::kMounted) { + sLua->RunScript("/sdcard/config.lua"); + } sLua->RunScript("/lua/main.lua"); } } @@ -587,16 +600,6 @@ auto Lua::PushLuaScreen(lua_State* s) -> int { 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 { if (!sCurrentScreen->canPop()) { return 0; @@ -607,6 +610,30 @@ auto Lua::PopLuaScreen(lua_State* s) -> int { 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 { lua_pushinteger(s, esp_timer_get_time() / 1000); return 1; diff --git a/src/tangara/ui/ui_fsm.hpp b/src/tangara/ui/ui_fsm.hpp index 54d8a9ac..af8d75fb 100644 --- a/src/tangara/ui/ui_fsm.hpp +++ b/src/tangara/ui/ui_fsm.hpp @@ -10,6 +10,8 @@ #include #include +#include "tinyfsm.hpp" + #include "audio/audio_events.hpp" #include "audio/track_queue.hpp" #include "battery/battery.hpp" @@ -17,6 +19,9 @@ #include "database/track.hpp" #include "drivers/display.hpp" #include "drivers/gpios.hpp" +#include "drivers/nvs.hpp" +#include "drivers/storage.hpp" +#include "drivers/touchwheel.hpp" #include "input/device_factory.hpp" #include "input/feedback_haptics.hpp" #include "input/input_touch_wheel.hpp" @@ -24,12 +29,8 @@ #include "input/lvgl_input_driver.hpp" #include "lua/lua_thread.hpp" #include "lua/property.hpp" -#include "drivers/nvs.hpp" -#include "drivers/storage.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" -#include "tinyfsm.hpp" -#include "drivers/touchwheel.hpp" #include "ui/lvgl_task.hpp" #include "ui/modal.hpp" #include "ui/screen.hpp" @@ -57,7 +58,7 @@ class UiState : public tinyfsm::Fsm { virtual void react(const DumpLuaStack&) {} virtual void react(const internal::BackPressed&) {} 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 audio::PlaybackUpdate&); @@ -74,7 +75,7 @@ class UiState : public tinyfsm::Fsm { void react(const internal::DismissAlerts&); 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 system_fsm::BluetoothEvent&); @@ -86,7 +87,7 @@ class UiState : public tinyfsm::Fsm { sCurrentModal.reset(); } - void react(const internal::ReindexDatabase&) {}; + void react(const internal::ReindexDatabase&){}; protected: void PushScreen(std::shared_ptr); @@ -136,6 +137,8 @@ class UiState : public tinyfsm::Fsm { static lua::Property sDatabaseUpdating; static lua::Property sDatabaseAutoUpdate; + static lua::Property sSdMounted; + static lua::Property sUsbMassStorageEnabled; static lua::Property sUsbMassStorageBusy; }; @@ -147,7 +150,7 @@ class Splash : public UiState { void exit() 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; }; @@ -166,6 +169,7 @@ class Lua : public UiState { private: auto PushLuaScreen(lua_State*) -> int; auto PopLuaScreen(lua_State*) -> int; + auto ResetLuaScreen(lua_State*) -> int; auto ShowAlert(lua_State*) -> int; auto HideAlert(lua_State*) -> int; From b242ba998699208c87dc066158964de0866b61e2 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 7 May 2024 14:19:19 +1000 Subject: [PATCH 11/15] Improve decoder's interface to accept streams --- src/tangara/audio/audio_decoder.cpp | 151 ++++++++++------ src/tangara/audio/audio_decoder.hpp | 36 ++-- src/tangara/audio/audio_events.hpp | 12 ++ src/tangara/audio/audio_fsm.cpp | 54 +++--- src/tangara/audio/audio_fsm.hpp | 10 +- src/tangara/audio/fatfs_audio_input.cpp | 163 ------------------ src/tangara/audio/fatfs_audio_input.hpp | 66 ------- src/tangara/audio/fatfs_stream_factory.cpp | 104 +++++++++++ src/tangara/audio/fatfs_stream_factory.hpp | 53 ++++++ .../{audio_converter.cpp => processor.cpp} | 27 ++- .../{audio_converter.hpp => processor.hpp} | 6 +- 11 files changed, 334 insertions(+), 348 deletions(-) delete mode 100644 src/tangara/audio/fatfs_audio_input.cpp delete mode 100644 src/tangara/audio/fatfs_audio_input.hpp create mode 100644 src/tangara/audio/fatfs_stream_factory.cpp create mode 100644 src/tangara/audio/fatfs_stream_factory.hpp rename src/tangara/audio/{audio_converter.cpp => processor.cpp} (91%) rename src/tangara/audio/{audio_converter.hpp => processor.hpp} (96%) diff --git a/src/tangara/audio/audio_decoder.cpp b/src/tangara/audio/audio_decoder.cpp index ae54a11c..0e38bca8 100644 --- a/src/tangara/audio/audio_decoder.cpp +++ b/src/tangara/audio/audio_decoder.cpp @@ -6,7 +6,7 @@ #include "audio/audio_decoder.hpp" -#include +#include #include #include #include @@ -23,14 +23,12 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "freertos/queue.h" -#include "freertos/ringbuf.h" -#include "audio/audio_converter.hpp" #include "audio/audio_events.hpp" #include "audio/audio_fsm.hpp" #include "audio/audio_sink.hpp" #include "audio/audio_source.hpp" -#include "audio/fatfs_audio_input.hpp" +#include "audio/processor.hpp" #include "codec.hpp" #include "database/track.hpp" #include "drivers/i2s_dac.hpp" @@ -42,21 +40,33 @@ namespace audio { -[[maybe_unused]] static const char* kTag = "audio_dec"; +static const char* kTag = "decoder"; +/* + * The size of the buffer used for holding decoded samples. This buffer is + * allocated in internal memory for greater speed, so be careful when + * increasing its size. + */ static constexpr std::size_t kCodecBufferLength = drivers::kI2SBufferLengthFrames * sizeof(sample::Sample); -auto Decoder::Start(std::shared_ptr source, - std::shared_ptr sink) -> Decoder* { - Decoder* task = new Decoder(source, sink); +auto Decoder::Start(std::shared_ptr sink) -> Decoder* { + Decoder* task = new Decoder(sink); tasks::StartPersistent([=]() { task->Main(); }); return task; } -Decoder::Decoder(std::shared_ptr source, - std::shared_ptr mixer) - : source_(source), converter_(mixer), codec_(), current_format_() { +auto Decoder::open(std::shared_ptr stream) -> void { + NextStream* next = new NextStream(); + next->stream = stream; + // The decoder services its queue very quickly, so blocking on this write + // should be fine. If we discover contention here, then adding more space for + // items to next_stream_ should be fine too. + xQueueSend(next_stream_, &next, portMAX_DELAY); +} + +Decoder::Decoder(std::shared_ptr processor) + : processor_(processor), next_stream_(xQueueCreate(1, sizeof(void*))) { ESP_LOGI(kTag, "allocating codec buffer, %u KiB", kCodecBufferLength / 1024); codec_buffer_ = { reinterpret_cast(heap_caps_calloc( @@ -64,81 +74,122 @@ Decoder::Decoder(std::shared_ptr source, kCodecBufferLength}; } +/* + * Main decoding loop. Handles watching for new streams, or continuing to nudge + * along the current stream if we have one. + */ void Decoder::Main() { for (;;) { - if (source_->HasNewStream() || !stream_) { - std::shared_ptr new_stream = source_->NextStream(); - if (new_stream && BeginDecoding(new_stream)) { - stream_ = new_stream; - } else { + // Check whether there's a new stream to begin. If we're idle, then we + // simply park and wait forever for a stream to arrive. + TickType_t wait_time = stream_ ? 0 : portMAX_DELAY; + NextStream* next; + if (xQueueReceive(next_stream_, &next, wait_time)) { + // Copy the data out of the queue, then clean up the item. + std::shared_ptr new_stream = next->stream; + delete next; + + // If we were already decoding, then make sure we finish up the current + // file gracefully. + if (stream_) { + finishDecode(); + } + + // Ensure there's actually stream data; we might have been given nullptr + // as a signal to stop. + if (!new_stream) { continue; } + + // Start decoding the new stream. + prepareDecode(new_stream); } - if (ContinueDecoding()) { - stream_.reset(); + if (!continueDecode()) { + finishDecode(); } } } -auto Decoder::BeginDecoding(std::shared_ptr stream) -> bool { - // Ensure any previous codec is freed before creating a new one. - codec_.reset(); +auto Decoder::prepareDecode(std::shared_ptr stream) -> void { + auto stub_track = std::make_shared(TrackInfo{ + .tags = stream->tags(), + .uri = stream->Filepath(), + .duration = {}, + .start_offset = {}, + .bitrate_kbps = {}, + .encoding = stream->type(), + .format = {}, + }); + codec_.reset(codecs::CreateCodecForType(stream->type()).value_or(nullptr)); if (!codec_) { ESP_LOGE(kTag, "no codec found for stream"); - return false; + events::Audio().Dispatch( + internal::DecodingFailedToStart{.track = stub_track}); + return; } auto open_res = codec_->OpenStream(stream, stream->Offset()); if (open_res.has_error()) { ESP_LOGE(kTag, "codec failed to start: %s", codecs::ICodec::ErrorString(open_res.error()).c_str()); - return false; - } - stream->SetPreambleFinished(); - current_sink_format_ = IAudioOutput::Format{ - .sample_rate = open_res->sample_rate_hz, - .num_channels = open_res->num_channels, - .bits_per_sample = 16, - }; - - std::optional duration; - if (open_res->total_samples) { - duration = open_res->total_samples.value() / open_res->num_channels / - open_res->sample_rate_hz; + events::Audio().Dispatch( + internal::DecodingFailedToStart{.track = stub_track}); + return; } - converter_->beginStream(std::make_shared(TrackInfo{ + // Decoding started okay! Fill out the rest of the track info for this + // stream. + stream_ = stream; + track_ = std::make_shared(TrackInfo{ .tags = stream->tags(), .uri = stream->Filepath(), - .duration = duration, + .duration = {}, .start_offset = stream->Offset(), - .bitrate_kbps = open_res->sample_rate_hz, + .bitrate_kbps = {}, .encoding = stream->type(), - .format = *current_sink_format_, - })); + .format = + { + .sample_rate = open_res->sample_rate_hz, + .num_channels = open_res->num_channels, + .bits_per_sample = 16, + }, + }); + + if (open_res->total_samples) { + track_->duration = open_res->total_samples.value() / + open_res->num_channels / open_res->sample_rate_hz; + } - return true; + events::Audio().Dispatch(internal::DecodingStarted{.track = track_}); + processor_->beginStream(track_); } -auto Decoder::ContinueDecoding() -> bool { +auto Decoder::continueDecode() -> bool { auto res = codec_->DecodeTo(codec_buffer_); if (res.has_error()) { - converter_->endStream(); - return true; + return false; } if (res->samples_written > 0) { - converter_->continueStream(codec_buffer_.first(res->samples_written)); + processor_->continueStream(codec_buffer_.first(res->samples_written)); } - if (res->is_stream_finished) { - converter_->endStream(); - codec_.reset(); - } + return !res->is_stream_finished; +} - return res->is_stream_finished; +auto Decoder::finishDecode() -> void { + assert(track_); + + // Tell everyone we're finished. + events::Audio().Dispatch(internal::DecodingFinished{.track = track_}); + processor_->endStream(); + + // Clean up after ourselves. + stream_.reset(); + codec_.reset(); + track_.reset(); } } // namespace audio diff --git a/src/tangara/audio/audio_decoder.hpp b/src/tangara/audio/audio_decoder.hpp index dfd6f403..ee68290c 100644 --- a/src/tangara/audio/audio_decoder.hpp +++ b/src/tangara/audio/audio_decoder.hpp @@ -9,10 +9,10 @@ #include #include -#include "audio/audio_converter.hpp" #include "audio/audio_events.hpp" #include "audio/audio_sink.hpp" #include "audio/audio_source.hpp" +#include "audio/processor.hpp" #include "codec.hpp" #include "database/track.hpp" #include "types.hpp" @@ -20,35 +20,39 @@ namespace audio { /* - * Handle to a persistent task that takes bytes from the given source, decodes - * them into sample::Sample (normalised to 16 bit signed PCM), and then - * forwards the resulting stream to the given converter. + * Handle to a persistent task that takes encoded bytes from arbitrary sources, + * decodes them into sample::Sample (normalised to 16 bit signed PCM), and then + * streams them onward to the sample processor. */ class Decoder { public: - static auto Start(std::shared_ptr source, - std::shared_ptr converter) -> Decoder*; + static auto Start(std::shared_ptr) -> Decoder*; - auto Main() -> void; + auto open(std::shared_ptr) -> void; Decoder(const Decoder&) = delete; Decoder& operator=(const Decoder&) = delete; private: - Decoder(std::shared_ptr source, - std::shared_ptr converter); + Decoder(std::shared_ptr); + + auto Main() -> void; - auto BeginDecoding(std::shared_ptr) -> bool; - auto ContinueDecoding() -> bool; + auto prepareDecode(std::shared_ptr) -> void; + auto continueDecode() -> bool; + auto finishDecode() -> void; - std::shared_ptr source_; - std::shared_ptr converter_; + std::shared_ptr processor_; + + // Struct used with the next_stream_ queue. + struct NextStream { + std::shared_ptr stream; + }; + QueueHandle_t next_stream_; std::shared_ptr stream_; std::unique_ptr codec_; - - std::optional current_format_; - std::optional current_sink_format_; + std::shared_ptr track_; std::span codec_buffer_; }; diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp index b2975cbc..bb8bf834 100644 --- a/src/tangara/audio/audio_events.hpp +++ b/src/tangara/audio/audio_events.hpp @@ -138,6 +138,18 @@ struct OutputModeChanged : tinyfsm::Event {}; namespace internal { +struct DecodingStarted : tinyfsm::Event { + std::shared_ptr track; +}; + +struct DecodingFailedToStart : tinyfsm::Event { + std::shared_ptr track; +}; + +struct DecodingFinished : tinyfsm::Event { + std::shared_ptr track; +}; + struct StreamStarted : tinyfsm::Event { std::shared_ptr track; IAudioOutput::Format src_format; diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index 7e74b706..d437cdbf 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -11,29 +11,28 @@ #include #include -#include "audio/audio_sink.hpp" #include "cppbor.h" #include "cppbor_parse.h" -#include "drivers/bluetooth_types.hpp" -#include "drivers/storage.hpp" #include "esp_heap_caps.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" -#include "audio/audio_converter.hpp" #include "audio/audio_decoder.hpp" #include "audio/audio_events.hpp" +#include "audio/audio_sink.hpp" #include "audio/bt_audio_output.hpp" -#include "audio/fatfs_audio_input.hpp" +#include "audio/fatfs_stream_factory.hpp" #include "audio/i2s_audio_output.hpp" #include "audio/track_queue.hpp" #include "database/future_fetcher.hpp" #include "database/track.hpp" #include "drivers/bluetooth.hpp" +#include "drivers/bluetooth_types.hpp" #include "drivers/i2s_dac.hpp" #include "drivers/nvs.hpp" +#include "drivers/storage.hpp" #include "drivers/wm8523.hpp" #include "events/event_queue.hpp" #include "sample.hpp" @@ -47,9 +46,9 @@ namespace audio { std::shared_ptr AudioState::sServices; -std::shared_ptr AudioState::sFileSource; +std::shared_ptr AudioState::sStreamFactory; std::unique_ptr AudioState::sDecoder; -std::shared_ptr AudioState::sSampleConverter; +std::shared_ptr AudioState::sSampleProcessor; std::shared_ptr AudioState::sI2SOutput; std::shared_ptr AudioState::sBtOutput; std::shared_ptr AudioState::sOutput; @@ -143,7 +142,7 @@ void AudioState::react(const SetTrack& ev) { if (std::holds_alternative(ev.new_track)) { ESP_LOGI(kTag, "playback finished, awaiting drain"); - sFileSource->SetPath(); + sDecoder->open({}); awaitEmptyDrainBuffer(); sCurrentTrack.reset(); sDrainFormat.reset(); @@ -158,26 +157,20 @@ void AudioState::react(const SetTrack& ev) { auto new_track = ev.new_track; uint32_t seek_to = ev.seek_to_second.value_or(0); sServices->bg_worker().Dispatch([=]() { - std::optional path; + std::shared_ptr stream; if (std::holds_alternative(new_track)) { - auto db = sServices->database().lock(); - if (db) { - path = db->getTrackPath(std::get(new_track)); - } + stream = sStreamFactory->create(std::get(new_track), + seek_to); } else if (std::holds_alternative(new_track)) { - path = std::get(new_track); + stream = + sStreamFactory->create(std::get(new_track), seek_to); } - if (path) { - if (*path == prev_uri) { - // This was a seek or replay within the same track; don't forget where - // the track originally came from. - sNextTrackIsFromQueue = prev_from_queue; - } - sFileSource->SetPath(*path, seek_to); - } else { - sFileSource->SetPath(); - } + // This was a seek or replay within the same track; don't forget where + // the track originally came from. + // FIXME: + // sNextTrackIsFromQueue = prev_from_queue; + sDecoder->open(stream); }); } @@ -350,7 +343,7 @@ void AudioState::react(const OutputModeChanged& ev) { break; } sOutput->mode(IAudioOutput::Modes::kOnPaused); - sSampleConverter->SetOutput(sOutput); + sSampleProcessor->SetOutput(sOutput); // Bluetooth volume isn't 'changed' until we've connected to a device. if (new_mode == drivers::NvsStorage::Output::kHeadphones) { @@ -365,7 +358,7 @@ auto AudioState::clearDrainBuffer() -> void { // Tell the decoder to stop adding new samples. This might not take effect // immediately, since the decoder might currently be stuck waiting for space // to become available in the drain buffer. - sFileSource->SetPath(); + sDecoder->open({}); auto mode = sOutput->mode(); if (mode == IAudioOutput::Modes::kOnPlaying) { @@ -428,8 +421,7 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) { sDrainBuffer = xStreamBufferCreateStatic( kDrainBufferSize, sizeof(sample::Sample), storage, meta); - sFileSource.reset( - new FatfsAudioInput(sServices->tag_parser(), sServices->bg_worker())); + sStreamFactory.reset(new FatfsStreamFactory(*sServices)); sI2SOutput.reset(new I2SAudioOutput(sDrainBuffer, sServices->gpios())); sBtOutput.reset(new BluetoothAudioOutput(sDrainBuffer, sServices->bluetooth(), sServices->bg_worker())); @@ -463,10 +455,10 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) { .left_bias = nvs.AmpLeftBias(), }); - sSampleConverter.reset(new SampleConverter()); - sSampleConverter->SetOutput(sOutput); + sSampleProcessor.reset(new SampleProcessor()); + sSampleProcessor->SetOutput(sOutput); - Decoder::Start(sFileSource, sSampleConverter); + sDecoder.reset(Decoder::Start(sSampleProcessor)); transit(); } diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index 7a3aa56e..90e71404 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -11,14 +11,13 @@ #include #include -#include "audio/audio_sink.hpp" -#include "system_fsm/service_locator.hpp" #include "tinyfsm.hpp" #include "audio/audio_decoder.hpp" #include "audio/audio_events.hpp" +#include "audio/audio_sink.hpp" #include "audio/bt_audio_output.hpp" -#include "audio/fatfs_audio_input.hpp" +#include "audio/fatfs_stream_factory.hpp" #include "audio/i2s_audio_output.hpp" #include "audio/track_queue.hpp" #include "database/database.hpp" @@ -28,6 +27,7 @@ #include "drivers/gpios.hpp" #include "drivers/i2s_dac.hpp" #include "drivers/storage.hpp" +#include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" namespace audio { @@ -74,9 +74,9 @@ class AudioState : public tinyfsm::Fsm { static std::shared_ptr sServices; - static std::shared_ptr sFileSource; + static std::shared_ptr sStreamFactory; static std::unique_ptr sDecoder; - static std::shared_ptr sSampleConverter; + static std::shared_ptr sSampleProcessor; static std::shared_ptr sI2SOutput; static std::shared_ptr sBtOutput; static std::shared_ptr sOutput; diff --git a/src/tangara/audio/fatfs_audio_input.cpp b/src/tangara/audio/fatfs_audio_input.cpp deleted file mode 100644 index dc9133ed..00000000 --- a/src/tangara/audio/fatfs_audio_input.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 2023 jacqueline - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#include "audio/fatfs_audio_input.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "audio/readahead_source.hpp" -#include "esp_heap_caps.h" -#include "esp_log.h" -#include "ff.h" -#include "freertos/portmacro.h" -#include "freertos/projdefs.h" - -#include "audio/audio_events.hpp" -#include "audio/audio_fsm.hpp" -#include "audio/audio_source.hpp" -#include "audio/fatfs_source.hpp" -#include "codec.hpp" -#include "database/future_fetcher.hpp" -#include "database/tag_parser.hpp" -#include "database/track.hpp" -#include "drivers/spi.hpp" -#include "events/event_queue.hpp" -#include "tasks.hpp" -#include "types.hpp" - -[[maybe_unused]] static const char* kTag = "SRC"; - -namespace audio { - -FatfsAudioInput::FatfsAudioInput(database::ITagParser& tag_parser, - tasks::WorkerPool& bg_worker) - : IAudioSource(), - tag_parser_(tag_parser), - bg_worker_(bg_worker), - new_stream_mutex_(), - new_stream_(), - has_new_stream_(false) {} - -FatfsAudioInput::~FatfsAudioInput() {} - -auto FatfsAudioInput::SetPath(std::optional path) -> void { - if (path) { - SetPath(*path); - } else { - SetPath(); - } -} - -auto FatfsAudioInput::SetPath(const std::string& path, - uint32_t offset) -> void { - std::lock_guard guard{new_stream_mutex_}; - if (OpenFile(path, offset)) { - has_new_stream_ = true; - has_new_stream_.notify_one(); - } -} - -auto FatfsAudioInput::SetPath() -> void { - std::lock_guard guard{new_stream_mutex_}; - new_stream_.reset(); - has_new_stream_ = true; - has_new_stream_.notify_one(); -} - -auto FatfsAudioInput::HasNewStream() -> bool { - return has_new_stream_; -} - -auto FatfsAudioInput::NextStream() -> std::shared_ptr { - while (true) { - has_new_stream_.wait(false); - - { - std::lock_guard guard{new_stream_mutex_}; - if (!has_new_stream_.exchange(false)) { - // If the new stream went away, then we need to go back to waiting. - continue; - } - - if (new_stream_ == nullptr) { - continue; - } - - auto stream = new_stream_; - new_stream_ = nullptr; - return stream; - } - } -} - -auto FatfsAudioInput::OpenFile(const std::string& path, - uint32_t offset) -> bool { - ESP_LOGI(kTag, "opening file %s", path.c_str()); - - auto tags = tag_parser_.ReadAndParseTags(path); - if (!tags) { - ESP_LOGE(kTag, "failed to read tags"); - return false; - } - if (!tags->title()) { - tags->title(path); - } - - auto stream_type = ContainerToStreamType(tags->encoding()); - if (!stream_type.has_value()) { - ESP_LOGE(kTag, "couldn't match container to stream"); - return false; - } - - std::unique_ptr file = std::make_unique(); - FRESULT res; - - { - auto lock = drivers::acquire_spi(); - res = f_open(file.get(), path.c_str(), FA_READ); - } - - if (res != FR_OK) { - ESP_LOGE(kTag, "failed to open file! res: %i", res); - return false; - } - - auto source = - std::make_unique(stream_type.value(), std::move(file)); - new_stream_.reset(new TaggedStream(tags, std::move(source), path, offset)); - return true; -} - -auto FatfsAudioInput::ContainerToStreamType(database::Container enc) - -> std::optional { - switch (enc) { - case database::Container::kMp3: - return codecs::StreamType::kMp3; - case database::Container::kWav: - return codecs::StreamType::kWav; - case database::Container::kOgg: - return codecs::StreamType::kVorbis; - case database::Container::kFlac: - return codecs::StreamType::kFlac; - case database::Container::kOpus: - return codecs::StreamType::kOpus; - case database::Container::kUnsupported: - default: - return {}; - } -} - -} // namespace audio diff --git a/src/tangara/audio/fatfs_audio_input.hpp b/src/tangara/audio/fatfs_audio_input.hpp deleted file mode 100644 index deeeb094..00000000 --- a/src/tangara/audio/fatfs_audio_input.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2023 jacqueline - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include "ff.h" -#include "freertos/portmacro.h" - -#include "audio/audio_source.hpp" -#include "codec.hpp" -#include "database/future_fetcher.hpp" -#include "database/tag_parser.hpp" -#include "tasks.hpp" -#include "types.hpp" - -namespace audio { - -/* - * Audio source that fetches data from a FatFs (or exfat i guess) filesystem. - * - * All public methods are safe to call from any task. - */ -class FatfsAudioInput : public IAudioSource { - public: - explicit FatfsAudioInput(database::ITagParser&, tasks::WorkerPool&); - ~FatfsAudioInput(); - - /* - * Immediately cease reading any current source, and begin reading from the - * given file path. - */ - auto SetPath(std::optional) -> void; - auto SetPath(const std::string&, uint32_t offset = 0) -> void; - auto SetPath() -> void; - - auto HasNewStream() -> bool override; - auto NextStream() -> std::shared_ptr override; - - FatfsAudioInput(const FatfsAudioInput&) = delete; - FatfsAudioInput& operator=(const FatfsAudioInput&) = delete; - - private: - auto OpenFile(const std::string& path, uint32_t offset) -> bool; - - auto ContainerToStreamType(database::Container) - -> std::optional; - - database::ITagParser& tag_parser_; - tasks::WorkerPool& bg_worker_; - - std::mutex new_stream_mutex_; - std::shared_ptr new_stream_; - - std::atomic has_new_stream_; -}; - -} // namespace audio diff --git a/src/tangara/audio/fatfs_stream_factory.cpp b/src/tangara/audio/fatfs_stream_factory.cpp new file mode 100644 index 00000000..db08e68c --- /dev/null +++ b/src/tangara/audio/fatfs_stream_factory.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "audio/fatfs_stream_factory.hpp" + +#include +#include +#include + +#include "database/database.hpp" +#include "esp_log.h" +#include "ff.h" +#include "freertos/portmacro.h" +#include "freertos/projdefs.h" + +#include "audio/audio_source.hpp" +#include "audio/fatfs_source.hpp" +#include "codec.hpp" +#include "database/tag_parser.hpp" +#include "database/track.hpp" +#include "drivers/spi.hpp" +#include "system_fsm/service_locator.hpp" +#include "tasks.hpp" +#include "types.hpp" + +[[maybe_unused]] static const char* kTag = "SRC"; + +namespace audio { + +FatfsStreamFactory::FatfsStreamFactory(system_fsm::ServiceLocator& services) + : services_(services) {} + +auto FatfsStreamFactory::create(database::TrackId id, uint32_t offset) + -> std::shared_ptr { + auto db = services_.database().lock(); + if (!db) { + return {}; + } + auto path = db->getTrackPath(id); + if (!path) { + return {}; + } + return create(*path, offset); +} + +auto FatfsStreamFactory::create(std::string path, uint32_t offset) + -> std::shared_ptr { + auto tags = services_.tag_parser().ReadAndParseTags(path); + if (!tags) { + ESP_LOGE(kTag, "failed to read tags"); + return {}; + } + + if (!tags->title()) { + tags->title(path); + } + + auto stream_type = ContainerToStreamType(tags->encoding()); + if (!stream_type.has_value()) { + ESP_LOGE(kTag, "couldn't match container to stream"); + return {}; + } + + std::unique_ptr file = std::make_unique(); + FRESULT res; + + { + auto lock = drivers::acquire_spi(); + res = f_open(file.get(), path.c_str(), FA_READ); + } + + if (res != FR_OK) { + ESP_LOGE(kTag, "failed to open file! res: %i", res); + return {}; + } + + return std::make_shared( + tags, std::make_unique(stream_type.value(), std::move(file)), + path, offset); +} + +auto FatfsStreamFactory::ContainerToStreamType(database::Container enc) + -> std::optional { + switch (enc) { + case database::Container::kMp3: + return codecs::StreamType::kMp3; + case database::Container::kWav: + return codecs::StreamType::kWav; + case database::Container::kOgg: + return codecs::StreamType::kVorbis; + case database::Container::kFlac: + return codecs::StreamType::kFlac; + case database::Container::kOpus: + return codecs::StreamType::kOpus; + case database::Container::kUnsupported: + default: + return {}; + } +} + +} // namespace audio diff --git a/src/tangara/audio/fatfs_stream_factory.hpp b/src/tangara/audio/fatfs_stream_factory.hpp new file mode 100644 index 00000000..858d2131 --- /dev/null +++ b/src/tangara/audio/fatfs_stream_factory.hpp @@ -0,0 +1,53 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "database/database.hpp" +#include "database/track.hpp" +#include "ff.h" +#include "freertos/portmacro.h" + +#include "audio/audio_source.hpp" +#include "codec.hpp" +#include "database/future_fetcher.hpp" +#include "database/tag_parser.hpp" +#include "system_fsm/service_locator.hpp" +#include "tasks.hpp" +#include "types.hpp" + +namespace audio { + +/* + * Utility to create streams that read from files on the sd card. + */ +class FatfsStreamFactory { + public: + explicit FatfsStreamFactory(system_fsm::ServiceLocator&); + + auto create(database::TrackId, uint32_t offset = 0) + -> std::shared_ptr; + auto create(std::string, uint32_t offset = 0) + -> std::shared_ptr; + + FatfsStreamFactory(const FatfsStreamFactory&) = delete; + FatfsStreamFactory& operator=(const FatfsStreamFactory&) = delete; + + private: + auto ContainerToStreamType(database::Container) + -> std::optional; + + system_fsm::ServiceLocator& services_; +}; + +} // namespace audio diff --git a/src/tangara/audio/audio_converter.cpp b/src/tangara/audio/processor.cpp similarity index 91% rename from src/tangara/audio/audio_converter.cpp rename to src/tangara/audio/processor.cpp index da8e3916..42b678ca 100644 --- a/src/tangara/audio/audio_converter.cpp +++ b/src/tangara/audio/processor.cpp @@ -4,8 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-only */ -#include "audio/audio_converter.hpp" -#include +#include "audio/processor.hpp" #include #include @@ -32,7 +31,7 @@ static constexpr std::size_t kSourceBufferLength = kSampleBufferLength * 2; namespace audio { -SampleConverter::SampleConverter() +SampleProcessor::SampleProcessor() : commands_(xQueueCreate(1, sizeof(Args))), resampler_(nullptr), source_(xStreamBufferCreateWithCaps(kSourceBufferLength, @@ -55,19 +54,19 @@ SampleConverter::SampleConverter() tasks::StartPersistent([&]() { Main(); }); } -SampleConverter::~SampleConverter() { +SampleProcessor::~SampleProcessor() { vQueueDelete(commands_); vStreamBufferDelete(source_); } -auto SampleConverter::SetOutput(std::shared_ptr output) -> void { +auto SampleProcessor::SetOutput(std::shared_ptr output) -> void { // FIXME: We should add synchronisation here, but we should be careful about // not impacting performance given that the output will change only very // rarely (if ever). sink_ = output; } -auto SampleConverter::beginStream(std::shared_ptr track) -> void { +auto SampleProcessor::beginStream(std::shared_ptr track) -> void { Args args{ .track = new std::shared_ptr(track), .samples_available = 0, @@ -76,7 +75,7 @@ auto SampleConverter::beginStream(std::shared_ptr track) -> void { xQueueSend(commands_, &args, portMAX_DELAY); } -auto SampleConverter::continueStream(std::span input) -> void { +auto SampleProcessor::continueStream(std::span input) -> void { Args args{ .track = nullptr, .samples_available = input.size(), @@ -86,7 +85,7 @@ auto SampleConverter::continueStream(std::span input) -> void { xStreamBufferSend(source_, input.data(), input.size_bytes(), portMAX_DELAY); } -auto SampleConverter::endStream() -> void { +auto SampleProcessor::endStream() -> void { Args args{ .track = nullptr, .samples_available = 0, @@ -95,7 +94,7 @@ auto SampleConverter::endStream() -> void { xQueueSend(commands_, &args, portMAX_DELAY); } -auto SampleConverter::Main() -> void { +auto SampleProcessor::Main() -> void { for (;;) { Args args; while (!xQueueReceive(commands_, &args, portMAX_DELAY)) { @@ -114,7 +113,7 @@ auto SampleConverter::Main() -> void { } } -auto SampleConverter::handleBeginStream(std::shared_ptr track) +auto SampleProcessor::handleBeginStream(std::shared_ptr track) -> void { if (track->format != source_format_) { resampler_.reset(); @@ -145,7 +144,7 @@ auto SampleConverter::handleBeginStream(std::shared_ptr track) }); } -auto SampleConverter::handleContinueStream(size_t samples_available) -> void { +auto SampleProcessor::handleContinueStream(size_t samples_available) -> void { // Loop until we finish reading all the bytes indicated. There might be // leftovers from each iteration, and from this process as a whole, // depending on the resampling stage. @@ -182,7 +181,7 @@ auto SampleConverter::handleContinueStream(size_t samples_available) -> void { } } -auto SampleConverter::handleSamples(std::span input) -> size_t { +auto SampleProcessor::handleSamples(std::span input) -> size_t { if (source_format_ == target_format_) { // The happiest possible case: the input format matches the output // format already. @@ -223,7 +222,7 @@ auto SampleConverter::handleSamples(std::span input) -> size_t { return samples_used; } -auto SampleConverter::handleEndStream() -> void { +auto SampleProcessor::handleEndStream() -> void { if (resampler_) { size_t read, written; std::tie(read, written) = resampler_->Process({}, resampled_buffer_, true); @@ -245,7 +244,7 @@ auto SampleConverter::handleEndStream() -> void { events::Audio().Dispatch(internal::StreamEnded{}); } -auto SampleConverter::sendToSink(std::span samples) -> void { +auto SampleProcessor::sendToSink(std::span samples) -> void { // Update the number of samples sunk so far *before* actually sinking them, // since writing to the stream buffer will block when the buffer gets full. samples_sunk_ += samples.size(); diff --git a/src/tangara/audio/audio_converter.hpp b/src/tangara/audio/processor.hpp similarity index 96% rename from src/tangara/audio/audio_converter.hpp rename to src/tangara/audio/processor.hpp index bf5edd43..8f197d97 100644 --- a/src/tangara/audio/audio_converter.hpp +++ b/src/tangara/audio/processor.hpp @@ -25,10 +25,10 @@ namespace audio { * format of the current output device. The resulting samples are forwarded * to the output device's sink stream. */ -class SampleConverter { +class SampleProcessor { public: - SampleConverter(); - ~SampleConverter(); + SampleProcessor(); + ~SampleProcessor(); auto SetOutput(std::shared_ptr) -> void; From 265049c5192cf0ce862c7db7b4745636afb6c17b Mon Sep 17 00:00:00 2001 From: jacqueline Date: Wed, 8 May 2024 16:03:03 +1000 Subject: [PATCH 12/15] Count samples going in and out of the drain buffer This is a more accurate way of knowing which track is playing when, and also simplifies a lot of fragile logic in audio_fsm --- src/drivers/bluetooth.cpp | 16 +- src/drivers/i2s_dac.cpp | 22 +- src/drivers/include/drivers/bluetooth.hpp | 3 +- src/drivers/include/drivers/i2s_dac.hpp | 4 +- src/tangara/audio/audio_decoder.cpp | 14 +- src/tangara/audio/audio_decoder.hpp | 2 +- src/tangara/audio/audio_events.hpp | 21 +- src/tangara/audio/audio_fsm.cpp | 261 ++++++++-------------- src/tangara/audio/audio_fsm.hpp | 22 +- src/tangara/audio/audio_sink.hpp | 1 + src/tangara/audio/bt_audio_output.cpp | 4 + src/tangara/audio/bt_audio_output.hpp | 2 + src/tangara/audio/i2s_audio_output.cpp | 4 + src/tangara/audio/i2s_audio_output.hpp | 2 + src/tangara/audio/processor.cpp | 101 +++++---- src/tangara/audio/processor.hpp | 13 +- src/tangara/audio/stream_cues.cpp | 57 +++++ src/tangara/audio/stream_cues.hpp | 46 ++++ 18 files changed, 332 insertions(+), 263 deletions(-) create mode 100644 src/tangara/audio/stream_cues.cpp create mode 100644 src/tangara/audio/stream_cues.hpp diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp index 4caffae7..fcb764f6 100644 --- a/src/drivers/bluetooth.cpp +++ b/src/drivers/bluetooth.cpp @@ -38,6 +38,7 @@ namespace drivers { DRAM_ATTR static StreamBufferHandle_t sStream = nullptr; DRAM_ATTR static std::atomic sVolumeFactor = 1.f; +DRAM_ATTR static std::atomic sSamplesUsed = 0; static tasks::WorkerPool* sBgWorker; @@ -47,8 +48,8 @@ auto gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t* param) -> void { bluetooth::events::internal::Gap{.type = event, .param = param}); } -auto avrcp_cb(esp_avrc_ct_cb_event_t event, - esp_avrc_ct_cb_param_t* param) -> void { +auto avrcp_cb(esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t* param) + -> void { esp_avrc_ct_cb_param_t copy = *param; sBgWorker->Dispatch([=]() { auto lock = bluetooth::BluetoothState::lock(); @@ -73,6 +74,13 @@ IRAM_ATTR auto a2dp_data_cb(uint8_t* buf, int32_t buf_size) -> int32_t { } size_t bytes_received = xStreamBufferReceive(stream, buf, buf_size, 0); + size_t samples_received = bytes_received / 2; + if (UINT32_MAX - sSamplesUsed < samples_received) { + sSamplesUsed = samples_received - (UINT32_MAX - sSamplesUsed); + } else { + sSamplesUsed += samples_received; + } + // Apply software volume scaling. int16_t* samples = reinterpret_cast(buf); float factor = sVolumeFactor.load(); @@ -165,6 +173,10 @@ auto Bluetooth::SetVolumeFactor(float f) -> void { sVolumeFactor = f; } +auto Bluetooth::SamplesUsed() -> uint32_t { + return sSamplesUsed; +} + auto Bluetooth::SetEventHandler(std::function cb) -> void { auto lock = bluetooth::BluetoothState::lock(); diff --git a/src/drivers/i2s_dac.cpp b/src/drivers/i2s_dac.cpp index a271fce0..e5efe198 100644 --- a/src/drivers/i2s_dac.cpp +++ b/src/drivers/i2s_dac.cpp @@ -5,6 +5,7 @@ */ #include "drivers/i2s_dac.hpp" +#include #include #include @@ -140,11 +141,10 @@ auto I2SDac::SetPaused(bool paused) -> void { } } -static volatile bool sSwapWords = false; +DRAM_ATTR static volatile bool sSwapWords = false; -auto I2SDac::Reconfigure(Channels ch, - BitsPerSample bps, - SampleRate rate) -> void { +auto I2SDac::Reconfigure(Channels ch, BitsPerSample bps, SampleRate rate) + -> void { std::lock_guard lock(configure_mutex_); if (i2s_active_) { @@ -217,6 +217,8 @@ auto I2SDac::WriteData(const std::span& data) -> void { } } +DRAM_ATTR static volatile uint32_t sSamplesRead = 0; + extern "C" IRAM_ATTR auto callback(i2s_chan_handle_t handle, i2s_event_data_t* event, void* user_ctx) -> bool { @@ -235,6 +237,14 @@ extern "C" IRAM_ATTR auto callback(i2s_chan_handle_t handle, size_t bytes_written = xStreamBufferReceiveFromISR(src, buf, event->size, &ret); + // Assume 16 bit samples. + size_t samples = bytes_written / 2; + if (UINT32_MAX - sSamplesRead < samples) { + sSamplesRead = samples - (UINT32_MAX - sSamplesRead); + } else { + sSamplesRead = sSamplesRead + samples; + } + // The ESP32's I2S peripheral has a different endianness to its processors. // ESP-IDF handles this difference for stereo channels, but not for mono // channels. We therefore sometimes need to swap each pair of words as they're @@ -276,6 +286,10 @@ auto I2SDac::SetSource(StreamBufferHandle_t buffer) -> void { } } +auto I2SDac::SamplesUsed() -> uint32_t { + return sSamplesRead; +} + auto I2SDac::set_channel(bool enabled) -> void { if (i2s_active_ == enabled) { return; diff --git a/src/drivers/include/drivers/bluetooth.hpp b/src/drivers/include/drivers/bluetooth.hpp index 5960de7e..ad61fcc1 100644 --- a/src/drivers/include/drivers/bluetooth.hpp +++ b/src/drivers/include/drivers/bluetooth.hpp @@ -13,10 +13,10 @@ #include #include #include "drivers/bluetooth_types.hpp" +#include "drivers/nvs.hpp" #include "esp_a2dp_api.h" #include "esp_avrc_api.h" #include "esp_gap_bt_api.h" -#include "drivers/nvs.hpp" #include "tasks.hpp" #include "tinyfsm.hpp" #include "tinyfsm/include/tinyfsm.hpp" @@ -44,6 +44,7 @@ class Bluetooth { auto SetSource(StreamBufferHandle_t) -> void; auto SetVolumeFactor(float) -> void; + auto SamplesUsed() -> uint32_t; auto SetEventHandler(std::function cb) -> void; }; diff --git a/src/drivers/include/drivers/i2s_dac.hpp b/src/drivers/include/drivers/i2s_dac.hpp index 5e81f875..0776dbab 100644 --- a/src/drivers/include/drivers/i2s_dac.hpp +++ b/src/drivers/include/drivers/i2s_dac.hpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include "driver/i2s_std.h" #include "driver/i2s_types.h" @@ -71,6 +71,8 @@ class I2SDac { auto WriteData(const std::span& data) -> void; auto SetSource(StreamBufferHandle_t buffer) -> void; + auto SamplesUsed() -> uint32_t; + // Not copyable or movable. I2SDac(const I2SDac&) = delete; I2SDac& operator=(const I2SDac&) = delete; diff --git a/src/tangara/audio/audio_decoder.cpp b/src/tangara/audio/audio_decoder.cpp index 0e38bca8..ee06d984 100644 --- a/src/tangara/audio/audio_decoder.cpp +++ b/src/tangara/audio/audio_decoder.cpp @@ -92,7 +92,7 @@ void Decoder::Main() { // If we were already decoding, then make sure we finish up the current // file gracefully. if (stream_) { - finishDecode(); + finishDecode(true); } // Ensure there's actually stream data; we might have been given nullptr @@ -106,7 +106,7 @@ void Decoder::Main() { } if (!continueDecode()) { - finishDecode(); + finishDecode(false); } } } @@ -179,12 +179,16 @@ auto Decoder::continueDecode() -> bool { return !res->is_stream_finished; } -auto Decoder::finishDecode() -> void { +auto Decoder::finishDecode(bool cancel) -> void { assert(track_); // Tell everyone we're finished. - events::Audio().Dispatch(internal::DecodingFinished{.track = track_}); - processor_->endStream(); + if (cancel) { + events::Audio().Dispatch(internal::DecodingCancelled{.track = track_}); + } else { + events::Audio().Dispatch(internal::DecodingFinished{.track = track_}); + } + processor_->endStream(cancel); // Clean up after ourselves. stream_.reset(); diff --git a/src/tangara/audio/audio_decoder.hpp b/src/tangara/audio/audio_decoder.hpp index ee68290c..64561d9d 100644 --- a/src/tangara/audio/audio_decoder.hpp +++ b/src/tangara/audio/audio_decoder.hpp @@ -40,7 +40,7 @@ class Decoder { auto prepareDecode(std::shared_ptr) -> void; auto continueDecode() -> bool; - auto finishDecode() -> void; + auto finishDecode(bool cancel) -> void; std::shared_ptr processor_; diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp index bb8bf834..f7eaba67 100644 --- a/src/tangara/audio/audio_events.hpp +++ b/src/tangara/audio/audio_events.hpp @@ -84,13 +84,6 @@ struct PlaybackUpdate : tinyfsm::Event { struct SetTrack : tinyfsm::Event { std::variant new_track; std::optional seek_to_second; - - enum Transition { - kHardCut, - kGapless, - // TODO: kCrossFade - }; - Transition transition; }; struct TogglePlayPause : tinyfsm::Event { @@ -146,21 +139,25 @@ struct DecodingFailedToStart : tinyfsm::Event { std::shared_ptr track; }; +struct DecodingCancelled : tinyfsm::Event { + std::shared_ptr track; +}; + struct DecodingFinished : tinyfsm::Event { std::shared_ptr track; }; struct StreamStarted : tinyfsm::Event { std::shared_ptr track; - IAudioOutput::Format src_format; - IAudioOutput::Format dst_format; + IAudioOutput::Format sink_format; + uint32_t cue_at_sample; }; -struct StreamUpdate : tinyfsm::Event { - uint32_t samples_sunk; +struct StreamEnded : tinyfsm::Event { + uint32_t cue_at_sample; }; -struct StreamEnded : tinyfsm::Event {}; +struct StreamHeartbeat : tinyfsm::Event {}; } // namespace internal diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index d437cdbf..a7c006f5 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -5,8 +5,8 @@ */ #include "audio/audio_fsm.hpp" -#include +#include #include #include #include @@ -18,6 +18,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/portmacro.h" #include "freertos/projdefs.h" +#include "tinyfsm.hpp" #include "audio/audio_decoder.hpp" #include "audio/audio_events.hpp" @@ -25,6 +26,7 @@ #include "audio/bt_audio_output.hpp" #include "audio/fatfs_stream_factory.hpp" #include "audio/i2s_audio_output.hpp" +#include "audio/stream_cues.hpp" #include "audio/track_queue.hpp" #include "database/future_fetcher.hpp" #include "database/track.hpp" @@ -38,7 +40,6 @@ #include "sample.hpp" #include "system_fsm/service_locator.hpp" #include "system_fsm/system_events.hpp" -#include "tinyfsm.hpp" namespace audio { @@ -47,11 +48,13 @@ namespace audio { std::shared_ptr AudioState::sServices; std::shared_ptr AudioState::sStreamFactory; + std::unique_ptr AudioState::sDecoder; std::shared_ptr AudioState::sSampleProcessor; + +std::shared_ptr AudioState::sOutput; std::shared_ptr AudioState::sI2SOutput; std::shared_ptr AudioState::sBtOutput; -std::shared_ptr AudioState::sOutput; // Two seconds of samples for two channels, at a representative sample rate. constexpr size_t kDrainLatencySamples = 48000 * 2 * 2; @@ -61,30 +64,33 @@ constexpr size_t kDrainBufferSize = StreamBufferHandle_t AudioState::sDrainBuffer; std::optional AudioState::sDrainFormat; -std::shared_ptr AudioState::sCurrentTrack; -uint64_t AudioState::sCurrentSamples; -bool AudioState::sCurrentTrackIsFromQueue; +StreamCues AudioState::sStreamCues; -std::shared_ptr AudioState::sNextTrack; -uint64_t AudioState::sNextTrackCueSamples; -bool AudioState::sNextTrackIsFromQueue; - -bool AudioState::sIsResampling; bool AudioState::sIsPaused = true; -auto AudioState::currentPositionSeconds() -> std::optional { - if (!sCurrentTrack || !sDrainFormat) { - return {}; +auto AudioState::emitPlaybackUpdate(bool paused) -> void { + std::optional position; + auto current = sStreamCues.current(); + if (current.first && sDrainFormat) { + position = (current.second / + (sDrainFormat->num_channels * sDrainFormat->sample_rate)) + + current.first->start_offset.value_or(0); } - return sCurrentSamples / - (sDrainFormat->num_channels * sDrainFormat->sample_rate); + + PlaybackUpdate event{ + .current_track = current.first, + .track_position = position, + .paused = paused, + }; + + events::System().Dispatch(event); + events::Ui().Dispatch(event); } void AudioState::react(const QueueUpdate& ev) { SetTrack cmd{ .new_track = std::monostate{}, .seek_to_second = {}, - .transition = SetTrack::Transition::kHardCut, }; auto current = sServices->track_queue().current(); @@ -97,20 +103,13 @@ void AudioState::react(const QueueUpdate& ev) { if (!ev.current_changed) { return; } - sNextTrackIsFromQueue = true; - cmd.transition = SetTrack::Transition::kHardCut; break; case QueueUpdate::kRepeatingLastTrack: - sNextTrackIsFromQueue = true; - cmd.transition = SetTrack::Transition::kGapless; break; case QueueUpdate::kTrackFinished: if (!ev.current_changed) { cmd.new_track = std::monostate{}; - } else { - sNextTrackIsFromQueue = true; } - cmd.transition = SetTrack::Transition::kGapless; break; case QueueUpdate::kDeserialised: default: @@ -123,32 +122,9 @@ void AudioState::react(const QueueUpdate& ev) { } void AudioState::react(const SetTrack& ev) { - // Remember the current track if there is one, since we need to preserve some - // of the state if it turns out this SetTrack event corresponds to seeking - // within the current track. - std::string prev_uri; - bool prev_from_queue = false; - if (sCurrentTrack) { - prev_uri = sCurrentTrack->uri; - prev_from_queue = sCurrentTrackIsFromQueue; - } - - if (ev.transition == SetTrack::Transition::kHardCut) { - sCurrentTrack.reset(); - sCurrentSamples = 0; - sCurrentTrackIsFromQueue = false; - clearDrainBuffer(); - } - if (std::holds_alternative(ev.new_track)) { ESP_LOGI(kTag, "playback finished, awaiting drain"); sDecoder->open({}); - awaitEmptyDrainBuffer(); - sCurrentTrack.reset(); - sDrainFormat.reset(); - sCurrentSamples = 0; - sCurrentTrackIsFromQueue = false; - transit(); return; } @@ -166,81 +142,62 @@ void AudioState::react(const SetTrack& ev) { sStreamFactory->create(std::get(new_track), seek_to); } - // This was a seek or replay within the same track; don't forget where - // the track originally came from. - // FIXME: - // sNextTrackIsFromQueue = prev_from_queue; sDecoder->open(stream); }); } void AudioState::react(const TogglePlayPause& ev) { sIsPaused = !ev.set_to.value_or(sIsPaused); - if (!sIsPaused && is_in_state() && sCurrentTrack) { + if (!sIsPaused && is_in_state() && + sStreamCues.current().first) { transit(); } else if (sIsPaused && is_in_state()) { transit(); } } -void AudioState::react(const internal::StreamStarted& ev) { - sDrainFormat = ev.dst_format; - sIsResampling = ev.src_format != ev.dst_format; - - sNextTrack = ev.track; - sNextTrackCueSamples = sCurrentSamples + (kDrainLatencySamples / 2); - - ESP_LOGI(kTag, "new stream %s %u ch @ %lu hz (resample=%i)", - ev.track->uri.c_str(), sDrainFormat->num_channels, - sDrainFormat->sample_rate, sIsResampling); -} - -void AudioState::react(const internal::StreamEnded&) { - ESP_LOGI(kTag, "stream ended"); - - if (sCurrentTrackIsFromQueue) { - sServices->track_queue().finish(); - } else { - tinyfsm::FsmList::dispatch(SetTrack{ - .new_track = std::monostate{}, - .seek_to_second = {}, - .transition = SetTrack::Transition::kGapless, - }); - } +void AudioState::react(const internal::DecodingFinished& ev) { + // If we just finished playing whatever's at the front of the queue, then we + // need to advanve and start playing the next one ASAP in order to continue + // gaplessly. + sServices->bg_worker().Dispatch([=]() { + auto& queue = sServices->track_queue(); + auto current = queue.current(); + if (!current) { + return; + } + auto db = sServices->database().lock(); + if (!db) { + return; + } + auto path = db->getTrackPath(*current); + if (!path) { + return; + } + if (*path == ev.track->uri) { + queue.finish(); + } + }); } -void AudioState::react(const internal::StreamUpdate& ev) { - sCurrentSamples += ev.samples_sunk; - - if (sNextTrack && sCurrentSamples >= sNextTrackCueSamples) { - ESP_LOGI(kTag, "next track is now sinking"); - sCurrentTrack = sNextTrack; - sCurrentSamples -= sNextTrackCueSamples; - sCurrentSamples += sNextTrack->start_offset.value_or(0) * - (sDrainFormat->num_channels * sDrainFormat->sample_rate); - sCurrentTrackIsFromQueue = sNextTrackIsFromQueue; - - sNextTrack.reset(); - sNextTrackCueSamples = 0; - sNextTrackIsFromQueue = false; +void AudioState::react(const internal::StreamStarted& ev) { + if (sDrainFormat != ev.sink_format) { + sDrainFormat = ev.sink_format; + ESP_LOGI(kTag, "sink_format=%u ch @ %lu hz", sDrainFormat->num_channels, + sDrainFormat->sample_rate); } - if (sCurrentTrack) { - PlaybackUpdate event{ - .current_track = sCurrentTrack, - .track_position = currentPositionSeconds(), - .paused = !is_in_state(), - }; - events::System().Dispatch(event); - events::Ui().Dispatch(event); - } + sStreamCues.addCue(ev.track, ev.cue_at_sample); - if (sCurrentTrack && !sIsPaused && !is_in_state()) { - ESP_LOGI(kTag, "ready to play!"); + if (!sIsPaused && !is_in_state()) { transit(); } } +void AudioState::react(const internal::StreamEnded& ev) { + sStreamCues.addCue({}, ev.cue_at_sample); +} + void AudioState::react(const system_fsm::BluetoothEvent& ev) { if (ev.event != drivers::bluetooth::Event::kConnectionStateChanged) { return; @@ -276,14 +233,6 @@ void AudioState::react(const StepDownVolume& ev) { } } -void AudioState::react(const system_fsm::HasPhonesChanged& ev) { - if (ev.has_headphones) { - ESP_LOGI(kTag, "headphones in!"); - } else { - ESP_LOGI(kTag, "headphones out!"); - } -} - void AudioState::react(const SetVolume& ev) { if (ev.db.has_value()) { if (sOutput->SetVolumeDb(ev.db.value())) { @@ -354,43 +303,6 @@ void AudioState::react(const OutputModeChanged& ev) { } } -auto AudioState::clearDrainBuffer() -> void { - // Tell the decoder to stop adding new samples. This might not take effect - // immediately, since the decoder might currently be stuck waiting for space - // to become available in the drain buffer. - sDecoder->open({}); - - auto mode = sOutput->mode(); - if (mode == IAudioOutput::Modes::kOnPlaying) { - // If we're currently playing, then the drain buffer will be actively - // draining on its own. Just keep trying to reset until it works. - while (xStreamBufferReset(sDrainBuffer) != pdPASS) { - } - } else { - // If we're not currently playing, then we need to actively pull samples - // out of the drain buffer to unblock the decoder. - while (!xStreamBufferIsEmpty(sDrainBuffer)) { - // Read a little to unblock the decoder. - uint8_t drain[2048]; - xStreamBufferReceive(sDrainBuffer, drain, sizeof(drain), 0); - - // Try to quickly discard the rest. - xStreamBufferReset(sDrainBuffer); - } - } -} - -auto AudioState::awaitEmptyDrainBuffer() -> void { - if (is_in_state()) { - for (int i = 0; i < 10 && !xStreamBufferIsEmpty(sDrainBuffer); i++) { - vTaskDelay(pdMS_TO_TICKS(250)); - } - } - if (!xStreamBufferIsEmpty(sDrainBuffer)) { - clearDrainBuffer(); - } -} - auto AudioState::commitVolume() -> void { auto mode = sServices->nvs().OutputMode(); auto vol = sOutput->GetVolume(); @@ -455,7 +367,7 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) { .left_bias = nvs.AmpLeftBias(), }); - sSampleProcessor.reset(new SampleProcessor()); + sSampleProcessor.reset(new SampleProcessor(sDrainBuffer)); sSampleProcessor->SetOutput(sOutput); sDecoder.reset(Decoder::Start(sSampleProcessor)); @@ -470,7 +382,8 @@ void Standby::react(const system_fsm::KeyLockChanged& ev) { if (!ev.locking) { return; } - sServices->bg_worker().Dispatch([this]() { + auto current = sStreamCues.current(); + sServices->bg_worker().Dispatch([=]() { auto db = sServices->database().lock(); if (!db) { return; @@ -483,10 +396,13 @@ void Standby::react(const system_fsm::KeyLockChanged& ev) { } db->put(kQueueKey, queue.serialise()); - if (sCurrentTrack) { + if (current.first && sDrainFormat) { + uint32_t seconds = (current.second / (sDrainFormat->num_channels * + sDrainFormat->sample_rate)) + + current.first->start_offset.value_or(0); cppbor::Array current_track{ - cppbor::Tstr{sCurrentTrack->uri}, - cppbor::Uint{currentPositionSeconds().value_or(0)}, + cppbor::Tstr{current.first->uri}, + cppbor::Uint{seconds}, }; db->put(kCurrentFileKey, current_track.toString()); } @@ -521,7 +437,6 @@ void Standby::react(const system_fsm::SdStateChanged& ev) { events::Audio().Dispatch(SetTrack{ .new_track = filename, .seek_to_second = pos, - .transition = SetTrack::Transition::kHardCut, }); } } @@ -537,32 +452,29 @@ void Standby::react(const system_fsm::SdStateChanged& ev) { }); } +static TimerHandle_t sHeartbeatTimer; + +static void heartbeat(TimerHandle_t) { + events::Audio().Dispatch(internal::StreamHeartbeat{}); +} + void Playback::entry() { ESP_LOGI(kTag, "audio output resumed"); sOutput->mode(IAudioOutput::Modes::kOnPlaying); + emitPlaybackUpdate(false); - PlaybackUpdate event{ - .current_track = sCurrentTrack, - .track_position = currentPositionSeconds(), - .paused = false, - }; - - events::System().Dispatch(event); - events::Ui().Dispatch(event); + if (!sHeartbeatTimer) { + sHeartbeatTimer = + xTimerCreate("stream", pdMS_TO_TICKS(250), true, NULL, heartbeat); + } + xTimerStart(sHeartbeatTimer, portMAX_DELAY); } void Playback::exit() { ESP_LOGI(kTag, "audio output paused"); + xTimerStop(sHeartbeatTimer, portMAX_DELAY); sOutput->mode(IAudioOutput::Modes::kOnPaused); - - PlaybackUpdate event{ - .current_track = sCurrentTrack, - .track_position = currentPositionSeconds(), - .paused = true, - }; - - events::System().Dispatch(event); - events::Ui().Dispatch(event); + emitPlaybackUpdate(true); } void Playback::react(const system_fsm::SdStateChanged& ev) { @@ -571,6 +483,17 @@ void Playback::react(const system_fsm::SdStateChanged& ev) { } } +void Playback::react(const internal::StreamHeartbeat& ev) { + sStreamCues.update(sOutput->samplesUsed()); + auto current = sStreamCues.current(); + + if (!current.first) { + transit(); + } else { + emitPlaybackUpdate(false); + } +} + } // namespace states } // namespace audio diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index 90e71404..03aaddcb 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -11,6 +11,7 @@ #include #include +#include "audio/stream_cues.hpp" #include "tinyfsm.hpp" #include "audio/audio_decoder.hpp" @@ -46,13 +47,13 @@ class AudioState : public tinyfsm::Fsm { void react(const SetTrack&); void react(const TogglePlayPause&); + void react(const internal::DecodingFinished&); void react(const internal::StreamStarted&); - void react(const internal::StreamUpdate&); void react(const internal::StreamEnded&); + virtual void react(const internal::StreamHeartbeat&) {} void react(const StepUpVolume&); void react(const StepDownVolume&); - virtual void react(const system_fsm::HasPhonesChanged&); void react(const SetVolume&); void react(const SetVolumeLimit&); @@ -66,10 +67,7 @@ class AudioState : public tinyfsm::Fsm { virtual void react(const system_fsm::BluetoothEvent&); protected: - auto clearDrainBuffer() -> void; - auto awaitEmptyDrainBuffer() -> void; - - auto playTrack(database::TrackId id) -> void; + auto emitPlaybackUpdate(bool paused) -> void; auto commitVolume() -> void; static std::shared_ptr sServices; @@ -83,19 +81,10 @@ class AudioState : public tinyfsm::Fsm { static StreamBufferHandle_t sDrainBuffer; - static std::shared_ptr sCurrentTrack; - static uint64_t sCurrentSamples; + static StreamCues sStreamCues; static std::optional sDrainFormat; - static bool sCurrentTrackIsFromQueue; - - static std::shared_ptr sNextTrack; - static uint64_t sNextTrackCueSamples; - static bool sNextTrackIsFromQueue; - static bool sIsResampling; static bool sIsPaused; - - auto currentPositionSeconds() -> std::optional; }; namespace states { @@ -122,6 +111,7 @@ class Playback : public AudioState { void exit() override; void react(const system_fsm::SdStateChanged&) override; + void react(const internal::StreamHeartbeat&) override; using AudioState::react; }; diff --git a/src/tangara/audio/audio_sink.hpp b/src/tangara/audio/audio_sink.hpp index f31d0d75..0b133a8d 100644 --- a/src/tangara/audio/audio_sink.hpp +++ b/src/tangara/audio/audio_sink.hpp @@ -75,6 +75,7 @@ class IAudioOutput { virtual auto PrepareFormat(const Format&) -> Format = 0; virtual auto Configure(const Format& format) -> void = 0; + virtual auto samplesUsed() -> uint32_t = 0; auto stream() -> StreamBufferHandle_t { return stream_; } diff --git a/src/tangara/audio/bt_audio_output.cpp b/src/tangara/audio/bt_audio_output.cpp index 637c0c9a..f1b4c26c 100644 --- a/src/tangara/audio/bt_audio_output.cpp +++ b/src/tangara/audio/bt_audio_output.cpp @@ -121,4 +121,8 @@ auto BluetoothAudioOutput::Configure(const Format& fmt) -> void { // No configuration necessary; the output format is fixed. } +auto BluetoothAudioOutput::samplesUsed() -> uint32_t { + return bluetooth_.SamplesUsed(); +} + } // namespace audio diff --git a/src/tangara/audio/bt_audio_output.hpp b/src/tangara/audio/bt_audio_output.hpp index 942715b7..c5681f9a 100644 --- a/src/tangara/audio/bt_audio_output.hpp +++ b/src/tangara/audio/bt_audio_output.hpp @@ -45,6 +45,8 @@ class BluetoothAudioOutput : public IAudioOutput { auto PrepareFormat(const Format&) -> Format override; auto Configure(const Format& format) -> void override; + auto samplesUsed() -> uint32_t override; + BluetoothAudioOutput(const BluetoothAudioOutput&) = delete; BluetoothAudioOutput& operator=(const BluetoothAudioOutput&) = delete; diff --git a/src/tangara/audio/i2s_audio_output.cpp b/src/tangara/audio/i2s_audio_output.cpp index 20297193..684bfa92 100644 --- a/src/tangara/audio/i2s_audio_output.cpp +++ b/src/tangara/audio/i2s_audio_output.cpp @@ -230,4 +230,8 @@ auto I2SAudioOutput::Configure(const Format& fmt) -> void { current_config_ = fmt; } +auto I2SAudioOutput::samplesUsed() -> uint32_t { + return dac_->SamplesUsed(); +} + } // namespace audio diff --git a/src/tangara/audio/i2s_audio_output.hpp b/src/tangara/audio/i2s_audio_output.hpp index f0ce2cf8..bd7d62fb 100644 --- a/src/tangara/audio/i2s_audio_output.hpp +++ b/src/tangara/audio/i2s_audio_output.hpp @@ -43,6 +43,8 @@ class I2SAudioOutput : public IAudioOutput { auto PrepareFormat(const Format&) -> Format override; auto Configure(const Format& format) -> void override; + auto samplesUsed() -> uint32_t override; + I2SAudioOutput(const I2SAudioOutput&) = delete; I2SAudioOutput& operator=(const I2SAudioOutput&) = delete; diff --git a/src/tangara/audio/processor.cpp b/src/tangara/audio/processor.cpp index 42b678ca..dd96c892 100644 --- a/src/tangara/audio/processor.cpp +++ b/src/tangara/audio/processor.cpp @@ -5,10 +5,12 @@ */ #include "audio/processor.hpp" +#include #include #include #include +#include #include "audio/audio_events.hpp" #include "audio/audio_sink.hpp" @@ -31,14 +33,15 @@ static constexpr std::size_t kSourceBufferLength = kSampleBufferLength * 2; namespace audio { -SampleProcessor::SampleProcessor() +SampleProcessor::SampleProcessor(StreamBufferHandle_t sink) : commands_(xQueueCreate(1, sizeof(Args))), resampler_(nullptr), source_(xStreamBufferCreateWithCaps(kSourceBufferLength, sizeof(sample::Sample) * 2, MALLOC_CAP_DMA)), + sink_(sink), leftover_bytes_(0), - samples_sunk_(0) { + samples_written_(0) { input_buffer_ = { reinterpret_cast(heap_caps_calloc( kSampleBufferLength, sizeof(sample::Sample), MALLOC_CAP_DMA)), @@ -60,10 +63,12 @@ SampleProcessor::~SampleProcessor() { } auto SampleProcessor::SetOutput(std::shared_ptr output) -> void { - // FIXME: We should add synchronisation here, but we should be careful about - // not impacting performance given that the output will change only very - // rarely (if ever). - sink_ = output; + assert(xStreamBufferIsEmpty(sink_)); + // FIXME: We should add synchronisation here, but we should be careful + // about not impacting performance given that the output will change only + // very rarely (if ever). + output_ = output; + samples_written_ = output_->samplesUsed(); } auto SampleProcessor::beginStream(std::shared_ptr track) -> void { @@ -71,6 +76,7 @@ auto SampleProcessor::beginStream(std::shared_ptr track) -> void { .track = new std::shared_ptr(track), .samples_available = 0, .is_end_of_stream = false, + .clear_buffers = false, }; xQueueSend(commands_, &args, portMAX_DELAY); } @@ -80,16 +86,18 @@ auto SampleProcessor::continueStream(std::span input) -> void { .track = nullptr, .samples_available = input.size(), .is_end_of_stream = false, + .clear_buffers = false, }; xQueueSend(commands_, &args, portMAX_DELAY); xStreamBufferSend(source_, input.data(), input.size_bytes(), portMAX_DELAY); } -auto SampleProcessor::endStream() -> void { +auto SampleProcessor::endStream(bool cancelled) -> void { Args args{ .track = nullptr, .samples_available = 0, .is_end_of_stream = true, + .clear_buffers = cancelled, }; xQueueSend(commands_, &args, portMAX_DELAY); } @@ -108,7 +116,7 @@ auto SampleProcessor::Main() -> void { handleContinueStream(args.samples_available); } if (args.is_end_of_stream) { - handleEndStream(); + handleEndStream(args.clear_buffers); } } } @@ -116,31 +124,32 @@ auto SampleProcessor::Main() -> void { auto SampleProcessor::handleBeginStream(std::shared_ptr track) -> void { if (track->format != source_format_) { - resampler_.reset(); source_format_ = track->format; + // The new stream has a different format to the previous stream (or there + // was no previous stream). + // First, clean up our filters. + resampler_.reset(); leftover_bytes_ = 0; - auto new_target = sink_->PrepareFormat(track->format); - if (new_target != target_format_) { - // The new format is different to the old one. Wait for the sink to - // drain before continuing. - while (!xStreamBufferIsEmpty(sink_->stream())) { - ESP_LOGI(kTag, "waiting for sink stream to drain..."); - // TODO(jacqueline): Get the sink drain ISR to notify us of this - // via semaphore instead of busy-ish waiting. - vTaskDelay(pdMS_TO_TICKS(10)); - } - - sink_->Configure(new_target); + // If the output is idle, then we can reconfigure it to the closest format + // to our new source. + // If the output *wasn't* idle, then we can't reconfigure without an + // audible gap in playback. So instead, we simply keep the same target + // format and begin resampling. + if (xStreamBufferIsEmpty(sink_)) { + target_format_ = output_->PrepareFormat(track->format); + output_->Configure(target_format_); } - target_format_ = new_target; } - samples_sunk_ = 0; + if (xStreamBufferIsEmpty(sink_)) { + samples_written_ = output_->samplesUsed(); + } + events::Audio().Dispatch(internal::StreamStarted{ .track = track, - .src_format = source_format_, - .dst_format = target_format_, + .sink_format = target_format_, + .cue_at_sample = samples_written_, }); } @@ -222,8 +231,8 @@ auto SampleProcessor::handleSamples(std::span input) -> size_t { return samples_used; } -auto SampleProcessor::handleEndStream() -> void { - if (resampler_) { +auto SampleProcessor::handleEndStream(bool clear_bufs) -> void { + if (resampler_ && !clear_bufs) { size_t read, written; std::tie(read, written) = resampler_->Process({}, resampled_buffer_, true); @@ -232,33 +241,31 @@ auto SampleProcessor::handleEndStream() -> void { } } - // Send a final update to finish off this stream's samples. - if (samples_sunk_ > 0) { - events::Audio().Dispatch(internal::StreamUpdate{ - .samples_sunk = samples_sunk_, - }); - samples_sunk_ = 0; + if (clear_bufs) { + assert(xStreamBufferReset(sink_)); + samples_written_ = output_->samplesUsed(); } + + // FIXME: This discards any leftover samples, but there probably shouldn't be + // any leftover samples. Can this be an assert instead? leftover_bytes_ = 0; - events::Audio().Dispatch(internal::StreamEnded{}); + events::Audio().Dispatch(internal::StreamEnded{ + .cue_at_sample = samples_written_, + }); } auto SampleProcessor::sendToSink(std::span samples) -> void { - // Update the number of samples sunk so far *before* actually sinking them, - // since writing to the stream buffer will block when the buffer gets full. - samples_sunk_ += samples.size(); - if (samples_sunk_ >= - target_format_.sample_rate * target_format_.num_channels) { - events::Audio().Dispatch(internal::StreamUpdate{ - .samples_sunk = samples_sunk_, - }); - samples_sunk_ = 0; + auto data = std::as_bytes(samples); + xStreamBufferSend(sink_, data.data(), data.size(), portMAX_DELAY); + + uint32_t samples_before_overflow = + std::numeric_limits::max() - samples_written_; + if (samples_before_overflow < samples.size()) { + samples_written_ = samples.size() - samples_before_overflow; + } else { + samples_written_ += samples.size(); } - - xStreamBufferSend(sink_->stream(), - reinterpret_cast(samples.data()), - samples.size_bytes(), portMAX_DELAY); } } // namespace audio diff --git a/src/tangara/audio/processor.hpp b/src/tangara/audio/processor.hpp index 8f197d97..1bd6beff 100644 --- a/src/tangara/audio/processor.hpp +++ b/src/tangara/audio/processor.hpp @@ -27,21 +27,21 @@ namespace audio { */ class SampleProcessor { public: - SampleProcessor(); + SampleProcessor(StreamBufferHandle_t sink); ~SampleProcessor(); auto SetOutput(std::shared_ptr) -> void; auto beginStream(std::shared_ptr) -> void; auto continueStream(std::span) -> void; - auto endStream() -> void; + auto endStream(bool cancelled) -> void; private: auto Main() -> void; auto handleBeginStream(std::shared_ptr) -> void; auto handleContinueStream(size_t samples_available) -> void; - auto handleEndStream() -> void; + auto handleEndStream(bool cancel) -> void; auto handleSamples(std::span) -> size_t; @@ -51,23 +51,26 @@ class SampleProcessor { std::shared_ptr* track; size_t samples_available; bool is_end_of_stream; + bool clear_buffers; }; QueueHandle_t commands_; std::unique_ptr resampler_; StreamBufferHandle_t source_; + StreamBufferHandle_t sink_; + std::span input_buffer_; std::span input_buffer_as_bytes_; std::span resampled_buffer_; - std::shared_ptr sink_; + std::shared_ptr output_; IAudioOutput::Format source_format_; IAudioOutput::Format target_format_; size_t leftover_bytes_; - uint32_t samples_sunk_; + uint32_t samples_written_; }; } // namespace audio diff --git a/src/tangara/audio/stream_cues.cpp b/src/tangara/audio/stream_cues.cpp new file mode 100644 index 00000000..0161fbf4 --- /dev/null +++ b/src/tangara/audio/stream_cues.cpp @@ -0,0 +1,57 @@ +/* + * Copyright 2024 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "audio/stream_cues.hpp" + +#include +#include + +namespace audio { + +StreamCues::StreamCues() : now_(0) {} + +auto StreamCues::update(uint32_t sample) -> void { + if (sample < now_) { + // The current time must have overflowed. Deal with any cues between now_ + // and UINT32_MAX, then proceed as normal. + while (!upcoming_.empty() && upcoming_.front().start_at > now_) { + current_ = upcoming_.front(); + upcoming_.pop_front(); + } + } + now_ = sample; + + while (!upcoming_.empty() && upcoming_.front().start_at <= now_) { + current_ = upcoming_.front(); + upcoming_.pop_front(); + } +} + +auto StreamCues::addCue(std::shared_ptr track, uint32_t sample) + -> void { + upcoming_.push_back(Cue{ + .track = track, + .start_at = sample, + }); +} + +auto StreamCues::current() -> std::pair, uint32_t> { + if (!current_) { + return {}; + } + + uint32_t duration; + if (now_ < current_->start_at) { + // now_ overflowed since this track started. + duration = now_ + (UINT32_MAX - current_->start_at); + } else { + duration = now_ - current_->start_at; + } + + return {current_->track, duration}; +} + +} // namespace audio diff --git a/src/tangara/audio/stream_cues.hpp b/src/tangara/audio/stream_cues.hpp new file mode 100644 index 00000000..f55865b7 --- /dev/null +++ b/src/tangara/audio/stream_cues.hpp @@ -0,0 +1,46 @@ +/* + * Copyright 2024 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include +#include +#include +#include + +#include "audio/audio_events.hpp" + +namespace audio { + +/* + * Utility for tracking which track is currently being played (and how long it + * has been playing for) based on counting samples that are put into and taken + * out of the audio processor's output buffer. + */ +class StreamCues { + public: + StreamCues(); + + /* Updates the current track given the new most recently played sample. */ + auto update(uint32_t sample) -> void; + /* Returns the current track, and how long it has been playing for. */ + auto current() -> std::pair, uint32_t>; + + auto addCue(std::shared_ptr, uint32_t start_at) -> void; + + private: + uint32_t now_; + + struct Cue { + std::shared_ptr track; + uint32_t start_at; + }; + + std::optional current_; + std::deque upcoming_; +}; + +} // namespace audio From 690c64c151777121afc2b39868f73b0fe666458e Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 9 May 2024 10:59:49 +1000 Subject: [PATCH 13/15] Fix playback after restoring queue on boot --- src/tangara/audio/audio_fsm.cpp | 14 ++++++++++---- src/tangara/audio/stream_cues.cpp | 16 ++++++++++++---- src/tangara/audio/stream_cues.hpp | 3 +++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index a7c006f5..71f41938 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -191,6 +191,11 @@ void AudioState::react(const internal::StreamStarted& ev) { if (!sIsPaused && !is_in_state()) { transit(); + } else { + // Make sure everyone knows we've got a track ready to go, even if we're + // not playing it yet. This mostly matters when restoring the queue from + // disk after booting. + emitPlaybackUpdate(true); } } @@ -485,12 +490,13 @@ void Playback::react(const system_fsm::SdStateChanged& ev) { void Playback::react(const internal::StreamHeartbeat& ev) { sStreamCues.update(sOutput->samplesUsed()); - auto current = sStreamCues.current(); - if (!current.first) { - transit(); - } else { + if (sStreamCues.hasStream()) { emitPlaybackUpdate(false); + } else { + // Finished the current stream, and there's nothing upcoming. We must be + // finished. + transit(); } } diff --git a/src/tangara/audio/stream_cues.cpp b/src/tangara/audio/stream_cues.cpp index 0161fbf4..7a6a1426 100644 --- a/src/tangara/audio/stream_cues.cpp +++ b/src/tangara/audio/stream_cues.cpp @@ -32,10 +32,14 @@ auto StreamCues::update(uint32_t sample) -> void { auto StreamCues::addCue(std::shared_ptr track, uint32_t sample) -> void { - upcoming_.push_back(Cue{ - .track = track, - .start_at = sample, - }); + if (sample == now_) { + current_ = {track, now_}; + } else { + upcoming_.push_back(Cue{ + .track = track, + .start_at = sample, + }); + } } auto StreamCues::current() -> std::pair, uint32_t> { @@ -54,4 +58,8 @@ auto StreamCues::current() -> std::pair, uint32_t> { return {current_->track, duration}; } +auto StreamCues::hasStream() -> bool { + return current_ || !upcoming_.empty(); +} + } // namespace audio diff --git a/src/tangara/audio/stream_cues.hpp b/src/tangara/audio/stream_cues.hpp index f55865b7..cd0782b0 100644 --- a/src/tangara/audio/stream_cues.hpp +++ b/src/tangara/audio/stream_cues.hpp @@ -26,9 +26,12 @@ class StreamCues { /* Updates the current track given the new most recently played sample. */ auto update(uint32_t sample) -> void; + /* Returns the current track, and how long it has been playing for. */ auto current() -> std::pair, uint32_t>; + auto hasStream() -> bool; + auto addCue(std::shared_ptr, uint32_t start_at) -> void; private: From 2afeb2989b2f845664e12f93e850aab983be12cc Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 9 May 2024 17:05:54 +1000 Subject: [PATCH 14/15] use long-press shortcuts again, but make them a bit harder to trigger accidentally --- src/tangara/input/input_hook.cpp | 8 ++++-- src/tangara/input/input_hook.hpp | 2 ++ src/tangara/input/input_touch_wheel.cpp | 38 ++++++++++++++----------- src/tangara/input/input_trigger.cpp | 7 +++++ src/tangara/input/input_trigger.hpp | 1 + 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/tangara/input/input_hook.cpp b/src/tangara/input/input_hook.cpp index 6946c07f..95ff8f2c 100644 --- a/src/tangara/input/input_hook.cpp +++ b/src/tangara/input/input_hook.cpp @@ -70,8 +70,8 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { } } -auto TriggerHooks::override(Trigger::State s, - std::optional cb) -> void { +auto TriggerHooks::override(Trigger::State s, std::optional cb) + -> void { switch (s) { case Trigger::State::kClick: click_.override(cb); @@ -96,4 +96,8 @@ auto TriggerHooks::hooks() -> std::vector> { return {click_, long_press_, repeat_}; } +auto TriggerHooks::cancel() -> void { + trigger_.cancel(); +} + } // namespace input diff --git a/src/tangara/input/input_hook.hpp b/src/tangara/input/input_hook.hpp index 3dc8a2c8..06fcb037 100644 --- a/src/tangara/input/input_hook.hpp +++ b/src/tangara/input/input_hook.hpp @@ -58,6 +58,8 @@ class TriggerHooks { auto name() const -> const std::string&; auto hooks() -> std::vector>; + auto cancel() -> void; + // Not copyable or movable. TriggerHooks(const TriggerHooks&) = delete; TriggerHooks& operator=(const TriggerHooks&) = delete; diff --git a/src/tangara/input/input_touch_wheel.cpp b/src/tangara/input/input_touch_wheel.cpp index 2c4a8b03..75159320 100644 --- a/src/tangara/input/input_touch_wheel.cpp +++ b/src/tangara/input/input_touch_wheel.cpp @@ -40,10 +40,10 @@ TouchWheel::TouchWheel(drivers::NvsStorage& nvs, drivers::TouchWheel& wheel) return true; }), centre_("centre", actions::select(), {}, {}, {}), - up_("up", {}, actions::scrollToTop(), {}, {}), + up_("up", {}, {}, actions::scrollToTop(), {}), right_("right", {}), - down_("down", {}, actions::scrollToBottom(), {}, {}), - left_("left", {}, actions::goBack(), {}, {}), + down_("down", {}, {}, actions::scrollToBottom(), {}), + left_("left", {}, {}, actions::goBack(), {}), is_scrolling_(false), threshold_(calculateThreshold(nvs.ScrollSensitivity())), is_first_read_(true), @@ -73,20 +73,26 @@ auto TouchWheel::read(lv_indev_data_t* data) -> void { // If the user is touching the wheel but not scrolling, then they may be // clicking on one of the wheel's cardinal directions. - bool pressing = wheel_data.is_wheel_touched && !is_scrolling_; - - up_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 0, 32), - data); - right_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 192, 32), - data); - down_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 128, 32), - data); - left_.update(pressing && drivers::TouchWheel::isAngleWithin( - wheel_data.wheel_position, 64, 32), + if (is_scrolling_) { + up_.cancel(); + right_.cancel(); + down_.cancel(); + left_.cancel(); + } else { + bool pressing = wheel_data.is_wheel_touched; + up_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 0, 32), data); + right_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 192, 32), + data); + down_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 128, 32), + data); + left_.update(pressing && drivers::TouchWheel::isAngleWithin( + wheel_data.wheel_position, 64, 32), + data); + } } auto TouchWheel::name() -> std::string { diff --git a/src/tangara/input/input_trigger.cpp b/src/tangara/input/input_trigger.cpp index 11b4dbe9..eb67bcca 100644 --- a/src/tangara/input/input_trigger.cpp +++ b/src/tangara/input/input_trigger.cpp @@ -85,4 +85,11 @@ auto Trigger::update(bool is_pressed) -> State { return State::kNone; } +auto Trigger::cancel() -> void { + touch_time_ms_.reset(); + was_pressed_ = false; + was_double_click_ = false; + times_long_pressed_ = 0; +} + } // namespace input diff --git a/src/tangara/input/input_trigger.hpp b/src/tangara/input/input_trigger.hpp index bcafa8ad..1b0e681d 100644 --- a/src/tangara/input/input_trigger.hpp +++ b/src/tangara/input/input_trigger.hpp @@ -30,6 +30,7 @@ class Trigger { Trigger(); auto update(bool is_pressed) -> State; + auto cancel() -> void; private: std::optional touch_time_ms_; From 5b109ed32709c271a6803382c5738802919c9c69 Mon Sep 17 00:00:00 2001 From: ailurux Date: Fri, 10 May 2024 12:20:25 +1000 Subject: [PATCH 15/15] Tweaks to default d-pad controls --- src/tangara/input/input_touch_dpad.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tangara/input/input_touch_dpad.cpp b/src/tangara/input/input_touch_dpad.cpp index 9275b510..5d8e2dab 100644 --- a/src/tangara/input/input_touch_dpad.cpp +++ b/src/tangara/input/input_touch_dpad.cpp @@ -23,10 +23,10 @@ namespace input { TouchDPad::TouchDPad(drivers::TouchWheel& wheel) : wheel_(wheel), centre_("centre", actions::select(), {}, {}, {}), - up_("up", actions::scrollUp()), - right_("right", {}), - down_("down", actions::scrollDown()), - left_("left", actions::goBack()) {} + up_("up", actions::scrollUp(), {}, {}, actions::scrollUp()), + right_("right", actions::select(), {}, {}, {}), + down_("down", actions::scrollDown(), {}, {}, actions::scrollDown()), + left_("left", actions::goBack(), {}, {}, {}) {} auto TouchDPad::read(lv_indev_data_t* data) -> void { wheel_.Update();