7#include "../microfmt.hpp"
39RELOCO_BEGIN_UNSAFE_CODE
41 return static_cast<i2c_flags>(
static_cast<uint8_t
>(a) |
static_cast<uint8_t
>(b));
46 return (
static_cast<uint8_t
>(a) &
static_cast<uint8_t
>(b)) != 0;
57 span<const uint8_t> payload{};
70 return {
static_cast<uint16_t
>(addr_7bit & 0x7F),
i2c_dir::write, data, status, i2c_flags::none};
76 return {
static_cast<uint16_t
>(addr_7bit & 0x7F),
i2c_dir::write, span<const uint8_t>(arr, N), status,
84 return {
static_cast<uint16_t
>(addr_7bit & 0x7F),
i2c_dir::read, data, status, i2c_flags::none};
90 return {
static_cast<uint16_t
>(addr_7bit & 0x7F),
i2c_dir::read, span<const uint8_t>(arr, N), status, i2c_flags::none};
97 return {
static_cast<uint16_t
>(addr_10bit & 0x3FF), dir, data, status, i2c_flags::ten_bit};
106 bool uppercase_hex{
true};
109 for (
char c : ctx.spec()) {
110 if (c ==
'c' || c ==
'C')
113 uppercase_hex =
false;
134 const auto &hex_digits = uppercase_hex ? detail::hex_digits_upper : detail::hex_digits_lower;
135 const bool is_10bit = (msg.flags & i2c_flags::ten_bit);
141 detail::format_unsigned<detail::radix::hex>(out, msg.addr, uppercase_hex, is_10bit ? 3 : 2);
143 out.put(is_read ?
'R' :
'W');
146 for (
size_t i = 0; i < msg.payload.size(); ++i) {
149 const uint8_t b = msg.payload[i];
150 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
151 out.put(hex_digits[(b >> 4) & 0x0F]);
152 out.put(hex_digits[b & 0x0F]);
153 RELOCO_END_UNSAFE_BUFFER_USAGE;
159 out.write(status_name(msg.status));
168 out.write(
"I2C [0x");
169 detail::format_unsigned<detail::radix::hex>(out, msg.addr, uppercase_hex, is_10bit ? 3 : 2);
176 out.write(is_read ?
" RD (" :
" WR (");
177 detail::format_unsigned<detail::radix::decimal>(out, msg.payload.size(),
false, 0);
180 if (!msg.payload.empty()) {
181 out.write(
" DATA: ");
182 for (
size_t i = 0; i < msg.payload.size(); ++i) {
185 const uint8_t b = msg.payload[i];
186 out.put(hex_digits[(b >> 4) & 0x0F]);
187 out.put(hex_digits[b & 0x0F]);
192 out.write(status_name(msg.status));
Definition microfmt.hpp:881
#define MICROFMT_API_CLASS
Definition compat.hpp:181
RELOCO_BEGIN_UNSAFE_CODE constexpr can_flags operator|(can_flags a, can_flags b) noexcept
Definition can.hpp:38
i2c_status
Definition i2c.hpp:29
constexpr i2c_msg_view i2c_10bit(uint16_t addr_10bit, i2c_dir dir, span< const uint8_t > data, i2c_status status=i2c_status::ok) noexcept
Creates a 10-bit I2C read or write transaction view.
Definition i2c.hpp:95
constexpr i2c_msg_view i2c_read(uint8_t addr_7bit, span< const uint8_t > data, i2c_status status=i2c_status::ok) noexcept
Creates a 7-bit I2C read transaction view.
Definition i2c.hpp:82
reloco::sink sink
Type-erased, zero-allocation output sink.
Definition microfmt.hpp:46
enum RELOCO_FLAG_ENUM i2c_flags
Definition i2c.hpp:31
enum RELOCO_FLAG_ENUM ten_bit
Definition i2c.hpp:33
i2c_dir
Definition i2c.hpp:27
RELOCO_END_UNSAFE_CODE constexpr bool operator&(can_flags a, can_flags b) noexcept
Definition can.hpp:43
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
enum RELOCO_FLAG_ENUM nostart
Definition i2c.hpp:34
enum RELOCO_FLAG_ENUM stop
Definition i2c.hpp:35
constexpr i2c_msg_view i2c_write(uint8_t addr_7bit, span< const uint8_t > data, i2c_status status=i2c_status::ok) noexcept
Creates a 7-bit I2C write transaction view.
Definition i2c.hpp:68
Non-owning I2C transfer descriptor for formatting.
Definition i2c.hpp:54