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
|
#include "controller.h"
#include <stdio.h>
#define CHANNEL_THROTTLE 0
#define THROTTLE_MIN 1000
#define THROTTLE_MAX 2000
//convert the value from an axis to an appropriate ppm value
//between 1000 and 2000
inline channel_t axis_to_channel(int value) {
long centered = (long) value - AXIS_MIN;
long proportional = centered * 1000 / (AXIS_MAX - AXIS_MIN);
return (channel_t) 1000 + proportional;
}
void channel_reset(channel_t* channels) {
for (size_t i = 0; i < CHANNELS; ++i) {
channels[i] = CHANNEL_UNUSED;
}
channels[0] = THROTTLE_MIN;
channels[1] = 1500;
channels[2] = 1500;
channels[3] = 1500;
channels[4] = 1500;
}
void event_axis(channel_t* channels, int axis, int value) {
channels[axis+1] = axis_to_channel(value);
}
void event_button(channel_t* channels, int button, bool value) {
if (value) {
switch(button) {
case 0:
channel_reset(channels);
break;
case 4:
channel_step(channels, CHANNEL_THROTTLE, -10, THROTTLE_MIN, THROTTLE_MAX);
break;
case 5:
channel_step(channels, CHANNEL_THROTTLE, 10, THROTTLE_MIN, THROTTLE_MAX);
break;
case 6:
channel_step(channels, CHANNEL_THROTTLE, -100, THROTTLE_MIN, THROTTLE_MAX);
break;
case 7:
channel_step(channels, CHANNEL_THROTTLE, 100, THROTTLE_MIN, THROTTLE_MAX);
break;
default:
break;
}
}
}
|