-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy pathjoystick.hh
154 lines (128 loc) · 3.5 KB
/
joystick.hh
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright Drew Noakes 2013-2016
#ifndef __JOYSTICK_HH__
#define __JOYSTICK_HH__
#include <string>
#include <iostream>
#define JS_EVENT_BUTTON 0x01 // button pressed/released
#define JS_EVENT_AXIS 0x02 // joystick moved
#define JS_EVENT_INIT 0x80 // initial state of device
/**
* Encapsulates all data relevant to a sampled joystick event.
*/
class JoystickEvent
{
public:
/** Minimum value of axes range */
static const short MIN_AXES_VALUE = -32768;
/** Maximum value of axes range */
static const short MAX_AXES_VALUE = 32767;
/**
* The timestamp of the event, in milliseconds.
*/
unsigned int time;
/**
* The value associated with this joystick event.
* For buttons this will be either 1 (down) or 0 (up).
* For axes, this will range between MIN_AXES_VALUE and MAX_AXES_VALUE.
*/
short value;
/**
* The event type.
*/
unsigned char type;
/**
* The axis/button number.
*/
unsigned char number;
/**
* Returns true if this event is the result of a button press.
*/
bool isButton()
{
return (type & JS_EVENT_BUTTON) != 0;
}
/**
* Returns true if this event is the result of an axis movement.
*/
bool isAxis()
{
return (type & JS_EVENT_AXIS) != 0;
}
/**
* Returns true if this event is part of the initial state obtained when
* the joystick is first connected to.
*/
bool isInitialState()
{
return (type & JS_EVENT_INIT) != 0;
}
/**
* The ostream inserter needs to be a friend so it can access the
* internal data structures.
*/
friend std::ostream& operator<<(std::ostream& os, const JoystickEvent& e);
};
/**
* Stream insertion function so you can do this:
* cout << event << endl;
*/
std::ostream& operator<<(std::ostream& os, const JoystickEvent& e);
/**
* Represents a joystick device. Allows data to be sampled from it.
*/
class Joystick
{
private:
void openPath(std::string devicePath, bool blocking=false);
int _fd;
public:
~Joystick();
/**
* Initialises an instance for the first joystick: /dev/input/js0
*/
Joystick();
/**
* Initialises an instance for the joystick with the specified,
* zero-indexed number.
*/
Joystick(int joystickNumber);
/**
* Initialises an instance for the joystick device specified.
*/
Joystick(std::string devicePath);
/**
* Joystick objects cannot be copied
*/
Joystick(Joystick const&) = delete;
/**
* Joystick objects can be moved
*/
Joystick(Joystick &&) = default;
/**
* Initialises an instance for the joystick device specified and provide
* the option of blocking I/O.
*/
Joystick(std::string devicePath, bool blocking);
/**
* Returns true if the joystick was found and may be used, otherwise false.
*/
bool isFound();
/**
* Attempts to populate the provided JoystickEvent instance with data
* from the joystick. Returns true if data is available, otherwise false.
*/
bool sample(JoystickEvent* event);
};
#endif