AS5047U Driver
API reference
Loading...
Searching...
No Matches
as5047u_spi_interface.hpp
Go to the documentation of this file.
1
6#pragma once
7#include <cstddef>
8#include <cstdint>
9#include <type_traits>
10#include <utility>
11
12namespace as5047u {
13
47namespace detail {
48
50template <typename Port>
51using TransferResult = decltype(std::declval<Port&>().transfer(
52 std::declval<const uint8_t*>(), std::declval<uint8_t*>(), std::declval<std::size_t>()));
53
55template <typename Port>
56inline constexpr bool kTransferReportsStatus =
57 std::is_same_v<std::remove_cv_t<std::remove_reference_t<TransferResult<Port>>>, bool>;
58
65template <typename Port>
66inline bool Transfer(Port& port, const uint8_t* tx, uint8_t* rx, std::size_t len) {
67 using Result = TransferResult<Port>;
68 static_assert(std::is_void_v<Result> || kTransferReportsStatus<Port>,
69 "as5047u: the port's transfer(tx, rx, len) must return bool (true = frame "
70 "clocked, false = bus error), or void for a port that never reports errors");
71 if constexpr (std::is_void_v<Result>) {
72 port.transfer(tx, rx, len);
73 return true;
74 } else {
75 return static_cast<bool>(port.transfer(tx, rx, len));
76 }
77}
78
79} // namespace detail
80
81template <typename Derived> class SpiInterface {
82public:
97 bool transfer(const uint8_t* tx, uint8_t* rx, std::size_t len) {
98 return detail::Transfer(*static_cast<Derived*>(this), tx, rx, len);
99 }
100
101 // Prevent copying
102 SpiInterface(const SpiInterface &) = delete;
104
105protected:
109 SpiInterface() = default;
110
111 // Allow moving
114
119 ~SpiInterface() = default;
120};
121
122} // namespace as5047u
Definition as5047u_spi_interface.hpp:81
~SpiInterface()=default
Protected destructor.
SpiInterface()=default
Protected constructor to prevent direct instantiation.
SpiInterface(const SpiInterface &)=delete
SpiInterface(SpiInterface &&)=default
SpiInterface & operator=(SpiInterface &&)=default
bool transfer(const uint8_t *tx, uint8_t *rx, std::size_t len)
Perform a full-duplex SPI data transfer.
Definition as5047u_spi_interface.hpp:97
SpiInterface & operator=(const SpiInterface &)=delete
bool Transfer(Port &port, const uint8_t *tx, uint8_t *rx, std::size_t len)
Call the port's transfer() and return its status.
Definition as5047u_spi_interface.hpp:66
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).
Definition as5047u_spi_interface.hpp:52
constexpr bool kTransferReportsStatus
True when the port's transfer() reports a status (returns bool).
Definition as5047u_spi_interface.hpp:56
Definition as5047u.hpp:52