105 lines
4.0 KiB
Python
105 lines
4.0 KiB
Python
from time import monotonic_ns
|
|
|
|
import terminalio
|
|
from adafruit_display_text.bitmap_label import Label
|
|
|
|
from adafruit_displayio_layout.layouts.grid_layout import GridLayout
|
|
from adafruit_hid.keycode import Keycode
|
|
from rainbowio import colorwheel
|
|
|
|
from macropad_os import App
|
|
from macropad_os.app_utils import rgb_from_int, MacroSet, Macro
|
|
|
|
COLOR_UPDATE_RATE = 33000000 # .033 seconds
|
|
|
|
|
|
class NumpadApp(App):
|
|
def __init__(self, macropad, config):
|
|
super().__init__(macropad, config)
|
|
self.name = "NumpadApp"
|
|
self.wheel_offset = 0
|
|
self.labels = []
|
|
self.title = "Numpad"
|
|
self.modifier_pressed = False
|
|
self.last_color_update = 0
|
|
self.macros = MacroSet(
|
|
[
|
|
Macro("7", Keycode.SEVEN), Macro("8", Keycode.EIGHT), Macro("9", Keycode.NINE),
|
|
Macro("4", Keycode.FOUR), Macro("5", Keycode.FIVE), Macro("6", Keycode.SIX),
|
|
Macro("1", Keycode.ONE), Macro("2", Keycode.TWO), Macro("3", Keycode.THREE),
|
|
Macro("0", Keycode.ZERO), Macro(".", Keycode.PERIOD),
|
|
Macro("Mod", self.swap_modifier, released=self.swap_modifier)
|
|
],
|
|
encoder_up=Macro("+", Keycode.KEYPAD_PLUS),
|
|
encoder_down=Macro("-", Keycode.KEYPAD_MINUS),
|
|
)
|
|
self.mod_macros = MacroSet([
|
|
Macro("<", Keycode.SHIFT, Keycode.COMMA), Macro(">", Keycode.SHIFT, Keycode.PERIOD), Macro("BACKSP", Keycode.BACKSPACE),
|
|
|
|
Macro("(", Keycode.SHIFT, Keycode.NINE), Macro(")", Keycode.SHIFT, Keycode.ZERO),Macro("%", Keycode.SHIFT, Keycode.FIVE),
|
|
|
|
Macro("/", Keycode.FORWARD_SLASH), Macro("+", Keycode.KEYPAD_PLUS), Macro("-", Keycode.MINUS),
|
|
|
|
Macro("*", Keycode.SHIFT, Keycode.EIGHT), Macro("=", Keycode.EQUALS), Macro("Mod", self.swap_modifier, released=self.swap_modifier)
|
|
],
|
|
encoder_up=Macro("+", Keycode.KEYPAD_PLUS),
|
|
encoder_down=Macro("-", Keycode.KEYPAD_MINUS),
|
|
)
|
|
self.active_macros = self.macros
|
|
|
|
def swap_modifier(self):
|
|
self.modifier_pressed = not self.modifier_pressed
|
|
if self.modifier_pressed:
|
|
self.active_macros = self.mod_macros
|
|
else:
|
|
self.active_macros = self.macros
|
|
for i in range(12):
|
|
self.labels[i].text = self.active_macros.get_macro_from_key(i).name
|
|
|
|
def on_start(self):
|
|
print("on start from the app!")
|
|
self.set_layout(GridLayout(x=0, y=9, width=128, height=54, grid_size=(3, 4), cell_padding=1))
|
|
self.set_title(self.title)
|
|
for i in range(12):
|
|
self.labels.append(Label(terminalio.FONT, text=self.active_macros.get_macro_from_key(i).name))
|
|
for index in range(12):
|
|
x = index % 3
|
|
y = index // 3
|
|
self._layout.add_content(self.labels[index], grid_position=(x, y), cell_size=(1, 1))
|
|
self.register_on_key_pressed(self.process_keys_pressed_callback)
|
|
self.register_on_key_released(self.process_keys_released_callback)
|
|
self.register_on_encoder_changed(self.process_enbcoder_changed)
|
|
|
|
def on_resume(self):
|
|
print("resume from the debug app!")
|
|
|
|
def on_pause(self):
|
|
print("Pausing")
|
|
|
|
def on_stop(self):
|
|
print("Stopping")
|
|
|
|
def on_loop(self):
|
|
self.update_key_colors()
|
|
|
|
def update_key_colors(self):
|
|
self.wheel_offset += 1
|
|
colors = []
|
|
|
|
last_update_ago = monotonic_ns() - self.last_color_update
|
|
if last_update_ago > COLOR_UPDATE_RATE:
|
|
self.last_color_update = monotonic_ns()
|
|
for pixel in range(12):
|
|
(r, g, b) = rgb_from_int(colorwheel((pixel / 12 * 256) + self.wheel_offset))
|
|
colors.append((r, g, b))
|
|
self.set_colors(colors)
|
|
|
|
def process_keys_pressed_callback(self, key_event):
|
|
self.press_macro(self.active_macros.get_macro_from_key(key_event))
|
|
|
|
def process_keys_released_callback(self, key_event):
|
|
self.release_macro(self.active_macros.get_macro_from_key(key_event))
|
|
|
|
def process_enbcoder_changed(self, key_event):
|
|
print(key_event)
|