# MIT License
# Copyright (C) 2022 Shintaro Mukai.
# https://mukai.systems/articles/5yxoui5vlhy7bq2pkeqtrdt1ets83w7u/

from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.mouse import Mouse
import board
import digitalio
import time
import usb_hid

sw = digitalio.DigitalInOut(board.D7)
sw.direction = digitalio.Direction.INPUT
sw.pull = digitalio.Pull.DOWN

row_pins = [board.D0, board.D1]
col_pins = [board.D4, board.D5, board.D6]
key_rows = []
key_cols = []

for pin in row_pins:
    row = digitalio.DigitalInOut(pin)
    row.direction = digitalio.Direction.INPUT
    row.pull = digitalio.Pull.DOWN
    key_rows.append(row)

for pin in col_pins:
    col = digitalio.DigitalInOut(pin)
    col.direction = digitalio.Direction.OUTPUT
    col.value = 0
    key_cols.append(col)

keycodes = [
        [Keycode.E, Keycode.D],
        [Keycode.W, Keycode.S],
        [Keycode.Q, Keycode.A]
        ]

states = [
            [False, False],
            [False, False],
            [False, False]
            ]

mouse = Mouse(usb_hid.devices)
keyboard = Keyboard(usb_hid.devices)

while True:
    time.sleep(0.001)
    if sw.value:
        key_cols[0].value = 1
        if not key_rows[0].value:
            mouse.click(Mouse.LEFT_BUTTON)
    else:
        for i in range(len(col_pins)):
            key_cols[i].value = 1
            for j in range(len(row_pins)):
                state = key_rows[j].value
                if not state == states[i][j]:
                    states[i][j] = state
                    if state:
                        keyboard.press(keycodes[i][j])
                    else:
                        keyboard.release(keycodes[i][j])
            key_cols[i].value = 0
