fix a01nyub data reading (#5882)

Co-authored-by: Samuel Sieb <samuel@sieb.net>
This commit is contained in:
Samuel Sieb 2023-12-04 15:41:33 -08:00 committed by GitHub
parent e271faa544
commit 29dcc4031f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -8,31 +8,23 @@ namespace esphome {
namespace a01nyub { namespace a01nyub {
static const char *const TAG = "a01nyub.sensor"; static const char *const TAG = "a01nyub.sensor";
static const uint8_t MAX_DATA_LENGTH_BYTES = 4;
void A01nyubComponent::loop() { void A01nyubComponent::loop() {
uint8_t data; uint8_t data;
while (this->available() > 0) { while (this->available() > 0) {
if (this->read_byte(&data)) { this->read_byte(&data);
if (this->buffer_.empty() && (data != 0xff))
continue;
buffer_.push_back(data); buffer_.push_back(data);
if (this->buffer_.size() == 4)
this->check_buffer_(); this->check_buffer_();
} }
}
} }
void A01nyubComponent::check_buffer_() { void A01nyubComponent::check_buffer_() {
if (this->buffer_.size() >= MAX_DATA_LENGTH_BYTES) { uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2];
size_t i; if (this->buffer_[3] == checksum) {
for (i = 0; i < this->buffer_.size(); i++) { float distance = (this->buffer_[1] << 8) + this->buffer_[2];
// 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) { if (distance > 280) {
float meters = distance / 1000.0; float meters = distance / 1000.0;
ESP_LOGV(TAG, "Distance from sensor: %f mm, %f m", distance, meters); ESP_LOGV(TAG, "Distance from sensor: %f mm, %f m", distance, meters);
@ -40,18 +32,13 @@ void A01nyubComponent::check_buffer_() {
} else { } else {
ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str()); ESP_LOGW(TAG, "Invalid data read from sensor: %s", format_hex_pretty(this->buffer_).c_str());
} }
} } else {
break; ESP_LOGW(TAG, "checksum failed: %02x != %02x", checksum, this->buffer_[3]);
}
} }
this->buffer_.clear(); this->buffer_.clear();
}
} }
void A01nyubComponent::dump_config() { void A01nyubComponent::dump_config() { LOG_SENSOR("", "A01nyub Sensor", this); }
ESP_LOGCONFIG(TAG, "A01nyub Sensor:");
LOG_SENSOR(" ", "Distance", this);
}
} // namespace a01nyub } // namespace a01nyub
} // namespace esphome } // namespace esphome