Getting real-time information with / dev / input

I am not sure if this is the right place for this question. I am trying to get the axis position values ​​from the /dev/input/js0 on my system. If I run jstest /dev/input/js0 , it will give me direct feedback on all buttons and axis positions. I am trying to pass this information to my C program for controlling servo motors. Is there a function for this? I didn’t work very much with input devices in programming, so for me this is not new at all. Any help is appreciated.

+6
source share
3 answers

This page: http://scaryreasoner.wordpress.com/2008/02/22/programming-joysticks-with-linux/ has a nice post on how to read information from / dev / input / js 0

The format of the events that you read from the file is described here: https://www.kernel.org/doc/Documentation/input/input.txt . This is a simple structure containing a timestamp, type and identifier of the event, and value:

 struct input_event { struct timeval time; unsigned short type; unsigned short code; unsigned int value; }; 
+2
source

You can run this python code to read events.
You can also use the high level module python-evdev .

 #!/usr/bin/env python import struct infile_path = "/dev/input/js0" EVENT_SIZE = struct.calcsize("llHHI") file = open(infile_path, "rb") event = file.read(EVENT_SIZE) while event: print(struct.unpack("llHHI", event)) (tv_sec, tv_usec, type, code, value) = struct.unpack("llHHI", event) event = file.read(EVENT_SIZE) 

Output Example:

 (73324490, 8454144, 55242, 1118, 25231360) (73324490, 42008576, 55242, 1118, 58785792) (73324490, 75563008, 55242, 1118, 92340224) (73324490, 109117440, 55242, 1118, 125894656) (73324490, 142671872, 55242, 1118, 159449088) (73324490, 176226304, 55242, 1118, 193003520) (73324490, 209780736, 55242, 1118, 226557952) (73324490, 243335168, 55242, 1118, 8519680) (73324490, 25296896, 55242, 1118, 42074112) (73324490, 58884097, 55242, 1118, 75661313) (73324490, 92405760, 55242, 1118, 109215745) (73324490, 125992961, 55242, 1118, 142737408) (73324490, 159514624, 55242, 1118, 176324609) (73327790, 84041474, 58542, 1118, 84049919) (73328030, 84044852, 58782, 1118, 84017152) (73331790, 33749013, 62542, 1118, 33742256) (73331790, 33736851, 62562, 1118, 33731108) (73331830, 33723339, 62602, 1118, 33718273) (73332090, 33723339, 62862, 1118, 33685504) 
+2
source

Building a post from kev

From linux / joystick.h file:

 struct js_event { __u32 time; /* event timestamp in milliseconds */ __s16 value; /* value */ __u8 type; /* event type */ __u8 number; /* axis/button number */ }; 

So the python format should be: "LhBB"

 infile_path = "/dev/input/js0" EVENT_SIZE = struct.calcsize("LhBB") file = open(infile_path, "rb") event = file.read(EVENT_SIZE) while event: print(struct.unpack("LhBB", event)) (tv_msec, value, type, number) = struct.unpack("LhBB", event) event = file.read(EVENT_SIZE) 

sample output from the XBOX One S controller:

 // type=button, number=button number //msec, value, type, number (2114530, 1, 1, 0) // A pressed (2114670, 0, 1, 0) // A released (2116490, 1, 1, 1) // B pressed (2116620, 0, 1, 1) // B released (2117370, 1, 1, 2) // X pressed (2117520, 0, 1, 2) // X released (2118220, 1, 1, 3) // Y pressed (2118360, 0, 1, 3) // Y released 
0
source

All Articles