Merge pull request #427 from Astra389/Astra_Hack_PAD

added Astral Hack Pad
This commit is contained in:
Alex Ren 2025-03-13 16:14:53 -04:00 committed by GitHub
commit 566e59548a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 181389 additions and 0 deletions

View file

@ -0,0 +1,83 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"git": {
"repo_password": "",
"repo_type": "",
"repo_username": "",
"ssh_key": ""
},
"meta": {
"filename": "Hack_pad.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View file

@ -0,0 +1,597 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"apply_defaults_to_fp_fields": false,
"apply_defaults_to_fp_shapes": false,
"apply_defaults_to_fp_text": false,
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.05,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.1,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.1,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
},
"silk_line_width": 0.1,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.1,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.5
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_symbol_mismatch": "warning",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"holes_co_located": "warning",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "ignore",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "warning",
"padstack": "warning",
"pth_inside_courtyard": "warning",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "ignore",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.5,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.1,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.8,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.1,
"min_via_diameter": 0.5,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0
],
"tuning_pattern_settings": {
"diff_pair_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 1.0
},
"diff_pair_skew_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
},
"single_track_defaults": {
"corner_radius_percentage": 80,
"corner_style": 1,
"max_amplitude": 1.0,
"min_amplitude": 0.2,
"single_sided": false,
"spacing": 0.6
}
},
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false
},
"ipc2581": {
"dist": "",
"distpn": "",
"internal_id": "",
"mfg": "",
"mpn": ""
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "Hack_pad.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.2,
"via_diameter": 0.6,
"via_drill": 0.3,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"plot": "",
"pos_files": "",
"specctra_dsn": "",
"step": "",
"svg": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_export_filename": "",
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "${QUANTITY}",
"show": true
},
{
"group_by": true,
"label": "DNP",
"name": "${DNP}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "Grouped By Value",
"sort_asc": true,
"sort_field": "Reference"
},
"connection_grid_size": 50.0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"overbar_offset_ratio": 1.23,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"25ec909c-ad9d-48ba-848b-df593040c98c",
"Root"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,35 @@
# overall of the Hack Pad
![This is the overall of the Hack Pad](assets/overall.png)
# Hack Pad case
![This is the HackPad](assets/hackpad.png)
# Hack Pad schematics
![This is the Schematic](assets/schematic.png)
# Hck Pad PCB
![This is the PCB](assets/PCB.png)
# BOM
Seeed XIAO RP2040 (1)
Through-hole 1N4148 Diodes(12)
MX-Style switches(12)
EC11 Rotary encoders(1)
0.91 inch OLED displays(1)
Blank DSA keycaps(4,red)(8,white)
M3x16mm screws(4)
M3 hex nuts(4)
resistor (2)(4.7kΩ.)

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
{\rtf1\ansi\ansicpg1252\cocoartf2761
\cocoatextscaling0\cocoaplatform0{\fonttbl}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww12060\viewh16140\viewkind0
}
# firmware can be used but may be changed when I get the Hack Pad to meet my needs
### it feature a 12 key board that fuctions can be changed upon the turn of the encoder rotery.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,91 @@
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners import DiodeOrientation
from kmk.modules.layers import Layers
from kmk.modules.display.oled import Oled, OledDisplayMode
from kmk.modules.usb_hid import USBHID
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
import board
import digitalio
import rotaryio
import displayio
import adafruit_displayio_ssd1306
import terminalio
from adafruit_display_text import label
# Initialize KMK
keyboard = KMKKeyboard()
keyboard.modules.append(Layers())
keyboard.modules.append(USBHID())
keyboard.extensions.append(MediaKeys())
# Define MX key pins based on the schematic
keyboard.col_pins = (board.GP26, board.GP27, board.GP28) # Columns
keyboard.row_pins = (board.GP5, board.GP9, board.GP10, board.GP11) # Rows
keyboard.diode_orientation = DiodeOrientation.COL2ROW
# Rotary Encoder Setup
encoder = rotaryio.IncrementalEncoder(board.GP8, board.GP9)
encoder_switch = digitalio.DigitalInOut(board.GP10)
encoder_switch.direction = digitalio.Direction.INPUT
encoder_switch.pull = digitalio.Pull.UP
# OLED Setup (128x64 display on I2C, connected to GP6 (SDA) & GP7 (SCL))
displayio.release_displays()
i2c = board.I2C()
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)
# Define key layers with customizable function keys
LAYER_1 = [
KC.F1, KC.F2, KC.F3,
KC.F4, KC.F5, KC.F6,
KC.F7, KC.F8, KC.F9,
KC.F10, KC.F11, KC.F12,
]
LAYER_2 = [
KC.MEDIA_PLAY_PAUSE, KC.MEDIA_NEXT_TRACK, KC.MEDIA_PREV_TRACK,
KC.VOLU, KC.VOLD, KC.MUTE,
KC.BRIGHTNESS_UP, KC.BRIGHTNESS_DOWN, KC.SLEEP,
KC.ESC, KC.ENTER, KC.SPACE,
]
# Track layer index
layer_index = 0
# Encoder handling function
def check_encoder():
global layer_index
last_position = encoder.position
while True:
if encoder.position > last_position:
layer_index = (layer_index + 1) % 2 # Toggle layers
elif encoder.position < last_position:
layer_index = (layer_index - 1) % 2
last_position = encoder.position
keyboard.active_layers = [layer_index]
update_oled()
keyboard.go()
# OLED Update Function
def update_oled():
splash = displayio.Group()
text = f"Layer: {layer_index}"
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=10, y=30)
splash.append(text_area)
display.show(splash)
# Assign layers to KMK
keyboard.keymap = [LAYER_1, LAYER_2]
# Run encoder checking in a loop
import supervisor
supervisor.set_next_stack_limit(4096)
import asyncio
async def main():
while True:
check_encoder()
await asyncio.sleep(0.01)
import asyncio
asyncio.run(main())

View file

@ -0,0 +1,91 @@
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners import DiodeOrientation
from kmk.modules.layers import Layers
from kmk.modules.display.oled import Oled, OledDisplayMode
from kmk.modules.usb_hid import USBHID
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
import board
import digitalio
import rotaryio
import displayio
import adafruit_displayio_ssd1306
import terminalio
from adafruit_display_text import label
# Initialize KMK
keyboard = KMKKeyboard()
keyboard.modules.append(Layers())
keyboard.modules.append(USBHID())
keyboard.extensions.append(MediaKeys())
# Define MX key pins based on the schematic
keyboard.col_pins = (board.GP26, board.GP27, board.GP28) # Columns
keyboard.row_pins = (board.GP5, board.GP9, board.GP10, board.GP11) # Rows
keyboard.diode_orientation = DiodeOrientation.COL2ROW
# Rotary Encoder Setup
encoder = rotaryio.IncrementalEncoder(board.GP8, board.GP9)
encoder_switch = digitalio.DigitalInOut(board.GP10)
encoder_switch.direction = digitalio.Direction.INPUT
encoder_switch.pull = digitalio.Pull.UP
# OLED Setup (128x64 display on I2C, connected to GP6 (SDA) & GP7 (SCL))
displayio.release_displays()
i2c = board.I2C()
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)
# Define key layers with customizable function keys
LAYER_1 = [
KC.F1, KC.F2, KC.F3,
KC.F4, KC.F5, KC.F6,
KC.F7, KC.F8, KC.F9,
KC.F10, KC.F11, KC.F12,
]
LAYER_2 = [
KC.MEDIA_PLAY_PAUSE, KC.MEDIA_NEXT_TRACK, KC.MEDIA_PREV_TRACK,
KC.VOLU, KC.VOLD, KC.MUTE,
KC.BRIGHTNESS_UP, KC.BRIGHTNESS_DOWN, KC.SLEEP,
KC.ESC, KC.ENTER, KC.SPACE,
]
# Track layer index
layer_index = 0
# Encoder handling function
def check_encoder():
global layer_index
last_position = encoder.position
while True:
if encoder.position > last_position:
layer_index = (layer_index + 1) % 2 # Toggle layers
elif encoder.position < last_position:
layer_index = (layer_index - 1) % 2
last_position = encoder.position
keyboard.active_layers = [layer_index]
update_oled()
keyboard.go()
# OLED Update Function
def update_oled():
splash = displayio.Group()
text = f"Layer: {layer_index}"
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=10, y=30)
splash.append(text_area)
display.show(splash)
# Assign layers to KMK
keyboard.keymap = [LAYER_1, LAYER_2]
# Run encoder checking in a loop
import supervisor
supervisor.set_next_stack_limit(4096)
import asyncio
async def main():
while True:
check_encoder()
await asyncio.sleep(0.01)
import asyncio
asyncio.run(main())

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,91 @@
from kmk.kmk_keyboard import KMKKeyboard
from kmk.scanners import DiodeOrientation
from kmk.modules.layers import Layers
from kmk.modules.display.oled import Oled, OledDisplayMode
from kmk.modules.usb_hid import USBHID
from kmk.extensions.media_keys import MediaKeys
from kmk.keys import KC
import board
import digitalio
import rotaryio
import displayio
import adafruit_displayio_ssd1306
import terminalio
from adafruit_display_text import label
# Initialize KMK
keyboard = KMKKeyboard()
keyboard.modules.append(Layers())
keyboard.modules.append(USBHID())
keyboard.extensions.append(MediaKeys())
# Define MX key pins based on the schematic
keyboard.col_pins = (board.GP26, board.GP27, board.GP28) # Columns
keyboard.row_pins = (board.GP5, board.GP9, board.GP10, board.GP11) # Rows
keyboard.diode_orientation = DiodeOrientation.COL2ROW
# Rotary Encoder Setup
encoder = rotaryio.IncrementalEncoder(board.GP8, board.GP9)
encoder_switch = digitalio.DigitalInOut(board.GP10)
encoder_switch.direction = digitalio.Direction.INPUT
encoder_switch.pull = digitalio.Pull.UP
# OLED Setup (128x64 display on I2C, connected to GP6 (SDA) & GP7 (SCL))
displayio.release_displays()
i2c = board.I2C()
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)
# Define key layers with customizable function keys
LAYER_1 = [
KC.F1, KC.F2, KC.F3,
KC.F4, KC.F5, KC.F6,
KC.F7, KC.F8, KC.F9,
KC.F10, KC.F11, KC.F12,
]
LAYER_2 = [
KC.MEDIA_PLAY_PAUSE, KC.MEDIA_NEXT_TRACK, KC.MEDIA_PREV_TRACK,
KC.VOLU, KC.VOLD, KC.MUTE,
KC.BRIGHTNESS_UP, KC.BRIGHTNESS_DOWN, KC.SLEEP,
KC.ESC, KC.ENTER, KC.SPACE,
]
# Track layer index
layer_index = 0
# Encoder handling function
def check_encoder():
global layer_index
last_position = encoder.position
while True:
if encoder.position > last_position:
layer_index = (layer_index + 1) % 2 # Toggle layers
elif encoder.position < last_position:
layer_index = (layer_index - 1) % 2
last_position = encoder.position
keyboard.active_layers = [layer_index]
update_oled()
keyboard.go()
# OLED Update Function
def update_oled():
splash = displayio.Group()
text = f"Layer: {layer_index}"
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=10, y=30)
splash.append(text_area)
display.show(splash)
# Assign layers to KMK
keyboard.keymap = [LAYER_1, LAYER_2]
# Run encoder checking in a loop
import supervisor
supervisor.set_next_stack_limit(4096)
import asyncio
async def main():
while True:
check_encoder()
await asyncio.sleep(0.01)
import asyncio
asyncio.run(main())