Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 1 | #ifndef Y2019_JEVOIS_UART_H_ |
| 2 | #define Y2019_JEVOIS_UART_H_ |
| 3 | |
James Kuszmaul | 3ae4226 | 2019-11-08 12:33:41 -0800 | [diff] [blame] | 4 | #include <optional> |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 5 | |
| 6 | #include "absl/types/span.h" |
Philipp Schrader | 790cb54 | 2023-07-05 21:06:52 -0700 | [diff] [blame] | 7 | |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 8 | #include "aos/containers/sized_array.h" |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 9 | #include "y2019/jevois/cobs.h" |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 10 | #include "y2019/jevois/structures.h" |
| 11 | |
| 12 | // This file manages serializing and deserializing the various structures for |
| 13 | // transport via UART. |
| 14 | |
Stephan Pleines | d99b1ee | 2024-02-02 20:56:44 -0800 | [diff] [blame] | 15 | namespace frc971::jevois { |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 16 | |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 17 | constexpr size_t uart_to_teensy_size() { |
Brian Silverman | a1e4d33 | 2019-02-17 22:53:13 -0800 | [diff] [blame] | 18 | return 1 /* number of targets */ + |
| 19 | 3 /* targets */ * (sizeof(float) * 4 /* fields */) + 1 /* age */ + |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 20 | 2 /* CRC-16 */; |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 21 | } |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 22 | using UartToTeensyBuffer = |
| 23 | aos::SizedArray<char, CobsMaxEncodedSize(uart_to_teensy_size())>; |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 24 | |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 25 | constexpr size_t uart_to_camera_size() { |
| 26 | return sizeof(float) * 3 * 4 /* calibration */ + |
| 27 | sizeof(int64_t) /* teensy_now */ + sizeof(int64_t) /* realtime_now */ + |
| 28 | 1 /* camera_command */ + 2 /* CRC-16 */; |
| 29 | } |
| 30 | using UartToCameraBuffer = |
| 31 | aos::SizedArray<char, CobsMaxEncodedSize(uart_to_camera_size())>; |
| 32 | |
Brian Silverman | c41fb86 | 2019-03-02 21:14:46 -0800 | [diff] [blame] | 33 | UartToTeensyBuffer UartPackToTeensy(const CameraFrame &message); |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 34 | std::optional<CameraFrame> UartUnpackToTeensy(absl::Span<const char> buffer); |
Brian Silverman | 2eb8976 | 2019-02-17 15:16:37 -0800 | [diff] [blame] | 35 | |
| 36 | UartToCameraBuffer UartPackToCamera(const CameraCalibration &message); |
James Kuszmaul | 3ae4226 | 2019-11-08 12:33:41 -0800 | [diff] [blame] | 37 | std::optional<CameraCalibration> UartUnpackToCamera( |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 38 | absl::Span<const char> buffer); |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 39 | |
Stephan Pleines | d99b1ee | 2024-02-02 20:56:44 -0800 | [diff] [blame] | 40 | } // namespace frc971::jevois |
Brian Silverman | bfbbe87 | 2019-02-10 18:00:57 -0800 | [diff] [blame] | 41 | |
| 42 | #endif // Y2019_JEVOIS_UART_H_ |