Для управления машинкой решили использовать джойстик. А проще всего использовать джойстик в своих программах в linux.
Всё, что необходимо — читать файл устройства (например /dev/input/js0) в специальную структуру:
- время — unsigned int
- значение — short
- тип события — unsigned char
- номер кнопки/оси — unsigned char
И в итоге последовательность действий совсем простая:
- Читаем событие
- Фильтруем события инициализации
- Реагируем на ось или кнопку
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #define JOYSTICK_DEVNAME "/dev/input/js0" #define JS_EVENT_BUTTON 0x01 #define JS_EVENT_AXIS 0x02 #define JS_EVENT_INIT 0x80 struct js_event { unsigned int time; /* отметка времени в миллисекундах */ short value; /* значение */ unsigned char type; /* тип события */ unsigned char number; /* номер кнопки/оси */ }; static int joystick_fd = -1; int open_joystick() { joystick_fd = open(JOYSTICK_DEVNAME, O_RDONLY | O_NONBLOCK); // Открываем файл /dev/input/js0 return joystick_fd; } int read_joystick_event(struct js_event *jse) { int bytes; // число прочитанных байт int size = sizeof(*jse); // размер структуры для чтения // читаем событие bytes = read(joystick_fd, jse, sizeof(*jse)); // нет новых событий if (bytes == -1) return 0; // если размер совпал, то прочитано новое событие if (bytes == sizeof(*jse)) return 1; // ошибка: прочитано совсем не то, что хотели printf("Unexpected bytes from joystick:%d\n", bytes); return -1; } void close_joystick() { // просто закрываем файл close(joystick_fd); } // простой тест int main(int argc, char *argv[]) { int fd, rc; int done = 0; struct js_event jse; fd = open_joystick(); if (fd < 0) { printf("open failed.\n"); exit(1); } while (!done) { rc = read_joystick_event(&jse); // читаем раз в секунду usleep(1000); if (rc == 1) { // фильтруем события инициализации jse.type &= ~JS_EVENT_INIT; // изменено положение оси if (jse.type == JS_EVENT_AXIS) { printf("Event: time %8u, value %8hd, type: %3u, axis: %u\n", jse.time, jse.value, jse.type, jse.number); } // нажата кнопка if (jse.type == JS_EVENT_BUTTON) { printf("Event: time %8u, value %8hd, type: %3u, button: %u\n", jse.time, jse.value, jse.type, jse.number); } } } } |