Add speed control to Polychrome controller

This commit is contained in:
Adam Honse
2020-07-06 02:03:47 -05:00
parent 5f9c4f8432
commit 7276f5e1d5
3 changed files with 125 additions and 7 deletions

View File

@@ -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);
}
}
}

View File

@@ -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();

View File

@@ -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();
}