7#include "../microfmt.hpp"
42 span<const uint8_t> mosi{};
43 span<const uint8_t> miso{};
58 return {mosi, miso, cs, mode, status};
61template <
size_t N1,
size_t N2>
65 return {span<const uint8_t>(mosi, N1), span<const uint8_t>(miso, N2), cs, mode, status};
73 return {mosi, span<const uint8_t>{}, cs, mode, status};
80 return {span<const uint8_t>(mosi, N), span<const uint8_t>{}, cs, mode, status};
88 return {span<const uint8_t>{}, miso, cs, mode, status};
95 return {span<const uint8_t>{}, span<const uint8_t>(miso, N), cs, mode, status};
104 bool uppercase_hex{
true};
107 for (
char c : ctx.spec()) {
108 if (c ==
'c' || c ==
'C')
111 uppercase_hex =
false;
130 const auto &
hex = uppercase_hex ? detail::hex_digits_upper : detail::hex_digits_lower;
132 const auto print_bytes = [&out, &
hex](span<const uint8_t> s)
noexcept {
133 for (
size_t i = 0; i < s.size(); ++i) {
136 const uint8_t b = s[i];
137 out.put(
hex[(b >> 4) & 0x0F]);
138 out.put(
hex[b & 0x0F]);
145 detail::format_unsigned<detail::radix::decimal>(out, tx.cs_pin,
false, 0);
148 if (!tx.mosi.empty()) {
150 print_bytes(tx.mosi);
154 if (!tx.mosi.empty() && !tx.miso.empty()) {
158 if (!tx.miso.empty()) {
160 print_bytes(tx.miso);
166 out.write(status_name(tx.status));
174 out.write(
"SPI [CS");
175 detail::format_unsigned<detail::radix::decimal>(out, tx.cs_pin,
false, 0);
176 out.write(
", Mode ");
177 detail::format_unsigned<detail::radix::decimal>(out,
static_cast<uint8_t
>(tx.mode),
false, 0);
180 const size_t total_len = (tx.mosi.size() >= tx.miso.size()) ? tx.mosi.size() : tx.miso.size();
181 detail::format_unsigned<detail::radix::decimal>(out, total_len,
false, 0);
184 if (!tx.mosi.empty()) {
185 out.write(
" MOSI: ");
186 print_bytes(tx.mosi);
189 if (!tx.miso.empty()) {
190 if (!tx.mosi.empty())
192 out.write(
" MISO: ");
193 print_bytes(tx.miso);
197 out.write(status_name(tx.status));
Definition microfmt.hpp:881
#define MICROFMT_API_CLASS
Definition compat.hpp:181
spi_mode
Definition spi.hpp:27
constexpr hex_view< T > hex(T val, int width=0, bool prefix=false, bool uppercase=false) noexcept
Definition format_helpers.hpp:29
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
constexpr spi_transfer_view spi_write(span< const uint8_t > mosi, uint8_t cs=0, spi_mode mode=spi_mode::mode0, spi_status status=spi_status::ok) noexcept
Creates a write-only SPI transfer view.
Definition spi.hpp:70
constexpr spi_transfer_view spi_read(span< const uint8_t > miso, uint8_t cs=0, spi_mode mode=spi_mode::mode0, spi_status status=spi_status::ok) noexcept
Creates a read-only SPI transfer view.
Definition spi.hpp:85
spi_status
Definition spi.hpp:34
constexpr spi_transfer_view spi_duplex(span< const uint8_t > mosi, span< const uint8_t > miso, uint8_t cs=0, spi_mode mode=spi_mode::mode0, spi_status status=spi_status::ok) noexcept
Creates a full-duplex SPI transfer view.
Definition spi.hpp:55
Non-owning simplex or full-duplex SPI transfer descriptor.
Definition spi.hpp:41