mirror of
https://github.com/lowobservable/oec.git
synced 2026-01-26 04:01:49 +00:00
Implement keyboard clicker toggle
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user