keybow2040/code/code.py

151 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import board
import time
from keybow2040 import Keybow2040
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
# Set up Keybow
i2c = board.I2C()
keybow = Keybow2040(i2c)
keys = keybow.keys
# Set up the keyboard and layout
keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)
# Set up consumer control (used to send media key presses)
consumer_control = ConsumerControl(usb_hid.devices)
# Our layers. The key of item in the layer dictionary is the key number on
# Keybow to map to, and the value is the key press to send.
# Note that keys 0-3 are reserved as the modifier and layer selector keys
# respectively.
layer_0 = {}
layer_1 = {4: Keycode.PERIOD,
5: Keycode.ONE,
6: Keycode.FOUR,
7: Keycode.SEVEN,
8: Keycode.ZERO,
9: Keycode.TWO,
10: Keycode.FIVE,
11: Keycode.EIGHT,
12: Keycode.ENTER,
13: Keycode.THREE,
14: Keycode.SIX,
15: Keycode.NINE}
layer_2 = {4: "Mit freundlichen Gruessen\nMichael Grote "
}
layer_3 = {6: ConsumerControlCode.VOLUME_DECREMENT,
7: ConsumerControlCode.SCAN_PREVIOUS_TRACK,
10: ConsumerControlCode.MUTE,
11: ConsumerControlCode.PLAY_PAUSE,
14: ConsumerControlCode.VOLUME_INCREMENT,
15: ConsumerControlCode.SCAN_NEXT_TRACK}
layers = {0: layer_0,
1: layer_1,
2: layer_2,
3: layer_3}
selectors = {0: keys[0],
1: keys[1],
2: keys[2],
3: keys[3]}
# Start on layer X
current_layer = 1
# The colours for each layer
# https://gist.github.com/ninrod/b0f86d77ebadaccf7d9d4431dd8e2983
# https://colorhunt.co/palette/f7fd04f9b208f98404fc5404
colours = {0: (247, 253, 4),
1: (249, 178, 8),
2: (249, 132, 4),
3: (252, 84, 4)}
layer_keys = range(4, 16)
# Set the LEDs for each key in the current layer
for k in layers[current_layer].keys():
keys[k].set_led(*colours[current_layer])
# To prevent the strings (as opposed to single key presses) that are sent from
# refiring on a single key press, the debounce time for the strings has to be
# longer.
short_debounce = 0.03
long_debounce = 0.15
debounce = short_debounce
fired = False
# startanimation - 8bit
keybow.set_all(0,0,255)
keybow.set_all(0,255,0)
keybow.set_all(0,255,255)
keybow.set_all(255,0,0)
keybow.set_all(255,0,255)
keybow.set_all(255,255,0)
keybow.set_all(255,255,255)
keybow.set_all(0,0,0)
while True:
# Always remember to call keybow.update()!
keybow.update()
for layer in layers.keys():
keys[layer].set_led(*colours[layer])
if current_layer != layer:
if selectors[layer].pressed:
current_layer = layer
# Set the key LEDs first to off, then to their layer colour
# sonst bleiben ungelegte keys in der alten farbe
for k in layer_keys:
keys[k].set_led(0, 0, 0)
for k in layers[layer].keys():
# setze überall farben
keys[k].set_led(*colours[layer])
# setze zusätzlich farben in layer3
#if current_layer == 3:
# keys[10].set_led(255,255,0) # rot
# keys[11].set_led(30,144,255) #blau
# Loop through all of the keys in the layer and if they're pressed, get the
# key code from the layer's key map
for k in layers[current_layer].keys():
if keys[k].pressed:
key_press = layers[current_layer][k]
# If the key hasn't just fired (prevents refiring)
if not fired:
fired = True
# Send the right sort of key press and set debounce for each
if current_layer == 0:
keyboard.send(key_press)
elif current_layer == 1:
keyboard.send(key_press)
# sendet strings
# deswegen längerer debounce
elif current_layer == 2:
debounce = long_debounce
layout.write(key_press)
# sendet hid_keycodes.. mute usw.
elif current_layer == 3:
consumer_control.send(key_press)
# If enough time has passed, reset the fired variable
if fired and time.monotonic() - keybow.time_of_last_press > debounce:
fired = False