Browse Source

Merge pull request #6 from jrtroncoso/master

Added touchpad, logo and front regions
master
bparker06 8 years ago
committed by GitHub
parent
commit
fb57be9eaa
  1. 24
      README
  2. 20
      keyboard.cpp
  3. 13
      keyboard.h
  4. 126
      main.cpp

24
README

@ -1,4 +1,4 @@
This program can change the colors on your MSI steelseries keyboard. The keyboards have 3 regions that can have different colors for each one. This program can change the colors on your MSI steelseries keyboard. Depending on the model, the keyboards have 3 or 7 regions that can have different colors for each one.
Prerequisites (tested on Ubuntu 14.04 only): Prerequisites (tested on Ubuntu 14.04 only):
@ -21,16 +21,25 @@ Keyboard color changer for MSI steelseries keyboards
Options: Options:
-h, --help Displays this help. -h, --help Displays this help.
-v, --version Displays version information. -v, --version Displays version information.
-m, --mode set color mode: normal, gaming, breathe, demo, wave -m, --mode <mode> set color <mode>: normal, gaming, breathe, demo, wave
-c, --color set a color using the format: region,color,intensity -r, --rgb <rgb> set an <rgb> color using the format:
region,red,green,blue with rgb values between 0 and 255
-c, --color <color> set a <color> preset using the format:
region,color,intensity (only valid for left/middle/right
regions). When using this option, a mode must be
specified with -m
Available regions: Available regions:
left left
middle middle
right right
logo
front-left
front-right
touchpad
Available colors: Available color presets (only for left/middle/right regions):
off off
red red
@ -42,7 +51,7 @@ blue
purple purple
white white
Available intensities: Available preset intensities (only for left/middle/right regions):
high high
medium medium
@ -51,8 +60,7 @@ light
Example: Example:
./msi-keyboard -m normal -c left,red,high -c middle,purple,high -c right,sky,high ./msi-keyboard -m normal -c left,red,high -c middle,purple,high -c right,sky,high -r touchpad,255,0,0 -r logo,255,255,255
Licensing: Licensing:
@ -64,4 +72,4 @@ Copyright (c) 2013 | Steve Lacy slacy.me | Fractal wearefractal.com contact@wear
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. $The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

20
keyboard.cpp

@ -51,7 +51,7 @@ void Keyboard::setMode(Mode mode) {
hid_send_feature_report(m_dev, buf, BUFSIZE); hid_send_feature_report(m_dev, buf, BUFSIZE);
} }
void Keyboard::setColor(Region region, Color color, Intensity intensity) { void Keyboard::setColorPreset(Region region, Color color, Intensity intensity) {
if(!m_dev) if(!m_dev)
return; return;
@ -69,3 +69,21 @@ void Keyboard::setColor(Region region, Color color, Intensity intensity) {
hid_send_feature_report(m_dev, buf, BUFSIZE); hid_send_feature_report(m_dev, buf, BUFSIZE);
} }
void Keyboard::setColor(Region region, char* rgb) {
if(!m_dev)
return;
unsigned char buf[BUFSIZE] = {0};
buf[0] = 1;
buf[1] = 2;
buf[2] = 64;
buf[3] = static_cast<unsigned int>(region);
buf[4] = rgb[0];
buf[5] = rgb[1];
buf[6] = rgb[2];
buf[7] = 236;
hid_send_feature_report(m_dev, buf, BUFSIZE);
}

13
keyboard.h

@ -22,9 +22,17 @@ enum Mode {
}; };
enum Region { enum Region {
//Only the first three can change mode
REGION_LEFT = 1, REGION_LEFT = 1,
REGION_MIDDLE = 2, REGION_MIDDLE = 2,
REGION_RIGHT = 3 REGION_RIGHT = 3,
//SteelSeries Logo
LOGO = 4,
//Front lights
FRL_LEFT = 5,
//Touchpad
FRL_RIGHT = 6,
TOUCHPAD = 7
}; };
enum Color { enum Color {
@ -53,7 +61,8 @@ public:
Keyboard(); Keyboard();
~Keyboard(); ~Keyboard();
void setMode(Mode mode); void setMode(Mode mode);
void setColor(Region region, Color color, Intensity intensity); void setColorPreset(Region region, Color color, Intensity intensity);
void setColor(Region region, char *rgb);
private: private:
hid_device *m_dev; hid_device *m_dev;

126
main.cpp

@ -20,8 +20,8 @@ enum CommandLineParseResult
CommandLineHelpRequested CommandLineHelpRequested
}; };
struct ColorOption { struct ColorPresetOption {
ColorOption() : ColorPresetOption() :
region(REGION_LEFT) region(REGION_LEFT)
,color(COLOR_RED) ,color(COLOR_RED)
,intensity(INTENSITY_HIGH) ,intensity(INTENSITY_HIGH)
@ -32,18 +32,32 @@ struct ColorOption {
Intensity intensity; Intensity intensity;
}; };
struct ColorOption {
ColorOption() :
region(TOUCHPAD)
,rgb{0,0,0}
{}
Region region;
char rgb[3];
};
struct KeyboardOptions { struct KeyboardOptions {
KeyboardOptions() : KeyboardOptions() :
modeOption(MODE_NORMAL) modeOption(MODE_NORMAL)
,colorOptions() ,colorOptions()
,modeSet(false) ,modeSet(false)
,colorSet(false) ,colorSet(false)
,presetSet(false)
{} {}
Mode modeOption; Mode modeOption;
QList<ColorPresetOption*> presetOptions;
QList<ColorOption*> colorOptions; QList<ColorOption*> colorOptions;
bool modeSet; bool modeSet;
bool colorSet; bool colorSet;
bool presetSet;
void setMode(QString mode) { void setMode(QString mode) {
if(mode == "normal") { modeOption = MODE_NORMAL; } if(mode == "normal") { modeOption = MODE_NORMAL; }
@ -55,7 +69,7 @@ struct KeyboardOptions {
modeSet = true; modeSet = true;
} }
void setColor(QString colorString) { void setColorPreset(QString colorString) {
QStringList fields = colorString.split(','); QStringList fields = colorString.split(',');
if(fields.count() != 3) { if(fields.count() != 3) {
@ -68,27 +82,67 @@ struct KeyboardOptions {
QString color = fields.at(1); QString color = fields.at(1);
QString intensity = fields.at(2); QString intensity = fields.at(2);
ColorPresetOption *presetOption = new ColorPresetOption;
if(region == "left") presetOption->region = REGION_LEFT;
else if(region == "middle") presetOption->region = REGION_MIDDLE;
else if(region == "right") presetOption->region = REGION_RIGHT;
else{
std::cerr << "invalid region selection" << std::endl;
qApp->quit();
return;
}
if(color == "off") presetOption->color = COLOR_OFF;
if(color == "red") presetOption->color = COLOR_RED;
if(color == "orange") presetOption->color = COLOR_ORANGE;
if(color == "yellow") presetOption->color = COLOR_YELLOW;
if(color == "green") presetOption->color = COLOR_GREEN;
if(color == "sky") presetOption->color = COLOR_SKY;
if(color == "blue") presetOption->color = COLOR_BLUE;
if(color == "purple") presetOption->color = COLOR_PURPLE;
if(color == "white") presetOption->color = COLOR_WHITE;
if(intensity == "high") presetOption->intensity = INTENSITY_HIGH;
if(intensity == "medium") presetOption->intensity = INTENSITY_MEDIUM;
if(intensity == "low") presetOption->intensity = INTENSITY_LOW;
if(intensity == "light") presetOption->intensity = INTENSITY_LIGHT;
presetSet = true;
presetOptions.append(presetOption);
}
void setColor(QString colorString) {
QStringList fields = colorString.split(',');
if(fields.count() != 4) {
std::cerr << "invalid color selection" << std::endl;
qApp->quit();
return;
}
QString region = fields.at(0);
ColorOption *colorOption = new ColorOption; ColorOption *colorOption = new ColorOption;
if(region == "left") colorOption->region = REGION_LEFT; if(region == "left") colorOption->region = REGION_LEFT;
if(region == "middle") colorOption->region = REGION_MIDDLE; if(region == "middle") colorOption->region = REGION_MIDDLE;
if(region == "right") colorOption->region = REGION_RIGHT; if(region == "right") colorOption->region = REGION_RIGHT;
if(region == "logo") colorOption->region = LOGO;
if(color == "off") colorOption->color = COLOR_OFF; if(region == "front-left") colorOption->region = FRL_LEFT;
if(color == "red") colorOption->color = COLOR_RED; if(region == "front-right") colorOption->region = FRL_RIGHT;
if(color == "orange") colorOption->color = COLOR_ORANGE; if(region == "touchpad") colorOption->region = TOUCHPAD;
if(color == "yellow") colorOption->color = COLOR_YELLOW;
if(color == "green") colorOption->color = COLOR_GREEN; bool ok=false;
if(color == "sky") colorOption->color = COLOR_SKY; for (uint k=0;k<3;k++){
if(color == "blue") colorOption->color = COLOR_BLUE; colorOption->rgb[k]=fields.at(k+1).toInt(&ok);
if(color == "purple") colorOption->color = COLOR_PURPLE; if (!ok){
if(color == "white") colorOption->color = COLOR_WHITE; std::cerr << "invalid color selection" << std::endl;
qApp->quit();
if(intensity == "high") colorOption->intensity = INTENSITY_HIGH; return;
if(intensity == "medium") colorOption->intensity = INTENSITY_MEDIUM; }
if(intensity == "low") colorOption->intensity = INTENSITY_LOW; }
if(intensity == "light") colorOption->intensity = INTENSITY_LIGHT;
colorSet = true; colorSet = true;
colorOptions.append(colorOption); colorOptions.append(colorOption);
@ -100,10 +154,12 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, KeyboardOpti
QCommandLineOption versionOption = parser.addVersionOption(); QCommandLineOption versionOption = parser.addVersionOption();
QCommandLineOption mode(QStringList() << "m" << "mode", "set color <mode>: normal, gaming, breathe, demo, wave", "mode"); QCommandLineOption mode(QStringList() << "m" << "mode", "set color <mode>: normal, gaming, breathe, demo, wave", "mode");
QCommandLineOption color(QStringList() << "c" << "color", "set a <color> using the format: region,color,intensity", "color"); QCommandLineOption color(QStringList() << "r" << "rgb", "set an <rgb> color using the format: region,red,green,blue with rgb values between 0 and 255", "rgb");
QCommandLineOption colorPreset(QStringList() << "c" << "color", "set a <color> preset using the format: region,color,intensity (only valid for left/middle/right regions). When using this option, a mode must be specified with -m", "color");
parser.addOption(mode); parser.addOption(mode);
parser.addOption(color); parser.addOption(color);
parser.addOption(colorPreset);
if(!parser.parse(QCoreApplication::arguments())) { if(!parser.parse(QCoreApplication::arguments())) {
*errorMessage = parser.errorText(); *errorMessage = parser.errorText();
@ -120,6 +176,12 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, KeyboardOpti
keyboardOptions->setMode(parser.value(mode)); keyboardOptions->setMode(parser.value(mode));
} }
if(parser.isSet(colorPreset)) {
foreach(const QString &presetValue, parser.values(colorPreset)) {
keyboardOptions->setColorPreset(presetValue);
}
}
if(parser.isSet(color)) { if(parser.isSet(color)) {
foreach(const QString &colorValue, parser.values(color)) { foreach(const QString &colorValue, parser.values(color)) {
keyboardOptions->setColor(colorValue); keyboardOptions->setColor(colorValue);
@ -132,7 +194,7 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, KeyboardOpti
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
app.setApplicationName("msi-keyboard"); app.setApplicationName("msi-keyboard");
app.setApplicationVersion("1.0"); app.setApplicationVersion("1.1");
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription("Keyboard color changer for MSI steelseries keyboards"); parser.setApplicationDescription("Keyboard color changer for MSI steelseries keyboards");
@ -156,7 +218,7 @@ int main(int argc, char *argv[]) {
{ {
std::cout << qPrintable(parser.helpText()) << std::endl; std::cout << qPrintable(parser.helpText()) << std::endl;
QStringList regions = QStringList() << "left" << "middle" << "right"; QStringList regions = QStringList() << "left" << "middle" << "right"<<"logo"<<"front-left"<<"front-right"<<"touchpad";
QStringList colors = QStringList() << "off" << "red" << "orange" << "yellow" << "green" << "sky" << "blue" << "purple" << "white"; QStringList colors = QStringList() << "off" << "red" << "orange" << "yellow" << "green" << "sky" << "blue" << "purple" << "white";
QStringList intensities = QStringList() << "high" << "medium" << "low" << "light"; QStringList intensities = QStringList() << "high" << "medium" << "low" << "light";
@ -164,18 +226,18 @@ int main(int argc, char *argv[]) {
%1 %1
Available colors: Available color presets (only for left/middle/right regions):
%2 %2
Available intensities: Available preset intensities (only for left/middle/right regions):
%3 %3
Example: Example:
%4 %4
)").arg(regions.join('\n')).arg(colors.join('\n')).arg(intensities.join('\n')).arg(QString(argv[0]) + " -m normal -c left,red,high -c middle,purple,high -c right,sky,high"); )").arg(regions.join('\n')).arg(colors.join('\n')).arg(intensities.join('\n')).arg(QString(argv[0]) + " -m normal -c left,red,high -c middle,purple,high -c right,sky,high -r touchpad,255,0,0 -r logo,255,255,255");
std::cout << qPrintable(colorHelp) << std::endl; std::cout << qPrintable(colorHelp) << std::endl;
@ -183,17 +245,25 @@ Example:
} }
} }
if(!keyboardOptions.modeSet || !keyboardOptions.colorSet) { if((!keyboardOptions.modeSet || !keyboardOptions.presetSet) && !keyboardOptions.colorSet ) {
std::cerr << "Please set a mode as well as at least one color region to change." << std::endl; std::cerr << "Please set either a mode together with at least one region to change a color preset, or a color region to change rgb color." << std::endl;
return 1; return 1;
}else{ }else{
Keyboard k; Keyboard k;
if(keyboardOptions.presetSet) {
for(int i = 0; i < keyboardOptions.presetOptions.count(); ++i) {
ColorPresetOption *presetOption = keyboardOptions.presetOptions.at(i);
k.setColorPreset(presetOption->region, presetOption->color, presetOption->intensity);
}
}
if(keyboardOptions.colorSet) { if(keyboardOptions.colorSet) {
for(int i = 0; i < keyboardOptions.colorOptions.count(); ++i) { for(int i = 0; i < keyboardOptions.colorOptions.count(); ++i) {
ColorOption *colorOption = keyboardOptions.colorOptions.at(i); ColorOption *colorOption = keyboardOptions.colorOptions.at(i);
k.setColor(colorOption->region, colorOption->color, colorOption->intensity); k.setColor(colorOption->region, colorOption->rgb);
} }
} }

Loading…
Cancel
Save