75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import sys
|
|
import serial
|
|
import keyboard
|
|
|
|
port = '/dev/ttyUSB0' # Replace with your actual serial port
|
|
|
|
# Define a mapping for special characters when shift is pressed
|
|
SHIFTED_KEYS = {
|
|
'1': '!', '2': '@', '3': '#', '4': '$', '5': '%',
|
|
'6': '^', '7': '&', '8': '*', '9': '(', '0': ')',
|
|
'`': '~', '-': '_', '=': '+', '[': '{', ']': '}',
|
|
'\\': '|', ';': ':', "'": '"', ',': '<', '.': '>',
|
|
'/': '?'
|
|
}
|
|
|
|
def send_key(serial_port, key):
|
|
"""
|
|
Send a key press to the CH9328 via UART.
|
|
|
|
Parameters:
|
|
serial_port (serial.Serial): The serial port connection.
|
|
key (str): The key to send.
|
|
"""
|
|
serial_port.write(key.encode('ascii'))
|
|
serial_port.flush()
|
|
|
|
def send_empty_report(serial_port):
|
|
"""
|
|
Send an empty HID report to reset the state of the device.
|
|
|
|
Parameters:
|
|
serial_port (serial.Serial): The serial port connection.
|
|
"""
|
|
try:
|
|
empty_report = bytearray([0] * 8)
|
|
serial_port.write(empty_report)
|
|
serial_port.flush()
|
|
except serial.SerialException as e:
|
|
print(f"Failed to send empty report: {e}")
|
|
|
|
def main():
|
|
# Configure the serial connection
|
|
baudrate = 9600 # Default baud rate for CH9328 in Mode 1
|
|
timeout = 1
|
|
|
|
with serial.Serial(port, baudrate, timeout=timeout) as ser:
|
|
|
|
print("Listening for keyboard inputs. Press 'ESC' to exit.")
|
|
|
|
def on_key_event(event):
|
|
if event.event_type == 'down':
|
|
key = event.name
|
|
if len(key) == 1: # Only process single character keys
|
|
if keyboard.is_pressed('shift'): # Check if shift is pressed
|
|
key = SHIFTED_KEYS.get(key, key.upper())
|
|
send_key(ser, key)
|
|
elif key == 'space':
|
|
send_key(ser, ' ')
|
|
elif key == 'enter':
|
|
send_key(ser, '\n')
|
|
send_empty_report(ser)
|
|
|
|
# Hook the keyboard event
|
|
keyboard.hook(on_key_event)
|
|
|
|
# Wait for ESC to exit
|
|
keyboard.wait('esc')
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
sys.exit()
|