Rotary phone USB hid input first commit
This commit is contained in:
parent
8ccd02c286
commit
48a9ee6749
2 changed files with 106 additions and 0 deletions
19
Rotary_Phone_Keypad/boot.py
Normal file
19
Rotary_Phone_Keypad/boot.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# SPDX-FileCopyrightText: 2022 Tod Kurt & John Park for Adafruit Industries
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# boot.py to enable or disable usb_hid
|
||||||
|
import usb_hid
|
||||||
|
import board
|
||||||
|
import digitalio
|
||||||
|
|
||||||
|
# set a pull-up
|
||||||
|
# If not pressed, the key will be at +V (due to the pull-up)
|
||||||
|
button = digitalio.DigitalInOut(board.D2)
|
||||||
|
button.pull = digitalio.Pull.UP
|
||||||
|
|
||||||
|
# Disable devices only if button is not pressed
|
||||||
|
# Phone receiver is normally open when handset is in place
|
||||||
|
if button.value:
|
||||||
|
print("USB HID disabled")
|
||||||
|
usb_hid.disable()
|
||||||
87
Rotary_Phone_Keypad/code.py
Normal file
87
Rotary_Phone_Keypad/code.py
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
# SPDX-FileCopyrightText: 2022 Tod Kurt & John Park for Adafruit Industries
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# Rotary phone USB keypad
|
||||||
|
|
||||||
|
import time
|
||||||
|
import board
|
||||||
|
import digitalio
|
||||||
|
import microcontroller
|
||||||
|
import usb_hid
|
||||||
|
from adafruit_hid.keyboard import Keyboard
|
||||||
|
from adafruit_hid.keycode import Keycode
|
||||||
|
from adafruit_debouncer import Debouncer
|
||||||
|
import neopixel
|
||||||
|
|
||||||
|
|
||||||
|
dial_in = digitalio.DigitalInOut(board.RX) # normally closed pulse dial switch
|
||||||
|
dial_in.pull = digitalio.Pull.UP
|
||||||
|
dial = Debouncer(dial_in)
|
||||||
|
|
||||||
|
receiver_in = digitalio.DigitalInOut(board.D2) # normally open receiver switch
|
||||||
|
receiver_in.pull = digitalio.Pull.UP
|
||||||
|
receiver = Debouncer(receiver_in)
|
||||||
|
|
||||||
|
|
||||||
|
# check if usb_hid has been enabled in boot.py
|
||||||
|
if len(usb_hid.devices) == 0:
|
||||||
|
on_hook = True
|
||||||
|
print("on hook")
|
||||||
|
else:
|
||||||
|
kbd = Keyboard(usb_hid.devices)
|
||||||
|
on_hook = False
|
||||||
|
print("off hook")
|
||||||
|
|
||||||
|
keymap = [
|
||||||
|
Keycode.ONE,
|
||||||
|
Keycode.TWO,
|
||||||
|
Keycode.THREE,
|
||||||
|
Keycode.FOUR,
|
||||||
|
Keycode.FIVE,
|
||||||
|
Keycode.SIX,
|
||||||
|
Keycode.SEVEN,
|
||||||
|
Keycode.EIGHT,
|
||||||
|
Keycode.NINE,
|
||||||
|
Keycode.ZERO
|
||||||
|
]
|
||||||
|
|
||||||
|
def read_rotary_dial_pulses(timeout=0.2): # 0.2 is proper timing for pulses
|
||||||
|
dial.update()
|
||||||
|
if not dial.rose: # NC dial pin is pulled low normally, high when open
|
||||||
|
return 0
|
||||||
|
pulse_count = 1
|
||||||
|
last_pulse_time = time.monotonic()
|
||||||
|
|
||||||
|
while time.monotonic() - last_pulse_time < timeout: # count pulses that are within 0.2sec
|
||||||
|
dial.update()
|
||||||
|
if dial.rose:
|
||||||
|
pulse_count = pulse_count+1
|
||||||
|
last_pulse_time = time.monotonic()
|
||||||
|
|
||||||
|
return pulse_count
|
||||||
|
|
||||||
|
pixel = neopixel.NeoPixel(board.NEOPIXEL, 1)
|
||||||
|
|
||||||
|
|
||||||
|
print("Rotary phone USB keypad")
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
receiver.update()
|
||||||
|
if receiver.fell: # only dial when receiver is off hook
|
||||||
|
print("Off hook")
|
||||||
|
pixel[0] = 0x00ff00
|
||||||
|
microcontroller.reset() # the boot.py enables usb_hid if off hook
|
||||||
|
|
||||||
|
if receiver.rose:
|
||||||
|
print("On hook")
|
||||||
|
pixel[0] = 0xff0000
|
||||||
|
microcontroller.reset() # the boot.py disables usb_hid if on hook
|
||||||
|
|
||||||
|
# if not on_hook:
|
||||||
|
num_pulses = read_rotary_dial_pulses()
|
||||||
|
if num_pulses:
|
||||||
|
print("pulse count:", num_pulses)
|
||||||
|
if not on_hook:
|
||||||
|
kbd.send(keymap[num_pulses-1])
|
||||||
Loading…
Reference in a new issue