keychord.py/code.py

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()