Add auto-start feature

Remove useless code
This commit is contained in:
Maxim Kurbatov 2024-09-07 02:48:47 +05:00 committed by morg
parent 9b466ec48d
commit 5010ce5a0c
3 changed files with 232 additions and 159 deletions

View file

@ -1,12 +1,13 @@
#include "OpenRGBE131ReceiverDialog.h"
#include "ui_OpenRGBE131ReceiverDialog.h"
#include <e131.h>
#include <QDir>
#include <QLineEdit>
#include <QMessageBox>
#include <QSignalMapper>
#include <fstream>
#include "filesystem.h"
#include <e131.h>
#include <fstream>
#ifndef _WIN32
#include <unistd.h>
@ -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();
}

View file

@ -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

View file

@ -111,7 +111,7 @@
<item row="0" column="4">
<widget class="QCheckBox" name="EnableMulticastBox">
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="text">
<string>Enable Multicast</string>
@ -156,6 +156,13 @@
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QCheckBox" name="EnableAutoStartBox">
<property name="text">
<string>Enable AutoStart</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>