I2C re-introduce very verbose logging (#2446)

This commit is contained in:
Otto Winter 2021-10-06 00:57:23 +02:00 committed by GitHub
parent 9ff8240802
commit 54a173dbf1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 101 additions and 4 deletions

View File

@ -62,33 +62,75 @@ void ArduinoI2CBus::dump_config() {
} }
} }
ErrorCode ArduinoI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) { ErrorCode ArduinoI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
if (!initialized_) // logging is only enabled with vv level, if warnings are shown the caller
// should log them
if (!initialized_) {
ESP_LOGVV(TAG, "i2c bus not initialized!");
return ERROR_NOT_INITIALIZED; return ERROR_NOT_INITIALIZED;
}
size_t to_request = 0; size_t to_request = 0;
for (size_t i = 0; i < cnt; i++) for (size_t i = 0; i < cnt; i++)
to_request += buffers[i].len; to_request += buffers[i].len;
size_t ret = wire_->requestFrom((int) address, (int) to_request, 1); size_t ret = wire_->requestFrom((int) address, (int) to_request, 1);
if (ret != to_request) { if (ret != to_request) {
ESP_LOGVV(TAG, "RX %u from %02X failed with error %u", to_request, address, ret);
return ERROR_TIMEOUT; return ERROR_TIMEOUT;
} }
for (size_t i = 0; i < cnt; i++) { for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i]; const auto &buf = buffers[i];
for (size_t j = 0; j < buf.len; j++) for (size_t j = 0; j < buf.len; j++)
buf.data[j] = wire_->read(); buf.data[j] = wire_->read();
} }
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
char debug_buf[4];
std::string debug_hex;
for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i];
for (size_t j = 0; j < buf.len; j++) {
snprintf(debug_buf, sizeof(debug_buf), "%02X", buf.data[j]);
debug_hex += debug_buf;
}
}
ESP_LOGVV(TAG, "0x%02X RX %s", address, debug_hex.c_str());
#endif
return ERROR_OK; return ERROR_OK;
} }
ErrorCode ArduinoI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) { ErrorCode ArduinoI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) {
if (!initialized_) // logging is only enabled with vv level, if warnings are shown the caller
// should log them
if (!initialized_) {
ESP_LOGVV(TAG, "i2c bus not initialized!");
return ERROR_NOT_INITIALIZED; return ERROR_NOT_INITIALIZED;
}
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
char debug_buf[4];
std::string debug_hex;
for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i];
for (size_t j = 0; j < buf.len; j++) {
snprintf(debug_buf, sizeof(debug_buf), "%02X", buf.data[j]);
debug_hex += debug_buf;
}
}
ESP_LOGVV(TAG, "0x%02X TX %s", address, debug_hex.c_str());
#endif
wire_->beginTransmission(address); wire_->beginTransmission(address);
size_t written = 0;
for (size_t i = 0; i < cnt; i++) { for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i]; const auto &buf = buffers[i];
if (buf.len == 0) if (buf.len == 0)
continue; continue;
size_t ret = wire_->write(buf.data, buf.len); size_t ret = wire_->write(buf.data, buf.len);
written += ret;
if (ret != buf.len) { if (ret != buf.len) {
ESP_LOGVV(TAG, "TX failed at %u", written);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
} }
@ -97,10 +139,13 @@ ErrorCode ArduinoI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cn
return ERROR_OK; return ERROR_OK;
} else if (status == 1) { } else if (status == 1) {
// transmit buffer not large enough // transmit buffer not large enough
ESP_LOGVV(TAG, "TX failed: buffer not large enough");
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} else if (status == 2 || status == 3) { } else if (status == 2 || status == 3) {
ESP_LOGVV(TAG, "TX failed: not acknowledged");
return ERROR_NOT_ACKNOWLEDGED; return ERROR_NOT_ACKNOWLEDGED;
} }
ESP_LOGVV(TAG, "TX failed: unknown error %u", status);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }

View File

@ -73,16 +73,22 @@ void IDFI2CBus::dump_config() {
} }
} }
ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) { ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
if (!initialized_) // logging is only enabled with vv level, if warnings are shown the caller
// should log them
if (!initialized_) {
ESP_LOGVV(TAG, "i2c bus not initialized!");
return ERROR_NOT_INITIALIZED; return ERROR_NOT_INITIALIZED;
}
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_cmd_handle_t cmd = i2c_cmd_link_create();
esp_err_t err = i2c_master_start(cmd); esp_err_t err = i2c_master_start(cmd);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "RX from %02X master start failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
err = i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_READ, true); err = i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_READ, true);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "RX from %02X address write failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
@ -92,12 +98,14 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
continue; continue;
err = i2c_master_read(cmd, buf.data, buf.len, i == cnt - 1 ? I2C_MASTER_LAST_NACK : I2C_MASTER_ACK); err = i2c_master_read(cmd, buf.data, buf.len, i == cnt - 1 ? I2C_MASTER_LAST_NACK : I2C_MASTER_ACK);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "RX from %02X data read failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
} }
err = i2c_master_stop(cmd); err = i2c_master_stop(cmd);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "RX from %02X stop failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
@ -105,25 +113,64 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
if (err == ESP_FAIL) { if (err == ESP_FAIL) {
// transfer not acked // transfer not acked
ESP_LOGVV(TAG, "RX from %02X failed: not acked", address);
return ERROR_NOT_ACKNOWLEDGED; return ERROR_NOT_ACKNOWLEDGED;
} else if (err == ESP_ERR_TIMEOUT) { } else if (err == ESP_ERR_TIMEOUT) {
ESP_LOGVV(TAG, "RX from %02X failed: timeout", address);
return ERROR_TIMEOUT; return ERROR_TIMEOUT;
} else if (err != ESP_OK) { } else if (err != ESP_OK) {
ESP_LOGVV(TAG, "RX from %02X failed: %s", address, esp_err_to_name(err));
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
char debug_buf[4];
std::string debug_hex;
for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i];
for (size_t j = 0; j < buf.len; j++) {
snprintf(debug_buf, sizeof(debug_buf), "%02X", buf.data[j]);
debug_hex += debug_buf;
}
}
ESP_LOGVV(TAG, "0x%02X RX %s", address, debug_hex.c_str());
#endif
return ERROR_OK; return ERROR_OK;
} }
ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) { ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) {
if (!initialized_) // logging is only enabled with vv level, if warnings are shown the caller
// should log them
if (!initialized_) {
ESP_LOGVV(TAG, "i2c bus not initialized!");
return ERROR_NOT_INITIALIZED; return ERROR_NOT_INITIALIZED;
}
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
char debug_buf[4];
std::string debug_hex;
for (size_t i = 0; i < cnt; i++) {
const auto &buf = buffers[i];
for (size_t j = 0; j < buf.len; j++) {
snprintf(debug_buf, sizeof(debug_buf), "%02X", buf.data[j]);
debug_hex += debug_buf;
}
}
ESP_LOGVV(TAG, "0x%02X TX %s", address, debug_hex.c_str());
#endif
i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_cmd_handle_t cmd = i2c_cmd_link_create();
esp_err_t err = i2c_master_start(cmd); esp_err_t err = i2c_master_start(cmd);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "TX to %02X master start failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
err = i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_WRITE, true); err = i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_WRITE, true);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "TX to %02X address write failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
@ -133,12 +180,14 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) {
continue; continue;
err = i2c_master_write(cmd, buf.data, buf.len, true); err = i2c_master_write(cmd, buf.data, buf.len, true);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "TX to %02X data write failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
} }
err = i2c_master_stop(cmd); err = i2c_master_stop(cmd);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGVV(TAG, "TX to %02X master stop failed: %s", address, esp_err_to_name(err));
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
@ -146,10 +195,13 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt) {
i2c_cmd_link_delete(cmd); i2c_cmd_link_delete(cmd);
if (err == ESP_FAIL) { if (err == ESP_FAIL) {
// transfer not acked // transfer not acked
ESP_LOGVV(TAG, "TX to %02X failed: not acked", address);
return ERROR_NOT_ACKNOWLEDGED; return ERROR_NOT_ACKNOWLEDGED;
} else if (err == ESP_ERR_TIMEOUT) { } else if (err == ESP_ERR_TIMEOUT) {
ESP_LOGVV(TAG, "TX to %02X failed: timeout", address);
return ERROR_TIMEOUT; return ERROR_TIMEOUT;
} else if (err != ESP_OK) { } else if (err != ESP_OK) {
ESP_LOGVV(TAG, "TX to %02X failed: %s", address, esp_err_to_name(err));
return ERROR_UNKNOWN; return ERROR_UNKNOWN;
} }
return ERROR_OK; return ERROR_OK;