blob: fd999de44ae47ef0a88bf6df523638d8b6d2dbc3 [file] [log] [blame] [edit]
#ifndef Y2019_JEVOIS_SPI_H_
#define Y2019_JEVOIS_SPI_H_
#include <array>
#include <cstdint>
#include <optional>
#include "absl/types/span.h"
#include "y2019/jevois/structures.h"
// This file manages serializing and deserializing the various structures for
// transport via SPI.
//
// Our SPI transfers are fixed-size to simplify everything.
namespace frc971::jevois {
constexpr size_t spi_transfer_size() {
// The teensy->RoboRIO side is way bigger, so just calculate that.
return 3 /* 3 frames */ *
(1 /* age */ + 3 /* targets */ * 4 /* target size */) +
2 /* CRC-16 */;
}
static_assert(spi_transfer_size() == 41, "hand math is wrong");
using SpiTransfer = std::array<char, spi_transfer_size()>;
SpiTransfer SpiPackToRoborio(const TeensyToRoborio &message);
std::optional<TeensyToRoborio> SpiUnpackToRoborio(
absl::Span<const char> transfer);
SpiTransfer SpiPackToTeensy(const RoborioToTeensy &message);
std::optional<RoborioToTeensy> SpiUnpackToTeensy(
absl::Span<const char> transfer);
} // namespace frc971::jevois
#endif // Y2019_JEVOIS_SPI_H_