linux_joystick_helloworld

Linux joystick example
git clone https://0xdd.org/code/linux_joystick_helloworld.git
Log | Files | Refs | LICENSE

commit eef7c77ee24fec31665ac9eb00a7ad68889d02ef
Author: David DiPaola <DavidDiPaola@users.noreply.github.com>
Date:   Wed, 17 Oct 2018 18:58:25 -0400

initial commit

Diffstat:
A.gitignore | 3+++
AMakefile | 15+++++++++++++++
Amain.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,3 @@ +*.o +linux_joystick_helloworld + diff --git a/Makefile b/Makefile @@ -0,0 +1,15 @@ +BIN = linux_joystick_helloworld + +_CFLAGS = -Wall -Wextra \ + $(CFLAGS) + +.PHONY: all +all: $(BIN) + +$(BIN): main.c + $(CC) $(_CFLAGS) $< -o $@ + +.PHONY: clean +clean: + rm -rf $(BIN) + diff --git a/main.c b/main.c @@ -0,0 +1,73 @@ +#include <stdio.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include <unistd.h> + +#include <errno.h> + +#include <linux/joystick.h> + +int +main() { + printf("open() ..." "\n"); + int js_fd = -1; + char js_path[64]; + #define js_path_BASE "/dev/input/js" + for (int i=0; (i<=9 && js_fd<0); i++) { + snprintf(js_path, sizeof(js_path), js_path_BASE "%i", i); + js_fd = open(js_path, O_RDONLY | O_NONBLOCK); + } + if (js_fd < 0) { + fprintf(stderr, "ERROR: could not open any joystick devices at " js_path_BASE "X" "\n"); + return 1; + } + printf("open() success (%s)" "\n", js_path); + #undef js_path_BASE + + printf("ioctl() %s :" "\n", js_path); + char c; + ioctl(js_fd, JSIOCGAXES, &c); printf("\t" "number of axes: %i" "\n", c); + ioctl(js_fd, JSIOCGBUTTONS, &c); printf("\t" "number of buttons: %i" "\n", c); + char s[128] = "Unknown"; + ioctl(js_fd, JSIOCGNAME(sizeof(s)), s); printf("\t" "name: %s" "\n", s); + + printf("press HOME button to exit" "\n"); + int done = 0; + while (!done) { + usleep(16666); + + struct js_event event; + ssize_t amount = read(js_fd, &event, sizeof(event)); + if (amount < (ssize_t)sizeof(event)) { + if (errno != EAGAIN) { + fprintf(stderr, "%s: read() expected %zi bytes but got %zi bytes" "\n", js_path, amount, sizeof(event)); + return 1; + } + else { + continue; + } + } + + if (event.type & JS_EVENT_AXIS) { + printf("axis %i = %i" "\n", event.number, event.value); + } + else if (event.type & JS_EVENT_BUTTON) { + printf("button %i = %i" "\n", event.number, event.value); + if ((event.number == 8) && event.value) { + done = 1; + } + } + else if (event.type & JS_EVENT_INIT) { + printf("init" "\n"); + } + else { + printf("WARNING: event type unknown (0x%02X)" "\n", event.type); + } + } + + close(js_fd); +} +