blob: 2a4acec8aeff1749a691ce95f54862b71786567b [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"
Brian Silvermanbfbbe872019-02-10 18:00:57 -08006#include "third_party/optional/tl/optional.hpp"
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
32UartToTeensyBuffer UartPackToTeensy(const Frame &message);
Parker Schuhd68e1b02019-02-22 20:59:16 -080033tl::optional<Frame> UartUnpackToTeensy(gsl::span<const char> buffer);
Brian Silverman2eb89762019-02-17 15:16:37 -080034
35UartToCameraBuffer UartPackToCamera(const CameraCalibration &message);
36tl::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_