Add ViewSonic Elite XG270QG

Amended for code style by Adam Honse <calcprogrammer1@gmail.com>
This commit is contained in:
Lanzaa 2022-05-05 02:46:41 +00:00 committed by Adam Honse
parent 0d7e947575
commit 817d5d55df
6 changed files with 382 additions and 0 deletions

View file

@ -0,0 +1,164 @@
/*------------------------------------*\
| RGBController_XG270QG.cpp |
| Lanzaa 1/23/2022 |
\*------------------------------------*/
#include "RGBController_XG270QG.h"
#include "LogManager.h"
#include <string>
RGBController_XG270QG::RGBController_XG270QG(VS_XG270QG_Controller* controller_ptr)
{
controller = controller_ptr;
name = "ViewSonic Elite XG270QG";
vendor = "ViewSonic";
version = controller->GetVersion();
type = DEVICE_TYPE_UNKNOWN;
description = "ViewSonic Monitor";
location = controller->GetLocation();
serial = controller->GetSerial();
mode Off;
Off.name = "Off";
Off.value = VS_MODE_OFF;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
mode StaticColor;
StaticColor.name = "Static";
StaticColor.value = VS_MODE_STATIC;
StaticColor.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
StaticColor.colors_min = 1;
StaticColor.colors_max = 1;
StaticColor.color_mode = MODE_COLORS_MODE_SPECIFIC;
StaticColor.colors.resize(1);
modes.push_back(StaticColor);
mode Rainbow;
Rainbow.name = "Rainbow Wave";
Rainbow.value = VS_MODE_RAINBOW;
Rainbow.flags = MODE_FLAG_AUTOMATIC_SAVE;
Rainbow.color_mode = MODE_COLORS_NONE;
modes.push_back(Rainbow);
mode Breath;
Breath.name = "Breathing";
Breath.value = VS_MODE_BREATHING;
Breath.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Breath.colors_min = 1;
Breath.colors_max = 1;
Breath.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breath.colors.resize(1);
modes.push_back(Breath);
mode Waterfall;
Waterfall.name = "Waterfall";
Waterfall.value = VS_MODE_WATERFALL;
Waterfall.flags = MODE_FLAG_AUTOMATIC_SAVE;
Waterfall.color_mode = MODE_COLORS_NONE;
modes.push_back(Waterfall);
mode Elite;
Elite.name = "Elite";
Elite.value = VS_MODE_ELITE;
Elite.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Elite.colors_min = 1;
Elite.colors_max = 1;
Elite.color_mode = MODE_COLORS_MODE_SPECIFIC;
Elite.colors.resize(1);
modes.push_back(Elite);
//mode Jazz;
//Jazz.name = "Jazz Wave (Audio Reactive)";
//Jazz.value = VS_MODE_JAZZ;
////Jazz.color_mode = MODE_COLORS_NONE; // might have color
//Jazz.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
//Jazz.colors_min = 1;
//Jazz.colors_max = 1;
//Jazz.color_mode = MODE_COLORS_MODE_SPECIFIC;
//Jazz.colors.resize(1);
//modes.push_back(Jazz);
//mode EliteGlobal;
//EliteGlobal.name = "Elite Global (Audio Reactive)";
//EliteGlobal.value = VS_MODE_ELITEGLOBAL;
//EliteGlobal.flags = MODE_FLAG_AUTOMATIC_SAVE;
//EliteGlobal.color_mode = MODE_COLORS_NONE;
//modes.push_back(EliteGlobal);
RGBController_XG270QG::SetupZones();
}
void RGBController_XG270QG::SetupZones()
{
zone back_circle;
back_circle.name = "back circle";
back_circle.type = ZONE_TYPE_SINGLE;
back_circle.leds_min = 1;
back_circle.leds_max = 1;
back_circle.leds_count = 1;
zones.push_back(back_circle);
zone down;
down.name = "down stuff";
down.type = ZONE_TYPE_SINGLE;
down.leds_min = 1;
down.leds_max = 1;
down.leds_count = 1;
zones.push_back(down);
led back;
back.name = "back";
back.value = 0x00;
leds.push_back(back);
led d;
d.name = "down";
d.value = 0x01;
leds.push_back(d);
SetupColors();
}
void RGBController_XG270QG::ResizeZone(int zone, int new_size)
{
// Not applicable
}
void RGBController_XG270QG::DeviceUpdateLEDs()
{
//
}
void RGBController_XG270QG::UpdateZoneLEDs(int zone)
{
//
}
void RGBController_XG270QG::UpdateSingleLED(int led)
{
//
}
void RGBController_XG270QG::DeviceUpdateMode()
{
uint8_t r = 0;
uint8_t g = 0;
uint8_t b = 0;
if(modes[active_mode].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
{
r = RGBGetRValue(modes[active_mode].colors[0]);
g = RGBGetGValue(modes[active_mode].colors[0]);
b = RGBGetBValue(modes[active_mode].colors[0]);
}
controller->SetMode(modes[active_mode].value, r, g, b);
}
void RGBController_XG270QG::SetCustomMode()
{
/*-------------------------------------------------*\
| Set mode to Static Color |
\*-------------------------------------------------*/
active_mode = 1;
}

View file

@ -0,0 +1,33 @@
/*------------------------------------*\
| RGBController_XG270QG.h |
| Lanzaa 1/23/2022 |
\*------------------------------------*/
#pragma once
#include <cstdint>
#include <vector>
#include "VS_XG270QG_Controller.h"
#include "RGBController.h"
class RGBController_XG270QG : public RGBController
{
public:
RGBController_XG270QG(VS_XG270QG_Controller* controller_ptr);
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateMode();
void SetCustomMode();
private:
VS_XG270QG_Controller* controller;
};

View file

@ -0,0 +1,96 @@
/*-----------------------------------*\
| VS_XG270QG_Controller.cpp |
| Lanzaa 1/23/2022 |
\*-----------------------------------*/
#include "VS_XG270QG_Controller.h"
#include "LogManager.h"
#include <cstring>
VS_XG270QG_Controller::VS_XG270QG_Controller(hid_device* device, const char* path)
{
dev = device;
location = path;
}
VS_XG270QG_Controller::~VS_XG270QG_Controller()
{
hid_close(dev);
}
std::string VS_XG270QG_Controller::GetVersion()
{
return "?";
}
std::string VS_XG270QG_Controller::GetLocation()
{
return location;
}
std::string VS_XG270QG_Controller::GetSerial()
{
wchar_t serial_string[128];
int ret = hid_get_serial_number_string(dev, serial_string, 128);
if(ret != 0)
{
return("");
}
std::wstring return_wstring = serial_string;
std::string return_string(return_wstring.begin(), return_wstring.end());
return(return_string);
return serial;
}
void VS_XG270QG_Controller::SetMode(uint8_t mode, uint8_t r, uint8_t g, uint8_t b)
{
SendModeComplete(mode, r, g, b, mode, r, g, b);
}
void VS_XG270QG_Controller::SendModeComplete
(
uint8_t mode1, uint8_t r1, uint8_t g1, uint8_t b1,
uint8_t mode2, uint8_t r2, uint8_t g2, uint8_t b2
)
{
uint8_t data[] = {
0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00,
0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
data[0x01] = mode1; // Downward facing LEDs
data[0x02] = r1;
data[0x03] = g1;
data[0x04] = b1;
data[0x05] = 0x00;
data[0x06] = 0x0A;
data[0x07] = 0x00;
data[0x08] = mode2; // Back facing LEDs
data[0x09] = r2;
data[0x0A] = g2;
data[0x0B] = b2;
data[0x0C] = 0x00;
data[0x0D] = 0x0A; // Might be speed related
// original data packets are 0x40=64 long
SendCommand(0, data, 0x20);
}
void VS_XG270QG_Controller::SendCommand(uint16_t wIndex, uint8_t *data, size_t length)
{
hid_send_feature_report(dev, data, length);
}

View file

@ -0,0 +1,58 @@
/*---------------------------------------*\
| VS_XG270QG_Controller.h |
| |
| Definitions and types for ViewSonic |
| Elite XG270QG Monitor |
| |
| Lanzaa 1/23/2022 |
\*---------------------------------------*/
#pragma once
#include <cstdint>
#include <mutex>
#include <string>
#include "RGBController.h"
#include <hidapi/hidapi.h>
enum
{
VS_MODE_OFF = 0x00,
VS_MODE_STATIC = 0x01,
VS_MODE_BREATHING = 0x02,
VS_MODE_RAINBOW = 0x07,
VS_MODE_ELITE = 0x0A,
VS_MODE_JAZZ = 0x0C,
VS_MODE_WATERFALL = 0x12,
VS_MODE_ELITEGLOBAL = 0x13,
};
class VS_XG270QG_Controller
{
public:
VS_XG270QG_Controller(hid_device* device, const char* path);
~VS_XG270QG_Controller();
std::string GetVersion();
std::string GetLocation();
std::string GetSerial();
void SetMode(uint8_t mode, uint8_t r, uint8_t g, uint8_t b);
private:
hid_device* dev;
std::string location;
std::string version;
std::string serial;
std::string ReadVersion();
void SendModeComplete
(
uint8_t mode1, uint8_t r1, uint8_t g1, uint8_t b1,
uint8_t mode2, uint8_t r2, uint8_t g2, uint8_t b2
);
void SendCommand(uint16_t wIndex, uint8_t *config, size_t length);
};

View file

@ -0,0 +1,25 @@
#include "Detector.h"
#include "VS_XG270QG_Controller.h"
#include "RGBController_XG270QG.h"
#include <hidapi/hidapi.h>
#include "LogManager.h"
#define VIEWSONIC_VID 0x0416
#define VS_XG270QG_PID 0x5020
void DetectViewSonic(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
VS_XG270QG_Controller* controller = new VS_XG270QG_Controller(dev, info->path);
RGBController_XG270QG* rgb_controller = new RGBController_XG270QG(controller);
rgb_controller->name = name;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
REGISTER_HID_DETECTOR_IPU("ViewSonic Monitor XG270QG", DetectViewSonic, VIEWSONIC_VID, VS_XG270QG_PID, 0, 0xFF00, 1);

View file

@ -153,6 +153,7 @@ INCLUDEPATH +=
Controllers/TecknetController/ \
Controllers/ThermaltakePoseidonZRGBController/ \
Controllers/ThermaltakeRiingController/ \
Controllers/ViewSonicController/ \
Controllers/WootingKeyboardController/ \
Controllers/YeelightController/ \
Controllers/ZalmanZSyncController/ \
@ -539,6 +540,8 @@ HEADERS +=
Controllers/TrustController/RGBController_TrustGXT180.h \
Controllers/TrustController/TrustGXT114Controller.h \
Controllers/TrustController/TrustGXT180Controller.h \
Controllers/ViewSonicController/VS_XG270QG_Controller.h \
Controllers/ViewSonicController/RGBController_XG270QG.h \
Controllers/WootingKeyboardController/WootingKeyboardController.h \
Controllers/WootingKeyboardController/WootingOneKeyboardController.h \
Controllers/WootingKeyboardController/WootingTwoKeyboardController.h \
@ -1047,6 +1050,9 @@ SOURCES +=
Controllers/TrustController/TrustControllerDetect.cpp \
Controllers/TrustController/RGBController_TrustGXT114.cpp \
Controllers/TrustController/RGBController_TrustGXT180.cpp \
Controllers/ViewSonicController/ViewSonicControllerDetect.cpp \
Controllers/ViewSonicController/RGBController_XG270QG.cpp \
Controllers/ViewSonicController/VS_XG270QG_Controller.cpp \
Controllers/WootingKeyboardController/WootingKeyboardController.cpp \
Controllers/WootingKeyboardController/WootingKeyboardControllerDetect.cpp \
Controllers/WootingKeyboardController/WootingOneKeyboardController.cpp \