Initial NZXT Smart Device V2 fan controller. Use a thread to process fan updates to avoid locking up the dialog.

This commit is contained in:
Adam Honse
2020-06-23 11:07:03 -05:00
parent d3a36fc184
commit 9a960a7d48
6 changed files with 129 additions and 7 deletions

View File

@@ -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);
}
}

View File

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

View File

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

View File

@@ -12,6 +12,8 @@
#include <hidapi.h>
#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);
}
}
}

View File

@@ -1,8 +1,30 @@
#include "OpenRGBFanPage.h"
#include <QTimer>
#include "OpenRGBFanPage.h"
using namespace Ui;
#ifdef _WIN32
#include <Windows.h>
#endif
#ifdef __APPLE__
#include <unistd.h>
static void Sleep(unsigned int milliseconds)
{
usleep(1000 * milliseconds);
}
#endif
#ifdef __linux__
#include <unistd.h>
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();
}

View File

@@ -5,6 +5,7 @@
#include "FanController.h"
#include <QFrame>
#include <thread>
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:
};