-
Notifications
You must be signed in to change notification settings - Fork 5
/
joystick.cpp
169 lines (147 loc) · 3.35 KB
/
joystick.cpp
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "joystick.hpp"
Joystick::Joystick(std::string port)
{
int fd = open(port.c_str(), O_RDONLY);
if (fd < 0)
{
std::cout << "Failed to open [" << port << "]." << std::endl;
exit(0);
}
this->port_ = fd;
}
Joystick::~Joystick()
{
accept_js_input_ = false;
close(this->port_);
}
void Joystick::update()
{
// zero out the previous event
memset(&event_, 0, JS_EVENT_SIZE);
size_t bytes_read = 0;
ssize_t tmp = 0;
// Blocking read
// TODO: convert to non blocking?
while (bytes_read < JS_EVENT_SIZE)
{
tmp = read(port_, &event_ + bytes_read, JS_EVENT_SIZE - bytes_read);
if (tmp > 0)
{
bytes_read += tmp;
}
}
event_.type &= ~EVENT_INIT;
if (event_.type == EVENT_AXIS)
{
updated_axis_ = static_cast<AxisId>(event_.id);
is_axis_update_ = true;
is_button_update_ = false;
axis_values_[event_.id] = event_.value;
}
if (event_.type == EVENT_BUTTON)
{
updated_button_ = static_cast<ButtonId>(event_.id);
is_axis_update_ = false;
is_button_update_ = true;
button_values_[event_.id] = event_.value;
}
}
bool Joystick::hasButtonUpdate()
{
return is_button_update_;
}
bool Joystick::hasAxisUpdate()
{
return is_axis_update_;
}
uint8_t Joystick::getButtonState(ButtonId button_id)
{
return button_values_[(int) button_id];
}
int16_t Joystick::getAxisState(AxisId axis_id)
{
return axis_values_[(int) axis_id];
}
ButtonId Joystick::getUpdatedButton()
{
return updated_button_;
}
AxisId Joystick::getUpdatedAxis()
{
return updated_axis_;
}
short Joystick::map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
#define OUT_MAX 100
#define OUT_MIN -100
short Joystick::mapConstLimits(long x)
{
return (x - SHRT_MIN) * (OUT_MAX - OUT_MIN) / (SHRT_MAX - SHRT_MIN) + OUT_MIN;
}
void Joystick::update_buttons()
{
ButtonId update = getUpdatedButton();
unsigned int value = getButtonState(update);
switch (update)
{
BUTTON_A:
BUTTON_B:
BUTTON_X:
BUTTON_Y:
BUTTON_LEFT_BUMPER_1:
BUTTON_RIGHT_BUMPER_1:
BUTTON_LEFT_BUMPER_2:
BUTTON_RIGHT_BUMPER_2:
BUTTON_START:
BUTTON_TURBO:
BUTTON_SELECT:
BUTTON_CLEAR:
BUTTON_LEFT_CLICK:
BUTTON_RIGHT_CLICK:
BUTTON_FRONT_CLICK:
BUTTON_BACK_CLICK:
default:
std::cout << "Button: [" << update << "] Value: [" << value <<"]" << std::endl;
break;
}
}
void Joystick::update_axes()
{
AxisId update = getUpdatedAxis();
int16_t value = getAxisState(update);
switch (update)
{
AXIS_LEFT_STICK_HORIZONTAL:
AXIS_LEFT_STICK_VERTICAL:
AXIS_LEFT_TRIGGER:
AXIS_RIGHT_STICK_HORIZONTAL:
AXIS_RIGHT_STICK_VERTICAL:
AXIS_RIGHT_TRIGGER:
default:
std::cout << "Axis: [" << update << "] Value: [" << value << "]" << std::endl;
break;
}
}
void Joystick::worker(){
while(accept_js_input_)
{
usleep(1000);
update();
if (hasButtonUpdate())
{
update_buttons();
}
if (hasAxisUpdate())
{
update_axes();
}
}
}
uint8_t Joystick::getValueButton(int i){
return axis_values_[i];
}
int16_t Joystick::getValueAxis(int i){
return axis_values_[i];
}