diff --git a/Controllers/HyperXController/HyperXController.cpp b/Controllers/HyperXController/HyperXController.cpp index 1f71ac08..ef07f084 100644 --- a/Controllers/HyperXController/HyperXController.cpp +++ b/Controllers/HyperXController/HyperXController.cpp @@ -194,9 +194,10 @@ 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, bool random) +void HyperXController::SetMode(unsigned char new_mode, bool random, unsigned short new_speed) { - mode = new_mode; + mode = new_mode; + speed = new_speed; bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_APPLY, 0x01); @@ -228,30 +229,56 @@ void HyperXController::SetMode(unsigned char new_mode, bool random) case HYPERX_MODE_RAINBOW: bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_RANDOM, HYPERX_MODE1_RAINBOW); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_LSB, speed & 0xFF); break; case HYPERX_MODE_COMET: bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_COMET); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_LSB, speed & 0xFF); break; case HYPERX_MODE_HEARTBEAT: bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_HEARTBEAT); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_DELAY_TIME_MSB, 0x03); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_DELAY_TIME_LSB, 0xE8); break; case HYPERX_MODE_CYCLE: bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_MODE_RANDOM, HYPERX_MODE1_CYCLE); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_CHANGE_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_CHANGE_TIME_LSB, speed & 0xFF); break; case HYPERX_MODE_BREATHING: bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BREATHING); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_FADE_IN_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_FADE_IN_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_FADE_OUT_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_FADE_OUT_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_MSB, 0x00); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_LSB, 0x00); break; case HYPERX_MODE_BOUNCE: - bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BOUNCE); + bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BOUNCE); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_TIMER_LSB, speed & 0xFF); break; case HYPERX_MODE_BLINK: bus->i2c_smbus_write_byte_data(dev, mode_reg, HYPERX_MODE2_BLINK); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_MSB, speed >> 8); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_OFF_TIME_LSB, speed & 0xFF); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_MSB, 0x07); + bus->i2c_smbus_write_byte_data(dev, HYPERX_REG_ON_TIME_LSB, 0xD4); break; } diff --git a/Controllers/HyperXController/HyperXController.h b/Controllers/HyperXController/HyperXController.h index 748ba404..30d8e3b5 100644 --- a/Controllers/HyperXController/HyperXController.h +++ b/Controllers/HyperXController/HyperXController.h @@ -101,11 +101,25 @@ enum HYPERX_REG_SLOT3_LED3_BRIGHTNESS = 0xBA, /* Brightness for LED 3, Slot 3 (0-100) */ HYPERX_REG_SLOT3_LED4_BRIGHTNESS = 0xBD, /* Brightness for LED 4, Slot 3 (0-100) */ + HYPERX_REG_TIMER_MSB = 0xD1, /* Timer MSB */ + HYPERX_REG_TIMER_LSB = 0xD2, /* Timer LSB */ + HYPERX_REG_ON_TIME_MSB = 0xD3, /* Effect on time MSB */ + HYPERX_REG_ON_TIME_LSB = 0xD4, /* Effect on time LSB */ + HYPERX_REG_CHANGE_TIME_MSB = 0xD5, /* Change time MSB */ + HYPERX_REG_CHANGE_TIME_LSB = 0xD6, /* Change time LSB */ + HYPERX_REG_FADE_IN_TIME_MSB = 0xD7, /* Fade in time MSB */ + HYPERX_REG_FADE_IN_TIME_LSB = 0xD8, /* Fade in time LSB */ + HYPERX_REG_FADE_OUT_TIME_MSB = 0xD9, /* Fade out time MSB */ + HYPERX_REG_FADE_OUT_TIME_LSB = 0xDA, /* Fade out time LSB */ + HYPERX_REG_OFF_TIME_MSB = 0xDB, /* Effect off time MSB */ + HYPERX_REG_OFF_TIME_LSB = 0xDC, /* Effect off time LSB */ HYPERX_REG_EFFECT_BRIGHTNESS = 0xDD, /* Brightness for effects (0-100) */ HYPERX_REG_APPLY = 0xE1, /* Apply changes register */ 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_DELAY_TIME_MSB = 0xEA, /* Delay time MSB */ + HYPERX_REG_DELAY_TIME_LSB = 0xEB, /* Delay time LSB */ 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 */ @@ -146,6 +160,31 @@ enum HYPERX_NUMBER_MODES /* Number of HyperX modes */ }; +enum +{ + HYPERX_SPEED_BOUNCE_SLOW = 0x07D0, /* Slowest speed for bounce mode */ + HYPERX_SPEED_BOUNCE_NORMAL = 0x07D0, /* Normal speed for bounce mode */ + HYPERX_SPEED_BOUNCE_FAST = 0x0064, /* Fastest speed for bounce mode */ + HYPERX_SPEED_BREATHING_SLOW = 0x07D0, /* Slowest speed for breathing mode */ + HYPERX_SPEED_BREATHING_NORMAL = 0x07D0, /* Normal speed for breathing mode */ + HYPERX_SPEED_BREATHING_FAST = 0x0064, /* Fastest speed for breathing mode */ + HYPERX_SPEED_CYCLE_SLOW = 0x05DC, /* Slowest speed for cycle mode */ + HYPERX_SPEED_CYCLE_NORMAL = 0x05DC, /* Normal speed for cycle mode */ + HYPERX_SPEED_CYCLE_FAST = 0x00FA, /* Fastest speed for cycle mode */ + HYPERX_SPEED_RAINBOW_SLOW = 0x07D0, /* Slowest speed for rainbow mode */ + HYPERX_SPEED_RAINBOW_NORMAL = 0x07D0, /* Normal speed for rainbow mode */ + HYPERX_SPEED_RAINBOW_FAST = 0x0064, /* Fastest speed for rainbow mode */ + HYPERX_SPEED_BLINK_SLOW = 0x07D0, /* Slowest speed for blink mode */ + HYPERX_SPEED_BLINK_NORMAL = 0x07D0, /* Normal speed for blink mode */ + HYPERX_SPEED_BLINK_FAST = 0x01F4, /* Fastest speed for blink mode */ + HYPERX_SPEED_HEARTBEAT_SLOW = 0x07D0, /* Slowest speed for heartbeat mode */ + HYPERX_SPEED_HEARTBEAT_NORMAL = 0x07D0, /* Normal speed for heartbeat mode */ + HYPERX_SPEED_HEARTBEAT_FAST = 0x01F4, /* Fastest speed for heartbeat mode */ + HYPERX_SPEED_COMET_SLOW = 0x07D0, /* Slowest speed for comet mode */ + HYPERX_SPEED_COMET_NORMAL = 0x07D0, /* Normal speed for comet mode */ + HYPERX_SPEED_COMET_FAST = 0x0064, /* Fastest speed for comet mode */ +}; + static const unsigned char slot_base[4] = { HYPERX_REG_SLOT0_LED0_RED, /* SPD 0x50 maps to slot 0 */ @@ -165,7 +204,7 @@ public: unsigned int GetLEDCount(); unsigned int GetSlotCount(); unsigned int GetMode(); - void SetMode(unsigned char new_mode, bool random); + void SetMode(unsigned char new_mode, bool random, unsigned short new_speed); void SetAllColors(unsigned char red, unsigned char green, unsigned char blue); void SetEffectColor(unsigned char red, unsigned char green, unsigned char blue); @@ -179,4 +218,5 @@ private: i2c_smbus_interface* bus; hyperx_dev_id dev; unsigned int mode; + unsigned short speed; }; diff --git a/RGBController/RGBController_HyperX.cpp b/RGBController/RGBController_HyperX.cpp index cdfe6bd5..1b490549 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, modes[mode].random); + hyperx->SetMode(modes[mode].value, modes[mode].random, modes[mode].speed); } void RGBController_HyperX::SetCustomMode() { - hyperx->SetMode(HYPERX_MODE_DIRECT, false); + hyperx->SetMode(HYPERX_MODE_DIRECT, false, 0x00); } void RGBController_HyperX::UpdateLEDs() @@ -118,50 +118,71 @@ RGBController_HyperX::RGBController_HyperX(HyperXController* hyperx_ptr) modes.push_back(Static); mode Rainbow; - Rainbow.name = "Rainbow"; - Rainbow.value = HYPERX_MODE_RAINBOW; - Rainbow.flags = 0; + Rainbow.name = "Rainbow"; + Rainbow.value = HYPERX_MODE_RAINBOW; + Rainbow.flags = MODE_FLAG_HAS_SPEED; + Rainbow.speed_min = HYPERX_SPEED_RAINBOW_SLOW; + Rainbow.speed_max = HYPERX_SPEED_RAINBOW_FAST; + Rainbow.speed = HYPERX_SPEED_RAINBOW_NORMAL; modes.push_back(Rainbow); mode Comet; - Comet.name = "Comet"; - Comet.value = HYPERX_MODE_COMET; - Comet.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; - Comet.random = false; + Comet.name = "Comet"; + Comet.value = HYPERX_MODE_COMET; + Comet.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Comet.speed_min = HYPERX_SPEED_COMET_SLOW; + Comet.speed_max = HYPERX_SPEED_COMET_FAST; + Comet.random = false; + Comet.speed = HYPERX_SPEED_COMET_NORMAL; modes.push_back(Comet); mode Heartbeat; - Heartbeat.name = "Heartbeat"; - Heartbeat.value = HYPERX_MODE_HEARTBEAT; - Heartbeat.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; - Heartbeat.random = false; + Heartbeat.name = "Heartbeat"; + Heartbeat.value = HYPERX_MODE_HEARTBEAT; + Heartbeat.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Heartbeat.speed_min = HYPERX_SPEED_COMET_SLOW; + Heartbeat.speed_max = HYPERX_SPEED_COMET_FAST; + Heartbeat.random = false; + Heartbeat.speed = HYPERX_SPEED_COMET_NORMAL; modes.push_back(Heartbeat); mode SpectrumCycle; - SpectrumCycle.name = "Spectrum Cycle"; - SpectrumCycle.value = HYPERX_MODE_CYCLE; - SpectrumCycle.flags = 0; + SpectrumCycle.name = "Spectrum Cycle"; + SpectrumCycle.value = HYPERX_MODE_CYCLE; + SpectrumCycle.flags = MODE_FLAG_HAS_SPEED; + SpectrumCycle.speed_min = HYPERX_SPEED_CYCLE_SLOW; + SpectrumCycle.speed_max = HYPERX_SPEED_CYCLE_FAST; + SpectrumCycle.speed = HYPERX_SPEED_CYCLE_NORMAL; modes.push_back(SpectrumCycle); mode Breathing; - Breathing.name = "Breathing"; - Breathing.value = HYPERX_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; - Breathing.random = false; + Breathing.name = "Breathing"; + Breathing.value = HYPERX_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Breathing.speed_min = HYPERX_SPEED_BREATHING_SLOW; + Breathing.speed_max = HYPERX_SPEED_BREATHING_FAST; + Breathing.random = false; + Breathing.speed = HYPERX_SPEED_BREATHING_NORMAL; modes.push_back(Breathing); mode Bounce; - Bounce.name = "Bounce"; - Bounce.value = HYPERX_MODE_BOUNCE; - Bounce.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; - Bounce.random = false; + Bounce.name = "Bounce"; + Bounce.value = HYPERX_MODE_BOUNCE; + Bounce.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Bounce.speed_min = HYPERX_SPEED_BOUNCE_SLOW; + Bounce.speed_max = HYPERX_SPEED_BOUNCE_FAST; + Bounce.random = false; + Bounce.speed = HYPERX_SPEED_BOUNCE_NORMAL; modes.push_back(Bounce); mode Blink; - Blink.name = "Blink"; - Blink.value = HYPERX_MODE_BLINK; - Blink.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; - Blink.random = false; + Blink.name = "Blink"; + Blink.value = HYPERX_MODE_BLINK; + Blink.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR; + Blink.speed_min = HYPERX_SPEED_BLINK_SLOW; + Blink.speed_max = HYPERX_SPEED_BLINK_FAST; + Blink.random = false; + Blink.speed = HYPERX_SPEED_BLINK_NORMAL; modes.push_back(Blink); colors.resize(hyperx->GetLEDCount());