From 5010ce5a0ccb65d49a367eec23961de281cd03d9 Mon Sep 17 00:00:00 2001 From: Maxim Kurbatov Date: Sat, 7 Sep 2024 02:48:47 +0500 Subject: [PATCH] Add auto-start feature Remove useless code --- OpenRGBE131ReceiverDialog.cpp | 379 ++++++++++++++++++++-------------- OpenRGBE131ReceiverDialog.h | 3 + OpenRGBE131ReceiverDialog.ui | 9 +- 3 files changed, 232 insertions(+), 159 deletions(-) diff --git a/OpenRGBE131ReceiverDialog.cpp b/OpenRGBE131ReceiverDialog.cpp index c3d0b37..d3e2d98 100644 --- a/OpenRGBE131ReceiverDialog.cpp +++ b/OpenRGBE131ReceiverDialog.cpp @@ -1,12 +1,13 @@ #include "OpenRGBE131ReceiverDialog.h" #include "ui_OpenRGBE131ReceiverDialog.h" -#include +#include #include #include #include -#include #include "filesystem.h" +#include +#include #ifndef _WIN32 #include @@ -84,6 +85,7 @@ OpenRGBE131ReceiverDialog::OpenRGBE131ReceiverDialog(ResourceManager* manager, Q resource_manager->RegisterDetectionProgressCallback(DeviceListChanged_Callback, this); online = false; + initialized = false; received_count = 0; UpdateOnlineStatus(); @@ -109,7 +111,16 @@ void OpenRGBE131ReceiverDialog::DeviceListChanged() universe_list.clear(); UpdateControllersTreeView(); - UpdateTreeView(); + LoadMap(); + + if (!initialized) + { + if (ui->EnableAutoStartBox->checkState() == Qt::Checked) + { + this->StartReceiver(); + } + initialized = true; + } } else { @@ -488,15 +499,208 @@ void OpenRGBE131ReceiverDialog::UpdateOnlineStatus() } } -void OpenRGBE131ReceiverDialog::on_ButtonStartReceiver_clicked() +void OpenRGBE131ReceiverDialog::LoadMap() { - if(!online) - { + /*-----------------------------------------------------*\ + | Read in the JSON map from a file | + \*-----------------------------------------------------*/ + json universe_map; + + /*---------------------------------------------------------*\ + | Open input file in binary mode | + \*---------------------------------------------------------*/ + std::ifstream universe_file(resource_manager->GetConfigurationDirectory() / "plugins" + / "settings" / "E131UniverseMap.json", + std::ios::in | std::ios::binary); + + /*---------------------------------------------------------*\ + | Read settings into JSON store | + \*---------------------------------------------------------*/ + if (universe_file) { + try { + universe_file >> universe_map; + } catch (std::exception e) { + /*-------------------------------------------------*\ + | If an exception was caught, that means the JSON | + | parsing failed. Clear out any data in the store | + | as it is corrupt. | + \*-------------------------------------------------*/ + universe_map.clear(); + } + } + + /*---------------------------------------------------------*\ + | Load checkboxes state | + \*---------------------------------------------------------*/ + if (universe_map.contains("enable_multicast")) { + if (universe_map["enable_multicast"]) { + ui->EnableMulticastBox->setCheckState(Qt::Checked); + } else { + ui->EnableMulticastBox->setCheckState(Qt::Unchecked); + } + } + if (universe_map.contains("enable_autostart")) { + if (universe_map["enable_autostart"]) { + ui->EnableAutoStartBox->setCheckState(Qt::Checked); + } else { + ui->EnableAutoStartBox->setCheckState(Qt::Unchecked); + } + } + + /*---------------------------------------------------------*\ + | Clear the universe map | + \*---------------------------------------------------------*/ + universe_list.clear(); + + /*---------------------------------------------------------*\ + | Loop through all saved universes and create list entries | + \*---------------------------------------------------------*/ + if (universe_map.contains("universes")) { + for (unsigned int universe_index = 0; universe_index < universe_map["universes"].size(); + universe_index++) { + if (universe_map["universes"][universe_index].contains("universe")) { + universe_entry new_universe; + + new_universe.universe = universe_map["universes"][universe_index]["universe"]; + + if (universe_map["universes"][universe_index].contains("members")) { + for (unsigned int member_index = 0; + member_index < universe_map["universes"][universe_index]["members"].size(); + member_index++) { + universe_member new_member; + + /*---------------------------------------------------------*\ + | Fill in default values in case entries are missing | + \*---------------------------------------------------------*/ + new_member.controller = NULL; + new_member.start_channel = 1; + new_member.start_led = 0; + new_member.num_leds = 0; + new_member.update = false; + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("start_channel")) { + new_member.start_channel + = universe_map["universes"][universe_index]["members"][member_index] + ["start_channel"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("start_led")) { + new_member.start_led + = universe_map["universes"][universe_index]["members"][member_index] + ["start_led"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("num_leds")) { + new_member.num_leds = universe_map["universes"][universe_index] + ["members"][member_index]["num_leds"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("update")) { + new_member.update = universe_map["universes"][universe_index]["members"] + [member_index]["update"]; + } + + /*---------------------------------------------------------*\ + | Get controller information | + \*---------------------------------------------------------*/ + std::string controller_name = ""; + std::string controller_description = ""; + std::string controller_location = ""; + std::string controller_serial = ""; + unsigned int controller_led_count = 0; + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("controller_name")) { + controller_name = universe_map["universes"][universe_index]["members"] + [member_index]["controller_name"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("controller_description")) { + controller_description + = universe_map["universes"][universe_index]["members"][member_index] + ["controller_description"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("controller_location")) { + controller_location + = universe_map["universes"][universe_index]["members"][member_index] + ["controller_location"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("controller_serial")) { + controller_serial = universe_map["universes"][universe_index]["members"] + [member_index]["controller_serial"]; + } + + if (universe_map["universes"][universe_index]["members"][member_index] + .contains("controller_led_count")) { + controller_led_count + = universe_map["universes"][universe_index]["members"][member_index] + ["controller_led_count"]; + } + + /*---------------------------------------------------------*\ + | Search the controller list for a matching controller | + \*---------------------------------------------------------*/ + for (unsigned int controller_index = 0; + controller_index < resource_manager->GetRGBControllers().size(); + controller_index++) { + if ((resource_manager->GetRGBControllers()[controller_index]->name + == controller_name) + && (resource_manager->GetRGBControllers()[controller_index]->description + == controller_description) + && (resource_manager->GetRGBControllers()[controller_index]->location + == controller_location) + && (resource_manager->GetRGBControllers()[controller_index]->serial + == controller_serial) + && (resource_manager->GetRGBControllers()[controller_index] + ->colors.size() + == controller_led_count)) { + new_member.controller = resource_manager + ->GetRGBControllers()[controller_index]; + } + } + + /*---------------------------------------------------------*\ + | If a controller was found, add the member to the universe | + \*---------------------------------------------------------*/ + if (new_member.controller != NULL) { + new_universe.members.push_back(new_member); + } + } + } + + universe_list.push_back(new_universe); + } + } + } + + /*-----------------------------------------------------*\ + | Update the universe tree view | + \*-----------------------------------------------------*/ + UpdateTreeView(); +} + +void OpenRGBE131ReceiverDialog::StartReceiver() +{ + if (!online) { // Start the receiver thread E131ReceiverThread = new std::thread(&OpenRGBE131ReceiverDialog::E131ReceiverThreadFunction, this); } } +void OpenRGBE131ReceiverDialog::on_ButtonStartReceiver_clicked() +{ + StartReceiver(); +} + void OpenRGBE131ReceiverDialog::on_ButtonStopReceiver_clicked() { online = false; @@ -816,10 +1020,19 @@ void OpenRGBE131ReceiverDialog::on_ButtonSaveMap_clicked() } } + universe_map["enable_multicast"] = ui->EnableMulticastBox->checkState() == Qt::Checked; + universe_map["enable_autostart"] = ui->EnableAutoStartBox->checkState() == Qt::Checked; + /*-----------------------------------------------------*\ | Write out the JSON structure to a file | \*-----------------------------------------------------*/ - std::ofstream universe_file(resource_manager->GetConfigurationDirectory() / "plugins" / "settings" / "E131UniverseMap.json", std::ios::out | std::ios::binary); + filesystem::path settings_dir = resource_manager->GetConfigurationDirectory() / "plugins" / "settings"; + + if (!std::filesystem::is_directory(settings_dir) || !std::filesystem::exists(settings_dir)) { + std::filesystem::create_directories(settings_dir); + } + + std::ofstream universe_file(settings_dir / "E131UniverseMap.json", std::ios::out | std::ios::binary); if(universe_file) { @@ -838,155 +1051,5 @@ void OpenRGBE131ReceiverDialog::on_ButtonSaveMap_clicked() void OpenRGBE131ReceiverDialog::on_ButtonLoadMap_clicked() { - /*-----------------------------------------------------*\ - | Read in the JSON map from a file | - \*-----------------------------------------------------*/ - json universe_map; - - /*---------------------------------------------------------*\ - | Open input file in binary mode | - \*---------------------------------------------------------*/ - std::ifstream universe_file(resource_manager->GetConfigurationDirectory() / "plugins" / "settings" / "E131UniverseMap.json", std::ios::in | std::ios::binary); - - /*---------------------------------------------------------*\ - | Read settings into JSON store | - \*---------------------------------------------------------*/ - if(universe_file) - { - try - { - universe_file >> universe_map; - } - catch(std::exception e) - { - /*-------------------------------------------------*\ - | If an exception was caught, that means the JSON | - | parsing failed. Clear out any data in the store | - | as it is corrupt. | - \*-------------------------------------------------*/ - universe_map.clear(); - } - } - - /*---------------------------------------------------------*\ - | Clear the universe map | - \*---------------------------------------------------------*/ - universe_list.clear(); - - /*---------------------------------------------------------*\ - | Loop through all saved universes and create list entries | - \*---------------------------------------------------------*/ - if(universe_map.contains("universes")) - { - for(unsigned int universe_index = 0; universe_index < universe_map["universes"].size(); universe_index++) - { - if(universe_map["universes"][universe_index].contains("universe")) - { - universe_entry new_universe; - - new_universe.universe = universe_map["universes"][universe_index]["universe"]; - - if(universe_map["universes"][universe_index].contains("members")) - { - for(unsigned int member_index = 0; member_index < universe_map["universes"][universe_index]["members"].size(); member_index++) - { - universe_member new_member; - - /*---------------------------------------------------------*\ - | Fill in default values in case entries are missing | - \*---------------------------------------------------------*/ - new_member.controller = NULL; - new_member.start_channel = 1; - new_member.start_led = 0; - new_member.num_leds = 0; - new_member.update = false; - - if(universe_map["universes"][universe_index]["members"][member_index].contains("start_channel")) - { - new_member.start_channel = universe_map["universes"][universe_index]["members"][member_index]["start_channel"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("start_led")) - { - new_member.start_led = universe_map["universes"][universe_index]["members"][member_index]["start_led"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("num_leds")) - { - new_member.num_leds = universe_map["universes"][universe_index]["members"][member_index]["num_leds"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("update")) - { - new_member.update = universe_map["universes"][universe_index]["members"][member_index]["update"]; - } - - /*---------------------------------------------------------*\ - | Get controller information | - \*---------------------------------------------------------*/ - std::string controller_name = ""; - std::string controller_description = ""; - std::string controller_location = ""; - std::string controller_serial = ""; - unsigned int controller_led_count = 0; - - if(universe_map["universes"][universe_index]["members"][member_index].contains("controller_name")) - { - controller_name = universe_map["universes"][universe_index]["members"][member_index]["controller_name"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("controller_description")) - { - controller_description = universe_map["universes"][universe_index]["members"][member_index]["controller_description"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("controller_location")) - { - controller_location = universe_map["universes"][universe_index]["members"][member_index]["controller_location"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("controller_serial")) - { - controller_serial = universe_map["universes"][universe_index]["members"][member_index]["controller_serial"]; - } - - if(universe_map["universes"][universe_index]["members"][member_index].contains("controller_led_count")) - { - controller_led_count = universe_map["universes"][universe_index]["members"][member_index]["controller_led_count"]; - } - - /*---------------------------------------------------------*\ - | Search the controller list for a matching controller | - \*---------------------------------------------------------*/ - for(unsigned int controller_index = 0; controller_index < resource_manager->GetRGBControllers().size(); controller_index++) - { - if((resource_manager->GetRGBControllers()[controller_index]->name == controller_name) - &&(resource_manager->GetRGBControllers()[controller_index]->description == controller_description) - &&(resource_manager->GetRGBControllers()[controller_index]->location == controller_location) - &&(resource_manager->GetRGBControllers()[controller_index]->serial == controller_serial) - &&(resource_manager->GetRGBControllers()[controller_index]->colors.size() == controller_led_count)) - { - new_member.controller = resource_manager->GetRGBControllers()[controller_index]; - } - } - - /*---------------------------------------------------------*\ - | If a controller was found, add the member to the universe | - \*---------------------------------------------------------*/ - if(new_member.controller != NULL) - { - new_universe.members.push_back(new_member); - } - } - } - - universe_list.push_back(new_universe); - } - } - } - - /*-----------------------------------------------------*\ - | Update the universe tree view | - \*-----------------------------------------------------*/ - UpdateTreeView(); + this->LoadMap(); } diff --git a/OpenRGBE131ReceiverDialog.h b/OpenRGBE131ReceiverDialog.h index 6f14895..bc712e1 100644 --- a/OpenRGBE131ReceiverDialog.h +++ b/OpenRGBE131ReceiverDialog.h @@ -43,6 +43,7 @@ private: Ui::OpenRGBE131ReceiverDialog *ui; bool online; + bool initialized; unsigned long received_count; std::thread* E131ReceiverThread; @@ -50,6 +51,8 @@ private: void UpdateOnlineStatus(); void UpdateControllersTreeView(); void UpdateTreeView(); + void LoadMap(); + void StartReceiver(); }; #endif // OPENRGBE131RECEIVERDIALOG_H diff --git a/OpenRGBE131ReceiverDialog.ui b/OpenRGBE131ReceiverDialog.ui index 3b0d6e7..ae49e50 100644 --- a/OpenRGBE131ReceiverDialog.ui +++ b/OpenRGBE131ReceiverDialog.ui @@ -111,7 +111,7 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight Enable Multicast @@ -156,6 +156,13 @@ + + + + Enable AutoStart + + +