mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	| @@ -1,6 +1,8 @@ | ||||
| from esphome.const import CONF_BAUD_RATE, CONF_ID, CONF_LOGGER | ||||
| from esphome.components.logger import USB_CDC, USB_SERIAL_JTAG | ||||
| from esphome.const import CONF_BAUD_RATE, CONF_HARDWARE_UART, CONF_ID, CONF_LOGGER | ||||
| import esphome.codegen as cg | ||||
| import esphome.config_validation as cv | ||||
| from esphome.core import CORE | ||||
| import esphome.final_validate as fv | ||||
|  | ||||
| CODEOWNERS = ["@esphome/core"] | ||||
| @@ -17,14 +19,19 @@ CONFIG_SCHEMA = cv.Schema( | ||||
| ).extend(cv.COMPONENT_SCHEMA) | ||||
|  | ||||
|  | ||||
| def validate_logger_baud_rate(config): | ||||
| def validate_logger(config): | ||||
|     logger_conf = fv.full_config.get()[CONF_LOGGER] | ||||
|     if logger_conf[CONF_BAUD_RATE] == 0: | ||||
|         raise cv.Invalid("improv_serial requires the logger baud_rate to be not 0") | ||||
|     if CORE.using_esp_idf: | ||||
|         if logger_conf[CONF_HARDWARE_UART] in [USB_SERIAL_JTAG, USB_CDC]: | ||||
|             raise cv.Invalid( | ||||
|                 "improv_serial does not support the selected logger hardware_uart" | ||||
|             ) | ||||
|     return config | ||||
|  | ||||
|  | ||||
| FINAL_VALIDATE_SCHEMA = validate_logger_baud_rate | ||||
| FINAL_VALIDATE_SCHEMA = validate_logger | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|   | ||||
| @@ -26,22 +26,34 @@ std::string build_json(const json_build_t &f) { | ||||
|   const size_t free_heap = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT); | ||||
| #endif | ||||
|  | ||||
|   const size_t request_size = std::min(free_heap, (size_t) 512); | ||||
|  | ||||
|   size_t request_size = std::min(free_heap, (size_t) 512); | ||||
|   while (true) { | ||||
|     ESP_LOGV(TAG, "Attempting to allocate %u bytes for JSON serialization", request_size); | ||||
|     DynamicJsonDocument json_document(request_size); | ||||
|     if (json_document.capacity() == 0) { | ||||
|     ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes", | ||||
|       ESP_LOGE(TAG, | ||||
|                "Could not allocate memory for JSON document! Requested %u bytes, largest free heap block: %u bytes", | ||||
|                request_size, free_heap); | ||||
|       return "{}"; | ||||
|     } | ||||
|     JsonObject root = json_document.to<JsonObject>(); | ||||
|     f(root); | ||||
|     if (json_document.overflowed()) { | ||||
|       if (request_size == free_heap) { | ||||
|         ESP_LOGE(TAG, "Could not allocate memory for JSON document! Overflowed largest free heap block: %u bytes", | ||||
|                  free_heap); | ||||
|         return "{}"; | ||||
|       } | ||||
|       request_size = std::min(request_size * 2, free_heap); | ||||
|       continue; | ||||
|     } | ||||
|     json_document.shrinkToFit(); | ||||
|     ESP_LOGV(TAG, "Size after shrink %u bytes", json_document.capacity()); | ||||
|     std::string output; | ||||
|     serializeJson(json_document, output); | ||||
|     return output; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void parse_json(const std::string &data, const json_parse_t &f) { | ||||
|   // Here we are allocating 1.5 times the data size, | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| """Constants used by esphome.""" | ||||
|  | ||||
| __version__ = "2022.5.0b2" | ||||
| __version__ = "2022.5.0b3" | ||||
|  | ||||
| ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user