Implement keyboard clicker toggle

This commit is contained in:
Andrew Kay
2019-12-27 19:15:44 -06:00
parent d02f9844a4
commit 86fbbdfd29
5 changed files with 33 additions and 3 deletions

View File

@@ -9,6 +9,7 @@ from coax import poll, poll_ack, PollAction, KeystrokePollResponse, ReceiveTimeo
ReceiveError, ProtocolError ReceiveError, ProtocolError
from .terminal import Terminal, read_terminal_ids from .terminal import Terminal, read_terminal_ids
from .keyboard import Key
from .session import SessionDisconnectedError from .session import SessionDisconnectedError
class Controller: class Controller:
@@ -155,7 +156,9 @@ class Controller:
if not key: if not key:
return 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) self.session.handle_key(key, modifiers, scan_code)
def _poll(self): def _poll(self):

View File

@@ -114,7 +114,7 @@ class Key(Enum):
CURSOR_SELECT = 402 CURSOR_SELECT = 402
CURSOR_BLINK = 403 CURSOR_BLINK = 403
ERASE_EOF = 404 ERASE_EOF = 404
VOLUME = 405 CLICKER = 405
ALT_CURSOR = 406 ALT_CURSOR = 406
IDENT = 407 IDENT = 407
@@ -303,6 +303,8 @@ class Keyboard:
self.modifier_release = False self.modifier_release = False
self.clicker = False
def get_key(self, scan_code): def get_key(self, scan_code):
"""Map a scan code to key and update modifiers state.""" """Map a scan code to key and update modifiers state."""
key = self.keymap.default.get(scan_code) key = self.keymap.default.get(scan_code)

View File

@@ -14,7 +14,7 @@ KEYMAP_DEFAULT = {
84: Key.CURSOR_BLINK, 84: Key.CURSOR_BLINK,
85: Key.ERASE_EOF, 85: Key.ERASE_EOF,
86: Key.PRINT, 86: Key.PRINT,
87: Key.VOLUME, 87: Key.CLICKER,
# First Row # First Row
61: Key.BACKTICK, 61: Key.BACKTICK,

View File

@@ -70,6 +70,7 @@ class Terminal:
self.keyboard = Keyboard(keymap) self.keyboard = Keyboard(keymap)
self.alarm = False self.alarm = False
self.last_poll_keyboard_clicker = None
def sound_alarm(self): def sound_alarm(self):
self.alarm = True self.alarm = True
@@ -80,4 +81,9 @@ class Terminal:
return PollAction.ALARM 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 return PollAction.NONE

View File

@@ -114,6 +114,25 @@ class RunLoopTestCase(unittest.TestCase):
self.assertFalse(self.controller.terminal.alarm) 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): def _assert_run_loop(self, poll_time, poll_response, expected_delay, expected_poll_ack):
# Arrange # Arrange
self.poll_mock.side_effect = [poll_response] self.poll_mock.side_effect = [poll_response]