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