mirror of
https://github.com/esphome/esphome.git
synced 2025-11-17 23:35:47 +00:00
Merge branch 'integration' into memory_api
This commit is contained in:
4
.github/workflows/codeql.yml
vendored
4
.github/workflows/codeql.yml
vendored
@@ -58,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
|
uses: github/codeql-action/init@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
build-mode: ${{ matrix.build-mode }}
|
build-mode: ${{ matrix.build-mode }}
|
||||||
@@ -86,6 +86,6 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2
|
uses: github/codeql-action/analyze@014f16e7ab1402f30e7c3329d33797e7948572db # v4.31.3
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
from logging import getLogger
|
||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -35,6 +36,8 @@ from esphome.core import CORE, ID
|
|||||||
import esphome.final_validate as fv
|
import esphome.final_validate as fv
|
||||||
from esphome.yaml_util import make_data_base
|
from esphome.yaml_util import make_data_base
|
||||||
|
|
||||||
|
_LOGGER = getLogger(__name__)
|
||||||
|
|
||||||
CODEOWNERS = ["@esphome/core"]
|
CODEOWNERS = ["@esphome/core"]
|
||||||
uart_ns = cg.esphome_ns.namespace("uart")
|
uart_ns = cg.esphome_ns.namespace("uart")
|
||||||
UARTComponent = uart_ns.class_("UARTComponent")
|
UARTComponent = uart_ns.class_("UARTComponent")
|
||||||
@@ -130,6 +133,21 @@ def validate_host_config(config):
|
|||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
def validate_rx_buffer_size(config):
|
||||||
|
if CORE.is_esp32:
|
||||||
|
# ESP32 UART hardware FIFO is 128 bytes (LP UART is 16 bytes, but we use 128 as safe minimum)
|
||||||
|
# rx_buffer_size must be greater than the hardware FIFO length
|
||||||
|
min_buffer_size = 128
|
||||||
|
if config[CONF_RX_BUFFER_SIZE] <= min_buffer_size:
|
||||||
|
_LOGGER.warning(
|
||||||
|
"UART rx_buffer_size (%d bytes) is too small and must be greater than the hardware "
|
||||||
|
"FIFO size (%d bytes). The buffer size will be automatically adjusted at runtime.",
|
||||||
|
config[CONF_RX_BUFFER_SIZE],
|
||||||
|
min_buffer_size,
|
||||||
|
)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
def _uart_declare_type(value):
|
def _uart_declare_type(value):
|
||||||
if CORE.is_esp8266:
|
if CORE.is_esp8266:
|
||||||
return cv.declare_id(ESP8266UartComponent)(value)
|
return cv.declare_id(ESP8266UartComponent)(value)
|
||||||
@@ -247,6 +265,7 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
).extend(cv.COMPONENT_SCHEMA),
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN, CONF_PORT),
|
cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN, CONF_PORT),
|
||||||
validate_host_config,
|
validate_host_config,
|
||||||
|
validate_rx_buffer_size,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -91,6 +91,16 @@ void IDFUARTComponent::setup() {
|
|||||||
this->uart_num_ = static_cast<uart_port_t>(next_uart_num++);
|
this->uart_num_ = static_cast<uart_port_t>(next_uart_num++);
|
||||||
this->lock_ = xSemaphoreCreateMutex();
|
this->lock_ = xSemaphoreCreateMutex();
|
||||||
|
|
||||||
|
#if (SOC_UART_LP_NUM >= 1)
|
||||||
|
size_t fifo_len = ((this->uart_num_ < SOC_UART_HP_NUM) ? SOC_UART_FIFO_LEN : SOC_LP_UART_FIFO_LEN);
|
||||||
|
#else
|
||||||
|
size_t fifo_len = SOC_UART_FIFO_LEN;
|
||||||
|
#endif
|
||||||
|
if (this->rx_buffer_size_ <= fifo_len) {
|
||||||
|
ESP_LOGW(TAG, "rx_buffer_size is too small, must be greater than %zu", fifo_len);
|
||||||
|
this->rx_buffer_size_ = fifo_len * 2;
|
||||||
|
}
|
||||||
|
|
||||||
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
||||||
|
|
||||||
this->load_settings(false);
|
this->load_settings(false);
|
||||||
@@ -237,8 +247,12 @@ void IDFUARTComponent::set_rx_timeout(size_t rx_timeout) {
|
|||||||
|
|
||||||
void IDFUARTComponent::write_array(const uint8_t *data, size_t len) {
|
void IDFUARTComponent::write_array(const uint8_t *data, size_t len) {
|
||||||
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
||||||
uart_write_bytes(this->uart_num_, data, len);
|
int32_t write_len = uart_write_bytes(this->uart_num_, data, len);
|
||||||
xSemaphoreGive(this->lock_);
|
xSemaphoreGive(this->lock_);
|
||||||
|
if (write_len != (int32_t) len) {
|
||||||
|
ESP_LOGW(TAG, "uart_write_bytes failed: %d != %zu", write_len, len);
|
||||||
|
this->mark_failed();
|
||||||
|
}
|
||||||
#ifdef USE_UART_DEBUGGER
|
#ifdef USE_UART_DEBUGGER
|
||||||
for (size_t i = 0; i < len; i++) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
this->debug_callback_.call(UART_DIRECTION_TX, data[i]);
|
this->debug_callback_.call(UART_DIRECTION_TX, data[i]);
|
||||||
@@ -267,6 +281,7 @@ bool IDFUARTComponent::peek_byte(uint8_t *data) {
|
|||||||
|
|
||||||
bool IDFUARTComponent::read_array(uint8_t *data, size_t len) {
|
bool IDFUARTComponent::read_array(uint8_t *data, size_t len) {
|
||||||
size_t length_to_read = len;
|
size_t length_to_read = len;
|
||||||
|
int32_t read_len = 0;
|
||||||
if (!this->check_read_timeout_(len))
|
if (!this->check_read_timeout_(len))
|
||||||
return false;
|
return false;
|
||||||
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
||||||
@@ -277,25 +292,31 @@ bool IDFUARTComponent::read_array(uint8_t *data, size_t len) {
|
|||||||
this->has_peek_ = false;
|
this->has_peek_ = false;
|
||||||
}
|
}
|
||||||
if (length_to_read > 0)
|
if (length_to_read > 0)
|
||||||
uart_read_bytes(this->uart_num_, data, length_to_read, 20 / portTICK_PERIOD_MS);
|
read_len = uart_read_bytes(this->uart_num_, data, length_to_read, 20 / portTICK_PERIOD_MS);
|
||||||
xSemaphoreGive(this->lock_);
|
xSemaphoreGive(this->lock_);
|
||||||
#ifdef USE_UART_DEBUGGER
|
#ifdef USE_UART_DEBUGGER
|
||||||
for (size_t i = 0; i < len; i++) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
this->debug_callback_.call(UART_DIRECTION_RX, data[i]);
|
this->debug_callback_.call(UART_DIRECTION_RX, data[i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return read_len == (int32_t) length_to_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
int IDFUARTComponent::available() {
|
int IDFUARTComponent::available() {
|
||||||
size_t available;
|
size_t available = 0;
|
||||||
|
esp_err_t err;
|
||||||
|
|
||||||
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
xSemaphoreTake(this->lock_, portMAX_DELAY);
|
||||||
uart_get_buffered_data_len(this->uart_num_, &available);
|
err = uart_get_buffered_data_len(this->uart_num_, &available);
|
||||||
if (this->has_peek_)
|
|
||||||
available++;
|
|
||||||
xSemaphoreGive(this->lock_);
|
xSemaphoreGive(this->lock_);
|
||||||
|
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
ESP_LOGW(TAG, "uart_get_buffered_data_len failed: %s", esp_err_to_name(err));
|
||||||
|
this->mark_failed();
|
||||||
|
}
|
||||||
|
if (this->has_peek_) {
|
||||||
|
available++;
|
||||||
|
}
|
||||||
return available;
|
return available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user