|
24 | 24 | #include <cstddef>
|
25 | 25 | #include <cstdint>
|
26 | 26 | #include <cstring>
|
| 27 | +#include <functional> |
27 | 28 | #include <iomanip>
|
28 | 29 | #include <memory>
|
29 | 30 | #include <optional>
|
@@ -159,218 +160,29 @@ enum class TelemetryDataType : uint8_t {
|
159 | 160 | kChar = 10
|
160 | 161 | };
|
161 | 162 |
|
162 |
| -struct TelemetryData |
| 163 | +template <typename OutT> |
| 164 | +inline std::vector<OutT> parseNumericTelemetryData( |
| 165 | + std::function<OutT(const uint8_t *)> f, const std::vector<uint8_t> & buffer) |
163 | 166 | {
|
164 |
| - TelemetryData() = default; |
165 |
| - TelemetryData(const TelemetryData &) = default; |
166 |
| - TelemetryData(TelemetryData &&) = delete; |
167 |
| - TelemetryData & operator=(const TelemetryData &) = default; |
168 |
| - TelemetryData & operator=(TelemetryData &&) = delete; |
169 |
| - virtual ~TelemetryData() = default; |
170 |
| - |
171 |
| - [[nodiscard]] virtual std::string toString() const = 0; |
172 |
| -}; |
173 |
| - |
174 |
| -template <typename StorageT, bool PrintHex> |
175 |
| -struct NumericTelemetryData : public TelemetryData |
176 |
| -{ |
177 |
| - [[nodiscard]] std::string toString() const override |
178 |
| - { |
179 |
| - std::stringstream result{}; |
180 |
| - for (const auto & val : data) { |
181 |
| - if constexpr (PrintHex) { |
182 |
| - result << std::hex << std::setw(sizeof(StorageT) * 2) << val << " "; |
183 |
| - } else { |
184 |
| - result << +val << " "; |
185 |
| - } |
186 |
| - } |
187 |
| - |
188 |
| - return result.str(); |
189 |
| - } |
190 |
| - |
191 |
| - std::vector<StorageT> data; |
192 |
| -}; |
193 |
| - |
194 |
| -struct UInt8TelemetryData : public NumericTelemetryData<uint8_t, true> |
195 |
| -{ |
196 |
| - explicit UInt8TelemetryData(std::vector<uint8_t> raw) { data.swap(raw); } |
197 |
| -}; |
198 |
| - |
199 |
| -struct Int8TelemetryData : public NumericTelemetryData<int8_t, false> |
200 |
| -{ |
201 |
| - explicit Int8TelemetryData(const std::vector<uint8_t> & raw) |
202 |
| - { |
203 |
| - data.reserve(raw.size()); |
204 |
| - for (const auto & byte : raw) { |
205 |
| - data.emplace_back(static_cast<int8_t>(byte)); |
206 |
| - } |
207 |
| - } |
208 |
| -}; |
209 |
| - |
210 |
| -struct UInt16TelemetryData : public NumericTelemetryData<uint16_t, true> |
211 |
| -{ |
212 |
| - explicit UInt16TelemetryData(std::vector<uint8_t> raw) |
213 |
| - { |
214 |
| - data.reserve(raw.size() / 2); |
215 |
| - for (size_t i = 0; i < raw.size() / 2; ++i) { |
216 |
| - data.emplace_back(load_little_u16(&raw[i * 2])); |
217 |
| - } |
218 |
| - } |
219 |
| -}; |
220 |
| - |
221 |
| -struct Int16TelemetryData : public NumericTelemetryData<int16_t, false> |
222 |
| -{ |
223 |
| - explicit Int16TelemetryData(std::vector<uint8_t> raw) |
224 |
| - { |
225 |
| - data.reserve(raw.size() / 2); |
226 |
| - for (size_t i = 0; i < raw.size() / 2; ++i) { |
227 |
| - data.emplace_back(load_little_s16(&raw[i * 2])); |
228 |
| - } |
229 |
| - } |
230 |
| -}; |
231 |
| - |
232 |
| -struct UInt32TelemetryData : public NumericTelemetryData<uint32_t, true> |
233 |
| -{ |
234 |
| - explicit UInt32TelemetryData(std::vector<uint8_t> raw) |
235 |
| - { |
236 |
| - data.reserve(raw.size() / 4); |
237 |
| - for (size_t i = 0; i < raw.size() / 4; ++i) { |
238 |
| - data.emplace_back(load_little_u32(&raw[i * 4])); |
239 |
| - } |
240 |
| - } |
241 |
| -}; |
242 |
| - |
243 |
| -struct Int32TelemetryData : public NumericTelemetryData<int32_t, false> |
244 |
| -{ |
245 |
| - explicit Int32TelemetryData(std::vector<uint8_t> raw) |
246 |
| - { |
247 |
| - data.reserve(raw.size() / 4); |
248 |
| - for (size_t i = 0; i < raw.size() / 4; ++i) { |
249 |
| - data.emplace_back(load_little_s32(&raw[i * 4])); |
250 |
| - } |
| 167 | + size_t type_size = sizeof(OutT); |
| 168 | + if (buffer.size() % type_size != 0) { |
| 169 | + throw std::runtime_error("Buffer length is not divisible by requested type's size"); |
251 | 170 | }
|
252 |
| -}; |
253 | 171 |
|
254 |
| -struct UInt64TelemetryData : public NumericTelemetryData<uint64_t, true> |
255 |
| -{ |
256 |
| - explicit UInt64TelemetryData(std::vector<uint8_t> raw) |
257 |
| - { |
258 |
| - data.reserve(raw.size() / 8); |
259 |
| - for (size_t i = 0; i < raw.size() / 8; ++i) { |
260 |
| - data.emplace_back(load_little_u64(&raw[i * 8])); |
261 |
| - } |
| 172 | + size_t n_entries = buffer.size() / type_size; |
| 173 | + std::vector<OutT> result{}; |
| 174 | + result.reserve(n_entries); |
| 175 | + for (size_t i = 0; i < n_entries; ++i) { |
| 176 | + result.emplace_back(f(&buffer[i * type_size])); |
262 | 177 | }
|
263 |
| -}; |
264 | 178 |
|
265 |
| -struct Int64TelemetryData : public NumericTelemetryData<int64_t, false> |
266 |
| -{ |
267 |
| - explicit Int64TelemetryData(std::vector<uint8_t> raw) |
268 |
| - { |
269 |
| - data.reserve(raw.size() / 8); |
270 |
| - for (size_t i = 0; i < raw.size() / 8; ++i) { |
271 |
| - data.emplace_back(load_little_s64(&raw[i * 8])); |
272 |
| - } |
273 |
| - } |
274 |
| -}; |
| 179 | + return result; |
| 180 | +} |
275 | 181 |
|
276 |
| -struct FloatTelemetryData : public NumericTelemetryData<float, false> |
| 182 | +inline std::string parseStringTelemetryData(const std::vector<uint8_t> & buffer) |
277 | 183 | {
|
278 |
| - explicit FloatTelemetryData(std::vector<uint8_t> raw) |
279 |
| - { |
280 |
| - data.reserve(raw.size() / 4); |
281 |
| - for (size_t i = 0; i < raw.size() / 4; ++i) { |
282 |
| - float & val = data.emplace_back(); |
283 |
| - memcpy(&val, &raw[i * 4], 4); |
284 |
| - } |
285 |
| - } |
286 |
| -}; |
287 |
| - |
288 |
| -struct DoubleTelemetryData : public NumericTelemetryData<double, false> |
289 |
| -{ |
290 |
| - explicit DoubleTelemetryData(std::vector<uint8_t> raw) |
291 |
| - { |
292 |
| - data.reserve(raw.size() / 8); |
293 |
| - for (size_t i = 0; i < raw.size() / 8; ++i) { |
294 |
| - double & val = data.emplace_back(); |
295 |
| - memcpy(&val, &raw[i * 8], 8); |
296 |
| - } |
297 |
| - } |
298 |
| -}; |
299 |
| - |
300 |
| -struct StringTelemetryData : public TelemetryData |
301 |
| -{ |
302 |
| - explicit StringTelemetryData(std::vector<uint8_t> raw) : value(raw.begin(), raw.end()) {} |
303 |
| - |
304 |
| - [[nodiscard]] std::string toString() const override { return value; } |
305 |
| - |
306 |
| - const std::string value; |
307 |
| -}; |
308 |
| - |
309 |
| -struct TelemetryEntry |
310 |
| -{ |
311 |
| - TelemetryEntry(std::string key, TelemetryDataType type, std::vector<uint8_t> & data) |
312 |
| - : data_type(type), key(std::move(key)) |
313 |
| - { |
314 |
| - switch (data_type) { |
315 |
| - case TelemetryDataType::kUInt8: |
316 |
| - value = std::make_unique<UInt8TelemetryData>(data); |
317 |
| - break; |
318 |
| - case TelemetryDataType::kInt8: |
319 |
| - value = std::make_unique<Int8TelemetryData>(data); |
320 |
| - break; |
321 |
| - case TelemetryDataType::kUInt16: |
322 |
| - value = std::make_unique<UInt16TelemetryData>(data); |
323 |
| - break; |
324 |
| - case TelemetryDataType::kInt16: |
325 |
| - value = std::make_unique<Int16TelemetryData>(data); |
326 |
| - break; |
327 |
| - case TelemetryDataType::kUInt32: |
328 |
| - value = std::make_unique<UInt32TelemetryData>(data); |
329 |
| - break; |
330 |
| - case TelemetryDataType::kInt32: |
331 |
| - value = std::make_unique<Int32TelemetryData>(data); |
332 |
| - break; |
333 |
| - case TelemetryDataType::kUInt64: |
334 |
| - value = std::make_unique<UInt64TelemetryData>(data); |
335 |
| - break; |
336 |
| - case TelemetryDataType::kInt64: |
337 |
| - value = std::make_unique<Int64TelemetryData>(data); |
338 |
| - break; |
339 |
| - case TelemetryDataType::kFloat: |
340 |
| - value = std::make_unique<FloatTelemetryData>(data); |
341 |
| - break; |
342 |
| - case TelemetryDataType::kDouble: |
343 |
| - value = std::make_unique<DoubleTelemetryData>(data); |
344 |
| - break; |
345 |
| - case TelemetryDataType::kChar: |
346 |
| - value = std::make_unique<StringTelemetryData>(data); |
347 |
| - break; |
348 |
| - } |
349 |
| - } |
350 |
| - |
351 |
| - TelemetryDataType data_type; |
352 |
| - std::string key; |
353 |
| - std::unique_ptr<TelemetryData> value; |
354 |
| - |
355 |
| - [[nodiscard]] std::string toString() const { return key + ": " + value->toString(); } |
356 |
| -}; |
357 |
| - |
358 |
| -struct TelemetryMessage |
359 |
| -{ |
360 |
| - std::string node_name; |
361 |
| - std::vector<TelemetryEntry> entries; |
362 |
| - |
363 |
| - [[nodiscard]] std::string toString() const |
364 |
| - { |
365 |
| - std::stringstream ss{}; |
366 |
| - ss << node_name << ":\n"; |
367 |
| - for (const auto & entry : entries) { |
368 |
| - ss << " " << entry.toString() << "\n"; |
369 |
| - } |
370 |
| - |
371 |
| - return ss.str(); |
372 |
| - } |
373 |
| -}; |
| 184 | + return std::string(buffer.begin(), buffer.end()); |
| 185 | +} |
374 | 186 |
|
375 | 187 | enum class ReconfigRequestType : uint8_t {
|
376 | 188 | kManifestRequest = 0,
|
|
0 commit comments