Получение оперативной информации из / dev / input

#python #linux #ubuntu #input #device

#устройство #c #udev #блок-устройство

Вопрос:

Я не уверен, что это правильное место для этого вопроса. Я пытаюсь получить значения положения оси с помощью джойстика /dev/input/js0 в моей системе. Если я запущу jstest /dev/input/js0 , это даст мне оперативную обратную связь по всем кнопкам и положениям осей.

Я пытаюсь ввести эту информацию в свою программу на C для управления сервоприводами. Есть ли функция для этого? Я мало работал с устройствами ввода в программировании, так что все это для меня ново.

Ответ №1:

Вы можете запустить этот код python для чтения событий.
Вы также можете использовать модуль высокого уровня 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)
  

Пример вывода:

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

Основываясь на сообщении от kev

Из файла linux / joystick.h:

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

Итак, формат python должен быть: «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)
  

пример вывода с контроллера XBOX One S:

 // 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
  

Ответ №3:

Эта страница:http://scaryreasoner.wordpress.com/2008/02/22/programming-joysticks-with-linux в / есть хорошая запись о том, как считывать информацию из / dev / input / js0

Формат событий, которые вы считываете из файла, задокументирован здесь: https://www.kernel.org/doc/Documentation/input/input.txt . Это простая структура, содержащая временную метку, тип события и идентификатор, а также значение:

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