# (C) 2022 by Oliver Kuhlemann
# Bei Verwendung freue ich mich um Namensnennung,
# Quellenangabe und Verlinkung
# Quelle: http://cool-web.de/raspberry/
import board
import digitalio
from time import sleep
import displayio
import adafruit_displayio_ssd1306
import terminalio
from adafruit_display_text import label
import busio
import microcontroller
import rotaryio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
from adafruit_hid.mouse import Mouse
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
from hid_gamepad import Gamepad
led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
######## Keyboard, Mouse, GamePad
keyb = Keyboard(usb_hid.devices)
keyb_layout = KeyboardLayoutUS(keyb)
mouse = Mouse(usb_hid.devices)
gp = Gamepad(usb_hid.devices)
######## ggf. Sondertasten
#cc = ConsumerControl(usb_hid.devices)
######## Buttons
btn1 = digitalio.DigitalInOut(board.GP22)
btn2 = digitalio.DigitalInOut(board.GP21)
dg_btn = digitalio.DigitalInOut(board.GP18)
#dg_clk = digitalio.DigitalInOut(board.GP20)
#dg_data = digitalio.DigitalInOut(board.GP19)
btn1.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.DOWN
btn2.direction = digitalio.Direction.INPUT
btn2.pull = digitalio.Pull.DOWN
dg_btn.direction = digitalio.Direction.INPUT
dg_btn.pull = digitalio.Pull.DOWN
######## Drehgeber
dg = rotaryio.IncrementalEncoder(board.GP20, board.GP19)
######## OLED
displayio.release_displays()
i2c = busio.I2C(scl=board.GP17, sda=board.GP16, frequency=400000)
display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=64)
display.brightness=0.0 # 0.0..1.0
# Tastatur:
# keyb.press/release(Keycode.x); keyb_layout.write("string")
# Keycode.x: A..Z; ONE..ZERO; F1..F12; SHIFT, ALT, CONTROL, GUI (Win-Key); SPACE, TAB
# ermitteln: print (layout.keycodes('$'))
# Maus:
# mouse.move(wheel = 1[up] / -1[dw])
# m.move(x=-100, y=-100)
# m.press(Mouse.LEFT_BUTTON)
# m.move(x=50, y=20)
# m.release_all()
# Mouse.x: LEFT_BUTTON, RIGHT_BUTTON, MIDDLE_BUTTON;
# GamePad:
# gp.press_buttons(1)
# gp.move_joysticks(x = -127..127, y = -127,127)
# ConsumerControl:
# cc.send(ConsumerControlCode.BRIGHTNESS_INCREMENT); MUTE, etc.
dg_last_pos = None
while True:
# Button 1 simuliert die Taste "A"
if btn1.value:
keyb.press(Keycode.GUI, Keycode.SHIFT, Keycode.ALT, Keycode.CONTROL, Keycode.F1)
print ("btn 1")
while btn1.value: # warten auf loslassen
sleep (.01)
keyb.release(Keycode.GUI, Keycode.SHIFT, Keycode.ALT, Keycode.CONTROL, Keycode.F1)
# Button 2 simuliert die linke Maustaste
if btn2.value:
mouse.press(Mouse.LEFT_BUTTON)
print ("btn 2")
while btn2.value: # warten auf loslassen
sleep (.01)
mouse.release(Mouse.LEFT_BUTTON)
# Drehgeber-Button simuliert den Gamepad Button A
if dg_btn.value == 0:
print ("dg_btn")
led.value = 1
gp.press_buttons(1)
while dg_btn.value == 0: # warten auf loslassen
sleep (.01)
gp.release_buttons(1)
led.value = 0
# Drehgeber simuliert Mausrad
dg_pos=dg.position
if dg_last_pos is not None:
if dg_pos != dg_last_pos:
print ("dg:" , dg_last_pos, "->", dg_pos)
if dg_pos > dg_last_pos:
print ("wheel down")
mouse.move(wheel=-1)
if dg_pos < dg_last_pos:
print ("wheel up")
mouse.move(wheel=1)
dg_last_pos = dg_pos
sleep (.01)