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