From 25c829ac2a0cfde96330c62705eac493a10712e9 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 25 Feb 2020 20:43:35 -0600 Subject: [PATCH] Profile save and load test --- OpenRGB.cpp | 2 +- RGBController/RGBController.cpp | 9 +++ qt/OpenRGBDevicePage.cpp | 9 +++ qt/OpenRGBDevicePage.h | 1 + qt/OpenRGBDialog2.cpp | 111 +++++++++++++++++++++++++++++++- qt/OpenRGBDialog2.h | 2 + qt/OpenRGBDialog2.ui | 14 ++++ 7 files changed, 146 insertions(+), 2 deletions(-) diff --git a/OpenRGB.cpp b/OpenRGB.cpp index 741ced577..ee00f85ea 100644 --- a/OpenRGB.cpp +++ b/OpenRGB.cpp @@ -310,7 +310,7 @@ void DetectRGBFusion2Controllers(std::vector &rgb_controllers); * Detect and populate RGB Controllers vector * * * \******************************************************************************************/ - +#include "RGBController_Dummy.h" void DetectRGBControllers(void) { DetectI2CBusses(); diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 7413ce574..cc6518cb7 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -26,6 +26,7 @@ unsigned char * RGBController::GetDeviceDescription() unsigned short *zone_map_rows = new unsigned short[num_zones]; + data_size += sizeof(data_size); data_size += sizeof(device_type); data_size += name_len + sizeof(name_len); data_size += description_len + sizeof(description_len); @@ -94,6 +95,12 @@ unsigned char * RGBController::GetDeviceDescription() \*---------------------------------------------------------*/ unsigned char *data_buf = new unsigned char[data_size]; + /*---------------------------------------------------------*\ + | Copy in data size | + \*---------------------------------------------------------*/ + memcpy(&data_buf[data_ptr], &data_size, sizeof(data_size)); + data_ptr += sizeof(data_size); + /*---------------------------------------------------------*\ | Copy in type | \*---------------------------------------------------------*/ @@ -357,6 +364,8 @@ void RGBController::ReadDeviceDescription(unsigned char* data_buf) { unsigned int data_ptr = 0; + data_ptr += sizeof(unsigned int); + /*---------------------------------------------------------*\ | Copy in type | \*---------------------------------------------------------*/ diff --git a/qt/OpenRGBDevicePage.cpp b/qt/OpenRGBDevicePage.cpp index e6507670b..88c927def 100644 --- a/qt/OpenRGBDevicePage.cpp +++ b/qt/OpenRGBDevicePage.cpp @@ -613,6 +613,15 @@ void Ui::OpenRGBDevicePage::SetDevice(unsigned char red, unsigned char green, un on_SetDeviceButton_clicked(); } +void Ui::OpenRGBDevicePage::UpdateDevice() +{ + ui->ModeBox->blockSignals(true); + ui->ModeBox->setCurrentIndex(device->active_mode); + ui->ModeBox->blockSignals(false); + UpdateModeUi(); + UpdateMode(); +} + void Ui::OpenRGBDevicePage::SetCustomMode() { device->SetCustomMode(); diff --git a/qt/OpenRGBDevicePage.h b/qt/OpenRGBDevicePage.h index 21de997ac..6945b154d 100644 --- a/qt/OpenRGBDevicePage.h +++ b/qt/OpenRGBDevicePage.h @@ -20,6 +20,7 @@ public: void SetDevice(unsigned char red, unsigned char green, unsigned char blue); void SetCustomMode(); + void UpdateDevice(); void UpdateMode(); void UpdateModeUi(); diff --git a/qt/OpenRGBDialog2.cpp b/qt/OpenRGBDialog2.cpp index 5bdb5863b..cee0af1ee 100644 --- a/qt/OpenRGBDialog2.cpp +++ b/qt/OpenRGBDialog2.cpp @@ -1,7 +1,9 @@ +#include #include "OpenRGBDialog2.h" #include "OpenRGBDevicePage.h" #include "OpenRGBDeviceInfoPage.h" #include "OpenRGBSystemInfoPage.h" +#include "RGBController_Dummy.h" #include #include @@ -276,4 +278,111 @@ void OpenRGBDialog2::on_ShowHide() { hide(); } -} \ No newline at end of file +} + +void Ui::OpenRGBDialog2::on_ButtonSaveProfile_clicked() +{ + for(int controller_index = 0; controller_index < controllers.size(); controller_index++) + { + char filename[128]; + snprintf(filename, 128, "controller_%d.bin", controller_index); + + std::ofstream controller_file(filename, std::ios::out | std::ios::binary); + + unsigned char *controller_data = controllers[controller_index]->GetDeviceDescription(); + unsigned int controller_size; + + memcpy(&controller_size, controller_data, sizeof(controller_size)); + + controller_file.write((const char *)controller_data, controller_size); + + controller_file.close(); + } +} + +void Ui::OpenRGBDialog2::on_ButtonLoadProfile_clicked() +{ + for(int controller_index = 0; controller_index < controllers.size(); controller_index++) + { + char filename[128]; + snprintf(filename, 128, "controller_%d.bin", controller_index); + + std::ifstream controller_file(filename, std::ios::in | std::ios::binary); + unsigned int controller_size; + + controller_file.read((char *)&controller_size, sizeof(controller_size)); + + unsigned char *controller_data = new unsigned char[controller_size]; + + controller_file.seekg(0); + + controller_file.read((char *)controller_data, controller_size); + + RGBController_Dummy temp_controller; + + temp_controller.ReadDeviceDescription(controller_data); + + delete[] controller_data; + + RGBController *controller_ptr = controllers[controller_index]; + + /*---------------------------------------------------------*\ + | Test if saved controller data matches this controller | + \*---------------------------------------------------------*/ + if((temp_controller.type == controller_ptr->type ) + &&(temp_controller.name == controller_ptr->name ) + &&(temp_controller.description == controller_ptr->description) + &&(temp_controller.version == controller_ptr->version ) + &&(temp_controller.serial == controller_ptr->serial ) + &&(temp_controller.location == controller_ptr->location )) + { + /*---------------------------------------------------------*\ + | Update all modes | + \*---------------------------------------------------------*/ + if(temp_controller.modes.size() == controller_ptr->modes.size()) + { + for(int mode_index = 0; mode_index < temp_controller.modes.size(); mode_index++) + { + if((temp_controller.modes[mode_index].name == controller_ptr->modes[mode_index].name ) + &&(temp_controller.modes[mode_index].value == controller_ptr->modes[mode_index].value ) + &&(temp_controller.modes[mode_index].flags == controller_ptr->modes[mode_index].flags ) + &&(temp_controller.modes[mode_index].speed_min == controller_ptr->modes[mode_index].speed_min ) + &&(temp_controller.modes[mode_index].speed_max == controller_ptr->modes[mode_index].speed_max ) + &&(temp_controller.modes[mode_index].colors_min == controller_ptr->modes[mode_index].colors_min) + &&(temp_controller.modes[mode_index].colors_max == controller_ptr->modes[mode_index].colors_max)) + { + controller_ptr->modes[mode_index].speed = temp_controller.modes[mode_index].speed; + controller_ptr->modes[mode_index].direction = temp_controller.modes[mode_index].direction; + controller_ptr->modes[mode_index].color_mode = temp_controller.modes[mode_index].color_mode; + + controller_ptr->modes[mode_index].colors.resize(temp_controller.modes[mode_index].colors.size()); + + for(int mode_color_index = 0; mode_color_index < temp_controller.modes[mode_index].colors.size(); mode_color_index++) + { + controller_ptr->modes[mode_index].colors[mode_color_index] = temp_controller.modes[mode_index].colors[mode_color_index]; + } + } + + } + + controller_ptr->active_mode = temp_controller.active_mode; + } + + /*---------------------------------------------------------*\ + | Update all colors | + \*---------------------------------------------------------*/ + if(temp_controller.colors.size() == controller_ptr->colors.size()) + { + for(int color_index = 0; color_index < temp_controller.colors.size(); color_index++) + { + controller_ptr->colors[color_index] = temp_controller.colors[color_index]; + } + } + } + } + + for(int device = 0; device < ui->DevicesTabBar->count(); device++) + { + qobject_cast(ui->DevicesTabBar->widget(device))->UpdateDevice(); + } +} diff --git a/qt/OpenRGBDialog2.h b/qt/OpenRGBDialog2.h index 24bc3fb0f..f21c6a42c 100644 --- a/qt/OpenRGBDialog2.h +++ b/qt/OpenRGBDialog2.h @@ -48,6 +48,8 @@ private slots: void on_QuickWhite(); void on_SetAllDevices(unsigned char red, unsigned char green, unsigned char blue); void on_ShowHide(); + void on_ButtonSaveProfile_clicked(); + void on_ButtonLoadProfile_clicked(); }; #endif // OPENRGBDIALOG2_H diff --git a/qt/OpenRGBDialog2.ui b/qt/OpenRGBDialog2.ui index e017daa22..79bc498a6 100644 --- a/qt/OpenRGBDialog2.ui +++ b/qt/OpenRGBDialog2.ui @@ -16,6 +16,13 @@ + + + Save Profile + + + + QTabWidget::Rounded @@ -79,6 +86,13 @@ + + + + Load Profile + + +