You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.3 KiB
Python

"""Touch keyboard."""
class TouchKeyboard(object):
"""Touchscreen keyboard for ILI9341."""
YELLOW = const(65504)
GREEN = const(2016)
KEYS = (
(
('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'),
('a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'),
('\t', 'z', 'x', 'c', 'v', 'b', 'n', 'm', '\b', '\b'),
('\n', ' ', '\r')
),
(
('Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'),
('A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'),
('\t', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '\b', '\b'),
('\n', ' ', '\r')
),
(
('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'),
('@', '#', '$', '%', '^', '&', '*', '(', ')'),
('\f', '+', ',', '.', '-', '_', '!', '?', '\b', '\b'),
('\a', ' ', '\r')
),
(
('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'),
('<', '>', '|', '\\', '/', '{', '}', '[', ']'),
('\f', '=', '"', '\'', ';', ':', '`', '~', '\b', '\b'),
('\a', ' ', '\r')
)
)
def __init__(self, display, font):
"""Initialize Keybaord.
Args:
display (Display class): LCD Display
font (XglcdFont class): Font to display text above keyboard
"""
self.display = display
self.font = font
self.kb_screen = 0
self.kb_text = ''
self.load_keyboard()
self.waiting = False
self.locked = False
def clear_text(self):
"""Clear the keyboard text."""
self.display.fill_hrect(0, 11, self.display.width, 24, 0)
self.kb_text = ''
def handle_keypress(self, x, y, debug=False):
"""Get pressed key.
Args:
x, y (int): Pressed screen coordinates.
Returns:
bool: True indicates return pressed otherwise False
"""
if self.locked is True:
return
if self.waiting is True:
self.clear_text()
self.waiting = False
return
x, y = y, x # Touch coordinates need to be swapped.
if debug:
self.display.fill_circle(x, y, 5, self.GREEN)
# Calculate keyboard row and column
if y >= 47: # Check if press within keyboard area
row = int(y / 47) - 1
if row == 0:
column = int(x/32)
elif row == 1 or row == 2:
column = max(0, int((x-16)/32))
else:
# Row 3
if x < 80:
column = 0
elif x > 240:
column = 2
else:
column = 1
key = self.KEYS[self.kb_screen][row][column]
if key == '\t':
self.kb_screen ^= 1 # Toggle caps
self.load_keyboard()
elif key == '\f':
self.kb_screen = self.kb_screen - 2 ^ 1 + 2 # Toggle symbols
self.load_keyboard()
elif key == '\a':
self.kb_screen = 0 # Letters
self.load_keyboard()
elif key == '\n':
self.kb_screen = 2 # Numbers & symbols
self.load_keyboard()
elif key == '\b': # Backspace
self.kb_text = self.kb_text[:-1]
margin = self.font.measure_text(self.kb_text)
self.display.fill_vrect(margin, 11, 12, 24, 0)
elif key == '\r':
# Keyboard return pressed
if self.kb_text != '':
return True
else:
margin = self.font.measure_text(self.kb_text)
self.kb_text += key
self.display.draw_letter(margin, 11, key, self.font,
self.YELLOW)
return False
def load_keyboard(self):
"""Display the currently selected keyboard."""
self.display.draw_image('images/kb{0}.raw'.format(self.kb_screen),
0, 47, 320, 192)
def show_message(self, msg, color):
"""Display message above keyboard."""
self.clear_text()
msg_length = self.font.measure_text(msg)
margin = (self.display.width - msg_length) // 2
self.display.draw_text(margin, 11, msg, self.font, color)