static void wifi_conn_init(void) { tcpip_adapter_init(); wifi_event_group = xEventGroupCreate(); ESP_ERROR_CHECK( esp_event_loop_init(wifi_event_handler, NULL) ); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); wifi_config_t wifi_config = { .sta = { .ssid = EXAMPLE_WIFI_SSID, .password = EXAMPLE_WIFI_PASS, }, }; ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); ESP_LOGI(TAG, "start the WIFI SSID:[%s] password:[%s]\n", EXAMPLE_WIFI_SSID, EXAMPLE_WIFI_PASS); ESP_ERROR_CHECK( esp_wifi_start() ); }
static void initialise_wifi(void) { tcpip_adapter_init(); wifi_event_group = xEventGroupCreate(); ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) ); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) ); wifi_config_t wifi_config = { .sta = { .ssid = EXAMPLE_WIFI_SSID, .password = EXAMPLE_WIFI_PASS, }, }; ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid); ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); ESP_ERROR_CHECK( esp_wifi_start() ); }
void disconnectCallbackHandler(AWS_IoT_Client *pClient, void *data) { ESP_LOGW(TAG, "MQTT Disconnect"); IoT_Error_t rc = FAILURE; if(NULL == pClient) { return; } if(aws_iot_is_autoreconnect_enabled(pClient)) { ESP_LOGI(TAG, "Auto Reconnect is enabled, Reconnecting attempt will start now"); } else { ESP_LOGW(TAG, "Auto Reconnect not enabled. Starting manual reconnect..."); rc = aws_iot_mqtt_attempt_reconnect(pClient); if(NETWORK_RECONNECTED == rc) { ESP_LOGW(TAG, "Manual Reconnect Successful"); } else { ESP_LOGW(TAG, "Manual Reconnect Failed - %d", rc); } } }
static esp_err_t event_handler(void *ctx, system_event_t *event) { switch(event->event_id) { case SYSTEM_EVENT_STA_START: ESP_LOGI(TAG, "STA start"); esp_wifi_connect(); break; case SYSTEM_EVENT_STA_GOT_IP: xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); break; case SYSTEM_EVENT_STA_DISCONNECTED: /* This is a workaround as ESP32 WiFi libs don't currently auto-reassociate. */ esp_wifi_connect(); xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); break; default: break; } return ESP_OK; }
static esp_err_t app_prov_start_service(void) { /* Create new protocomm instance */ g_prov->pc = protocomm_new(); if (g_prov->pc == NULL) { ESP_LOGE(TAG, "Failed to create new protocomm instance"); return ESP_FAIL; } /* Config for protocomm_console_start() */ protocomm_console_config_t config = PROTOCOMM_CONSOLE_DEFAULT_CONFIG(); /* Start protocomm using console */ if (protocomm_console_start(g_prov->pc, &config) != ESP_OK) { ESP_LOGE(TAG, "Failed to start console provisioning"); return ESP_FAIL; } /* Set protocomm version verification endpoint for protocol */ protocomm_set_version(g_prov->pc, "proto-ver", "V0.1"); /* Set protocomm security type for endpoint */ if (g_prov->security == 0) { protocomm_set_security(g_prov->pc, "prov-session", &protocomm_security0, NULL); } else if (g_prov->security == 1) { protocomm_set_security(g_prov->pc, "prov-session", &protocomm_security1, g_prov->pop); } /* Add endpoint for provisioning to set wifi station config */ if (protocomm_add_endpoint(g_prov->pc, "prov-config", wifi_prov_config_data_handler, (void *) &wifi_prov_handlers) != ESP_OK) { ESP_LOGE(TAG, "Failed to set provisioning endpoint"); protocomm_console_stop(g_prov->pc); return ESP_FAIL; } ESP_LOGI(TAG, "Provisioning started"); return ESP_OK; }
int trax_start_trace(trax_downcount_unit_t units_until_stop) { #if !CONFIG_ESP32_TRAX ESP_LOGE(TAG, "Trax_start_trace called, but trax is disabled in menuconfig!"); return ESP_ERR_NO_MEM; #endif uint32_t v; if (eri_read(ERI_TRAX_TRAXSTAT)&TRAXSTAT_TRACT) { ESP_LOGI(TAG, "Stopping active trace first."); //Trace is active. Stop trace. eri_write(ERI_TRAX_DELAYCNT, 0); eri_write(ERI_TRAX_TRAXCTRL, eri_read(ERI_TRAX_TRAXCTRL)|TRAXCTRL_TRSTP); //ToDo: This will probably trigger a trace done interrupt. ToDo: Fix, but how? -JD eri_write(ERI_TRAX_TRAXCTRL, 0); } eri_write(ERI_TRAX_PCMATCHCTRL, 31); //do not stop at any pc match v=TRAXCTRL_TREN | TRAXCTRL_TMEN | TRAXCTRL_PTOWS | (1<<TRAXCTRL_SMPER_SHIFT); if (units_until_stop == TRAX_DOWNCOUNT_INSTRUCTIONS) v|=TRAXCTRL_CNTU; //Enable trace. This trace has no stop condition and will just keep on running. eri_write(ERI_TRAX_TRAXCTRL, v); return ESP_OK; }
esp_err_t esp_flash_encrypt_check_and_update(void) { uint32_t efuse_blk0 = REG_READ(EFUSE_BLK0_RDATA0_REG); ESP_LOGV(TAG, "efuse_blk0 raw value %08x", efuse_blk0); uint32_t flash_crypt_cnt = (efuse_blk0 & EFUSE_RD_FLASH_CRYPT_CNT_M) >> EFUSE_RD_FLASH_CRYPT_CNT_S; bool flash_crypt_wr_dis = efuse_blk0 & EFUSE_WR_DIS_FLASH_CRYPT_CNT; ESP_LOGV(TAG, "efuse FLASH_CRYPT_CNT 0x%x WR_DIS_FLASH_CRYPT_CNT 0x%x", flash_crypt_cnt, flash_crypt_wr_dis); if (__builtin_parity(flash_crypt_cnt) == 1) { /* Flash is already encrypted */ int left = (7 - __builtin_popcount(flash_crypt_cnt)) / 2; if (flash_crypt_wr_dis) { left = 0; /* can't update FLASH_CRYPT_CNT, no more flashes */ } ESP_LOGI(TAG, "flash encryption is enabled (%d plaintext flashes left)", left); return ESP_OK; } else { /* Flash is not encrypted, so encrypt it! */ return encrypt_flash_contents(flash_crypt_cnt, flash_crypt_wr_dis); } }
static void esp_spp_cb(uint16_t e, void *p) { esp_spp_cb_event_t event = e; esp_spp_cb_param_t *param = p; switch (event) { case ESP_SPP_INIT_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_INIT_EVT"); esp_bt_dev_set_device_name(EXCAMPLE_DEVICE_NAME); esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE); esp_bt_gap_start_discovery(inq_mode, inq_len, inq_num_rsps); break; case ESP_SPP_DISCOVERY_COMP_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_DISCOVERY_COMP_EVT status=%d scn_num=%d",param->disc_comp.status, param->disc_comp.scn_num); if (param->disc_comp.status == ESP_SPP_SUCCESS) { esp_spp_connect(sec_mask, role_master, param->disc_comp.scn[0], peer_bd_addr); } break; case ESP_SPP_OPEN_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_OPEN_EVT"); spp_wr_task_start_up(spp_write_handle, param->open.fd); break; case ESP_SPP_CLOSE_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_CLOSE_EVT"); break; case ESP_SPP_START_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_START_EVT"); break; case ESP_SPP_CL_INIT_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_CL_INIT_EVT"); break; case ESP_SPP_SRV_OPEN_EVT: ESP_LOGI(SPP_TAG, "ESP_SPP_SRV_OPEN_EVT"); break; default: break; } }
/** * @brief GPS Event Handler * * @param event_handler_arg handler specific arguments * @param event_base event base, here is fixed to ESP_NMEA_EVENT * @param event_id event id * @param event_data event specific arguments */ static void gps_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { gps_t *gps = NULL; switch (event_id) { case GPS_UPDATE: gps = (gps_t *)event_data; /* print information parsed from GPS statements */ ESP_LOGI(TAG, "%d/%d/%d %d:%d:%d => \r\n" "\t\t\t\t\t\tlatitude = %.05f°N\r\n" "\t\t\t\t\t\tlongtitude = %.05f°E\r\n" "\t\t\t\t\t\taltitude = %.02fm\r\n" "\t\t\t\t\t\tspeed = %fm/s", gps->date.year + YEAR_BASE, gps->date.month, gps->date.day, gps->tim.hour + TIME_ZONE, gps->tim.minute, gps->tim.second, gps->latitude, gps->longitude, gps->altitude, gps->speed); break; case GPS_UNKNOWN: /* print unknown statements */ ESP_LOGW(TAG, "Unknown statement:%s", (char *)event_data); break; default: break; } }
static int vfs_mkdir(const char *name, mode_t mode) { ESP_LOGI(tag, ">> mkdir name=%s, mode=%d", name, mode); return 0; }
static off_t vfs_lseek(int fd, off_t offset, int whence) { ESP_LOGI(tag, ">> lseek fd=%d, offset=%d, whence=%d", fd, (int)offset, whence); return 0; }
static int vfs_link(const char *oldPath, const char *newPath) { ESP_LOGI(tag, ">> link oldPath=%s, newPath=%s", oldPath, newPath); return 0; }
static int vfs_fstat(int fd, struct stat *st) { ESP_LOGI(tag, ">> fstat fd=%d", fd); return 0; }
static int vfs_closedir(DIR *pdir) { ESP_LOGI(tag, ">> closedir"); return 0; }
static ssize_t vfs_read(int fd, void *dst, size_t size) { ESP_LOGI(tag, ">> read fd=%d, dst=0x%lx, size=%d", fd, (unsigned long)dst, size); return 0; }
static void udp_conn(void *pvParameters) { ESP_LOGI(TAG, "task udp_conn start... \n\r"); //等待是否已经成功连接到路由器的标志位 xEventGroupWaitBits(udp_event_group, WIFI_CONNECTED_BIT, false, true, portMAX_DELAY); ESP_LOGI(TAG, "esp32 is ready !!! create udp client or connect servece after 5s... \n\r"); vTaskDelay(5000 / portTICK_RATE_MS); //创建客户端并且检查是否创建成功 #if Server_Station_Option ESP_LOGI(TAG, "Now Let us create udp server ... \n\r"); if (create_udp_server() == ESP_FAIL) { ESP_LOGI(TAG, " server create socket error , stop !!! \n\r"); vTaskDelete(NULL); } else { ESP_LOGI(TAG, "server create socket Succeed !!! \n\r"); } #else ESP_LOGI(TAG, "Now Let us create udp client ... \n\r"); if (create_udp_client() == ESP_FAIL) { ESP_LOGI(TAG, "client create socket error , stop !!! \n\r"); vTaskDelete(NULL); } else { ESP_LOGI(TAG, "client create socket Succeed !!! \n\r"); } #endif //创建一个发送和接收数据的任务 TaskHandle_t tx_rx_task; xTaskCreate(&send_recv_data, "send_recv_data", 4096, NULL, 4, &tx_rx_task); //等待 UDP连接成功标志位 xEventGroupWaitBits(udp_event_group, UDP_CONNCETED_SUCCESS, false, true, portMAX_DELAY); int bps; char sendBuff[1024] = "hello xuhong,I am from Esp32 ..."; while (1) { total_data = 0; vTaskDelay(3000 / portTICK_RATE_MS); //时隔三秒发送一次数据 #if !Server_Station_Option send_Buff_with_UDP(sendBuff, 1024); #endif bps = total_data / 3; if (total_data <= 0) { int err_ret = check_connected_socket(); if (err_ret == -1) { ESP_LOGW(TAG, "udp send & recv stop !!! will close socket ... \n\r"); close_socket(); break; } } ESP_LOGI(TAG, "udp recv %d byte per sec! total pack: %d \n\r", bps, success_pack); } vTaskDelete(tx_rx_task); vTaskDelete(NULL); }
static int vfs_unlink(const char *path) { ESP_LOGI(tag, ">> unlink path=%s", path); return 0; }
static void vfs_seekdir(DIR *pdir, long offset) { ESP_LOGI(tag, ">> seekdir offset=%d", offset); }
static void esp_bt_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param) { switch(event){ case ESP_BT_GAP_DISC_RES_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_DISC_RES_EVT"); esp_log_buffer_hex(SPP_TAG, param->disc_res.bda, ESP_BD_ADDR_LEN); for (int i = 0; i < param->disc_res.num_prop; i++){ if (param->disc_res.prop[i].type == ESP_BT_GAP_DEV_PROP_EIR && get_name_from_eir(param->disc_res.prop[i].val, peer_bdname, &peer_bdname_len)){ esp_log_buffer_char(SPP_TAG, peer_bdname, peer_bdname_len); if (strlen(remote_device_name) == peer_bdname_len && strncmp(peer_bdname, remote_device_name, peer_bdname_len) == 0) { memcpy(peer_bd_addr, param->disc_res.bda, ESP_BD_ADDR_LEN); esp_spp_start_discovery(peer_bd_addr); esp_bt_gap_cancel_discovery(); } } } break; case ESP_BT_GAP_DISC_STATE_CHANGED_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_DISC_STATE_CHANGED_EVT"); break; case ESP_BT_GAP_RMT_SRVCS_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_RMT_SRVCS_EVT"); break; case ESP_BT_GAP_RMT_SRVC_REC_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_RMT_SRVC_REC_EVT"); break; case ESP_BT_GAP_AUTH_CMPL_EVT:{ if (param->auth_cmpl.stat == ESP_BT_STATUS_SUCCESS) { ESP_LOGI(SPP_TAG, "authentication success: %s", param->auth_cmpl.device_name); esp_log_buffer_hex(SPP_TAG, param->auth_cmpl.bda, ESP_BD_ADDR_LEN); } else { ESP_LOGE(SPP_TAG, "authentication failed, status:%d", param->auth_cmpl.stat); } break; } case ESP_BT_GAP_PIN_REQ_EVT:{ ESP_LOGI(SPP_TAG, "ESP_BT_GAP_PIN_REQ_EVT min_16_digit:%d", param->pin_req.min_16_digit); if (param->pin_req.min_16_digit) { ESP_LOGI(SPP_TAG, "Input pin code: 0000 0000 0000 0000"); esp_bt_pin_code_t pin_code = {0}; esp_bt_gap_pin_reply(param->pin_req.bda, true, 16, pin_code); } else { ESP_LOGI(SPP_TAG, "Input pin code: 1234"); esp_bt_pin_code_t pin_code; pin_code[0] = '1'; pin_code[1] = '2'; pin_code[2] = '3'; pin_code[3] = '4'; esp_bt_gap_pin_reply(param->pin_req.bda, true, 4, pin_code); } break; } #if (CONFIG_BT_SSP_ENABLED == true) case ESP_BT_GAP_CFM_REQ_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_CFM_REQ_EVT Please compare the numeric value: %d", param->cfm_req.num_val); esp_bt_gap_ssp_confirm_reply(param->cfm_req.bda, true); break; case ESP_BT_GAP_KEY_NOTIF_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_KEY_NOTIF_EVT passkey:%d", param->key_notif.passkey); break; case ESP_BT_GAP_KEY_REQ_EVT: ESP_LOGI(SPP_TAG, "ESP_BT_GAP_KEY_REQ_EVT Please enter passkey!"); break; #endif default: break; } }
static void vfs_rmdir(const char *name) { ESP_LOGI(tag, ">> rmdir name=%s", name); }
static int vfs_rename(const char *oldPath, const char *newPath) { ESP_LOGI(tag, ">> rename oldPath=%s, newPath=%s", oldPath, newPath); return 0; }
static struct dirent vfs_readdir(DIR *pdir) { ESP_LOGI(tag, ">> readdir name=%s", name); struct dirent d; return d; }
/** * Open the file specified by path. The flags contain the instructions * on how the file is to be opened. For example: * * O_CREAT - Create the named file. * O_TRUNC - Truncate (empty) the file. * O_RDONLY - Open the file for reading only. * O_WRONLY - Open the file for writing only. * O_RDWR - Open the file for reading and writing. * O_APPEND - Open the file in append mode. * * The mode are access mode flags. */ static int vfs_open(const char *path, int flags, int accessMode) { ESP_LOGI(tag, ">> open path=%s, flags=0x%x, accessMode=0x%x", path, flags, accessMode); logFlags(flags); return -1; }
static size_t vfs_write(int fd, const void *data, size_t size) { ESP_LOGI(tag, ">> write fd=%d, data=0x%lx, size=%d", fd, (unsigned long)data, size); return 0; }
/* An HTTP GET handler */ esp_err_t hello_get_handler(httpd_req_t *req) { char* buf; size_t buf_len; /* Get header value string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_hdr_value_len(req, "Host") + 1; if (buf_len > 1) { buf = malloc(buf_len); /* Copy null terminated value string into buffer */ if (httpd_req_get_hdr_value_str(req, "Host", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Host: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-2") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-2", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-2: %s", buf); } free(buf); } buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-1") + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_hdr_value_str(req, "Test-Header-1", buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found header => Test-Header-1: %s", buf); } free(buf); } /* Read URL query string length and allocate memory for length + 1, * extra byte for null termination */ buf_len = httpd_req_get_url_query_len(req) + 1; if (buf_len > 1) { buf = malloc(buf_len); if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { ESP_LOGI(TAG, "Found URL query => %s", buf); char param[32]; /* Get value of expected key from query string */ if (httpd_query_key_value(buf, "query1", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query1=%s", param); } if (httpd_query_key_value(buf, "query3", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query3=%s", param); } if (httpd_query_key_value(buf, "query2", param, sizeof(param)) == ESP_OK) { ESP_LOGI(TAG, "Found URL query parameter => query2=%s", param); } } free(buf); } /* Set some custom headers */ httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1"); httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2"); /* Send response with custom headers and body set as the * string passed in user context*/ const char* resp_str = (const char*) req->user_ctx; httpd_resp_send(req, resp_str, strlen(resp_str)); /* After sending the HTTP response the old HTTP request * headers are lost. Check if HTTP request headers can be read now. */ if (httpd_req_get_hdr_value_len(req, "Host") == 0) { ESP_LOGI(TAG, "Request headers lost"); } return ESP_OK; }
static int vfs_close(int fd) { ESP_LOGI(tag, ">> close fd=%d", fd); return 0; }
static int vfs_stat(const char *path, struct stat *st) { ESP_LOGI(tag, ">> stat path=%s", path); return 0; }
static DIR *vfs_opendir(const char *name) { ESP_LOGI(tag, ">> opendir name=%s", name); return NULL; }
static void https_get_task(void *pvParameters) { char buf[512]; int ret, len; #if CONFIG_SSL_USING_WOLFSSL /* CA date verification need system time */ get_time(); #endif while(1) { /* Wait for the callback to set the CONNECTED_BIT in the event group. */ xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY); ESP_LOGI(TAG, "Connected to AP"); esp_tls_cfg_t cfg = { .cacert_pem_buf = server_root_cert_pem_start, .cacert_pem_bytes = server_root_cert_pem_end - server_root_cert_pem_start, }; struct esp_tls *tls = esp_tls_conn_new(WEB_SERVER, strlen(WEB_SERVER), WEB_PORT, &cfg); if(tls != NULL) { ESP_LOGI(TAG, "Connection established..."); } else { ESP_LOGE(TAG, "Connection failed..."); goto exit; } size_t written_bytes = 0; do { ret = esp_tls_conn_write(tls, REQUEST + written_bytes, strlen(REQUEST) - written_bytes); if (ret >= 0) { ESP_LOGI(TAG, "%d bytes written", ret); written_bytes += ret; } else if #if CONFIG_SSL_USING_MBEDTLS (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) #else (ret != WOLFSSL_ERROR_WANT_READ && ret != WOLFSSL_ERROR_WANT_WRITE) #endif { ESP_LOGE(TAG, "esp_tls_conn_write returned 0x%x", ret); goto exit; } } while(written_bytes < strlen(REQUEST)); ESP_LOGI(TAG, "Reading HTTP response..."); do { len = sizeof(buf) - 1; bzero(buf, sizeof(buf)); ret = esp_tls_conn_read(tls, (char *)buf, len); if #if CONFIG_SSL_USING_MBEDTLS (ret == MBEDTLS_ERR_SSL_WANT_WRITE || ret == MBEDTLS_ERR_SSL_WANT_READ) #else (ret == WOLFSSL_ERROR_WANT_READ && ret == WOLFSSL_ERROR_WANT_WRITE) #endif continue; if(ret < 0) { ESP_LOGE(TAG, "esp_tls_conn_read returned -0x%x", -ret); break; } if(ret == 0) { ESP_LOGI(TAG, "connection closed"); break; } len = ret; ESP_LOGD(TAG, "%d bytes read", len); /* Print response directly to stdout as it is read */ for(int i = 0; i < len; i++) { putchar(buf[i]); } } while(1); exit: esp_tls_conn_delete(tls); putchar('\n'); // JSON output doesn't have a newline at end static int request_count; ESP_LOGI(TAG, "Completed %d requests", ++request_count); for(int countdown = 10; countdown >= 0; countdown--) { ESP_LOGI(TAG, "%d...", countdown); vTaskDelay(1000 / portTICK_PERIOD_MS); } ESP_LOGI(TAG, "Starting again!"); } } void app_main() { ESP_ERROR_CHECK( nvs_flash_init() ); initialise_wifi(); xTaskCreate(&https_get_task, "https_get_task", 8192, NULL, 5, NULL); }
static long vfs_telldir(DIR *pdir) { ESP_LOGI(tag, ">> telldir"); return 0; }