diff --git a/oec/controller.py b/oec/controller.py index 4e80653..b08a4b3 100644 --- a/oec/controller.py +++ b/oec/controller.py @@ -9,6 +9,7 @@ from coax import poll, poll_ack, PollAction, KeystrokePollResponse, ReceiveTimeo ReceiveError, ProtocolError from .terminal import Terminal, read_terminal_ids +from .keyboard import Key from .session import SessionDisconnectedError class Controller: @@ -155,7 +156,9 @@ class Controller: if not key: return - if self.session: + if key == Key.CLICKER: + self.terminal.keyboard.clicker = not self.terminal.keyboard.clicker + elif self.session: self.session.handle_key(key, modifiers, scan_code) def _poll(self): diff --git a/oec/keyboard.py b/oec/keyboard.py index ee05614..7c7c0c3 100644 --- a/oec/keyboard.py +++ b/oec/keyboard.py @@ -114,7 +114,7 @@ class Key(Enum): CURSOR_SELECT = 402 CURSOR_BLINK = 403 ERASE_EOF = 404 - VOLUME = 405 + CLICKER = 405 ALT_CURSOR = 406 IDENT = 407 @@ -303,6 +303,8 @@ class Keyboard: self.modifier_release = False + self.clicker = False + def get_key(self, scan_code): """Map a scan code to key and update modifiers state.""" key = self.keymap.default.get(scan_code) diff --git a/oec/keymap_3278_2.py b/oec/keymap_3278_2.py index 4893dbd..b18f2b1 100644 --- a/oec/keymap_3278_2.py +++ b/oec/keymap_3278_2.py @@ -14,7 +14,7 @@ KEYMAP_DEFAULT = { 84: Key.CURSOR_BLINK, 85: Key.ERASE_EOF, 86: Key.PRINT, - 87: Key.VOLUME, + 87: Key.CLICKER, # First Row 61: Key.BACKTICK, diff --git a/oec/terminal.py b/oec/terminal.py index c7867b9..d8c1bd3 100644 --- a/oec/terminal.py +++ b/oec/terminal.py @@ -70,6 +70,7 @@ class Terminal: self.keyboard = Keyboard(keymap) self.alarm = False + self.last_poll_keyboard_clicker = None def sound_alarm(self): self.alarm = True @@ -80,4 +81,9 @@ class Terminal: return PollAction.ALARM + if self.keyboard.clicker != self.last_poll_keyboard_clicker: + self.last_poll_keyboard_clicker = self.keyboard.clicker + + return PollAction.ENABLE_KEYBOARD_CLICKER if self.keyboard.clicker else PollAction.DISABLE_KEYBOARD_CLICKER + return PollAction.NONE diff --git a/tests/test_controller.py b/tests/test_controller.py index 1250eac..390c442 100644 --- a/tests/test_controller.py +++ b/tests/test_controller.py @@ -114,6 +114,25 @@ class RunLoopTestCase(unittest.TestCase): self.assertFalse(self.controller.terminal.alarm) + def test_clicker_toggle(self): + self._assert_run_loop(0, PowerOnResetCompletePollResponse(0xa), 0, True) + + self.assertFalse(self.controller.terminal.keyboard.clicker) + + self._assert_run_loop(0, KeystrokePollResponse(0b0101011110), 0, True) + self._assert_run_loop(0, None, 0, False) + + self.assertTrue(self.controller.terminal.keyboard.clicker) + + self.assertEqual(self.poll_mock.call_args[0][1], PollAction.ENABLE_KEYBOARD_CLICKER) + + self._assert_run_loop(0.5, KeystrokePollResponse(0b0101011110), 0.5, True) + self._assert_run_loop(1, None, 0, False) + + self.assertFalse(self.controller.terminal.keyboard.clicker) + + self.assertEqual(self.poll_mock.call_args[0][1], PollAction.DISABLE_KEYBOARD_CLICKER) + def _assert_run_loop(self, poll_time, poll_response, expected_delay, expected_poll_ack): # Arrange self.poll_mock.side_effect = [poll_response]