├── .gitignore ├── CMakeLists.txt ├── Makefile ├── README.md ├── components └── espnow_transponder │ ├── component.mk │ ├── espnow_transponder.c │ └── include │ └── espnow_transponder.h ├── main ├── CMakeLists.txt ├── Kconfig.projbuild ├── component.mk └── espnow_example_main.c └── sdkconfig /.gitignore: -------------------------------------------------------------------------------- 1 | # General temp files 2 | *.DS_Store 3 | *.swp 4 | *.lck 5 | *.autosave 6 | *.user 7 | *.pyc 8 | 9 | # GNU/Make 10 | */*.hex 11 | /*.elf 12 | */*.o 13 | */*.d 14 | */*.i 15 | */*.ii 16 | */*.s 17 | */*.dfu 18 | 19 | # C51 20 | *.INC 21 | *.OBJ 22 | *.SRC 23 | *.SBR 24 | *.LST 25 | *.MAP 26 | *.hex 27 | *.bin 28 | !releases/*.bin 29 | 30 | # SDCC 31 | *.rel 32 | *.rst 33 | *.sym 34 | *.mem 35 | *.lk 36 | *.ihx 37 | *.asm 38 | 39 | # Qt 40 | build-*/ 41 | 42 | # Eagle PCB 43 | *.[bls]#[0-9] 44 | *.?## 45 | 46 | # Altium 47 | */History 48 | */__Previews 49 | */Project\ Logs\ for\ * 50 | */Project\ Outputs\ for\ * 51 | */debug.log 52 | */*.PrjPcbStructure 53 | 54 | # ESP32 55 | #sdkconfig 56 | sdkconfig.old 57 | 58 | # Eclipse 59 | .cproject 60 | .project 61 | .settings/ 62 | 63 | # Project specific 64 | build/ 65 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # The following lines of boilerplate have to be in your project's CMakeLists 2 | # in this exact order for cmake to work correctly 3 | cmake_minimum_required(VERSION 3.5) 4 | 5 | include($ENV{IDF_PATH}/tools/cmake/project.cmake) 6 | project(espnow_example) 7 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # This is a project Makefile. It is assumed the directory this Makefile resides in is a 3 | # project subdirectory. 4 | # 5 | 6 | PROJECT_NAME := espnow_example 7 | 8 | include $(IDF_PATH)/make/project.mk 9 | 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESPNOW DMX transmission example 2 | 3 | This prototype shows a method for sending DMX data using the ESP-NOW protocol. 4 | 5 | ESP-NOW is a protocol that uses the WiFi modem to send packets, but avoids the overhead of retransmission and routing. This means that packets aren't guarinteed to reach their destination, but it seems ideal for a real-time, lossy friendly protocol like Art-Net 6 | 7 | To run the demo, you'll need two ESP32 modules (any kind should be fine). Download and set up the ESP-IDF V3.3.1: 8 | 9 | https://docs.espressif.com/projects/esp-idf/en/v3.3.1/get-started/index.html 10 | 11 | Then use it to flash this project onto one of the boards, with 'ROLE_SENDER' defined, and onto one or more boards with 'ROLE_SENDER' undefined. 12 | 13 | When powered on, the board with 'ROLE_SENDER' defined will send a constant stream of packets at 30frames/s, and the receiver boards will receive the packets, and print some statistics every second. 14 | 15 | Sample output: 16 | 17 | I (1193923) espnow_rx: universe: 0 packets:36681 oos:1406 18 | I (1193923) espnow_rx: universe: 1 packets:36883 oos:1270 19 | I (1193923) espnow_rx: universe: 2 packets:36611 oos:1521 20 | I (1193923) espnow_rx: universe: 3 packets:36293 oos:1717 21 | I (1193933) espnow_rx: universe: 4 packets:36024 oos:1977 22 | I (1193933) espnow_rx: universe: 5 packets:36120 oos:1880 23 | I (1193943) espnow_rx: universe: 6 packets:36359 oos:1734 24 | I (1193953) espnow_rx: universe: 7 packets:36316 oos:1729 25 | I (1193953) espnow_rx: universe: 8 packets:36192 oos:1810 26 | I (1193963) espnow_rx: universe: 9 packets:36279 oos:1805 27 | I (1193963) espnow_rx: universe:10 packets:0 oos:0 28 | I (1193973) espnow_rx: universe:11 packets:0 oos:0 29 | I (1193983) espnow_rx: universe:12 packets:0 oos:0 30 | I (1193983) espnow_rx: universe:13 packets:0 oos:0 31 | I (1193993) espnow_rx: universe:14 packets:0 oos:0 32 | I (1194993) espnow_rx: universe: 0 packets:36716 oos:1406 33 | I (1194993) espnow_rx: universe: 1 packets:36918 oos:1270 34 | I (1194993) espnow_rx: universe: 2 packets:36645 oos:1522 35 | I (1194993) espnow_rx: universe: 3 packets:36326 oos:1719 36 | I (1195003) espnow_rx: universe: 4 packets:36058 oos:1978 37 | I (1195003) espnow_rx: universe: 5 packets:36152 oos:1884 38 | I (1195013) espnow_rx: universe: 6 packets:36391 oos:1737 39 | I (1195023) espnow_rx: universe: 7 packets:36351 oos:1730 40 | I (1195023) espnow_rx: universe: 8 packets:36226 oos:1811 41 | I (1195033) espnow_rx: universe: 9 packets:36314 oos:1806 42 | I (1195033) espnow_rx: universe:10 packets:0 oos:0 43 | I (1195043) espnow_rx: universe:11 packets:0 oos:0 44 | I (1195053) espnow_rx: universe:12 packets:0 oos:0 45 | I (1195053) espnow_rx: universe:13 packets:0 oos:0 46 | I (1195063) espnow_rx: universe:14 packets:0 oos:0 47 | 48 | Where 'packets' is the number of packets received by the universe, and 'oos' is the number of packets that were received out of sequence, indicating a dropped packet 49 | -------------------------------------------------------------------------------- /components/espnow_transponder/component.mk: -------------------------------------------------------------------------------- 1 | COMPONENT_ADD_INCLUDEDIRS := include 2 | -------------------------------------------------------------------------------- /components/espnow_transponder/espnow_transponder.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "freertos/FreeRTOS.h" 4 | #include "freertos/timers.h" 5 | #include "nvs_flash.h" 6 | #include "esp_event_loop.h" 7 | #include "esp_wifi.h" 8 | #include "esp_log.h" 9 | #include "esp_now.h" 10 | #include "rom/crc.h" 11 | 12 | #include "espnow_transponder.h" 13 | 14 | #include "esp_wifi_internal.h" 15 | 16 | static const char *TAG = "espnow"; 17 | 18 | #define ESPNOW_ERROR_CHECK(function, message) \ 19 | ret = (function); \ 20 | if(ret!= ESP_OK) { \ 21 | ESP_LOGE(TAG, "Error running:%s, err:%s", message, esp_err_to_name(ret)); \ 22 | return ret; \ 23 | } 24 | 25 | TaskHandle_t * espnow_transponder_task_hdl = NULL; 26 | 27 | static espnow_transponder_stats_t espnow_transponder_stats; 28 | 29 | //! Broadcast address 30 | static const uint8_t broadcast_mac[ESP_NOW_ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; 31 | 32 | const espnow_transponder_config_t espnow_transponder_config_default = { 33 | .mode = WIFI_MODE_STA, 34 | .power = 90, 35 | .channel = 1, 36 | .phy_rate = WIFI_PHY_RATE_MCS2_LGI, 37 | }; 38 | 39 | // Maximum size of the ESP-NOW event queue. Up to this many messages can be 40 | // stored on reception. It's recommended to make the callback function process 41 | // data fast enough that this queue can be small. 42 | #define ESPNOW_QUEUE_SIZE 30 43 | 44 | typedef enum { 45 | ESPNOW_TRANSPONDER_SEND_CB, 46 | ESPNOW_TRANSPONDER_RECV_CB, 47 | ESPNOW_TRANSPONDER_STOP_TASK, 48 | } espnow_transponder_event_id_t; 49 | 50 | typedef struct { 51 | uint8_t mac_addr[ESP_NOW_ETH_ALEN]; 52 | esp_now_send_status_t status; 53 | } espnow_transponder_event_send_cb_t; 54 | 55 | typedef struct { 56 | uint8_t mac_addr[ESP_NOW_ETH_ALEN]; 57 | uint8_t *data; 58 | int data_len; 59 | } espnow_transponder_event_recv_cb_t; 60 | 61 | typedef union { 62 | espnow_transponder_event_send_cb_t send_cb; 63 | espnow_transponder_event_recv_cb_t recv_cb; 64 | } espnow_transponder_event_info_t; 65 | 66 | // When ESPNOW sending or receiving callback function is called, post event to ESPNOW task. 67 | typedef struct { 68 | espnow_transponder_event_id_t id; //!< Callback event type 69 | espnow_transponder_event_info_t info; //!< Callback event data 70 | } espnow_transponder_event_t; 71 | 72 | //! Packet format for espnow_transponder packets 73 | typedef struct { 74 | uint16_t crc; //!< 16-bit CRC, calculated with crc16_le() 75 | uint8_t data_length; //!< Length of the data payload TODO: If ESP-NOW length is reliable, drop this 76 | uint8_t data[]; //!< First element of the data payload 77 | } __attribute__((packed)) espnow_transponder_packet_t; 78 | 79 | //! Internal queue for handling espnow rx and tx callbacks 80 | static xQueueHandle espnow_transponder_queue = NULL; 81 | 82 | //! Pointer to the user function that is called when a packet is successfully received 83 | static espnow_transponder_rx_callback_t rx_callback = NULL; 84 | 85 | //! \brief Check if a buffer contains a valid espnow_transponder_packet_t 86 | //! 87 | //! \param data Pointer to the data packet 88 | //! \param data_len Length of the data packet 89 | //! \return True if the packet passed CRC + data length checks 90 | static bool packet_check(uint8_t *packet, uint16_t packet_length) 91 | { 92 | // Check the the packet can fit the header 93 | if (packet_length < sizeof(espnow_transponder_packet_t)) { 94 | ESP_LOGE(TAG, "Receive ESPNOW data too short, len:%i, minimum:%i", packet_length, sizeof(espnow_transponder_packet_t)); 95 | espnow_transponder_stats.rx_short_packet++; 96 | return false; 97 | } 98 | 99 | espnow_transponder_packet_t *header = (espnow_transponder_packet_t *)packet; 100 | 101 | // Check the CRC 102 | const uint16_t crc = header->crc; 103 | header->crc = 0; // TODO: Feed this into the CRC so we don't have to overwrite it 104 | const uint16_t crc_cal = crc16_le(UINT16_MAX, packet, packet_length); 105 | if(crc_cal != crc) { 106 | ESP_LOGE(TAG, "Failed CRC check, expected:%04x got:%04x", crc, crc_cal); 107 | 108 | espnow_transponder_stats.rx_bad_crc++; 109 | return false; 110 | } 111 | 112 | const uint16_t expected_length = sizeof(espnow_transponder_packet_t) + header->data_length; 113 | if(expected_length != packet_length) { 114 | ESP_LOGE(TAG, "Invalid length, expected:%i got:%i", expected_length, packet_length); 115 | 116 | espnow_transponder_stats.rx_bad_len++; 117 | return false; 118 | } 119 | 120 | return true; 121 | } 122 | 123 | static esp_err_t example_event_handler(void *ctx, system_event_t *event) 124 | { 125 | switch(event->event_id) { 126 | case SYSTEM_EVENT_STA_START: 127 | ESP_LOGI(TAG, "WiFi started"); 128 | break; 129 | default: 130 | break; 131 | } 132 | return ESP_OK; 133 | } 134 | 135 | //! \brief ESP-NOW transmit callback function 136 | //! 137 | //! ESPNOW sending or receiving callback function is called in WiFi task. 138 | //! Users should not do lengthy operations from this task. Instead, post 139 | //! necessary data to a queue and handle it from a lower priority task. 140 | //! 141 | //! \param mac_addr MAC address that the packet was sent to 142 | //! \param status transmit status 143 | static void espnow_transponder_send_cb(const uint8_t *mac_addr, esp_now_send_status_t status) 144 | { 145 | if (mac_addr == NULL) { 146 | ESP_LOGE(TAG, "Send cb arg error"); 147 | return; 148 | } 149 | 150 | espnow_transponder_event_t evt = { 151 | .id = ESPNOW_TRANSPONDER_SEND_CB, 152 | .info.send_cb.status = status, 153 | }; 154 | memcpy(evt.info.send_cb.mac_addr, mac_addr, sizeof(evt.info.send_cb.mac_addr)); 155 | 156 | if (xQueueSend(espnow_transponder_queue, &evt, portMAX_DELAY) != pdTRUE) { 157 | ESP_LOGW(TAG, "Send to queue fail"); 158 | } 159 | 160 | espnow_transponder_stats.tx_count++; 161 | } 162 | 163 | //! \brief ESP-NOW receive callback function 164 | //! 165 | //! ESPNOW sending or receiving callback function is called in WiFi task. 166 | //! Users should not do lengthy operations from this task. Instead, post 167 | //! necessary data to a queue and handle it from a lower priority task. 168 | //! 169 | //! \param mac_addr MAC address of the device that sent the packet 170 | //! \param data Pointer to the packet data 171 | //! \param len Length of the packet data 172 | static void espnow_transponder_recv_cb(const uint8_t *mac_addr, const uint8_t *data, int len) 173 | { 174 | if (mac_addr == NULL || data == NULL || len <= 0) { 175 | ESP_LOGE(TAG, "Receive cb arg error"); 176 | return; 177 | } 178 | 179 | if(!packet_check(data, len)) { 180 | ESP_LOGE(TAG, "Packet check failed"); 181 | return; 182 | } 183 | 184 | espnow_transponder_event_t evt = { 185 | .id = ESPNOW_TRANSPONDER_RECV_CB, 186 | .info.recv_cb.data_len = len, 187 | }; 188 | memcpy(evt.info.recv_cb.mac_addr, mac_addr, sizeof(evt.info.recv_cb.mac_addr)); 189 | 190 | evt.info.recv_cb.data = malloc(len); 191 | if (evt.info.recv_cb.data == NULL) { 192 | ESP_LOGE(TAG, "Malloc receive data fail"); 193 | 194 | espnow_transponder_stats.rx_malloc_fail++; 195 | return; 196 | } 197 | memcpy(evt.info.recv_cb.data, data, len); 198 | 199 | if (xQueueSend(espnow_transponder_queue, &evt, portMAX_DELAY) != pdTRUE) { 200 | ESP_LOGW(TAG, "Send to queue fail"); 201 | free(evt.info.recv_cb.data); 202 | } 203 | 204 | espnow_transponder_stats.rx_count++; 205 | } 206 | 207 | //! \brief TX/RX callback handler task 208 | static void espnow_transponder_task(void *pvParameter) 209 | { 210 | espnow_transponder_event_t evt; 211 | 212 | while (xQueueReceive(espnow_transponder_queue, &evt, portMAX_DELAY) == pdTRUE) { 213 | switch (evt.id) { 214 | case ESPNOW_TRANSPONDER_SEND_CB: 215 | { 216 | espnow_transponder_event_send_cb_t *send_cb = &evt.info.send_cb; 217 | ESP_LOGD(TAG, "Sent data to "MACSTR", status1: %d", MAC2STR(send_cb->mac_addr), send_cb->status); 218 | break; 219 | } 220 | case ESPNOW_TRANSPONDER_RECV_CB: 221 | { 222 | espnow_transponder_event_recv_cb_t *recv_cb = &evt.info.recv_cb; 223 | 224 | if(rx_callback != NULL) { 225 | espnow_transponder_packet_t *packet = (espnow_transponder_packet_t *)recv_cb->data; 226 | rx_callback(packet->data, packet->data_length); 227 | } 228 | 229 | free(recv_cb->data); 230 | break; 231 | } 232 | // case ESPNOW_TRANSPONDER_STOP_TASK: 233 | // goto stop_task; 234 | // break; 235 | default: 236 | ESP_LOGE(TAG, "Callback type error: %d", evt.id); 237 | break; 238 | } 239 | } 240 | 241 | //stop_task: 242 | espnow_transponder_task_hdl = NULL; 243 | vTaskDelete(NULL); 244 | } 245 | 246 | //! \brief Initialize WiFi for use with ESP-NOW 247 | static esp_err_t wifi_init(const espnow_transponder_config_t *config) 248 | { 249 | tcpip_adapter_init(); 250 | 251 | esp_err_t ret; 252 | 253 | // Don't fail if the event loop was already registered, it's not needed for this component. 254 | ret = esp_event_loop_init(example_event_handler, NULL); 255 | if(ret != ESP_OK) { 256 | ESP_LOGW(TAG, "Error running esp_event_loop_init, err:%s", esp_err_to_name(ret)); 257 | } 258 | 259 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 260 | 261 | // From: https://hackaday.io/project/161896-linux-espnow/log/161046-implementation 262 | // Disable AMPDU to allow the bit rate to be changed 263 | cfg.ampdu_tx_enable = 0; 264 | 265 | ESPNOW_ERROR_CHECK(esp_wifi_init(&cfg), "esp_wifi_init"); 266 | ESPNOW_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM), "esp_wifi_set_storage"); 267 | ESPNOW_ERROR_CHECK(esp_wifi_set_mode(config->mode), "esp_wifi_set_mode"); 268 | 269 | ESPNOW_ERROR_CHECK(esp_wifi_start(), "esp_wifi_start"); 270 | 271 | ESPNOW_ERROR_CHECK(esp_wifi_set_max_tx_power(config->power), "esp_wifi_set_max_tx_power"); 272 | 273 | // In order to simplify example, channel is set after WiFi started. 274 | // This is not necessary in real application if the two devices have 275 | // been already on the same channel. 276 | // Note: With IDF 3.3.1, WiFi needs to be in promiscuous mode for the channel setting to work (?) 277 | ESPNOW_ERROR_CHECK(esp_wifi_set_promiscuous(true), "esp_wifi_set_promiscuous"); 278 | ESPNOW_ERROR_CHECK(esp_wifi_set_channel(config->channel, WIFI_SECOND_CHAN_NONE), "esp_wifi_set_channel"); 279 | 280 | // From: https://www.esp32.com/viewtopic.php?t=9965 281 | // Change the wifi modulation mode 282 | // See 'esp_wifi_types.h' for a list of available data rates 283 | const esp_interface_t interface = config->mode == WIFI_MODE_STA? ESP_IF_WIFI_STA : ESP_IF_WIFI_AP; 284 | ESPNOW_ERROR_CHECK(esp_wifi_internal_set_fix_rate(interface, true, config->phy_rate), "esp_wifi_internal_set_fix_rate"); 285 | 286 | return ESP_OK; 287 | } 288 | 289 | //! \brief Initialize the ESP-NOW interface 290 | static esp_err_t espnow_init(const espnow_transponder_config_t *config) 291 | { 292 | espnow_transponder_queue = xQueueCreate(ESPNOW_QUEUE_SIZE, sizeof(espnow_transponder_event_t)); 293 | if (espnow_transponder_queue == NULL) { 294 | ESP_LOGE(TAG, "Create queue fail"); 295 | return ESP_FAIL; 296 | } 297 | 298 | esp_err_t ret; 299 | 300 | // Initialize ESPNOW and register sending and receiving callback function. 301 | ESPNOW_ERROR_CHECK(esp_now_init(), "esp_now_init"); 302 | 303 | ESPNOW_ERROR_CHECK(esp_now_register_send_cb(espnow_transponder_send_cb), "esp_now_register_send_cb"); 304 | ESPNOW_ERROR_CHECK(esp_now_register_recv_cb(espnow_transponder_recv_cb), "esp_now_register_recv_cb"); 305 | 306 | const esp_interface_t interface = config->mode == WIFI_MODE_STA? ESP_IF_WIFI_STA : ESP_IF_WIFI_AP; 307 | 308 | // Add broadcast peer information to peer list. 309 | esp_now_peer_info_t peer = { 310 | .channel = config->channel, 311 | .ifidx = interface, 312 | .encrypt = false, 313 | }; 314 | memcpy(peer.peer_addr, broadcast_mac, sizeof(peer.peer_addr)); 315 | 316 | ESPNOW_ERROR_CHECK(esp_now_add_peer(&peer), "esp_now_add_peer"); 317 | 318 | // TODO: error check 319 | if(xTaskCreate(espnow_transponder_task, "espnow_task", 2048, NULL, 4, espnow_transponder_task_hdl) != pdPASS) { 320 | ESP_LOGE(TAG, "Create task fail"); 321 | return ESP_FAIL; 322 | } 323 | 324 | return ESP_OK; 325 | } 326 | 327 | int espnow_transponder_max_packet_size() { 328 | return ESP_NOW_MAX_DATA_LEN - sizeof(espnow_transponder_packet_t); 329 | } 330 | 331 | void espnow_transponder_register_callback(espnow_transponder_rx_callback_t callback) { 332 | rx_callback = callback; 333 | } 334 | 335 | void espnow_transponder_unregister_callback() { 336 | rx_callback = NULL; 337 | } 338 | 339 | esp_err_t espnow_transponder_send(const uint8_t *data, uint8_t data_length) { 340 | // Encapsulate the data into a packet with the following structure: 341 | // packet[0-1]: 16-bit CRC 342 | // packet[2]: data length 343 | // packet[3-n]: data 344 | 345 | const uint8_t packet_length = sizeof(espnow_transponder_packet_t) + data_length; 346 | 347 | // Check that the total length is under ESP_NOW_MAX_DATA_LEN 348 | if(packet_length > ESP_NOW_MAX_DATA_LEN) { 349 | ESP_LOGE(TAG, "Packet too big, can't transmit size:%i max:%i", packet_length, ESP_NOW_MAX_DATA_LEN); 350 | return ESP_FAIL; 351 | } 352 | 353 | uint8_t packet[packet_length]; 354 | 355 | espnow_transponder_packet_t *header = (espnow_transponder_packet_t *)packet; 356 | header->crc = 0; 357 | header->data_length = data_length; 358 | memcpy(header->data, data, data_length); 359 | 360 | header->crc = crc16_le(UINT16_MAX, packet, packet_length); 361 | 362 | ESP_LOGD(TAG, "header_len:%i data_lenth:%i packet_length%i", sizeof(espnow_transponder_packet_t),data_length, packet_length); 363 | 364 | // TODO: Add length, CRC header 365 | return esp_now_send(broadcast_mac, packet, packet_length); 366 | } 367 | 368 | esp_err_t espnow_transponder_init(const espnow_transponder_config_t *config) { 369 | if(config == NULL) 370 | return ESP_FAIL; 371 | 372 | // Initialize NVS 373 | // Note: It's safe to call this multiple times. 374 | esp_err_t ret = nvs_flash_init(); 375 | if(ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { 376 | ESP_ERROR_CHECK( nvs_flash_erase() ); 377 | ret = nvs_flash_init(); 378 | } 379 | if(ret != ESP_OK) 380 | return ret; 381 | 382 | ESPNOW_ERROR_CHECK(wifi_init(config), "wifi_init"); 383 | ESPNOW_ERROR_CHECK(espnow_init(config), "espnow_init"); 384 | 385 | return ESP_OK; 386 | } 387 | 388 | //! \brief Stop the ESP-NOW transponder 389 | //! 390 | //! Note: Need to test, correctly handle queue deletion 391 | //esp_err_t espnow_transponder_stop() { 392 | // 393 | // esp_now_deinit(); 394 | // esp_now_unregister_recv_cb(); 395 | // esp_now_unregister_send_cb(); 396 | // esp_now_del_peer(broadcast_mac); 397 | // 398 | // if(espnow_transponder_queue == NULL) 399 | // return ESP_FAIL; 400 | // 401 | // espnow_transponder_event_t evt = { 402 | // .id = ESPNOW_TRANSPONDER_STOP_TASK, 403 | // }; 404 | // 405 | // if (xQueueSend(espnow_transponder_queue, &evt, portMAX_DELAY) != pdTRUE) 406 | // return ESP_FAIL; 407 | // 408 | // return ESP_OK; 409 | //} 410 | 411 | void espnow_transponder_get_statistics(espnow_transponder_stats_t *stats) { 412 | 413 | // Note: There's no contention system here, so they might change during copy. 414 | memcpy(stats, &espnow_transponder_stats, sizeof(espnow_transponder_stats_t)); 415 | } 416 | -------------------------------------------------------------------------------- /components/espnow_transponder/include/espnow_transponder.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | //! Send and receive broadcast packets using the ESP-NOW protocol 4 | //! 5 | //! This allows for quite high speed, somewhat reliable communication for 6 | //! protocols that prefer low latency over guaranteed transmission (i.e., DMX). 7 | //! This implementation uses broadcast packets exclusively, to remove the need 8 | //! for pairing. As long as all devices use the same configuration (channel and 9 | //! phy_rate), then they will be able to receive messages automatically. 10 | //! Devices can then choose which packets to respond to based on a higher level 11 | //! protocol (i.e., Art-Net address). 12 | //! 13 | //! Note that encryption is not supported for broadcast packets. If that is 14 | //! needed, a possible implementation would be to assign the same MAC address 15 | //! to all devices, to make 'fake' broadcasts. 16 | 17 | 18 | // Note: This is private header from the esp-idf, that is included for wifi_phy_rate_t. 19 | // It might break across minor or major IDF versions. Consider wrapping wifi_phy_rate_t 20 | // if this bothers you. 21 | #include 22 | 23 | //! ESP-NOW configuration settings 24 | //! 25 | //! There are some general rate categories to choose from: 26 | //! ESP32 supports 802.11b/g/n, 27 | //! 'WIFI_PHY_RATE_xM_y are 802.11b settings: 1,2,5,5,11Mbps HR-DSS 28 | //! 'WIFI_PHY_RATE_xM are 802.11g settings: 6,9,12,18,24,36,48,54Mbps OFDM, 29 | //! 'WIFI_PHY_RATE_MCSx_yGI' are 802.11n(?) settings 30 | //! 31 | //! see: 32 | //! * https://www.wlanpros.com/mcs-index-charts/ 33 | //! * https://www.intel.in/content/www/in/en/support/articles/000005725/network-and-i-o/wireless-networking.html 34 | //! 35 | typedef struct { 36 | wifi_mode_t mode; //!< Either WIFI_MODE_STA or WIFI_MODE_AP 37 | int8_t power; //!< TX power, range is [40-82] -> [10dBm-20.5dBm] 38 | uint8_t channel; //!< WiFi channel [1-13] (recommend: 1,6,11) 39 | wifi_phy_rate_t phy_rate; //!< PHY rate (defined in esp_wifi_types.h) 40 | } espnow_transponder_config_t; 41 | 42 | //! Transponder staticstics 43 | typedef struct { 44 | uint64_t rx_count; 45 | uint64_t rx_short_packet; 46 | uint64_t rx_bad_crc; 47 | uint64_t rx_bad_len; 48 | uint64_t rx_malloc_fail; 49 | uint64_t tx_count; 50 | } espnow_transponder_stats_t; 51 | 52 | //! Default transponder configuration 53 | extern const espnow_transponder_config_t espnow_transponder_config_default; 54 | 55 | //! \brief Initialize the ESP-NOW transponder 56 | //! 57 | //! \param config Configuration parameters, use espnow_transponder_config_default if unsure 58 | //! \return ESP_OK if successful 59 | esp_err_t espnow_transponder_init(const espnow_transponder_config_t *config); 60 | 61 | //! \brief Broadcast a data packet 62 | //! 63 | //! \param data Pointer to the data packet 64 | //! \param data_len Length of the data packet 65 | //! \return ESP_OK if the packet was successfully queued 66 | esp_err_t espnow_transponder_send(const uint8_t *data, uint8_t data_length); 67 | 68 | //! Receive callback function prototype 69 | //! 70 | //! \param data Received packet data pointer 71 | //! \param data_length Length of the data packet 72 | typedef void (*espnow_transponder_rx_callback_t)(const uint8_t *data, uint8_t data_length); 73 | 74 | //! \brief Register a callback for received data packets 75 | //! 76 | //! \param callback Callback function. Must have the same signature as espnow_transponder_callback_t 77 | void espnow_transponder_register_callback(espnow_transponder_rx_callback_t callback); 78 | 79 | //! \brief Unregister the received data callback function 80 | void espnow_transponder_unregister_callback(); 81 | 82 | //! \brief Get the maximum data size that can be transmitted with espnow_transponder 83 | //! 84 | //! \return Maximum data size, in bytes. 85 | int espnow_transponder_max_packet_size(); 86 | 87 | //! \brief Get transmission statistics for the espnow transponder 88 | //! 89 | //! \param stats Pointer to copy staticss to 90 | void espnow_transponder_get_statistics(espnow_transponder_stats_t *stats); 91 | -------------------------------------------------------------------------------- /main/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(COMPONENT_SRCS "espnow_example_main.c") 2 | set(COMPONENT_ADD_INCLUDEDIRS ".") 3 | 4 | register_component() 5 | -------------------------------------------------------------------------------- /main/Kconfig.projbuild: -------------------------------------------------------------------------------- 1 | menu "Example Configuration" 2 | 3 | endmenu 4 | -------------------------------------------------------------------------------- /main/component.mk: -------------------------------------------------------------------------------- 1 | # 2 | # "main" pseudo-component makefile. 3 | # 4 | # (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /main/espnow_example_main.c: -------------------------------------------------------------------------------- 1 | //! ESP-NOW DMX data transceiver example 2 | //! 3 | //! To use, compile with 'ROLE_SENDER' defined and flash to one device, then 4 | //! compile with 'ROLE_SENDER' undefined and flash to one or more devices. 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | #include 13 | 14 | #include "espnow_transponder.h" 15 | 16 | #define UNIVERSE_COUNT 20 17 | #define FRAMERATE 44 18 | 19 | #define ROLE_SENDER 20 | 21 | #if defined(ROLE_SENDER) 22 | static const char *TAG = "espnow_tx"; 23 | #else 24 | static const char *TAG = "espnow_rx"; 25 | #endif 26 | 27 | //! Data structure for an ARTDMX packet 28 | //! 29 | //! Note: Unfortunately ESP-NOW packets have a maximum length of 250, so they 30 | //! can send a little less than half of a full DMX512 network. This 31 | //! implementation just discards any data that doesn't fit. A more 32 | //! complete implementation might add an offset field, and fragment the 33 | //! Art-Net packet into several ESP-NOW packets. 34 | typedef struct { 35 | uint16_t universe; //!< DMX universe for this data 36 | uint8_t sequence; //!< Sequence number 37 | uint8_t data[]; //!< DMX data 38 | } __attribute__((packed)) artdmx_packet_t; 39 | 40 | typedef struct { 41 | uint32_t count; 42 | uint32_t oos; 43 | uint8_t last_sequence; 44 | } universe_stats_t; 45 | 46 | universe_stats_t universe_stats[UNIVERSE_COUNT]; 47 | 48 | void universe_stats_print() { 49 | for(int universe = 0; universe < UNIVERSE_COUNT; universe++) { 50 | const universe_stats_t *stat = &(universe_stats[universe]); 51 | ESP_LOGI(TAG, "universe:%2i packets:%i oos:%i", universe, stat->count, stat->oos); 52 | } 53 | } 54 | 55 | void universe_stats_init() { 56 | for(int universe = 0; universe < UNIVERSE_COUNT; universe++) { 57 | universe_stats_t *stat = &(universe_stats[universe]); 58 | stat->count = 0; 59 | stat->oos = 0; 60 | stat->last_sequence = 255; 61 | } 62 | } 63 | 64 | void universe_stats_record(uint16_t universe, uint8_t sequence) { 65 | if(universe >= UNIVERSE_COUNT) 66 | return; 67 | 68 | universe_stats_t *stat = &(universe_stats[universe]); 69 | stat->count++; 70 | if(sequence != ((stat->last_sequence + 1)%256)) 71 | stat->oos++; 72 | 73 | stat->last_sequence = sequence; 74 | } 75 | 76 | //! @brief Broadcast data to the specified universe 77 | //! 78 | //! \param universe Art-Net universe to send to 79 | //! \param sequence Sequence number 80 | //! \param data Pointer to the data 81 | //! \param data_len Length of the data 82 | void send_artdmx_packet(uint16_t universe, uint8_t sequence, const uint8_t *data, uint8_t data_length) { 83 | // Wrap the data into a payload with this structure: 84 | // payload[0-1]: universe 85 | // payload[2]: sequence 86 | // payload[3-n]: data 87 | // The next higher layer will guarantee data length and CRC, so they are not needed here. 88 | 89 | const int packet_len = data_length + sizeof(artdmx_packet_t); 90 | uint8_t packet_buffer[packet_len]; 91 | 92 | artdmx_packet_t *header = (artdmx_packet_t *)packet_buffer; 93 | header->universe = universe; 94 | header->sequence = sequence; 95 | memcpy(header->data, data, data_length); 96 | 97 | //ESP_LOGI(TAG, "uni:%i, len:%i d[238]:%02x d[239]:%02x", universe, data_length, data[238], data[239]); 98 | 99 | esp_err_t ret = espnow_transponder_send(packet_buffer, packet_len); 100 | if(ret != ESP_OK) 101 | ESP_LOGE(TAG, "Send error, err=%s", esp_err_to_name(ret)); 102 | } 103 | 104 | void receive_packet(const uint8_t *data, uint8_t data_length) { 105 | artdmx_packet_t *header = (artdmx_packet_t *)data; 106 | universe_stats_record(header->universe, header->sequence); 107 | } 108 | 109 | //! \brief Send test packets at a specified framerate 110 | void transmitter_test() { 111 | const uint32_t framedelay_ms = (1000/FRAMERATE); 112 | 113 | ESP_LOGI(TAG, "Starting sender mode..."); 114 | 115 | // Red-to-blue fade 116 | const uint8_t universe_size = 240; 117 | 118 | uint8_t *buffer = malloc(universe_size*UNIVERSE_COUNT); 119 | if(buffer == NULL) { 120 | ESP_LOGE(TAG, "Could not allocate memory for buffer"); 121 | return; 122 | } 123 | 124 | uint8_t sequence = 0; 125 | float phase = 0; 126 | while(true) { 127 | for(int led = 0; led<(universe_size*UNIVERSE_COUNT)/3; led++) { 128 | buffer[led*3+0] = (int)(30*(sin(phase+led/100.0)+1)); 129 | buffer[led*3+1] = 0; 130 | buffer[led*3+2] = 0; 131 | } 132 | 133 | for(int universe = 0; universe < UNIVERSE_COUNT; universe++) 134 | send_artdmx_packet(universe, sequence, buffer+(universe*universe_size), universe_size); 135 | 136 | phase += .2; 137 | sequence++; 138 | 139 | // vTaskDelay(framedelay_ms/portTICK_RATE_MS); 140 | } 141 | } 142 | 143 | //! \brief Listen for packets, and report on their status periodically 144 | void receiver_test() { 145 | ESP_LOGI(TAG, "Starting receiver mode"); 146 | while(true) { 147 | vTaskDelay(1000/portTICK_RATE_MS); 148 | universe_stats_print(); 149 | } 150 | } 151 | 152 | void app_main() 153 | { 154 | universe_stats_init(); 155 | 156 | espnow_transponder_init(&espnow_transponder_config_default); 157 | espnow_transponder_register_callback(receive_packet); 158 | 159 | #if defined(ROLE_SENDER) 160 | transmitter_test(); 161 | 162 | #else 163 | receiver_test(); 164 | #endif 165 | } 166 | -------------------------------------------------------------------------------- /sdkconfig: -------------------------------------------------------------------------------- 1 | # 2 | # Automatically generated file; DO NOT EDIT. 3 | # Espressif IoT Development Framework Configuration 4 | # 5 | CONFIG_IDF_TARGET="esp32" 6 | CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000 7 | 8 | # 9 | # SDK tool configuration 10 | # 11 | CONFIG_TOOLPREFIX="xtensa-esp32-elf-" 12 | CONFIG_PYTHON="python" 13 | CONFIG_MAKE_WARN_UNDEFINED_VARIABLES=y 14 | 15 | # 16 | # Application manager 17 | # 18 | CONFIG_APP_COMPILE_TIME_DATE=y 19 | CONFIG_APP_EXCLUDE_PROJECT_VER_VAR= 20 | CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR= 21 | 22 | # 23 | # Bootloader config 24 | # 25 | CONFIG_LOG_BOOTLOADER_LEVEL_NONE= 26 | CONFIG_LOG_BOOTLOADER_LEVEL_ERROR= 27 | CONFIG_LOG_BOOTLOADER_LEVEL_WARN= 28 | CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y 29 | CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG= 30 | CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE= 31 | CONFIG_LOG_BOOTLOADER_LEVEL=3 32 | CONFIG_BOOTLOADER_SPI_WP_PIN=7 33 | CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y 34 | CONFIG_BOOTLOADER_FACTORY_RESET= 35 | CONFIG_BOOTLOADER_APP_TEST= 36 | CONFIG_BOOTLOADER_WDT_ENABLE=y 37 | CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE= 38 | CONFIG_BOOTLOADER_WDT_TIME_MS=9000 39 | CONFIG_APP_ROLLBACK_ENABLE= 40 | 41 | # 42 | # Security features 43 | # 44 | CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT= 45 | CONFIG_SECURE_BOOT_ENABLED= 46 | CONFIG_FLASH_ENCRYPTION_ENABLED= 47 | 48 | # 49 | # Serial flasher config 50 | # 51 | CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB2" 52 | CONFIG_ESPTOOLPY_BAUD_115200B= 53 | CONFIG_ESPTOOLPY_BAUD_230400B= 54 | CONFIG_ESPTOOLPY_BAUD_921600B= 55 | CONFIG_ESPTOOLPY_BAUD_2MB=y 56 | CONFIG_ESPTOOLPY_BAUD_OTHER= 57 | CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 58 | CONFIG_ESPTOOLPY_BAUD=2000000 59 | CONFIG_ESPTOOLPY_COMPRESSED=y 60 | CONFIG_FLASHMODE_QIO=y 61 | CONFIG_FLASHMODE_QOUT= 62 | CONFIG_FLASHMODE_DIO= 63 | CONFIG_FLASHMODE_DOUT= 64 | CONFIG_ESPTOOLPY_FLASHMODE="dio" 65 | CONFIG_ESPTOOLPY_FLASHFREQ_80M=y 66 | CONFIG_ESPTOOLPY_FLASHFREQ_40M= 67 | CONFIG_ESPTOOLPY_FLASHFREQ_26M= 68 | CONFIG_ESPTOOLPY_FLASHFREQ_20M= 69 | CONFIG_ESPTOOLPY_FLASHFREQ="80m" 70 | CONFIG_ESPTOOLPY_FLASHSIZE_1MB= 71 | CONFIG_ESPTOOLPY_FLASHSIZE_2MB= 72 | CONFIG_ESPTOOLPY_FLASHSIZE_4MB= 73 | CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y 74 | CONFIG_ESPTOOLPY_FLASHSIZE_16MB= 75 | CONFIG_ESPTOOLPY_FLASHSIZE="8MB" 76 | CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y 77 | CONFIG_ESPTOOLPY_BEFORE_RESET=y 78 | CONFIG_ESPTOOLPY_BEFORE_NORESET= 79 | CONFIG_ESPTOOLPY_BEFORE="default_reset" 80 | CONFIG_ESPTOOLPY_AFTER_RESET=y 81 | CONFIG_ESPTOOLPY_AFTER_NORESET= 82 | CONFIG_ESPTOOLPY_AFTER="hard_reset" 83 | CONFIG_MONITOR_BAUD_9600B= 84 | CONFIG_MONITOR_BAUD_57600B= 85 | CONFIG_MONITOR_BAUD_115200B=y 86 | CONFIG_MONITOR_BAUD_230400B= 87 | CONFIG_MONITOR_BAUD_921600B= 88 | CONFIG_MONITOR_BAUD_2MB= 89 | CONFIG_MONITOR_BAUD_OTHER= 90 | CONFIG_MONITOR_BAUD_OTHER_VAL=115200 91 | CONFIG_MONITOR_BAUD=115200 92 | 93 | # 94 | # Example Configuration 95 | # 96 | 97 | # 98 | # Partition Table 99 | # 100 | CONFIG_PARTITION_TABLE_SINGLE_APP=y 101 | CONFIG_PARTITION_TABLE_TWO_OTA= 102 | CONFIG_PARTITION_TABLE_CUSTOM= 103 | CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" 104 | CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv" 105 | CONFIG_PARTITION_TABLE_OFFSET=0x8000 106 | CONFIG_PARTITION_TABLE_MD5=y 107 | 108 | # 109 | # Compiler options 110 | # 111 | CONFIG_OPTIMIZATION_LEVEL_DEBUG=y 112 | CONFIG_OPTIMIZATION_LEVEL_RELEASE= 113 | CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y 114 | CONFIG_OPTIMIZATION_ASSERTIONS_SILENT= 115 | CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED= 116 | CONFIG_CXX_EXCEPTIONS= 117 | CONFIG_STACK_CHECK_NONE=y 118 | CONFIG_STACK_CHECK_NORM= 119 | CONFIG_STACK_CHECK_STRONG= 120 | CONFIG_STACK_CHECK_ALL= 121 | CONFIG_STACK_CHECK= 122 | CONFIG_WARN_WRITE_STRINGS= 123 | CONFIG_DISABLE_GCC8_WARNINGS= 124 | 125 | # 126 | # Component config 127 | # 128 | 129 | # 130 | # Application Level Tracing 131 | # 132 | CONFIG_ESP32_APPTRACE_DEST_TRAX= 133 | CONFIG_ESP32_APPTRACE_DEST_NONE=y 134 | CONFIG_ESP32_APPTRACE_ENABLE= 135 | CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y 136 | CONFIG_AWS_IOT_SDK= 137 | 138 | # 139 | # Bluetooth 140 | # 141 | CONFIG_BT_ENABLED= 142 | CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0 143 | CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=0 144 | CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0 145 | CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0 146 | CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 147 | CONFIG_BT_RESERVE_DRAM=0 148 | 149 | # 150 | # Driver configurations 151 | # 152 | 153 | # 154 | # ADC configuration 155 | # 156 | CONFIG_ADC_FORCE_XPD_FSM= 157 | CONFIG_ADC2_DISABLE_DAC=y 158 | 159 | # 160 | # SPI configuration 161 | # 162 | CONFIG_SPI_MASTER_IN_IRAM= 163 | CONFIG_SPI_MASTER_ISR_IN_IRAM=y 164 | CONFIG_SPI_SLAVE_IN_IRAM= 165 | CONFIG_SPI_SLAVE_ISR_IN_IRAM=y 166 | 167 | # 168 | # eFuse Bit Manager 169 | # 170 | CONFIG_EFUSE_CUSTOM_TABLE= 171 | CONFIG_EFUSE_VIRTUAL= 172 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE= 173 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y 174 | CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT= 175 | CONFIG_EFUSE_MAX_BLK_LEN=192 176 | 177 | # 178 | # ESP32-specific 179 | # 180 | CONFIG_IDF_TARGET_ESP32=y 181 | CONFIG_ESP32_REV_MIN_0=y 182 | CONFIG_ESP32_REV_MIN_1= 183 | CONFIG_ESP32_REV_MIN_2= 184 | CONFIG_ESP32_REV_MIN_3= 185 | CONFIG_ESP32_REV_MIN=0 186 | CONFIG_ESP32_DPORT_WORKAROUND=y 187 | CONFIG_ESP32_DEFAULT_CPU_FREQ_80= 188 | CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y 189 | CONFIG_ESP32_DEFAULT_CPU_FREQ_240= 190 | CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160 191 | CONFIG_SPIRAM_SUPPORT= 192 | CONFIG_MEMMAP_TRACEMEM= 193 | CONFIG_MEMMAP_TRACEMEM_TWOBANKS= 194 | CONFIG_ESP32_TRAX= 195 | CONFIG_TRACEMEM_RESERVE_DRAM=0x0 196 | CONFIG_TWO_UNIVERSAL_MAC_ADDRESS= 197 | CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y 198 | CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 199 | CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 200 | CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 201 | CONFIG_MAIN_TASK_STACK_SIZE=3584 202 | CONFIG_IPC_TASK_STACK_SIZE=1024 203 | CONFIG_TIMER_TASK_STACK_SIZE=3584 204 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y 205 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF= 206 | CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR= 207 | CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF= 208 | CONFIG_NEWLIB_STDIN_LINE_ENDING_LF= 209 | CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y 210 | CONFIG_NEWLIB_NANO_FORMAT= 211 | CONFIG_CONSOLE_UART_DEFAULT=y 212 | CONFIG_CONSOLE_UART_CUSTOM= 213 | CONFIG_CONSOLE_UART_NONE= 214 | CONFIG_CONSOLE_UART_NUM=0 215 | CONFIG_CONSOLE_UART_BAUDRATE=115200 216 | CONFIG_ULP_COPROC_ENABLED= 217 | CONFIG_ULP_COPROC_RESERVE_MEM=0 218 | CONFIG_ESP32_PANIC_PRINT_HALT= 219 | CONFIG_ESP32_PANIC_PRINT_REBOOT=y 220 | CONFIG_ESP32_PANIC_SILENT_REBOOT= 221 | CONFIG_ESP32_PANIC_GDBSTUB= 222 | CONFIG_ESP32_DEBUG_OCDAWARE=y 223 | CONFIG_ESP32_DEBUG_STUBS_ENABLE=y 224 | CONFIG_INT_WDT=y 225 | CONFIG_INT_WDT_TIMEOUT_MS=300 226 | CONFIG_INT_WDT_CHECK_CPU1=y 227 | CONFIG_TASK_WDT=y 228 | CONFIG_TASK_WDT_PANIC= 229 | CONFIG_TASK_WDT_TIMEOUT_S=5 230 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y 231 | CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y 232 | CONFIG_BROWNOUT_DET=y 233 | CONFIG_BROWNOUT_DET_LVL_SEL_0=y 234 | CONFIG_BROWNOUT_DET_LVL_SEL_1= 235 | CONFIG_BROWNOUT_DET_LVL_SEL_2= 236 | CONFIG_BROWNOUT_DET_LVL_SEL_3= 237 | CONFIG_BROWNOUT_DET_LVL_SEL_4= 238 | CONFIG_BROWNOUT_DET_LVL_SEL_5= 239 | CONFIG_BROWNOUT_DET_LVL_SEL_6= 240 | CONFIG_BROWNOUT_DET_LVL_SEL_7= 241 | CONFIG_BROWNOUT_DET_LVL=0 242 | CONFIG_REDUCE_PHY_TX_POWER=y 243 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y 244 | CONFIG_ESP32_TIME_SYSCALL_USE_RTC= 245 | CONFIG_ESP32_TIME_SYSCALL_USE_FRC1= 246 | CONFIG_ESP32_TIME_SYSCALL_USE_NONE= 247 | CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y 248 | CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL= 249 | CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC= 250 | CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256= 251 | CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 252 | CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000 253 | CONFIG_ESP32_XTAL_FREQ_40=y 254 | CONFIG_ESP32_XTAL_FREQ_26= 255 | CONFIG_ESP32_XTAL_FREQ_AUTO= 256 | CONFIG_ESP32_XTAL_FREQ=40 257 | CONFIG_DISABLE_BASIC_ROM_CONSOLE= 258 | CONFIG_NO_BLOBS= 259 | CONFIG_ESP_TIMER_PROFILING= 260 | CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS= 261 | CONFIG_ESP_ERR_TO_NAME_LOOKUP=y 262 | CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5 263 | 264 | # 265 | # Wi-Fi 266 | # 267 | CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=25 268 | CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64 269 | CONFIG_ESP32_WIFI_STATIC_TX_BUFFER= 270 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y 271 | CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 272 | CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=64 273 | CONFIG_ESP32_WIFI_CSI_ENABLED= 274 | CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y 275 | CONFIG_ESP32_WIFI_TX_BA_WIN=6 276 | CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y 277 | CONFIG_ESP32_WIFI_RX_BA_WIN=6 278 | CONFIG_ESP32_WIFI_NVS_ENABLED=y 279 | CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y 280 | CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1= 281 | CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 282 | CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 283 | CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE= 284 | CONFIG_ESP32_WIFI_IRAM_OPT=y 285 | 286 | # 287 | # PHY 288 | # 289 | CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y 290 | CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION= 291 | CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 292 | CONFIG_ESP32_PHY_MAX_TX_POWER=20 293 | 294 | # 295 | # Power Management 296 | # 297 | CONFIG_PM_ENABLE= 298 | 299 | # 300 | # ADC-Calibration 301 | # 302 | CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y 303 | CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y 304 | CONFIG_ADC_CAL_LUT_ENABLE=y 305 | 306 | # 307 | # Event Loop Library 308 | # 309 | CONFIG_EVENT_LOOP_PROFILING= 310 | 311 | # 312 | # ESP HTTP client 313 | # 314 | CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y 315 | CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH= 316 | 317 | # 318 | # HTTP Server 319 | # 320 | CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 321 | CONFIG_HTTPD_MAX_URI_LEN=512 322 | CONFIG_HTTPD_ERR_RESP_NO_DELAY=y 323 | CONFIG_HTTPD_PURGE_BUF_LEN=32 324 | CONFIG_HTTPD_LOG_PURGE_DATA= 325 | 326 | # 327 | # ESP HTTPS OTA 328 | # 329 | CONFIG_OTA_ALLOW_HTTP= 330 | 331 | # 332 | # Core dump 333 | # 334 | CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH= 335 | CONFIG_ESP32_ENABLE_COREDUMP_TO_UART= 336 | CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y 337 | CONFIG_ESP32_ENABLE_COREDUMP= 338 | 339 | # 340 | # Ethernet 341 | # 342 | CONFIG_DMA_RX_BUF_NUM=10 343 | CONFIG_DMA_TX_BUF_NUM=10 344 | CONFIG_EMAC_L2_TO_L3_RX_BUF_MODE=y 345 | CONFIG_EMAC_CHECK_LINK_PERIOD_MS=2000 346 | CONFIG_EMAC_TASK_AFFINITY_NO_AFFINITY=y 347 | CONFIG_EMAC_TASK_AFFINITY_CPU0= 348 | CONFIG_EMAC_TASK_AFFINITY_CPU1= 349 | CONFIG_EMAC_TASK_AFFINITY=0x7FFFFFFF 350 | CONFIG_EMAC_TASK_PRIORITY=20 351 | CONFIG_EMAC_TASK_STACK_SIZE=3072 352 | 353 | # 354 | # FAT Filesystem support 355 | # 356 | CONFIG_FATFS_CODEPAGE_DYNAMIC= 357 | CONFIG_FATFS_CODEPAGE_437=y 358 | CONFIG_FATFS_CODEPAGE_720= 359 | CONFIG_FATFS_CODEPAGE_737= 360 | CONFIG_FATFS_CODEPAGE_771= 361 | CONFIG_FATFS_CODEPAGE_775= 362 | CONFIG_FATFS_CODEPAGE_850= 363 | CONFIG_FATFS_CODEPAGE_852= 364 | CONFIG_FATFS_CODEPAGE_855= 365 | CONFIG_FATFS_CODEPAGE_857= 366 | CONFIG_FATFS_CODEPAGE_860= 367 | CONFIG_FATFS_CODEPAGE_861= 368 | CONFIG_FATFS_CODEPAGE_862= 369 | CONFIG_FATFS_CODEPAGE_863= 370 | CONFIG_FATFS_CODEPAGE_864= 371 | CONFIG_FATFS_CODEPAGE_865= 372 | CONFIG_FATFS_CODEPAGE_866= 373 | CONFIG_FATFS_CODEPAGE_869= 374 | CONFIG_FATFS_CODEPAGE_932= 375 | CONFIG_FATFS_CODEPAGE_936= 376 | CONFIG_FATFS_CODEPAGE_949= 377 | CONFIG_FATFS_CODEPAGE_950= 378 | CONFIG_FATFS_CODEPAGE=437 379 | CONFIG_FATFS_LFN_NONE=y 380 | CONFIG_FATFS_LFN_HEAP= 381 | CONFIG_FATFS_LFN_STACK= 382 | CONFIG_FATFS_FS_LOCK=0 383 | CONFIG_FATFS_TIMEOUT_MS=10000 384 | CONFIG_FATFS_PER_FILE_CACHE=y 385 | 386 | # 387 | # Modbus configuration 388 | # 389 | CONFIG_MB_QUEUE_LENGTH=20 390 | CONFIG_MB_SERIAL_TASK_STACK_SIZE=2048 391 | CONFIG_MB_SERIAL_BUF_SIZE=256 392 | CONFIG_MB_SERIAL_TASK_PRIO=10 393 | CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT= 394 | CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20 395 | CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20 396 | CONFIG_MB_CONTROLLER_STACK_SIZE=4096 397 | CONFIG_MB_EVENT_QUEUE_TIMEOUT=20 398 | CONFIG_MB_TIMER_PORT_ENABLED=y 399 | CONFIG_MB_TIMER_GROUP=0 400 | CONFIG_MB_TIMER_INDEX=0 401 | 402 | # 403 | # FreeRTOS 404 | # 405 | CONFIG_FREERTOS_UNICORE= 406 | CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF 407 | CONFIG_FREERTOS_CORETIMER_0=y 408 | CONFIG_FREERTOS_CORETIMER_1= 409 | CONFIG_FREERTOS_HZ=100 410 | CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y 411 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE= 412 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL= 413 | CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y 414 | CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK= 415 | CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y 416 | CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 417 | CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y 418 | CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE= 419 | CONFIG_FREERTOS_ASSERT_DISABLE= 420 | CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 421 | CONFIG_FREERTOS_ISR_STACKSIZE=1536 422 | CONFIG_FREERTOS_LEGACY_HOOKS= 423 | CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 424 | CONFIG_SUPPORT_STATIC_ALLOCATION= 425 | CONFIG_TIMER_TASK_PRIORITY=1 426 | CONFIG_TIMER_TASK_STACK_DEPTH=2048 427 | CONFIG_TIMER_QUEUE_LENGTH=10 428 | CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 429 | CONFIG_FREERTOS_USE_TRACE_FACILITY= 430 | CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS= 431 | CONFIG_FREERTOS_DEBUG_INTERNALS= 432 | CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y 433 | CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y 434 | CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE= 435 | 436 | # 437 | # Heap memory debugging 438 | # 439 | CONFIG_HEAP_POISONING_DISABLED=y 440 | CONFIG_HEAP_POISONING_LIGHT= 441 | CONFIG_HEAP_POISONING_COMPREHENSIVE= 442 | CONFIG_HEAP_TRACING= 443 | 444 | # 445 | # libsodium 446 | # 447 | CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y 448 | 449 | # 450 | # Log output 451 | # 452 | CONFIG_LOG_DEFAULT_LEVEL_NONE= 453 | CONFIG_LOG_DEFAULT_LEVEL_ERROR= 454 | CONFIG_LOG_DEFAULT_LEVEL_WARN= 455 | CONFIG_LOG_DEFAULT_LEVEL_INFO=y 456 | CONFIG_LOG_DEFAULT_LEVEL_DEBUG= 457 | CONFIG_LOG_DEFAULT_LEVEL_VERBOSE= 458 | CONFIG_LOG_DEFAULT_LEVEL=3 459 | CONFIG_LOG_COLORS=y 460 | 461 | # 462 | # LWIP 463 | # 464 | CONFIG_L2_TO_L3_COPY= 465 | CONFIG_LWIP_IRAM_OPTIMIZATION= 466 | CONFIG_LWIP_MAX_SOCKETS=10 467 | CONFIG_USE_ONLY_LWIP_SELECT= 468 | CONFIG_LWIP_SO_REUSE=y 469 | CONFIG_LWIP_SO_REUSE_RXTOALL=y 470 | CONFIG_LWIP_SO_RCVBUF= 471 | CONFIG_LWIP_IP_FRAG= 472 | CONFIG_LWIP_IP_REASSEMBLY= 473 | CONFIG_LWIP_STATS= 474 | CONFIG_LWIP_ETHARP_TRUST_IP_MAC= 475 | CONFIG_ESP_GRATUITOUS_ARP=y 476 | CONFIG_GARP_TMR_INTERVAL=60 477 | CONFIG_TCPIP_RECVMBOX_SIZE=32 478 | CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y 479 | CONFIG_LWIP_DHCP_RESTORE_LAST_IP= 480 | 481 | # 482 | # DHCP server 483 | # 484 | CONFIG_LWIP_DHCPS_LEASE_UNIT=60 485 | CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 486 | CONFIG_LWIP_AUTOIP= 487 | CONFIG_LWIP_NETIF_LOOPBACK=y 488 | CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 489 | 490 | # 491 | # TCP 492 | # 493 | CONFIG_LWIP_MAX_ACTIVE_TCP=16 494 | CONFIG_LWIP_MAX_LISTENING_TCP=16 495 | CONFIG_TCP_MAXRTX=12 496 | CONFIG_TCP_SYNMAXRTX=6 497 | CONFIG_TCP_MSS=1436 498 | CONFIG_TCP_MSL=60000 499 | CONFIG_TCP_SND_BUF_DEFAULT=5744 500 | CONFIG_TCP_WND_DEFAULT=5744 501 | CONFIG_TCP_RECVMBOX_SIZE=6 502 | CONFIG_TCP_QUEUE_OOSEQ=y 503 | CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES= 504 | CONFIG_TCP_OVERSIZE_MSS=y 505 | CONFIG_TCP_OVERSIZE_QUARTER_MSS= 506 | CONFIG_TCP_OVERSIZE_DISABLE= 507 | 508 | # 509 | # UDP 510 | # 511 | CONFIG_LWIP_MAX_UDP_PCBS=16 512 | CONFIG_UDP_RECVMBOX_SIZE=6 513 | CONFIG_TCPIP_TASK_STACK_SIZE=3072 514 | CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y 515 | CONFIG_TCPIP_TASK_AFFINITY_CPU0= 516 | CONFIG_TCPIP_TASK_AFFINITY_CPU1= 517 | CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF 518 | CONFIG_TCPIP_TASK_PRIO=10 519 | CONFIG_PPP_SUPPORT= 520 | 521 | # 522 | # ICMP 523 | # 524 | CONFIG_LWIP_MULTICAST_PING= 525 | CONFIG_LWIP_BROADCAST_PING= 526 | 527 | # 528 | # LWIP RAW API 529 | # 530 | CONFIG_LWIP_MAX_RAW_PCBS=16 531 | 532 | # 533 | # SNTP 534 | # 535 | CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1 536 | CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 537 | 538 | # 539 | # mbedTLS 540 | # 541 | CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y 542 | CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC= 543 | CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC= 544 | CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=16384 545 | CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN= 546 | CONFIG_MBEDTLS_DEBUG= 547 | CONFIG_MBEDTLS_ECP_RESTARTABLE= 548 | CONFIG_MBEDTLS_CMAC_C= 549 | CONFIG_MBEDTLS_HARDWARE_AES=y 550 | CONFIG_MBEDTLS_HARDWARE_MPI= 551 | CONFIG_MBEDTLS_HARDWARE_SHA= 552 | CONFIG_MBEDTLS_HAVE_TIME=y 553 | CONFIG_MBEDTLS_HAVE_TIME_DATE= 554 | CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y 555 | CONFIG_MBEDTLS_TLS_SERVER_ONLY= 556 | CONFIG_MBEDTLS_TLS_CLIENT_ONLY= 557 | CONFIG_MBEDTLS_TLS_DISABLED= 558 | CONFIG_MBEDTLS_TLS_SERVER=y 559 | CONFIG_MBEDTLS_TLS_CLIENT=y 560 | CONFIG_MBEDTLS_TLS_ENABLED=y 561 | 562 | # 563 | # TLS Key Exchange Methods 564 | # 565 | CONFIG_MBEDTLS_PSK_MODES= 566 | CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y 567 | CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y 568 | CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y 569 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y 570 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y 571 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y 572 | CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y 573 | CONFIG_MBEDTLS_SSL_RENEGOTIATION=y 574 | CONFIG_MBEDTLS_SSL_PROTO_SSL3= 575 | CONFIG_MBEDTLS_SSL_PROTO_TLS1=y 576 | CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y 577 | CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y 578 | CONFIG_MBEDTLS_SSL_PROTO_DTLS= 579 | CONFIG_MBEDTLS_SSL_ALPN=y 580 | CONFIG_MBEDTLS_SSL_SESSION_TICKETS=y 581 | 582 | # 583 | # Symmetric Ciphers 584 | # 585 | CONFIG_MBEDTLS_AES_C=y 586 | CONFIG_MBEDTLS_CAMELLIA_C= 587 | CONFIG_MBEDTLS_DES_C= 588 | CONFIG_MBEDTLS_RC4_DISABLED=y 589 | CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT= 590 | CONFIG_MBEDTLS_RC4_ENABLED= 591 | CONFIG_MBEDTLS_BLOWFISH_C= 592 | CONFIG_MBEDTLS_XTEA_C= 593 | CONFIG_MBEDTLS_CCM_C=y 594 | CONFIG_MBEDTLS_GCM_C=y 595 | CONFIG_MBEDTLS_RIPEMD160_C= 596 | 597 | # 598 | # Certificates 599 | # 600 | CONFIG_MBEDTLS_PEM_PARSE_C=y 601 | CONFIG_MBEDTLS_PEM_WRITE_C=y 602 | CONFIG_MBEDTLS_X509_CRL_PARSE_C=y 603 | CONFIG_MBEDTLS_X509_CSR_PARSE_C=y 604 | CONFIG_MBEDTLS_ECP_C=y 605 | CONFIG_MBEDTLS_ECDH_C=y 606 | CONFIG_MBEDTLS_ECDSA_C=y 607 | CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y 608 | CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y 609 | CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y 610 | CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y 611 | CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y 612 | CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y 613 | CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y 614 | CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y 615 | CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y 616 | CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y 617 | CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y 618 | CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y 619 | CONFIG_MBEDTLS_ECP_NIST_OPTIM=y 620 | 621 | # 622 | # mDNS 623 | # 624 | CONFIG_MDNS_MAX_SERVICES=10 625 | 626 | # 627 | # ESP-MQTT Configurations 628 | # 629 | CONFIG_MQTT_PROTOCOL_311=y 630 | CONFIG_MQTT_TRANSPORT_SSL=y 631 | CONFIG_MQTT_TRANSPORT_WEBSOCKET=y 632 | CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y 633 | CONFIG_MQTT_USE_CUSTOM_CONFIG= 634 | CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED= 635 | CONFIG_MQTT_CUSTOM_OUTBOX= 636 | 637 | # 638 | # NVS 639 | # 640 | 641 | # 642 | # OpenSSL 643 | # 644 | CONFIG_OPENSSL_DEBUG= 645 | CONFIG_OPENSSL_ASSERT_DO_NOTHING=y 646 | CONFIG_OPENSSL_ASSERT_EXIT= 647 | 648 | # 649 | # PThreads 650 | # 651 | CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 652 | CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 653 | CONFIG_PTHREAD_STACK_MIN=768 654 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y 655 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0= 656 | CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1= 657 | CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 658 | CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" 659 | 660 | # 661 | # SPI Flash driver 662 | # 663 | CONFIG_SPI_FLASH_VERIFY_WRITE= 664 | CONFIG_SPI_FLASH_ENABLE_COUNTERS= 665 | CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y 666 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y 667 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS= 668 | CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED= 669 | CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y 670 | CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 671 | CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 672 | 673 | # 674 | # SPIFFS Configuration 675 | # 676 | CONFIG_SPIFFS_MAX_PARTITIONS=3 677 | 678 | # 679 | # SPIFFS Cache Configuration 680 | # 681 | CONFIG_SPIFFS_CACHE=y 682 | CONFIG_SPIFFS_CACHE_WR=y 683 | CONFIG_SPIFFS_CACHE_STATS= 684 | CONFIG_SPIFFS_PAGE_CHECK=y 685 | CONFIG_SPIFFS_GC_MAX_RUNS=10 686 | CONFIG_SPIFFS_GC_STATS= 687 | CONFIG_SPIFFS_PAGE_SIZE=256 688 | CONFIG_SPIFFS_OBJ_NAME_LEN=32 689 | CONFIG_SPIFFS_USE_MAGIC=y 690 | CONFIG_SPIFFS_USE_MAGIC_LENGTH=y 691 | CONFIG_SPIFFS_META_LENGTH=4 692 | CONFIG_SPIFFS_USE_MTIME=y 693 | 694 | # 695 | # Debug Configuration 696 | # 697 | CONFIG_SPIFFS_DBG= 698 | CONFIG_SPIFFS_API_DBG= 699 | CONFIG_SPIFFS_GC_DBG= 700 | CONFIG_SPIFFS_CACHE_DBG= 701 | CONFIG_SPIFFS_CHECK_DBG= 702 | CONFIG_SPIFFS_TEST_VISUALISATION= 703 | 704 | # 705 | # TCP/IP Adapter 706 | # 707 | CONFIG_IP_LOST_TIMER_INTERVAL=120 708 | CONFIG_TCPIP_LWIP=y 709 | 710 | # 711 | # Unity unit testing library 712 | # 713 | CONFIG_UNITY_ENABLE_FLOAT=y 714 | CONFIG_UNITY_ENABLE_DOUBLE=y 715 | CONFIG_UNITY_ENABLE_COLOR= 716 | CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y 717 | CONFIG_UNITY_ENABLE_FIXTURE= 718 | 719 | # 720 | # Virtual file system 721 | # 722 | CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y 723 | CONFIG_SUPPORT_TERMIOS=y 724 | 725 | # 726 | # Wear Levelling 727 | # 728 | CONFIG_WL_SECTOR_SIZE_512= 729 | CONFIG_WL_SECTOR_SIZE_4096=y 730 | CONFIG_WL_SECTOR_SIZE=4096 731 | 732 | # 733 | # Wi-Fi Provisioning Manager 734 | # 735 | CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 736 | --------------------------------------------------------------------------------