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) {}
225 std::byte register_data,
231 uint8_t register_data,
237 uint16_t register_data,
243 uint32_t register_data,
290 const size_t register_data_size,
294 const endian register_address_order_;
295 const endian data_order_;
296 const RegisterAddressSize register_address_size_;
300 uint32_t register_address,
306 sizeof(
decltype(register_data)::value_type),
312 uint32_t register_address,
317 as_bytes(register_data),
318 sizeof(
decltype(register_data)::value_type),
324 uint32_t register_address,
329 as_bytes(register_data),
330 sizeof(
decltype(register_data)::value_type),
336 uint32_t register_address,
341 as_bytes(register_data),
342 sizeof(
decltype(register_data)::value_type),
348 uint32_t register_address,
349 std::byte register_data,
351 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
354 span(®ister_data, 1),
355 sizeof(register_data),
361 uint32_t register_address,
362 uint8_t register_data,
364 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
367 as_bytes(
span(®ister_data, 1)),
368 sizeof(register_data),
374 uint32_t register_address,
375 uint16_t register_data,
377 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
380 as_bytes(
span(®ister_data, 1)),
381 sizeof(register_data),
387 uint32_t register_address,
388 uint32_t register_data,
390 std::array<std::byte,
sizeof(register_data) +
sizeof(register_address)>
393 as_bytes(
span(®ister_data, 1)),
394 sizeof(register_data),
400 uint32_t register_address,
406 register_address, as_writable_bytes(return_data), timeout);
410 uint32_t register_address,
414 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
417 for (uint16_t& register_value : return_data) {
418 register_value = bytes::ReadInOrder<uint16_t>(data_order_, ®ister_value);
425 uint32_t register_address,
429 ReadRegisters(register_address, as_writable_bytes(return_data), timeout));
434 for (uint32_t& register_value : return_data) {
435 register_value = bytes::ReadInOrder<uint32_t>(data_order_, ®ister_value);
457 std::array<uint16_t, 1> data = {};
464 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:360
Result< std::byte > ReadRegister(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:441
Status WriteRegisters8(uint32_t register_address, span< const uint8_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:311
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:455
Status WriteRegister(uint32_t register_address, std::byte register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:347
Status ReadRegisters8(uint32_t register_address, span< uint8_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:399
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:462
Result< uint8_t > ReadRegister8(uint32_t register_address, chrono::SystemClock::duration timeout)
Definition: register_device.h:448
Status ReadRegisters32(uint32_t register_address, span< uint32_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:424
Status WriteRegister16(uint32_t register_address, uint16_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:373
Status WriteRegisters16(uint32_t register_address, span< const uint16_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:323
Status WriteRegisters(uint32_t register_address, ConstByteSpan register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:299
Status WriteRegisters32(uint32_t register_address, span< const uint32_t > register_data, ByteSpan buffer, chrono::SystemClock::duration timeout)
Definition: register_device.h:335
Status ReadRegisters16(uint32_t register_address, span< uint16_t > return_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:409
Status WriteRegister32(uint32_t register_address, uint32_t register_data, chrono::SystemClock::duration timeout)
Definition: register_device.h:386
constexpr RegisterDevice(Initiator &initiator, Address address, endian order, RegisterAddressSize register_address_size)
Definition: register_device.h:83
#define PW_TRY(expr)
Returns early if expr is a non-OK Status or Result.
Definition: try.h:27
constexpr Status OkStatus()
Definition: status.h:450
The Pigweed namespace.
Definition: alignment.h:27