diff -r 2cf4b15895f2 -r 1ab1f4a8c328 main/task_wifi.c --- a/main/task_wifi.c Sat Jan 25 12:02:22 2020 +0100 +++ b/main/task_wifi.c Sat Mar 14 13:07:02 2020 +0100 @@ -34,14 +34,13 @@ const int TASK_WIFI_REQUEST_WIFI_SCAN = BIT0; ///< When set, means a client requested to scan wireless networks. const int TASK_WIFI_REQUEST_STA_DISCONNECT = BIT1; ///< When set, means a client requested to disconnect from currently connected AP. const int TASK_WIFI_REQUEST_STA_CONNECT = BIT2; ///< When set, means a client requested to connect to an access point. +const int TASK_WIFI_REQUEST_STA_STATUS = BIT8; const int TASK_WIFI_HAS_IP = BIT3; ///< Indicate that we have an IP address const int TASK_WIFI_STA_FAILED = BIT4; ///< Indicate that we could not get a connection to AP as station. const int TASK_WIFI_STA_DISCONNECTED = BIT5; ///< Indicate that we are disconnected from an ap station. const int TASK_WIFI_STA_CONNECTED = BIT6; ///< Indicate that we are connected to AP as station, flip of BIT6. -const int TASK_WIFI_REQUEST_SYSTEM = BIT8; ///< The system needs a connection -const int TASK_WIFI_REQUEST_USER = BIT9; ///< The user needs a connection /** @@ -53,37 +52,6 @@ /****************************************************************************/ - -void requestWiFi_system(bool state) -{ - if (state) - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_SYSTEM); - else - xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_REQUEST_SYSTEM); - - if (xEventGroupGetBits(xEventGroupWifi) & (TASK_WIFI_REQUEST_SYSTEM | TASK_WIFI_REQUEST_USER)) - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); - else - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_DISCONNECT); -} - - - -void requestWiFi_user(bool state) -{ - if (state) - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_USER); - else - xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_REQUEST_USER); - - if (xEventGroupGetBits(xEventGroupWifi) & (TASK_WIFI_REQUEST_SYSTEM | TASK_WIFI_REQUEST_USER)) - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); - else - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_DISCONNECT); -} - - - bool ready_WiFi(void) { if (wifi_state->STA_connected && wifi_state->STA_online) @@ -93,6 +61,13 @@ +void status_WiFi(void) +{ + xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_STATUS); +} + + + static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { switch (event_id) { @@ -105,11 +80,11 @@ break; case WIFI_EVENT_STA_START: - ESP_LOGI(TAG, "Event wifi START"); - // Set the configured hostname for the dhcp client. - ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname)); - esp_wifi_connect(); - break; + ESP_LOGI(TAG, "Event wifi START"); + // Set the configured hostname for the dhcp client. + ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname)); + esp_wifi_connect(); + break; case WIFI_EVENT_STA_CONNECTED: { @@ -145,8 +120,49 @@ } else { ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_DISCONNECTED"); } + connect_mqtt(false); xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); + + //if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && ! _wifi_ScanAPs) { + // ESP_LOGI(TAG, "Request scan for another AP"); + // _wifi_ScanAPs = true; + // _wifi_ScanDone = false; + // ap_num = MAX_AP_NUM; + // ESP_ERROR_CHECK(esp_wifi_scan_start(&scan_config, false)); + // xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); // Keep looping active. + // break; + //} + + //if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && _wifi_ScanAPs && _wifi_ScanDone) { + // ESP_LOGD(TAG, "Scan completed, look for another AP, found:%d", _wifi_Scanned); + // _wifi_ScanAPs = false; + // _wifi_ScanDone = false; + // for (int i = 0; i < _wifi_Scanned; i++) { + // ap = accessp_records[i]; + // if ((read_station(ap.ssid) != -1)) { + // if (wifiStation.hide) { + // continue; // Blacklisted. + // } + /* We know this one */ + // wifi_config_t* config = task_wifi_ConfigSTA; + // memset(config, 0x00, sizeof(wifi_config_t)); + // memcpy(config->sta.ssid, wifiStation.SSID, strlen(wifiStation.SSID)); + // memcpy(config->sta.password, wifiStation.Password, strlen(wifiStation.Password)); + // ESP_LOGD(TAG, "new AP %s %s", wifiStation.SSID, wifiStation.Password); + // xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); + // break; + // } + // } + // break; + //} + + /* + * Reconnect previous AP. + */ + //if (FetchStaConfig()) { + // xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); + //} break; } @@ -163,36 +179,42 @@ switch (event_id) { case IP_EVENT_STA_GOT_IP: - xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP); - ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; - if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { - wifi_state->STA_online = true; - snprintf(wifi_state->STA_ip, 16, "%s", ip4addr_ntoa(&event->ip_info.ip)); - snprintf(wifi_state->STA_nm, 16, "%s", ip4addr_ntoa(&event->ip_info.netmask)); - snprintf(wifi_state->STA_gw, 16, "%s", ip4addr_ntoa(&event->ip_info.gw)); - xSemaphoreGive(xSemaphoreWiFi); - } else { - ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_GOT_IP"); - } - break; + xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP); + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { + wifi_state->STA_online = true; + snprintf(wifi_state->STA_ip, 16, "%s", ip4addr_ntoa(&event->ip_info.ip)); + snprintf(wifi_state->STA_nm, 16, "%s", ip4addr_ntoa(&event->ip_info.netmask)); + snprintf(wifi_state->STA_gw, 16, "%s", ip4addr_ntoa(&event->ip_info.gw)); + xSemaphoreGive(xSemaphoreWiFi); + } else { + ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_GOT_IP"); + } + connect_mqtt(true); + break; case IP_EVENT_STA_LOST_IP: - ESP_LOGW(TAG, "Lost IP address"); - xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP); - if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { - wifi_state->STA_ip[0] = '\0'; - wifi_state->STA_nm[0] = '\0'; - wifi_state->STA_gw[0] = '\0'; - wifi_state->STA_online = false; - xSemaphoreGive(xSemaphoreWiFi); - } else { - ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_LOST_IP"); - } - break; + ESP_LOGW(TAG, "Lost IP address"); + xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP); + if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { + wifi_state->STA_ip[0] = '\0'; + wifi_state->STA_nm[0] = '\0'; + wifi_state->STA_gw[0] = '\0'; + wifi_state->STA_online = false; + xSemaphoreGive(xSemaphoreWiFi); + } else { + ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_LOST_IP"); + } + connect_mqtt(false); + break; + + case IP_EVENT_AP_STAIPASSIGNED: + ESP_LOGI(TAG, "IP_EVENT_AP_STAIPASSIGNED"); + break; default: - ESP_LOGW(TAG, "Unknown IP event %d", event_id); - break; + ESP_LOGW(TAG, "Unknown IP event %d", event_id); + break; } } @@ -230,12 +252,13 @@ ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config)); ESP_ERROR_CHECK( esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL) ); - ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &got_ip_event_handler, NULL) ); + ESP_ERROR_CHECK( esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &got_ip_event_handler, NULL) ); ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_start()); + xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); EventBits_t uxBits; @@ -243,13 +266,14 @@ /* actions that can trigger: request a connection, a scan, or a disconnection */ uxBits = xEventGroupWaitBits(xEventGroupWifi, - TASK_WIFI_REQUEST_STA_CONNECT | TASK_WIFI_REQUEST_WIFI_SCAN | TASK_WIFI_REQUEST_STA_DISCONNECT, + TASK_WIFI_REQUEST_STA_CONNECT | TASK_WIFI_REQUEST_WIFI_SCAN | TASK_WIFI_REQUEST_STA_DISCONNECT | TASK_WIFI_REQUEST_STA_STATUS, pdFALSE, pdFALSE, portMAX_DELAY ); if (uxBits & TASK_WIFI_REQUEST_STA_DISCONNECT) { /* * user requested a disconnect, this will in effect disconnect the wifi */ + connect_mqtt(false); ESP_LOGD(TAG, "Request STA disconnect"); ESP_ERROR_CHECK(esp_wifi_disconnect()); xEventGroupWaitBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED, pdFALSE, pdTRUE, portMAX_DELAY ); @@ -305,6 +329,21 @@ ESP_LOGI(TAG, "No known AP found, scan again"); vTaskDelay(3000 / portTICK_PERIOD_MS); } + } else if (uxBits & TASK_WIFI_REQUEST_STA_STATUS) { + /* + * Request WiFi update status, refresh the rssi. + */ + xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_STATUS); + wifi_ap_record_t ap_info; + esp_wifi_sta_get_ap_info(&ap_info); + ESP_LOGI(TAG, "Event STA status, ssid:%s, bssid:" MACSTR ", rssi: %d", ap_info.ssid, MAC2STR(ap_info.bssid), ap_info.rssi); + if (xSemaphoreTake(xSemaphoreWiFi, 35) == pdTRUE) { + wifi_state->STA_rssi = ap_info.rssi; + xSemaphoreGive(xSemaphoreWiFi); + } else { + ESP_LOGE(TAG, "lock error TASK_WIFI_REQUEST_STA_STATUS"); + } + user_refresh(); } } /* for(;;) */