blob: 14a46da0e0eb87def8f4027dcaf0c9f4bf46ca09 [file] [log] [blame]
Brian Silvermanbfbbe872019-02-10 18:00:57 -08001#ifndef Y2019_JEVOIS_UART_H_
2#define Y2019_JEVOIS_UART_H_
3
4#include "aos/containers/sized_array.h"
Brian Silvermanfdfb3132019-02-24 15:27:27 -08005#include "third_party/GSL/include/gsl/gsl"
James Kuszmaul3ae42262019-11-08 12:33:41 -08006#include <optional>
Brian Silverman2eb89762019-02-17 15:16:37 -08007#include "y2019/jevois/cobs.h"
Brian Silvermanbfbbe872019-02-10 18:00:57 -08008#include "y2019/jevois/structures.h"
9
10// This file manages serializing and deserializing the various structures for
11// transport via UART.
12
13namespace frc971 {
14namespace jevois {
15
Brian Silverman2eb89762019-02-17 15:16:37 -080016constexpr size_t uart_to_teensy_size() {
Brian Silvermana1e4d332019-02-17 22:53:13 -080017 return 1 /* number of targets */ +
18 3 /* targets */ * (sizeof(float) * 4 /* fields */) + 1 /* age */ +
Brian Silverman2eb89762019-02-17 15:16:37 -080019 2 /* CRC-16 */;
Brian Silvermanbfbbe872019-02-10 18:00:57 -080020}
Brian Silverman2eb89762019-02-17 15:16:37 -080021using UartToTeensyBuffer =
22 aos::SizedArray<char, CobsMaxEncodedSize(uart_to_teensy_size())>;
Brian Silvermanbfbbe872019-02-10 18:00:57 -080023
Brian Silverman2eb89762019-02-17 15:16:37 -080024constexpr size_t uart_to_camera_size() {
25 return sizeof(float) * 3 * 4 /* calibration */ +
26 sizeof(int64_t) /* teensy_now */ + sizeof(int64_t) /* realtime_now */ +
27 1 /* camera_command */ + 2 /* CRC-16 */;
28}
29using UartToCameraBuffer =
30 aos::SizedArray<char, CobsMaxEncodedSize(uart_to_camera_size())>;
31
Brian Silvermanc41fb862019-03-02 21:14:46 -080032UartToTeensyBuffer UartPackToTeensy(const CameraFrame &message);
James Kuszmaul3ae42262019-11-08 12:33:41 -080033std::optional<CameraFrame> UartUnpackToTeensy(gsl::span<const char> buffer);
Brian Silverman2eb89762019-02-17 15:16:37 -080034
35UartToCameraBuffer UartPackToCamera(const CameraCalibration &message);
James Kuszmaul3ae42262019-11-08 12:33:41 -080036std::optional<CameraCalibration> UartUnpackToCamera(
Parker Schuhd68e1b02019-02-22 20:59:16 -080037 gsl::span<const char> buffer);
Brian Silvermanbfbbe872019-02-10 18:00:57 -080038
39} // namespace jevois
40} // namespace frc971
41
42#endif // Y2019_JEVOIS_UART_H_