mirror of
https://github.com/esphome/esphome.git
synced 2026-02-08 00:31:58 +00:00
Merge branch 'cse7766_batch_read' into integration
This commit is contained in:
@@ -7,7 +7,6 @@ namespace esphome {
|
|||||||
namespace cse7766 {
|
namespace cse7766 {
|
||||||
|
|
||||||
static const char *const TAG = "cse7766";
|
static const char *const TAG = "cse7766";
|
||||||
static constexpr size_t CSE7766_RAW_DATA_SIZE = 24;
|
|
||||||
|
|
||||||
void CSE7766Component::loop() {
|
void CSE7766Component::loop() {
|
||||||
const uint32_t now = App.get_loop_component_start_time();
|
const uint32_t now = App.get_loop_component_start_time();
|
||||||
@@ -16,25 +15,33 @@ void CSE7766Component::loop() {
|
|||||||
this->raw_data_index_ = 0;
|
this->raw_data_index_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->available() == 0) {
|
int avail = this->available();
|
||||||
|
if (avail == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->last_transmission_ = now;
|
this->last_transmission_ = now;
|
||||||
while (this->available() != 0) {
|
|
||||||
this->read_byte(&this->raw_data_[this->raw_data_index_]);
|
// Read all available bytes at once to reduce UART call overhead.
|
||||||
|
// At 4800 baud (~480 bytes/sec) with ~122 Hz loop rate, typically ~4 bytes per call.
|
||||||
|
uint8_t buf[CSE7766_RAW_DATA_SIZE];
|
||||||
|
size_t to_read = std::min(static_cast<size_t>(avail), sizeof(buf));
|
||||||
|
this->read_array(buf, to_read);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < to_read; i++) {
|
||||||
|
this->raw_data_[this->raw_data_index_] = buf[i];
|
||||||
if (!this->check_byte_()) {
|
if (!this->check_byte_()) {
|
||||||
this->raw_data_index_ = 0;
|
this->raw_data_index_ = 0;
|
||||||
this->status_set_warning();
|
this->status_set_warning();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->raw_data_index_ == 23) {
|
if (this->raw_data_index_ == CSE7766_RAW_DATA_SIZE - 1) {
|
||||||
this->parse_data_();
|
this->parse_data_();
|
||||||
this->status_clear_warning();
|
this->status_clear_warning();
|
||||||
}
|
}
|
||||||
|
|
||||||
this->raw_data_index_ = (this->raw_data_index_ + 1) % 24;
|
this->raw_data_index_ = (this->raw_data_index_ + 1) % CSE7766_RAW_DATA_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,14 +60,15 @@ bool CSE7766Component::check_byte_() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == 23) {
|
if (index == CSE7766_RAW_DATA_SIZE - 1) {
|
||||||
uint8_t checksum = 0;
|
uint8_t checksum = 0;
|
||||||
for (uint8_t i = 2; i < 23; i++) {
|
for (uint8_t i = 2; i < CSE7766_RAW_DATA_SIZE - 1; i++) {
|
||||||
checksum += this->raw_data_[i];
|
checksum += this->raw_data_[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checksum != this->raw_data_[23]) {
|
if (checksum != this->raw_data_[CSE7766_RAW_DATA_SIZE - 1]) {
|
||||||
ESP_LOGW(TAG, "Invalid checksum from CSE7766: 0x%02X != 0x%02X", checksum, this->raw_data_[23]);
|
ESP_LOGW(TAG, "Invalid checksum from CSE7766: 0x%02X != 0x%02X", checksum,
|
||||||
|
this->raw_data_[CSE7766_RAW_DATA_SIZE - 1]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace cse7766 {
|
namespace cse7766 {
|
||||||
|
|
||||||
|
static constexpr size_t CSE7766_RAW_DATA_SIZE = 24;
|
||||||
|
|
||||||
class CSE7766Component : public Component, public uart::UARTDevice {
|
class CSE7766Component : public Component, public uart::UARTDevice {
|
||||||
public:
|
public:
|
||||||
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
|
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
|
||||||
@@ -33,7 +35,7 @@ class CSE7766Component : public Component, public uart::UARTDevice {
|
|||||||
this->raw_data_[start_index + 2]);
|
this->raw_data_[start_index + 2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t raw_data_[24];
|
uint8_t raw_data_[CSE7766_RAW_DATA_SIZE];
|
||||||
uint8_t raw_data_index_{0};
|
uint8_t raw_data_index_{0};
|
||||||
uint32_t last_transmission_{0};
|
uint32_t last_transmission_{0};
|
||||||
sensor::Sensor *voltage_sensor_{nullptr};
|
sensor::Sensor *voltage_sensor_{nullptr};
|
||||||
|
|||||||
Reference in New Issue
Block a user