Add cec-remote scripts

master
Kuba Orlik 3 days ago
parent 69b511af2d
commit 535e8c5a72

@ -1,14 +0,0 @@
[Unit]
Description=CEC Receiver Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/kuba/cec-remote/cec_receiver.py
WorkingDirectory=/home/kuba/cec-remote
Restart=on-failure
RestartSec=5
User=kuba
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target

@ -0,0 +1,127 @@
#!/usr/bin/env python3
import socket
import json
from evdev import UInput, ecodes as e
# Capabilities for both gamepad and keyboard
capabilities = {
e.EV_KEY: [
e.BTN_A, e.BTN_B, e.BTN_START,
e.BTN_DPAD_UP, e.BTN_DPAD_DOWN, e.BTN_DPAD_LEFT, e.BTN_DPAD_RIGHT,
e.KEY_LEFTCTRL, e.KEY_1
]
}
# Mapping CEC keys to gamepad buttons or keyboard keys
key_map = {
'SELECT': e.BTN_A,
'EXIT': e.BTN_B,
'PLAY': e.BTN_START,
'PAUSE': e.BTN_START,
'UP': e.BTN_DPAD_UP,
'DOWN': e.BTN_DPAD_DOWN,
'LEFT': e.BTN_DPAD_LEFT,
'RIGHT': e.BTN_DPAD_RIGHT
# 'CLEAR' handled separately
}
import time
from evdev import InputDevice, ecodes, list_devices, UInput
# Define key codes for Ctrl and 1
SHIFT = ecodes.KEY_LEFTSHIFT
TAB = ecodes.KEY_TAB
# Define virtual keyboard capabilities (DO NOT include EV_SYN)
keyboard_events = {
ecodes.EV_KEY: [SHIFT,TAB],
}
# Create the virtual input device
keyboard_ui = UInput(events=keyboard_events, name="Virtual Ctrl+1 Injector", bustype=ecodes.BUS_USB)
def home():
print("Sending shift+home")
keyboard_ui.write(ecodes.EV_KEY, SHIFT, 1) # Press Ctrl
keyboard_ui.write(ecodes.EV_KEY, TAB, 1) # Press 1
keyboard_ui.syn()
time.sleep(0.1)
keyboard_ui.write(ecodes.EV_KEY, SHIFT, 0) # Release 1
keyboard_ui.write(ecodes.EV_KEY, TAB, 0) # Release Ctrl
keyboard_ui.syn()
last_pressed = None # Track last key to release
def create_virtual_device():
return UInput(capabilities, name='CEC Virtual Input', bustype=e.BUS_USB)
def handle_press(ui, key):
global last_pressed
if key == 'CLEAR':
home()
return
code = key_map.get(key)
if not code:
print(f"Unknown key: {key}")
return
if code == last_pressed:
return
handle_release(ui)
ui.write(e.EV_KEY, code, 1)
ui.syn()
last_pressed = code
print(f"Pressed {key} ({code})")
def handle_release(ui):
global last_pressed
if last_pressed is None:
return
if isinstance(last_pressed, tuple):
# Release both Ctrl and 1
for code in last_pressed:
ui.write(e.EV_KEY, code, 0)
print("Released Ctrl+1")
else:
ui.write(e.EV_KEY, last_pressed, 0)
print(f"Released {last_pressed}")
ui.syn()
last_pressed = None
def start_udp_listener():
ui = create_virtual_device()
print("Virtual input device ready")
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 41234))
print("Listening for UDP input...")
while True:
data, _ = sock.recvfrom(1024)
try:
print("new payload")
payload = json.loads(data.decode())
if payload['type'] == 'key':
event_type = payload.get('event')
key_name = payload.get('key', '').upper()
if event_type == 'press':
handle_press(ui, key_name)
elif event_type == 'release':
handle_release(ui)
except Exception as ex:
print(f"Error: {ex}")
if __name__ == "__main__":
try:
start_udp_listener()
except KeyboardInterrupt:
print("Shutting down...")

@ -0,0 +1,13 @@
import libevdev
import sys
device_path = sys.argv[1]
with open(device_path, 'rb') as f:
d = libevdev.Device(f)
print(f"Device: {d.name}")
print("Capabilities:")
for event_type, codes in d.capabilities().items():
print(f" {event_type}:")
for code in codes:
print(f" {code}")

@ -3,4 +3,19 @@
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
echo $SCRIPT_DIR echo $SCRIPT_DIR
sudo cp $SCRIPT_DIR/cec-remote.service /etc/systemd/system/cec-remote.service cat | sudo tee /etc/systemd/system/cec-remote.service <<EOF
[Unit]
Description=CEC Receiver Service
After=network.target
[Service]
ExecStart=/usr/bin/python3 $SCRIPT_DIR/cec_receiver.py
WorkingDirectory=/home/kuba/cec-remote
Restart=on-failure
RestartSec=5
User=kuba
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
EOF

@ -0,0 +1,32 @@
import time
from evdev import InputDevice, ecodes, list_devices, UInput
# Define key codes for Ctrl and 1
CTRL = ecodes.KEY_LEFTCTRL
KEY_1 = ecodes.KEY_1
# Define virtual keyboard capabilities (DO NOT include EV_SYN)
keyboard_events = {
ecodes.EV_KEY: [CTRL, KEY_1],
}
# Create the virtual input device
ui = UInput(events=keyboard_events, name="Virtual Ctrl+1 Injector", bustype=ecodes.BUS_USB)
try:
while True:
print("Sending Ctrl + 1")
ui.write(ecodes.EV_KEY, CTRL, 1) # Press Ctrl
ui.write(ecodes.EV_KEY, KEY_1, 1) # Press 1
ui.syn()
time.sleep(0.1)
ui.write(ecodes.EV_KEY, KEY_1, 0) # Release 1
ui.write(ecodes.EV_KEY, CTRL, 0) # Release Ctrl
ui.syn()
time.sleep(2)
except KeyboardInterrupt:
print("Exiting...")
ui.close()
Loading…
Cancel
Save