1
1
#include < Arduino.h>
2
- #include " EspNowRcLink/Transmitter.h"
3
2
#include " tx.hpp"
4
- #include " sim.hpp"
5
3
6
4
#if defined(PIN_PPM) && defined(USE_ANALOG)
7
5
#error "PIN_PPM and USE_ANALOG Cannot be defined at the same time!"
8
6
#endif
9
7
8
+ #define SIM_INTERVAL_MS 20 // 20ms => 50Hz
9
+
10
+ #ifdef MODE_SIM
11
+ #include " sim.hpp"
12
+ Sim rxSim;
13
+ #endif
14
+
10
15
#ifdef PIN_PPM
11
16
#include " ppm.h"
12
17
PPM rxPpm;
@@ -17,19 +22,49 @@ PPM rxPpm;
17
22
Analog rxAnalog;
18
23
#endif
19
24
20
- // uncomment to activate simultor on channel 3
21
- // #define SIM_INTERVAL_MS 20 // 20ms => 50Hz
25
+ #ifdef MODE_RX
26
+ #include " EspNowRcLink/Receiver.h"
27
+ EspNowRcLink::Receiver rxEspNow;
28
+ #endif
22
29
23
- Sim rxSim;
24
- Tx txData;
30
+ # ifdef MODE_TX
31
+ # include " EspNowRcLink/Transmitter.h "
25
32
EspNowRcLink::Transmitter txEspNow;
33
+ #endif
34
+
35
+ #ifdef MODE_GAMEPAD
36
+ #include < Joystick_ESP32S2.h>
37
+ Joystick_ Joystick (JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 3 , 0 ,
38
+ true , true , true , // axis x,y,z
39
+ false , false , false , // rotation x,y,z
40
+ true , true , // throttle, rudder
41
+ false , false , false // accel, brake, steering
42
+ );
43
+
44
+ #define INPUT_OFFSET -1500
45
+ #define INPUT_RANGE_MIN -512
46
+ #define INPUT_RANGE_MAX 512
47
+ #define AXIS_RANGE_MIN -512
48
+ #define AXIS_RANGE_MAX 512
49
+ #define BUTTON_THRESHOLD 1650
50
+
51
+ int16_t gamepadScale (int16_t val)
52
+ {
53
+ return constrain (val + INPUT_OFFSET, INPUT_RANGE_MIN, INPUT_RANGE_MAX);
54
+ }
55
+ #endif
56
+
57
+ Tx txData;
26
58
27
59
void setup ()
28
60
{
29
61
#ifdef PRINT_INFO
30
62
Serial.begin (115200 );
31
63
#endif
32
64
65
+ #ifdef MODE_SIM
66
+ rxSim.begin ();
67
+ #else
33
68
#ifdef PIN_PPM
34
69
rxPpm.begin (PIN_PPM, FALLING);
35
70
#endif
@@ -42,9 +77,26 @@ void setup()
42
77
rxAnalog.attach (4 , Analog::MODE_DIGITAL, PIN_SW0);
43
78
rxAnalog.attach (5 , Analog::MODE_DIGITAL, PIN_SW1);
44
79
rxAnalog.attach (6 , Analog::MODE_DIGITAL, PIN_SW2);
80
+ rxAnalog.attach (7 , Analog::MODE_DIGITAL, PIN_SW3);
45
81
#endif
46
82
83
+ #ifdef MODE_RX
84
+ rxEspNow.begin (true );
85
+ #endif
86
+ #endif
87
+
88
+ #ifdef MODE_TX
47
89
txEspNow.begin (true );
90
+ #endif
91
+
92
+ #ifdef MODE_GAMEPAD
93
+ Joystick.setXAxisRange (AXIS_RANGE_MIN, AXIS_RANGE_MAX);
94
+ Joystick.setYAxisRange (AXIS_RANGE_MIN, AXIS_RANGE_MAX);
95
+ Joystick.setZAxisRange (AXIS_RANGE_MIN, AXIS_RANGE_MAX);
96
+ Joystick.setThrottleRange (AXIS_RANGE_MIN, AXIS_RANGE_MAX);
97
+ Joystick.setRudderRange (AXIS_RANGE_MIN, AXIS_RANGE_MAX);
98
+ Joystick.begin (false );
99
+ #endif
48
100
}
49
101
50
102
template <typename Dst, typename Src>
@@ -59,25 +111,24 @@ void update(Dst& dst, const Src& src)
59
111
void loop ()
60
112
{
61
113
uint32_t now = micros ();
62
- uint32_t rxDelta = 0 ;
63
114
64
- // decode inputs
115
+ // receive inputs
65
116
66
- #ifdef SIM_INTERVAL_MS
117
+ #ifdef MODE_SIM
67
118
static uint32_t simNext = 0 ;
68
- if (now >= simNext)
119
+ if (now > simNext)
69
120
{
70
- txData.setChannel (2 , 1000 + rxSim.get (2 ));
71
- txData.setAvailable ();
121
+ rxSim.update ();
122
+ update (txData, rxSim);
123
+ txData.setAvailable (now);
72
124
simNext = now + SIM_INTERVAL_MS * 1000 ;
73
125
}
74
126
#else
75
-
76
127
#ifdef PIN_PPM
77
128
if (rxPpm.available ())
78
129
{
79
130
update (txData, rxPpm);
80
- txData.setAvailable ();
131
+ txData.setAvailable (now );
81
132
}
82
133
#endif
83
134
@@ -87,40 +138,65 @@ void loop()
87
138
{
88
139
rxAnalog.update ();
89
140
update (txData, rxAnalog);
90
- txData.setAvailable ();
141
+ txData.setAvailable (now );
91
142
analogNext = now + 20000 ;
92
143
}
93
144
#endif
94
145
146
+ #ifdef MODE_RX
147
+ rxEspNow.update ();
148
+ if (rxEspNow.available ())
149
+ {
150
+ for (size_t channel = 0 ; channel < 8 ; ++channel)
151
+ {
152
+ txData.setChannel (channel, rxEspNow.getChannel (channel));
153
+ }
154
+ txData.setAvailable (now);
155
+ }
156
+ #endif
95
157
#endif
96
158
97
159
// transmit outputs
98
160
161
+ #ifdef MODE_TX
162
+
99
163
static uint32_t sendTimeout = 0 ;
100
164
static uint32_t sendAfter = 0 ;
101
- static uint32_t sendLast = 0 ;
102
165
if ((now > sendAfter && txData.getAvailable ()) || now > sendTimeout)
103
166
{
104
- for (size_t c = 0 ; c < 8 ; c ++)
167
+ for (size_t channel = 0 ; channel < 8 ; channel ++)
105
168
{
106
- txEspNow.setChannel (c , txData.getChannel (c ));
169
+ txEspNow.setChannel (channel , txData.getChannel (channel ));
107
170
}
108
171
sendTimeout = now + 50000ul ;
109
172
sendAfter = now + 10000ul ;
110
- rxDelta = now - sendLast;
111
- sendLast = now;
112
-
113
173
txEspNow.commit ();
114
174
}
115
175
txEspNow.update ();
176
+ #endif
116
177
117
- // print debug info
178
+ #ifdef MODE_GAMEPAD
179
+ if (txData.getAvailable ())
180
+ {
181
+ Joystick.setXAxis (gamepadScale (txData.getChannel (0 )));
182
+ Joystick.setYAxis (gamepadScale (txData.getChannel (1 )));
183
+ Joystick.setThrottle (gamepadScale (txData.getChannel (2 )));
184
+ Joystick.setRudder (gamepadScale (txData.getChannel (3 )));
185
+ Joystick.setZAxis (gamepadScale (txData.getChannel (4 )));
186
+ // channel 6, 7, 8 as buttons
187
+ for (size_t i = 0 ; i < 3 ; i++)
188
+ {
189
+ Joystick.setButton (i, txData.getChannel (i + 5 ) >= BUTTON_THRESHOLD);
190
+ }
191
+ Joystick.sendState ();
192
+ }
193
+ #endif
118
194
119
195
#ifdef PRINT_INFO
196
+ // print debug info
120
197
static uint32_t printNext = 0 ;
121
198
if (now > printNext)
122
199
{
123
- // Serial.printf("V: %d, P: %d, D: %d, C: %d\n", v, sim_val, delta / 100, WiFi.channel());
124
200
Serial.printf (" %d,%d,%d,%d,%d\n " ,
125
201
txData.getChannel (0 ), txData.getChannel (1 ), txData.getChannel (2 ), txData.getChannel (3 ), txData.getChannel (4 )
126
202
);
0 commit comments