// -----------------------------------------------------------------------------
|
|
// Abstract I2C sensor class (other sensor classes extend this class)
|
|
// Copyright (C) 2017-2018 by Xose Pérez <xose dot perez at gmail dot com>
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#if SENSOR_SUPPORT && ( I2C_SUPPORT || EMON_ANALOG_SUPPORT )
|
|
|
|
#pragma once
|
|
|
|
#include "BaseSensor.h"
|
|
|
|
class I2CSensor : public BaseSensor {
|
|
|
|
public:
|
|
|
|
void setAddress(unsigned char address) {
|
|
if (_address == address) return;
|
|
_address = address;
|
|
_dirty = true;
|
|
}
|
|
|
|
unsigned char getAddress() {
|
|
return _address;
|
|
}
|
|
|
|
// Descriptive name of the slot # index
|
|
String slot(unsigned char index) {
|
|
return description();
|
|
};
|
|
|
|
// Address of the sensor (it could be the GPIO or I2C address)
|
|
String address(unsigned char index) {
|
|
char buffer[5];
|
|
snprintf(buffer, sizeof(buffer), "0x%02X", _address);
|
|
return String(buffer);
|
|
}
|
|
|
|
protected:
|
|
|
|
// Specific for I2C sensors
|
|
unsigned char _begin_i2c(unsigned char address, size_t size, unsigned char * addresses) {
|
|
|
|
// Check if we should release a previously locked address
|
|
if (_previous_address != address) {
|
|
i2cReleaseLock(_previous_address);
|
|
}
|
|
|
|
// If we have already an address, check it is not locked
|
|
if (address && !i2cGetLock(address)) {
|
|
_error = SENSOR_ERROR_I2C;
|
|
|
|
// If we don't have an address...
|
|
} else {
|
|
|
|
// Trigger auto-discover
|
|
address = i2cFindAndLock(size, addresses);
|
|
|
|
// If still nothing exit with error
|
|
if (address == 0) _error = SENSOR_ERROR_I2C;
|
|
|
|
}
|
|
|
|
_previous_address = address;
|
|
return address;
|
|
|
|
}
|
|
|
|
unsigned char _previous_address = 0;
|
|
unsigned char _address = 0;
|
|
|
|
};
|
|
|
|
#endif // SENSOR_SUPPORT && I2C_SUPPORT
|