58template <
typename Port>
60 std::declval<const uint8_t*>(), std::declval<uint8_t*>(), std::declval<std::size_t>()));
63template <
typename Port>
65 std::is_same_v<std::remove_cv_t<std::remove_reference_t<TransferResult<Port>>>,
bool>;
73template <
typename Port>
74inline bool Transfer(Port& port,
const uint8_t* tx, uint8_t* rx, std::size_t len) {
77 "ads7952: the port's transfer(tx, rx, len) must return bool (true = frame "
78 "clocked, false = bus error), or void for a port that never reports errors");
79 if constexpr (std::is_void_v<Result>) {
83 return static_cast<bool>(
port.transfer(
tx,
rx,
len));
105 bool transfer(
const uint8_t* tx, uint8_t* rx, std::size_t len) {
bool transfer(const uint8_t *tx, uint8_t *rx, std::size_t len)
Perform a full-duplex SPI data transfer.
SpiInterface & operator=(SpiInterface &&)=default
SpiInterface(const SpiInterface &)=delete
~SpiInterface()=default
Protected destructor.
SpiInterface(SpiInterface &&)=default
SpiInterface & operator=(const SpiInterface &)=delete
SpiInterface()=default
Protected constructor to prevent direct instantiation.
decltype(std::declval< Port & >().transfer(std::declval< const uint8_t * >(), std::declval< uint8_t * >(), std::declval< std::size_t >())) TransferResult
Return type of Port::transfer(const uint8_t*, uint8_t*, std::size_t).
bool Transfer(Port &port, const uint8_t *tx, uint8_t *rx, std::size_t len)
Call the port's transfer() and return its status.
constexpr bool kTransferReportsStatus
True when the port's transfer() reports a status (returns bool).