Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 0 additions & 82 deletions etc/config.json

This file was deleted.

1 change: 1 addition & 0 deletions etc/config.json
82 changes: 82 additions & 0 deletions etc/config.json.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
{
"__comment" : "following hotkey types are supported: nothing, typeout, shortcut and run; only en, fr, de and si keyboard mappings are currently supported",
"keyboard_mapping": "en",
"notify": "True",
"profiles": {
"MEMORY_1": {
"MACRO_1": {
"hotkey_type": "typeout",
"do": "This is profile m1"
},
"MACRO_2": {
"hotkey_type": "shortcut",
"do": "alt+F4"
},
"MACRO_3": {
"hotkey_type": "run",
"do": "DISPLAY=:0 nohup gnome-terminal & 2>&1 > /dev/null"
},
"MACRO_4": {
"hotkey_type": "python",
"do": "import uuid; global output_string; output_string = str(uuid.uuid4());"
}
},
"MEMORY_2": {
"MACRO_1": {
"hotkey_type": "typeout",
"do": "This is profile m2"
},
"MACRO_2": {
"hotkey_type": "shortcut",
"do": "alt+F4"
},
"MACRO_3": {
"hotkey_type": "run",
"do": "DISPLAY=:0 nohup gnome-terminal & 2>&1 > /dev/null"
},
"MACRO_4": {
"hotkey_type": "python",
"do": "import uuid; global output_string; output_string = str(uuid.uuid4());"
}
},
"MEMORY_3": {
"MACRO_1": {
"hotkey_type": "typeout",
"do": "This is profile m3"
},
"MACRO_2": {
"hotkey_type": "shortcut",
"do": "alt+F4"
},
"MACRO_3": {
"hotkey_type": "run",
"do": "DISPLAY=:0 nohup gnome-terminal & 2>&1 > /dev/null"
},
"MACRO_4": {
"hotkey_type": "python",
"do": "import uuid; global output_string; output_string = str(uuid.uuid4());"
}
},
"MEMORY_RECORD": {
"MACRO_1": {
"hotkey_type": "typeout",
"do": "This is profile mr"
},
"MACRO_2": {
"hotkey_type": "shortcut",
"do": "alt+F4"
},
"MACRO_3": {
"hotkey_type": "run",
"do": "DISPLAY=:0 nohup gnome-terminal & 2>&1 > /dev/null"
},
"MACRO_4": {
"hotkey_type": "python",
"do": "import uuid; global output_string; output_string = str(uuid.uuid4());"
}
}
},
"logging": "True",
"log_path": "g910-gkeys.log",
"log_level": "INFO"
}
16 changes: 9 additions & 7 deletions g910_gkeys/data_mappers/supported_devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,15 @@ class LogitechG910EventInterface(DeviceEventInterface):
}

memoryKeysLEDs = {
"MEMORY_1": b'\x11\xff\x09\x1b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_2": b'\x11\xff\x09\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_3": b'\x11\xff\x09\x1b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_RECORD": [
b'\x11\xff\x0a\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'\x11\xff\x0a\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
]
"MEMORY_1": b'\x11\xff\x09\x1b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_2": b'\x11\xff\x09\x1b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_3": b'\x11\xff\x09\x1b\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_RECORD_OFF": b'\x11\xff\x0a\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"MEMORY_RECORD": b'\x11\xff\x0a\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
#"MEMORY_RECORD": [
# b'\x11\xff\x0a\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
# b'\x11\xff\x0a\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
#]
}

mediaKeys = {
Expand Down
39 changes: 26 additions & 13 deletions g910_gkeys/misc/memory_leds.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from asyncio import wait_for

import usb
from g910_gkeys.lib.usb_device import USBDevice
from g910_gkeys.misc.logger import Logger
Expand All @@ -6,16 +8,27 @@
def change_profile(device: USBDevice, profile: str):
log = Logger().logger(__name__)
# set memory key led to corresponding profile
try:
device.dev.ctrl_transfer(0x21, 0x09, 0x0211, 1, device.keyboard.events.memoryKeysLEDs[profile], device.usb_timeout)
response = device.dev.read(device.endpoint, device.endpoint.wMaxPacketSize, device.usb_timeout)
return bytes(response) == device.keyboard.events.memoryKeysLEDs[profile]
except usb.core.USBError as e:
if e.errno == 110: # Operation timed out
pass
elif e.errno == 19 or e.errno == 5:
# 19 - No such keyboard
# 5 - Input/Output Error
log.error(f"USBError {e.errno}")
else:
log.exception(e)
record_profile = profile if profile == "MEMORY_RECORD" else "MEMORY_RECORD_OFF"
device.dev.ctrl_transfer(0x21, 0x09, 0x0211, 1, device.keyboard.events.memoryKeysLEDs[profile], device.usb_timeout)
response = device.dev.read(device.endpoint, device.endpoint.wMaxPacketSize, device.usb_timeout)

m_mask = {
"MEMORY_1": 1,
"MEMORY_2": 2,
"MEMORY_3": 4,
"MEMORY_RECORD": 0
}.get(profile, 1)

# (de-)activate M1-M3
packet = bytearray(device.keyboard.events.memoryKeysLEDs["MEMORY_1"])
packet[4] = m_mask
device.dev.ctrl_transfer(0x21, 0x09, 0x0211, 1, bytes(packet), device.usb_timeout)

# wait for previous action to finish
device.dev.read(device.endpoint, device.endpoint.wMaxPacketSize, device.usb_timeout)

# (de-) activate MR
packet = bytearray(device.keyboard.events.memoryKeysLEDs[record_profile])
device.dev.ctrl_transfer(0x21, 0x09, 0x0211, 1, bytes(packet), device.usb_timeout)

return True