From 28c0bd8592135180806c7853c0429715af3d729e Mon Sep 17 00:00:00 2001 From: McNutnut Date: Wed, 25 Jun 2025 22:29:03 -0700 Subject: [PATCH] Add ViewSonic Elite Monitor (XG271QG) --- .../RGBController_XG270QG.cpp | 104 ++++++++++-------- .../VS_XG270QG_Controller.cpp | 4 +- .../VS_XG270QG_Controller.h | 3 +- .../ViewSonicControllerDetect.cpp | 7 +- 4 files changed, 67 insertions(+), 51 deletions(-) diff --git a/Controllers/ViewSonicController/RGBController_XG270QG.cpp b/Controllers/ViewSonicController/RGBController_XG270QG.cpp index 5826e609..f4990d5a 100644 --- a/Controllers/ViewSonicController/RGBController_XG270QG.cpp +++ b/Controllers/ViewSonicController/RGBController_XG270QG.cpp @@ -40,15 +40,15 @@ RGBController_XG270QG::RGBController_XG270QG(VS_XG270QG_Controller* controller_p 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 Custom; + Custom.name = "Custom"; + Custom.value = VS_MODE_STATIC; + Custom.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Custom.colors_min = 1; + Custom.colors_max = 1; + Custom.color_mode = MODE_COLORS_PER_LED; + Custom.colors.resize(1); + modes.push_back(Custom); mode Rainbow; Rainbow.name = "Rainbow Wave"; @@ -60,10 +60,10 @@ RGBController_XG270QG::RGBController_XG270QG(VS_XG270QG_Controller* controller_p mode Breath; Breath.name = "Breathing"; Breath.value = VS_MODE_BREATHING; - Breath.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Breath.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; Breath.colors_min = 1; Breath.colors_max = 1; - Breath.color_mode = MODE_COLORS_MODE_SPECIFIC; + Breath.color_mode = MODE_COLORS_PER_LED; Breath.colors.resize(1); modes.push_back(Breath); @@ -77,10 +77,10 @@ RGBController_XG270QG::RGBController_XG270QG(VS_XG270QG_Controller* controller_p mode Elite; Elite.name = "Elite"; Elite.value = VS_MODE_ELITE; - Elite.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Elite.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; Elite.colors_min = 1; Elite.colors_max = 1; - Elite.color_mode = MODE_COLORS_MODE_SPECIFIC; + Elite.color_mode = MODE_COLORS_PER_LED; Elite.colors.resize(1); modes.push_back(Elite); @@ -107,34 +107,34 @@ RGBController_XG270QG::RGBController_XG270QG(VS_XG270QG_Controller* controller_p 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; - back_circle.matrix_map = NULL; - zones.push_back(back_circle); + zone base; + base.name = "Base"; + base.type = ZONE_TYPE_SINGLE; + base.leds_min = 1; + base.leds_max = 1; + base.leds_count = 1; + base.matrix_map = NULL; + zones.push_back(base); - zone down; - down.name = "Down Stuff"; - down.type = ZONE_TYPE_SINGLE; - down.leds_min = 1; - down.leds_max = 1; - down.leds_count = 1; - down.matrix_map = NULL; - zones.push_back(down); - - led back; - back.name = "Back"; - back.value = 0x00; - leds.push_back(back); + zone rear; + rear.name = "Rear"; + rear.type = ZONE_TYPE_SINGLE; + rear.leds_min = 1; + rear.leds_max = 1; + rear.leds_count = 1; + rear.matrix_map = NULL; + zones.push_back(rear); led d; - d.name = "Down"; - d.value = 0x01; + d.name = "Base"; + d.value = 0x00; leds.push_back(d); + led back; + back.name = "Rear"; + back.value = 0x01; + leds.push_back(back); + SetupColors(); } @@ -147,9 +147,7 @@ void RGBController_XG270QG::ResizeZone(int /*zone*/, int /*new_size*/) void RGBController_XG270QG::DeviceUpdateLEDs() { - /*---------------------------------------------------------*\ - | This device does not include any per-LED modes | - \*---------------------------------------------------------*/ + DeviceUpdateMode(); } void RGBController_XG270QG::UpdateZoneLEDs(int /*zone*/) @@ -164,14 +162,28 @@ void RGBController_XG270QG::UpdateSingleLED(int /*led*/) void RGBController_XG270QG::DeviceUpdateMode() { - uint8_t r = 0; - uint8_t g = 0; - uint8_t b = 0; + uint8_t r1 = 0; + uint8_t g1 = 0; + uint8_t b1 = 0; + uint8_t r2 = 0; + uint8_t g2 = 0; + uint8_t b2 = 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]); + r1 = r2 = RGBGetRValue(modes[active_mode].colors[0]); + g1 = g2 = RGBGetGValue(modes[active_mode].colors[0]); + b1 = b2 = RGBGetBValue(modes[active_mode].colors[0]); } - controller->SetMode(modes[active_mode].value, r, g, b); + else if (modes[active_mode].flags & MODE_FLAG_HAS_PER_LED_COLOR) + { + r1 = RGBGetRValue(colors[0]); + g1 = RGBGetGValue(colors[0]); + b1 = RGBGetBValue(colors[0]); + + r2 = RGBGetRValue(colors[1]); + g2 = RGBGetGValue(colors[1]); + b2 = RGBGetBValue(colors[1]); + } + controller->SetMode(modes[active_mode].value, r1, g1, b1, modes[active_mode].value, r2, g2, b2); } diff --git a/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp b/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp index f0d89429..717da3f5 100644 --- a/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp +++ b/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp @@ -43,9 +43,9 @@ std::string VS_XG270QG_Controller::GetSerial() return(StringUtils::wstring_to_string(serial_string)); } -void VS_XG270QG_Controller::SetMode(uint8_t mode, uint8_t r, uint8_t g, uint8_t b) +void VS_XG270QG_Controller::SetMode(uint8_t mode1, uint8_t r1, uint8_t g1, uint8_t b1, uint8_t mode2, uint8_t r2, uint8_t g2, uint8_t b2) { - SendModeComplete(mode, r, g, b, mode, r, g, b); + SendModeComplete(mode1, r1, g1, b1, mode2, r2, g2, b2); } void VS_XG270QG_Controller::SendModeComplete diff --git a/Controllers/ViewSonicController/VS_XG270QG_Controller.h b/Controllers/ViewSonicController/VS_XG270QG_Controller.h index a32c4d7f..ed97a800 100644 --- a/Controllers/ViewSonicController/VS_XG270QG_Controller.h +++ b/Controllers/ViewSonicController/VS_XG270QG_Controller.h @@ -38,7 +38,8 @@ public: std::string GetLocation(); std::string GetSerial(); - void SetMode(uint8_t mode, uint8_t r, uint8_t g, uint8_t b); + void SetMode(uint8_t mode1, uint8_t r1, uint8_t g1, uint8_t b1, + uint8_t mode2, uint8_t r2, uint8_t g2, uint8_t b2); private: hid_device* dev; diff --git a/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp b/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp index aebc250a..22d6a4b8 100644 --- a/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp +++ b/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp @@ -14,8 +14,10 @@ #include "VS_XG270QG_Controller.h" #include "RGBController_XG270QG.h" -#define VIEWSONIC_VID 0x0416 +#define WINBOND_VID 0x0416 +#define VIEWSONIC_VID 0x0543 #define VS_XG270QG_PID 0x5020 +#define VS_XG271QG_PID 0xA004 void DetectViewSonic(hid_device_info* info, const std::string& name) { @@ -31,4 +33,5 @@ void DetectViewSonic(hid_device_info* info, const std::string& name) } } -REGISTER_HID_DETECTOR_IPU("ViewSonic Monitor XG270QG", DetectViewSonic, VIEWSONIC_VID, VS_XG270QG_PID, 0, 0xFF00, 1); +REGISTER_HID_DETECTOR_IPU("ViewSonic Monitor XG270QG", DetectViewSonic, WINBOND_VID, VS_XG270QG_PID, 0, 0xFF00, 1); +REGISTER_HID_DETECTOR_IP("ViewSonic Monitor XG271QG", DetectViewSonic, VIEWSONIC_VID, VS_XG271QG_PID, 0, 0x0001);