Brian Silverman | 246cb22 | 2019-02-02 16:38:18 -0800 | [diff] [blame] | 1 | #ifndef Y2019_JEVOIS_SPI_H_ |
| 2 | #define Y2019_JEVOIS_SPI_H_ |
| 3 | |
Brian Silverman | 246cb22 | 2019-02-02 16:38:18 -0800 | [diff] [blame] | 4 | #include <array> |
Tyler Chatow | bf0609c | 2021-07-31 16:13:27 -0700 | [diff] [blame] | 5 | #include <cstdint> |
| 6 | #include <optional> |
Brian Silverman | 246cb22 | 2019-02-02 16:38:18 -0800 | [diff] [blame] | 7 | |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 8 | #include "absl/types/span.h" |
Philipp Schrader | 790cb54 | 2023-07-05 21:06:52 -0700 | [diff] [blame^] | 9 | |
Brian Silverman | 246cb22 | 2019-02-02 16:38:18 -0800 | [diff] [blame] | 10 | #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 | |
| 17 | namespace frc971 { |
| 18 | namespace jevois { |
| 19 | |
| 20 | constexpr size_t spi_transfer_size() { |
| 21 | // The teensy->RoboRIO side is way bigger, so just calculate that. |
| 22 | return 3 /* 3 frames */ * |
| 23 | (1 /* age */ + 3 /* targets */ * 4 /* target size */) + |
| 24 | 2 /* CRC-16 */; |
| 25 | } |
| 26 | static_assert(spi_transfer_size() == 41, "hand math is wrong"); |
| 27 | using SpiTransfer = std::array<char, spi_transfer_size()>; |
| 28 | |
| 29 | SpiTransfer SpiPackToRoborio(const TeensyToRoborio &message); |
James Kuszmaul | 3ae4226 | 2019-11-08 12:33:41 -0800 | [diff] [blame] | 30 | std::optional<TeensyToRoborio> SpiUnpackToRoborio( |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 31 | absl::Span<const char> transfer); |
Brian Silverman | a10b87e | 2019-02-24 15:20:07 -0800 | [diff] [blame] | 32 | SpiTransfer SpiPackToTeensy(const RoborioToTeensy &message); |
James Kuszmaul | 3ae4226 | 2019-11-08 12:33:41 -0800 | [diff] [blame] | 33 | std::optional<RoborioToTeensy> SpiUnpackToTeensy( |
Austin Schuh | b72be80 | 2022-01-02 12:26:28 -0800 | [diff] [blame] | 34 | absl::Span<const char> transfer); |
Brian Silverman | 246cb22 | 2019-02-02 16:38:18 -0800 | [diff] [blame] | 35 | |
| 36 | } // namespace jevois |
| 37 | } // namespace frc971 |
| 38 | |
| 39 | #endif // Y2019_JEVOIS_SPI_H_ |