ADS7952 Driver
API reference
Loading...
Searching...
No Matches
ads7952_spi_interface.hpp
Go to the documentation of this file.
1
7#pragma once
8#include <cstddef>
9#include <cstdint>
10#include <type_traits>
11#include <utility>
12
13namespace ads7952 {
14
55namespace detail {
56
58template <typename Port>
59using TransferResult = decltype(std::declval<Port&>().transfer(
60 std::declval<const uint8_t*>(), std::declval<uint8_t*>(), std::declval<std::size_t>()));
61
63template <typename Port>
64inline constexpr bool kTransferReportsStatus =
65 std::is_same_v<std::remove_cv_t<std::remove_reference_t<TransferResult<Port>>>, bool>;
66
73template <typename Port>
74inline bool Transfer(Port& port, const uint8_t* tx, uint8_t* rx, std::size_t len) {
75 using Result = TransferResult<Port>;
76 static_assert(std::is_void_v<Result> || kTransferReportsStatus<Port>,
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>) {
80 port.transfer(tx, rx, len);
81 return true;
82 } else {
83 return static_cast<bool>(port.transfer(tx, rx, len));
84 }
85}
86
87} // namespace detail
88
89template <typename Derived> class SpiInterface {
90public:
105 bool transfer(const uint8_t* tx, uint8_t* rx, std::size_t len) {
106 return detail::Transfer(*static_cast<Derived*>(this), tx, rx, len);
107 }
108
109 // Prevent copying
110 SpiInterface(const SpiInterface &) = delete;
112
113protected:
117 SpiInterface() = default;
118
119 // Allow moving
122
127 ~SpiInterface() = default;
128};
129
130} // namespace ads7952
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).