1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-05 21:02:20 +01:00

Add ADE7953 Support (#593)

* Add ADE795 support

* Lint

* Fix

* Fix, add test
This commit is contained in:
Otto Winter
2019-10-16 13:19:41 +02:00
committed by GitHub
parent 9c30f4cc68
commit cdb9c59662
8 changed files with 206 additions and 14 deletions

View File

@@ -135,6 +135,9 @@ bool I2CComponent::read_bytes(uint8_t address, uint8_t a_register, uint8_t *data
delay(conversion);
return this->raw_receive(address, data, len);
}
bool I2CComponent::read_bytes_raw(uint8_t address, uint8_t *data, uint8_t len) {
return this->raw_receive(address, data, len);
}
bool I2CComponent::read_bytes_16(uint8_t address, uint8_t a_register, uint16_t *data, uint8_t len,
uint32_t conversion) {
if (!this->write_bytes(address, a_register, nullptr, 0))
@@ -156,6 +159,11 @@ bool I2CComponent::write_bytes(uint8_t address, uint8_t a_register, const uint8_
this->raw_write(address, data, len);
return this->raw_end_transmission(address);
}
bool I2CComponent::write_bytes_raw(uint8_t address, const uint8_t *data, uint8_t len) {
this->raw_begin_transmission(address);
this->raw_write(address, data, len);
return this->raw_end_transmission(address);
}
bool I2CComponent::write_bytes_16(uint8_t address, uint8_t a_register, const uint16_t *data, uint8_t len) {
this->raw_begin_transmission(address);
this->raw_write(address, &a_register, 1);

View File

@@ -42,6 +42,7 @@ class I2CComponent : public Component {
* @return If the operation was successful.
*/
bool read_bytes(uint8_t address, uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion = 0);
bool read_bytes_raw(uint8_t address, uint8_t *data, uint8_t len);
/** Read len amount of 16-bit words (MSB first) from a register into data.
*
@@ -69,6 +70,7 @@ class I2CComponent : public Component {
* @return If the operation was successful.
*/
bool write_bytes(uint8_t address, uint8_t a_register, const uint8_t *data, uint8_t len);
bool write_bytes_raw(uint8_t address, const uint8_t *data, uint8_t len);
/** Write len amount of 16-bit words (MSB first) to the specified register for address.
*
@@ -151,7 +153,6 @@ class I2CDevice {
/// Manually set the parent i2c bus for this device.
void set_i2c_parent(I2CComponent *parent);
protected:
/** Read len amount of bytes from a register into data. Optionally with a conversion time after
* writing the register value to the bus.
*
@@ -161,15 +162,23 @@ class I2CDevice {
* @param conversion The time in ms between writing the register value and reading out the value.
* @return If the operation was successful.
*/
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion = 0); // NOLINT
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len, uint32_t conversion = 0);
bool read_bytes_raw(uint8_t *data, uint8_t len) { return this->parent_->read_bytes_raw(this->address_, data, len); }
template<size_t N> optional<std::array<uint8_t, N>> read_bytes(uint8_t a_register) { // NOLINT
template<size_t N> optional<std::array<uint8_t, N>> read_bytes(uint8_t a_register) {
std::array<uint8_t, N> res;
if (!this->read_bytes(a_register, res.data(), N)) {
return {};
}
return res;
}
template<size_t N> optional<std::array<uint8_t, N>> read_bytes_raw() {
std::array<uint8_t, N> res;
if (!this->read_bytes_raw(res.data(), N)) {
return {};
}
return res;
}
/** Read len amount of 16-bit words (MSB first) from a register into data.
*
@@ -179,12 +188,12 @@ class I2CDevice {
* @param conversion The time in ms between writing the register value and reading out the value.
* @return If the operation was successful.
*/
bool read_bytes_16(uint8_t a_register, uint16_t *data, uint8_t len, uint32_t conversion = 0); // NOLINT
bool read_bytes_16(uint8_t a_register, uint16_t *data, uint8_t len, uint32_t conversion = 0);
/// Read a single byte from a register into the data variable. Return true if successful.
bool read_byte(uint8_t a_register, uint8_t *data, uint32_t conversion = 0); // NOLINT
bool read_byte(uint8_t a_register, uint8_t *data, uint32_t conversion = 0);
optional<uint8_t> read_byte(uint8_t a_register) { // NOLINT
optional<uint8_t> read_byte(uint8_t a_register) {
uint8_t data;
if (!this->read_byte(a_register, &data))
return {};
@@ -192,7 +201,7 @@ class I2CDevice {
}
/// Read a single 16-bit words (MSB first) from a register into the data variable. Return true if successful.
bool read_byte_16(uint8_t a_register, uint16_t *data, uint32_t conversion = 0); // NOLINT
bool read_byte_16(uint8_t a_register, uint16_t *data, uint32_t conversion = 0);
/** Write len amount of 8-bit bytes to the specified register.
*
@@ -201,7 +210,10 @@ class I2CDevice {
* @param len The amount of bytes to write to the bus.
* @return If the operation was successful.
*/
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len); // NOLINT
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len);
bool write_bytes_raw(const uint8_t *data, uint8_t len) {
return this->parent_->write_bytes_raw(this->address_, data, len);
}
/** Write a vector of data to a register.
*
@@ -209,13 +221,17 @@ class I2CDevice {
* @param data The data to write.
* @return If the operation was successful.
*/
bool write_bytes(uint8_t a_register, const std::vector<uint8_t> &data) { // NOLINT
bool write_bytes(uint8_t a_register, const std::vector<uint8_t> &data) {
return this->write_bytes(a_register, data.data(), data.size());
}
bool write_bytes_raw(const std::vector<uint8_t> &data) { return this->write_bytes_raw(data.data(), data.size()); }
template<size_t N> bool write_bytes(uint8_t a_register, const std::array<uint8_t, N> &data) { // NOLINT
template<size_t N> bool write_bytes(uint8_t a_register, const std::array<uint8_t, N> &data) {
return this->write_bytes(a_register, data.data(), data.size());
}
template<size_t N> bool write_bytes_raw(const std::array<uint8_t, N> &data) {
return this->write_bytes_raw(data.data(), data.size());
}
/** Write len amount of 16-bit words (MSB first) to the specified register.
*
@@ -224,14 +240,15 @@ class I2CDevice {
* @param len The amount of bytes to write to the bus.
* @return If the operation was successful.
*/
bool write_bytes_16(uint8_t a_register, const uint16_t *data, uint8_t len); // NOLINT
bool write_bytes_16(uint8_t a_register, const uint16_t *data, uint8_t len);
/// Write a single byte of data into the specified register. Return true if successful.
bool write_byte(uint8_t a_register, uint8_t data); // NOLINT
bool write_byte(uint8_t a_register, uint8_t data);
/// Write a single 16-bit word of data into the specified register. Return true if successful.
bool write_byte_16(uint8_t a_register, uint16_t data); // NOLINT
bool write_byte_16(uint8_t a_register, uint16_t data);
protected:
uint8_t address_{0x00};
I2CComponent *parent_{nullptr};
};