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