From 8c950eb6a135ab1847d8a0c01f9eb95fd14e8f58 Mon Sep 17 00:00:00 2001 From: a Date: Fri, 21 Aug 2020 02:29:19 +0200 Subject: [PATCH] added 4.0 version of wifi.c --- main/wifi/espidf-v4.0.c | 162 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 main/wifi/espidf-v4.0.c diff --git a/main/wifi/espidf-v4.0.c b/main/wifi/espidf-v4.0.c new file mode 100644 index 0000000..84b21ad --- /dev/null +++ b/main/wifi/espidf-v4.0.c @@ -0,0 +1,162 @@ +#ifdef FRAMEWORK_espidf +// Copyright 2020 Lukas Haubaum +// +// Licensed under the GNU Affero General Public License, Version 3; +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// https://www.gnu.org/licenses/agpl-3.0.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" + +#include "lwip/err.h" +#include "lwip/sys.h" + +#include "ena-cwa.h" + +#include "wifi.h" + +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 + +static EventGroupHandle_t s_wifi_event_group; + +static int s_retry_num = 0; + +static bool connected = false; + +void wifi_stop(void) +{ + connected = false; + esp_wifi_stop(); + esp_wifi_deinit(); + esp_event_loop_delete_default(); +} + +static esp_err_t event_handler(void *ctx, system_event_t *event) +{ + switch (event->event_id) { + case SYSTEM_EVENT_STA_START: + esp_wifi_connect(); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + if (s_retry_num < WIFI_MAXIMUM_RETRY) + { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGD(WIFI_LOG, "retry to connect to the AP"); + } + else + { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGD(WIFI_LOG, "connect to the AP fail"); + connected = false; + break; + case SYSTEM_EVENT_STA_GOT_IP: + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + connected = true; + + heap_caps_check_integrity_all(true); + break; + default: + ESP_LOGD(WIFI_LOG, "eventbase WIFI, eventid %d", event->event_id); + break; + } + return ESP_OK; +} + +void wifi_start(void) +{ + + // init NVS for WIFI + esp_err_t ret; + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ESP_ERROR_CHECK(nvs_flash_init()); + } + + s_wifi_event_group = xEventGroupCreate(); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + tcpip_adapter_init(); + 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 = WIFI_SSID, + .password = WIFI_PASSWORD, + /* Setting a password implies station will connect to all security modes including WEP/WPA. + * However these modes are deprecated and not advisable to be used. Incase your Access point + * doesn't support WPA2, these mode can be enabled by commenting below line */ + .threshold.authmode = WIFI_AUTH_WPA2_PSK, + + .pmf_cfg = { + .capable = true, + .required = false}, + }, + }; + 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()); + + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum + * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually + * happened. */ + if (bits & WIFI_CONNECTED_BIT) + { + ESP_LOGV(WIFI_LOG, "connected to ap SSID:%s", + WIFI_SSID); + } + else if (bits & WIFI_FAIL_BIT) + { + ESP_LOGI(WIFI_LOG, "Failed to connect to SSID:%s", + WIFI_SSID); + } + else + { + ESP_LOGE(WIFI_LOG, "UNEXPECTED EVENT"); + } + +#if 0 + /* The event will not be processed after unregister */ + ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip)); + ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id)); + vEventGroupDelete(s_wifi_event_group); +#endif +} + +bool wifi_is_connected(void) +{ + return connected; +} +#endif