import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from keyboard_layout_jp import KeyboardLayoutJP
from time import sleep
import board
import busio

keyboard = Keyboard(usb_hid.devices)
#layout = KeyboardLayoutUS(keyboard)
layout = KeyboardLayoutJP(keyboard)
uart = busio.UART(tx=board.GP0, rx=board.GP1, baudrate=115200, receiver_buffer_size=16384)
esc = False
while True:
    data = uart.read(1)
    if data is not None:
        k=data[0]
        #sleep(0.05)
        if esc:
            str += chr(k)
            if str == "[A":
                keyboard.send(Keycode.UP_ARROW)
                esc = False
            elif str == "[B":
                keyboard.send(Keycode.DOWN_ARROW)
                esc = False
            elif str == "[C":
                keyboard.send(Keycode.RIGHT_ARROW)
                esc = False
            elif str == "[D":
                keyboard.send(Keycode.LEFT_ARROW)
                esc = False
            elif str == "[E":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.UP_ARROW)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[F":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.DOWN_ARROW)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[G":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.RIGHT_ARROW)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[H":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.LEFT_ARROW)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[O":
                keyboard.press(Keycode.LEFT_CONTROL)
                keyboard.send(Keycode.UP_ARROW)
                keyboard.release(Keycode.LEFT_CONTROL)
                esc = False
            elif str == "[P":
                keyboard.press(Keycode.LEFT_CONTROL)
                keyboard.send(Keycode.DOWN_ARROW)
                keyboard.release(Keycode.LEFT_CONTROL)
                esc = False
            elif str == "[Q":
                keyboard.press(Keycode.LEFT_CONTROL)
                keyboard.send(Keycode.RIGHT_ARROW)
                keyboard.release(Keycode.LEFT_CONTROL)
                esc = False
            elif str == "[R":
                keyboard.press(Keycode.LEFT_CONTROL)
                keyboard.send(Keycode.LEFT_ARROW)
                keyboard.release(Keycode.LEFT_CONTROL)
                esc = False
            elif str == "[M":
                keyboard.send(Keycode.ESCAPE)
                esc = False
            elif str == "[N":
                keyboard.send(Keycode.PAUSE)
                esc = False
            elif str == "[11~" or str == "OP":
                keyboard.send(Keycode.F1)
                esc = False
            elif str == "[12~" or str == "OQ":
                keyboard.send(Keycode.F2)
                esc = False
            elif str == "[13~" or str == "OR":
                keyboard.send(Keycode.F3)
                esc = False
            elif str == "[14~" or str == "OS":
                keyboard.send(Keycode.F4)
                esc = False
            elif str == "[15~":
                keyboard.send(Keycode.F5)
                esc = False
            elif str == "[17~":
                keyboard.send(Keycode.F6)
                esc = False
            elif str == "[18~":
                keyboard.send(Keycode.F7)
                esc = False
            elif str == "[19~":
                keyboard.send(Keycode.F8)
                esc = False
            elif str == "[20~":
                keyboard.send(Keycode.F9)
                esc = False
            elif str == "[21~":
                keyboard.send(Keycode.F10)
                esc = False
            elif str == "[23~":
                keyboard.send(Keycode.F11)
                esc = False
            elif str == "[24~":
                keyboard.send(Keycode.F12)
                esc = False
            elif str == "[38~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F1)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[39~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F2)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[25~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F3)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[26~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F4)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[28~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F5)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[29~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F6)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[31~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F7)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[32~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F8)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[33~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F9)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[34~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F10)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[40~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F11)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[41~":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.F12)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[5~":
                keyboard.send(Keycode.PAGE_UP)
                esc = False
            elif str == "[6~":
                keyboard.send(Keycode.PAGE_DOWN)
                esc = False
            elif str == "[1~":
                keyboard.send(Keycode.HOME)
                esc = False
            elif str == "[4~":
                keyboard.send(Keycode.END)
                esc = False
            elif str == "[2~":
                keyboard.send(Keycode.INSERT)
                esc = False
            elif str == "[3~":
                keyboard.send(Keycode.DELETE)
                esc = False
            elif str == "[K":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.PAGE_UP)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[L":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.PAGE_DOWN)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[I":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.HOME)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[J":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.END)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[Z":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.TAB)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif str == "[S":
                keyboard.press(Keycode.LEFT_SHIFT)
                keyboard.send(Keycode.CAPS_LOCK)
                sleep(.09)
                keyboard.release(Keycode.LEFT_SHIFT)
                esc = False
            elif len(str) >= 4:
                layout.write(str)
                esc = False
        elif k == 27:
            esc = True
            str = ""
        elif k >= 128:
            keyboard.send(2)
            keyboard.send(k-32)
        elif k >= 32:
            if keyboard.led_on(keyboard.LED_CAPS_LOCK):
                if k >= 0x41 and k <= 0x5a or k >= 0x61 and k <= 0x7a:
                    k ^= 0x20
            layout.write(chr(k))
        elif k == 13:
            keyboard.send(Keycode.ENTER)
        elif k == 8:
            keyboard.send(Keycode.BACKSPACE)
        elif k == 9:
            keyboard.send(Keycode.TAB)
        elif k >= 1 and k<=26:
            keyboard.press(Keycode.LEFT_CONTROL)
            layout.write(chr(k+0x40))
            keyboard.release(Keycode.LEFT_CONTROL)
