From 4063f0707645f1d1f3fb8528f0cfafbc994cf18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eloi=20Str=C3=A9e?= Date: Sat, 16 Nov 2024 19:44:11 +0100 Subject: [PATCH] Init Save Code --- .Trash-1000 | 0 .Trashes | 0 .fseventsd/no_log | 0 .metadata_never_index | 0 PicoCaderCodeV2.py.txt | 237 +++++++++ bluetooth_electronics_builder.py | 62 +++ boot.py | 72 +++ boot_out.txt | 5 + code.py | 477 ++++++++++++++++++ hc_ttl.py | 71 +++ hid_gamepad.py | 203 ++++++++ lib/adafruit_esp32spi/PWMOut.mpy | Bin 0 -> 1048 bytes lib/adafruit_esp32spi/__init__.py | 0 lib/adafruit_esp32spi/adafruit_esp32spi.mpy | Bin 0 -> 12088 bytes .../adafruit_esp32spi_socketpool.mpy | Bin 0 -> 2400 bytes .../adafruit_esp32spi_wifimanager.mpy | Bin 0 -> 3310 bytes lib/adafruit_esp32spi/digitalio.mpy | Bin 0 -> 1766 bytes lib/adafruit_hid/__init__.mpy | Bin 0 -> 747 bytes lib/adafruit_hid/consumer_control.mpy | Bin 0 -> 629 bytes lib/adafruit_hid/consumer_control_code.mpy | Bin 0 -> 379 bytes lib/adafruit_hid/keyboard.mpy | Bin 0 -> 1204 bytes lib/adafruit_hid/keyboard_layout_base.mpy | Bin 0 -> 1216 bytes lib/adafruit_hid/keyboard_layout_us.mpy | Bin 0 -> 338 bytes lib/adafruit_hid/keycode.mpy | Bin 0 -> 1979 bytes lib/adafruit_hid/mouse.mpy | Bin 0 -> 856 bytes lib/adafruit_io/__init__.py | 0 lib/adafruit_io/adafruit_io.mpy | Bin 0 -> 8023 bytes lib/adafruit_io/adafruit_io_errors.mpy | Bin 0 -> 402 bytes lib/adafruit_midi/__init__.mpy | Bin 0 -> 1504 bytes lib/adafruit_midi/active_sensing.mpy | Bin 0 -> 332 bytes lib/adafruit_midi/channel_pressure.mpy | Bin 0 -> 591 bytes lib/adafruit_midi/control_change.mpy | Bin 0 -> 624 bytes lib/adafruit_midi/control_change_values.mpy | Bin 0 -> 541 bytes lib/adafruit_midi/midi_continue.mpy | Bin 0 -> 333 bytes lib/adafruit_midi/midi_message.mpy | Bin 0 -> 2345 bytes lib/adafruit_midi/mtc_quarter_frame.mpy | Bin 0 -> 593 bytes lib/adafruit_midi/note_off.mpy | Bin 0 -> 647 bytes lib/adafruit_midi/note_on.mpy | Bin 0 -> 645 bytes lib/adafruit_midi/pitch_bend.mpy | Bin 0 -> 607 bytes lib/adafruit_midi/polyphonic_key_pressure.mpy | Bin 0 -> 669 bytes lib/adafruit_midi/program_change.mpy | Bin 0 -> 584 bytes lib/adafruit_midi/start.mpy | Bin 0 -> 322 bytes lib/adafruit_midi/stop.mpy | Bin 0 -> 320 bytes lib/adafruit_midi/system_exclusive.mpy | Bin 0 -> 604 bytes lib/adafruit_midi/timing_clock.mpy | Bin 0 -> 329 bytes lib/adafruit_motor/__init__.mpy | Bin 0 -> 41 bytes lib/adafruit_motor/motor.mpy | Bin 0 -> 1112 bytes lib/adafruit_motor/servo.mpy | Bin 0 -> 1426 bytes lib/adafruit_motor/stepper.mpy | Bin 0 -> 1804 bytes lib/adafruit_requests/pyproject.toml | 56 ++ lib/adafruit_requests/requirements.txt | 6 + lib/adafruit_wiznet5k/__init__.py | 0 lib/adafruit_wiznet5k/adafruit_wiznet5k.mpy | Bin 0 -> 12264 bytes .../adafruit_wiznet5k_debug.mpy | Bin 0 -> 566 bytes .../adafruit_wiznet5k_dhcp.mpy | Bin 0 -> 5949 bytes .../adafruit_wiznet5k_dns.mpy | Bin 0 -> 2614 bytes .../adafruit_wiznet5k_socketpool.mpy | Bin 0 -> 6239 bytes sd/placeholder.txt | 1 + settings.toml | 7 + wow_int.py | 136 +++++ 60 files changed, 1333 insertions(+) create mode 100644 .Trash-1000 create mode 100644 .Trashes create mode 100644 .fseventsd/no_log create mode 100644 .metadata_never_index create mode 100644 PicoCaderCodeV2.py.txt create mode 100644 bluetooth_electronics_builder.py create mode 100644 boot.py create mode 100644 boot_out.txt create mode 100644 code.py create mode 100644 hc_ttl.py create mode 100644 hid_gamepad.py create mode 100644 lib/adafruit_esp32spi/PWMOut.mpy create mode 100644 lib/adafruit_esp32spi/__init__.py create mode 100644 lib/adafruit_esp32spi/adafruit_esp32spi.mpy create mode 100644 lib/adafruit_esp32spi/adafruit_esp32spi_socketpool.mpy create mode 100644 lib/adafruit_esp32spi/adafruit_esp32spi_wifimanager.mpy create mode 100644 lib/adafruit_esp32spi/digitalio.mpy create mode 100644 lib/adafruit_hid/__init__.mpy create mode 100644 lib/adafruit_hid/consumer_control.mpy create mode 100644 lib/adafruit_hid/consumer_control_code.mpy create mode 100644 lib/adafruit_hid/keyboard.mpy create mode 100644 lib/adafruit_hid/keyboard_layout_base.mpy create mode 100644 lib/adafruit_hid/keyboard_layout_us.mpy create mode 100644 lib/adafruit_hid/keycode.mpy create mode 100644 lib/adafruit_hid/mouse.mpy create mode 100644 lib/adafruit_io/__init__.py create mode 100644 lib/adafruit_io/adafruit_io.mpy create mode 100644 lib/adafruit_io/adafruit_io_errors.mpy create mode 100644 lib/adafruit_midi/__init__.mpy create mode 100644 lib/adafruit_midi/active_sensing.mpy create mode 100644 lib/adafruit_midi/channel_pressure.mpy create mode 100644 lib/adafruit_midi/control_change.mpy create mode 100644 lib/adafruit_midi/control_change_values.mpy create mode 100644 lib/adafruit_midi/midi_continue.mpy create mode 100644 lib/adafruit_midi/midi_message.mpy create mode 100644 lib/adafruit_midi/mtc_quarter_frame.mpy create mode 100644 lib/adafruit_midi/note_off.mpy create mode 100644 lib/adafruit_midi/note_on.mpy create mode 100644 lib/adafruit_midi/pitch_bend.mpy create mode 100644 lib/adafruit_midi/polyphonic_key_pressure.mpy create mode 100644 lib/adafruit_midi/program_change.mpy create mode 100644 lib/adafruit_midi/start.mpy create mode 100644 lib/adafruit_midi/stop.mpy create mode 100644 lib/adafruit_midi/system_exclusive.mpy create mode 100644 lib/adafruit_midi/timing_clock.mpy create mode 100644 lib/adafruit_motor/__init__.mpy create mode 100644 lib/adafruit_motor/motor.mpy create mode 100644 lib/adafruit_motor/servo.mpy create mode 100644 lib/adafruit_motor/stepper.mpy create mode 100644 lib/adafruit_requests/pyproject.toml create mode 100644 lib/adafruit_requests/requirements.txt create mode 100644 lib/adafruit_wiznet5k/__init__.py create mode 100644 lib/adafruit_wiznet5k/adafruit_wiznet5k.mpy create mode 100644 lib/adafruit_wiznet5k/adafruit_wiznet5k_debug.mpy create mode 100644 lib/adafruit_wiznet5k/adafruit_wiznet5k_dhcp.mpy create mode 100644 lib/adafruit_wiznet5k/adafruit_wiznet5k_dns.mpy create mode 100644 lib/adafruit_wiznet5k/adafruit_wiznet5k_socketpool.mpy create mode 100644 sd/placeholder.txt create mode 100644 settings.toml create mode 100644 wow_int.py diff --git a/.Trash-1000 b/.Trash-1000 new file mode 100644 index 0000000..e69de29 diff --git a/.Trashes b/.Trashes new file mode 100644 index 0000000..e69de29 diff --git a/.fseventsd/no_log b/.fseventsd/no_log new file mode 100644 index 0000000..e69de29 diff --git a/.metadata_never_index b/.metadata_never_index new file mode 100644 index 0000000..e69de29 diff --git a/PicoCaderCodeV2.py.txt b/PicoCaderCodeV2.py.txt new file mode 100644 index 0000000..075f33a --- /dev/null +++ b/PicoCaderCodeV2.py.txt @@ -0,0 +1,237 @@ +#import board support libraries, including HID. +import board +import digitalio +import analogio +import usb_hid + +#Libraries for the OLED Display +from adafruit_display_text import label +import adafruit_displayio_ssd1306 +import terminalio +import displayio +import busio + +from time import sleep + +#Libraries for communicating as a Keyboard device +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS +from adafruit_hid.keycode import Keycode + +#library for communicating as a gamepad +from hid_gamepad import Gamepad + +from adafruit_hid.mouse import Mouse +mouse = Mouse(usb_hid.devices) + +from adafruit_hid.consumer_control_code import ConsumerControlCode +from adafruit_hid.consumer_control import ConsumerControl + +mediacontrol = ConsumerControl(usb_hid.devices) + +keyboard = Keyboard(usb_hid.devices) +layout = KeyboardLayoutUS(keyboard) +gp = Gamepad(usb_hid.devices) + +#Create a collection of GPIO pins that represent the buttons +#This includes the digital pins for the Directional Pad. +#They can be used as regular buttons if using the analog inputs instead +button_pins = (board.GP0, board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7,board.GP10, board.GP11, + board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, board.GP17) + + + +# Map the buttons to button numbers on the Gamepad. +# gamepad_buttons[i] will send that button number when buttons[i] +# is pushed. +gamepad_buttons = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) + +#Keyboard Mode Button Definitions +keyboard_buttons = {0 Keycode.UP_ARROW, 1 Keycode.LEFT_ARROW, 2 Keycode.DOWN_ARROW, 3 Keycode.RIGHT_ARROW, + 4 Keycode.LEFT_CONTROL, 5 Keycode.SPACE, 6 Keycode.W, 7 Keycode.ENTER, 8 Keycode.LEFT_ALT + , 9 Keycode.ENTER, 10 Keycode.ENTER, 11 Keycode.ENTER, 12 Keycode.ENTER, 13 Keycode.ENTER + , 14 Keycode.ENTER, 15 Keycode.ENTER} + +#FPS Mode Button Definitions +fps_buttons = {0 Keycode.W, 1 Keycode.A, 2 Keycode.S, 3 Keycode.D, + 4 Keycode.LEFT_CONTROL, 5 Keycode.SPACE, 6 Keycode.LEFT_ALT, 7 Keycode.ENTER, + 8 Keycode.ENTER, 9 Keycode.ENTER, 10 Keycode.ENTER, 11 Keycode.ENTER, 12 Keycode.ENTER + , 13 Keycode.ENTER, 14 Keycode.ENTER, 15 Keycode.ENTER} + +#List of defind mode names +mode_names = {1 'Gamepad', 2 'Keyboard', 3 'FPS', 4 Mouse, 5 Multimedia} + +#Set Default Mode To 1 +mode = 1 + +#Define OLED Parameters +WIDTH = 128 +HEIGHT = 64 +BORDER = 5 + +buttons = [digitalio.DigitalInOut(pin) for pin in button_pins] + +modeChangeButton = digitalio.DigitalInOut(board.GP22) +modeChangeButton.direction = digitalio.Direction.INPUT +modeChangeButton.pull = digitalio.Pull.UP + +#Initialize The Buttons +for button in buttons + button.direction = digitalio.Direction.INPUT + button.pull = digitalio.Pull.UP + +# Setup for Analog Joystick as X and Y +ax = analogio.AnalogIn(board.GP26) +ay = analogio.AnalogIn(board.GP27) + +displayio.release_displays() + + +# Use for I2C for display +i2c = busio.I2C(board.GP9, board.GP8) +display_bus = displayio.I2CDisplay(i2c, device_address=0x3C) + +# Equivalent of Arduino's map() function. +def range_map(x, in_min, in_max, out_min, out_max) + return (x - in_min) (out_max - out_min) (in_max - in_min) + out_min + + +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) + +# Make the display context +splash = displayio.Group() +display.show(splash) + +# Draw a label + +text = Mode + str(mode) +text_area = label.Label( + terminalio.FONT, text=text, color=0xFFFFFF, x=3, y=3 +) +splash.append(text_area) +text = mode_names[mode] +text_area = label.Label( + terminalio.FONT, text=text, color=0xFFFFFF, x=3, y=23 +) +splash.append(text_area) + +def debounce() + sleep(0.2) + +while True + #Check to see if the mode change button is pressed + if modeChangeButton.value + mode = mode + 1 + if mode 5 + mode = 1 + sleep(1) + splash = displayio.Group() + display.show(splash) + # Draw a smaller inner rectangle + inner_bitmap = displayio.Bitmap(WIDTH - BORDER 2, HEIGHT - BORDER 2, 1) + inner_palette = displayio.Palette(1) + inner_palette[0] = 0x000000 # Black + inner_sprite = displayio.TileGrid( + inner_bitmap, pixel_shader=inner_palette, x=BORDER, y=BORDER + ) + splash.append(inner_sprite) + display.show(splash) + # Draw a label + text = Mode + str(mode) + text_area = label.Label( + terminalio.FONT, text=text, color=0xFFFFFF, x=3, y=3 + ) + splash.append(text_area) + text = mode_names[mode] + text_area = label.Label( + terminalio.FONT, text=text, color=0xFFFFFF, x=3, y=23 + ) + splash.append(text_area) + + if mode == 1 + # Check value of up, down, left, and right buttons + # and set the joystick values appropriately. + # can be replaced with values from analog stick instead + setx = 0 + sety = 0 + #Not keyboard presses for directional + #So check them seperately first + if not buttons[0].value + sety = -127 + if not buttons[2].value + sety = 127 + if not buttons[1].value + setx = -127 + if not buttons[3].value + setx = 127 + #Set Joystick movements + gp.move_joysticks( + x=setx, + y=sety, + ) + + # Go through all the button definitions, and + # press or release as appropriate + for i, button in enumerate(buttons) + if i 3 #Skip the first 4, since they're the directionals + gamepad_button_num = gamepad_buttons[i - 4] # Minus 4 to ignore directionals + if button.value + gp.release_buttons(gamepad_button_num) + else + gp.press_buttons(gamepad_button_num) + + if mode == 2 # Keyboard Mode + + for i, button in enumerate(buttons) + if button.value + keyboard.release(keyboard_buttons[i]) + else + keyboard.press(keyboard_buttons[i]) + + #FPS Mode + if mode == 3 + for i, button in enumerate(buttons) + gamepad_button_num = gamepad_buttons[i] + if button.value + keyboard.release(fps_buttons[i]) + else + keyboard.press(fps_buttons[i]) + + if mode == 4 + if not buttons[0].value + mouse.move(y=-4) + if not buttons[2].value + mouse.move(y=4) + if not buttons[1].value + mouse.move(x=-4) + if not buttons[3].value + mouse.move(x=4) + if not buttons[4].value + mouse.click(Mouse.LEFT_BUTTON) + sleep(0.2) + if not buttons[5].value + mouse.click(Mouse.RIGHT_BUTTON) + sleep(0.2) + + if mode == 5 + if not buttons[0].value + mediacontrol.send(ConsumerControlCode.VOLUME_INCREMENT) + debounce() + if not buttons[2].value + mediacontrol.send(ConsumerControlCode.VOLUME_DECREMENT) + debounce() + if not buttons[1].value + mediacontrol.send(ConsumerControlCode.SCAN_PREVIOUS_TRACK) + debounce() + if not buttons[3].value + mediacontrol.send(ConsumerControlCode.SCAN_NEXT_TRACK) + debounce() + if not buttons[4].value + mediacontrol.send(ConsumerControlCode.PLAY_PAUSE) + debounce() + if not buttons[5].value + mediacontrol.send(ConsumerControlCode.STOP) + debounce() + if not buttons[9].value + mediacontrol.send(ConsumerControlCode.MUTE) + debounce() \ No newline at end of file diff --git a/bluetooth_electronics_builder.py b/bluetooth_electronics_builder.py new file mode 100644 index 0000000..e6915a8 --- /dev/null +++ b/bluetooth_electronics_builder.py @@ -0,0 +1,62 @@ + +import random + +class BluetoothElectronicsBuilder: + + + + + def create_text(self, char: str, charText: str, end_line: bool=True): + """*charText*""" + if end_line: + return f"*{char}{charText}\n*" + return f"*{char}{charText}*" + + def create_light(self, char: str="L", red255:bytes=0, green255:bytes=0, blue255:bytes=0): + """*charRGB*""" + return f"*{char}R{red255}G{green255}B{blue255}*" + + def create_light_random_color(self, char: str): + """*charRND*""" + return self.create_light(char, random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) + + + def create_sound(self, char: str="S", sound: bytes=50): + """*charSOUND*""" + #clamp 0 to 100 + sound = max(0, min(100, sound)) + return f"*{char}V{sound}*" + + def create_gauge(self, char: str="D", value: int=50): + """*charGAUGE*""" + return f"*{char}{value}*" + def create_temperature(self, char: str="T", value: int=50): + """*charTEMP*""" + return f"*{char}{value}*" + def create_gauge_blue(self, char: str="D", value: int=50): + """*charGAUGE*""" + return self.create_gauge(char, value) + def create_gauge_orange(self, char: str="G", value: int=50): + """*charGAUGE*""" + return self.create_gauge(char, value) + + def create_graph_clear(self, char: str="H"): + """*charCLEAR*""" + return f"*{char}C*" + def create_graph_add(self, char: str="H", x:float = 0.0, y:float = 0.0, xx:float = 0.0, yy:float = 0.0): + """*charADD*""" + return f"*{char}X{x:.2f}Y{y:.2f}X{xx:.2f}Y{yy:.2f}*" + + + + def create_integer_from_char1(self, c): + return ord(c) + def create_integer_from_char2(self, c_left_right_0, c_left_right_1): + utf8_string = "AAAA" + utf8_bytes = utf8_string.encode('utf-8') + # Interpret the bytes in little-endian order + little_endian_value = int.from_bytes(utf8_bytes, byteorder='little') + + + + \ No newline at end of file diff --git a/boot.py b/boot.py new file mode 100644 index 0000000..409d2ef --- /dev/null +++ b/boot.py @@ -0,0 +1,72 @@ +import usb_hid +import usb_midi +import supervisor +import board +import usb_cdc +# Set the USB serial device name +#usb_cdc.console.serial = "LoveFrenchFries" +import board +import usb_cdc +import time +from adafruit_hid import find_device +import usb_hid +import usb_hid + +# IMPORTANT !!!!!!!!! IF YOU CHANGE YOU NEED A HARD RESET TO RECOGNIZE THE DEVICE +# TURN OFF THE DEVICE THEN GO IN BOOT MODE THEN COME BACK TO NORMAL MODE +# This is an updated example of a gamepad report descriptor with 32 buttons. +GAMEPAD_REPORT_DESCRIPTOR = bytes(( + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, # Usage (Game Pad) + 0xA1, 0x01, # Collection (Application) + 0x85, 0x04, # Report ID (4) + + # Buttons (32 buttons) + 0x05, 0x09, # Usage Page (Button) + 0x19, 0x01, # Usage Minimum (Button 1) + 0x29, 0x20, # Usage Maximum (Button 32) + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0x01, # Logical Maximum (1) + 0x75, 0x01, # Report Size (1) + 0x95, 0x20, # Report Count (32) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + + # Axes (X, Y, Z, Rz) + 0x05, 0x01, # Usage Page (Generic Desktop Ctrls) + 0x15, 0x81, # Logical Minimum (-127) + 0x25, 0x7F, # Logical Maximum (127) + 0x09, 0x30, # Usage (X) + 0x09, 0x31, # Usage (Y) + 0x09, 0x32, # Usage (Z) + 0x09, 0x35, # Usage (Rz) + 0x75, 0x08, # Report Size (8) + 0x95, 0x04, # Report Count (4) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + + # Triggers (Rx, Ry) + 0x09, 0x33, # Usage (Rx) - Left Trigger + 0x09, 0x34, # Usage (Ry) - Right Trigger + 0x15, 0x00, # Logical Minimum (0) + 0x25, 0xFF, # Logical Maximum (255) + 0x75, 0x08, # Report Size (8) + 0x95, 0x02, # Report Count (2) + 0x81, 0x02, # Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) + + 0xC0 # End Collection +)) + +gamepad = usb_hid.Device( + report_descriptor=GAMEPAD_REPORT_DESCRIPTOR, + usage_page=0x01, # Generic Desktop Control + usage=0x05, # Gamepad + report_ids=(4,), # Descriptor uses report ID 4. + in_report_lengths=(10,), # This gamepad sends 10 bytes in its report. + out_report_lengths=(0,), # It does not receive any reports. +) +usb_hid.enable( + (usb_hid.Device.KEYBOARD, + usb_hid.Device.MOUSE, + usb_hid.Device.CONSUMER_CONTROL, + gamepad) +) +usb_midi.enable() diff --git a/boot_out.txt b/boot_out.txt new file mode 100644 index 0000000..cfe6544 --- /dev/null +++ b/boot_out.txt @@ -0,0 +1,5 @@ +Adafruit CircuitPython 9.2.0 on 2024-10-28; Raspberry Pi Pico W with rp2040 +Board ID:raspberry_pi_pico_w +UID:E661A4D4173ABD2E +MAC:28:CD:C1:0D:5F:7F +boot.py output: diff --git a/code.py b/code.py new file mode 100644 index 0000000..4e39b3e --- /dev/null +++ b/code.py @@ -0,0 +1,477 @@ +# CODE SOURCE: https://github.com/EloiStree/2024_11_31_ReadHardwareToIndexInteger/tree/main/RaspberryPiPicoW/HelloDefaultInputDUART +# * +# * ---------------------------------------------------------------------------- +# * "PIZZA LICENSE": +# * https://github.com/EloiStree wrote this file. +# * As long as you retain this notice you +# * can do whatever you want with this stuff. +# * If you think my code made you win a day of work, +# * send me a good 🍺 or a 🍕 at +# * - https://www.patreon.com/eloiteaching +# * +# * You can also support my work by building your own DIY input using Amazon links: +# * - https://github.com/EloiStree/HelloInput +# * +# * May the code be with you. +# * +# * Updated version: https://github.com/EloiStree/License +# * ---------------------------------------------------------------------------- +# */ + +######## PRINT BASIC INFO OF THE DEVICE ######## +import sys +print("Hello World") +print(f"sys.implementation: {sys.implementation}") +print(f"sys.version: {sys.version}") +print(f"sys.platform: {sys.platform}") + + +import time +import board +import busio +import pulseio +import analogio +import random +import struct +import digitalio +import usb_hid +import usb_midi +import adafruit_midi +import time +import ssl +import socketpool +import wifi +import adafruit_requests +import os +import ipaddress + + +# IMPORT FROM NEAR FILE +from hid_gamepad import Gamepad +from wow_int import WowInt +from hc_ttl import HCTTL +from bluetooth_electronics_builder import BluetoothElectronicsBuilder + +# IMPORT FROM LIB ADAFRUIT +from adafruit_midi.note_on import NoteOn +from adafruit_midi.note_off import NoteOff +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keycode import Keycode +#from keyboard_layout_fr import KeyboardLayoutFR # Import the French layout +from adafruit_hid.mouse import Mouse +from adafruit_hid.consumer_control import ConsumerControl +from adafruit_hid.consumer_control_code import ConsumerControlCode + + +# Do you want to use the Wifi ? +USE_WIFI = True +# Do you want to use the print log ? +USE_PRINT_LOG = True + + +################# WOW SETTING ################# +# Connect to Wi-Fi from setting.toml + +# 🐿️ It make the workshop easier to learn +wow = WowInt(False) + +# Send a integer message to the server +wow.push(42) + +# Send a integer to all champions +# ⚠️ Don't abuse of it in workshop ⚠️ +wow.lock_push_all() +wow.push_all(42) + +# Send a UTF8 message to the server +# 🐿️ It is to check if a connection is working +wow.send_UTF8("Hello World") + + + +# 🐿️ If gamepad is not found in usb_hid.devices +# Just reboot the device in boot mode and comeback. +gamepad= Gamepad(usb_hid.devices) # Start behaving as gamepad +mouse = Mouse(usb_hid.devices) # Start behaving as mouse +consumer = ConsumerControl(usb_hid.devices) # Start behaving as media control +keyboard = Keyboard(usb_hid.devices) +midi = adafruit_midi.MIDI(midi_in=usb_midi.ports[0], midi_out=usb_midi.ports[1], in_channel=0, out_channel=0) +hcttl= HCTTL() # Start behaving as HC05 (4 5) listener and TTL(0 1) sender +be = BluetoothElectronicsBuilder() + + + +if False: # EXPERIMENT WITH BLUETOOTH ELECTRONICS 🏳️ + while True: + #LABEL + date = str(time.monotonic()) + text = be.create_text('p',"Hello"+date) + hcttl.push_text_to_hc05(text) + text = be.create_light_random_color('L') + # SOUND + hcttl.push_text_to_hc05(text) + text =be.create_sound('S',random.randint(0,100)) + hcttl.push_text_to_hc05(text) + text =be.create_gauge('D',random.randint(0,100)) + hcttl.push_text_to_hc05(text) + # GAUGE + text = be.create_gauge_orange(value=random.randint(0,100)) + hcttl.push_text_to_hc05(text) + text = be.create_temperature(value=random.randint(0,100)) + hcttl.push_text_to_hc05(text) + text = be.create_gauge_blue(value=random.randint(0,100)) + hcttl.push_text_to_hc05(text) + + # GRAPH + time.sleep(1) + text = be.create_graph_clear('H') + hcttl.push_text_to_hc05(text) + for i in range(10): + text = be.create_graph_add('H',i,random.randint(0,100),i+1,random.randint(0,100)) + time.sleep(0.1) + hcttl.push_text_to_hc05(text) + time.sleep(1) + + +# Example of how to use midi in adafruit_midi.py +if False: # EXPERIMENT WITH MIDI 🏳️ + while True: + value127= random.randint(30,100) + velocity127= random.randint(40,127) + midi.send(NoteOn(value127, velocity127)) + time.sleep(1) + midi.send(NoteOff(value127, 0)) + time.sleep(1) + +# Example of how to use the keyboard in adafruit_hid.keyboard.py +if False: # EXPERIMENT WITH KEYBOARD 🏳️ + time.sleep(3) + for _ in range(2): + keyboard.press(Keycode.LEFT_ARROW) + keyboard.release(Keycode.LEFT_ARROW) + time.sleep(1) + time.sleep(3) + keyboard.press(Keycode.A) + keyboard.release(Keycode.A) + keyboard.send(Keycode.B) # Press and release 'A' + keyboard.send(Keycode.SHIFT, Keycode.C) # Press and release 'A' with SHIFT + keyboard.send(Keycode.D, Keycode.E) # Press and release 'A' then 'B' + +# Example of how to use the gamepad in hid_gamepad.py +if False: # EXPERIMENT WITH GAMEPAD 🏳️ + while True: + gamepad.set_joystick_left_x_percent(random.randrange(-100,100)/100.0) + gamepad.set_joystick_left_y_percent(random.randrange(-100,100)/100.0) + gamepad.set_joystick_right_x_percent(random.randrange(-100,100)/100.0) + gamepad.set_joystick_right_y_percent(random.randrange(-100,100)/100.0) + gamepad.set_trigger_left_percent(random.randrange(0,100)/100.0) + gamepad.set_trigger_right_percent(random.randrange(0,100)/100.0) + button_index= random.randint(1,15) + gamepad.press_buttons(button_index) + time.sleep(1) + gamepad.release_buttons(button_index) + time.sleep(1) + +# Example of how to use the mouse in adafruit_hid.mouse.py +if False: # EXPERIMENT WITH MOUSE 🏳️ + for _ in range(10): + mouse.move(x=10, y=10, wheel=0) + mouse.press(Mouse.LEFT_BUTTON) + mouse.release(Mouse.LEFT_BUTTON) + +# Example of how to use the consumer in adafruit_hid.consumer_control.py +if False: # EXPERIMENT WITH MEDIA 🏳️ + consumer.send(ConsumerControlCode.PLAY_PAUSE) # Play/Pause media + for _ in range(100): + consumer.send(ConsumerControlCode.VOLUME_INCREMENT) + consumer.send(ConsumerControlCode.VOLUME_INCREMENT) # Increase volume + consumer.send(ConsumerControlCode.VOLUME_DECREMENT) # Decrease volume + +############## PINS REMINDER ############## +## DIGITAL PIN ARE 0 OR 1 +## Those are the pin that you can use for IO (Input/Output) communication +pins_id_digital = [ + board.GP2, board.GP3, board.GP6, + board.GP7, board.GP8, board.GP9, board.GP10, board.GP11, + board.GP12, board.GP13, board.GP14, board.GP15, board.GP16, + board.GP17, board.GP18, board.GP19, board.GP20, board.GP21, + board.GP22 +] +## ANALOG PIN ARE 0 TO 65535 +## Those are the pin that you can use for analog communication +pins_id_analog = [ + board.GP26, board.GP27, board.GP28 +] +## UART PIN ARE RESERVED TO MAKE SERIAL COMMUNICATION +pins_id_UART=[ + board.GP0, board.GP1, # UART0 + board.GP4, board.GP5 # UART1 +] + + + + + +################# PIN DEFINITION ################# +# To ease the learning curved, I prepared a joystick and trigger (potentiometer) with a button +pin_A27_XJoystick = analogio.AnalogIn(board.GP27) +pin_A26_YJoystick = analogio.AnalogIn(board.GP26) +pin_A28_ZJoystick = analogio.AnalogIn(board.GP28) +pin_D22_Button = digitalio.DigitalInOut(board.GP22) +pin_D22_Button.direction = digitalio.Direction.INPUT +pin_D22_Button.pull = digitalio.Pull.UP +pin_D21_3v3 = digitalio.DigitalInOut(board.GP21) +pin_D21_3v3.direction = digitalio.Direction.OUTPUT +pin_D21_3v3.value = True + + +if False: + ## Read a pin in PULL UP + ## Some button are better with a pull up, some with a pull down + pin_GP17 = digitalio.DigitalInOut(board.GP17) + pin_GP17.direction = digitalio.Direction.INPUT + pin_GP17.pull = digitalio.Pull.UP + bool_value = not pin_GP17.value + print(f"Pin 17 PULL UP: {pin_GP17.value}") + + ## Read a pin in PULL DOWN + pin_GP16 = digitalio.DigitalInOut(board.GP16) + pin_GP16.direction = digitalio.Direction.INPUT + pin_GP16.pull = digitalio.Pull.DOWN + bool_value = pin_GP17.value + print(f"Pin 16 PULL DOWN: {pin_GP17.value}") + + ## Write a pin as OUTPUT + pin_GP15 = digitalio.DigitalInOut(board.GP15) + pin_GP15.direction = digitalio.Direction.OUPUT + pin_GP15.value = True + print(f"Pin 15 OUTPUT: {pin_GP15.value}") + + + + +def uartToAction(c0, c1): + """C0 is the first left character and C1 is the second right character""" + timestamp_ms = int(time.monotonic() * 1000) + if USE_PRINT_LOG: + print("Timestamp in milliseconds:", timestamp_ms) + print(f"C0:{c0} C1:{c1}") + if c1 == '1': + if c0 == 'A': + print("Add Code") + elif c0 == 'B': + print("Add Code") + elif c0 == 'C': + print("Add Code") + elif c0 == 'D': + print("Add Code") + elif c1== '2': + if c0=='L': + wow.push(1037) + elif c0=='l': + wow.push(2037) + + elif c0=='D': + wow.push(1040) + elif c0=='d': + wow.push(2040) + elif c0=='R': + wow.push(1039) + elif c0=='r': + wow.push(2039) + elif c0=='U': + wow.push(1038) + elif c0=='u': + wow.push(2038) + elif c0=='T': + wow.push(1009) + elif c0=='t': + wow.push(2009) + elif c0=='E': + wow.push(1013) + elif c0=='e': + wow.push(2013) + elif c0=='S': + wow.push(1032) + elif c0=='s': + wow.push(2032) + + + + +## Example of how to use the joystick and trigger in loop +use_learning_loop = True +if use_learning_loop: + + # Store the current and previous value to detect change + # Joystick + bool_is_joystick_left = False + bool_is_joystick_right = False + bool_is_joystick_up = False + bool_is_joystick_down = False + bool_is_joystick_left_previous = False + bool_is_joystick_right_previous = False + bool_is_joystick_up_previous = False + bool_is_joystick_down_previous = False + # Trigger + bool_is_trigger_down = False + bool_is_trigger_up = False + bool_is_trigger_down_previous = False + bool_is_trigger_up_previous = False + # Button + bool_is_button_down_previous = False + bool_is_button_down= False + + # Joystick death zoner to detect left, right up, down are active + int_joystick_death_zone = 0.8 + while True: + + # CHECK IF A UART HAVE SOME COMMAND FOR USE STORE ON TWO CHARS FROM HC05 OR TTL + if hcttl.read_and_return_if_right_is_digit(): + # If the right char is a digit, it means that we received a command + charOne, charTwo = hcttl.get_double_char() + uartToAction(charOne, charTwo) + + # read and convert the value from the analog pin. + bool_print_joystick=False + joystick_x = pin_A27_XJoystick.value + joystick_y = pin_A26_YJoystick.value + joystick_x_127 = max(-127, min(127, int((joystick_x / 65535) * 254 - 127))) + joystick_y_127 = max(-127, min(127, int((joystick_y / 65535) * 254 - 127))) + joystick_y_percent = joystick_y_127 / 127.0 + joystick_x_percent = joystick_x_127 / 127.0 + trigger = pin_A28_ZJoystick.value + trigger_min=0 + trigger_max=65535 + trigger_255 = max(0, min(255, int((trigger - trigger_min) / (trigger_max - trigger_min) * 255))) + trigger_percent = trigger_255 / 255.0 + + + # Set the value of the joystick and trigger for debugging purpose + gamepad.set_joystick_left_x_127(joystick_x_127) + gamepad.set_joystick_left_y_127(joystick_y_127) + gamepad.set_trigger_left_255(trigger_255) + + + # Check from the analog value if the zone are reached + bool_is_button_down = not pin_D22_Button.value + if joystick_x_percent < -int_joystick_death_zone: + bool_is_joystick_left = True + bool_is_joystick_right = False + elif joystick_x_percent > int_joystick_death_zone: + bool_is_joystick_left = False + bool_is_joystick_right = True + else: + bool_is_joystick_left = False + bool_is_joystick_right = False + + if joystick_y_percent < -int_joystick_death_zone: + bool_is_joystick_up = True + bool_is_joystick_down = False + elif joystick_y_percent > int_joystick_death_zone: + bool_is_joystick_up = False + bool_is_joystick_down = True + else: + bool_is_joystick_up = False + bool_is_joystick_down = False + + + if trigger_percent > 0.8: + bool_is_trigger_up = True + else: + bool_is_trigger_up = False + + + if trigger_percent <0.2: + bool_is_trigger_down = True + else: + bool_is_trigger_down = False + + # Check for any changed of zone + if bool_is_button_down != bool_is_button_down_previous: + bool_is_button_down_previous = bool_is_button_down + if bool_is_button_down: + print("Button Down Start") + wow.push(1032) + else: + print("Button Down End") + wow.push(2032) + bool_print_joystick=True + + if bool_is_joystick_left != bool_is_joystick_left_previous: + bool_is_joystick_left_previous = bool_is_joystick_left + if bool_is_joystick_left: + print("Joystick Left Start") + wow.push(1037) + else: + print("Joystick Left End") + wow.push(2037) + bool_print_joystick=True + + if bool_is_joystick_right != bool_is_joystick_right_previous: + bool_is_joystick_right_previous = bool_is_joystick_right + if bool_is_joystick_right: + print("Joystick Right Start") + wow.push(1039) + else: + print("Joystick Right End") + wow.push(2039) + bool_print_joystick=True + + if bool_is_joystick_up != bool_is_joystick_up_previous: + bool_is_joystick_up_previous = bool_is_joystick_up + if bool_is_joystick_up: + print("Joystick Up Start") + wow.push(1038) + else: + print("Joystick Up End") + wow.push(2038) + bool_print_joystick=True + + if bool_is_joystick_down != bool_is_joystick_down_previous: + bool_is_joystick_down_previous = bool_is_joystick_down + if bool_is_joystick_down: + print("Joystick Down Start") + wow.push(1040) + else: + print("Joystick Down End") + wow.push(2040) + bool_print_joystick=True + + + if bool_is_trigger_down != bool_is_trigger_down_previous: + bool_is_trigger_down_previous = bool_is_trigger_down + if bool_is_trigger_down: + print("Trigger Down Start") + wow.push(1009) + else: + print("Trigger Down End") + wow.push(2009) + bool_print_joystick=True + + if bool_is_trigger_up != bool_is_trigger_up_previous: + bool_is_trigger_up_previous = bool_is_trigger_up + if bool_is_trigger_up: + print("Trigger Up Start") + wow.push(1032) + else: + print("Trigger Up End") + wow.push(2032) + bool_print_joystick=True + + + if bool_print_joystick: + print(f"Joystick x{joystick_x_127} y{joystick_y_127} / x{joystick_x} y{joystick_y}") + print(f"Trigger {trigger_255} / {trigger}") + + + # Avoid excessive looping + time.sleep(0.00001) + + + + + + + + diff --git a/hc_ttl.py b/hc_ttl.py new file mode 100644 index 0000000..22eae63 --- /dev/null +++ b/hc_ttl.py @@ -0,0 +1,71 @@ + +import board +import busio + + + +""" Allow to listen from on UART and write to another UART """ +class HCTTL: + def __init__(self): + ################ UART DEFINITION ################ + # UART0 is used for TTL communication with your computer as Serial Port + self.uart0_ttl = busio.UART(board.GP0, board.GP1, baudrate=9600, bits=8, parity=None, stop=1) + # UART1 is used for communication with the HC-05 Bluetooth with Android and Quest3 + self.uart1_hc05 = busio.UART(board.GP4, board.GP5, baudrate=9600, bits=8, parity=None, stop=1) + self.char_left = ' ' + self.char_right = ' ' + + def push_text_to_hc05(self, text:str, end_line=True): + if end_line: + self.uart1_hc05.write(bytes(text + "\n", "utf-8")) + else: + self.uart1_hc05.write(bytes(text, "utf-8")) + + def push_text_to_ttl(self, text:str, end_line=True): + if end_line: + self.uart0_ttl.write(bytes(text + "\n", "utf-8")) + else: + self.uart0_ttl.write(bytes(text, "utf-8")) + + def read(self): + return self.uart1_hc05.read() + + def write(self, data): + self.uart0_ttl.write(data) + + def get_double_char(self): + return self.char_left, self.char_right + + def is_char_right_digit(self): + return self.char_right.isdigit() + def get_char_left(self): + return self.char_left + def get_char_right(self): + return self.char_right + + def read_and_return_if_right_is_digit(self): + + ## I consider that you use only once UART at the same time""" + b= None + if self.uart0_ttl.in_waiting > 0: + b = self.uart0_ttl.read(1) + if b: + self.uart0_ttl.write(b) + + if self.uart1_hc05.in_waiting > 0: + b = self.uart1_hc05.read(1) + if b: + self.uart1_hc05.write(b) + + if b: + print(b) + try: + c = b.decode('utf-8') + self.char_left=self.char_right + self.char_right=c + return c.isdigit() + except Exception as e: + print("An error occurred:", e) + + return False + diff --git a/hid_gamepad.py b/hid_gamepad.py new file mode 100644 index 0000000..c64bbe7 --- /dev/null +++ b/hid_gamepad.py @@ -0,0 +1,203 @@ +""" +`Gamepad` +==================================================== + +* Author(s): Dan Halbert +""" + +import struct +import time + +from adafruit_hid import find_device + + +class Gamepad: + """Emulate a generic gamepad controller with 32 buttons, + numbered 1-32, and two joysticks, one controlling + ``x`` and ``y`` values, and the other controlling ``z`` and + ``r_z`` (z rotation or ``Rz``) values. + + Two additional triggers provide ``rx`` and ``ry`` values. + The joystick values are in the range -127 to 127, and the trigger values + are in the range 0 to 255. + """ + + def __init__(self, devices): + """Create a Gamepad object that will send USB gamepad HID reports. + + Devices can be a list of devices that includes a gamepad device or a gamepad device + itself. A device is any object that implements ``send_report()``, ``usage_page`` and + ``usage``. + """ + self._gamepad_device = find_device(devices, usage_page=0x01, usage=0x05) + + # Report layout: + # report[0-3] - buttons 1-32 (32 bits) + # report[4] - joystick 0 x: -127 to 127 + # report[5] - joystick 0 y: -127 to 127 + # report[6] - joystick 1 x: -127 to 127 + # report[7] - joystick 1 y: -127 to 127 + # report[8] - trigger rx: 0 to 255 + # report[9] - trigger ry: 0 to 255 + self._report = bytearray(10) + self._last_report = bytearray(10) + + # Store settings separately before putting into report. + self._buttons_state = 0 + self._joy_x = 0 + self._joy_y = 0 + self._joy_z = 0 + self._joy_r_z = 0 + self._joy_rx = 0 + self._joy_ry = 0 + + # Send an initial report to test if HID device is ready. + try: + self.reset_all() + except OSError: + time.sleep(1) + self.reset_all() + + def press_buttons(self, *buttons): + """Press and hold the given buttons.""" + for button in buttons: + self._buttons_state |= 1 << (self._validate_button_number(button) - 1) + self._send() + + def release_buttons(self, *buttons): + """Release the given buttons.""" + for button in buttons: + self._buttons_state &= ~(1 << (self._validate_button_number(button) - 1)) + self._send() + + def release_all_buttons(self): + """Release all the buttons.""" + self._buttons_state = 0 + self._send() + + def click_buttons(self, *buttons): + """Press and release the given buttons.""" + self.press_buttons(*buttons) + self.release_buttons(*buttons) + + def set_joystick_left_x_127(self, value): + """Set the x value of the left joystick.""" + self.move_joysticks(x=value) + def set_joystick_left_y_127(self, value): + """Set the y value of the left joystick.""" + self.move_joysticks(y=value) + def set_joystick_right_x_127(self, value): + """Set the x value of the right joystick.""" + self.move_joysticks(z=value) + def set_joystick_right_y_127(self, value): + """Set the y value of the right joystick.""" + self.move_joysticks(r_z=value) + def set_trigger_left_255(self, value): + """Set the left trigger value.""" + self.move_joysticks(rx=value) + def set_trigger_right_255(self, value): + """Set the right trigger value.""" + self.move_joysticks(ry=value) + + def set_joystick_left_x_percent(self, value): + """Set the x value of the left joystick.""" + self.set_joystick_left_x_127(int(value * 127)) + def set_joystick_left_y_percent(self, value): + """Set the y value of the left joystick.""" + self.set_joystick_left_y_127(int(value * 127)) + def set_joystick_right_x_percent(self, value): + """Set the x value of the right joystick.""" + self.set_joystick_right_x_127(int(value * 127)) + def set_joystick_right_y_percent(self, value): + """Set the y value of the right joystick.""" + self.set_joystick_right_y_127(int(value * 127)) + def set_trigger_left_percent(self, value): + """Set the left trigger value.""" + self.set_trigger_left_255(int(value * 255)) + def set_trigger_right_percent(self, value): + """Set the right trigger value.""" + self.set_trigger_right_255(int(value * 255)) + + + def move_joysticks(self, x=None, y=None, z=None, r_z=None, rx=None, ry=None): + """Set and send the given joystick and trigger values. + The joysticks will remain set with the given values until changed. + + One joystick provides ``x`` and ``y`` values, + and the other provides ``z`` and ``r_z`` (z rotation). + Two additional triggers provide ``rx`` and ``ry`` values. + + Joystick values must be in the range -127 to 127 inclusive. + Trigger values must be in the range 0 to 255 inclusive. + + Examples:: + + # Change x and y values only. + gp.move_joysticks(x=100, y=-50) + + # Reset all joystick and trigger values to center position. + gp.move_joysticks(0, 0, 0, 0, 128, 128) + """ + if x is not None: + self._joy_x = self._validate_joystick_value(x) + if y is not None: + self._joy_y = self._validate_joystick_value(y) + if z is not None: + self._joy_z = self._validate_joystick_value(z) + if r_z is not None: + self._joy_r_z = self._validate_joystick_value(r_z) + if rx is not None: + self._joy_rx = self._validate_trigger_value(rx) + if ry is not None: + self._joy_ry = self._validate_trigger_value(ry) + self._send() + + def reset_all(self): + """Release all buttons and set joysticks and triggers to default positions.""" + self._buttons_state = 0 + self._joy_x = 0 + self._joy_y = 0 + self._joy_z = 0 + self._joy_r_z = 0 + self._joy_rx = 0 + self._joy_ry = 0 + self._send(always=True) + + def _send(self, always=False): + """Send a report with all the existing settings. + If ``always`` is ``False`` (the default), send only if there have been changes. + """ + struct.pack_into( + "KITM@kWE7;1ZQBGco8z*R=MgyFK=!)knp&-n)W7{?17VC@ zAn!X>Da|M20=flSN9KvKZWUA1STg6TZ5eA+75DY3v8u(0(|PX+6fNb&{f=W5Dj!@FccoT znvQCkeihj5#rCnpTHV$#*kFTgfXa-PObd=0&}=}<#!!P~)HGnY7hEnCS0K5N2h62z zN^qri1?d>BYYkXK$bwzZCK&B0Zi_fi>2THJxsvdaO!9SS(vOtq6vejl!~C8;S!N5^y23gz(r@HVzjJBI%l@I zT(pz&5+k>oUfeK@>K(QdyO&z8@@X-{Ma6zz^x9i@?%sd!@X_NZPoF)1@$%K{H*en^ z>7R{=Y$XRqZexzBc^q9UaZGInh%qH1rj)4Ir%)oN&?3(dC=9tw^K`mL=?SX=B}Tp! zPmvQgsLFc$_WI{e$D2P8lLm(CmmkwpK*r3&4qOey6yFX?lXvdcl zAAG6zy)Pv{`qG}VJ|AaOl6T10+uSyt>XY{EKj7v33^xZ>%X<4LpW-BM5@xd=nIccJ zOn{_unosePSAgRqemY+Mc5+!5mLo)fv^YLVOWyJMF+al-il6S)@4~}Fv_yNSs&H&# zd~|xe+Y;c8a8MXIOk!PJ7GyaZIFzaHpJaOH!lf@ujLdvlSh%=Kn!_?l0Qu=eMj(Pa lbJ4&ZQKBTT0{%egprov~N|dr)6|!?u7?nwK=qHa#E13WQ literal 0 HcmV?d00001 diff --git a/lib/adafruit_esp32spi/__init__.py b/lib/adafruit_esp32spi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_esp32spi/adafruit_esp32spi.mpy b/lib/adafruit_esp32spi/adafruit_esp32spi.mpy new file mode 100644 index 0000000000000000000000000000000000000000..b84a8193b39b0255f12b746423405fcbce539cea GIT binary patch literal 12088 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 XZ2G`fuxX-bQ{QuJ3TifWFq{4_@$U>^ literal 0 HcmV?d00001 diff --git a/lib/adafruit_esp32spi/adafruit_esp32spi_socketpool.mpy b/lib/adafruit_esp32spi/adafruit_esp32spi_socketpool.mpy new file mode 100644 index 0000000000000000000000000000000000000000..65a9483a54cc99cfc97f29ecc52c90d9b856db55 GIT binary patch literal 2400 zcmZWoOLN=S6~2H-iJ}+@0-+l{Xba*?GWDiu)@kcTB0)*CA&C?zDa;FmKv3qCA~+;u zM_sfatF+E^I_*E`s(X-nIE!woI8CR!PNp+X>a^W7U3Ay{fu0LePG*dm3mhDr^WE<| z_d~oFO_uBjazQTEj!U|v)~mO}^=fJHm5fx^lpm{lRny7~)e|&?WGu1 z;<0{QQzZ$FXLG596yHe1A0)Td5wl$-HF6ob^pk3-a)>;MOiIe6l8RQ*Yg!pat~XtH zWmDu-Yqg4o9D3#l(JS=(I#_kJ>-`T%i4il{*KMj z;{2U~UZq?|&XQ%8=AEY7LHvOnRjme7Ey_ow@(E&ybjuOWY7M4|oW-(ySVxU`mH|npQ)Of~?DE z5d2p!{X|6#s$q9^&FHEeoaid-zTbOPsvx2SG)KJv^3 zsXT8uMDLD&R|y7#b7JA68H1ri)I^Vm#&mAOZ!k8-9-=3DJvMCf*s(n~Y!gI->4O@F zrw{k#?mPE~WB(N5x%0GIG{#NCNRzM!kC}?C$TWqGyW+QZbo!#}J z2&J0t5$<)s_>3KL51(H!qfgr*I%J=vl*YtVoNE5*M|WS7TeK*Fb4|xFpa0uA&Te zY{v`XUc6|KTpwNvJMd(RG=Bv|cusuFVv?Pi_RshOp*CUsLLfpY z5CWRVP4~Ea1hk)-qZ2;b9Q6=&H=@WKy=iijMwH5>m6d)6FB-kH-|hA31+OwY@7whIAH;)!>3}#t z6H3JHEE?_ocfMS6uqq&Y8H>H0vutC7X|qmlIf_1M8z9^I99wNaGd_*|zQKZ}JQ2!x zF4WoLdG{?s{|U0`%LRJ3b#Za|zXf{l;_~00o?m|b4Dy$0$ir#H{$rS2IEp@d3f+&p zTaY>4h5-QB(+C}<|NJo^uxZ!J!TJ%bH({-W9AABY)sAm=EJ;X!f7?ofA9H#|<6k_%TD91~QU4$NX~gXS literal 0 HcmV?d00001 diff --git a/lib/adafruit_esp32spi/adafruit_esp32spi_wifimanager.mpy b/lib/adafruit_esp32spi/adafruit_esp32spi_wifimanager.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a95ddba03b219c0522a5bd4cebe7e9491e4636c6 GIT binary patch literal 3310 zcma)6OLN=S6~2T-ilQV60uTh2Wf>tQlA>fiAcm3UNA)0WQnqYTl%pth284kt31bRi z2+)so+JcG}u05Ucu8aN&NOm7v*_mml(@i#=$)ufbnr^!3qBHHX=kjH0TG!PBxaY$? z=X~co=iXHxI)8UaQ#56#Qq^r4TjhDlD(f@@8ToB} zAEVk(Z8zEWQBA|Zs;!%b-1I=9_QwkTyoxQ`>VR5V(O9~WE9A2BmVQlNZ{$K@AACju z4d1KoBEMzn8me8O%Zg<^G%FgS72C%9Wr!!r9eM4?WsDfhR_rR2^9Tv>z$Li>AVyZo zvTkVj5sK|%TdpXYZpxOa-p6*?G)pMnfm$UJ*v5}+6f9sMU>XphT?UN}Tdvb$$V%7X ziMr}&)xs4d5VTD!zGd-Av1c&E?HI1tjk1mHmfG1P z+(x#LMq{mSKoD2T72U!}kV)YN)CvkAuC-%1hYnT+-D)X}HN>bDtk{@rYb{}y0J@fR z%f^Oo?4sI)NTx=HidzIxtc^h0x>&mX_%upnGZdJrQ+wMIj&(-BhH|fjk-uzOHu9CL zHVTv#Tirwb8ZKd*d?8GHwhhJW<+f^qUVe~hTLIN9nHA*U(Mu&XYU#U%LT06cja_>W z1?$7IVrl+S- zpsS~AZg#fEL;k>kchmNcTvPNC*2vzb6jLH}uksiu1&}wqrRa6>cOb`dj%sN}`g>Vlg28;D^Y2r8B1u zdNvyVh9TKc@U7gkB&OR3^-Zz$I_o7KrfA+%6rH}QsYs+GIy4pcob4K+cxv0ByJ77e z>E^q)o%~rJ?}KL#-{a7J!2KhB-oL#mA-Xp~@x6J~^JGj|>wO{=#jyHp_RxRG9KLt> z{^2?JWm~^b>BGR`z)+gMM)&g9Ykc&8pU5B7a`EoMJmLeAhaZ(F{=C%1PfFcerLj=$Ht?OmB|O^@mm5u@?Y#Pv{;YUD<7^irQ_-o} zNhuzSXUNXqJFtfp89)2MH+44;xPdoC;822sH64}^vBnY}ut~`AB$98iC$O#Sh#fd$ zBXR0q;I=a9vO`QS8~rAgak&`eU4iWcnW!Uif?Q|T!`%rFhVIrDmi?(uo#G^NDyF_ z^yx@Fm38&@>7>`0Lb#_DaWGD)Ptn&@JeF~sVrU{98jr@3p+amd8k&eWCoVUcM6=YZ z*DHT_GRan-{G?AD8}5b4AmUCjo5%Ep1jTH=Ag?5x8t`Pp0rw zeEgx*AQ_o=PF4+O|0!;Rsk?;WEVBs$HYkFGO_D1ha_2Xg{!ZdEb>e%kvZFwJ z;P@2r3?WX&l<<8Oqgs6DQvdi7><)4gUX+`F7F{TJugp5e=x ztt-!G9smCltdF~VL|-{hb_#Z|cZRu|dA?Kx$F~UGxT#4KzNa2M3UO@aljm#2;`k)o wnoR0014osim*5)8z~N(rrIjqaxaA{g65Ph+q2Nm9`4+@K-9`wv%0|?G19*PGegFUf literal 0 HcmV?d00001 diff --git a/lib/adafruit_esp32spi/digitalio.mpy b/lib/adafruit_esp32spi/digitalio.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c163fd3a89be266e090a82f228076e6049c96f59 GIT binary patch literal 1766 zcmZ8fU2oG?7(Pzp#7WcEAL${`v>cMODQVq;8%pj2~L1;y4jDs)X04mgYTwYGy|Ez@z#CQ46S zS}!js+G@GDrj?7ObriF$x@H-OqiPUm)h!1FfjO$(rgamLs8NXj7XotBy%f5-_92RC zcWT>h6QwAk-+*?vX*nk1t`t|Vpz|C}M56Ip;_#pVKTbk3*8g0i0g>m3G zYz1ouZTz6-#1Yi0QzX{jfO5XB_#60n`CRunZ#NsZ*>rYLR~m-Kd?g{;;e|#BbR(@h zAEN4#<~`lCseziaW1DE==>MQS(P`Fn^F~eo1aWqIdm9Z?H$W?5C(BlyOd7;$k$S@+ zH3AuyL41b^b(jEP4zclK{UAcM62rV{)lCDjqld?SA#$_PBvcW5wr}P&vu60jdb`;) z>(2HLv2NSj=55%UP_<4D=LfNi{o5u@NNSN<(|jwl)wbFpW?1L7a23*ukSNKGwk}T%2&Rq~Z}_#_e<;>^}bL$=Ba}``y#;fB5mI zXFvb?+stU5!NUr|LvD^)UtqAH(lvmwGJwaRT6bwi9Fphe-P!Er(|evY{BPm%o|hO| zDT-&(Xz#x~W4`nfysGb>dBG$FdCFa=lBw*}Tz0Cor|$n#_zaT7SA`0Ey@cdRd_3++ zBkp2gbL9qvM*Yy}8=(#jt%_&U3~&SQ)(eJUS#eh=Z)Pr=DHT&b^LUf7hM0%sJfnA(P?YU`yqxyUWN}W#Ar*&JKfv|O zet@Hah>D}C-b-@%!Jb{M>c+BR802xZ7uj0=l81Mw7xrleDLP3_Rv0{?1n@~Pmy`uo z3grUp3qgF!H=V^9VO9yjg^Ua1QcMZ^yIF;U6$=KSdtHTiKNI$5ic>W>dO&sLUup*^bY?#IDArGJip|2y*OD!o2tGg zM2YO~5*0F_+k1bwO#GCLv+kqnayA1TQ7@5#n@$5e1_1wz;WP3(?$atsftf)t^P@;~ zTy}pUo;0cNmUGE*`Ca$-D#=XGXHHM6kT{f*)OO^7?EP&%Fd)&|H?X?5XG|l5(*{bcoB78>D_xNkpQ literal 0 HcmV?d00001 diff --git a/lib/adafruit_hid/__init__.mpy b/lib/adafruit_hid/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..36c0a3111586da8acd429a4614e310b7b74c4f4e GIT binary patch literal 747 zcmYjNT~E_c7(N~AsADUon^j?nO*aH}Y558l+=yKr8(_2{3)I9MOMAARWVE$CCBdt5 z$Av!zWxF>K{RhTyBUfJdFFYF`;ar^ayytn|=l!T2;|67fV~dL8R!tx zn2)3Vp*6^^s*CC};D@<>On}tJo(tV8RWXk24uS!_Kz4*dHtHc106vVpQMu`%k>h(F zatLz4YYDm`|$IJe4&1ToSgapx=rgbps#`~({A80otYcFqR zui?<4J9v9Uy40`HG*l`F>_miUk3;8>M&+6x_gtCoL>~4oAK1j{(phDym#@mIfE!y> z7ucn`jeE$Ii7yWqitQf$gzoC(W+bIKwb{Si~I?%+A2B}$*2jc??)sV)UvaR+_;T*KIVb1b+*TZHm0`0#=%2FC6}@wJus6cNlH z)`Bre$N89pf;$R^bVNPT7q0IC{gN`iAd?3g7c6uHz^AS^=nd$l>rfCyNAzPzJw-J! z4qWdH=pp~GXaS|xvPR8C3)r?o-an(gKmkbo$7tX)0jAkh zz$oWHXLLyWoPtcycP@IaCwvfl)&`hUb<)y(u>0`I)YNZ7IGDiPzhK87P_SZudGwXI zoOr$v|Q$>7afkpx$hCX_L=yM4E;}(fooAE@I8@<7uCuIx%;wGedWkb zK7u1g#EhCT`TEW*KoFBWVWVtH8UM&(yk!0NTe;(_hyzg zZ@})%$~Hi^<4o^AMV6AD%XBRhw=lXhGc$7Dh;?VCVQr{InUxKd^=whTm0DGvEF5nX JOcea*`2$OVuCxFE literal 0 HcmV?d00001 diff --git a/lib/adafruit_hid/consumer_control_code.mpy b/lib/adafruit_hid/consumer_control_code.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4706fd1525f1927eedf6fe4b0d0ed7ef0e89793e GIT binary patch literal 379 zcmZ{aJ5K^Z6orTNwIax(Q>oDjd`(S1kuo@9CVpIr1VYky5f3~YZ zr7^cS_k7=>t7LDR)Vuxe{bV+rs)u2}*c-jP&YlMo6+hF-=qb+r;As3tG6gzUaef&Z z3sO9+q&TBKuacdbEu^aXyluxVrftWol3hV{DzHPri0Ousk$lT d&me``g*56r*hKvZ8Pr3tFd9P^qY-R1d!KGeUr+!5 literal 0 HcmV?d00001 diff --git a/lib/adafruit_hid/keyboard.mpy b/lib/adafruit_hid/keyboard.mpy new file mode 100644 index 0000000000000000000000000000000000000000..6db90f4f763445ec61690997e93a38a5833b4764 GIT binary patch literal 1204 zcmZvZUr!=e7{O?unCFq<^HO_RND(ofLCA8ng7lgxRa_dMtMy*Y<>g1HrH zwI8fWzkvJ7u`J5yM3E2}p-bqi z20A9C*J#$2;{)Jp=zF~^K$D~WFfh+F^x6Ru>*NRA{TlcTX% z!0ccZk5pONSC9taut5&!0E&l57ImX$G<4vuYe?6@l30`FUS4lf(NM)<64Viyc_@4u zIz%-cfi==OQcuwBfqhLqx^WR!-zC-#55Z|Dd^3c&rx<|w7kc#o8RB70H^@l|DJNv8 zA;{ZvsmEYzm9-AJ8qoj6{dVJamoz)En(=MVWrd`lg#l@%_x^wP|KlWPSt2yf7Cuu-? zG7jh|N>tnH`pDCXX6Ix5Z#UMNYeibLyxVfM!mV&;!hZ+GX%Cz?Vd4}fTX3NR-zhFq zrS}2!rYRUoJ773H0wd{B7)_5sn0CS`e=0qmq2Nr~1?P&=#F^^_HS1*;CozjBv}|Ww zji~{rO}}N*zBWC1o@rB7m=3(#$&l3_Sh9lt428{QN7)JohVr!7m%({pg_)vsn*9ai zEFEI;1`Z`zTikR%wHSE5Mpe0t6{MNBNeB_Q&M=Gju;YdIF{nKgk%CG z;_JEOYG9O^w%4eq=faj14B$`8=f8ix!~H}s!JjerS>@`YTYh$lUkdl^i|$TQy0l*k zTu~wew6FO)Rm|mk7W1z%*(J@hYks9_UwliP-)%ftnj*mO32hNy)TxS(jCqqRT9+mC4xd zT03Fd57LLeED%3HV*3T`OZs3t(=Xukq3^xBK&R8WGw0tu=XcIMH)R2ftEMbh=MJQk zri>cRdh|=7yDxH59ksZwcp{^Ht|LU+T`*%WpR`*7aLCu`Eep3Cndn%X$e9b zSmoxC0PKm#YUDZaP4c!4UJ~QLl-Gg2lA1D3YD+?=1KfMLOty?Rw#z70VAFsuWpkTl zw7I>Jnb<}gNXM@+$g&^-%kjyP@dCZP1G=hz1#$c0sjwRR^#Aa=ES@sGhc-&7Tn;dXLgj*v zH>P_55jqv5PE$Na2#^R#LR-XE^w}pDlyfqooomU55^!{6N#CQrF5pcARa9-_h1sh2 z1nNukT0@rGowaE6uqiiA_9MJ_6rKE2bYt>isiwr^kK66a4cs%EVA_=L1W8taEK0PpXHh|+TcI*PhBL04=F&c~+VLd*=QB5ygHcis<}m376| z*XGPc{_?Y*2)82;e5!2MYTkS>7+xB%d5tpD4>Zb|AgX{5banIRyYU5yFATFk zHf9r`TI9da{xBPH1(rg}=Za%9=r80$JJHORCm=C_KFarqYmKIc3F7Cs$_KWf(T=x6 zjiPT8rfTw5afOF*LZcquvS(NtUgZ~@bJhFnN~7Q%&T=hZdDL(2uy=D8{}-lnc6G)p z*E26ce?-o?A{a$JG8l`t>dwtw$b^@Z%;1y( zHirDSRu5djEq_$*g+sxBD~x#>_2ib_!qV_6JjUX{CYJpQukaU*7^HB?Rc$>G9+$iy YxK=c3F;0A7@wf|kTpqiF%Jq={2Nq#sjsO4v literal 0 HcmV?d00001 diff --git a/lib/adafruit_hid/keyboard_layout_us.mpy b/lib/adafruit_hid/keyboard_layout_us.mpy new file mode 100644 index 0000000000000000000000000000000000000000..90951e9e435ed336be90732d1d532a7ab94610f1 GIT binary patch literal 338 zcmZ=}W02=!bV*D}Oe-qQEQ!y^OwrFytxU>KEJ}&bNvzB-Er~BJ)+?xF;8*d6iu-_t zof3;v88pz&$e`E!5@Y6%>_}RaDhB8*kIwzGHq%Yg>CqXIFPmZ(sj} ziIXNznL2IyjG41$&zY-lXs~##DGMtbI|nBhHxDl#zkr~Su!yLbxP+vXw2bWfjT^T5 zFf`dn2rwonG_dD%Pj3`p(qfcmmSGZOiVQJg5MU8xGGP{D5o8f#4NPWiG+^Li>ELe= UQV?VlV;5i%<4|T0;|xp&08!Lkz5oCK literal 0 HcmV?d00001 diff --git a/lib/adafruit_hid/keycode.mpy b/lib/adafruit_hid/keycode.mpy new file mode 100644 index 0000000000000000000000000000000000000000..49879979a2f74cd6122d70ee9a7448d62b63cfce GIT binary patch literal 1979 zcmb7EX>$`t5N!`e2w{w6oEOI-L1_#j2L{V0w^q{1T6FAsSF&t#$hKsIxeNx9kPw(n z-Y6BKjqV!io2}0-EMHhWUp=;1 z-+p5LVr{8D-*@IBt!vNu0d=2RsxK}q&M#Nz7SB_6UeA=ODYICz%{+D5##pvg9V;8O zecO=GNF+(5NTf;VBr+t%NMuPEBo2_sk;s!MkSLNcNmwMtN!TPD5+xF45)&jUBqm8r zk(j2CS=1?1s+bfhWo=!jaKV$rm54>3r5P!n`)-8jIc(y2yts(CY&qt;BnvbeGVWrNCwlnpBzQ8ubih)R69-ppi|R71hE& zt!CS1g}NH7H+^rr>iZpKtLbgX=~I@Lt`^IM#u2tQ%Vf*MaZL5(k;Ao5id6g9*Y1Px8~1jG64 z#hPJ5QVjy3SytXiX(huGfMr&c0)wKapcGXD9$$kV40$l@!H5T=9(cUQJznD;ukpAC zUPXM6+Jj5yli_5IjFOc9=2W{{y*Q9g&uqm<*TV)FB21#CWack9zo8SX^Bzqnl#?dnN8( z(R;g7;PuA-vl6|DJ2RVOw^yR!`RHc@KY04tyW`#7`6s8mUR4*^me`$Z^Gq~^RUHE1 z=dt<)L|(+2m(X?#E;Lot>bM$_J&0k{6S9thqZ2bn0e2YiF!(-p$@gJ})x($6l zV*5|n@iY2=K|C7Az^@qm4MV?Un0H`=`!ULK?BoIL;z8`@A?)E{?Bx;c<5BGAok;L5 zXuKOq-h&kHMVj|P=l#gAOkj+qhAhh@43;SzV3|garH(wy3<@mAP-K~f$WsL zMVw)I9A{acz%t8|ILGo7&a*s?3oMuL1j{pclI2-E#c~-JS)Rkw?9QMy+KOk`oyDc- zB|OXS94<#M<4W`jTw=Edw zFt<6NWU(NWsxlZ#wS&8HmWog=Rb*f;R|HAIswCjQiX}X?BLJ!*h6VG64StP;lMBS%xF68Q z011sTp4gwDuNe=RkcaKO(7{06R`1P*>h>qzy3uw94$?;GRN#;bhwIRF0M9;y=VBbO zHVvT3Pe95~LfWr`HoqR)5kj19ZMp|K{03;XjrffL0x~h)q^^7>pou--huo;Ql1|&n z2HmUBW|i)12KEVU&|-Jj1Gx6bcqPrz6zf4(Q9q|S`qAz6#q{hdoSa4hu7YRh->8 zI(^kVK7D<7a{8u$zJ#?}6XVO;A;uTA7_Ua1w3S6qS+BRfuaanOt+w&MAbj`Kn2GVB T=k|+kRI`t{e-c`N43PXU@(TG2 literal 0 HcmV?d00001 diff --git a/lib/adafruit_io/__init__.py b/lib/adafruit_io/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_io/adafruit_io.mpy b/lib/adafruit_io/adafruit_io.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f71a5bbfdb05c5700da85a00e5a9d6cfa9f99fa4 GIT binary patch literal 8023 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 A{r~^~ literal 0 HcmV?d00001 diff --git a/lib/adafruit_io/adafruit_io_errors.mpy b/lib/adafruit_io/adafruit_io_errors.mpy new file mode 100644 index 0000000000000000000000000000000000000000..30a225672842fedc0d8b1e4c60a130f922d6fba5 GIT binary patch literal 402 zcmZ=}V~`hOa!O1|Oe-qQEQ!y|*GFQSEz-A~^8`N4UR2$YZu=0ZphKK@13~CvgN+g6B z6BHUavK6|yLyQ;%m;|{@n8lbvj2H!&!A#~5BPIbBFq0)PnYn_2jj4lIkXwvLfJuxu zFuBo&gOj;K(18Ig#4N_UL4ko$jCDgYV^cz~5Gxys`@4oHZz99n+4cIj|d5> xGHeuORb~+3*d)xk#f-^}F%n`9ONR{992O*V8Y8TEz~;!qbTR^UnlXa40RSGDXJP;V literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/__init__.mpy b/lib/adafruit_midi/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a00fd9a7999c943fbe94807cc5e2eb3c97265052 GIT binary patch literal 1504 zcmZWn+fv(B6g@Kdf&f{T%!!h?!NqpCgxIk$Zkmu3Yz+y)G*JjcP0|QkJ^>{lYh;lop4C5K2vp_l;u+0Bvn{BpGS;A6r%1C)cCX!i#{`9Jv-o%_VMbi)iGzZrnt{xgBs)sqE@E(F&I3Jz`YBQfOpl*&uoaP~!3| zs~Z)a7-k(cd8T6{EX{U+vvZ|EHLo}7ja=hKjWpI9pLlkw;FDfdo)HsywAwBj^lX#o z$bEg=H1+DWL}E)dw`-+1OiuK!KC#gI26C#Qz_)O(Zf=7X=Z4}?kKCglR>Ixs;fiqz zVSX6Y?Wtu_M(&X%ZLheamcy#1L!xJh8~5T+{#Ih}e#h2RYxW<_3DoAig~vuWa`|Za zcFJO1Y#-atx>*nFWqniL^8+Clc7^(IU#K7Vhuqj5@?cNMi@hNq_7(2X>w&4?#a!VI z^>Krxr>OITAsW*Kb_idJAUypbh1lV=3lB>QwQmX&!w2IQ|H8rt178jvc%N>*96b;M zmvNjO#tBK9a!n(NWl9$7FMZ3hrF(3kG=nf7xRRpM6lMYp&!t=)bS2dX|Nej|7sNbwBhn9wL9nX;9l>xbLlq_{jt;&H zM{p?Py3+UR_cugjZRwf zGWWWDBt#B_;Ugyjs?o{_we*Zs}e*+DHv{e8A literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/active_sensing.mpy b/lib/adafruit_midi/active_sensing.mpy new file mode 100644 index 0000000000000000000000000000000000000000..1fd3bbe211717c789328f0578dbb5430ad6d8d21 GIT binary patch literal 332 zcmXw!-%G+!9L2wz&C2GSAQ$@qg+D-yHj?b2AQ%=Uxk$Die7alnHZSBhcCW%-s?|%- zKi$mscFvd2;d{=Y2#2b05X72}vhVW#wxzJe{=u%E09 zSqsy!?m-^iJlxuMAY=9#at6}njPrqb6fKw~eP^O*2i_G#5! z%Xs)|)oX%t^r4Je)1Pvxid|v9a3CUaqHdtgCZH|52dY#R&k9JYO10uSOvaw@*~yOI fyN=UtH>=yIq)KR~k-j0hk-npHij-qOm9h5=w-#M$ literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/channel_pressure.mpy b/lib/adafruit_midi/channel_pressure.mpy new file mode 100644 index 0000000000000000000000000000000000000000..40de82ee8858d36be61fcf4f6de4e5f01f1388d2 GIT binary patch literal 591 zcmX|7U2oD*7=BwUln+^<>UgN=$Q3i8Ncl z4ys?gyQq5ybx0t&#^K3k3%!)eQW5r*dtP%xgFGce-LweZBC)lY5fHYz5ZySzQ65uO zHwnH{$8$m`H7GU=3UQ443yYW-Lln2#)pn-^NI9=I8mF~-web!;P*XRi9!S8L zl9}O6@{4l%zpXhoEECX1;f@%ooi^UL&%p_Ym*TSQaDHuULVRKl?;U}AGqS9i`C68T zx;2{jCC!+~+n(g=wlGDfnpa$NVU4^5>y9K357*gbg6SRD(OP!!BjpHep4s!IS;TgQ z2WaOAkkBrIz{S{-4{E9;QQ_&Feq4LP&oFe$d(usbv57h==Y6nR}#TwD!|*>tn}*VDjA4B z&cSLoDDc0Im(aCWV&LPK+cSU0{&stE^0}*=trDTTB+jQpKAf`i@jX|JxFYY05C8sg e#X!N+*PKc*6iq*|C3od?1b$_A*6-4i(f$F})2WjH literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/control_change.mpy b/lib/adafruit_midi/control_change.mpy new file mode 100644 index 0000000000000000000000000000000000000000..da47583850d962a0dfac66a22d636c17553f791d GIT binary patch literal 624 zcmY+A?{3my6vj`%QvMAJWv>iyYz#C32a2$mnV7MTxkVr@KotG(TFNUl0ZQ7k$S2!Q z6BG4bTJ-|Fj@^Ut76b++emm#n_dMsx!@D4vq@D^r;hi#-G(3`eQbCl*nj#OeI1t8t zlAp{Vi0bDj=XIj0LZ3i%LE+JA^FGX%^F@g9H!6N9f~-RNlByA9&0%deArM%3gINtM z?8jsXds(aql1lKUFq{&iD6)cOS%EOd-I+#Ij3I!VtxBui1jL_J8jWhLUTHoDBZn}) zB#J7@<2l4)tdNO3p9=fs#J|7lP}WpHD~F}fU#m8rwa&os`Ap6%8?;Ltst_Kj{hN8bcl|)4xn=(QXgA8ar*O?&SWzg{u|Rff>0Q7 zER7;8!@5~d&WSct#sjpGGA0OJq1(;-aKU=I)-F)UTcnUb6fHVR6bf3R^V8#BUv>Q` z=G}@hZjXL9oz5rkeYc~`4?F4($1`AWdRfoU0~0#B%`q?ET%Wp9`iJY|Ffgc5Qe8f1C-E)5~iU-rP=~VTOhc=g{{5Drt4kT-V|~`OK?MDsf{DYsT6Tp z5U3LTX%<-#nZszF`P95#3m!jQY`Do@$ z7qGSQ+;+P)C2^KQ z`$Y17%%GJ}0bTYnNm-UfQovp!Q$=GYl+-G+9lKdSQ#2AfVLs*1{a=UuAmWOp+RjQr zg~yXbZDARrh&nV|BKV{mkhuwckAr)(I{mr z%v)>|L-8&#?{Jft5VwelutUsyyhqFtZWF`tJ~1(Ni4pjKm`{krEO3XIZ`eD|{{r5- Bk@^4t literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/midi_continue.mpy b/lib/adafruit_midi/midi_continue.mpy new file mode 100644 index 0000000000000000000000000000000000000000..45aab739febc491525a8580884f439bf9e67f32f GIT binary patch literal 333 zcmX|+K~KU!5QV43q9T?hAsdV&5`+uJHX8Au9&CzHA~h1~fzw*r6*jT7+1;8D4_dvL z_@^xjUM6qyzRA32=V1>i7hd2!@q|edvVfV3LHuYY*({+(Jckl?dflEwh43a6s=t1? z+zLlV$2bOLFL`KlI$=UmPL>Ff^OyoAIkjj^?kq_Zq`LBt0y_Em9Hq)$ literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/midi_message.mpy b/lib/adafruit_midi/midi_message.mpy new file mode 100644 index 0000000000000000000000000000000000000000..b4a8ad41a7a9dc00646a923cd2c89e795817c7fc GIT binary patch literal 2345 zcmZ8h-A^0Y6~8vNF~))MwV8D`ZkUV>7(;C07&Z$@YQ_V>d=J=swA~K&Fn}8vduPUJ zXq0Bgr4>)!nCktF#j7Q=fXrhG^B1>~qe& z=lsq&zjJ0HCeS=@>P;*rmc(pIX4g`Ssety!uJMwTSmynib;3LGQcJ>GP+5u0;{~9NeRmUAB)n_u_^>0G$Srt7t%i!25#_z44m2t zl~}A=E^Z|u2>dF$lv9h#k7<+=_6ZvJ-1}~m8&7v-N z;AgA231M+9Azf$XG|R0fBnjZ`bgVxXpC0R<9sz1!!?6iGti&foZiVI3YsaxD`&vRq zN5^!Y99u^R#;?VO02~;nt6;#hB%-hrziJz52V|=qu`K9oGISC^WlVm*A6ReQ_TIYP z4%GI5c`+d;fa^`itjyn(0ld7-3;fNDcokS~-M(_`HY%IF!HW_a6avFoR^&5jq>bU@ z6R`nyVsLPJAO@T#vyd`82h@mqCD)hE1#(x+l?kY`YFawqjYo$1$HxaoD-7h?v5c6` z@S?m9)cSW^Z+ehc)3O9|b`!U%O+?79@nQmv(Ui)#DuWS1EVWaU1ee|E6GHXC%VpG=q3=(xYmfV;s3bV>Jsxxe{Nhlng4JLK%!rw=TA%TZ*;RwrxD2?#WyFmx6K-6}6t> zjK8=PbXZ}J;$3L>w0qz?1$Zf>r|Ep*C8rthR*ipgu-C1FeeiN2qzmbeLOTBLT)+3! z73JbW*w^0H6=);99xr`agUG`^6!mWfUd@Mexi9H!C{~Xm;P>-N+|kejLON3EfBi%$ z%>MAzpy5}qDC!6E5#)t6A}?hxuf{R#B~7b))TpN0kbY;63d2iz6^4r_J>%EML%I+C z1G@|HqvFv%HKt{)7QRn~OWfU{mH_nZS(Br`OT4yx|M|u ztL;4AkJaH6gP&z^7lWU>hesHkw9!FSBK}qfz|Tx~0tSQ0i#ptC8wjEed$6XW z4F(NJzHJ)}8j);9(u5>|WG#~Jpc!vLdL7a|K?~k$YsIfIT>XOC^p>)SNI@XH+V%TQ zMG0G-QK$%>Lf&~A{UF25)mdOvkrwjy(_C(jY=G$gXWeZD=BvNaGsn!`d&8U?)xm4Q z4EIZnalSpQC<{b;po1K0gI8gl{Y*&r1ddb{cI0%Ies4c-ca@a58vh49RD3dz9*Uw` zG!Mu33VHikbnVmUefl2#Ji>JT)!=I$9vvH>m{jhQlqVT&qe(K_N>4tYJSeG0PpKaj zw&SD55t2_0@29oev$o#PFzwSs*F>g#>w>C`jjxpKf9QX^&co98>#R?DSVbhJ>eQqwm1tXx8TGl;Qm#6aFb6w14$ z9z&Pu#V4PB_LqaH&mYqV${!>9%24w|hX-AvMeoraKCnY=?ont(S}~;me3+bty>Qy6 z|C*ltB6(6hn(P!a0y zKYy^RRiT<~mX_#NYZ%7R+&j?g%`HHyXSivrE1VAjZo}|yQ)_gqn`jw*pKyZ~U~hW@ z;{~^o3DwN*(G2EwwC4$+EB-j7>(T8~5zM!bbvQaTNBj9wkDk-z!bf3C*UZdT?{r~$ zdc?VhU2t?3;T(*&fFgoHf%@fns+Hk#E_0*h{(xd`jeyGQX~8MX(V@eK?%?ONEVwhz z>C~Z)2IoxFvBh|b1*ZefwtzyDvj?D6&2?gp_4j8KOJt}DP>)k66l=op4n02f1|k>E b8z91H!nb&@7sk+MrQr0#xsoOW-$nc%U{c&B literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/mtc_quarter_frame.mpy b/lib/adafruit_midi/mtc_quarter_frame.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5553b4e50da6fb0b3d402495937c3433adfd8ac0 GIT binary patch literal 593 zcmY*VYj4s}7(Oi&%4Mujc4UGZa!CxtHWDyV;|DIoEe<1rMbQsuT{(j$)UtER5GxueADa_9wjj0t;g%emQybyzg^4Pcs1a_n4M4RL;pvGm)+hHCZ=RbTLzii3vI< zijJk}9BjkRQR}FKDOE-oRR3d0D;m-_yYM5aCRM;*$5gvFD(#gBC=oo;=t^{RiOl&F zgP2Z7>tS(_Upy}%qG%MOOJy>{m=J>?!yq7m(AnI?6d@2py?(ua(gSuGB6Nuf)r=1w zE+9nk)bJ+xVJ-8|gH8;S0=OY{>b;jBdVKKeMgI`kk;p<^)NC%GPAEutIc`h<_iSvM zQ~FevN18dFok^;p%eOz4>$hb!HKKZ@y`Gz6FTtuF$-4)i3aKP>nze-E!th(!64(-x z_GMVe4g^2k&I2g)D?s4lY}E(3IF}4O27|83ETcl2``&H_Rw3m6!xFfbawQ(>zNj5(@r`PT8LLaE&#Z&eC~(tiHCn+pGM zQ+(oX5x6@c&&hJd@SFG7ZU2|+M&sR})%5^=4P32(X4_3h)`{%X`?2V*^(2?gC(@3% k<%r?sFGuA6ls!AueozX>GWV>82*LuC`@k2g;62a4y`4juvsWUxE7dSbUKh@v};&4Wj6$|CnE~d z>;j-M?VGw`Pav%KwBeBUVJ%0PW>}Prwf-5UjG2s>CW9y;rxTl6gg}_o8OlL8i6Xbwl#07n}oKw^Y13s{VZvD;hFI?=g{ zb~+(`T6UydHe3BFU&s(qaSVxg2}wvsN?yP?;{pz6+!4NWj^j>_djKa$IrUb7!=Vy~ z7b43gzRY3d>B7g}&o7SibR~2*A<2rfaX-DDE~GZ1!nZQ#$EELnT#hEQ;4g)c@?&cX zEyq`-*Y7U(#fq3p^W+Zfy8!W0}~GnxO4vCT~fI)Nzq$6YB`XaW>(%OZ)1 zEz`ur_%5yb06xdw!T1W6xtaLi$#;I|`%b=+2#YE1zS>gXu%T{|p5D@PeZ!)}=w}Bb zn8xL!y`wTUO|?w{Uv35}Gbw|_geASJmAsMN%;q6n@o%5@A;V}}H!aGp0b-2?6r_m( zpflPvG~F6OMC+*iKJCJChA>q(DLGTSLrNJl7%>b6F+!Rni<*Q$gj8$ATD=OmbXcrZ z_K(ZO>JxC*F(GG^nYz*UAw&qH1H+$k_coLN!p*K>nSiexE)T=U`;|wvLvTW&u`=Ft z0;1M6A=We7e-k0_uwz*Rb32!7>sDvj%xXq2cU@Gjc->e@XPV#Kvys*DKbW+Y^?5k2 zCF0y^%8oo=X?;mMh(|((pSzLdF`pE$&_DqkT?QPhGA4n>Fw!hYX_nVjw2DzAPEJLye?quo8m~?8Q@#zIFYtLWVpLx$yM-XLP-9x zHHL=mDbkDA7YCy6e6hRxsA;JJFF$tPEy+`J_C`83?ZRXg-(i`40xfgXt8-5Bd!FayY5L&FW2z>MgwN_i((z0hNhL+n#R(pg`KYKY zVH33vcMsb{(}XdB_?p18+iT-hv05xc>}aiMxB|$lWGrbqQSTV6FBJmZe@}>r6Jb6l zQ`pI4Rgg4-PlV}$5LJ~`EXyjyFdi;-qG1dX-0jtS{Vt&9LA}%2Yqjg$_h1$f#wSG8 zBzf*a48|%^WOpmQtfu}2Yg1X*0Npy=2*a(t&b!_Ln4yrxT2+(wiBkYx8~%>ESbgpq~ucR4k%?zXGGT-#0j~uEou@1 zQBtdy>x~-V%0c<`bnp12Tss1H4HI%nnW^dhz=Q~4)X;;eu)dMLEjPQmWdgoQ_ML=SVF9}$T ziHXTgXr8Iuhk7O@ewuS8bE~VBuam89h{-sCL_CW^D2${v0pqNj!O^U1;Ja5iS$hO$ zNV@QrfWwg@ho@t6MZUygBr^}nvO4rUc9>A7qia$>z$pK&D~lch5wT(`+j2T@2l>+C22b4tY_o*JUQyg pk|)pn{^iLbPY$mMB~EqEwL2}e!eRgb literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/program_change.mpy b/lib/adafruit_midi/program_change.mpy new file mode 100644 index 0000000000000000000000000000000000000000..16cedcec7c1f2aa53ef69fedbe507bd87563588b GIT binary patch literal 584 zcmX|-UvJW26vj`%Lir;rl)b`+Zex%b&^99MLXCmp<`#i$0ix)|ODV6k3DD+kS;Cbq z^J0l#rqxTo$-aZ}D+p|OcTUdpJm<-;9)P_k%v*UVf2A|c!V_(%Ne0zNRGwf(m8T;j z8gtk}&GUEXO=6nzh(Kzk!jtG{Sin@)OoFfE@r)2kb&7SJLIUH#+#)8%5X0?GtKx*8Tua5n+5q zsHy4GrHIFv5<_23((_8@|4(zQTPC3Ugtal+IBC7_oPiUGEQCeHVFSw8gv7)g-F*c1 zwQ5<0`AU*Tnx)PLqM}cv4IrtuAywC?vLtpfx71~W6&`V^hwEG_$@KT_SR*(5k#=}r zf!XzEe8|`1AE2#6KzyeJJRA3w{fLdT$-oixE*0kcoBcF}eJGiAswkRu479yKsQnBsd2Zky0E0p$21VkJO1?6KVy@!9R)62vb~PDFrGuQE z%ZV?4dZ}PyClB6si06JCEud$6Lh$34+tWbS{&stO{JB>@^^)Or6X(+b7fIWN#I7qu lU4e6jhkyULLa?~ZSDb1o9LqemMb~q>Jm=Zn)w#T2lz(T*rX&CW literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/start.mpy b/lib/adafruit_midi/start.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7d7accf7498e8cba9e620a2d38b4af032bb26a04 GIT binary patch literal 322 zcmX|+O;5r=5QeA4MX6XyLN*vlBz#;@yOD?oz1W~pA~llM1E;l?6*dvu>@FsF(dxy- zKW&ND+dFxm%skW2!>*<62b17YEV!a`KH)^FKqxz2LJ7Nr^MT8x45kdKtCG(DCgafV z*iLd;=cUMRa2@X&io=VW zOaBUL|7+w^q$HrznNqPlA!N$cZ1G@+(VS$`#L4XYT!iTtw@WokFRt9}l!wn&wW8hE z-_2ob@?A(Qy`$~qYC6`()*4=K0^abuV4<>pl*6cuD*0m=k3#LE4kr5AK5Ms|D=s#YH@uZ#a}RK76#f8xS6M*- literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/stop.mpy b/lib/adafruit_midi/stop.mpy new file mode 100644 index 0000000000000000000000000000000000000000..5af3257e2f56aea8fa2ea46744bf6c46de0a26cf GIT binary patch literal 320 zcmX|+-%Eo~6vvM)*S3~Z7?(wZ#(umQDUH@cy(BAYG^3$C?CEBD(+ip6y$gh(te2pF zI!D>t_wfC2&gV?4u%`%`>${KXigFxLpBjwEiJoN8Le}hjW)a5RfIw&6;plH_9O@H& z3^lu8K}$(M87FC3W1b}h5XLVgWi)=q7!-_ClEg(a4kj|T9n-n93*B`EZwIx^@<;EGaeQf*Xnw~!{@Nm7VdlR z@_guj*K4usB&kxndJM~jCw%lkmcDk*Mx%jRM-4?n VTmAeMHT(G++Rl-@52&^9egJ)USZ@FT literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/system_exclusive.mpy b/lib/adafruit_midi/system_exclusive.mpy new file mode 100644 index 0000000000000000000000000000000000000000..9576a99e348cc831717ed205d229e5775d8dda35 GIT binary patch literal 604 zcmZ8dO>@#v6uk)z--Qt96D+L^A4Qna|tVqO8TAW??D`NtJPKJN|fO|ipbV}Yy(omzL*{!Hd zbZHxj)YxWosu_x#QF~5D?hCv)M3)a-{Qr+U6w@i@OU{g47W+S*TReNr?EA7TVsH2z z6e|FVcdNj23AW}#T!Ksa-@wha!Yn`V2i*6J87h}bh34R78H5Cn5cL?EK26B zDT?H+1xhW@Uf%kOqD~GN6s$5RoIq8!#-LqC@!2QNju3p34h77ka#_gytTC%}NXY#1 zdO&zug4JH|(bRsG;lpWD%pDbrLdHo(Dol-WlA*Pe46MCH)LX2T2fiBH-OrkDU$j?N c&-{JXc2<@xvb~kPaBGcKT)gz~a)YmxKkQMePXGV_ literal 0 HcmV?d00001 diff --git a/lib/adafruit_midi/timing_clock.mpy b/lib/adafruit_midi/timing_clock.mpy new file mode 100644 index 0000000000000000000000000000000000000000..2b77fdcfba799259cd61734b1ed1cdeab571f815 GIT binary patch literal 329 zcmXw!(M!Tm7{$NMre$kRh!3eC(S)$tNU{fe5{r^FlC1}yZfm>EOU{kmYqY0ay#)Q! z&C0iPK7NPqoL(OGb*bZc&T~9xf&|QCreFb^`NW-u?u!v6P{LvVvOlDpJ3fWVk|Dvr zE1nu{qXlUHW_rsAG-K*BE@-@>h)5y|NXRRVISXfmfKEtEqcBtENn0b9-L)UA4EYno zu5}CQ;Og$$z5$i+X(%`-7ZV{O-Z4#|iOKxQaKpe{H8;Df2|X6O*_8W4OtMeQ=0?WD z=Wzw4$Lc~G9C+1lE!E|ww42+LQ6B4SSf~T8+bz(QvV4|9rL1h{&tW`rrH{kx__ebr cG#d5t1{QS%H*4t|s`kB`sH19IZ^3Mv`+H5ix}1Cs&zb_?SG literal 0 HcmV?d00001 diff --git a/lib/adafruit_motor/motor.mpy b/lib/adafruit_motor/motor.mpy new file mode 100644 index 0000000000000000000000000000000000000000..b5680bd25b92aedaa976fe668760589642e0a472 GIT binary patch literal 1112 zcmZ8eO>@&m7+(1!{)llT*=z+?LH-KFX=G5`OQ)R@EKDX%VmvWTePCo|y-i#aOUUbh zPF<(dnM`Lo{SQ5HwDS}C4>}xx1LfEs(B5Gs#ew#+`@GNlvCsQ#eGXjzETWn{^LuC1 zC&rOQET`(9s_lXWzG;)bH82lByzSZ;q=;+x2m9b^+c6Q|Gtpz8PBIz~LF&QoR&zu^ z(tdi>w?GZ`9mJ;EE;+CUM$oDTxzws!Q*YNmTCZ<;Z-Uei6M`L36b;)N_DTO31JM}Z zee)cW1IHrd5CdrRFfv`HwTA(JL1%j-;u^?BtR(wU#g&|~1r6gEJ43dKVF2DR9Bf+* zWgBZdZ9~6TU+aME&SrD>99LI9=WWNbu|r&Nl96VD45l4OGfjSUa?cunHH`aOWc&RIB@aaxmIck#$s^eM5C^_8;}Y!3TkZzEdh| z0P*l`^;T4EpL?PljfO4KCNSz;Fpr&jSLT{L2* z0y`|j{zCm=i#IFaKC7}e*Ftcs+ePtGzEGrJmrAASL`t7cq=nW*;>FxV z5?ZL6NQrsc=qi&8kA4N3Cgw|Yd-X=Cytq_e+N|CzFMqSNRbE_QoVNaYp|__+?p6Ih zJO6yC-xte8CIhpvJj?1$I?1G^3_BO3%-!*LN?+>_3qQU4(We98W&Wn(q8EubrZw*0 z8u!N}BZ%^A{mGQR)W7vIXaD@KrTw2VUfLUEcn#aZt7ieV$?gjcE%aR?na$H5y6gpX zqWsSB+5AoVq|zu%#hfTtLT~g2Q!m{0R$)%!7P^y&U(Qo^g2v!^Bn|URm1R0+hKVio E9_XM)3jhEB literal 0 HcmV?d00001 diff --git a/lib/adafruit_motor/servo.mpy b/lib/adafruit_motor/servo.mpy new file mode 100644 index 0000000000000000000000000000000000000000..3e4a3a4cba8b648900b41aaa6148d8df93218283 GIT binary patch literal 1426 zcmZ8f&rc(D6#veYF5R}2nQ0jYT41(6cA!EFLwBP_lP*P;5D8RjNHv@3^xH4c*v{1H z6lgSYT58hO?7_sFH&4dX6!c=^MgIa%yY9g~_#f<&aMbU&16ku~-h1Eo-si`g+$}IC zkEYa$dSJAwrc&2U-AFf)ajd5rZ7|O4G|Z~5sWsp!v>OQc&32=z9fIkCp+Zzv;U~kg z7ne~J_;>fWcUmU!HcskQ9b{nDfOu=8Z64{G;*6%8H~(rXlUm7ukg}#W(H;Q=UgtBL z(>1fIwe(igDRA|wrZif$CIVbtJ-rV7O=OzL0JADITPk6x7^-%NK#Wl^hN5F4N!;VK zD<{>8d34>u9T@1-7SdoFa0*#oX_;-n4?ou}%mEfimVyv@RA3v{5b%)Az>8sU!k9;f zZkjln3M<>Zq8uZmNoXj5Q4|9;bR4CZ?lBERZy*CBbc2B#W}SDt@9DnoJx)U>inA|* zP9YlFO{_v-_H}-&)>>G+d1E?ozjI`ojpp0w^kLOJYL!z^ucvRWn0|0`&YW|AUFQJX zIcuJwxb>ya`t zPY}|?B|IdmTE!WTzrLS1{F9m@R5eXE#U}oDMC?7PwZY?zP0v#$(eg&+TJ*yYk}zJ$ zK2Cm}-Q2JknsFuR@JNK_>4=MW6)nb{q{6o%Zr)wo3|P!4&ODJ(ezds7@3V6+)^~6V zDc*L9)T6DyJ}a_wN&3ZluDC@#V!ZsF7~rD?88E&K&HD;6#rRoY#>M*!GR=$)!?8Sc z_1+hFUq4nVHA_!CeJ>m1@9-mml_i&N59!(#>=aK=WvdbB)zvv@gerEOlK%w zV1*zfyGWFWBc0MOR^Q4poHQR8w-)0ATL{{r(D}uEx|oN(`3sBULK1$G#W!VcVPFS? z!HLW0uf6P5^z5H6E;E!Z@aO-p{?092*g^gkd7aF|uD~*aWW7}q7owzf%KCGCEf0qw zX|scqSFo3rc|l5Axy0S*ij*4U|61R)aEmaNhcRlf|MBw;cZ`0%w)Rmm_mF!dh7}+@ zJmfTqdA$6M&>-EtxH#eOZ(B2;Sz~<<82aOP{OM#Ew)|h0>^p$sIcyDu4GFVhYz;9f zY(rP~^zS~lW|~`+=2`53A;(K1x0C>b3GSQ;{KSm^e7{E(F9rg8J`kq!u(Qhs!jkoQ zR>CR;%zvnn#qlLP6Q@IADP{E%@#vyN#BJnl0bgKXJrTO{th>^jKV+nyQ8`rd{e@WV)8R!T3gSU*~} I5Xr-T0XOZUZU6uP literal 0 HcmV?d00001 diff --git a/lib/adafruit_motor/stepper.mpy b/lib/adafruit_motor/stepper.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a5ddba316ebb2af735e929b4db9401a3620c7951 GIT binary patch literal 1804 zcmZuvTXWi05I(}jCWH`ii9&oyR4~R@uz|SEwO9yW!NwQNxYJYyEZcMdsX{m*FO@LK zI8EB-k8}p(TOQjujr$MM%(Tt)A)V>;p_5A!zqKnAJ1>=H&VGA#_uJjG8*D)50uA28 zVq!@sq(vsniJaici!9Hxf}1a*le%m|TtTu)Ue?EQX)cHGNnQk*$RLAQ6E}J<>XP*5w0bLGy%PZCRGqt zS=6RTfz3gqhs20@k0A+D;1?4jTVu$hQpmbk5Q|Kzn1TdGfz7aqJOD1oDyfk5aweS@ zQ(Tt6iW>6i9IEHjh=~vkv&ss2sEuI|&M*SYbAXIPlhg6RX&T|wU~s&K3^St>!{HDz z(33F=q;+&+HZ&a$4bFv-IWiiYo}8HtMUkv+VpLB?(PyAeHQ=3UXWqxXyYlp&FIjYn zbgmyMrx)pxH4LX04RUf(j+@zBADV@+>UJ*q;f6?QCajq1SZfMMNxEh|p z!yO5#Q;e!ptPRQy0Z2Qoj+^8PB3}^mWVVnONfxMBflRVwo)t-vBNHO2yrM|%=SJGr$l;{k5dzZ@g%@d0|BszrWpiMOntBL^%4EJ zk?_v+p!@jAqz@4mfKePz`Y@u&t07uJm2p#2#?47z9dULlRe#U=;u}c{T(bE5=LbGK zDJ?CLZJC8mXRkeGUu}1FxadfmQ|r`D{YFQpDmLpzb#tq$zG6E?y_Kq)8!DEl8}Y{# z%c-51g|OfK^a;H@Vz7T3t=-s&u`_Y=N6+Z#{ZXCyf&=qoyGv919gWxEIppW@@{?fQ zyi;3xLJxyg7X{lnfIkgqrnToY(0L{ZYtm$s* z&t179N!@6J8FxH1Up0ShU;Fnq0no8a8_+46;0<&j*CbRTFI<`#Ooi6x?KVPsrL+y+0 ztTWQt=A_$u!foxeb37eZX?S_BS{q0&EC9t+OUiKE3ZAL1DcGZ6Wqh!`EcK5h?N!T9 z>5#lf{V4%O>CGcJmB-kEhmd}unGK+eRN`>4^XmC0HXAjnC_8@ul=i4mg_YjgqXJ6E yoBdkyU1cePVI}!EU`h2Dt2(s5()2d?DxBjA&E|W?O@$HG1jnJEffAYr!qk6dNJ(J; literal 0 HcmV?d00001 diff --git a/lib/adafruit_requests/pyproject.toml b/lib/adafruit_requests/pyproject.toml new file mode 100644 index 0000000..291a9cc --- /dev/null +++ b/lib/adafruit_requests/pyproject.toml @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +[build-system] +requires = [ + "setuptools", + "wheel", + "setuptools-scm", +] + +[project] +name = "adafruit-circuitpython-requests" +description = "A requests-like library for web interfacing" +version = "0.0.0+auto.0" +readme = "README.rst" +authors = [ + {name = "Adafruit Industries", email = "circuitpython@adafruit.com"} +] +urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_Requests"} +keywords = [ + "adafruit", + "blinka", + "circuitpython", + "micropython", + "requests", + "requests,", + "networking", +] +license = {text = "MIT"} +classifiers = [ + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Embedded Systems", + "Topic :: System :: Hardware", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", +] +dynamic = ["dependencies", "optional-dependencies"] + +[tool.ruff] +target-version = "py38" + +[tool.ruff.lint] +select = ["I", "PL", "UP"] +ignore = ["PLR2004", "UP030"] + +[tool.ruff.format] +line-ending = "lf" + +[tool.setuptools] +py-modules = ["adafruit_requests"] + +[tool.setuptools.dynamic] +dependencies = {file = ["requirements.txt"]} +optional-dependencies = {optional = {file = ["optional_requirements.txt"]}} diff --git a/lib/adafruit_requests/requirements.txt b/lib/adafruit_requests/requirements.txt new file mode 100644 index 0000000..2505288 --- /dev/null +++ b/lib/adafruit_requests/requirements.txt @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense + +Adafruit-Blinka +Adafruit-Circuitpython-ConnectionManager diff --git a/lib/adafruit_wiznet5k/__init__.py b/lib/adafruit_wiznet5k/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_wiznet5k/adafruit_wiznet5k.mpy b/lib/adafruit_wiznet5k/adafruit_wiznet5k.mpy new file mode 100644 index 0000000000000000000000000000000000000000..afa631132eed630a333c0b8e534aa070eacf16b5 GIT binary patch literal 12264 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 Dy@lrn literal 0 HcmV?d00001 diff --git a/lib/adafruit_wiznet5k/adafruit_wiznet5k_debug.mpy b/lib/adafruit_wiznet5k/adafruit_wiznet5k_debug.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7ef7bca91c60d2cf634a297f674315b6881c294d GIT binary patch literal 566 zcmZWj-EPuQ96#r<@->9RS*0I2uk^cj|T)w8mJE!-tl?l-Gs1WKp-|{}ZJl48JbiGY-Sxqjp-}kgLSEcI zA)5<2M%WTX{+R&cP{6`js28Ok>6nQ^zcs*c4Bd7XyzHNpNVnm0UGm#FTLN(Q1mv8O zj6NIH;de4`Ub+N`jddgemE=#_8=up! zN6b`oITl;J1I8p^dUWA!;m2S!I{g<%`7=Drx)R{a3mzunPkhY;@Cy7IvhE0AJ)^JR zl9nW-r+5HV4RU+PLqWiEravgj7hKz(o&W#< literal 0 HcmV?d00001 diff --git a/lib/adafruit_wiznet5k/adafruit_wiznet5k_dhcp.mpy b/lib/adafruit_wiznet5k/adafruit_wiznet5k_dhcp.mpy new file mode 100644 index 0000000000000000000000000000000000000000..263d26614e38c6660f67cc0fb4626d17e5910b57 GIT binary patch literal 5949 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_wiznet5k/adafruit_wiznet5k_dns.mpy b/lib/adafruit_wiznet5k/adafruit_wiznet5k_dns.mpy new file mode 100644 index 0000000000000000000000000000000000000000..05239c6d027b7e9b03a890f57b7ec38d2748556e GIT binary patch literal 2614 zcmZWoT~Hg>6~4P5tO(gGD`ibUm}~vQWm(S%swh?9C#d5lXF(G$$&1-# zKAlli9YB6Dt0W~XivLko&g6hylEsuHgM1|KAp;=i=hH$)lgk+ySxY0eGBCUA7L{dS zD?@=xtFopE%gEhHZU8a|JoZWxVCR)3K}5u}YC0q9dX87pfGJ~Xa%N4=0J_qaS0vC} zHIuTstgnD(Bz7gG>5Dm4K-!(?lh;z>eOU*t%9|Hcsw#^*ps~TPV%kmB(0WGE&%VTD z3bD3nNm)(TW8R7WRiQyTznPF#e1GzW0pp=p|h_(=}3c9!g%S5a3 z9Et;rJEpD)NkxK7Nnu$lg9X`*t)7Z?J+!zLKuPhetl>R|Vk)cZP+Li5lM-B%;q@M< zpemenxeKE8fy1h{E@xl_Ck|91?yB$2;z1ZZEAN@hrDZtW1I47EX)rbkmk@*m6%`5< z$W5dtwFEbFxSK0By~e`otS|>Gl7)*oUDnQpD@X%)Do8X6cUKvmLBe&Rf`P8zYcx=H zXfg%gbXQ4fXDsy9+tqlf({g%u4RHiFC zGgHBp@WB8}__f~Wp>W};njU27nH*B_t?@e>L{G=&7NYQo>j@I~h78+;`;K=$;_vCn zz>g{E-gf8qhCz{CL`#i}WXQx=mqFE17OJkRrsaaGmZ^1F7>lcpsY^80auWt+MVW88 ztc*2r+qTdcdc{Q&w~4z(yv4@Y45}VQ?XG&JK4DN7k$uT^k-3QM28!w;TN+&rOoNMJ zsDwKYn45ioar6<4vyWt&=lW_Wnk5-JF4mgCUmMm-j@B#2b?7N@qx8GGERl$dKY913 zl;8P19gtH=_?t{U;T z@Q=SVtPjcNz8h?-AsP+6?UO!tdT1&-HZ|p&=;t$_*0=Y|L4!#=Fnfc zcqxB;RQ@zxaN+Pmc((M}nPaqM9v_9nVMm#JsgysdHZ)&whFNjuPfFYW=l+Lr%B2p= z`P4k2t{&h4AWo&7CJdgZmE0LfFSs*Xa-=_z=$XDFV*D)*VXJd&! zEXBX>u-`>DA}*S`)lTnxGqm$|;}A1U(M)){i__y!o$Tvliw&bwWEJWT>RC&-_UcNkul>t z<3f8_?eI_c{?I+@^|`NkeWRW2bG=^QxI60eMJK#I@7>OV!yo?}7yeMBo#-+JYY+~C zImGB)A@Bu$ckj{fp){6o_ftLjP`)OCCsA;C(0HY6XzjJ43sR9}(0QE;?VY{Ah{X2ox8 d<}20l_)&)ypNx6D@bUA==O324muc;b{{_k9BAEaH literal 0 HcmV?d00001 diff --git a/lib/adafruit_wiznet5k/adafruit_wiznet5k_socketpool.mpy b/lib/adafruit_wiznet5k/adafruit_wiznet5k_socketpool.mpy new file mode 100644 index 0000000000000000000000000000000000000000..68f6a3081e484c0b1d67818860074a4b0447aec2 GIT binary patch literal 6239 zcmaJ@U2qy%cD|rLgfMDByM-hyw?PPmBrIc$?b-1}f<_jyEP)V~dU;+xw8(&C}Lwl1goAtMYSh zcOz-W+4T?i-qYv*JLlXRY(|GApJg$bN~VkDjKE&Y+{p35i7Q9nqOhercZC-U`Fz$> zSVQepGMCE>Ng9SBR@+^zG=N2L%HaHOqo(oT(MY^d>NkGI*0dpp^NIzFD zWO<~I=irPC!dfAdTSCNq_|kM}?!-AX{+4CWTNI?{i^W_XH7;?;w74el`C^JMqUO?C z2}vE&5+P)`DvpXN zHAqou%(lb}s#KlZR(gx1Ul#JYENWiNEFo!d{j~JHOerB#27qFd@D)+zT%pJd!Wvjo z={X^vM5a9|1;&!86u6Miqi#4X=S#xkS}wW5BN~n@KC_E!tW1#x3<}!FQV$5@j;!?) zm(7>>6u^$zSiq1+Ms~5BP6GE5jU|nu&!N#SK0g_b> zLNch8SJc z!&%_@qKpB zvT-JY3@XKtIGA<^$E7|-K zvdk$XRUzwANg;`(1tScdQsxGaB#qQ$P$!Tfhwp?EYF^3YP*R`eS9zGA7@YNx4*QH& znj6p&Eo$bdODxuhv*T{2%Rs|NxG0PWrWNsPs3>9iy4jv*UP*IHF@Ti zc{&_f_0g*5yBd;oDlZ6pYWQk7nWB}c4+2O2pn#8-y#=1m2+YYnML8N@FiQY&Q`<*3 zJ@tR6X?P}=U8B`&iB@WaE|m)y6g~y&==l@p=#_k`oaIX%)QnJ5_c+WQ_$K7(WEN^I zDe!6;gIz23O(|+RQvwED>TC33zMMZH-~5e6hQ{* zWT}){$|?3Rt$w@95y@93=yk?RJdKAF_6mAHmc}sv5b1o8r(+b(V+SS>VxOR2^I2$adBa!!E;wLC5+7{Ud3 zH9?`J0Tt{cJQX}1KuUW+57EZtN64fa+}O9EURA$FT_4GoQrC=-CJ6 zaT5O%N9S-$f2=@0+4b3j`{N0*JXx*Bg2CJ6RE=>4EqLFAK znu!)d=Wgn0wKh_X)+VaS+DtWDTc{SRj?yi3G%`~np$DlptDe#?Ot#H;NZMaA!G%f9 zWii@gpbYSPfI1)&Mqp~U8Y$y~ND#2^uo4sjdlO-HYkNqmi85Kulz9R84^mQt9Z^!_ z5d1XFc@aVRv=lYx)exPq>5OvPy9RoU`q-7A?LkK{m`#Gg?U_b(BYhKkmlZ@m6ZYtEY}_baaVPd~TzB70$4Jaggek+9ZQ?K=ivt zY9^`a^$R9ql8g>iJ=k6KYk*R_fPdngM0XQCQaiAIr>|PESfdrop(wW@3{briA&!bI z11E=V74k4aZ}_#3O;ShIr`deTe3v*v+CUR&_akP;B$>RZ`hid5(=dTqF2ZTnBacT7 z5|Y})aI6xGo$GomnxumuJOBPy?ycaQn4{)34>$U0tR@;Jf+_zRK2bZ5#iCzOHQj8#wdzZ-C844oU3`;!Uy51sZxG zxS(tfFySj^D>)1lZvB*v^kBA6#WuG~O~)%nW^7Oyk7CBn#J_Bc8rKM_U(D&$Owt zQmt+8_?oyM_F2BK?fm$w#Au@L)2>u%)3T|*+j_TWt8L4)Y5l~o<=!Hr1lRuU@-wY)o_ygR^g_^*~DqI#gP-}7pzQK;!LsOiZL zNiWy*IlRF&J=HPkZGm+TRvoPK-d5^j$E4`i#E$FXd>QC%uzmom0agyy1F)uHHNu)v zdD~(CA#{Z{cATKHDzO8IdDzQj6CAG84`w)&yd))f4^k|sqTn3!c2YC2x4?cC)-G7r zVC{zW2CO}>egvx(*6)G;uswuJp1P?Vdga3{<#1R&+>Ube9r|YgffqNKRRQ5&#TJ*V z&(+uGa50{N8b(_#p+k1a2oHsRqGCQ_wn8^XDi;5C#d6Z#Qn8%E#6uO!X=u@RFzVkS z-ktTYql)EB#e4>;_$4mGLw3j_w1-4@>EDB{`ftqnC&1v>EJV49R{f~deh*c+KO6aJ zqi+m+>Xi;l^u30`LC5SM?F`#Ij_}|jy-%uQJ_#Ony=0zN)wnWP5uL38k*zV>Su zFqu(IDCCg(^*7G~(9>3OT>iN8HRIit7`Tu!FNLNFy(5oZFo0oaTbi{fTbVL7AvW!=k8oT z?VbYa(L`dD(z@`@R+kTE}6sB!DMBg7myFqs%Viv5bqVdLEedFO_) zWwBB70FUinTr@ab74thdK)bzFo)#CO;Q`J&6Ysb$%1r4*!f|xc&Rk8q9d`RU?4sMioTy_oj z_Ye0U9``V={=T99VVB9|LyrTmpwdn=JpP@3|BG?LWXANWPiwog{JSsk&4CR$>@X0( z&^g69Kxe8#vXI~kc^UuKKZNBEIP>57kWd7Z$`WxmynYe<)7v=eMHz+>?USdlc?KiX ze8Q)B{s79ua%SfNG#q&`3IV&d0K>PG0?u+9!jR%0Yy*CTd(incfQm_Kgf7Gr9Z~|kwIIZN$ZiC1eOkVb2obQP z!A}3ZpNo3WuoIF8fCR-r5Ozc2KM z=_?>OC=E%L`|pW*--P3+jT<^@Ki}7P4j#1*m)p@F%6SF`Lw36}8#rq_Ydbz7*6>59 zRe3opId>k+H>(If&Y-;2(J4y;+IU>Bn>~PpMBcD2YU1o zq_q0*;iG@|XfHf`^sApdc=YS%Kz|ekI$R%tnk47)r#}YyFGSf2*79RnTup7Hp4LY= zt^W|1#%G*G<@_1w2dkg?G_nz83zn44ub&4J4?%e_@N=kBwJp`*IPKQHW&(k-Qk8)~ z8a5DOAiycjy`wZYP`_j*O_IlCFc)zLiC+fq+`GzL6PNqFBTi-7{I4kIAwIkZ6fZ1-Nu1|CkEX44DcEepD`>4(t z5_cqkq+Y=AFh12~iUI52CFntzGP}1w-l~`FEIcdVYF!>M%>d)`#HhoLzXCXC>Z1m3 zpwYi->|KS7AC*R=WA|Sq5+k-M+zi)VGL!htavji%LIZpF^;6x{8ZaKa|4UK-tvCDW z{cm=7>E8f@zfB|{InZ>r?vFssd;j;M(J|ndtj@k+!WD8Y3ezPpUyZzBCgEg1h>y?< z$L;V+!%rJshw*z-d!<8csgO7DZOlbl4L5;uh~D55t%h5$wbPI$Our3>0b1n#4+X1Z A#{d8T literal 0 HcmV?d00001 diff --git a/sd/placeholder.txt b/sd/placeholder.txt new file mode 100644 index 0000000..6e9754c --- /dev/null +++ b/sd/placeholder.txt @@ -0,0 +1 @@ +SD cards mounted at /sd will hide this file from Python. SD cards are not visible via USB CIRCUITPY. diff --git a/settings.toml b/settings.toml new file mode 100644 index 0000000..b8b4ad7 --- /dev/null +++ b/settings.toml @@ -0,0 +1,7 @@ +# setting.toml +WIFI_SSID = "EloiStreeWifi2G" +WIFI_PASSWORD="11234566" +WOW_INT_IP_TARGET="192.168.1.253" +WOW_INT_PORT_BYTE_TARGET="7073" +WOW_INT_PORT_TEXT_TARGET="7072" +WOW_INT_PLAYER_INDEX="1" \ No newline at end of file diff --git a/wow_int.py b/wow_int.py new file mode 100644 index 0000000..d3b5009 --- /dev/null +++ b/wow_int.py @@ -0,0 +1,136 @@ + +import struct +import time +import os +import ssl +import socketpool +import wifi +import ipaddress +class WowInt: + + + + + def __init__(self, auto_launch_wifi:bool): + """Initialize the class with the target IP address and port number.""" + self.m_ip_target=os.getenv("WOW_INT_IP_TARGET") + self.m_port_byte_integer=int(os.getenv("WOW_INT_PORT_BYTE_TARGET")) + self.m_port_text_utf8=int(os.getenv("WOW_INT_PORT_TEXT_TARGET")) + self.m_index=int(os.getenv("WOW_INT_PLAYER_INDEX")) + self.m_using_wifi=False + self.m_lock_push_all=True + if auto_launch_wifi: + self.try_to_connect_wifi() + + + def override_index(self,index:int): + self.m_index=index + + def override_target_ip(self,ip:str): + self.m_ip_target=ip + def override_target_port_byte(self,port:int): + self.m_port_byte_integer=port + def override_target_port_text(self,port:int): + self.m_port_text_utf8=port + + + def try_to_connect_wifi(self): + """Connect to Wi-Fi using the credentials defined in setting.toml """ + + WIFI_SSID = os.getenv("WIFI_SSID") + WIFI_PASSWORD = os.getenv("WIFI_PASSWORD") + print(f"WIFI_SSID: {WIFI_SSID}") + print("Connecting to Wi-Fi...") + try: + wifi.radio.connect(WIFI_SSID, WIFI_PASSWORD) + print("Connected to Wi-Fi!") + self.m_using_wifi=True + except ConnectionError as e: + print("Failed to connect to Wi-Fi:", e) + raise e + + time.sleep(1) + print("Ready to play World of Warcraft from Pico Wifi !") + print('Pico Wifi IP address is:', wifi.radio.ipv4_address) + print("Target IP address is:", self.m_ip_target) + print("Target Port for Integer is:", self.m_port_byte_integer) + print("Target Port for Text is:", self.m_port_text_utf8) + print("Player Index is:", self.m_index) + + + def push(self, value:int): + """ It push the integer on the network to the target to indexed champion in game""" + self.send_index_integer(self.m_index,value) + + def push_all(self, value:int): + """ It push the integer on the network to the target to all the champions in game""" + self.send_index_integer(0,value) + + def send_UTF8(self,text:str): + if not self.m_using_wifi: + return + pool = socketpool.SocketPool(wifi.radio) + udp_socket = pool.socket(pool.AF_INET, pool.SOCK_DGRAM) + #try: + udp_socket.sendto(bytes(text, "utf-8"), (self.m_ip_target, self.m_port_text_utf8)) + print(f"Sent message: {text} to {self.m_ip_target}:{self.m_port_text_utf8}") + #except: + # print(f"Failed to send Integer: {text} to {self.m_ip_target}:{self.m_port_text_utf8}") + + #finally: + udp_socket.close() + + def lock_push_all(self,lock:bool = True): + self.m_lock_push_all=lock + + def unlock_push_all(self): + self.m_lock_push_all=False + + def send_index_integer(self,index:int,integer:int): + if not self.m_using_wifi: + return + if self.m_lock_push_all and index==0: + print("Push All is locked") + return + byte_integer_value = struct.pack("