diff --git a/Controllers/PolychromeController/PolychromeController.cpp b/Controllers/PolychromeController/PolychromeController.cpp index 4a8ac685..f4ded808 100644 --- a/Controllers/PolychromeController/PolychromeController.cpp +++ b/Controllers/PolychromeController/PolychromeController.cpp @@ -86,17 +86,71 @@ bool PolychromeController::IsAsrLed() return(asr_led); } -void PolychromeController::SetColor(unsigned char red, unsigned char green, unsigned char blue) +void PolychromeController::SetColorsAndSpeed(unsigned char red, unsigned char green, unsigned char blue, unsigned char speed) { - unsigned char colors[3] = { red, green, blue }; + unsigned char color_speed_pkt[4] = { red, green, blue, speed }; if (asr_led) { - bus->i2c_smbus_write_block_data(dev, active_mode, 3, colors); + switch(active_mode) + { + /*-----------------------------------------------------*\ + | These modes take 4 bytes in R/G/B/S order | + \*-----------------------------------------------------*/ + case ASRLED_MODE_BREATHING: + case ASRLED_MODE_FLASHING: + case ASRLED_MODE_SPECTRUM_CYCLE: + bus->i2c_smbus_write_block_data(dev, active_mode, 4, color_speed_pkt); + break; + + /*-----------------------------------------------------*\ + | These modes take 3 bytes in R/G/B order | + \*-----------------------------------------------------*/ + default: + case ASRLED_MODE_STATIC: + case ASRLED_MODE_MUSIC: + bus->i2c_smbus_write_block_data(dev, active_mode, 3, color_speed_pkt); + break; + + /*-----------------------------------------------------*\ + | These modes take 1 byte - speed | + \*-----------------------------------------------------*/ + case ASRLED_MODE_RANDOM: + case ASRLED_MODE_WAVE: + bus->i2c_smbus_write_block_data(dev, active_mode, 1, &speed); + break; + + /*-----------------------------------------------------*\ + | These modes take no bytes | + \*-----------------------------------------------------*/ + case ASRLED_MODE_OFF: + break; + } } else { - bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_COLOR, 3, colors); + /*-----------------------------------------------------*\ + | Polychrome firmware always writes color to fixed reg | + \*-----------------------------------------------------*/ + bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_COLOR, 3, color_speed_pkt); + + switch(active_mode) + { + /*-----------------------------------------------------*\ + | These modes don't take a speed | + \*-----------------------------------------------------*/ + POLYCHROME_MODE_OFF: + POLYCHROME_MODE_STATIC: + break; + + /*-----------------------------------------------------*\ + | All other modes, write speed to active mode register | + \*-----------------------------------------------------*/ + default: + bus->i2c_smbus_write_block_data(dev, active_mode, 1, &speed); + break; + } + } } @@ -112,4 +166,4 @@ void PolychromeController::SetMode(unsigned char mode) { bus->i2c_smbus_write_block_data(dev, POLYCHROME_REG_MODE, 1, &active_mode); } -} +} \ No newline at end of file diff --git a/Controllers/PolychromeController/PolychromeController.h b/Controllers/PolychromeController/PolychromeController.h index c6d0bf0b..05a13b0d 100644 --- a/Controllers/PolychromeController/PolychromeController.h +++ b/Controllers/PolychromeController/PolychromeController.h @@ -34,6 +34,13 @@ enum ASRLED_MODE_WAVE = 0x18, /* Wave effect mode */ }; +enum +{ + ASRLED_SPEED_MIN = 0x00, /* Slowest speed */ + ASRLED_SPEED_DEFAULT = 0x7F, /* Default speed */ + ASRLED_SPEED_MAX = 0xFF, /* Fastest speed */ +}; + enum { POLYCHROME_REG_FIRMWARE_VER = 0x00, /* Firmware version Major.Minor */ @@ -61,6 +68,13 @@ enum POLYCHROME_MODE_RAINBOW = 0x1E, /* Rainbow effect mode */ }; +enum +{ + POLYCHROME_SPEED_MIN = 0x00, /* Slowest speed */ + POLYCHROME_SPEED_DEFAULT = 0x7F, /* Default speed */ + POLYCHROME_SPEED_MAX = 0xFF, /* Fastest speed */ +}; + class PolychromeController { public: @@ -71,7 +85,7 @@ public: unsigned int GetLEDCount(); unsigned int GetMode(); bool IsAsrLed(); - void SetColor(unsigned char red, unsigned char green, unsigned char blue); + void SetColorsAndSpeed(unsigned char red, unsigned char green, unsigned char blue, unsigned char speed); void SetMode(unsigned char mode); unsigned short GetFirmwareVersion(); diff --git a/RGBController/RGBController_Polychrome.cpp b/RGBController/RGBController_Polychrome.cpp index 19ebdd1d..1a2fe807 100644 --- a/RGBController/RGBController_Polychrome.cpp +++ b/RGBController/RGBController_Polychrome.cpp @@ -42,6 +42,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Breathing.name = "Breathing"; Breathing.value = ASRLED_MODE_BREATHING; Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Breathing.speed_min = ASRLED_SPEED_MIN; + Breathing.speed_max = ASRLED_SPEED_MAX; + Breathing.speed = ASRLED_SPEED_DEFAULT; Breathing.color_mode = MODE_COLORS_PER_LED; modes.push_back(Breathing); @@ -49,6 +52,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Strobe.name = "Strobe"; Strobe.value = ASRLED_MODE_FLASHING; Strobe.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Strobe.speed_min = ASRLED_SPEED_MIN; + Strobe.speed_max = ASRLED_SPEED_MAX; + Strobe.speed = ASRLED_SPEED_DEFAULT; Strobe.color_mode = MODE_COLORS_PER_LED; modes.push_back(Strobe); @@ -56,6 +62,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr SpectrumCycle.name = "Spectrum Cycle"; SpectrumCycle.value = ASRLED_MODE_SPECTRUM_CYCLE; SpectrumCycle.flags = MODE_FLAG_HAS_SPEED; + SpectrumCycle.speed_min = ASRLED_SPEED_MIN; + SpectrumCycle.speed_max = ASRLED_SPEED_MAX; + SpectrumCycle.speed = ASRLED_SPEED_DEFAULT; SpectrumCycle.color_mode = MODE_COLORS_NONE; modes.push_back(SpectrumCycle); @@ -63,6 +72,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Random.name = "Random"; Random.value = ASRLED_MODE_RANDOM; Random.flags = MODE_FLAG_HAS_SPEED; + Random.speed_min = ASRLED_SPEED_MIN; + Random.speed_max = ASRLED_SPEED_MAX; + Random.speed = ASRLED_SPEED_DEFAULT; Random.color_mode = MODE_COLORS_NONE; modes.push_back(Random); @@ -77,6 +89,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Wave.name = "Wave"; Wave.value = ASRLED_MODE_WAVE; Wave.flags = MODE_FLAG_HAS_SPEED; + Wave.speed_min = ASRLED_SPEED_MIN; + Wave.speed_max = ASRLED_SPEED_MAX; + Wave.speed = ASRLED_SPEED_DEFAULT; Wave.color_mode = MODE_COLORS_NONE; modes.push_back(Wave); } @@ -100,6 +115,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Breathing.name = "Breathing"; Breathing.value = POLYCHROME_MODE_BREATHING; Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Breathing.speed_min = POLYCHROME_SPEED_MIN; + Breathing.speed_max = POLYCHROME_SPEED_MAX; + Breathing.speed = POLYCHROME_SPEED_DEFAULT; Breathing.color_mode = MODE_COLORS_PER_LED; modes.push_back(Breathing); @@ -107,6 +125,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Strobe.name = "Strobe"; Strobe.value = POLYCHROME_MODE_FLASHING; Strobe.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Strobe.speed_min = POLYCHROME_SPEED_MIN; + Strobe.speed_max = POLYCHROME_SPEED_MAX; + Strobe.speed = POLYCHROME_SPEED_DEFAULT; Strobe.color_mode = MODE_COLORS_PER_LED; modes.push_back(Strobe); @@ -114,6 +135,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr SpectrumCycle.name = "Spectrum Cycle"; SpectrumCycle.value = POLYCHROME_MODE_SPECTRUM_CYCLE; SpectrumCycle.flags = MODE_FLAG_HAS_SPEED; + SpectrumCycle.speed_min = POLYCHROME_SPEED_MIN; + SpectrumCycle.speed_max = POLYCHROME_SPEED_MAX; + SpectrumCycle.speed = POLYCHROME_SPEED_DEFAULT; SpectrumCycle.color_mode = MODE_COLORS_NONE; modes.push_back(SpectrumCycle); @@ -121,6 +145,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Random.name = "Random"; Random.value = POLYCHROME_MODE_RANDOM; Random.flags = MODE_FLAG_HAS_SPEED; + Random.speed_min = POLYCHROME_SPEED_MIN; + Random.speed_max = POLYCHROME_SPEED_MAX; + Random.speed = POLYCHROME_SPEED_DEFAULT; Random.color_mode = MODE_COLORS_NONE; modes.push_back(Random); @@ -128,6 +155,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Wave.name = "Wave"; Wave.value = POLYCHROME_MODE_WAVE; Wave.flags = MODE_FLAG_HAS_SPEED; + Wave.speed_min = POLYCHROME_SPEED_MIN; + Wave.speed_max = POLYCHROME_SPEED_MAX; + Wave.speed = POLYCHROME_SPEED_DEFAULT; Wave.color_mode = MODE_COLORS_NONE; modes.push_back(Wave); @@ -135,6 +165,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Spring.name = "Spring"; Spring.value = POLYCHROME_MODE_SPRING; Spring.flags = MODE_FLAG_HAS_SPEED; + Spring.speed_min = POLYCHROME_SPEED_MIN; + Spring.speed_max = POLYCHROME_SPEED_MAX; + Spring.speed = POLYCHROME_SPEED_DEFAULT; Spring.color_mode = MODE_COLORS_NONE; modes.push_back(Spring); @@ -142,6 +175,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Stack.name = "Stack"; Stack.value = POLYCHROME_MODE_STACK; Stack.flags = MODE_FLAG_HAS_SPEED; + Stack.speed_min = POLYCHROME_SPEED_MIN; + Stack.speed_max = POLYCHROME_SPEED_MAX; + Stack.speed = POLYCHROME_SPEED_DEFAULT; Stack.color_mode = MODE_COLORS_NONE; modes.push_back(Stack); @@ -149,6 +185,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Cram.name = "Cram"; Cram.value = POLYCHROME_MODE_CRAM; Cram.flags = MODE_FLAG_HAS_SPEED; + Cram.speed_min = POLYCHROME_SPEED_MIN; + Cram.speed_max = POLYCHROME_SPEED_MAX; + Cram.speed = POLYCHROME_SPEED_DEFAULT; Cram.color_mode = MODE_COLORS_NONE; modes.push_back(Cram); @@ -156,6 +195,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Scan.name = "Scan"; Scan.value = POLYCHROME_MODE_SCAN; Scan.flags = MODE_FLAG_HAS_SPEED; + Scan.speed_min = POLYCHROME_SPEED_MIN; + Scan.speed_max = POLYCHROME_SPEED_MAX; + Scan.speed = POLYCHROME_SPEED_DEFAULT; Scan.color_mode = MODE_COLORS_NONE; modes.push_back(Scan); @@ -170,6 +212,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Water.name = "Water"; Water.value = POLYCHROME_MODE_WATER; Water.flags = MODE_FLAG_HAS_SPEED; + Water.speed_min = POLYCHROME_SPEED_MIN; + Water.speed_max = POLYCHROME_SPEED_MAX; + Water.speed = POLYCHROME_SPEED_DEFAULT; Water.color_mode = MODE_COLORS_NONE; modes.push_back(Water); @@ -177,6 +222,9 @@ RGBController_Polychrome::RGBController_Polychrome(PolychromeController* polychr Rainbow.name = "Rainbow"; Rainbow.value = POLYCHROME_MODE_RAINBOW; Rainbow.flags = MODE_FLAG_HAS_SPEED; + Rainbow.speed_min = POLYCHROME_SPEED_MIN; + Rainbow.speed_max = POLYCHROME_SPEED_MAX; + Rainbow.speed = POLYCHROME_SPEED_DEFAULT; Rainbow.color_mode = MODE_COLORS_NONE; modes.push_back(Rainbow); } @@ -245,7 +293,7 @@ void RGBController_Polychrome::DeviceUpdateLEDs() unsigned char grn = RGBGetGValue(colors[led]); unsigned char blu = RGBGetBValue(colors[led]); - polychrome->SetColor(red, grn, blu); + polychrome->SetColorsAndSpeed(red, grn, blu, modes[active_mode].speed); } } @@ -267,4 +315,6 @@ void RGBController_Polychrome::SetCustomMode() void RGBController_Polychrome::UpdateMode() { polychrome->SetMode(modes[active_mode].value); + + DeviceUpdateLEDs(); }