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