/ Step_Switch_Pico_Demo / code.py
code.py
1 # SPDX-FileCopyrightText: 2022 john park for Adafruit Industries 2 # SPDX-License-Identifier: MIT 3 # Pico Four Step Switch Keypad Demo 4 import time 5 import board 6 import keypad 7 from digitalio import Direction, DigitalInOut 8 9 board_led = DigitalInOut(board.LED) 10 board_led.direction = Direction.OUTPUT 11 board_led.value = True 12 13 switch_pins = (board.GP6, board.GP7, board.GP8, board.GP9) 14 keys = keypad.Keys(switch_pins, value_when_pressed=False, pull=True) 15 16 led_pins = (board.GP2, board.GP3, board.GP4, board.GP5) 17 leds = [] 18 for led_pin in led_pins: 19 tmp_led_pin = DigitalInOut(led_pin) 20 tmp_led_pin.direction = Direction.OUTPUT 21 tmp_led_pin.value = False 22 leds.append(tmp_led_pin) 23 24 def blink_led(led_num, pause, repeat): 25 for __ in range(repeat * 2): 26 leds[led_num].value = not leds[led_num].value 27 time.sleep(pause) 28 29 def blink_all_leds(pause, repeat): 30 for __ in range(repeat * 2): 31 for led in leds: 32 led.value = not led.value 33 time.sleep(pause) 34 35 blink_all_leds(0.1, 4) 36 37 38 mode_picked = False # state of mode selection 39 mode_choice = 0 # MIDI mode, desk switcher mode, etc. 40 modes = (0, 1, 2, 3) 41 mode_names = ("MIDI", "DESK", "SELECTOR", "COPY-PASTE") 42 43 print("Select the mode by pressing a button: MIDI, DESK, SELECTOR, or COPY-PASTE") 44 while not mode_picked: # program waits for a mode to be picked 45 key = keys.events.get() 46 if key: 47 if key.pressed: 48 mode_choice = key.key_number 49 print(mode_names[mode_choice], "mode") 50 mode_picked = True 51 52 53 if mode_choice == 0: # MIDI mode 54 import usb_midi 55 import adafruit_midi 56 from adafruit_midi.control_change import ControlChange 57 midi = adafruit_midi.MIDI( 58 midi_in=usb_midi.ports[0], 59 in_channel=0, 60 midi_out=usb_midi.ports[1], 61 out_channel=0 62 ) 63 cc_num = [16, 17, 18, 19] 64 cc_state = [False, False, False, False] 65 66 else: # HID modes 67 import usb_hid 68 from adafruit_hid.keyboard import Keyboard 69 from adafruit_hid.keycode import Keycode 70 71 if mode_choice == 1: # Mac Desktop switcher mode 72 kpd = Keyboard(usb_hid.devices) 73 MODIFIER = Keycode.CONTROL 74 KEYMAP = ( 75 ("Desktop 1", [MODIFIER, Keycode.ONE]), 76 ("Desktop 2", [MODIFIER, Keycode.TWO]), 77 ("Desktop 3", [MODIFIER, Keycode.THREE]), 78 ("Desktop 4", [MODIFIER, Keycode.FOUR]), 79 ) 80 81 if mode_choice == 2: # SELECTOR mode for game weapon slot, Wirecast, etc. 82 kpd = Keyboard(usb_hid.devices) 83 MODIFIER = Keycode.SHIFT 84 KEYMAP = ( 85 ("Selector 1", [MODIFIER, Keycode.ONE]), 86 ("Selector 2", [MODIFIER, Keycode.TWO]), 87 ("Selector 3", [MODIFIER, Keycode.THREE]), 88 ("Selector 4", [MODIFIER, Keycode.FOUR]), 89 ) 90 91 if mode_choice == 3: # Copy/Paste mode 92 kpd = Keyboard(usb_hid.devices) 93 # Choose the correct modifier key for Windows or Mac. 94 # MODIFIER = Keycode.CONTROL # For Windows 95 MODIFIER = Keycode.COMMAND 96 KEYMAP = ( 97 ("Copy/Paste 1", [MODIFIER, Keycode.A]), # select all 98 ("Copy/Paste 2", [MODIFIER, Keycode.X]), # cut 99 ("Copy/Paste 3", [MODIFIER, Keycode.C]), # copy 100 ("Copy/Paste 4", [MODIFIER, Keycode.V]), # paste 101 ) 102 103 blink_led(mode_choice, 0.1, 3) 104 105 while True: 106 key = keys.events.get() 107 if key: 108 if key.pressed: 109 i = key.key_number 110 print(i, "pressed") 111 if mode_choice == 0: 112 leds[i].value = not leds[i].value 113 if cc_state[i] is False: 114 midi.send(ControlChange(cc_num[i], 127)) 115 cc_state[i] = True 116 else: 117 midi.send(ControlChange(cc_num[i], 0)) 118 cc_state[i] = False 119 else: 120 print(KEYMAP[i][0]) 121 kpd.send(*KEYMAP[i][1]) 122 for switch_led in leds: # blank the LEDs first 123 switch_led.value = False 124 leds[i].value = True # light selected switch LED