ROGueENEMY/input_dev.h

94 lines
2.3 KiB
C

#pragma once
#include "message.h"
#undef INCLUDE_INPUT_DEBUG
#undef IGNORE_INPUT_SCAN
#define MAX_COLLECTED_EVDEV_EVENTS 16
#define MAX_INPUT_DEVICES 8
typedef struct evdev_collected {
struct input_event ev[MAX_COLLECTED_EVDEV_EVENTS];
size_t ev_count;
} evdev_collected_t;
/**
* A function with this signature grapbs input_event data and sends to the pipe messages
* constructed from that data.
*/
typedef int (*ev_map)(const evdev_collected_t *const e, in_message_t *const messages, size_t messages_len, void* user_data);
typedef int (*hidraw_map)(int hidraw_fd, in_message_t *const messages, size_t messages_len, void* user_data);
typedef enum input_dev_type {
input_dev_type_uinput,
input_dev_type_iio,
input_dev_type_hidraw,
} input_dev_type_t;
typedef struct hidraw_filters {
const int16_t pid;
const int16_t vid;
const uint32_t rdesc_size; // wc -c < /sys/class/hidraw/hidraw0/device/report_descriptor
} hidraw_filters_t;
typedef struct uinput_filters {
const char name[256];
} uinput_filters_t;
typedef struct iio_filters {
const char name[256];
} iio_filters_t;
typedef int (*hidraw_set_leds)(uint8_t r, uint8_t g, uint8_t b, void* user_data);
typedef int (*hidraw_rumble)(uint8_t left_motor, uint8_t right_motor, void* user_data);
typedef struct hidraw_callbacks {
hidraw_set_leds leds_callback;
hidraw_rumble rumble_callback;
} hidraw_callbacks_t;
typedef struct iio_settings {
const char* const sampling_freq_hz;
int8_t post_matrix[3][3];
} iio_settings_t;
typedef struct input_dev {
input_dev_type_t dev_type;
union {
uinput_filters_t ev;
iio_filters_t iio;
hidraw_filters_t hidraw;
} filters;
void* user_data;
union input_dev_map {
iio_settings_t iio_settings;
ev_map ev_input_map_fn;
hidraw_map hidraw_input_map_fn;
} map;
} input_dev_t;
typedef int (*platform_init)(void** platform_data);
typedef void (*platform_deinit)(void** platform_data);
typedef int (*platform_leds)(uint8_t r, uint8_t g, uint8_t b, void* platform_data);
typedef struct input_dev_composite {
const input_dev_t* dev[MAX_INPUT_DEVICES];
size_t dev_count;
platform_leds leds_fn;
platform_init init_fn;
platform_deinit deinit_fn;
} input_dev_composite_t;