mirror of
https://github.com/0xFEEDC0DE64/arduino-esp32.git
synced 2025-07-03 05:46:32 +02:00
Update IDF to aaf1239 (#1539)
* fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * Initial add of @stickbreaker i2c * Add log_n * fix warnings when log is off * i2c code clean up and reorganization * add flags to interrupt allocator * fix sdmmc config * Fix warnings in EEPROM from @Curclamas * remove leftover TAG in EEPROM * fix errors with latest IDF * fix debug optimization (#1365) incorrect optimization for debugging tick markers. * Fix some missing BT header * Change BTSerial log calls * Update BLE lib * Arduino-ESP32 release management scripted (#1515) * Calculate an absolute path for a custom partitions table (#1452) * * Arduino-ESP32 release management scripted (ready-to-merge) * * secure env for espressif/arduino-esp32 * * build tests enabled * gitter webhook enabled * * gitter room link fixed * better comment * * filepaths fixed * BT Serial adjustments * * don't run sketch builds & tests for tagged builds * Return false from WiFi.hostByName() if hostname is not resolved * Free BT Memory when BT is not used * WIFI_MODE_NULL is not supported anymore * Select some key examples to build with PlatformIO to save some time * Update BLE lib * Fixed BLE lib * Major WiFi overhaul - auto reconnect on connection loss now works - moved to event groups - some code clean up and procedure optimizations - new methods to get a more elaborate system ststus * Add cmake tests to travis * Add initial AsyncUDP * Add NetBIOS lib and fix CMake includes * Add Initial WebServer * Fix WebServer and examples * travis not quiting on build fail * Try different travis build * Update IDF to aaf1239 * Fix WPS Example * fix script permission and add some fail tests to sketch builder * Add missing space in WiFiClient::write(Stream &stream)
This commit is contained in:
@ -61,6 +61,7 @@ extern "C" {
|
||||
|
||||
static xQueueHandle _network_event_queue;
|
||||
static TaskHandle_t _network_event_task_handle = NULL;
|
||||
static EventGroupHandle_t _network_event_group = NULL;
|
||||
|
||||
static void _network_event_task(void * arg){
|
||||
system_event_t *event = NULL;
|
||||
@ -81,35 +82,42 @@ static esp_err_t _network_event_cb(void *arg, system_event_t *event){
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static void _start_network_event_task(){
|
||||
static bool _start_network_event_task(){
|
||||
if(!_network_event_group){
|
||||
_network_event_group = xEventGroupCreate();
|
||||
if(!_network_event_group){
|
||||
log_e("Network Event Group Create Failed!");
|
||||
return false;
|
||||
}
|
||||
xEventGroupSetBits(_network_event_group, WIFI_DNS_IDLE_BIT);
|
||||
}
|
||||
if(!_network_event_queue){
|
||||
_network_event_queue = xQueueCreate(32, sizeof(system_event_t *));
|
||||
if(!_network_event_queue){
|
||||
log_e("Network Event Queue Create Failed!");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(!_network_event_task_handle){
|
||||
xTaskCreatePinnedToCore(_network_event_task, "network_event", 4096, NULL, 2, &_network_event_task_handle, ARDUINO_RUNNING_CORE);
|
||||
if(!_network_event_task_handle){
|
||||
log_e("Network Event Task Start Failed!");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
esp_event_loop_init(&_network_event_cb, NULL);
|
||||
return esp_event_loop_init(&_network_event_cb, NULL) == ESP_OK;
|
||||
}
|
||||
|
||||
void tcpipInit(){
|
||||
static bool initialized = false;
|
||||
if(!initialized){
|
||||
if(!initialized && _start_network_event_task()){
|
||||
initialized = true;
|
||||
_start_network_event_task();
|
||||
tcpip_adapter_init();
|
||||
}
|
||||
}
|
||||
|
||||
static bool lowLevelInitDone = false;
|
||||
static bool wifiLowLevelInit(bool persistent){
|
||||
static bool lowLevelInitDone = false;
|
||||
if(!lowLevelInitDone){
|
||||
tcpipInit();
|
||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||
@ -121,7 +129,6 @@ static bool wifiLowLevelInit(bool persistent){
|
||||
if(!persistent){
|
||||
esp_wifi_set_storage(WIFI_STORAGE_RAM);
|
||||
}
|
||||
esp_wifi_set_mode(WIFI_MODE_NULL);
|
||||
lowLevelInitDone = true;
|
||||
}
|
||||
return true;
|
||||
@ -161,12 +168,13 @@ static bool espWiFiStop(){
|
||||
if(!_esp_wifi_started){
|
||||
return true;
|
||||
}
|
||||
_esp_wifi_started = false;
|
||||
err = esp_wifi_stop();
|
||||
if(err){
|
||||
log_e("Could not stop WiFi! %u", err);
|
||||
_esp_wifi_started = true;
|
||||
return false;
|
||||
}
|
||||
_esp_wifi_started = false;
|
||||
return wifiLowLevelDeinit();
|
||||
}
|
||||
|
||||
@ -198,6 +206,39 @@ WiFiGenericClass::WiFiGenericClass()
|
||||
|
||||
}
|
||||
|
||||
int WiFiGenericClass::setStatusBits(int bits){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupSetBits(_network_event_group, bits);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::clearStatusBits(int bits){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupClearBits(_network_event_group, bits);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::getStatusBits(){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupGetBits(_network_event_group);
|
||||
}
|
||||
|
||||
int WiFiGenericClass::waitStatusBits(int bits, uint32_t timeout_ms){
|
||||
if(!_network_event_group){
|
||||
return 0;
|
||||
}
|
||||
return xEventGroupWaitBits(
|
||||
_network_event_group, // The event group being tested.
|
||||
bits, // The bits within the event group to wait for.
|
||||
pdFALSE, // BIT_0 and BIT_4 should be cleared before returning.
|
||||
pdTRUE, // Don't wait for both bits, either bit will do.
|
||||
timeout_ms / portTICK_PERIOD_MS ) & bits; // Wait a maximum of 100ms for either bit to be set.
|
||||
}
|
||||
|
||||
/**
|
||||
* set callback function
|
||||
* @param cbEvent WiFiEventCb
|
||||
@ -304,6 +345,16 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
log_d("Event: %d - %s", event->event_id, system_event_names[event->event_id]);
|
||||
if(event->event_id == SYSTEM_EVENT_SCAN_DONE) {
|
||||
WiFiScanClass::_scanDone();
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_START) {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
setStatusBits(STA_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_STOP) {
|
||||
WiFiSTAClass::_setStatus(WL_NO_SHIELD);
|
||||
clearStatusBits(STA_STARTED_BIT | STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_CONNECTED) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
setStatusBits(STA_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_DISCONNECTED) {
|
||||
uint8_t reason = event->event_info.disconnected.reason;
|
||||
log_w("Reason: %u - %s", reason, reason2str(reason));
|
||||
@ -320,17 +371,47 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
} else {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
}
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_START) {
|
||||
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_STOP) {
|
||||
WiFiSTAClass::_setStatus(WL_NO_SHIELD);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_CONNECTED) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
clearStatusBits(STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT);
|
||||
if(reason >= WIFI_REASON_BEACON_TIMEOUT && reason != WIFI_REASON_AUTH_FAIL && WiFi.getAutoReconnect()){
|
||||
WiFi.begin();
|
||||
}
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_GOT_IP) {
|
||||
//#1081 https://github.com/espressif/arduino-esp32/issues/1081
|
||||
// if(WiFiSTAClass::status() == WL_IDLE_STATUS)
|
||||
{
|
||||
WiFiSTAClass::_setStatus(WL_CONNECTED);
|
||||
WiFiSTAClass::_setStatus(WL_CONNECTED);
|
||||
setStatusBits(STA_HAS_IP_BIT | STA_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) {
|
||||
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
|
||||
clearStatusBits(STA_HAS_IP_BIT);
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_START) {
|
||||
setStatusBits(AP_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STOP) {
|
||||
clearStatusBits(AP_STARTED_BIT | AP_HAS_CLIENT_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STACONNECTED) {
|
||||
setStatusBits(AP_HAS_CLIENT_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_AP_STADISCONNECTED) {
|
||||
wifi_sta_list_t clients;
|
||||
if(esp_wifi_ap_get_sta_list(&clients) != ESP_OK || !clients.num){
|
||||
clearStatusBits(AP_HAS_CLIENT_BIT);
|
||||
}
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_START) {
|
||||
setStatusBits(ETH_STARTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_STOP) {
|
||||
clearStatusBits(ETH_STARTED_BIT | ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_CONNECTED) {
|
||||
setStatusBits(ETH_CONNECTED_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_DISCONNECTED) {
|
||||
clearStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT);
|
||||
} else if(event->event_id == SYSTEM_EVENT_ETH_GOT_IP) {
|
||||
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT);
|
||||
|
||||
} else if(event->event_id == SYSTEM_EVENT_GOT_IP6) {
|
||||
if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_AP){
|
||||
setStatusBits(AP_HAS_IP6_BIT);
|
||||
} else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_STA){
|
||||
setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT);
|
||||
} else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_ETH){
|
||||
setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP6_BIT);
|
||||
}
|
||||
}
|
||||
|
||||
@ -357,8 +438,11 @@ esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event)
|
||||
*/
|
||||
int32_t WiFiGenericClass::channel(void)
|
||||
{
|
||||
uint8_t primaryChan;
|
||||
wifi_second_chan_t secondChan;
|
||||
uint8_t primaryChan = 0;
|
||||
wifi_second_chan_t secondChan = WIFI_SECOND_CHAN_NONE;
|
||||
if(!lowLevelInitDone){
|
||||
return primaryChan;
|
||||
}
|
||||
esp_wifi_get_channel(&primaryChan, &secondChan);
|
||||
return primaryChan;
|
||||
}
|
||||
@ -380,19 +464,15 @@ void WiFiGenericClass::persistent(bool persistent)
|
||||
*/
|
||||
bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
{
|
||||
if (!_esp_wifi_started) {
|
||||
wifiLowLevelInit(_persistent);
|
||||
}
|
||||
wifi_mode_t cm = getMode();
|
||||
if(cm == WIFI_MODE_MAX){
|
||||
return false;
|
||||
}
|
||||
if(cm == m) {
|
||||
return true;
|
||||
}
|
||||
if(m){
|
||||
espWiFiStart(_persistent);
|
||||
} else {
|
||||
if(!cm && m){
|
||||
if(!espWiFiStart(_persistent)){
|
||||
return false;
|
||||
}
|
||||
} else if(cm && !m){
|
||||
return espWiFiStop();
|
||||
}
|
||||
|
||||
@ -402,10 +482,7 @@ bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
log_e("Could not set mode! %u", err);
|
||||
return false;
|
||||
}
|
||||
if(m){
|
||||
return espWiFiStart(_persistent);
|
||||
}
|
||||
return espWiFiStop();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -414,13 +491,15 @@ bool WiFiGenericClass::mode(wifi_mode_t m)
|
||||
*/
|
||||
wifi_mode_t WiFiGenericClass::getMode()
|
||||
{
|
||||
if(!wifiLowLevelInit(_persistent)){
|
||||
return WIFI_MODE_MAX;
|
||||
|
||||
if(!_esp_wifi_started){
|
||||
return WIFI_MODE_NULL;
|
||||
}
|
||||
uint8_t mode;
|
||||
esp_wifi_get_mode((wifi_mode_t*)&mode);
|
||||
return (wifi_mode_t)mode;
|
||||
wifi_mode_t mode;
|
||||
if(esp_wifi_get_mode(&mode) == ESP_ERR_WIFI_NOT_INIT){
|
||||
log_w("WiFi not started");
|
||||
return WIFI_MODE_NULL;
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -437,12 +516,10 @@ bool WiFiGenericClass::enableSTA(bool enable)
|
||||
if(isEnabled != enable) {
|
||||
if(enable) {
|
||||
return mode((wifi_mode_t)(currentMode | WIFI_MODE_STA));
|
||||
} else {
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_STA)));
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_STA)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -459,21 +536,72 @@ bool WiFiGenericClass::enableAP(bool enable)
|
||||
if(isEnabled != enable) {
|
||||
if(enable) {
|
||||
return mode((wifi_mode_t)(currentMode | WIFI_MODE_AP));
|
||||
} else {
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_AP)));
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_AP)));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* control modem sleep when only in STA mode
|
||||
* @param enable bool
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiGenericClass::setSleep(bool enable)
|
||||
{
|
||||
if((getMode() & WIFI_MODE_STA) == 0){
|
||||
log_w("STA has not been started");
|
||||
return false;
|
||||
}
|
||||
return esp_wifi_set_ps(enable?WIFI_PS_MIN_MODEM:WIFI_PS_NONE) == ESP_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* get modem sleep enabled
|
||||
* @return true if modem sleep is enabled
|
||||
*/
|
||||
bool WiFiGenericClass::getSleep()
|
||||
{
|
||||
wifi_ps_type_t ps;
|
||||
if((getMode() & WIFI_MODE_STA) == 0){
|
||||
log_w("STA has not been started");
|
||||
return false;
|
||||
}
|
||||
if(esp_wifi_get_ps(&ps) == ESP_OK){
|
||||
return ps == WIFI_PS_MIN_MODEM;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* control wifi tx power
|
||||
* @param power enum maximum wifi tx power
|
||||
* @return ok
|
||||
*/
|
||||
bool WiFiGenericClass::setTxPower(wifi_power_t power){
|
||||
if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){
|
||||
log_w("Neither AP or STA has been started");
|
||||
return false;
|
||||
}
|
||||
return esp_wifi_set_max_tx_power(power) == ESP_OK;
|
||||
}
|
||||
|
||||
wifi_power_t WiFiGenericClass::getTxPower(){
|
||||
int8_t power;
|
||||
if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){
|
||||
log_w("Neither AP or STA has been started");
|
||||
return WIFI_POWER_19_5dBm;
|
||||
}
|
||||
if(esp_wifi_get_max_tx_power(&power)){
|
||||
return WIFI_POWER_19_5dBm;
|
||||
}
|
||||
return (wifi_power_t)power;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
// ------------------------------------------------ Generic Network function ---------------------------------------------
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
static bool _dns_busy = false;
|
||||
|
||||
/**
|
||||
* DNS callback
|
||||
* @param name
|
||||
@ -485,7 +613,7 @@ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, v
|
||||
if(ipaddr) {
|
||||
(*reinterpret_cast<IPAddress*>(callback_arg)) = ipaddr->u_addr.ip4.addr;
|
||||
}
|
||||
_dns_busy = false;
|
||||
xEventGroupSetBits(_network_event_group, WIFI_DNS_DONE_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -499,20 +627,19 @@ int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult)
|
||||
{
|
||||
ip_addr_t addr;
|
||||
aResult = static_cast<uint32_t>(0);
|
||||
|
||||
_dns_busy = true;
|
||||
waitStatusBits(WIFI_DNS_IDLE_BIT, 5000);
|
||||
clearStatusBits(WIFI_DNS_IDLE_BIT);
|
||||
err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult);
|
||||
if(err == ERR_OK && addr.u_addr.ip4.addr) {
|
||||
aResult = addr.u_addr.ip4.addr;
|
||||
_dns_busy = false;
|
||||
} else if(err == ERR_INPROGRESS) {
|
||||
while(_dns_busy){
|
||||
delay(1);
|
||||
}
|
||||
} else {
|
||||
_dns_busy = false;
|
||||
return 0;
|
||||
waitStatusBits(WIFI_DNS_DONE_BIT, 4000);
|
||||
clearStatusBits(WIFI_DNS_DONE_BIT);
|
||||
}
|
||||
return 1;
|
||||
setStatusBits(WIFI_DNS_IDLE_BIT);
|
||||
if((uint32_t)aResult == 0){
|
||||
log_e("DNS Failed for %s", aHostname);
|
||||
}
|
||||
return (uint32_t)aResult != 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user