118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
# (c) Copyright 2023 by Coinkite Inc. This file is covered by license found in COPYING-CC.
|
|
#
|
|
# Constants for Q1's keyboard.
|
|
#
|
|
# - using ascii internally
|
|
# - but 'key numbers' useful sometimes for some as well
|
|
# - power key is special, not a key (altho implemented in keyboard.py)
|
|
#
|
|
try:
|
|
from micropython import const
|
|
from version import has_qwerty
|
|
except ImportError:
|
|
# this file also used by simulator.py and conftest.py
|
|
const = int
|
|
has_qwerty = True
|
|
|
|
# ascii key codes;
|
|
KEY_NFC = '\x0e' # ctrl-N
|
|
KEY_QR = '\x11' # ctrl-Q
|
|
KEY_TAB = '\t' # tab = ctrl-I
|
|
KEY_ENTER = '\r' # = CR
|
|
KEY_CANCEL = '\x1b' # ESC = Cancel
|
|
KEY_LEFT = '\x03' # ^B = left (incompatible)
|
|
KEY_UP = '\x0b' # ^K = up on ADM-3A
|
|
KEY_RIGHT = '\x0c' # ^L = right on ADM-3A
|
|
KEY_DOWN = '\x0a' # ^J = LF = down on ADM-3A
|
|
|
|
KEY_PAGE_DOWN = '\x18' # ^x
|
|
KEY_PAGE_UP = '\x19' # ^y
|
|
KEY_END = '\x1a' # ^z
|
|
KEY_HOME = '\x1c' # ^\
|
|
|
|
# these meta keys might not be visible to higher layers:
|
|
KEY_LAMP = '\x07' # BELL = ^G
|
|
KEY_SHIFT = '\x01'
|
|
KEY_SPACE = ' '
|
|
KEY_SYMBOL = '\x02'
|
|
KEY_DELETE = '\x08' # ^H = backspace
|
|
KEY_CLEAR = '\x15' # ^U = clear entry
|
|
|
|
# save memory on Mk4
|
|
if has_qwerty:
|
|
|
|
# function keys, filling gaps, running out of space!
|
|
KEY_F1 = '\x0f'
|
|
KEY_F2 = '\x12'
|
|
KEY_F3 = '\x13'
|
|
KEY_F4 = '\x14'
|
|
KEY_F5 = '\x16'
|
|
KEY_F6 = '\x17'
|
|
KEYS_FUNCTION = KEY_F1 + KEY_F2 + KEY_F3 + KEY_F4 + KEY_F5 + KEY_F6
|
|
|
|
NUM_ROWS = const(6)
|
|
NUM_COLS = const(10)
|
|
|
|
# (row, col) => keycode
|
|
# - unused spots are \0
|
|
# - these are unshifted values
|
|
# - ten per row, gaps with zero
|
|
DECODER = (KEY_NFC + KEY_TAB + KEY_QR
|
|
+ KEY_LEFT + KEY_UP + KEY_DOWN + KEY_RIGHT + KEY_CANCEL + KEY_ENTER + '\0'
|
|
+ '1234567890'
|
|
+ 'qwertyuiop'
|
|
+ 'asdfghjkl\''
|
|
+ 'zxcvbnm,./'
|
|
+ KEY_LAMP + KEY_SHIFT + KEY_SPACE + KEY_SYMBOL + KEY_DELETE + '\0\0\0\0\0')
|
|
|
|
# - same when shift is down
|
|
# - make some unmarked combos dead (like shift+UP)
|
|
# - but shift+' can be ", which really should be symb+'
|
|
# - undocumented: shift+DEL => CLEAR
|
|
DECODER_SHIFT = (
|
|
'\0\0\0\0\0\0\0\0\0\0'
|
|
+ '!@#$%^&*()'
|
|
+ 'QWERTYUIOP'
|
|
+ 'ASDFGHJKL"'
|
|
+ 'ZXCVBNM<>?'
|
|
'\0\0\0\0' + KEY_CLEAR + '\0\0\0\0\0' )
|
|
|
|
# in caps mode: numbers unaffected, and also allow meta keys normally
|
|
DECODER_CAPS = (KEY_NFC + KEY_TAB + KEY_QR
|
|
+ KEY_LEFT + KEY_UP + KEY_DOWN + KEY_RIGHT + KEY_CANCEL + KEY_ENTER + '\0'
|
|
+ '1234567890'
|
|
+ 'QWERTYUIOP'
|
|
+ "ASDFGHJKL\'"
|
|
+ 'ZXCVBNM,./'
|
|
+ KEY_LAMP + KEY_SHIFT + KEY_SPACE + KEY_SYMBOL + KEY_DELETE + '\0\0\0\0\0')
|
|
|
|
# when SYMBOL pressed
|
|
# - be nice and allow number+symbol == number+shift
|
|
DECODER_SYMBOL = (KEY_NFC + KEY_TAB + KEY_QR
|
|
+ KEY_HOME + KEY_PAGE_UP + KEY_PAGE_DOWN + KEY_END + KEY_CANCEL + KEY_ENTER + '\0'
|
|
+ '!@#$%^&*()'
|
|
+ '-_`\0\0\0[]{}'
|
|
+ '+\0\0=:;~|\\"'
|
|
+ KEY_F1 + KEY_F2 + KEY_F3 + KEY_F4 + KEY_F5 + KEY_F6 + '\0<>?'
|
|
'\0\0\0\0\0\0\0\0\0\0' )
|
|
|
|
KEYNUM_LAMP = const(50)
|
|
KEYNUM_SHIFT = const(51)
|
|
KEYNUM_SYMBOL = const(53)
|
|
|
|
assert len(DECODER) == NUM_ROWS * NUM_COLS
|
|
assert len(DECODER_SYMBOL) == NUM_ROWS * NUM_COLS
|
|
assert len(DECODER_SHIFT) == NUM_ROWS * NUM_COLS
|
|
assert DECODER[KEYNUM_SHIFT] == KEY_SHIFT
|
|
assert DECODER[KEYNUM_SYMBOL] == KEY_SYMBOL
|
|
assert DECODER[KEYNUM_LAMP] == KEY_LAMP
|
|
|
|
# These affect how 'ux stories' are rendered; they are control
|
|
# characters on the output side of things, not input.
|
|
# - must be first char in line
|
|
OUT_CTRL_TITLE = '\x01' # be a title line
|
|
OUT_CTRL_ADDRESS = '\x02' # it's a payment address
|
|
OUT_CTRL_NOWRAP = '\x03' # do not word wrap this line
|
|
|
|
# EOF
|