diff --git a/Controllers/ViewSonicController/RGBController_XG270QG.cpp b/Controllers/ViewSonicController/RGBController_XG270QG.cpp new file mode 100644 index 00000000..68295196 --- /dev/null +++ b/Controllers/ViewSonicController/RGBController_XG270QG.cpp @@ -0,0 +1,164 @@ +/*------------------------------------*\ +| RGBController_XG270QG.cpp | +| Lanzaa 1/23/2022 | +\*------------------------------------*/ + +#include "RGBController_XG270QG.h" +#include "LogManager.h" + +#include + +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; +} + diff --git a/Controllers/ViewSonicController/RGBController_XG270QG.h b/Controllers/ViewSonicController/RGBController_XG270QG.h new file mode 100644 index 00000000..4e7fbdf6 --- /dev/null +++ b/Controllers/ViewSonicController/RGBController_XG270QG.h @@ -0,0 +1,33 @@ +/*------------------------------------*\ +| RGBController_XG270QG.h | +| Lanzaa 1/23/2022 | +\*------------------------------------*/ + +#pragma once + +#include +#include + +#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; +}; diff --git a/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp b/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp new file mode 100644 index 00000000..63b21b0e --- /dev/null +++ b/Controllers/ViewSonicController/VS_XG270QG_Controller.cpp @@ -0,0 +1,96 @@ +/*-----------------------------------*\ +| VS_XG270QG_Controller.cpp | +| Lanzaa 1/23/2022 | +\*-----------------------------------*/ + +#include "VS_XG270QG_Controller.h" +#include "LogManager.h" + +#include + +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); +} + diff --git a/Controllers/ViewSonicController/VS_XG270QG_Controller.h b/Controllers/ViewSonicController/VS_XG270QG_Controller.h new file mode 100644 index 00000000..9003ad91 --- /dev/null +++ b/Controllers/ViewSonicController/VS_XG270QG_Controller.h @@ -0,0 +1,58 @@ +/*---------------------------------------*\ +| VS_XG270QG_Controller.h | +| | +| Definitions and types for ViewSonic | +| Elite XG270QG Monitor | +| | +| Lanzaa 1/23/2022 | +\*---------------------------------------*/ + +#pragma once + +#include +#include +#include + +#include "RGBController.h" + +#include + +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); +}; diff --git a/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp b/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp new file mode 100644 index 00000000..142e5c5a --- /dev/null +++ b/Controllers/ViewSonicController/ViewSonicControllerDetect.cpp @@ -0,0 +1,25 @@ +#include "Detector.h" +#include "VS_XG270QG_Controller.h" +#include "RGBController_XG270QG.h" +#include + +#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); diff --git a/OpenRGB.pro b/OpenRGB.pro index 5b238442..f9f88b9c 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -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 \