# (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)  
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT