main/task_wifi.c

changeset 47
1ab1f4a8c328
parent 44
e52d11b8f252
child 48
d43ea0c916de
--- 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(;;) */

mercurial