16#include "pw_bytes/endian.h"
17#include "pw_bytes/span.h"
18#include "pw_chrono/system_clock.h"
19#include "pw_i2c/address.h"
20#include "pw_i2c/device.h"
21#include "pw_i2c/initiator.h"
22#include "pw_result/result.h"
23#include "pw_status/status.h"
24#include "pw_status/try.h"
29enum class RegisterAddressSize {
59 endian register_address_order,
61 RegisterAddressSize register_address_size)
62 :
Device(initiator, address),
63 register_address_order_(register_address_order),
64 data_order_(data_order),
65 register_address_size_(register_address_size) {}
84 RegisterAddressSize register_address_size)
85 :
Device(initiator, address),
86 register_address_order_(order),
88 register_address_size_(register_address_size) {}
134 ConstByteSpan register_data,
141 span<const uint8_t> register_data,
148 span<const uint16_t> register_data,
155 span<const uint32_t> register_data,
197 ByteSpan return_data,
203 span<uint8_t> return_data,
209 span<uint16_t> return_data,
215 span<uint32_t> return_data,
254 std::byte register_data,
260 uint8_t register_data,
266 uint16_t register_data,
272 uint32_t register_data,
307 Result<std::byte>
ReadRegister(uint32_t register_address,
328 ConstByteSpan register_data,
329 const size_t register_data_size,
333 const endian register_address_order_;
334 const endian data_order_;
335 const RegisterAddressSize register_address_size_;
339 uint32_t register_address,
340 ConstByteSpan register_data,
345 sizeof(
decltype(register_data)::value_type),
351 uint32_t register_address,
352 span<const uint8_t> register_data,
356 as_bytes(register_data),
357 sizeof(
decltype(register_data)::value_type),
363 uint32_t register_address,
364 span<const uint16_t> register_data,
368 as_bytes(register_data),
369 sizeof(
decltype(register_data)::value_type),
375 uint32_t register_address,
376 span<const uint32_t> register_data,
380 as_bytes(register_data),
381 sizeof(
decltype(register_data)::value_type),
387 uint32_t register_address,
388 std::byte register_data,
390 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
393 span(®ister_data, 1),
394 sizeof(register_data),
400 uint32_t register_address,
401 uint8_t register_data,
403 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
406 as_bytes(span(®ister_data, 1)),
407 sizeof(register_data),
413 uint32_t register_address,
414 uint16_t register_data,
416 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
419 as_bytes(span(®ister_data, 1)),
420 sizeof(register_data),
426 uint32_t register_address,
427 uint32_t register_data,
429 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
432 as_bytes(span(®ister_data, 1)),
433 sizeof(register_data),
439 uint32_t register_address,
440 span<uint8_t> return_data,
445 register_address, as_writable_bytes(return_data), timeout);
449 uint32_t register_address,
450 span<uint16_t> return_data,
453 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
456 for (uint16_t& register_value : return_data) {
457 register_value = bytes::ReadInOrder<uint16_t>(data_order_, ®ister_value);
464 uint32_t register_address,
465 span<uint32_t> return_data,
468 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
473 for (uint32_t& register_value : return_data) {
474 register_value = bytes::ReadInOrder<uint32_t>(data_order_, ®ister_value);
483 PW_TRY(
ReadRegisters(register_address, span(&data, 1), timeout));
490 PW_TRY(
ReadRegisters8(register_address, span(&data, 1), timeout));
496 std::array<uint16_t, 1> data = {};
503 std::array<uint32_t, 1> data = {};
The common, base driver interface for initiating thread-safe transactions with devices on an I2C bus....
Definition: initiator.h:49
Definition: register_device.h:40
Status WriteRegister8(uint32_t register_address, uint8_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:399
Result< std::byte > ReadRegister(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:480
Status WriteRegisters8(uint32_t register_address, span< const uint8_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:350
Status ReadRegisters(uint32_t register_address, ByteSpan return_data, chrono::SystemClock::duration timeout)
Result< uint16_t > ReadRegister16(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:494
Status WriteRegister(uint32_t register_address, std::byte register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:386
Status ReadRegisters8(uint32_t register_address, span< uint8_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:438
constexpr RegisterDevice(Initiator &initiator, Address address, endian register_address_order, endian data_order, RegisterAddressSize register_address_size)
Definition: register_device.h:57
Result< uint32_t > ReadRegister32(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:501
Result< uint8_t > ReadRegister8(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:487
Status ReadRegisters32(uint32_t register_address, span< uint32_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:463
Status WriteRegister16(uint32_t register_address, uint16_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:412
Status WriteRegisters16(uint32_t register_address, span< const uint16_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:362
Status WriteRegisters(uint32_t register_address, ConstByteSpan register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:338
Status WriteRegisters32(uint32_t register_address, span< const uint32_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:374
Status ReadRegisters16(uint32_t register_address, span< uint16_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:448
Status WriteRegister32(uint32_t register_address, uint32_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:425
constexpr RegisterDevice(Initiator &initiator, Address address, endian order, RegisterAddressSize register_address_size)
Definition: register_device.h:81
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:234
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:86