From 535793fcf89eb5ceae0e80cf2679bb16e9d5f212 Mon Sep 17 00:00:00 2001 From: Makoto Shimazu Date: Tue, 11 Sep 2018 10:23:58 +0900 Subject: [PATCH 1/2] Read ANSI escape codes by KeyboardRecorderFromConsole --- mozc-nazoru/src/nazoru/bluetooth.py | 3 +++ mozc-nazoru/src/nazoru/keyboard_recorder.py | 26 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/mozc-nazoru/src/nazoru/bluetooth.py b/mozc-nazoru/src/nazoru/bluetooth.py index db0418a..3f900ae 100644 --- a/mozc-nazoru/src/nazoru/bluetooth.py +++ b/mozc-nazoru/src/nazoru/bluetooth.py @@ -54,4 +54,7 @@ class Bluetooth(): if cmd not in self.UART_CODES: print('Unknown Command: {}'.format(cmd)) return + if self._dummy: + print('bluetooth: command({})'.format(cmd)) + return self.send(struct.pack('b', self.UART_CODES[cmd])) diff --git a/mozc-nazoru/src/nazoru/keyboard_recorder.py b/mozc-nazoru/src/nazoru/keyboard_recorder.py index c889797..6c489e4 100644 --- a/mozc-nazoru/src/nazoru/keyboard_recorder.py +++ b/mozc-nazoru/src/nazoru/keyboard_recorder.py @@ -73,6 +73,24 @@ class KeyboardRecorderFromConsole(KeyboardRecorder): KeyboardRecorder.__init__(self, verbose) self.log('Input from console') + def _read_ansi_escape(self): + seq = sys.stdin.read(1) + if seq == '[': + code = sys.stdin.read(1) + self.log('CSI code: {}'.format(code)) + if code == 'A': + return (None, 'KEY_UP') + if code == 'B': + return (None, 'KEY_DOWN') + if code == 'C': + return (None, 'KEY_RIGHT') + if code == 'D': + return (None, 'KEY_LEFT') + self.log('it was unknown code...') + else: + self.log('unknown seq: {}'.format(seq)) + return (None, None) + def record(self): """ Returns a tuple of |data| and |command|. @@ -93,8 +111,12 @@ class KeyboardRecorderFromConsole(KeyboardRecorder): key = None finally: now = datetime.datetime.now() - if key == '\n': - return (None, None) + if key == '\x1b': + return self._read_ansi_escape(); + elif key == '\n': + return (None, 'KEY_ENTER') + elif key == '\b' or key == '\x7f': + return (None, 'KEY_BACKSPACE') elif key: if not recording: recording = True From 8ced8527c93c4c1af5255f5e960ddd36ec0e5c14 Mon Sep 17 00:00:00 2001 From: Makoto Shimazu Date: Tue, 11 Sep 2018 10:46:27 +0900 Subject: [PATCH 2/2] Add DELETE --- mozc-nazoru/src/nazoru/bluetooth.py | 1 + mozc-nazoru/src/nazoru/keyboard_recorder.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mozc-nazoru/src/nazoru/bluetooth.py b/mozc-nazoru/src/nazoru/bluetooth.py index 3f900ae..aa917e3 100644 --- a/mozc-nazoru/src/nazoru/bluetooth.py +++ b/mozc-nazoru/src/nazoru/bluetooth.py @@ -42,6 +42,7 @@ class Bluetooth(): # See http://ww1.microchip.com/downloads/en/DeviceDoc/bluetooth_cr_UG-v1.0r.pdf # for detail. UART_CODES = { + 'KEY_DELETE': 4, 'KEY_RIGHT': 7, 'KEY_BACKSPACE': 8, 'KEY_ENTER': 10, diff --git a/mozc-nazoru/src/nazoru/keyboard_recorder.py b/mozc-nazoru/src/nazoru/keyboard_recorder.py index 6c489e4..ea64aef 100644 --- a/mozc-nazoru/src/nazoru/keyboard_recorder.py +++ b/mozc-nazoru/src/nazoru/keyboard_recorder.py @@ -76,8 +76,13 @@ class KeyboardRecorderFromConsole(KeyboardRecorder): def _read_ansi_escape(self): seq = sys.stdin.read(1) if seq == '[': + # CSI code + # ['\e', '[', Rep (optional), Code] code = sys.stdin.read(1) - self.log('CSI code: {}'.format(code)) + rep = 1 + if code.isdigit(): + rep = int(code) + code = sys.stdin.read(1) if code == 'A': return (None, 'KEY_UP') if code == 'B': @@ -86,7 +91,11 @@ class KeyboardRecorderFromConsole(KeyboardRecorder): return (None, 'KEY_RIGHT') if code == 'D': return (None, 'KEY_LEFT') - self.log('it was unknown code...') + if code == '~': + if rep == 3: + return (None, 'KEY_DELETE') + self.log('it was unknown code: ' + + 'rep={}, code={}'.format(rep, code)) else: self.log('unknown seq: {}'.format(seq)) return (None, None)