From 9a960a7d48901357e307c1c436175ca1aea69c5d Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 23 Jun 2020 11:07:03 -0500 Subject: [PATCH] Initial NZXT Smart Device V2 fan controller. Use a thread to process fan updates to avoid locking up the dialog. --- .../FanController_NZXTHue2.cpp | 55 +++++++++++++++++++ .../FanController_NZXTHue2.h | 24 ++++++++ .../NZXTHue2Controller/NZXTHue2Controller.cpp | 2 +- .../NZXTHue2ControllerDetect.cpp | 9 +++ qt/OpenRGBFanPage.cpp | 40 ++++++++++++-- qt/OpenRGBFanPage.h | 6 +- 6 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 Controllers/NZXTHue2Controller/FanController_NZXTHue2.cpp create mode 100644 Controllers/NZXTHue2Controller/FanController_NZXTHue2.h diff --git a/Controllers/NZXTHue2Controller/FanController_NZXTHue2.cpp b/Controllers/NZXTHue2Controller/FanController_NZXTHue2.cpp new file mode 100644 index 000000000..1b644feba --- /dev/null +++ b/Controllers/NZXTHue2Controller/FanController_NZXTHue2.cpp @@ -0,0 +1,55 @@ +/*-----------------------------------------*\ +| FanController_NZXTHue2.cpp | +| | +| Generic Fan Interface for NZXT Hue 2 | +| (Smart Device V2, Fan & RGB) controller | +| | +| Adam Honse (CalcProgrammer1) 6/22/2020 | +\*-----------------------------------------*/ + +#include "FanController_NZXTHue2.h" + +FanController_NZXTHue2::FanController_NZXTHue2(NZXTHue2Controller* hue2_ptr) +{ + hue2 = hue2_ptr; + + name = "NZXT Hue 2 Device"; + description = "NZXT Hue 2 Device"; + version = hue2->GetFirmwareVersion(); + + for(std::size_t fan_index = 0; fan_index < hue2->GetNumFanChannels(); fan_index++) + { + fan new_fan; + + hue2->UpdateStatus(); + + new_fan.name = "NZXT Fan "; + new_fan.name.append(std::to_string(fan_index + 1)); + new_fan.speed_min = 0; + new_fan.speed_max = 100; + new_fan.speed_cmd = hue2->GetFanCommand(fan_index); + new_fan.rpm_rdg = hue2->GetFanRPM(fan_index); + + fans.push_back(new_fan); + } + + UpdateControl(); +} + +void FanController_NZXTHue2::UpdateControl() +{ + for(std::size_t fan_index = 0; fan_index < fans.size(); fan_index++) + { + hue2->SendFan(fan_index, 0, fans[fan_index].speed_cmd); + } +} + +void FanController_NZXTHue2::UpdateReading() +{ + hue2->UpdateStatus(); + + for(std::size_t fan_index = 0; fan_index < fans.size(); fan_index++) + { + fans[fan_index].rpm_rdg = hue2->GetFanRPM(fan_index); + } +} \ No newline at end of file diff --git a/Controllers/NZXTHue2Controller/FanController_NZXTHue2.h b/Controllers/NZXTHue2Controller/FanController_NZXTHue2.h new file mode 100644 index 000000000..0e4a64e2e --- /dev/null +++ b/Controllers/NZXTHue2Controller/FanController_NZXTHue2.h @@ -0,0 +1,24 @@ +/*-----------------------------------------*\ +| FanController_NZXTHue2.h | +| | +| Generic Fan Interface for NZXT Hue 2 | +| (Smart Device V2, Fan & RGB) controller | +| | +| Adam Honse (CalcProgrammer1) 6/22/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "FanController.h" +#include "NZXTHue2Controller.h" + +class FanController_NZXTHue2 : public FanController +{ +public: + FanController_NZXTHue2(NZXTHue2Controller* hue2_ptr); + + void UpdateControl(); + void UpdateReading(); + +private: + NZXTHue2Controller* hue2; +}; diff --git a/Controllers/NZXTHue2Controller/NZXTHue2Controller.cpp b/Controllers/NZXTHue2Controller/NZXTHue2Controller.cpp index ab6abc1de..75e49a559 100644 --- a/Controllers/NZXTHue2Controller/NZXTHue2Controller.cpp +++ b/Controllers/NZXTHue2Controller/NZXTHue2Controller.cpp @@ -249,7 +249,7 @@ void NZXTHue2Controller::UpdateStatus() unsigned char usb_buf[64]; unsigned int ret_val = 0; - if(false)//num_fan_channels > 0) + if(num_fan_channels > 0) { /*-----------------------------------------------------*\ | Zero out buffer | diff --git a/Controllers/NZXTHue2Controller/NZXTHue2ControllerDetect.cpp b/Controllers/NZXTHue2Controller/NZXTHue2ControllerDetect.cpp index 08ddc22e6..87e3510ad 100644 --- a/Controllers/NZXTHue2Controller/NZXTHue2ControllerDetect.cpp +++ b/Controllers/NZXTHue2Controller/NZXTHue2ControllerDetect.cpp @@ -12,6 +12,8 @@ #include #include "Detector.h" #include "NZXTHue2Controller.h" +#include "FanController.h" +#include "FanController_NZXTHue2.h" #include "RGBController.h" #include "RGBController_NZXTHue2.h" @@ -45,6 +47,13 @@ static void spawn_hue(hid_device_info* info, const std::string& name, int rgb_ch rgb_controller->name = name; ResourceManager::get()->RegisterRGBController(rgb_controller); + + if(fan_channels > 0) + { + FanController_NZXTHue2* fan_controller = new FanController_NZXTHue2(controller); + fan_controller->name = name; + ResourceManager::get()->RegisterFanController(fan_controller); + } } } diff --git a/qt/OpenRGBFanPage.cpp b/qt/OpenRGBFanPage.cpp index fe87e316e..fbc6aa373 100644 --- a/qt/OpenRGBFanPage.cpp +++ b/qt/OpenRGBFanPage.cpp @@ -1,8 +1,30 @@ -#include "OpenRGBFanPage.h" #include +#include "OpenRGBFanPage.h" using namespace Ui; +#ifdef _WIN32 +#include +#endif + +#ifdef __APPLE__ +#include + +static void Sleep(unsigned int milliseconds) +{ + usleep(1000 * milliseconds); +} +#endif + +#ifdef __linux__ +#include + +static void Sleep(unsigned int milliseconds) +{ + usleep(1000 * milliseconds); +} +#endif + OpenRGBFanPage::OpenRGBFanPage(FanController *dev, QWidget *parent) : QFrame(parent), ui(new Ui::OpenRGBFanPageUi) @@ -14,6 +36,8 @@ OpenRGBFanPage::OpenRGBFanPage(FanController *dev, QWidget *parent) : \*-----------------------------------------------------*/ device = dev; + FanUpdateThread = new std::thread(&OpenRGBFanPage::FanUpdateThreadFunction, this); + QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&OpenRGBFanPage::UpdateRPM)); timer->start(1000); @@ -36,6 +60,16 @@ OpenRGBFanPage::~OpenRGBFanPage() delete ui; } +void OpenRGBFanPage::FanUpdateThreadFunction() +{ + while(1) + { + device->UpdateControl(); + device->UpdateReading(); + Sleep(1000); + } +} + void OpenRGBFanPage::UpdateRPM() { /*-----------------------------------------------------*\ @@ -43,8 +77,6 @@ void OpenRGBFanPage::UpdateRPM() \*-----------------------------------------------------*/ unsigned int selected_fan = (unsigned int)ui->FanBox->currentIndex(); - device->UpdateReading(); - ui->RPMValue->setText(QString::number(device->fans[selected_fan].rpm_rdg)); } @@ -76,6 +108,4 @@ void OpenRGBFanPage::on_SpeedSlider_valueChanged(int /* value */) unsigned int speed_cmd = ui->SpeedSlider->value(); device->fans[selected_fan].speed_cmd = speed_cmd; - - device->UpdateControl(); } diff --git a/qt/OpenRGBFanPage.h b/qt/OpenRGBFanPage.h index e35951abd..131148ad8 100644 --- a/qt/OpenRGBFanPage.h +++ b/qt/OpenRGBFanPage.h @@ -5,6 +5,7 @@ #include "FanController.h" #include +#include namespace Ui { class OpenRGBFanPage; @@ -17,7 +18,8 @@ class Ui::OpenRGBFanPage : public QFrame public: explicit OpenRGBFanPage(FanController *dev, QWidget *parent = nullptr); ~OpenRGBFanPage(); - + + void FanUpdateThreadFunction(); void SetDevice(unsigned char red, unsigned char green, unsigned char blue); void SetCustomMode(); void UpdateDevice(); @@ -34,6 +36,8 @@ private: Ui::OpenRGBFanPageUi *ui; FanController *device; + std::thread* FanUpdateThread; + signals: };