joydev_sys/
lib.rs

1//! This crate contains Linux joydev definitions from `linux/joystick.h`.
2//!
3//! Those are raw definitions so for documentation see the official
4//! [kernel documentation](https://www.kernel.org/doc/html/latest/input/joydev/joystick-api.html#joystick-api).
5#![cfg(target_os = "linux")]
6#![no_std]
7
8extern crate input_event_codes;
9extern crate libc;
10extern crate nix;
11
12use core::mem::size_of;
13
14use input_event_codes::{ABS_CNT, BTN_MISC, KEY_CNT};
15use libc::{__s16, __s32, __u16, __u32, __u8, c_long, c_longlong, c_ulong, size_t};
16use nix::{request_code_read, request_code_write};
17
18#[allow(non_camel_case_types)]
19pub type __s64 = c_longlong;
20
21pub const JS_VERSION: __u32 = 0x0002_0100;
22
23pub const JS_EVENT_BUTTON: __u8 = 0x01;
24pub const JS_EVENT_AXIS: __u8 = 0x02;
25pub const JS_EVENT_INIT: __u8 = 0x80;
26
27#[allow(non_camel_case_types)]
28#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
29#[repr(C)]
30pub struct js_event {
31	pub time: __u32,
32	pub value: __s16,
33	pub type_: __u8,
34	pub number: __u8,
35}
36
37impl Copy for js_event {}
38
39impl Clone for js_event {
40	fn clone(&self) -> Self {
41		*self
42	}
43}
44
45pub const JSIOCGVERSION: c_ulong = request_code_read!(b'j', 0x01, size_of::<__u32>());
46
47pub const JSIOCGAXES: c_ulong = request_code_read!(b'j', 0x11, size_of::<__u8>());
48pub const JSIOCGBUTTONS: c_ulong = request_code_read!(b'j', 0x12, size_of::<__u8>());
49#[allow(non_snake_case)]
50pub const fn JSIOCGNAME(len: size_t) -> c_ulong {
51	request_code_read!(b'j', 0x13, len)
52}
53
54pub const JSIOCSCORR: c_ulong = request_code_write!(b'j', 0x21, size_of::<js_corr>());
55pub const JSIOCGCORR: c_ulong = request_code_read!(b'j', 0x22, size_of::<js_corr>());
56
57pub const JSIOCSAXMAP: c_ulong = request_code_write!(b'j', 0x31, size_of::<[__u8; ABS_CNT as usize]>());
58pub const JSIOCGAXMAP: c_ulong = request_code_read!(b'j', 0x32, size_of::<[__u8; ABS_CNT as usize]>());
59pub const JSIOCSBTNMAP: c_ulong = request_code_write!(b'j', 0x33, size_of::<[__u16; (KEY_CNT - BTN_MISC) as usize]>());
60pub const JSIOCGBTNMAP: c_ulong = request_code_read!(b'j', 0x34, size_of::<[__u16; (KEY_CNT - BTN_MISC) as usize]>());
61
62pub const JS_CORR_NONE: __u16 = 0x00;
63pub const JS_CORR_BROKEN: __u16 = 0x01;
64
65#[allow(non_camel_case_types)]
66#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
67#[repr(C)]
68pub struct js_corr {
69	pub coef: [__s32; 8],
70	pub prec: __s16,
71	pub type_: __u16,
72}
73
74impl Copy for js_corr {}
75
76impl Clone for js_corr {
77	fn clone(&self) -> Self {
78		*self
79	}
80}
81
82pub const JS_RETURN: size_t = size_of::<JS_DATA_TYPE>();
83pub const JS_TRUE: __u8 = 1;
84pub const JS_FALSE: __u8 = 0;
85pub const JS_X_0: __u8 = 0x01;
86pub const JS_Y_0: __u8 = 0x02;
87pub const JS_X_1: __u8 = 0x04;
88pub const JS_Y_1: __u8 = 0x08;
89pub const JS_MAX: __u8 = 2;
90
91pub const JS_DEF_TIMEOUT: __u16 = 0x1300;
92pub const JS_DEF_CORR: __u8 = 0;
93pub const JS_DEF_TIMELIMIT: c_long = 10;
94
95pub const JS_SET_CAL: __u8 = 1;
96pub const JS_GET_CAL: __u8 = 2;
97pub const JS_SET_TIMEOUT: __u8 = 3;
98pub const JS_GET_TIMEOUT: __u8 = 4;
99pub const JS_SET_TIMELIMIT: __u8 = 5;
100pub const JS_GET_TIMELIMIT: __u8 = 6;
101pub const JS_GET_ALL: __u8 = 7;
102pub const JS_SET_ALL: __u8 = 8;
103
104#[allow(non_camel_case_types)]
105#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
106#[repr(C)]
107pub struct JS_DATA_TYPE {
108	pub buttons: __s32,
109	pub x: __s32,
110	pub y: __s32,
111}
112
113impl Copy for JS_DATA_TYPE {}
114
115impl Clone for JS_DATA_TYPE {
116	fn clone(&self) -> Self {
117		*self
118	}
119}
120
121#[allow(non_camel_case_types)]
122#[allow(non_snake_case)]
123#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
124#[repr(C)]
125pub struct JS_DATA_SAVE_TYPE_32 {
126	pub JS_TIMEOUT: __s32,
127	pub BUSY: __s32,
128	pub JS_EXPIRETIME: __s32,
129	pub JS_TIMELIMIT: __s32,
130	pub JS_SAVE: JS_DATA_TYPE,
131	pub JS_CORR: JS_DATA_TYPE,
132}
133
134impl Copy for JS_DATA_SAVE_TYPE_32 {}
135
136impl Clone for JS_DATA_SAVE_TYPE_32 {
137	fn clone(&self) -> Self {
138		*self
139	}
140}
141
142#[allow(non_camel_case_types)]
143#[allow(non_snake_case)]
144#[cfg_attr(feature = "extra_traits", derive(Debug, Eq, Hash, PartialEq))]
145#[repr(C)]
146pub struct JS_DATA_SAVE_TYPE_64 {
147	pub JS_TIMEOUT: __s32,
148	pub BUSY: __s32,
149	pub JS_EXPIRETIME: __s64,
150	pub JS_TIMELIMIT: __s64,
151	pub JS_SAVE: JS_DATA_TYPE,
152	pub JS_CORR: JS_DATA_TYPE,
153}
154
155impl Copy for JS_DATA_SAVE_TYPE_64 {}
156
157impl Clone for JS_DATA_SAVE_TYPE_64 {
158	fn clone(&self) -> Self {
159		*self
160	}
161}