diff --git a/Controllers/PatriotViperController/PatriotViperController.cpp b/Controllers/PatriotViperController/PatriotViperController.cpp
index 36c0ff08..e4b5717c 100644
--- a/Controllers/PatriotViperController/PatriotViperController.cpp
+++ b/Controllers/PatriotViperController/PatriotViperController.cpp
@@ -85,7 +85,7 @@ void PatriotViperController::SetEffectColor(unsigned char red, unsigned char gre
ViperRegisterWrite(VIPER_REG_LED3_EFFECT_COLOR, red, blue, green);
ViperRegisterWrite(VIPER_REG_LED4_EFFECT_COLOR, red, blue, green);
- ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, 0x0C);
+ ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, speed);
ViperRegisterWrite(VIPER_REG_MODE, 0xAA, 0x00, 0x00);
ViperRegisterWrite(VIPER_REG_MODE, 0xFA, 0x00, 0x00);
}
@@ -121,7 +121,7 @@ void PatriotViperController::SetLEDEffectColor(unsigned int led, unsigned char r
ViperRegisterWrite(VIPER_REG_LED0_EFFECT_COLOR + led, red, blue, green);
- ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, 0x0C);
+ ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, speed);
ViperRegisterWrite(VIPER_REG_MODE, 0xAA, 0x00, 0x00);
ViperRegisterWrite(VIPER_REG_MODE, 0xFA, 0x00, 0x00);
}
@@ -143,19 +143,20 @@ void PatriotViperController::SetLEDEffectColor(unsigned int slot, unsigned int l
ViperRegisterWrite(VIPER_REG_LED0_EFFECT_COLOR + led, red, blue, green);
- ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, 0x0C);
+ ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, speed);
ViperRegisterWrite(VIPER_REG_MODE, 0xAA, 0x00, 0x00);
ViperRegisterWrite(VIPER_REG_MODE, 0xFA, 0x00, 0x00);
}
-void PatriotViperController::SetMode(unsigned char new_mode)
+void PatriotViperController::SetMode(unsigned char new_mode, unsigned char new_speed)
{
direct = false;
- mode = new_mode;
+ mode = new_mode;
+ speed = new_speed;
ViperRegisterWrite(VIPER_REG_START, 0xFF, 0xFF, 0xFF);
ViperRegisterWrite(VIPER_REG_STATIC, 0x04, 0x00, 0x00);
- ViperRegisterWrite(VIPER_REG_MODE, new_mode, 0x00, 0x0C);
+ ViperRegisterWrite(VIPER_REG_MODE, mode, 0x00, speed);
ViperRegisterWrite(VIPER_REG_MODE, 0xAA, 0x00, 0x00);
ViperRegisterWrite(VIPER_REG_MODE, 0xFA, 0x00, 0x00);
}
diff --git a/Controllers/PatriotViperController/PatriotViperController.h b/Controllers/PatriotViperController/PatriotViperController.h
index 629503dc..bcbcd860 100644
--- a/Controllers/PatriotViperController/PatriotViperController.h
+++ b/Controllers/PatriotViperController/PatriotViperController.h
@@ -56,7 +56,7 @@ public:
unsigned int GetLEDCount();
unsigned int GetSlotCount();
unsigned int GetMode();
- void SetMode(unsigned char new_mode);
+ void SetMode(unsigned char new_mode, unsigned char new_speed);
void SetDirect();
void SetAllColors(unsigned char red, unsigned char green, unsigned char blue);
@@ -75,5 +75,6 @@ private:
unsigned char slots_valid;
i2c_smbus_interface* bus;
viper_dev_id dev;
- unsigned int mode;
+ unsigned char mode;
+ unsigned char speed;
};
diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h
index c97a69a0..fd5cc2c6 100644
--- a/RGBController/RGBController.h
+++ b/RGBController/RGBController.h
@@ -46,7 +46,9 @@ typedef struct
std::string name; /* Mode name */
int value; /* Device-specific mode value */
unsigned int flags; /* Mode flags bitfield */
-
+ unsigned int speed_min; /* speed minimum value */
+ unsigned int speed_max; /* speed maximum value */
+
/*--------------------------------------------------------------*\
| Mode Settings |
\*--------------------------------------------------------------*/
diff --git a/RGBController/RGBController_CorsairPro.cpp b/RGBController/RGBController_CorsairPro.cpp
index 586f608f..8ebca1d6 100644
--- a/RGBController/RGBController_CorsairPro.cpp
+++ b/RGBController/RGBController_CorsairPro.cpp
@@ -19,7 +19,7 @@ void RGBController_CorsairPro::SetMode(int mode)
active_mode = mode;
corsair->SetEffect(modes[active_mode].value,
- CORSAIR_PRO_SPEED_MEDIUM,
+ modes[active_mode].speed,
CORSAIR_PRO_DIRECTION_UP,
modes[active_mode].random,
RGBGetRValue(colors[0]),
@@ -76,70 +76,103 @@ RGBController_CorsairPro::RGBController_CorsairPro(CorsairProController* corsair
type = DEVICE_TYPE_DRAM;
mode ColorShift;
- ColorShift.name = "Color Shift";
- ColorShift.value = CORSAIR_PRO_MODE_COLOR_SHIFT;
- ColorShift.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- ColorShift.random = false;
+ ColorShift.name = "Color Shift";
+ ColorShift.value = CORSAIR_PRO_MODE_COLOR_SHIFT;
+ ColorShift.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ ColorShift.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ ColorShift.speed_max = CORSAIR_PRO_SPEED_FAST;
+ ColorShift.random = false;
+ ColorShift.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(ColorShift);
mode ColorPulse;
- ColorPulse.name = "Color Pulse";
- ColorPulse.value = CORSAIR_PRO_MODE_COLOR_PULSE;
- ColorPulse.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- ColorPulse.random = false;
+ ColorPulse.name = "Color Pulse";
+ ColorPulse.value = CORSAIR_PRO_MODE_COLOR_PULSE;
+ ColorPulse.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ ColorPulse.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ ColorPulse.speed_max = CORSAIR_PRO_SPEED_FAST;
+ ColorPulse.random = false;
+ ColorPulse.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(ColorPulse);
mode RainbowWave;
- RainbowWave.name = "Rainbow Wave";
- RainbowWave.value = CORSAIR_PRO_MODE_RAINBOW_WAVE;
- RainbowWave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
- RainbowWave.random = false;
+ RainbowWave.name = "Rainbow Wave";
+ RainbowWave.value = CORSAIR_PRO_MODE_RAINBOW_WAVE;
+ RainbowWave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
+ RainbowWave.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ RainbowWave.speed_max = CORSAIR_PRO_SPEED_FAST;
+ RainbowWave.random = false;
+ RainbowWave.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(RainbowWave);
mode ColorWave;
- ColorWave.name = "Color Wave";
- ColorWave.value = CORSAIR_PRO_MODE_COLOR_WAVE;
- ColorWave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- ColorWave.random = false;
+ ColorWave.name = "Color Wave";
+ ColorWave.value = CORSAIR_PRO_MODE_COLOR_WAVE;
+ ColorWave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ ColorWave.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ ColorWave.speed_max = CORSAIR_PRO_SPEED_FAST;
+ ColorWave.random = false;
+ ColorWave.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(ColorWave);
mode Visor;
- Visor.name = "Visor";
- Visor.value = CORSAIR_PRO_MODE_VISOR;
- Visor.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- Visor.random = false;
+ Visor.name = "Visor";
+ Visor.value = CORSAIR_PRO_MODE_VISOR;
+ Visor.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ Visor.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ Visor.speed_max = CORSAIR_PRO_SPEED_FAST;
+ Visor.random = false;
+ Visor.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(Visor);
mode Rain;
- Rain.name = "Rain";
- Rain.value = CORSAIR_PRO_MODE_RAIN;
- Rain.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- Rain.random = false;
+ Rain.name = "Rain";
+ Rain.value = CORSAIR_PRO_MODE_RAIN;
+ Rain.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ Rain.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ Rain.speed_max = CORSAIR_PRO_SPEED_FAST;
+ Rain.random = false;
+ Rain.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(Rain);
mode Marquee;
- Marquee.name = "Marquee";
- Marquee.value = CORSAIR_PRO_MODE_MARQUEE;
- Marquee.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR;
+ Marquee.name = "Marquee";
+ Marquee.value = CORSAIR_PRO_MODE_MARQUEE;
+ Marquee.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR;
+ Marquee.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ Marquee.speed_max = CORSAIR_PRO_SPEED_FAST;
+ Marquee.random = false;
+ Marquee.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(Marquee);
mode Rainbow;
- Rainbow.name = "Rainbow";
- Rainbow.value = CORSAIR_PRO_MODE_RAINBOW;
- Rainbow.flags = MODE_FLAG_HAS_SPEED;
+ Rainbow.name = "Rainbow";
+ Rainbow.value = CORSAIR_PRO_MODE_RAINBOW;
+ Rainbow.flags = MODE_FLAG_HAS_SPEED;
+ Rainbow.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ Rainbow.speed_max = CORSAIR_PRO_SPEED_FAST;
+ Rainbow.random = false;
+ Rainbow.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(Rainbow);
mode Sequential;
- Sequential.name = "Sequential";
- Sequential.value = CORSAIR_PRO_MODE_SEQUENTIAL;
- Sequential.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
- Sequential.random = false;
+ Sequential.name = "Sequential";
+ Sequential.value = CORSAIR_PRO_MODE_SEQUENTIAL;
+ Sequential.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_HAS_COLOR | MODE_FLAG_RANDOM_COLOR;
+ Sequential.speed_min = CORSAIR_PRO_SPEED_SLOW;
+ Sequential.speed_max = CORSAIR_PRO_SPEED_FAST;
+ Sequential.random = false;
+ Sequential.speed = CORSAIR_PRO_SPEED_SLOW;
modes.push_back(Sequential);
mode Static;
- Static.name = "Static";
- Static.value = CORSAIR_PRO_MODE_STATIC;
- Static.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Static.name = "Static";
+ Static.value = CORSAIR_PRO_MODE_STATIC;
+ Static.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Static.speed_min = 0;
+ Static.speed_max = 0;
+ Static.random = false;
+ Static.speed = 0;
modes.push_back(Static);
active_mode = 9;
diff --git a/RGBController/RGBController_PatriotViper.cpp b/RGBController/RGBController_PatriotViper.cpp
index 808cea4c..3fa3ee6d 100644
--- a/RGBController/RGBController_PatriotViper.cpp
+++ b/RGBController/RGBController_PatriotViper.cpp
@@ -22,7 +22,7 @@ void RGBController_PatriotViper::SetMode(int mode)
}
else
{
- viper->SetMode(modes[mode].value);
+ viper->SetMode(modes[mode].value, modes[mode].speed);
}
}
@@ -89,51 +89,83 @@ RGBController_PatriotViper::RGBController_PatriotViper(PatriotViperController* v
type = DEVICE_TYPE_DRAM;
mode Direct;
- Direct.name = "Direct";
- Direct.value = 0xFFFF;
- Direct.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Direct.name = "Direct";
+ Direct.value = 0xFFFF;
+ Direct.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Direct.speed_min = 0;
+ Direct.speed_max = 0;
+ Direct.random = false;
+ Direct.speed = 0;
modes.push_back(Direct);
mode Dark;
- Dark.name = "Dark";
- Dark.value = VIPER_MODE_DARK;
- Dark.flags = 0;
+ Dark.name = "Dark";
+ Dark.value = VIPER_MODE_DARK;
+ Dark.flags = 0;
+ Dark.speed_min = 0;
+ Dark.speed_max = 0;
+ Dark.random = false;
+ Dark.speed = 0;
modes.push_back(Dark);
mode Breathing;
- Breathing.name = "Breathing";
- Breathing.value = VIPER_MODE_BREATHING;
- Breathing.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Breathing.name = "Breathing";
+ Breathing.value = VIPER_MODE_BREATHING;
+ Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Breathing.speed_min = 0x00;
+ Breathing.speed_max = 0xFF;
+ Breathing.random = false;
+ Breathing.speed = 0x0C;
modes.push_back(Breathing);
mode Viper;
- Viper.name = "Viper";
- Viper.value = VIPER_MODE_VIPER;
- Viper.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Viper.name = "Viper";
+ Viper.value = VIPER_MODE_VIPER;
+ Viper.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Viper.speed_min = 0x14;
+ Viper.speed_max = 0xC8;
+ Viper.random = false;
+ Viper.speed = 0x64;
modes.push_back(Viper);
mode Heartbeat;
- Heartbeat.name = "Heartbeat";
- Heartbeat.value = VIPER_MODE_HEARTBEAT;
- Heartbeat.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Heartbeat.name = "Heartbeat";
+ Heartbeat.value = VIPER_MODE_HEARTBEAT;
+ Heartbeat.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Heartbeat.speed_min = 0x14;
+ Heartbeat.speed_max = 0xC8;
+ Heartbeat.random = false;
+ Heartbeat.speed = 0x64;
modes.push_back(Heartbeat);
mode Marquee;
- Marquee.name = "Marquee";
- Marquee.value = VIPER_MODE_MARQUEE;
- Marquee.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Marquee.name = "Marquee";
+ Marquee.value = VIPER_MODE_MARQUEE;
+ Marquee.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Marquee.speed_min = 0x14;
+ Marquee.speed_max = 0xC8;
+ Marquee.random = false;
+ Marquee.speed = 0x64;
modes.push_back(Marquee);
mode Raindrop;
- Raindrop.name = "Raindrop";
- Raindrop.value = VIPER_MODE_RAINDROP;
- Raindrop.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Raindrop.name = "Raindrop";
+ Raindrop.value = VIPER_MODE_RAINDROP;
+ Raindrop.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Raindrop.speed_min = 0x14;
+ Raindrop.speed_max = 0xC8;
+ Raindrop.random = false;
+ Raindrop.speed = 0x64;
modes.push_back(Raindrop);
mode Aurora;
- Aurora.name = "Aurora";
- Aurora.value = VIPER_MODE_AURORA;
- Aurora.flags = MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Aurora.name = "Aurora";
+ Aurora.value = VIPER_MODE_AURORA;
+ Aurora.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_COLOR | MODE_FLAG_PER_LED_COLOR;
+ Aurora.speed_min = 0x14;
+ Aurora.speed_max = 0xC8;
+ Aurora.random = false;
+ Aurora.speed = 0x64;
modes.push_back(Aurora);
colors.resize(viper->GetLEDCount());
diff --git a/qt/OpenRGBDevicePage.cpp b/qt/OpenRGBDevicePage.cpp
index 49548121..bff5e560 100644
--- a/qt/OpenRGBDevicePage.cpp
+++ b/qt/OpenRGBDevicePage.cpp
@@ -153,6 +153,14 @@ void Ui::OpenRGBDevicePage::on_RandomCheck_clicked()
UpdateMode();
}
+void Ui::OpenRGBDevicePage::on_SpeedSlider_valueChanged(int value)
+{
+ /*-----------------------------------------------------*\
+ | Change device mode |
+ \*-----------------------------------------------------*/
+ UpdateMode();
+}
+
void Ui::OpenRGBDevicePage::UpdateModeUi()
{
/*-----------------------------------------------------*\
@@ -167,8 +175,21 @@ void Ui::OpenRGBDevicePage::UpdateModeUi()
{
bool supports_random = ( device->modes[selected_mode].flags & MODE_FLAG_HAS_COLOR )
&& ( device->modes[selected_mode].flags & MODE_FLAG_RANDOM_COLOR );
+ bool supports_speed = ( device->modes[selected_mode].flags & MODE_FLAG_HAS_SPEED );
bool random = device->modes[selected_mode].random;
+ if(supports_speed)
+ {
+ ui->SpeedSlider->setEnabled(true);
+ ui->SpeedSlider->setMinimum(device->modes[selected_mode].speed_min);
+ ui->SpeedSlider->setMaximum(device->modes[selected_mode].speed_max);
+ ui->SpeedSlider->setValue( device->modes[selected_mode].speed );
+ }
+ else
+ {
+ ui->SpeedSlider->setEnabled(false);
+ }
+
if(supports_random)
{
ui->RandomCheck->setEnabled(true);
@@ -187,7 +208,7 @@ void Ui::OpenRGBDevicePage::UpdateMode()
| Read user interface |
\*-----------------------------------------------------*/
int current_mode = ui->ModeBox->currentIndex();
- int current_speed = 0;
+ int current_speed = ui->SpeedSlider->value();
bool current_random = ui->RandomCheck->checkState();
/*-----------------------------------------------------*\
diff --git a/qt/OpenRGBDevicePage.h b/qt/OpenRGBDevicePage.h
index b191aaf2..a207d944 100644
--- a/qt/OpenRGBDevicePage.h
+++ b/qt/OpenRGBDevicePage.h
@@ -46,6 +46,8 @@ private slots:
void on_RandomCheck_clicked();
+ void on_SpeedSlider_valueChanged(int value);
+
private:
Ui::OpenRGBDevicePageUi *ui;
RGBController *device;
diff --git a/qt/OpenRGBDevicePage.ui b/qt/OpenRGBDevicePage.ui
index 51bfd48f..b1e22cca 100644
--- a/qt/OpenRGBDevicePage.ui
+++ b/qt/OpenRGBDevicePage.ui
@@ -394,6 +394,19 @@
Random Color
+
+
+
+ 70
+ 270
+ 160
+ 16
+
+
+
+ Qt::Horizontal
+
+