connect to wifi via sdkconfig

Signed-off-by: Peter Siegmund <peter@rdkr.com>
This commit is contained in:
Peter Siegmund
2024-06-07 13:41:27 +02:00
parent 378b6ebc1d
commit 2c8b9465cd
6 changed files with 170 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
idf_component_register(SRCS "connectivity.c"
INCLUDE_DIRS "include"
PRIV_REQUIRES
esp_event
esp_wifi)

View File

@@ -0,0 +1,103 @@
#include "connectivity.h"
#include <string.h>
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"
#include "sdkconfig.h"
/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;
/* The event group allows multiple bits for each event, but we only care about
* two events:
* - we are connected to the AP with an IP
* - we failed to connect after the maximum amount of retries */
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static const char* TAG = "wifi station";
static int s_retry_num = 0;
#define WIFI_SSID CONFIG_WIFI_SSID
#define WIFI_PASS CONFIG_WIFI_PASSWORD
static void event_handler(void* arg,
esp_event_base_t event_base,
int32_t event_id,
void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT &&
event_id == WIFI_EVENT_STA_DISCONNECTED) {
if (s_retry_num < CONFIG_ESP_MAXIMUM_RETRY) {
esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
} else {
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
ESP_LOGI(TAG, "connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*)event_data;
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
}
uint8_t init_wifi(void) {
s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));
wifi_config_t wifi_config = {
.sta =
{
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_sta finished.");
/* 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_LOGI(TAG, "connected to ap SSID:%s", WIFI_SSID);
return 0;
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s", WIFI_SSID);
return 1;
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
return -1;
}
}

View File

@@ -0,0 +1,11 @@
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
uint8_t init_wifi(void);
#ifdef __cplusplus
}
#endif

View File

@@ -3,7 +3,9 @@ idf_component_register(SRCS "main.cpp"
PRIV_REQUIRES PRIV_REQUIRES
lilygo-epd47 lilygo-epd47
smartconfig smartconfig
connectivity
mapView mapView
nvs_flash
json) json)
spiffs_create_partition_image(spiffs ../data FLASH_IN_PROJECT) spiffs_create_partition_image(spiffs ../data FLASH_IN_PROJECT)

View File

@@ -1,13 +1,19 @@
menu "WiFi Configuration Options" menu "WiFi Configuration Options"
config WIFI_SSID config WIFI_SSID
string "WIFI SSID" string "WIFI SSID"
default "" default "ssid"
help help
SSID of the WiFi network to connect to. SSID of the WiFi network to connect to.
config WIFI_PASSWORD config WIFI_PASSWORD
string "WIFI Password" string "WIFI Password"
default "" default "password"
help help
Password of the WiFi network to connect to. Password of the WiFi network to connect to.
config ESP_MAXIMUM_RETRY
int "Maximum retry"
default 5
help
Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
endmenu endmenu

View File

@@ -1,14 +1,51 @@
#include <cJSON.h>
#include <esp_task.h>
#include <esp_task_wdt.h>
#include <stdio.h> #include <stdio.h>
#include "connectivity.h"
#include "epd_driver.h" #include "epd_driver.h"
#include "esp_task.h"
#include "esp_task_wdt.h"
#include "fonts/opensans16.h"
#include "mapView.h" #include "mapView.h"
#include "nvs_flash.h"
#include "sdkconfig.h"
#include "smartconfig.h" #include "smartconfig.h"
#include "utilities.h" #include "utilities.h"
void setup(void) { void nvs_init(void) {
esp_err_t 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());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
}
void splash_screen(void) {
epd_init(); epd_init();
nvs_init();
epd_poweron();
epd_clear();
int32_t x = 100;
int32_t y = 100;
char buffer[100];
sprintf(buffer, "Connecting to SSDI: %s", CONFIG_WIFI_SSID);
writeln(&OpenSans16, buffer, &x, &y, NULL);
auto ret = init_wifi();
if (ret != 0) {
epd_clear();
writeln(&OpenSans16, "Failed to connect to WiFi.", &x, &y, NULL);
epd_poweroff();
while (1) {
///
};
}
epd_poweroff();
}
void setup(void) {
splash_screen();
// init_smartconfig(); // init_smartconfig();
xTaskCreatePinnedToCore(mapView, "mapView", 4096, NULL, 5, NULL, 1); xTaskCreatePinnedToCore(mapView, "mapView", 4096, NULL, 5, NULL, 1);