From 5d7cbec34cd5e473d5768b39054d99bc72ddad62 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 27 Apr 2023 12:55:30 +1000 Subject: Move DB interactions to a background thread --- src/main/app_console.cpp | 41 +++++++++++++++++++++-------------------- src/main/app_console.hpp | 5 +++-- src/main/main.cpp | 41 ++++++++--------------------------------- 3 files changed, 32 insertions(+), 55 deletions(-) (limited to 'src/main') diff --git a/src/main/app_console.cpp b/src/main/app_console.cpp index 859700f4..fc2a4fe5 100644 --- a/src/main/app_console.cpp +++ b/src/main/app_console.cpp @@ -154,48 +154,49 @@ int CmdDbInit(int argc, char** argv) { return 1; } - sInstance->database_->Initialise(); + sInstance->database_->Populate().get(); return 0; } void RegisterDbInit() { - esp_console_cmd_t cmd{.command = "db_init", - .help = "scans for playable files and adds them to the database", - .hint = NULL, - .func = &CmdDbInit, - .argtable = NULL}; + esp_console_cmd_t cmd{ + .command = "db_init", + .help = "scans for playable files and adds them to the database", + .hint = NULL, + .func = &CmdDbInit, + .argtable = NULL}; esp_console_cmd_register(&cmd); } -int CmdDbTitles(int argc, char** argv) { - static const std::string usage = "usage: db_titles"; +int CmdDbSongs(int argc, char** argv) { + static const std::string usage = "usage: db_songs"; if (argc != 1) { std::cout << usage << std::endl; return 1; } - database::Iterator it = sInstance->database_->ByTitle(); - while (true) { - std::optional title = it.Next(); - if (!title) { - break; - } - std::cout << *title << std::endl; + database::DbResult res = + sInstance->database_->GetSongs(10).get(); + for (database::Song s : res.values()) { + std::cout << s.title << std::endl; } + return 0; } -void RegisterDbTitles() { - esp_console_cmd_t cmd{.command = "db_titles", +void RegisterDbSongs() { + esp_console_cmd_t cmd{.command = "db_songs", .help = "lists titles of ALL songs in the database", .hint = NULL, - .func = &CmdDbTitles, + .func = &CmdDbSongs, .argtable = NULL}; esp_console_cmd_register(&cmd); } -AppConsole::AppConsole(audio::AudioPlayback* playback, database::Database *database) : playback_(playback), database_(database) { +AppConsole::AppConsole(audio::AudioPlayback* playback, + database::Database* database) + : playback_(playback), database_(database) { sInstance = this; } AppConsole::~AppConsole() { @@ -209,7 +210,7 @@ auto AppConsole::RegisterExtraComponents() -> void { RegisterVolume(); RegisterAudioStatus(); RegisterDbInit(); - RegisterDbTitles(); + RegisterDbSongs(); } } // namespace console diff --git a/src/main/app_console.hpp b/src/main/app_console.hpp index fcefd4d4..3a11d70c 100644 --- a/src/main/app_console.hpp +++ b/src/main/app_console.hpp @@ -11,11 +11,12 @@ namespace console { class AppConsole : public Console { public: - explicit AppConsole(audio::AudioPlayback* playback, database::Database *database); + explicit AppConsole(audio::AudioPlayback* playback, + database::Database* database); virtual ~AppConsole(); audio::AudioPlayback* playback_; - database::Database *database_; + database::Database* database_; protected: virtual auto RegisterExtraComponents() -> void; diff --git a/src/main/main.cpp b/src/main/main.cpp index 6ef7c61b..07547713 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -37,29 +37,6 @@ static const char* TAG = "MAIN"; -void db_main(void* whatever) { - database::Database **arg_db = reinterpret_cast(whatever); - ESP_LOGI(TAG, "Init database"); - std::unique_ptr db; - auto db_res = database::Database::Open(); - if (db_res.has_error()) { - ESP_LOGE(TAG, "database failed :("); - } else { - db.reset(db_res.value()); - ESP_LOGI(TAG, "database good :)"); - } - - *arg_db = db.get(); - - db->ByTitle(); - - while (1) { - vTaskDelay(portMAX_DELAY); - } - - vTaskDelete(NULL); -} - extern "C" void app_main(void) { ESP_LOGI(TAG, "Initialising peripherals"); @@ -85,15 +62,6 @@ extern "C" void app_main(void) { ESP_LOGE(TAG, "Failed! Do you have an SD card?"); } - ESP_LOGI(TAG, "Launch database task"); - std::size_t db_stack_size = 256 * 1024; - StaticTask_t database_task_buffer = {}; - StackType_t* database_stack = reinterpret_cast( - heap_caps_malloc(db_stack_size, MALLOC_CAP_SPIRAM)); - database::Database *db; - xTaskCreateStatic(&db_main, "LEVELDB", db_stack_size, &db, 1, database_stack, - &database_task_buffer); - ESP_LOGI(TAG, "Init touch wheel"); std::shared_ptr touchwheel = drivers->AcquireTouchWheel(); @@ -108,11 +76,18 @@ extern "C" void app_main(void) { playback = std::make_unique(drivers.get()); } + ESP_LOGI(TAG, "Init database"); + std::unique_ptr db; + auto db_res = database::Database::Open(); + if (db_res.has_value()) { + db.reset(db_res.value()); + } + ESP_LOGI(TAG, "Waiting for background tasks before launching console..."); vTaskDelay(pdMS_TO_TICKS(1000)); ESP_LOGI(TAG, "Launch console"); - console::AppConsole console(playback.get(), db); + console::AppConsole console(playback.get(), db.get()); console.Launch(); uint8_t prev_position = 0; -- cgit v1.2.3