122 lines
4.2 KiB
Python
122 lines
4.2 KiB
Python
# SPDX-FileCopyrightText: 2021 John Park for Adafruit Industries
|
|
# SPDX-License-Identifier: MIT
|
|
# NUMPAD 4000! Made with snap-apart NeoKey PCB and Feather RP2040.
|
|
|
|
import board
|
|
import keypad
|
|
import neopixel
|
|
import usb_hid
|
|
from adafruit_hid.keyboard import Keyboard
|
|
from adafruit_hid.keycode import Keycode
|
|
|
|
COLUMNS = 5
|
|
ROWS = 5
|
|
|
|
BLUE = 0x000510
|
|
WHITE = 0x303030
|
|
RED = 0xFF0000
|
|
|
|
|
|
board_pix = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.1)
|
|
board_pix[0] = BLUE
|
|
|
|
key_pixels = neopixel.NeoPixel(board.D5, 30, brightness=0.1)
|
|
key_pixels.fill(WHITE)
|
|
|
|
keys = keypad.KeyMatrix(
|
|
row_pins=(board.D4, board.A3, board.A2, board.A1, board.A0),
|
|
column_pins=(board.D13, board.D12, board.D11, board.D10, board.D9),
|
|
columns_to_anodes=False,
|
|
)
|
|
|
|
kbd = Keyboard(usb_hid.devices)
|
|
|
|
keycode_LUT = [
|
|
0, 1, 2, 3, 4,
|
|
5, 6, 7, 8,
|
|
10, 11, 12, 13, 14,
|
|
15, 16, 17, 18,
|
|
20, 21, 23, 24
|
|
]
|
|
|
|
pixel_LUT = [
|
|
0, 1, 2, 3, 4,
|
|
8, 7, 6, 5,
|
|
10, 11, 12, 13, 14,
|
|
18, 17, 16, 15,
|
|
20, 21, 23, 24
|
|
]
|
|
# create a keycode dictionary including modifier state and keycodes
|
|
keymap = {
|
|
(0): (0, Keycode.KEYPAD_NUMLOCK),
|
|
(1): (0, Keycode.BACKSPACE),
|
|
(2): (0, Keycode.FORWARD_SLASH),
|
|
(3): (0, Keycode.KEYPAD_ASTERISK),
|
|
(4): (0, Keycode.KEYPAD_MINUS),
|
|
|
|
(5): (0, Keycode.PAGE_UP),
|
|
(6): (0, Keycode.KEYPAD_SEVEN),
|
|
(7): (0, Keycode.KEYPAD_EIGHT),
|
|
(8): (0, Keycode.KEYPAD_NINE),
|
|
|
|
(9): (0, Keycode.PAGE_DOWN),
|
|
(10): (0, Keycode.KEYPAD_FOUR),
|
|
(11): (0, Keycode.KEYPAD_FIVE),
|
|
(12): (0, Keycode.KEYPAD_SIX),
|
|
(13): (0, Keycode.KEYPAD_PLUS),
|
|
|
|
(14): (1, Keycode.SHIFT),
|
|
(15): (0, Keycode.KEYPAD_ONE),
|
|
(16): (0, Keycode.KEYPAD_TWO),
|
|
(17): (0, Keycode.KEYPAD_THREE),
|
|
|
|
(18): (2, Keycode.CONTROL),
|
|
(19): (0, Keycode.KEYPAD_ZERO),
|
|
(20): (0, Keycode.KEYPAD_PERIOD),
|
|
(21): (0, Keycode.KEYPAD_EQUALS) # KEYPAD_ENTER on non-mac
|
|
}
|
|
|
|
shift_mod = False
|
|
ctrl_mod = False
|
|
|
|
|
|
while True:
|
|
|
|
key_event = keys.events.get()
|
|
if key_event:
|
|
if key_event.pressed:
|
|
if keymap[keycode_LUT.index(key_event.key_number)][0] == 1:
|
|
shift_mod = True
|
|
elif keymap[keycode_LUT.index(key_event.key_number)][0] == 2:
|
|
ctrl_mod = True
|
|
if shift_mod is False and ctrl_mod is False:
|
|
kbd.press(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
print(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
key_pixels[pixel_LUT.index(key_event.key_number)] = RED
|
|
elif shift_mod is True and ctrl_mod is False:
|
|
kbd.press(Keycode.SHIFT, keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
print(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
key_pixels[pixel_LUT.index(key_event.key_number)] = RED
|
|
elif shift_mod is False and ctrl_mod is True:
|
|
kbd.press(Keycode.CONTROL, keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
print(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
key_pixels[pixel_LUT.index(key_event.key_number)] = RED
|
|
elif shift_mod is True and ctrl_mod is True:
|
|
kbd.press(
|
|
Keycode.SHIFT,
|
|
Keycode.CONTROL,
|
|
keymap[keycode_LUT.index(key_event.key_number)][1]
|
|
)
|
|
print(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
key_pixels[pixel_LUT.index(key_event.key_number)] = RED
|
|
board_pix[0] = WHITE
|
|
|
|
if key_event.released:
|
|
if keymap[keycode_LUT.index(key_event.key_number)][0] == 1: # un-shift
|
|
shift_mod = False
|
|
elif keymap[keycode_LUT.index(key_event.key_number)][0] == 2: # un-ctrl
|
|
ctrl_mod = False
|
|
|
|
kbd.release(keymap[keycode_LUT.index(key_event.key_number)][1])
|
|
key_pixels[pixel_LUT.index(key_event.key_number)] = WHITE
|
|
board_pix[0] = BLUE
|