From 29dcc4031f9cc0d6b1044003da1ac72bc7e71c93 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Mon, 4 Dec 2023 15:41:33 -0800 Subject: [PATCH] fix a01nyub data reading (#5882) Co-authored-by: Samuel Sieb --- esphome/components/a01nyub/a01nyub.cpp | 49 ++++++++++---------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/esphome/components/a01nyub/a01nyub.cpp b/esphome/components/a01nyub/a01nyub.cpp index 75cb276f84..d0bc89a0c9 100644 --- a/esphome/components/a01nyub/a01nyub.cpp +++ b/esphome/components/a01nyub/a01nyub.cpp @@ -8,50 +8,37 @@ namespace esphome { namespace a01nyub { static const char *const TAG = "a01nyub.sensor"; -static const uint8_t MAX_DATA_LENGTH_BYTES = 4; void A01nyubComponent::loop() { uint8_t data; while (this->available() > 0) { - if (this->read_byte(&data)) { - buffer_.push_back(data); + this->read_byte(&data); + if (this->buffer_.empty() && (data != 0xff)) + continue; + buffer_.push_back(data); + if (this->buffer_.size() == 4) this->check_buffer_(); - } } } void A01nyubComponent::check_buffer_() { - if (this->buffer_.size() >= MAX_DATA_LENGTH_BYTES) { - size_t i; - for (i = 0; i < this->buffer_.size(); i++) { - // Look for the first packet - if (this->buffer_[i] == 0xFF) { - if (i + 1 + 3 < this->buffer_.size()) { // Packet is not complete - return; // Wait for completion - } - - uint8_t checksum = (this->buffer_[i] + this->buffer_[i + 1] + this->buffer_[i + 2]) & 0xFF; - if (this->buffer_[i + 3] == checksum) { - float distance = (this->buffer_[i + 1] << 8) + this->buffer_[i + 2]; - if (distance > 280) { - float meters = distance / 1000.0; - ESP_LOGV(TAG, "Distance from sensor: %f mm, %f m", distance, meters); - this->publish_state(meters); - } else { - ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str()); - } - } - break; - } + uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2]; + if (this->buffer_[3] == checksum) { + float distance = (this->buffer_[1] << 8) + this->buffer_[2]; + if (distance > 280) { + float meters = distance / 1000.0; + ESP_LOGV(TAG, "Distance from sensor: %f mm, %f m", distance, meters); + this->publish_state(meters); + } else { + ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str()); } - this->buffer_.clear(); + } else { + ESP_LOGW(TAG, "checksum failed: %02x != %02x", checksum, this->buffer_[3]); } + this->buffer_.clear(); } -void A01nyubComponent::dump_config() { - ESP_LOGCONFIG(TAG, "A01nyub Sensor:"); - LOG_SENSOR(" ", "Distance", this); -} +void A01nyubComponent::dump_config() { LOG_SENSOR("", "A01nyub Sensor", this); } } // namespace a01nyub } // namespace esphome