Adafruit_Learning_System_Gu.../CH9328_CPython_Demo/code.py
2024-06-11 20:07:28 -04:00

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()