From 0bc5982970b30e9239d87b90c14949b9f7d4f916 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 14 Jan 2020 19:19:16 -0600 Subject: [PATCH] Add random color modes for HyperX Predator RGB --- .../HyperXController/HyperXController.cpp | 38 ++++++++++++------ .../HyperXController/HyperXController.h | 8 ++-- RGBController/RGBController_HyperX.cpp | 39 +++++++++++-------- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/Controllers/HyperXController/HyperXController.cpp b/Controllers/HyperXController/HyperXController.cpp index 5a57a0b8..1f71ac08 100644 --- a/Controllers/HyperXController/HyperXController.cpp +++ b/Controllers/HyperXController/HyperXController.cpp @@ -109,7 +109,7 @@ void HyperXController::SetAllColors(unsigned char red, unsigned char green, unsi if(mode == HYPERX_MODE_DIRECT) { - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE3, HYPERX_MODE3_DIRECT); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_INDEPENDENT, HYPERX_MODE3_DIRECT); } for(int led = 0; led < 5; led++) @@ -194,48 +194,64 @@ void HyperXController::SetLEDColor(unsigned int slot, unsigned int led, unsigned bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_APPLY, 0x03); } -void HyperXController::SetMode(unsigned char new_mode) +void HyperXController::SetMode(unsigned char new_mode, bool random) { mode = new_mode; bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_APPLY, 0x01); + /*-----------------------------------------------------*\ + | Determine which mode register to use. | + | If set to random color mode, use Mode1. | + | If set to fixed color mode, use Mode2. | + \*-----------------------------------------------------*/ + unsigned char mode_reg; + + if(random) + { + mode_reg = HYPERX_REG_MODE_RANDOM; + } + else + { + mode_reg = HYPERX_REG_MODE_CUSTOM; + } + switch (mode) { case HYPERX_MODE_DIRECT: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE3, HYPERX_MODE3_DIRECT); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_INDEPENDENT, HYPERX_MODE3_DIRECT); break; case HYPERX_MODE_STATIC: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_STATIC); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_CUSTOM, HYPERX_MODE2_STATIC); break; case HYPERX_MODE_RAINBOW: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE1, HYPERX_MODE1_RAINBOW); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_RANDOM, HYPERX_MODE1_RAINBOW); break; case HYPERX_MODE_COMET: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_COMET); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_COMET); break; case HYPERX_MODE_HEARTBEAT: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_HEARTBEAT); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_HEARTBEAT); break; case HYPERX_MODE_CYCLE: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE1, HYPERX_MODE1_CYCLE); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_RANDOM, HYPERX_MODE1_CYCLE); break; case HYPERX_MODE_BREATHING: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_BREATHING); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BREATHING); break; case HYPERX_MODE_BOUNCE: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_BOUNCE); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BOUNCE); break; case HYPERX_MODE_BLINK: - bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE2, HYPERX_MODE2_BLINK); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BLINK); break; } diff --git a/Controllers/HyperXController/HyperXController.h b/Controllers/HyperXController/HyperXController.h index 9e86bf4f..748ba404 100644 --- a/Controllers/HyperXController/HyperXController.h +++ b/Controllers/HyperXController/HyperXController.h @@ -103,9 +103,9 @@ enum HYPERX_REG_EFFECT_BRIGHTNESS = 0xDD, /* Brightness for effects (0-100) */ HYPERX_REG_APPLY = 0xE1, /* Apply changes register */ - HYPERX_REG_MODE1 = 0xE3, /* Mode control register 1 */ - HYPERX_REG_MODE2 = 0xE4, /* Mode control register 2 */ - HYPERX_REG_MODE3 = 0xE5, /* Mode control register 3 */ + HYPERX_REG_MODE_RANDOM = 0xE3, /* Mode control register, random colors */ + HYPERX_REG_MODE_CUSTOM = 0xE4, /* Mode control register, custom colors */ + HYPERX_REG_MODE_INDEPENDENT = 0xE5, /* Mode control register, independent */ HYPERX_REG_EFFECT_RED = 0xEC, /* Red color register for effects */ HYPERX_REG_EFFECT_GREEN = 0xED, /* Green color register for effects */ HYPERX_REG_EFFECT_BLUE = 0xEE, /* Blue color register for effects */ @@ -165,7 +165,7 @@ public: unsigned int GetLEDCount(); unsigned int GetSlotCount(); unsigned int GetMode(); - void SetMode(unsigned char new_mode); + void SetMode(unsigned char new_mode, bool random); void SetAllColors(unsigned char red, unsigned char green, unsigned char blue); void SetEffectColor(unsigned char red, unsigned char green, unsigned char blue); diff --git a/RGBController/RGBController_HyperX.cpp b/RGBController/RGBController_HyperX.cpp index 2d744fab..cdfe6bd5 100644 --- a/RGBController/RGBController_HyperX.cpp +++ b/RGBController/RGBController_HyperX.cpp @@ -16,12 +16,12 @@ int RGBController_HyperX::GetMode() void RGBController_HyperX::SetMode(int mode) { - hyperx->SetMode(modes[mode].value); + hyperx->SetMode(modes[mode].value, modes[mode].random); } void RGBController_HyperX::SetCustomMode() { - hyperx->SetMode(HYPERX_MODE_DIRECT); + hyperx->SetMode(HYPERX_MODE_DIRECT, false); } void RGBController_HyperX::UpdateLEDs() @@ -124,15 +124,17 @@ RGBController_HyperX::RGBController_HyperX(HyperXController* hyperx_ptr) modes.push_back(Rainbow); mode Comet; - Comet.name = "Comet"; - Comet.value = HYPERX_MODE_COMET; - Comet.flags = MODE_FLAG_HAS_COLOR; + Comet.name = "Comet"; + Comet.value = HYPERX_MODE_COMET; + Comet.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Comet.random = false; modes.push_back(Comet); mode Heartbeat; - Heartbeat.name = "Heartbeat"; - Heartbeat.value = HYPERX_MODE_HEARTBEAT; - Heartbeat.flags = MODE_FLAG_HAS_COLOR; + Heartbeat.name = "Heartbeat"; + Heartbeat.value = HYPERX_MODE_HEARTBEAT; + Heartbeat.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Heartbeat.random = false; modes.push_back(Heartbeat); mode SpectrumCycle; @@ -142,21 +144,24 @@ RGBController_HyperX::RGBController_HyperX(HyperXController* hyperx_ptr) modes.push_back(SpectrumCycle); mode Breathing; - Breathing.name = "Breathing"; - Breathing.value = HYPERX_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_COLOR; + Breathing.name = "Breathing"; + Breathing.value = HYPERX_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Breathing.random = false; modes.push_back(Breathing); mode Bounce; - Bounce.name = "Bounce"; - Bounce.value = HYPERX_MODE_BOUNCE; - Bounce.flags = MODE_FLAG_HAS_COLOR; + Bounce.name = "Bounce"; + Bounce.value = HYPERX_MODE_BOUNCE; + Bounce.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Bounce.random = false; modes.push_back(Bounce); mode Blink; - Blink.name = "Blink"; - Blink.value = HYPERX_MODE_BLINK; - Blink.flags = MODE_FLAG_HAS_COLOR; + Blink.name = "Blink"; + Blink.value = HYPERX_MODE_BLINK; + Blink.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Blink.random = false; modes.push_back(Blink); colors.resize(hyperx->GetLEDCount());