TR-mbed 1.0
Loading...
Searching...
No Matches
Jetson.h
Go to the documentation of this file.
1#pragma once
2#include "mbed.h"
3
4#include <cstdint>
5#include <memory>
6#include <vector>
7
8class WritePacket;
9class ReadPacket;
10
11class Jetson {
12 public:
13 struct WriteState {
21
22 int8_t game_state;
23 int16_t robot_hp;
24
25 // user input
26 uint8_t calibration;
27 uint8_t activate_CV;
28 };
29
41
42 // Init Jetson with a BufferedSerial Object
43 Jetson(BufferedSerial &UARTJetson);
44
45 // Init Jetson with a SPISlave Object
46 Jetson(SPISlave &SPIJetson);
47
48 static uint8_t calculateLRC(const char *data, size_t length);
49
51 void write(Jetson::WriteState &to_write);
52
53 private:
54 std::vector<std::unique_ptr<WritePacket>> write_packets_;
55 std::vector<std::unique_ptr<ReadPacket>> read_packets_;
56
57 ReadState read_state_;
58 WriteState write_state_;
59
60 Thread write_thread_;
61 Thread read_thread_;
62 Mutex mutex_read_;
63 Mutex mutex_write_;
64 void writeThread();
65 void readThread();
66
67 int writeIO(char *buff, int write_size);
68 int readIO(char *buff, int buff_size);
69 int readIOReadable();
70
71 BufferedSerial *bcJetson;
72 SPISlave *spiJetson;
73
74 static constexpr unsigned long WRITE_THREAD_LOOP_DT_MS = 1;
75};
76
77// ------
78// Write packets
79// ------
80
82 public:
83 WritePacket(char header, int payload_size)
84 : header_(header), payload_size_(payload_size) {};
85
86 virtual ~WritePacket() = default;
87
88 const char header_;
89 const int payload_size_;
90
91 int write_data_to_buff(Jetson::WriteState &write_state, char *buff,
92 int buff_size) {
93
94 // buff must be able to hold payload + header + checksum
95 if (buff_size < payload_size_ + 2) {
96 return -1;
97 }
98
99 // write payload into buff, leaving 1 byte for the header
100 get_packed_payload(write_state, &buff[1]);
101 buff[0] = header_;
102
103 uint8_t checksum = Jetson::calculateLRC(&buff[1], payload_size_);
104 buff[payload_size_ + 1] = checksum;
105
106 // payload + 1 header byte + 1 checksum byte
107 return payload_size_ + 2;
108 }
109
110 private:
111 virtual void get_packed_payload(Jetson::WriteState &write_state,
112 char *buff) = 0;
113};
114
116 public:
117 static int constexpr HEADER = 0xBB;
118 static int constexpr PAYLOAD_SIZE = 3;
120
121 private:
122 void get_packed_payload(Jetson::WriteState &write_state,
123 char *buff) override {
124
125 std::memcpy(&buff[0], &write_state.game_state, sizeof(uint8_t));
126 std::memcpy(&buff[1], &write_state.robot_hp, sizeof(int16_t));
127 }
128};
129
131 public:
132 static int constexpr HEADER = 0xAA;
133 static int constexpr PAYLOAD_SIZE = 28;
134
136
137 private:
138 void get_packed_payload(Jetson::WriteState &write_state,
139 char *buff) override {
140
141 std::memcpy(&buff[0], &write_state.yaw_angle_rads, sizeof(float));
142 std::memcpy(&buff[4], &write_state.pitch_angle_rads, sizeof(float));
143
144 std::memcpy(&buff[8], &write_state.yaw_velocity, sizeof(float));
145 std::memcpy(&buff[12], &write_state.pitch_velocity, sizeof(float));
146
147 std::memcpy(&buff[16], &write_state.chassis_x_velocity, sizeof(float));
148 std::memcpy(&buff[20], &write_state.chassis_y_velocity, sizeof(float));
149 std::memcpy(&buff[24], &write_state.chassis_rotation, sizeof(float));
150 }
151};
152
154 public:
155 static int constexpr HEADER = 0xEE;
156 static int constexpr PAYLOAD_SIZE = 2;
157
159
160 private:
161 void get_packed_payload(Jetson::WriteState &write_state,
162 char *buff) override {
163
164 std::memcpy(&buff[0], &write_state.calibration, sizeof(uint8_t));
165 std::memcpy(&buff[1], &write_state.activate_CV, sizeof(uint8_t));
166 }
167};
168
169
170
171// --------------
172// READ PACKETS
173// --------------
174
176 public:
177 const char header_;
178 const int payload_size_;
179 ReadPacket(char header, int payload_size)
180 : header_(header), payload_size_{payload_size} {};
181
182 virtual ~ReadPacket() = default;
183
184 // returns the amount of bytes consumed or -1 if invalid
185 int parse_buff(char *buff, int buff_size, Jetson::ReadState &read_state) {
186 if (buff[0] != header_) {
187 return -1;
188 }
189 if (buff_size < payload_size_ + 2) {
190 return -1;
191 }
192
193 char checksum = buff[payload_size_ + 1];
194 // calculate checksum without header
195 char calculated_checksum =
197
198 if (checksum != calculated_checksum) {
199 return -1;
200 }
201
202 extract_payload(&buff[1], read_state);
203
204 // consumed header + payload + checksum bytes
205 return payload_size_ + 2;
206 }
207
208 private:
209 virtual void extract_payload(char *buff, Jetson::ReadState &read_state) = 0;
210};
211
212class TurretPacket : public ReadPacket {
213 public:
214 static char constexpr HEADER = 0xCC;
215 static int constexpr PAYLOAD_SIZE = 9;
217
218 private:
219 void extract_payload(char *buff, Jetson::ReadState &read_state) override {
220
221 // 4 byte pitch, 4 byte yaw, 1 byte shoot
222 std::memcpy(&read_state.desired_yaw_rads, &buff[0], sizeof(float));
223 std::memcpy(&read_state.desired_pitch_rads, &buff[4], sizeof(float));
224 std::memcpy(&read_state.shoot_status, &buff[8], sizeof(char));
225 }
226};
227
229 public:
230 static char constexpr HEADER = 0xDD;
231 static int constexpr PAYLOAD_SIZE = 13;
232
234
235 private:
236 void extract_payload(char *buff, Jetson::ReadState &read_state) override {
237
238 // 4 x vel bytes, 4 y vel bytes, 4 rotation vel bytes, 1 localization
239 // calibration byte
240 std::memcpy(&read_state.desired_x_vel, &buff[0], sizeof(float));
241 std::memcpy(&read_state.desired_y_vel, &buff[4], sizeof(float));
242 std::memcpy(&read_state.desired_angular_vel, &buff[8], sizeof(float));
243 std::memcpy(&read_state.localization_calibration, &buff[12],
244 sizeof(uint8_t));
245 }
246};
Definition Jetson.h:228
static char constexpr HEADER
Definition Jetson.h:230
ChassisReadPacket()
Definition Jetson.h:233
static int constexpr PAYLOAD_SIZE
Definition Jetson.h:231
Definition Jetson.h:153
static int constexpr HEADER
Definition Jetson.h:155
static int constexpr PAYLOAD_SIZE
Definition Jetson.h:156
EmbeddedUserInputWritePacket()
Definition Jetson.h:158
Definition Jetson.h:11
void write(Jetson::WriteState &to_write)
Definition Jetson.cpp:31
Jetson::ReadState read()
Definition Jetson.cpp:23
Jetson(SPISlave &SPIJetson)
static uint8_t calculateLRC(const char *data, size_t length)
Definition Jetson.cpp:42
Definition Jetson.h:175
const char header_
Definition Jetson.h:177
ReadPacket(char header, int payload_size)
Definition Jetson.h:179
int parse_buff(char *buff, int buff_size, Jetson::ReadState &read_state)
Definition Jetson.h:185
const int payload_size_
Definition Jetson.h:178
virtual ~ReadPacket()=default
Definition Jetson.h:115
static int constexpr PAYLOAD_SIZE
Definition Jetson.h:118
static int constexpr HEADER
Definition Jetson.h:117
RefWritePacket()
Definition Jetson.h:119
Definition Jetson.h:130
static int constexpr PAYLOAD_SIZE
Definition Jetson.h:133
RobotStateWritePacket()
Definition Jetson.h:135
static int constexpr HEADER
Definition Jetson.h:132
Definition Jetson.h:212
static char constexpr HEADER
Definition Jetson.h:214
static int constexpr PAYLOAD_SIZE
Definition Jetson.h:215
TurretPacket()
Definition Jetson.h:216
Definition Jetson.h:81
const int payload_size_
Definition Jetson.h:89
const char header_
Definition Jetson.h:88
virtual ~WritePacket()=default
int write_data_to_buff(Jetson::WriteState &write_state, char *buff, int buff_size)
Definition Jetson.h:91
WritePacket(char header, int payload_size)
Definition Jetson.h:83
Definition Jetson.h:30
char localization_calibration
Definition Jetson.h:39
unsigned long long stamp_us
Definition Jetson.h:31
float desired_y_vel
Definition Jetson.h:37
float desired_angular_vel
Definition Jetson.h:38
float desired_yaw_rads
Definition Jetson.h:33
char shoot_status
Definition Jetson.h:34
float desired_x_vel
Definition Jetson.h:36
float desired_pitch_rads
Definition Jetson.h:32
Definition Jetson.h:13
float pitch_angle_rads
Definition Jetson.h:17
float pitch_velocity
Definition Jetson.h:19
float yaw_velocity
Definition Jetson.h:20
float chassis_y_velocity
Definition Jetson.h:15
uint8_t activate_CV
Definition Jetson.h:27
float yaw_angle_rads
Definition Jetson.h:18
int16_t robot_hp
Definition Jetson.h:23
float chassis_rotation
Definition Jetson.h:16
uint8_t calibration
Definition Jetson.h:26
int8_t game_state
Definition Jetson.h:22
float chassis_x_velocity
Definition Jetson.h:14