diff --git a/Controllers/RGBFusionController/RGBFusionController.cpp b/Controllers/RGBFusionController/RGBFusionController.cpp index b42c08ca7..b05f9b817 100644 --- a/Controllers/RGBFusionController/RGBFusionController.cpp +++ b/Controllers/RGBFusionController/RGBFusionController.cpp @@ -102,11 +102,13 @@ void RGBFusionController::SetLEDColor(unsigned int led, unsigned char red, unsig } } -void RGBFusionController::SetMode(unsigned char mode) +void RGBFusionController::SetMode(unsigned char mode, unsigned char speed) { switch_bank(0); set_mode_ch_0(mode); + set_timers_ch_0(speed_table[0][speed], speed_table[1][speed]); set_mode_ch_1(mode); + set_timers_ch_1(speed_table[0][speed], speed_table[1][speed]); } void RGBFusionController::dump() @@ -170,6 +172,22 @@ void RGBFusionController::set_mode_ch_1(unsigned char mode) bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_1_MODE, mode + RGB_FUSION_WRITE_MODE_OFST); } +void RGBFusionController::set_timers_ch_0(unsigned short timer0, unsigned short timer1) +{ + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_0_TIMER_0_MSB, timer0 << 8); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_0_TIMER_0_LSB, timer0 & 0xFF); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_0_TIMER_1_MSB, timer1 << 8); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_0_TIMER_1_LSB, timer1 & 0xFF); +} + +void RGBFusionController::set_timers_ch_1(unsigned short timer0, unsigned short timer1) +{ + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_1_TIMER_0_MSB, timer0 << 8); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_1_TIMER_0_LSB, timer0 & 0xFF); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_1_TIMER_1_MSB, timer1 << 8); + bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_0_REG_CH_1_TIMER_1_LSB, timer1 & 0xFF); +} + void RGBFusionController::switch_bank(unsigned char bank) { bus->i2c_smbus_write_byte_data(dev, RGB_FUSION_BANK_SWITCH_REG, bank); diff --git a/Controllers/RGBFusionController/RGBFusionController.h b/Controllers/RGBFusionController/RGBFusionController.h index d582c7837..675231ffe 100644 --- a/Controllers/RGBFusionController/RGBFusionController.h +++ b/Controllers/RGBFusionController/RGBFusionController.h @@ -17,7 +17,23 @@ typedef unsigned char rgb_fusion_dev_id; enum { RGB_FUSION_BANK_0_REG_CH_0_MODE = 0x03, /* Channel 0 Mode Selection */ + RGB_FUSION_BANK_0_REG_CH_0_TIMER_0_MSB + = 0x06, /* Channel 0 Timer 0 MSB */ + RGB_FUSION_BANK_0_REG_CH_0_TIMER_0_LSB + = 0x07, /* Channel 0 Timer 0 LSB */ + RGB_FUSION_BANK_0_REG_CH_0_TIMER_1_MSB + = 0x08, /* Channel 0 Timer 1 MSB */ + RGB_FUSION_BANK_0_REG_CH_0_TIMER_1_LSB + = 0x09, /* Channel 0 Timer 1 LSB */ RGB_FUSION_BANK_0_REG_CH_1_MODE = 0x13, /* Channel 1 Mode Selection */ + RGB_FUSION_BANK_0_REG_CH_1_TIMER_0_MSB + = 0x16, /* Channel 1 Timer 0 MSB */ + RGB_FUSION_BANK_0_REG_CH_1_TIMER_0_LSB + = 0x17, /* Channel 1 Timer 0 LSB */ + RGB_FUSION_BANK_0_REG_CH_1_TIMER_1_MSB + = 0x18, /* Channel 1 Timer 1 MSB */ + RGB_FUSION_BANK_0_REG_CH_1_TIMER_1_LSB + = 0x19, /* Channel 1 Timer 1 LSB */ RGB_FUSION_BANK_1_REG_CH_0_R = 0x00, /* Channel 0 Red Value */ RGB_FUSION_BANK_1_REG_CH_0_G = 0x01, /* Channel 0 Green Value */ RGB_FUSION_BANK_1_REG_CH_0_B = 0x02, /* Channel 0 Blue Value */ @@ -27,6 +43,19 @@ enum RGB_FUSION_BANK_SWITCH_REG = 0xF0, /* Bank Switch Register */ }; +enum +{ + RGB_FUSION_SPEED_SLOW = 0x00, /* Slowest speed */ + RGB_FUSION_SPEED_NORMAL = 0x01, /* Normal speed */ + RGB_FUSION_SPEED_FAST = 0x02, /* Fastest speed */ +}; + +static const short speed_table[2][3] = +{ + { 0x01E0, 0x00F0, 0x0078 }, + { 0x4000, 0x2000, 0x1000 } +}; + #define RGB_FUSION_NUMBER_MODES 3 /* Number of RGB Fusion modes */ #define RGB_FUSION_WRITE_MODE_OFST 0x10 /* offset to add when writing mode */ @@ -49,7 +78,7 @@ public: unsigned char GetMode(); 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 SetMode(unsigned char mode); + void SetMode(unsigned char mode, unsigned char speed); private: void dump(); @@ -61,6 +90,8 @@ private: void set_color_ch_1(unsigned char red, unsigned char green, unsigned char blue); void set_mode_ch_0(unsigned char mode); void set_mode_ch_1(unsigned char mode); + void set_timers_ch_0(unsigned short timer0, unsigned short timer1); + void set_timers_ch_1(unsigned short timer0, unsigned short timer1); void switch_bank(unsigned char bank); char device_name[32]; diff --git a/RGBController/RGBController_RGBFusion.cpp b/RGBController/RGBController_RGBFusion.cpp index 4f6bffc2a..952829352 100644 --- a/RGBController/RGBController_RGBFusion.cpp +++ b/RGBController/RGBController_RGBFusion.cpp @@ -26,12 +26,12 @@ int RGBController_RGBFusion::GetMode() void RGBController_RGBFusion::SetMode(int mode) { - rgb_fusion->SetMode(modes[mode].value); + rgb_fusion->SetMode(modes[mode].value, modes[mode].speed); } void RGBController_RGBFusion::SetCustomMode() { - rgb_fusion->SetMode(RGB_FUSION_MODE_STATIC); + rgb_fusion->SetMode(RGB_FUSION_MODE_STATIC, 0); } void RGBController_RGBFusion::UpdateLEDs() @@ -85,15 +85,21 @@ RGBController_RGBFusion::RGBController_RGBFusion(RGBFusionController* rgb_fusion modes.push_back(Static); mode Breathing; - Breathing.name = "Breathing"; - Breathing.value = RGB_FUSION_MODE_BREATHING; - Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR; + Breathing.name = "Breathing"; + Breathing.value = RGB_FUSION_MODE_BREATHING; + Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR; + Breathing.speed_min = RGB_FUSION_SPEED_SLOW; + Breathing.speed_max = RGB_FUSION_SPEED_FAST; + Breathing.speed = RGB_FUSION_SPEED_NORMAL; modes.push_back(Breathing); mode Flashing; - Flashing.name = "Flashing"; - Flashing.value = RGB_FUSION_MODE_FLASHING; - Flashing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR; + Flashing.name = "Flashing"; + Flashing.value = RGB_FUSION_MODE_FLASHING; + Flashing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR; + Flashing.speed_min = RGB_FUSION_SPEED_SLOW; + Flashing.speed_max = RGB_FUSION_SPEED_FAST; + Flashing.speed = RGB_FUSION_SPEED_NORMAL; modes.push_back(Flashing); colors.resize(rgb_fusion->GetLEDCount());