1
0
mirror of https://github.com/MatMoul/g810-led.git synced 2024-12-23 09:16:11 +00:00

Add spark support preview

This commit is contained in:
MatMoul 2016-11-28 00:32:39 +01:00
parent b23e48069b
commit 4d407ed834
5 changed files with 239 additions and 83 deletions

View File

@ -24,10 +24,15 @@ bool Keyboard::attach() {
libusb_device_descriptor desc = {0};
libusb_get_device_descriptor(device, &desc);
if (desc.idVendor == 0x046d) {
if (desc.idProduct == 0xc331) { pid = desc.idProduct; break; } // G810
if (desc.idProduct == 0xc337) { pid = desc.idProduct; break; } // G810
if (desc.idProduct == 0xc330) { pid = desc.idProduct; break; } // G410
if (desc.idProduct == 0xc333) { pid = desc.idProduct; break; } // G610
if (desc.idProduct == 0xc331) { pid = desc.idProduct; break; } // G810 spectrum
if (desc.idProduct == 0xc337) { pid = desc.idProduct; break; } // G810 spectrum
if (desc.idProduct == 0xc330) { pid = desc.idProduct; break; } // G410 spectrum
if (desc.idProduct == 0xc333) { pid = desc.idProduct; break; } // G610 spectrum
if (desc.idProduct == 0xc333) { // G910 spark
pid = desc.idProduct;
kbdProtocol = KeyboardProtocol::spark;
break;
}
}
}
libusb_free_device_list(devs, 1);
@ -74,10 +79,23 @@ bool Keyboard::commit() {
if (m_isAttached == false) return false;
bool retval = false;
unsigned char *data = new unsigned char[20];
data[0] = 0x11;
data[1] = 0xff;
data[2] = 0x0c;
data[3] = 0x5a;
switch (kbdProtocol) {
case KeyboardProtocol::spectrum:
data[0] = 0x11;
data[1] = 0xff;
data[2] = 0x0c;
data[3] = 0x5a;
break;
case KeyboardProtocol::spark:
data[0] = 0x11;
data[1] = 0xff;
data[2] = 0x0c; //Need change
data[3] = 0x5a; //Need change
break;
default:
return false;
break;
}
for(int i = 4; i < 20; i++) data[i] = 0x00;
retval = sendDataInternal(data, 20);
delete[] data;
@ -90,6 +108,10 @@ bool Keyboard::getKeyAddress(Key key, KeyAddress &keyAddress) {
keyAddress.addressGroup = KeyAddressGroup::logo;
keyAddress.id = 0x01;
break;
case Key::logo2:
keyAddress.addressGroup = KeyAddressGroup::logo;
keyAddress.id = 0x02;
break;
case Key::backlight:
keyAddress.addressGroup = KeyAddressGroup::indicators;
keyAddress.id = 0x01;
@ -130,6 +152,42 @@ bool Keyboard::getKeyAddress(Key key, KeyAddress &keyAddress) {
keyAddress.addressGroup = KeyAddressGroup::multimedia;
keyAddress.id = 0xe2;
break;
case Key::g1:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g2:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g3:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g4:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g5:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g6:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g7:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g8:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
case Key::g9:
keyAddress.addressGroup = KeyAddressGroup::gkeys;
keyAddress.id = 0x00; // Need change
break;
default:
keyAddress.addressGroup = KeyAddressGroup::keys;
switch (key) {
@ -257,6 +315,7 @@ bool Keyboard::parseKey(std::string key, KeyAddress &keyAddress) {
std::transform(key.begin(), key.end(), key.begin(), ::tolower);
Key parsedKey;
if (key == "logo") parsedKey = Key::logo;
else if (key == "logo2") parsedKey = Key::logo2;
else if (key == "back_light" || key == "backlight" || key == "light") parsedKey = Key::backlight;
else if (key == "game_mode" || key == "gamemode" || key == "game") parsedKey = Key::game;
else if (key == "caps_indicator" || key == "capsindicator" || key == "caps") parsedKey = Key::caps;
@ -375,6 +434,15 @@ bool Keyboard::parseKey(std::string key, KeyAddress &keyAddress) {
else if (key == "alt_right" || key == "altright" || key == "altr" || key == "altgr") parsedKey = Key::alt_right;
else if (key == "win_right" || key == "winright" || key == "winr") parsedKey = Key::win_right;
else if (key == "meta_right" || key == "metaright" || key == "metar") parsedKey = Key::win_right;
else if (key == "g1") parsedKey = Key::g1;
else if (key == "g2") parsedKey = Key::g2;
else if (key == "g3") parsedKey = Key::g3;
else if (key == "g4") parsedKey = Key::g4;
else if (key == "g5") parsedKey = Key::g5;
else if (key == "g6") parsedKey = Key::g6;
else if (key == "g7") parsedKey = Key::g7;
else if (key == "g8") parsedKey = Key::g8;
else if (key == "g9") parsedKey = Key::g9;
else return false;
return getKeyAddress(parsedKey, keyAddress);
}
@ -389,6 +457,7 @@ bool Keyboard::parseKeyGroup(std::string key, KeyGroup &keyGroup) {
else if (key == "numeric") keyGroup = KeyGroup::numeric;
else if (key == "functions") keyGroup = KeyGroup::functions;
else if (key == "keys") keyGroup = KeyGroup::keys;
else if (key == "gkeys") keyGroup = KeyGroup::gkeys;
else return false;
return true;
}
@ -413,46 +482,110 @@ bool Keyboard::sendDataInternal(unsigned char *data, int data_size) {
}
bool Keyboard::populateAddressGroupInternal(KeyAddressGroup addressGroup, unsigned char *data) {
switch (addressGroup) {
case KeyAddressGroup::logo:
data[0] = 0x11; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x10; // Base address
data[6] = 0x00; // Base address
data[7] = 0x01; // Base address
switch (kbdProtocol) {
case KeyboardProtocol::spectrum:
switch (addressGroup) {
case KeyAddressGroup::logo:
data[0] = 0x11; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x10; // Base address
data[6] = 0x00; // Base address
data[7] = 0x01; // Base address
break;
case KeyAddressGroup::indicators:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x40; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::multimedia:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x02; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::keys:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x01; // Base address
data[6] = 0x00; // Base address
data[7] = 0x0e; // Base address
break;
default:
return false;
break;
}
break;
case KeyAddressGroup::indicators:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x40; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::multimedia:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x02; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::keys:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x01; // Base address
data[6] = 0x00; // Base address
data[7] = 0x0e; // Base address
case KeyboardProtocol::spark:
switch (addressGroup) {
case KeyAddressGroup::logo:
data[0] = 0x11; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x10; // Base address
data[6] = 0x00; // Base address
data[7] = 0x01; // Base address
break;
case KeyAddressGroup::indicators:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x40; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::multimedia:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x02; // Base address
data[6] = 0x00; // Base address
data[7] = 0x05; // Base address
break;
case KeyAddressGroup::keys:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x01; // Base address
data[6] = 0x00; // Base address
data[7] = 0x0e; // Base address
break;
case KeyAddressGroup::gkeys:
data[0] = 0x12; // Base address
data[1] = 0xff; // Base address
data[2] = 0x0c; // Base address
data[3] = 0x3a; // Base address
data[4] = 0x00; // Base address
data[5] = 0x01; // Base address
data[6] = 0x00; // Base address
data[7] = 0x0e; // Base address
break;
default:
return false;
break;
}
break;
default:
return false;
@ -562,11 +695,13 @@ bool Keyboard::setKeys(KeyValue keyValue[], int keyValueCount) {
int multimediaCount = 0;
KeyValue keys[200];
int keysCount = 0;
KeyValue gkeys[200];
int gkeysCount = 0;
for (int i = 0; i < keyValueCount; i++) {
if(keyValue[i].key.addressGroup == KeyAddressGroup::logo) {
logo[0] = keyValue[i];
logoCount = 1;
logo[logoCount] = keyValue[i];
logoCount++;
} else if(keyValue[i].key.addressGroup == KeyAddressGroup::indicators) {
indicators[indicatorsCount] = keyValue[i];
indicatorsCount++;
@ -576,10 +711,13 @@ bool Keyboard::setKeys(KeyValue keyValue[], int keyValueCount) {
} else if(keyValue[i].key.addressGroup == KeyAddressGroup::keys) {
keys[keysCount] = keyValue[i];
keysCount++;
} else if(keyValue[i].key.addressGroup == KeyAddressGroup::gkeys) {
gkeys[gkeysCount] = keyValue[i];
gkeysCount++;
}
}
if (logoCount > 0) setKey(logo[logoCount - 1]);
if (logoCount > 0) setKeysInternal(KeyAddressGroup::logo, logo, logoCount);
if (indicatorsCount > 0) setKeysInternal(KeyAddressGroup::indicators, indicators, indicatorsCount);
@ -598,16 +736,18 @@ bool Keyboard::setKeys(KeyValue keyValue[], int keyValueCount) {
}
}
if (gkeysCount > 0) setKeysInternal(KeyAddressGroup::gkeys, gkeys, gkeysCount);
return true;
}
bool Keyboard::setAllKeys(KeyColors colors) {
KeyValue keyValues[117];
for (int i = 0; i < 117; i++) {
KeyValue keyValues[127];
for (int i = 0; i < 127; i++) {
getKeyAddress((Key)i, keyValues[i].key);
keyValues[i].colors = colors;
}
setKeys(keyValues, 117);
setKeys(keyValues, 127);
return true;
}
@ -616,68 +756,81 @@ bool Keyboard::setGroupKeys(KeyGroup keyGroup, KeyColors colors) {
int keyValuesCount = 0;
switch (keyGroup) {
case KeyGroup::logo:
setKey(Key::logo, colors);
for (int i = 0; i < 2; i++) {
getKeyAddress((Key)i, keyValues[i].key);
keyValues[i].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::indicators:
for (int i = 1; i < 6; i++) {
getKeyAddress((Key)i, keyValues[i - 1].key);
keyValues[i - 1].colors = colors;
for (int i = 2; i < 7; i++) {
getKeyAddress((Key)i, keyValues[i - 2].key);
keyValues[i - 2].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::multimedia:
for (int i = 6; i < 11; i++) {
getKeyAddress((Key)i, keyValues[i - 6].key);
keyValues[i - 6].colors = colors;
for (int i = 7; i < 12; i++) {
getKeyAddress((Key)i, keyValues[i - 7].key);
keyValues[i - 7].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::fkeys:
for (int i = 11; i < 23; i++) {
getKeyAddress((Key)i, keyValues[i - 11].key);
keyValues[i - 11].colors = colors;
for (int i = 12; i < 24; i++) {
getKeyAddress((Key)i, keyValues[i - 12].key);
keyValues[i - 12].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::modifiers:
for (int i = 23; i < 32; i++) {
getKeyAddress((Key)i, keyValues[i - 23].key);
keyValues[i - 23].colors = colors;
for (int i = 24; i < 33; i++) {
getKeyAddress((Key)i, keyValues[i - 24].key);
keyValues[i - 24].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::arrows:
for (int i = 32; i < 36; i++) {
getKeyAddress((Key)i, keyValues[i - 32].key);
keyValues[i - 32].colors = colors;
for (int i = 33; i < 37; i++) {
getKeyAddress((Key)i, keyValues[i - 33].key);
keyValues[i - 33].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::numeric:
for (int i = 36; i < 53; i++) {
getKeyAddress((Key)i, keyValues[i - 36].key);
keyValues[i - 36].colors = colors;
for (int i = 37; i < 54; i++) {
getKeyAddress((Key)i, keyValues[i - 37].key);
keyValues[i - 37].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::functions:
for (int i = 53; i < 63; i++) {
getKeyAddress((Key)i, keyValues[i - 53].key);
keyValues[i - 53].colors = colors;
for (int i = 54; i < 64; i++) {
getKeyAddress((Key)i, keyValues[i - 54].key);
keyValues[i - 54].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::keys:
for (int i = 63; i < 117; i++) {
getKeyAddress((Key)i, keyValues[i - 63].key);
keyValues[i - 63].colors = colors;
for (int i = 64; i < 118; i++) {
getKeyAddress((Key)i, keyValues[i - 64].key);
keyValues[i - 64].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);
break;
case KeyGroup::gkeys:
for (int i = 118; i < 127; i++) {
getKeyAddress((Key)i, keyValues[i - 118].key);
keyValues[i - 118].colors = colors;
keyValuesCount++;
}
setKeys(keyValues, keyValuesCount);

View File

@ -8,10 +8,11 @@ class Keyboard {
public:
enum class KeyboardProtocol { spectrum, spark };
enum class PowerOnEffect { rainbow, color };
enum class KeyAddressGroup { logo, indicators, multimedia, keys };
enum class Key { // 117 items
logo,
enum class KeyAddressGroup { logo, indicators, multimedia, keys, gkeys };
enum class Key { // 127 items
logo, logo2,
caps, num, scroll, game, backlight,
mute, play, stop, prev, next,
f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12,
@ -26,9 +27,10 @@ class Keyboard {
tilde, minus, equal,
open_bracket, close_bracket, backslash,
semicolon, quote, dollar,
intl_backslash, comma, period, slash
intl_backslash, comma, period, slash,
g1, g2, g3, g4, g5, g6, g7, g8, g9
};
enum class KeyGroup { logo, indicators, multimedia, fkeys, modifiers, arrows, numeric, functions, keys};
enum class KeyGroup { logo, indicators, multimedia, fkeys, modifiers, arrows, numeric, functions, keys, gkeys};
struct KeyColors { char red; char green; char blue; };
struct KeyAddress { KeyAddressGroup addressGroup; char id; };
@ -55,6 +57,7 @@ class Keyboard {
bool m_isAttached = false;
bool m_isKernellDetached = false;
KeyboardProtocol kbdProtocol = KeyboardProtocol::spectrum;
libusb_device **devs;
libusb_device_handle *dev_handle;
libusb_context *ctx = NULL;