2#include "GamepadServer.h"
4#include "TinyRobotics/utils/Common.h"
6namespace tinyrobotics {
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
48 RCGamepadMessageSource(NetworkServer& server) : gamepad(server) {}
52 this->scenario = scenario;
59 void end() { is_active_ =
false; }
65 gamepad.handleClient();
67 GamepadState state = gamepad.getState();
68 if (callback ==
nullptr || callback(state, *
this)) {
80 GamepadServer gamepad;
82 bool (*callback)(
const GamepadState&,
MessageSource& source) =
nullptr;
83 bool is_active_ =
false;
85 void publish(
const GamepadState& state) {
87 case ControlScenario::Car:
90 case ControlScenario::Boat:
93 case ControlScenario::Drone:
96 case ControlScenario::Plane:
103 void publish(
const Message<
float>& msg) {
110 void publishCar(
const GamepadState& state) {
111 float steeringAngleDegree = state.left_thumbstick.angleDegROS();
112 float throttlePercent = 100.0f * state.left_thumbstick.magnitude();
113 float turnPercent = steeringAngleDegree / 180.0f * 100.0f;
114 publish(Message(MessageContent::SteeringAngle, steeringAngleDegree,
116 publish(Message(MessageContent::Throttle, throttlePercent,
Unit::Percent));
117 publish(Message(MessageContent::Turn, turnPercent,
Unit::Percent));
120 void publishDrone(
const GamepadState& state) {
121 float rollAngleDegree = state.left_thumbstick.angleDegROS();
122 float pitchAngleDegree = state.right_thumbstick.angleDegROS();
123 float throttlePercent = 100.0f * state.left_thumbstick.magnitude();
124 float yawTurnPercent = 100.0f * state.right_thumbstick.magnitude();
128 publish(Message(MessageContent::Throttle, throttlePercent,
Unit::Percent));
129 publish(Message(MessageContent::Yaw, yawTurnPercent,
Unit::Percent));
132 void publishPlane(
const GamepadState& state) {
133 float aileronAngleDegree = state.left_thumbstick.angleDegROS();
134 float elevatorAngleDegree = state.right_thumbstick.angleDegROS();
135 float throttlePercent = 100.0f * state.left_thumbstick.magnitude();
136 float rudderTurnPercent = 100.0f * state.right_thumbstick.magnitude();
137 publish(Message(MessageContent::Roll, aileronAngleDegree,
139 publish(Message(MessageContent::Pitch, elevatorAngleDegree,
141 publish(Message(MessageContent::Throttle, throttlePercent,
143 publish(Message(MessageContent::Yaw, rudderTurnPercent,
147 void publishBoat(
const GamepadState& state) {
148 float steeringAngleDegree = state.left_thumbstick.angleDegROS();
149 float throttlePercent = 100.0f * state.left_thumbstick.magnitude();
150 float turnPercent = steeringAngleDegree / 180.0f * 100.0f;
152 publish(Message(MessageContent::SteeringAngle, steeringAngleDegree,
154 publish(Message(MessageContent::Throttle, throttlePercent,
Unit::Percent));
Base class for message sources in the TinyRobotics communication framework.
Definition: MessageSource.h:35
Message source for remote control via a virtual gamepad.
Definition: RCGamepadMessageSource.h:46
void setCallback(bool(*cb)(const GamepadState &, MessageSource &source))
Add a callback to receive and publish additional messages.
Definition: RCGamepadMessageSource.h:75
bool begin(ControlScenario scenario=ControlScenario::Car)
Start the message source and connect to the gamepad server.
Definition: RCGamepadMessageSource.h:51
void end()
Stop the message source and disconnect from the gamepad server.
Definition: RCGamepadMessageSource.h:59
void update()
Definition: RCGamepadMessageSource.h:63
ControlScenario
Control scenario types for remote control vehicles.
Definition: Common.h:68
Unit
Units for message values.
Definition: Common.h:45
@ AngleDegree
Angle in degrees.
@ Percent
Percentage (0-100)
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72