From c98bc506e2603edad3c1ef2120bffef2cad8d5b0 Mon Sep 17 00:00:00 2001 From: June Tate-Gans Date: Sat, 8 May 2021 19:28:07 -0500 Subject: [PATCH] g13: Change Manager's name to DeviceManager --- g13gui/g13gui/g13/manager.py | 63 +++++++++++++++-------- g13gui/g13gui/g13/manager_mapping_test.py | 4 +- g13gui/g13gui/g13/manager_tests.py | 10 ++-- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/g13gui/g13gui/g13/manager.py b/g13gui/g13gui/g13/manager.py index 3d7b861..16874f7 100644 --- a/g13gui/g13gui/g13/manager.py +++ b/g13gui/g13gui/g13/manager.py @@ -16,7 +16,9 @@ from evdev import ecodes as e from g13gui.observer.observer import Observer from g13gui.model.bindings import StickMode from g13gui.g13.common import G13NormalKeys +from g13gui.g13.common import G13AppletKeys from g13gui.g13.common import G13SpecialKeys +from g13gui.applet.manager import AppletManager class G13Endpoints(enum.Enum): @@ -48,7 +50,7 @@ class StateError(RuntimeError): pass -class Manager(threading.Thread, Observer): +class DeviceManager(threading.Thread, Observer): class State(enum.Enum): DISCOVERING = 0 FOUND = 1 @@ -59,7 +61,7 @@ class Manager(threading.Thread, Observer): Observer.__init__(self) self._prefs = prefs - self._state = Manager.State.DISCOVERING + self._state = DeviceManager.State.DISCOVERING self._device = None self._uinput = UInput(UINPUT_KEYBOARD_CAPS, name='G13 Keyboard', @@ -70,6 +72,8 @@ class Manager(threading.Thread, Observer): self._commandQueue = queue.Queue() self._lastProfile = None + self._appletManager = AppletManager(self) + self._prefs.registerObserver(self, {'selectedProfile'}) self._updateProfileRegistration() self.changeTrigger(self.onSelectedProfileChanged, @@ -85,15 +89,14 @@ class Manager(threading.Thread, Observer): self._lastProfile.registerObserver(self, {'lcdColor'}) def onSelectedProfileChanged(self, subject, changeType, key, data): - print('onSelectedProfileChanged') self._updateProfileRegistration() - if self._state == Manager.State.FOUND: + if self._state == DeviceManager.State.FOUND: self._updateLcdColor() def onLcdColorChanged(self, subject, changeType, key, data): print('onLcdColorChanged') - if self._state == Manager.State.FOUND: + if self._state == DeviceManager.State.FOUND: self._updateLcdColor() def _updateLcdColor(self): @@ -105,10 +108,6 @@ class Manager(threading.Thread, Observer): def state(self): return self._state - def _ensureState(self, state): - if self._state != state: - raise StateError() - def _reset(self): try: self._device.reset() @@ -124,9 +123,9 @@ class Manager(threading.Thread, Observer): if self._device: self._reset() - self._state = Manager.State.DISCOVERING + self._state = DeviceManager.State.DISCOVERING - while self._state == Manager.State.DISCOVERING: + while self._state == DeviceManager.State.DISCOVERING: try: while not self._device: self._device = usb.core.find(idVendor=VENDOR_ID, @@ -144,7 +143,7 @@ class Manager(threading.Thread, Observer): traceback.print_exc() self._reset() else: - self._state = Manager.State.FOUND + self._state = DeviceManager.State.FOUND def _readKeys(self, buffer): # Apparently an "interrupt" read with the G13 "times out" if no keys @@ -173,7 +172,9 @@ class Manager(threading.Thread, Observer): leds: a bitwise-or'd bitfield of LEDBits. Set is on. """ - self._ensureState(Manager.State.FOUND) + if self.state != DeviceManager.State.FOUND: + return + self._commandQueue.put([self._setLedsMode, (leds,)]) def _setLedsMode(self, leds): @@ -191,7 +192,9 @@ class Manager(threading.Thread, Observer): r, g, b: byte values between 0-255 """ - self._ensureState(Manager.State.FOUND) + if self.state != DeviceManager.State.FOUND: + return + self._commandQueue.put([self._setBacklightColor, (r, g, b)]) def _setBacklightColor(self, r, g, b): @@ -208,7 +211,9 @@ class Manager(threading.Thread, Observer): Note: buffer must be a byte array containing an LPBM formatted image. IOW, each byte represents one vertical row of 8 pixels each. """ - self._ensureState(Manager.State.FOUND) + if self.state != DeviceManager.State.FOUND: + return + self._commandQueue.put([self._setLCDBuffer, (buffer,)]) def _setLCDBuffer(self, buffer): @@ -231,30 +236,33 @@ class Manager(threading.Thread, Observer): def run(self): reportBuffer = usb.util.create_buffer(REPORT_SIZE) - while self._state != Manager.State.SHUTDOWN: + while self._state != DeviceManager.State.SHUTDOWN: print('Discovering devices') self._discover() print('Got device') self._updateLcdColor() + self._appletManager.onPresent() - while self._state == Manager.State.FOUND: + while self._state == DeviceManager.State.FOUND: try: count = self._readKeys(reportBuffer) if count == REPORT_SIZE: self._synthesizeKeys(reportBuffer) + self._signalSpecialKeys(reportBuffer) self._synthesizeStick(reportBuffer) self._uinput.syn() self._processCommands() except usb.core.USBError as err: - print('Unexpected error occurred: %s' % err) + if self._state != DeviceManager.State.SHUTDOWN: + print('Unexpected error occurred: %s' % err) break print('Shutting down') - if self._device and self._state == Manager.State.FOUND: + if self._device and self._state == DeviceManager.State.FOUND: self._reset() def _synthesizeStick(self, report): @@ -304,16 +312,29 @@ class Manager(threading.Thread, Observer): self._lastKeyState[key] = nowPressed - def signalSpecialKeys(self, report): + def _signalSpecialKeys(self, report): + for key in G13AppletKeys: + wasPressed = self._lastKeyState.get(key, False) + nowPressed = key.testReport(report) + + # Emit special keypress if and only if it was released + if wasPressed and not nowPressed: + self._appletManager.onKeyReleased(key) + elif not wasPressed and nowPressed: + self._appletManager.onKeyPressed(key) + + self._lastKeyState[key] = nowPressed + for key in G13SpecialKeys: wasPressed = self._lastKeyState.get(key, False) nowPressed = key.testReport(report) # Emit special keypress if and only if it was released if wasPressed and not nowPressed: + # check for MR, allow for key record this way pass self._lastKeyState[key] = nowPressed def shutdown(self): - self._state = Manager.State.SHUTDOWN + self._state = DeviceManager.State.SHUTDOWN diff --git a/g13gui/g13gui/g13/manager_mapping_test.py b/g13gui/g13gui/g13/manager_mapping_test.py index a186ba3..3303748 100644 --- a/g13gui/g13gui/g13/manager_mapping_test.py +++ b/g13gui/g13gui/g13/manager_mapping_test.py @@ -1,8 +1,8 @@ from g13gui.model.prefs import Preferences -from g13gui.g13.manager import Manager +from g13gui.g13.manager import DeviceManager if __name__ == '__main__': prefs = Preferences() - manager = Manager(prefs) + manager = DeviceManager(prefs) manager.run() diff --git a/g13gui/g13gui/g13/manager_tests.py b/g13gui/g13gui/g13/manager_tests.py index f07b421..055cc45 100644 --- a/g13gui/g13gui/g13/manager_tests.py +++ b/g13gui/g13gui/g13/manager_tests.py @@ -6,20 +6,20 @@ import usb.util from g13gui.observer.observer import ObserverTestCase from g13gui.model.prefs import Preferences -from g13gui.g13.manager import Manager +from g13gui.g13.manager import DeviceManager from g13gui.g13.manager import LCD_BUFFER_SIZE -class G13ManagerTests(ObserverTestCase): +class DeviceManagerTests(ObserverTestCase): def setUp(self): prefs = Preferences() - self.m = Manager(prefs) + self.m = DeviceManager(prefs) self.m.start() - while self.m.state != Manager.State.FOUND: + while self.m.state != DeviceManager.State.FOUND: time.sleep(1) - self.assertEqual(self.m.state, Manager.State.FOUND) + self.assertEqual(self.m.state, DeviceManager.State.FOUND) def tearDown(self): self.m.shutdown()