333 lines
10 KiB
Python
333 lines
10 KiB
Python
import time
|
|
import board
|
|
import math
|
|
import random
|
|
import busio
|
|
from digitalio import DigitalInOut, Direction, Pull
|
|
import displayio
|
|
from vectorio import Rectangle, Circle, Polygon
|
|
from adafruit_display_text import label
|
|
from adafruit_bitmap_font import bitmap_font
|
|
import gc9a01
|
|
import usb_hid
|
|
from characters import characters
|
|
from adafruit_hid.keyboard import Keyboard
|
|
from adafruit_hid.keycode import Keycode
|
|
|
|
kbd = Keyboard(usb_hid.devices)
|
|
|
|
|
|
font = bitmap_font.load_font("fonts/VictorMonoNerdFont-SemiBoldItalic-32.pcf")
|
|
|
|
displayio.release_displays()
|
|
|
|
mode_labels = [
|
|
["Letters", "Words", "Predictive"],
|
|
["Lettres", "Mots", "Predictif"]
|
|
]
|
|
language_labels = ["English", "Francais"]
|
|
backlight_labels = ["Backlight", "Retroeclairage"]
|
|
|
|
tft_clk = board.GP2
|
|
tft_mosi= board.GP3
|
|
tft_rst = board.GP4
|
|
tft_dc = board.GP1
|
|
tft_cs = board.GP0
|
|
|
|
tft_bl = DigitalInOut(board.GP5)
|
|
tft_bl.direction = Direction.OUTPUT
|
|
tft_bl.value = True
|
|
|
|
key0 = DigitalInOut(board.GP6)
|
|
key0.pull = Pull.UP
|
|
key1 = DigitalInOut(board.GP7)
|
|
key1.pull = Pull.UP
|
|
key2 = DigitalInOut(board.GP8)
|
|
key2.pull = Pull.UP
|
|
key3 = DigitalInOut(board.GP9)
|
|
key3.pull = Pull.UP
|
|
key4 = DigitalInOut(board.GP10)
|
|
key4.pull = Pull.UP
|
|
key5 = DigitalInOut(board.GP11)
|
|
key5.pull = Pull.UP
|
|
key6 = DigitalInOut(board.GP12)
|
|
key6.pull = Pull.UP
|
|
|
|
spi = busio.SPI(clock=tft_clk, MOSI=tft_mosi)
|
|
|
|
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst)
|
|
display = gc9a01.GC9A01(display_bus, width=240, height=240)
|
|
|
|
main_display = displayio.Group()
|
|
display.root_group = main_display
|
|
|
|
label_position_radius = 90
|
|
|
|
top_text = label.Label(
|
|
font,
|
|
text=" "*10,
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
top = displayio.Group(scale=1)
|
|
top.x, top.y = 120, 50
|
|
top.append(top_text)
|
|
main_display.append(top)
|
|
|
|
middle_text = label.Label(
|
|
font,
|
|
text=" "*8,
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
middle = displayio.Group(scale=1)
|
|
middle.x, middle.y = 120, 110
|
|
middle.append(middle_text)
|
|
main_display.append(middle)
|
|
|
|
bottom_text = label.Label(
|
|
font,
|
|
text=" "*14,
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
bottom = displayio.Group(scale=1)
|
|
bottom.x, bottom.y = 120, 170
|
|
bottom.append(bottom_text)
|
|
main_display.append(bottom)
|
|
|
|
key0_text = label.Label(
|
|
font,
|
|
text = " ",
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
key0_colour = (219, 97, 71)
|
|
key0_palette = displayio.Palette(1)
|
|
key0_palette[0] = (0, 0, 0)
|
|
key0_display = displayio.Group(scale=1)
|
|
key0_angle = - 2. * math.pi / 3.
|
|
key0_display.x = int(120 + label_position_radius * math.sin(key0_angle))
|
|
key0_display.y = int(120 - label_position_radius * math.cos(key0_angle))
|
|
key0_display.append(key0_text)
|
|
main_display.append(Circle(pixel_shader=key0_palette, radius=16, x=key0_display.x, y=key0_display.y))
|
|
main_display.append(key0_display)
|
|
|
|
key1_text = label.Label(
|
|
font,
|
|
text = " ",
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
key1_colour = (100, 150, 40)
|
|
key1_palette = displayio.Palette(1)
|
|
key1_palette[0] = (0, 0, 0)
|
|
key1_display = displayio.Group(scale=1)
|
|
key1_angle = - math.pi / 3.
|
|
key1_display.x = int(120 + label_position_radius * math.sin(key1_angle))
|
|
key1_display.y = int(120 - label_position_radius * math.cos(key1_angle))
|
|
key1_display.append(key1_text)
|
|
main_display.append(Circle(pixel_shader=key1_palette, radius=16, x=key1_display.x, y=key1_display.y))
|
|
main_display.append(key1_display)
|
|
|
|
key2_text = label.Label(
|
|
font,
|
|
text = " ",
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
key2_colour = (40, 150, 100)
|
|
key2_palette = displayio.Palette(1)
|
|
key2_palette[0] = (0, 0, 0)
|
|
key2_display = displayio.Group(scale=1)
|
|
key2_angle = 0
|
|
key2_display.x = int(120 + label_position_radius * math.sin(key2_angle))
|
|
key2_display.y = int(120 - label_position_radius * math.cos(key2_angle))
|
|
key2_display.append(key2_text)
|
|
main_display.append(Circle(pixel_shader=key2_palette, radius=16, x=key2_display.x, y=key2_display.y))
|
|
main_display.append(key2_display)
|
|
|
|
key3_text = label.Label(
|
|
font,
|
|
text = " ",
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
key3_colour = (100, 40, 150)
|
|
key3_palette = displayio.Palette(1)
|
|
key3_palette[0] = (0, 0, 0)
|
|
key3_display = displayio.Group(scale=1)
|
|
key3_angle = math.pi / 3.
|
|
key3_display.x = int(120 + label_position_radius * math.sin(key3_angle))
|
|
key3_display.y = int(120 - label_position_radius * math.cos(key3_angle))
|
|
key3_display.append(key3_text)
|
|
main_display.append(Circle(pixel_shader=key3_palette, radius=16, x=key3_display.x, y=key3_display.y))
|
|
main_display.append(key3_display)
|
|
|
|
key4_text = label.Label(
|
|
font,
|
|
text = " ",
|
|
color=0xffffff,
|
|
anchor_point=(0.5, 0.5),
|
|
anchored_position=(0, 0)
|
|
)
|
|
key4_colour = (40, 40, 150)
|
|
key4_palette = displayio.Palette(1)
|
|
key4_palette[0] = (0, 0, 0)
|
|
key4_display = displayio.Group(scale=1)
|
|
key4_angle = 2. * math.pi / 3.
|
|
key4_display.x = int(120 + label_position_radius * math.sin(key4_angle))
|
|
key4_display.y = int(120 - label_position_radius * math.cos(key4_angle))
|
|
key4_display.append(key4_text)
|
|
main_display.append(Circle(pixel_shader=key4_palette, radius=16, x=key4_display.x, y=key4_display.y))
|
|
main_display.append(key4_display)
|
|
|
|
key5_colour = (0, 100, 30)
|
|
key5_palette = displayio.Palette(1)
|
|
key5_palette[0] = (0, 0, 0)
|
|
main_display.append(Circle(pixel_shader=key5_palette, radius=16, x=120-32, y=120))
|
|
|
|
key6_colour = (15, 100, 200)
|
|
key6_palette = displayio.Palette(1)
|
|
key6_palette[0] = (0, 0, 0)
|
|
main_display.append(Circle(pixel_shader=key6_palette, radius=16, x=120+32, y=120))
|
|
|
|
def swap_to_settings_display():
|
|
key0_text.text = ""
|
|
key1_text.text = ""
|
|
key2_text.text = ""
|
|
key3_text.text = ""
|
|
key4_text.text = ""
|
|
|
|
def settings_display(mode, language, location):
|
|
print(mode, language, location, mode_labels[language][mode])
|
|
display.refresh()
|
|
top_text.text = mode_labels[language][mode]
|
|
top_text.color = 0x1c4d2d if location == 0 else 0xffffff
|
|
middle_text.text = language_labels[language]
|
|
middle_text.color = 0x1c4d2d if location == 1 else 0xffffff
|
|
bottom_text.text = backlight_labels[language]
|
|
bottom_text.color = 0x1c4d2d if location == 2 else 0xffffff
|
|
|
|
def swap_to_character_display():
|
|
top_text.text = ""
|
|
middle_text.text = ""
|
|
bottom_text.text = ""
|
|
|
|
def edit_character(pin, character, key_text, key_palette, colour):
|
|
if pin is 0:
|
|
key_palette[0] = (0, 0, 0)
|
|
if character is None:
|
|
key_text.text = ""
|
|
else:
|
|
key_text.text = character
|
|
else:
|
|
key_text.text = ""
|
|
key_palette[0] = colour
|
|
|
|
def character_display(pin0, pin1, pin2, pin3, pin4, selection):
|
|
display.refresh()
|
|
edit_character(pin0, characters[1][pin1][pin2][pin3][pin4][selection], key0_text, key0_palette, key0_colour)
|
|
edit_character(pin1, characters[pin0][1][pin2][pin3][pin4][selection], key1_text, key1_palette, key1_colour)
|
|
edit_character(pin2, characters[pin0][pin1][1][pin3][pin4][selection], key2_text, key2_palette, key2_colour)
|
|
edit_character(pin3, characters[pin0][pin1][pin2][1][pin4][selection], key3_text, key3_palette, key3_colour)
|
|
edit_character(pin4, characters[pin0][pin1][pin2][pin3][1][selection], key4_text, key4_palette, key4_colour)
|
|
|
|
def mode_display(selection):
|
|
if selection is 0:
|
|
key5_palette[0] = (0, 0, 0)
|
|
key6_palette[0] = (0, 0, 0)
|
|
elif selection is 1:
|
|
key5_palette[0] = key5_colour
|
|
key6_palette[0] = (0, 0, 0)
|
|
elif selection is 2:
|
|
key5_palette[0] = (0, 0, 0)
|
|
key6_palette[0] = key6_colour
|
|
elif selection is 3:
|
|
key5_palette[0] = key5_colour
|
|
key6_palette[0] = key6_colour
|
|
|
|
def pressed(key):
|
|
return not key.value
|
|
|
|
def poll():
|
|
return [pressed(key0), pressed(key1), pressed(key2), pressed(key3), pressed(key4), pressed(key5), pressed(key6)]
|
|
|
|
def main():
|
|
for selection in range(4):
|
|
mode_display(selection)
|
|
character_display(0, 0, 0, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 0, 0, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 0, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 1, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 0, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 0, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 0, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 1, 0, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 0, 0, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 0, 0, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 1, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 0, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 0, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 1, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 1, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 1, 0, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 0, 1, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 0, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 0, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 1, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 1, 1, 0, selection)
|
|
time.sleep(1)
|
|
character_display(1, 1, 1, 0, 0, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 1, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 1, 1, 0, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 1, 0, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 0, 1, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(0, 1, 1, 1, 1, selection)
|
|
time.sleep(1)
|
|
character_display(1, 1, 1, 1, 1, selection)
|
|
time.sleep(1)
|
|
tft_bl.value = False
|
|
while True:
|
|
pass
|
|
# keypresses = poll()
|
|
# if any(keypresses):
|
|
# kbd.send(Keycode.A)
|
|
# time.sleep(1)
|
|
|
|
|
|
|
|
main()
|