32#include "../SensorBuildOpt.h"
33#if !SENSORLIB_EXCLUDE_IO_EXPANDER_PCA9570
39static constexpr uint8_t PCA9570_SLAVE_ADDRESS = (0x24);
89 uint8_t newVal = current;
90 for (uint8_t
i = 0;
i < PCA9570_PINS_COUNT;
i++) {
91 if (mask & (1UL <<
i)) {
92 if ((values >>
i) & 1) {
107 for (uint8_t
i = 0;
i < PCA9570_PINS_COUNT;
i++) {
108 if (mask & (1UL <<
i)) {
143 if (mode != OUTPUT) {
167 if (mode != OUTPUT) {
173 for (uint8_t
i = 0;
i < PCA9570_PINS_COUNT;
i++) {
174 if (pinMask & (1UL <<
i)) {
193 current |= (1 << pin);
195 current &= ~(1 << pin);
213 return (value >> pin) & 1;
228 uint8_t buffer[3] = {};
229 if (
readRegBuff(PCA9570_DEVICE_ID_READ, buffer, 3) < 0 ) {
233 uint16_t manufacturerID, partID;
235 manufacturerID = (buffer[0] << 4) | ((buffer[1] >> 4) & 0x0F);
236 partID = ((buffer[1] & 0x0F) << 5) | ((buffer[2] >> 3) & 0x1F);
237 revision = buffer[2] & 0x07;
238 (void)manufacturerID;
241 SENSORLIB_LOG_D(
"ManufacturerID:0x%" PRIx16
", PartID:0x%" PRIx16
", Revision:0x%" PRIx8,
242 manufacturerID, partID, revision);
248 static constexpr uint8_t PCA9570_GENERAL_CALL_ADDR = 0x00;
249 static constexpr uint8_t PCA9570_DEVICE_ID_WRITE = 0xF8;
250 static constexpr uint8_t PCA9570_DEVICE_ID_READ = 0xF9;
251 static constexpr uint8_t PCA9570_SOFT_RESET_CMD = 0x06;
252 static constexpr uint8_t PCA9570_PINS_COUNT = 4;
#define SENSORLIB_LOG_E(...)
#define SENSORLIB_LOG_D(...)
Abstract base class for GPIO expander devices.
std::unique_ptr< bool[]> _outputStates
Cached output states (true = HIGH)
std::unique_ptr< uint8_t[]> _pinModes
Cached pin modes (INPUT/OUTPUT)
Concrete driver for the PCA9570 4‑bit output‑only I2C GPIO expander.
bool digitalReadImpl(uint8_t pin) override
Read the current output value of a pin.
void pinModeImpl(uint8_t pin, uint8_t mode) override
Set the direction of a single pin.
~IoExpanderPCA9570()=default
Destroy the IoExpanderPCA9570 object.
bool initImpl(uint8_t param) override
Perform chip‑specific initialization.
void digitalWritePort(uint16_t mask, uint16_t values) override
Write to multiple pins simultaneously using a mask.
void digitalWriteImpl(uint8_t pin, bool value) override
Write a digital value to an output pin.
void configPinsImpl(uint16_t pinMask, uint8_t mode) override
Hardware‑specific implementation for configuring multiple pins simultaneously.
uint16_t digitalReadPort() override
Read the current output register value.
IoExpanderPCA9570()
Construct a new IoExpanderPCA9570 object.
int writeRegBuff(uint8_t reg, uint8_t *buf, size_t len)
int readRegBuff(uint8_t reg, uint8_t *buf, size_t len) const
int readBuff(uint8_t *buf, size_t len) const