blob: 32ca110e43d53bebfbb93c8d2c1f16a7f7b9646f [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"
5#include "third_party/optional/tl/optional.hpp"
Brian Silverman2eb89762019-02-17 15:16:37 -08006#include "y2019/jevois/cobs.h"
Brian Silvermanbfbbe872019-02-10 18:00:57 -08007#include "y2019/jevois/structures.h"
8
9// This file manages serializing and deserializing the various structures for
10// transport via UART.
11
12namespace frc971 {
13namespace jevois {
14
Brian Silverman2eb89762019-02-17 15:16:37 -080015constexpr size_t uart_to_teensy_size() {
16 return 3 /* targets */ * (sizeof(float) * 4 /* fields */) + 1 /* age */ +
17 2 /* CRC-16 */;
Brian Silvermanbfbbe872019-02-10 18:00:57 -080018}
Brian Silverman2eb89762019-02-17 15:16:37 -080019using UartToTeensyBuffer =
20 aos::SizedArray<char, CobsMaxEncodedSize(uart_to_teensy_size())>;
Brian Silvermanbfbbe872019-02-10 18:00:57 -080021
Brian Silverman2eb89762019-02-17 15:16:37 -080022constexpr size_t uart_to_camera_size() {
23 return sizeof(float) * 3 * 4 /* calibration */ +
24 sizeof(int64_t) /* teensy_now */ + sizeof(int64_t) /* realtime_now */ +
25 1 /* camera_command */ + 2 /* CRC-16 */;
26}
27using UartToCameraBuffer =
28 aos::SizedArray<char, CobsMaxEncodedSize(uart_to_camera_size())>;
29
30UartToTeensyBuffer UartPackToTeensy(const Frame &message);
31tl::optional<Frame> UartUnpackToTeensy(const UartToTeensyBuffer &buffer);
32
33UartToCameraBuffer UartPackToCamera(const CameraCalibration &message);
34tl::optional<CameraCalibration> UartUnpackToCamera(
35 const UartToCameraBuffer &buffer);
Brian Silvermanbfbbe872019-02-10 18:00:57 -080036
37} // namespace jevois
38} // namespace frc971
39
40#endif // Y2019_JEVOIS_UART_H_