init
This commit is contained in:
commit
cf0af3737d
2 changed files with 115 additions and 0 deletions
102
main.py
Normal file
102
main.py
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import struct
|
||||||
|
import sys
|
||||||
|
import libevdev
|
||||||
|
#from libevdev import ecodes
|
||||||
|
|
||||||
|
def main(device_path, dest_ip, dest_port,username,password):
|
||||||
|
"""
|
||||||
|
Reads absolute X and Y coordinates from an evdev device and sends them
|
||||||
|
over UDP to a specified address and port.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
device_path (str): The path to the input event device
|
||||||
|
(e.g., /dev/input/event0).
|
||||||
|
dest_ip (str): The destination IP address.
|
||||||
|
dest_port (int): The destination port.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Open the evdev device in a non-blocking way
|
||||||
|
fd = open(device_path, 'rb')
|
||||||
|
d = libevdev.Device(fd)
|
||||||
|
print(f"Successfully opened device: {d.name}")
|
||||||
|
|
||||||
|
|
||||||
|
print("Listening for ABS_X and ABS_Y events. Press Ctrl+C to exit.")
|
||||||
|
|
||||||
|
# Create a UDP socket
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
print(f"Sending coordinates to {dest_ip}:{dest_port}")
|
||||||
|
|
||||||
|
# Variables to store the latest coordinates
|
||||||
|
x_coor = None
|
||||||
|
y_coor = None
|
||||||
|
|
||||||
|
# Loop indefinitely to read events
|
||||||
|
while True:
|
||||||
|
for e in d.events():
|
||||||
|
# We are only interested in absolute axis events
|
||||||
|
if e.type == libevdev.EV_ABS:
|
||||||
|
if e.code == libevdev.EV_ABS.ABS_X:
|
||||||
|
x_coor = e.value
|
||||||
|
elif e.code == libevdev.EV_ABS.ABS_Y:
|
||||||
|
y_coor = e.value
|
||||||
|
|
||||||
|
# When we have both coordinates, send them
|
||||||
|
if x_coor is not None and y_coor is not None:
|
||||||
|
print(f"Read coordinates: X={x_coor}, Y={y_coor}")
|
||||||
|
|
||||||
|
# Pack the two 16-bit unsigned integers into a buffer.
|
||||||
|
# The format string 'HH' specifies two unsigned short integers (u16).
|
||||||
|
# The '<' character ensures little-endian byte order.
|
||||||
|
try:
|
||||||
|
packet = struct.pack('<HH', x_coor, y_coor)
|
||||||
|
|
||||||
|
# Send the packet over UDP
|
||||||
|
sock.sendto(packet, (dest_ip, dest_port))
|
||||||
|
print(f"Sent {len(packet)} bytes.")
|
||||||
|
|
||||||
|
# Reset coordinates to wait for the next pair of events
|
||||||
|
x_coor = None
|
||||||
|
y_coor = None
|
||||||
|
|
||||||
|
except struct.error as se:
|
||||||
|
print(f"Error packing data: {se}. Coordinates might be out of range for u16 (0-65535).")
|
||||||
|
except socket.error as soe:
|
||||||
|
print(f"Socket error: {soe}")
|
||||||
|
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Error: Device not found at {device_path}")
|
||||||
|
print("Please ensure you have the correct event device path.")
|
||||||
|
except PermissionError:
|
||||||
|
print(f"Error: Permission denied for {device_path}.")
|
||||||
|
print("This script usually needs to be run with root privileges (e.g., 'sudo python3 script.py')")
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\nExiting.")
|
||||||
|
finally:
|
||||||
|
if 'fd' in locals() and not fd.closed:
|
||||||
|
fd.close()
|
||||||
|
if 'sock' in locals():
|
||||||
|
sock.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
print("Usage: python3 evdev_udp_sender.py <device_path> <dest_ip> <dest_port>")
|
||||||
|
print("Example: sudo python3 evdev_udp_sender.py /dev/input/event4 127.0.0.1 12345")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
device = sys.argv[1]
|
||||||
|
ip = sys.argv[2]
|
||||||
|
try:
|
||||||
|
port = int(sys.argv[3])
|
||||||
|
if not (0 < port < 65536):
|
||||||
|
raise ValueError
|
||||||
|
except ValueError:
|
||||||
|
print("Error: Port must be an integer between 1 and 65535.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
main(device, ip, port)
|
||||||
|
|
13
shell.nix
Normal file
13
shell.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> {};
|
||||||
|
in pkgs.mkShell {
|
||||||
|
packages = [ pkgs.libinput
|
||||||
|
(pkgs.python3.withPackages (python-pkgs: [
|
||||||
|
python-pkgs.paho-mqtt
|
||||||
|
pkgs.libinput
|
||||||
|
python-pkgs.libevdev
|
||||||
|
]))
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue