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

Merge pull request #22 from noisycat/master

Some help & overflow protection
This commit is contained in:
MatMoul 2016-12-12 22:51:23 +01:00 committed by GitHub
commit 98b429f4e4
13 changed files with 71 additions and 33 deletions

View File

@ -1,5 +1,6 @@
CC=g++ CC=g++
CFLAGS=-Wall -O2 -std=gnu++11 CFLAGS=-Wall -O2 -std=gnu++11
LIBUSB_INC?=-I/usr/include/libusb-1.0
LDFLAGS=-lusb-1.0 LDFLAGS=-lusb-1.0
PROGN=g810-led PROGN=g810-led
@ -7,11 +8,11 @@ PROGN=g810-led
all: bin/$(PROGN) all: bin/$(PROGN)
bin/$(PROGN): src/main.cpp src/classes/*.cpp bin/$(PROGN): src/main.cpp src/classes/*.cpp src/classes/*.h
@mkdir -p bin @mkdir -p bin
$(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS) $(CC) $(CFLAGS) $(LIBUSB_INC) -o $@ $^ $(LDFLAGS)
debug: CFLAGS += -g debug: CFLAGS += -g -Wextra -pedantic
debug: bin/$(PROGN) debug: bin/$(PROGN)
clean: clean:

View File

@ -21,7 +21,20 @@ bool Keyboard::attach() {
int pid = 0; int pid = 0;
for(ssize_t i = 0; i < cnt; i++) { for(ssize_t i = 0; i < cnt; i++) {
libusb_device *device = devs[i]; libusb_device *device = devs[i];
libusb_device_descriptor desc = {0}; libusb_device_descriptor desc = {0, // bLength
0, // bDescriptorType
0, // bcdUSB
0, // bDeviceClass
0, // bDeviceSubClass
0, // bDeviceProtocol
0, // bMaxPacketSize0
0, // idVendor
0, // idProduct
0, // bcdDevice
0, // iManufacturer
0, // iProduct
0, // iSerialNumber
0}; // bNumConfigurations
libusb_get_device_descriptor(device, &desc); libusb_get_device_descriptor(device, &desc);
if (desc.idVendor == 0x046d) { if (desc.idVendor == 0x046d) {
if (desc.idProduct == 0xc331) { pid = desc.idProduct; break; } // G810 spectrum if (desc.idProduct == 0xc331) { pid = desc.idProduct; break; } // G810 spectrum
@ -476,7 +489,7 @@ bool Keyboard::parseColor(std::string color, KeyColors &colors) {
return true; return true;
} }
bool Keyboard::sendDataInternal(unsigned char *data, int data_size) { bool Keyboard::sendDataInternal(unsigned char *data, uint16_t data_size) {
if (m_isAttached == false) return false; if (m_isAttached == false) return false;
int r; int r;
if (data_size > 20) r = libusb_control_transfer(dev_handle, 0x21, 0x09, 0x0212, 1, data, data_size, 2000); if (data_size > 20) r = libusb_control_transfer(dev_handle, 0x21, 0x09, 0x0212, 1, data, data_size, 2000);
@ -589,17 +602,15 @@ bool Keyboard::populateAddressGroupInternal(KeyAddressGroup addressGroup, unsign
return true; return true;
} }
bool Keyboard::setKeysInternal(KeyAddressGroup addressGroup, KeyValue keyValues[], int keyValueCount) { bool Keyboard::setKeysInternal(KeyAddressGroup addressGroup, KeyValue keyValues[], size_t keyValueCount) {
bool retval = false; bool retval = false;
unsigned char *data;
int data_size; int data_size;
int maxKeyValueCount = 0;
if (addressGroup == KeyAddressGroup::logo) data_size = 20; if (addressGroup == KeyAddressGroup::logo) data_size = 20;
else data_size = 64; else data_size = 64;
data = new unsigned char[data_size]; unsigned char *data = new unsigned char[data_size];
const size_t maxKeyValueCount = (data_size - 8) / 4;
populateAddressGroupInternal(addressGroup, data); populateAddressGroupInternal(addressGroup, data);
maxKeyValueCount = (data_size - 8) / 4; for(size_t i = 0; i < maxKeyValueCount; i++) {
for(int i = 0; i < maxKeyValueCount; i++) {
if (i < keyValueCount) { if (i < keyValueCount) {
data[8 + i * 4 + 0] = keyValues[i].key.id; data[8 + i * 4 + 0] = keyValues[i].key.id;
data[8 + i * 4 + 1] = keyValues[i].colors.red; data[8 + i * 4 + 1] = keyValues[i].colors.red;
@ -671,24 +682,24 @@ bool Keyboard::setKey(Key key, KeyColors colors) {
return setKey(keyValue); return setKey(keyValue);
} }
bool Keyboard::setKeys(KeyValue keyValue[], int keyValueCount) { bool Keyboard::setKeys(KeyValue keyValue[], size_t keyValueCount) {
int maxLogoKeys = 5; const size_t maxLogoKeys = 5;
int logoCount = 0; const size_t maxIndicatorsKeys = 25;
const size_t maxMultimediaKeys = 25;
const size_t maxKeys = 200;
const size_t maxGKeys = 25;
size_t logoCount = 0;
size_t indicatorsCount = 0;
size_t multimediaCount = 0;
size_t keysCount = 0;
size_t gkeysCount = 0;
KeyValue logo[maxLogoKeys]; KeyValue logo[maxLogoKeys];
int maxIndicatorsKeys = 25;
int indicatorsCount = 0;
KeyValue indicators[maxIndicatorsKeys]; KeyValue indicators[maxIndicatorsKeys];
int maxMultimediaKeys = 25;
int multimediaCount = 0;
KeyValue multimedia[maxMultimediaKeys]; KeyValue multimedia[maxMultimediaKeys];
int maxKeys = 200;
int keysCount = 0;
KeyValue keys[maxKeys]; KeyValue keys[maxKeys];
int maxGKeys = 25;
int gkeysCount = 0;
KeyValue gkeys[maxGKeys]; KeyValue gkeys[maxGKeys];
for (int i = 0; i < keyValueCount; i++) { for (size_t i = 0; i < keyValueCount; i++) {
if(keyValue[i].key.addressGroup == KeyAddressGroup::logo && logoCount <= maxLogoKeys) { if(keyValue[i].key.addressGroup == KeyAddressGroup::logo && logoCount <= maxLogoKeys) {
logo[logoCount] = keyValue[i]; logo[logoCount] = keyValue[i];
logoCount++; logoCount++;
@ -714,11 +725,11 @@ bool Keyboard::setKeys(KeyValue keyValue[], int keyValueCount) {
if (multimediaCount > 0) setKeysInternal(KeyAddressGroup::multimedia, multimedia, multimediaCount); if (multimediaCount > 0) setKeysInternal(KeyAddressGroup::multimedia, multimedia, multimediaCount);
if (keysCount > 0) { if (keysCount > 0) {
int maxKeyValueCount = 14; const size_t maxKeyValueCount = 14;
for (int i = 0; i < keysCount; i = i + maxKeyValueCount) { for (size_t i = 0; i < keysCount; i = i + maxKeyValueCount) {
KeyValue keysBlock[maxKeyValueCount]; KeyValue keysBlock[maxKeyValueCount];
int keysBlockCount = 0; size_t keysBlockCount = 0;
for (int j = 0; j < maxKeyValueCount; j++) { for (size_t j = 0; j < maxKeyValueCount; j++) {
if((i + j) < keysCount ) { if((i + j) < keysCount ) {
keysBlock[j] = keys[i + j]; keysBlock[j] = keys[i + j];
keysBlockCount++; keysBlockCount++;

View File

@ -2,7 +2,7 @@
#define DEF_KEYBOARD #define DEF_KEYBOARD
#include <iostream> #include <iostream>
#include "/usr/include/libusb-1.0/libusb.h" #include <libusb.h>
class Keyboard { class Keyboard {
@ -32,8 +32,8 @@ class Keyboard {
}; };
enum class KeyGroup { logo, indicators, multimedia, fkeys, modifiers, arrows, numeric, functions, keys, gkeys}; enum class KeyGroup { logo, indicators, multimedia, fkeys, modifiers, arrows, numeric, functions, keys, gkeys};
struct KeyColors { char red; char green; char blue; }; struct KeyColors { uint8_t red; uint8_t green; uint8_t blue; };
struct KeyAddress { KeyAddressGroup addressGroup; char id; }; struct KeyAddress { KeyAddressGroup addressGroup; uint8_t id; };
struct KeyValue { KeyAddress key; KeyColors colors; }; struct KeyValue { KeyAddress key; KeyColors colors; };
bool isAttached(); bool isAttached();
@ -48,7 +48,7 @@ class Keyboard {
bool setPowerOnEffect(PowerOnEffect powerOnEffect); bool setPowerOnEffect(PowerOnEffect powerOnEffect);
bool setKey(KeyValue keyValue); bool setKey(KeyValue keyValue);
bool setKey(Key key, KeyColors colors); bool setKey(Key key, KeyColors colors);
bool setKeys(KeyValue keyValue[], int keyValueCount); bool setKeys(KeyValue keyValue[], size_t keyValueCount);
bool setAllKeys(KeyColors colors); bool setAllKeys(KeyColors colors);
bool setGroupKeys(KeyGroup keyGroup, KeyColors colors); bool setGroupKeys(KeyGroup keyGroup, KeyColors colors);
@ -63,8 +63,8 @@ class Keyboard {
libusb_context *ctx = NULL; libusb_context *ctx = NULL;
bool populateAddressGroupInternal(KeyAddressGroup addressGroup, unsigned char *data); bool populateAddressGroupInternal(KeyAddressGroup addressGroup, unsigned char *data);
bool sendDataInternal(unsigned char *data, int data_size); bool sendDataInternal(unsigned char *data, uint16_t data_size);
bool setKeysInternal(KeyAddressGroup addressGroup, KeyValue keyValues[], int keyValueCount); bool setKeysInternal(KeyAddressGroup addressGroup, KeyValue keyValues[], size_t keyValueCount);
}; };

View File

@ -0,0 +1,26 @@
# Description of each wireshark dump found in this folder
===
Sets effect to 'breathing' with color rgb(252,253,254) at the highest level the slider bar offers. Noticed that the full cycle of updates after switching to the profile (which was done through linking a profile to Notepad++ and letting logitech automatically send the profile once) is around 1 second for fullspeed, 5 seconds for midspeed, and a long 10 seconds for nospeed.
`g810-effect-to-breathing-252-253-254-fullspeed.pcapng
`g810-effect-to-breathing-252-253-254-midspeed.pcapng
`g810-effect-to-breathing-252-253-254-nospeed.pcapng
Sets effect to 'key press' with pressed color rgb(3,2,1) and background color rgb(252,253,254) with slider at lowest speed
`g810-effect-to-keypress-3-2-1_252-253-254-nospeed.pcapng
Idle g810 capture, was getting periodic updates without having anything interesting going on. Not sure why
`g810-idle.pcapng
Sets key color of 'a' / 'rcntrl' to rgb(252,253,254)
`g810-set-a-to-252-253-254.pcapng
`g810-set-rcntrl-to-252-253-254.pcapng
Sets effect to 'fixedcolor' - believe this was also at rgb(252,253,254). The second one includes going to the window and back, where it loads the profile and then reloads the former profile.
`g810-switches-to-fixedcolor-effect.pcapng
`g810-switches-to-from-fixedcolor-effect.pcapng

Binary file not shown.