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"
31enum class RegisterAddressSize {
61 endian register_address_order,
63 RegisterAddressSize register_address_size)
64 :
Device(initiator, address),
65 register_address_order_(register_address_order),
66 data_order_(data_order),
67 register_address_size_(register_address_size) {}
86 RegisterAddressSize register_address_size)
87 :
Device(initiator, address),
88 register_address_order_(order),
90 register_address_size_(register_address_size) {}
256 std::byte register_data,
262 uint8_t register_data,
268 uint16_t register_data,
274 uint32_t register_data,
331 const size_t register_data_size,
335 const endian register_address_order_;
336 const endian data_order_;
337 const RegisterAddressSize register_address_size_;
341 uint32_t register_address,
347 sizeof(
decltype(register_data)::value_type),
353 uint32_t register_address,
358 as_bytes(register_data),
359 sizeof(
decltype(register_data)::value_type),
365 uint32_t register_address,
370 as_bytes(register_data),
371 sizeof(
decltype(register_data)::value_type),
377 uint32_t register_address,
382 as_bytes(register_data),
383 sizeof(
decltype(register_data)::value_type),
389 uint32_t register_address,
390 std::byte register_data,
392 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
395 span(®ister_data, 1),
396 sizeof(register_data),
402 uint32_t register_address,
403 uint8_t register_data,
405 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
408 as_bytes(
span(®ister_data, 1)),
409 sizeof(register_data),
415 uint32_t register_address,
416 uint16_t register_data,
418 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
421 as_bytes(
span(®ister_data, 1)),
422 sizeof(register_data),
428 uint32_t register_address,
429 uint32_t register_data,
431 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
434 as_bytes(
span(®ister_data, 1)),
435 sizeof(register_data),
441 uint32_t register_address,
447 register_address, as_writable_bytes(return_data), timeout);
451 uint32_t register_address,
455 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
458 for (uint16_t& register_value : return_data) {
459 register_value = bytes::ReadInOrder<uint16_t>(data_order_, ®ister_value);
466 uint32_t register_address,
470 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
475 for (uint32_t& register_value : return_data) {
476 register_value = bytes::ReadInOrder<uint32_t>(data_order_, ®ister_value);
498 std::array<uint16_t, 1> data = {};
505 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:52
Definition: register_device.h:42
std::chrono::duration< rep, period > duration
Alias for durations representable with this clock.
Definition: system_clock.h:90
Status WriteRegister8(uint32_t register_address, uint8_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:401
Result< std::byte > ReadRegister(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:482
Status WriteRegisters8(uint32_t register_address, span< const uint8_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:352
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:496
Status WriteRegister(uint32_t register_address, std::byte register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:388
Status ReadRegisters8(uint32_t register_address, span< uint8_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:440
constexpr RegisterDevice(Initiator &initiator, Address address, endian register_address_order, endian data_order, RegisterAddressSize register_address_size)
Definition: register_device.h:59
Result< uint32_t > ReadRegister32(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:503
Result< uint8_t > ReadRegister8(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:489
Status ReadRegisters32(uint32_t register_address, span< uint32_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:465
Status WriteRegister16(uint32_t register_address, uint16_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:414
Status WriteRegisters16(uint32_t register_address, span< const uint16_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:364
Status WriteRegisters(uint32_t register_address, ConstByteSpan register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:340
Status WriteRegisters32(uint32_t register_address, span< const uint32_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:376
Status ReadRegisters16(uint32_t register_address, span< uint16_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:450
Status WriteRegister32(uint32_t register_address, uint32_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:427
constexpr RegisterDevice(Initiator &initiator, Address address, endian order, RegisterAddressSize register_address_size)
Definition: register_device.h:83
The Pigweed namespace.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:235