blob: fd999de44ae47ef0a88bf6df523638d8b6d2dbc3 [file] [log] [blame]
Brian Silverman246cb222019-02-02 16:38:18 -08001#ifndef Y2019_JEVOIS_SPI_H_
2#define Y2019_JEVOIS_SPI_H_
3
Brian Silverman246cb222019-02-02 16:38:18 -08004#include <array>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07005#include <cstdint>
6#include <optional>
Brian Silverman246cb222019-02-02 16:38:18 -08007
Austin Schuhb72be802022-01-02 12:26:28 -08008#include "absl/types/span.h"
Philipp Schrader790cb542023-07-05 21:06:52 -07009
Brian Silverman246cb222019-02-02 16:38:18 -080010#include "y2019/jevois/structures.h"
11
12// This file manages serializing and deserializing the various structures for
13// transport via SPI.
14//
15// Our SPI transfers are fixed-size to simplify everything.
16
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080017namespace frc971::jevois {
Brian Silverman246cb222019-02-02 16:38:18 -080018
19constexpr size_t spi_transfer_size() {
20 // The teensy->RoboRIO side is way bigger, so just calculate that.
21 return 3 /* 3 frames */ *
22 (1 /* age */ + 3 /* targets */ * 4 /* target size */) +
23 2 /* CRC-16 */;
24}
25static_assert(spi_transfer_size() == 41, "hand math is wrong");
26using SpiTransfer = std::array<char, spi_transfer_size()>;
27
28SpiTransfer SpiPackToRoborio(const TeensyToRoborio &message);
James Kuszmaul3ae42262019-11-08 12:33:41 -080029std::optional<TeensyToRoborio> SpiUnpackToRoborio(
Austin Schuhb72be802022-01-02 12:26:28 -080030 absl::Span<const char> transfer);
Brian Silvermana10b87e2019-02-24 15:20:07 -080031SpiTransfer SpiPackToTeensy(const RoborioToTeensy &message);
James Kuszmaul3ae42262019-11-08 12:33:41 -080032std::optional<RoborioToTeensy> SpiUnpackToTeensy(
Austin Schuhb72be802022-01-02 12:26:28 -080033 absl::Span<const char> transfer);
Brian Silverman246cb222019-02-02 16:38:18 -080034
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080035} // namespace frc971::jevois
Brian Silverman246cb222019-02-02 16:38:18 -080036
37#endif // Y2019_JEVOIS_SPI_H_