lowobservable.oec/oec/terminal.py

82 lines
2.4 KiB
Python

"""
oec.terminal
~~~~~~~~~~~~
"""
import time
import logging
from coax import read_terminal_id, read_extended_id, ReceiveError, ProtocolError
from .display import Dimensions, Display
from .keyboard import Keyboard
from .keymap_3278_2 import KEYMAP as KEYMAP_3278_2
from .keymap_3483 import KEYMAP as KEYMAP_3483
logger = logging.getLogger(__name__)
MODEL_DIMENSIONS = {
2: Dimensions(24, 80),
3: Dimensions(32, 80),
4: Dimensions(43, 80),
5: Dimensions(27, 132)
}
def get_dimensions(terminal_id, extended_id):
"""Get terminal display dimensions."""
if not terminal_id.model in MODEL_DIMENSIONS:
raise ValueError(f'Model {terminal_id.model} is not supported')
return MODEL_DIMENSIONS[terminal_id.model]
def get_keymap(terminal_id, extended_id):
"""Get terminal keymap."""
keymap = KEYMAP_3278_2
if extended_id == 'c1348300':
keymap = KEYMAP_3483
return keymap
def read_terminal_ids(interface, extended_id_retry_attempts=3):
terminal_id = None
extended_id = None
try:
terminal_id = read_terminal_id(interface)
except ReceiveError as error:
logger.warning(f'READ_TERMINAL_ID receive error: {error}', exc_info=error)
except ProtocolError as error:
logger.warning(f'READ_TERMINAL_ID protocol error: {error}', exc_info=error)
# Retry the READ_EXTENDED_ID command as it appears to fail frequently on the
# first request - unlike the READ_TERMINAL_ID command,
extended_id = None
for attempt in range(extended_id_retry_attempts):
try:
extended_id = read_extended_id(interface)
break
except ReceiveError as error:
logger.warning(f'READ_EXTENDED_ID receive error: {error}', exc_info=error)
except ProtocolError as error:
logger.warning(f'READ_EXTENDED_ID protocol error: {error}', exc_info=error)
time.sleep(0.25)
return (terminal_id, extended_id.hex() if extended_id is not None else None)
class Terminal:
"""Terminal information and devices."""
def __init__(self, interface, terminal_id, extended_id):
self.interface = interface
self.terminal_id = terminal_id
self.extended_id = extended_id
dimensions = get_dimensions(self.terminal_id, self.extended_id)
keymap = get_keymap(self.terminal_id, self.extended_id)
self.display = Display(interface, dimensions)
self.keyboard = Keyboard(keymap)