From fa8f06f27306499703ba7b74290cf96eb10afdd4 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 13 Aug 2019 15:58:36 -0500 Subject: [PATCH] Initial Corsair Vengeance Pro RGB support --- OpenAuraSDK/CorsairProController.cpp | 127 ++++++++++++++++++++ OpenAuraSDK/CorsairProController.h | 88 ++++++++++++++ OpenAuraSDK/OpenAuraSDK.cpp | 100 +++++++++++++++- OpenAuraSDK/OpenAuraSDK.vcxproj | 4 + OpenAuraSDK/OpenAuraSDK.vcxproj.filters | 12 ++ OpenAuraSDK/RGBController_CorsairPro.cpp | 144 +++++++++++++++++++++++ OpenAuraSDK/RGBController_CorsairPro.h | 28 +++++ 7 files changed, 502 insertions(+), 1 deletion(-) create mode 100644 OpenAuraSDK/CorsairProController.cpp create mode 100644 OpenAuraSDK/CorsairProController.h create mode 100644 OpenAuraSDK/RGBController_CorsairPro.cpp create mode 100644 OpenAuraSDK/RGBController_CorsairPro.h diff --git a/OpenAuraSDK/CorsairProController.cpp b/OpenAuraSDK/CorsairProController.cpp new file mode 100644 index 00000000..1a010406 --- /dev/null +++ b/OpenAuraSDK/CorsairProController.cpp @@ -0,0 +1,127 @@ +/*-----------------------------------------*\ +| CorsairProController.cpp | +| | +| Definitions and types for Corsair | +| Vengeance Pro RGB RAM lighting controller| +| | +| Adam Honse (CalcProgrammer1) 6/30/2019 | +\*-----------------------------------------*/ + +#include "CorsairProController.h" +#include +#include + +CorsairProController::CorsairProController(i2c_smbus_interface* bus, corsair_dev_id dev) +{ + this->bus = bus; + this->dev = dev; + + strcpy(device_name, "Corsair Vengeance Pro RGB"); + led_count = CORSAIR_PRO_LED_COUNT; + + for (int i = 0; i < led_count; i++) + { + led_red[i] = 0; + led_green[i] = 0; + led_blue[i] = 0; + } +} + +CorsairProController::~CorsairProController() +{ + +} + +char* CorsairProController::GetDeviceName() +{ + return(device_name); +} + +unsigned int CorsairProController::GetLEDCount() +{ + return(led_count); +} + +void CorsairProController::SetAllColors(unsigned char red, unsigned char green, unsigned char blue) +{ + for (int i = 0; i < led_count; i++) + { + led_red[i] = red; + led_green[i] = green; + led_blue[i] = blue; + } +} + +void CorsairProController::SetLEDColor(unsigned int led, unsigned char red, unsigned char green, unsigned char blue) +{ + led_red[led] = red; + led_green[led] = green; + led_blue[led] = blue; +} + +void CorsairProController::ApplyColors() +{ + bus->i2c_smbus_write_byte_data(dev, 0x26, 0x02); + Sleep(1); + bus->i2c_smbus_write_byte_data(dev, 0x21, 0x00); + Sleep(1); + + for (int i = 0; i < 10; i++) + { + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, led_red[i]); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, led_green[i]); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, led_blue[i]); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0xFF); + } + + bus->i2c_smbus_write_byte_data(dev, 0x82, 0x02); +} + +void CorsairProController::SetEffect(unsigned char mode) +{ + bus->i2c_smbus_write_byte_data(dev, 0x26, 0x01); + Sleep(1); + bus->i2c_smbus_write_byte_data(dev, 0x21, 0x00); + Sleep(1); + + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, mode); //Mode + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, CORSAIR_PRO_SPEED_MEDIUM); //Speed + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, CORSAIR_PRO_EFFECT_RANDOM_COLORS); //Custom color + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, CORSAIR_PRO_DIRECTION_UP); //Direction + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 1 red + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 1 green + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 1 blue + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0xFF); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 2 red + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 2 green + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); // Custom color 2 blue + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0xFF); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + bus->i2c_smbus_write_byte_data(dev, CORSAIR_PRO_REG_COMMAND, 0x00); + + bus->i2c_smbus_write_byte_data(dev, 0x82, 0x01); + WaitReady(); +} + +void CorsairProController::SetCustom() +{ + SetEffect(CORSAIR_PRO_MODE_STATIC); +} + +bool CorsairProController::WaitReady() +{ + int i = 0; + while (bus->i2c_smbus_read_byte_data(dev, 0x41) != 0x00) + { + i++; + Sleep(1); + } + + return false; +} \ No newline at end of file diff --git a/OpenAuraSDK/CorsairProController.h b/OpenAuraSDK/CorsairProController.h new file mode 100644 index 00000000..f1567400 --- /dev/null +++ b/OpenAuraSDK/CorsairProController.h @@ -0,0 +1,88 @@ +/*-----------------------------------------*\ +| CorsairProController.h | +| | +| Definitions and types for Corsair | +| Vengeance Pro RGB RAM lighting controller| +| | +| Adam Honse (CalcProgrammer1) 6/30/2019 | +\*-----------------------------------------*/ + +#include "i2c_smbus.h" + +#pragma once + +typedef unsigned char corsair_dev_id; + +#define CORSAIR_PRO_LED_COUNT ( 10 ) + +enum +{ + CORSAIR_PRO_REG_COMMAND = 0x20, /* Command write register */ +}; + +enum +{ + CORSAIR_PRO_MODE_COLOR_SHIFT = 0x00, /* Color Shift mode */ + CORSAIR_PRO_MODE_COLOR_PULSE = 0x01, /* Color Pulse mode */ + CORSAIR_PRO_MODE_RAINBOW_WAVE = 0x03, /* Rainbow Wave mode */ + CORSAIR_PRO_MODE_COLOR_WAVE = 0x04, /* Color Wave mode */ + CORSAIR_PRO_MODE_VISOR = 0x05, /* Visor mode */ + CORSAIR_PRO_MODE_RAIN = 0x06, /* Rain mode */ + CORSAIR_PRO_MODE_MARQUEE = 0x07, /* Marquee mode */ + CORSAIR_PRO_MODE_RAINBOW = 0x08, /* Rainbow mode */ + CORSAIR_PRO_MODE_SEQUENTIAL = 0x09, /* Sequential mode */ + CORSAIR_PRO_MODE_STATIC = 0x10, /* Static mode */ + + CORSAIR_PRO_NUMBER_MODES = 10, /* Number of Corsair Pro modes */ +}; + +enum +{ + CORSAIR_PRO_SPEED_SLOW = 0x00, /* Slow speed */ + CORSAIR_PRO_SPEED_MEDIUM = 0x01, /* Medium speed */ + CORSAIR_PRO_SPEED_FAST = 0x02, /* Fast speed */ +}; + +enum +{ + CORSAIR_PRO_EFFECT_RANDOM_COLORS = 0x00, /* Random colors */ + CORSAIR_PRO_EFFECT_CUSTOM_COLORS = 0x01, /* Custom colors */ +}; + +enum +{ + CORSAIR_PRO_DIRECTION_UP = 0x00, /* Up direction */ + CORSAIR_PRO_DIRECTION_DOWN = 0x01, /* Down direction */ + CORSAIR_PRO_DIRECTION_LEFT = 0x02, /* Left direction */ + CORSAIR_PRO_DIRECTION_RIGHT = 0x03, /* Right direction */ + CORSAIR_PRO_DIRECTION_VERTICAL = 0x01, /* Vertical direction */ + CORSAIR_PRO_DIRECTION_HORIZONTAL = 0x03, /* Horizontal direction */ +}; + +class CorsairProController +{ +public: + CorsairProController(i2c_smbus_interface* bus, corsair_dev_id dev); + ~CorsairProController(); + + char* GetDeviceName(); + unsigned int GetLEDCount(); + void SetEffect(unsigned char mode); + void SetCustom(); + + void SetAllColors(unsigned char red, unsigned char green, unsigned char blue); + void SetLEDColor(unsigned int led, unsigned char red, unsigned char green, unsigned char blue); + void ApplyColors(); + bool WaitReady(); + +private: + char device_name[32]; + unsigned int led_count; + + unsigned char led_red[CORSAIR_PRO_LED_COUNT]; + unsigned char led_green[CORSAIR_PRO_LED_COUNT]; + unsigned char led_blue[CORSAIR_PRO_LED_COUNT]; + + i2c_smbus_interface* bus; + corsair_dev_id dev; +}; \ No newline at end of file diff --git a/OpenAuraSDK/OpenAuraSDK.cpp b/OpenAuraSDK/OpenAuraSDK.cpp index cd7ca202..9a9bb5b0 100644 --- a/OpenAuraSDK/OpenAuraSDK.cpp +++ b/OpenAuraSDK/OpenAuraSDK.cpp @@ -8,10 +8,12 @@ #include "AuraController.h" #include "CorsairController.h" +#include "CorsairProController.h" #include "HyperXController.h" #include "RGBController.h" #include "RGBController_Aura.h" #include "RGBController_Corsair.h" +#include "RGBController_CorsairPro.h" #include "RGBController_HyperX.h" #include "RGBController_OpenRazer.h" #include "RGBController_AorusGPU.h" @@ -44,6 +46,7 @@ std::vector aura_controllers; std::vector corsair_controllers; +std::vector corsair_pro_controllers; std::vector hyperx_controllers; std::vector busses; std::vector rgb_controllers; @@ -390,6 +393,30 @@ bool TestForCorsairController(i2c_smbus_interface* bus, unsigned char address) } /* TestForCorsairController() */ +/******************************************************************************************\ +* * +* TestForCorsairProController * +* * +* Tests the given address to see if a Corsair Pro controller exists there. * +* * +\******************************************************************************************/ + +bool TestForCorsairProController(i2c_smbus_interface* bus, unsigned char address) +{ + bool pass = false; + + int res = bus->i2c_smbus_write_quick(address, I2C_SMBUS_WRITE); + + if (res >= 0) + { + pass = true; + } + + return(pass); + +} /* TestForCorsairProController() */ + + /******************************************************************************************\ * * * TestForHyperXController * @@ -555,6 +582,69 @@ void DetectCorsairControllers() } /* DetectCorsairControllers() */ +/******************************************************************************************\ +* * +* DetectCorsairProControllers * +* * +* Detect Corsair Pro controllers on the enumerated I2C busses. * +* * +* bus - pointer to i2c_smbus_interface where Aura device is connected * +* dev - I2C address of Aura device * +* * +\******************************************************************************************/ + +void DetectCorsairProControllers() +{ + CorsairProController* new_controller; + + for (unsigned int bus = 0; bus < busses.size(); bus++) + { + // Check for Corsair controller at 0x58 + if (TestForCorsairProController(busses[bus], 0x58)) + { + new_controller = new CorsairProController(busses[bus], 0x58); + corsair_pro_controllers.push_back(new_controller); + } + + // Check for Corsair controller at 0x59 + if (TestForCorsairProController(busses[bus], 0x59)) + { + new_controller = new CorsairProController(busses[bus], 0x59); + corsair_pro_controllers.push_back(new_controller); + } + + // Check for Corsair controller at 0x5A + if (TestForCorsairProController(busses[bus], 0x5A)) + { + new_controller = new CorsairProController(busses[bus], 0x5A); + corsair_pro_controllers.push_back(new_controller); + } + + // Check for Corsair controller at 0x5B + if (TestForCorsairProController(busses[bus], 0x5B)) + { + new_controller = new CorsairProController(busses[bus], 0x5B); + corsair_pro_controllers.push_back(new_controller); + } + + // Check for Corsair controller at 0x5C + if (TestForCorsairProController(busses[bus], 0x5C)) + { + new_controller = new CorsairProController(busses[bus], 0x5C); + corsair_pro_controllers.push_back(new_controller); + } + + // Check for Corsair controller at 0x5D + if (TestForCorsairProController(busses[bus], 0x5D)) + { + new_controller = new CorsairProController(busses[bus], 0x5D); + corsair_pro_controllers.push_back(new_controller); + } + } + +} /* DetectCorsairProControllers() */ + + /******************************************************************************************\ * * * DetectHyperXControllers * @@ -708,7 +798,8 @@ void DetectRGBControllers(void) DetectI2CBusses(); DetectAuraControllers(); - DetectCorsairControllers(); + //DetectCorsairControllers(); + //DetectCorsairProControllers(); DetectHyperXControllers(); for (int i = 0; i < aura_controllers.size(); i++) @@ -725,6 +816,13 @@ void DetectRGBControllers(void) rgb_controllers.push_back(corsair_rgb); } + for (int i = 0; i < corsair_pro_controllers.size(); i++) + { + RGBController_CorsairPro* corsair_rgb = new RGBController_CorsairPro(corsair_pro_controllers[i]); + + rgb_controllers.push_back(corsair_rgb); + } + for (int i = 0; i < hyperx_controllers.size(); i++) { RGBController_HyperX* hyperx_rgb = new RGBController_HyperX(hyperx_controllers[i]); diff --git a/OpenAuraSDK/OpenAuraSDK.vcxproj b/OpenAuraSDK/OpenAuraSDK.vcxproj index b376a5d2..5da853f4 100644 --- a/OpenAuraSDK/OpenAuraSDK.vcxproj +++ b/OpenAuraSDK/OpenAuraSDK.vcxproj @@ -179,6 +179,7 @@ + @@ -190,6 +191,7 @@ + @@ -201,6 +203,7 @@ + @@ -214,6 +217,7 @@ + diff --git a/OpenAuraSDK/OpenAuraSDK.vcxproj.filters b/OpenAuraSDK/OpenAuraSDK.vcxproj.filters index 0c3d39cf..73c0a8c7 100644 --- a/OpenAuraSDK/OpenAuraSDK.vcxproj.filters +++ b/OpenAuraSDK/OpenAuraSDK.vcxproj.filters @@ -75,6 +75,12 @@ Header Files + + Header Files + + + Header Files + @@ -137,6 +143,12 @@ Source Files + + Source Files + + + Source Files + diff --git a/OpenAuraSDK/RGBController_CorsairPro.cpp b/OpenAuraSDK/RGBController_CorsairPro.cpp new file mode 100644 index 00000000..093cb02e --- /dev/null +++ b/OpenAuraSDK/RGBController_CorsairPro.cpp @@ -0,0 +1,144 @@ +/*-----------------------------------------*\ +| RGBController_CorsairPro.cpp | +| | +| Generic RGB Interface for OpenAuraSDK | +| Corsair Vengeance Pro RGB driver | +| | +| Adam Honse (CalcProgrammer1) 6/30/2019 | +\*-----------------------------------------*/ + +#include "RGBController_CorsairPro.h" + +int RGBController_CorsairPro::GetMode() +{ + return(0); +} + +void RGBController_CorsairPro::SetMode(int mode) +{ + switch (mode) + { + case 0: + corsair->SetEffect(CORSAIR_PRO_MODE_COLOR_SHIFT); + break; + case 1: + corsair->SetEffect(CORSAIR_PRO_MODE_COLOR_PULSE); + break; + case 2: + corsair->SetEffect(CORSAIR_PRO_MODE_RAINBOW_WAVE); + break; + case 3: + corsair->SetEffect(CORSAIR_PRO_MODE_COLOR_WAVE); + break; + case 4: + corsair->SetEffect(CORSAIR_PRO_MODE_VISOR); + break; + case 5: + corsair->SetEffect(CORSAIR_PRO_MODE_RAIN); + break; + case 6: + corsair->SetEffect(CORSAIR_PRO_MODE_MARQUEE); + break; + case 7: + corsair->SetEffect(CORSAIR_PRO_MODE_RAINBOW); + break; + case 8: + corsair->SetEffect(CORSAIR_PRO_MODE_SEQUENTIAL); + break; + case 9: + corsair->SetEffect(CORSAIR_PRO_MODE_STATIC); + break; + } +} + +void RGBController_CorsairPro::SetCustomMode() +{ + corsair->SetCustom(); +} + +void RGBController_CorsairPro::SetAllLEDs(RGBColor color) +{ + unsigned char red = RGBGetRValue(color); + unsigned char grn = RGBGetGValue(color); + unsigned char blu = RGBGetBValue(color); + + corsair->SetAllColors(red, grn, blu); + corsair->ApplyColors(); +} + +void RGBController_CorsairPro::SetAllZoneLEDs(int zone, RGBColor color) +{ + unsigned char red = RGBGetRValue(color); + unsigned char grn = RGBGetGValue(color); + unsigned char blu = RGBGetBValue(color); + + for (int x = 0; x < zones[zone].map.size(); x++) + { + for (int y = 0; y < zones[zone].map[x].size(); y++) + { + corsair->SetLEDColor(zones[zone].map[x][y], red, grn, blu); + } + } + + corsair->ApplyColors(); +} + +void RGBController_CorsairPro::SetLED(int led, RGBColor color) +{ + unsigned char red = RGBGetRValue(color); + unsigned char grn = RGBGetGValue(color); + unsigned char blu = RGBGetBValue(color); + + corsair->SetLEDColor(led, red, grn, blu); + corsair->ApplyColors(); +} + +RGBController_CorsairPro::RGBController_CorsairPro(CorsairProController* corsair_ptr) +{ + corsair = corsair_ptr; + + name = corsair->GetDeviceName(); + + mode corsair_modes[CORSAIR_PRO_NUMBER_MODES]; + + corsair_modes[0].name = "Color Shift"; + corsair_modes[1].name = "Color Pulse"; + corsair_modes[2].name = "Rainbow Wave"; + corsair_modes[3].name = "Color Wave"; + corsair_modes[4].name = "Visor"; + corsair_modes[5].name = "Rain"; + corsair_modes[6].name = "Marquee"; + corsair_modes[7].name = "Rainbow"; + corsair_modes[8].name = "Sequential"; + corsair_modes[9].name = "Static"; + + for (int i = 0; i < CORSAIR_PRO_NUMBER_MODES; i++) + { + modes.push_back(corsair_modes[i]); + } + + for (int i = 0; i < corsair->GetLEDCount(); i++) + { + led* new_led = new led(); + + new_led->name = "Corsair Pro LED"; + + leds.push_back(*new_led); + } + + zone new_zone; + + new_zone.name = "Corsair Pro Zone"; + new_zone.type = ZONE_TYPE_LINEAR; + + std::vector zone_row; + + for (int i = 0; i < corsair->GetLEDCount(); i++) + { + zone_row.push_back(i); + } + + new_zone.map.push_back(zone_row); + + zones.push_back(new_zone); +} \ No newline at end of file diff --git a/OpenAuraSDK/RGBController_CorsairPro.h b/OpenAuraSDK/RGBController_CorsairPro.h new file mode 100644 index 00000000..225564e7 --- /dev/null +++ b/OpenAuraSDK/RGBController_CorsairPro.h @@ -0,0 +1,28 @@ +/*-----------------------------------------*\ +| RGBController_CorsairPro.h | +| | +| Generic RGB Interface for OpenAuraSDK | +| Corsair Vengeance Pro RGB driver | +| | +| Adam Honse (CalcProgrammer1) 6/30/2019 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "CorsairProController.h" + +class RGBController_CorsairPro : public RGBController +{ +public: + RGBController_CorsairPro(CorsairProController* corsair_ptr); + int GetMode(); + void SetMode(int mode); + void SetCustomMode(); + void SetAllLEDs(RGBColor color); + void SetAllZoneLEDs(int zone, RGBColor color); + void SetLED(int led, RGBColor color); + +private: + CorsairProController* corsair; +}; \ No newline at end of file