simplify WiFi boot procedure to prepare for on-demand stack load
currently ```esp_wifi_init``` have to be called in ```app_main``` or WiFi will fail to boot. When possible to boot later, code will be moved into ```_esp_wifi_start``` to be executed when necessary
This commit is contained in:
parent
f4c2135a30
commit
1d1aeecde2
@ -8,15 +8,11 @@ extern "C" void initArduino();
|
||||
extern void loop();
|
||||
extern void setup();
|
||||
|
||||
void startWiFi() __attribute__((weak));
|
||||
void startWiFi() {}
|
||||
|
||||
void loopTask(void *pvParameters)
|
||||
{
|
||||
bool setup_done = false;
|
||||
for(;;) {
|
||||
if(!setup_done) {
|
||||
startWiFi();
|
||||
setup();
|
||||
setup_done = true;
|
||||
}
|
||||
|
@ -40,14 +40,75 @@ extern "C" {
|
||||
#include "lwip/opt.h"
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/dns.h"
|
||||
#include "esp_ipc.h"
|
||||
|
||||
#include "esp32-hal-log.h"
|
||||
|
||||
/**
|
||||
* Boot and start WiFi
|
||||
* This method get's called on boot if you use any of the WiFi methods.
|
||||
* If you do not link to this library, WiFi will not be started.
|
||||
* */
|
||||
static bool _esp_wifi_initalized = false;
|
||||
extern void initWiFi()
|
||||
{
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
tcpip_adapter_init();
|
||||
esp_event_loop_init(&WiFiGenericClass::_eventCallback, NULL);
|
||||
esp_wifi_init(&cfg);
|
||||
esp_wifi_set_storage(WIFI_STORAGE_RAM);
|
||||
_esp_wifi_initalized = true;
|
||||
}
|
||||
|
||||
} //extern "C"
|
||||
|
||||
#undef min
|
||||
#undef max
|
||||
#include <vector>
|
||||
|
||||
static bool _esp_wifi_start()
|
||||
{
|
||||
static bool started = false;
|
||||
esp_err_t err;
|
||||
|
||||
if(!_esp_wifi_initalized){
|
||||
initWiFi();
|
||||
if(!_esp_wifi_initalized){
|
||||
log_w("not initialized");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(started){
|
||||
return true;
|
||||
}
|
||||
started = true;
|
||||
err = esp_wifi_start();
|
||||
if (err != ESP_OK) {
|
||||
log_e("%d", err);
|
||||
return false;
|
||||
}
|
||||
#if CONFIG_AUTOCONNECT_WIFI
|
||||
wifi_mode_t mode = WIFI_MODE_NULL;
|
||||
bool auto_connect = false;
|
||||
|
||||
err = esp_wifi_get_mode(&mode);
|
||||
if (err != ESP_OK) {
|
||||
log_e("esp_wifi_get_mode: %d", err);
|
||||
return false;
|
||||
}
|
||||
|
||||
err = esp_wifi_get_auto_connect(&auto_connect);
|
||||
if ((mode == WIFI_MODE_STA || mode == WIFI_MODE_APSTA) && auto_connect) {
|
||||
err = esp_wifi_connect();
|
||||
if (err != ESP_OK) {
|
||||
log_e("esp_wifi_connect: %d", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
// ------------------------------------------------- Generic WiFi function -----------------------------------------------
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
@ -167,7 +228,11 @@ void WiFiGenericClass::persistent(bool persistent)
|
||||
*/
|
||||
bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
{
|
||||
if(getMode() == m) {
|
||||
wifi_mode_t cm = getMode();
|
||||
if(cm == WIFI_MODE_MAX){
|
||||
return false;
|
||||
}
|
||||
if(cm == m) {
|
||||
return true;
|
||||
}
|
||||
return esp_wifi_set_mode(m) == ESP_OK;
|
||||
@ -180,6 +245,9 @@ bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
wifi_mode_t WiFiGenericClass::getMode()
|
||||
{
|
||||
uint8_t mode;
|
||||
if(!_esp_wifi_start()){
|
||||
return WIFI_MODE_MAX;
|
||||
}
|
||||
esp_wifi_get_mode((wifi_mode_t*)&mode);
|
||||
return (wifi_mode_t)mode;
|
||||
}
|
||||
@ -275,48 +343,3 @@ void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *ca
|
||||
_dns_busy = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Boot and start WiFi
|
||||
* This method get's called on boot if you use any of the WiFi methods.
|
||||
* If you do not link to this library, WiFi will not be started.
|
||||
* */
|
||||
#include "nvs_flash.h"
|
||||
|
||||
extern "C" void initWiFi()
|
||||
{
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
nvs_flash_init();
|
||||
tcpip_adapter_init();
|
||||
esp_event_loop_init(WiFiGenericClass::_eventCallback, NULL);
|
||||
esp_wifi_init(&cfg);
|
||||
}
|
||||
|
||||
void startWiFi()
|
||||
{
|
||||
esp_err_t err;
|
||||
|
||||
err = esp_wifi_start();
|
||||
if (err != ESP_OK) {
|
||||
log_e("esp_wifi_start: %d", err);
|
||||
return;
|
||||
}
|
||||
#if CONFIG_AUTOCONNECT_WIFI
|
||||
wifi_mode_t mode = WIFI_MODE_NULL;
|
||||
bool auto_connect = false;
|
||||
|
||||
err = esp_wifi_get_mode(&mode);
|
||||
if (err != ESP_OK) {
|
||||
log_e("esp_wifi_get_mode: %d", err);
|
||||
return;
|
||||
}
|
||||
|
||||
err = esp_wifi_get_auto_connect(&auto_connect);
|
||||
if ((mode == WIFI_MODE_STA || mode == WIFI_MODE_APSTA) && auto_connect) {
|
||||
err = esp_wifi_connect();
|
||||
if (err != ESP_OK) {
|
||||
log_e("esp_wifi_connect: %d", err);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user