Browse Source

Added logo, touchpad and front regions with RGB, changed command line options

master^2
Juan Ramón Troncoso 8 years ago
parent
commit
85d1de2058
  1. 20
      keyboard.cpp
  2. 13
      keyboard.h
  3. 126
      main.cpp

20
keyboard.cpp

@ -51,7 +51,7 @@ void Keyboard::setMode(Mode mode) {
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)
return;
@ -69,3 +69,21 @@ void Keyboard::setColor(Region region, Color color, Intensity intensity) {
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 {
//Only the first three can change mode
REGION_LEFT = 1,
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 {
@ -53,7 +61,8 @@ public:
Keyboard();
~Keyboard();
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:
hid_device *m_dev;

126
main.cpp

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

Loading…
Cancel
Save