main/task_wifi.c

changeset 70
d6838a268020
parent 62
2e90ada37476
child 71
7a4446a77d09
--- a/main/task_wifi.c	Sun Sep 22 18:32:31 2019 +0200
+++ b/main/task_wifi.c	Sun Nov 24 16:44:00 2019 +0100
@@ -144,51 +144,54 @@
 
 
 
-esp_err_t task_wifi_EventHandler(void *ctx, system_event_t *event)
+static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
 {
-    switch(event->event_id) {
-	case SYSTEM_EVENT_SCAN_DONE:
+    switch(event_id) {
+	case WIFI_EVENT_SCAN_DONE:
 		// Get the results so the memory used is freed.
 		ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, accessp_records));
 		_wifi_Scanned = ap_num;
 		_wifi_ScanDone = true;
 		break;
 
-	case SYSTEM_EVENT_STA_START:
+	case WIFI_EVENT_STA_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;
 
-	//   SYSTEM_EVENT_STA_STOP		3
-	case SYSTEM_EVENT_STA_CONNECTED: {
-		const system_event_sta_connected_t *connected = &event->event_info.connected;
-            	ESP_LOGI(TAG, "Event STA connected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", channel:%d, authmode:%s",
-                       connected->ssid, connected->ssid_len, MAC2STR(connected->bssid), connected->channel, apsec[connected->authmode]);
+	case WIFI_EVENT_STA_CONNECTED: {
+		system_event_sta_connected_t* event = (wifi_event_sta_connected_t*) event_data;
 		wifi_ap_record_t ap_info;
-		esp_wifi_sta_get_ap_info(&ap_info);
+                esp_wifi_sta_get_ap_info(&ap_info);
+            	ESP_LOGI(TAG, "Event STA connected, ssid:%s, bssid:" MACSTR ", channel:%d, rssi: %d, authmode:%s",
+                       ap_info.ssid, MAC2STR(ap_info.bssid), event->channel, ap_info.rssi, apsec[event->authmode]);
 		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    wifi_state->STA_connected = true;
 		    wifi_state->STA_rssi = ap_info.rssi;
 		    sprintf(wifi_state->STA_ssid, "%s", ap_info.ssid);
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_CONNECTED");
+                }
 		xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED);
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED);
 		break;
 	}
-	case SYSTEM_EVENT_STA_DISCONNECTED: {
-		const system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected;
+	case WIFI_EVENT_STA_DISCONNECTED: {
+		wifi_event_sta_disconnected_t* disconnected = (wifi_event_sta_disconnected_t*) event_data;
 		wifi_ap_record_t    ap;
 
             	ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d",
                        disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason);
-		if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
+		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    wifi_state->STA_connected = false;
 		    wifi_state->STA_online = false;
 		    wifi_state->STA_rssi = 0;
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_DISCONNECTED");
+                }
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED);
 		xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED);
 		sntp_stop();
@@ -233,116 +236,122 @@
 		}
 		break;
 	}
-	//   SYSTEM_EVENT_STA_AUTHMODE_CHANGE	6
-	case SYSTEM_EVENT_STA_GOT_IP:
-		xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
-		tcpip_adapter_ip_info_t ip;
-		memset(&ip, 0, sizeof(tcpip_adapter_ip_info_t));
-		if (tcpip_adapter_get_ip_info(ESP_IF_WIFI_STA, &ip) == 0) {
-		    if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
-			wifi_state->STA_online = true;
-		    	snprintf(wifi_state->STA_ip, 16, IPSTR, IP2STR(&ip.ip));
-			snprintf(wifi_state->STA_nm, 16, IPSTR, IP2STR(&ip.netmask));
-			snprintf(wifi_state->STA_gw, 16, IPSTR, IP2STR(&ip.gw));
-		    	xSemaphoreGive(xSemaphoreWiFi);
-		    }
-		}
-		/*
-		 * There doesn't seem to be support for configuring NTP via DHCP so
-		 * we need to hardcode the ntp servers. The preffered server can be
-		 * set via the setup screen. It should be on your LAN, else leave it
-		 * empty. And if you are on a different lan someday, there is no extra
-		 * delay because the hostname will not be found. 
-		 */
-		sntp_stop();
-		if (strlen(config.ntp_server))
-		    sntp_setservername(0, config.ntp_server);
-		sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby
-                sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED);
-                sntp_set_time_sync_notification_cb(time_sync_notification_cb);
-                sntp_init();
-#if 0
-		if (strlen(config.ntp_server))
-                    ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0));
-		ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1));
-#endif
-		break;
-
-	case SYSTEM_EVENT_STA_LOST_IP:
-		ESP_LOGW(TAG, "Lost IP address");
-		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
-		if (xSemaphoreTake(xSemaphoreWiFi, 10) == 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);
-		}
-		sntp_stop();
-		break;
-
-	//   SYSTEM_EVENT_STA_WPS_ER_SUCCESS	9
-	//   SYSTEM_EVENT_STA_WPS_ER_FAILED	10
-	//   SYSTEM_EVENT_STA_WPS_ER_TIMEOUT	11
-	//   SYSTEM_EVENT_STA_WPS_ER_PIN	12
-
-    	case SYSTEM_EVENT_AP_START:
+    	case WIFI_EVENT_AP_START:
     		xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_AP_STARTED);
 		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    wifi_state->AP_active = true;
 		    wifi_state->AP_clients = 0;
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_START");
+                }
 		break;
 
-	case SYSTEM_EVENT_AP_STOP:
+	case WIFI_EVENT_AP_STOP:
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_AP_STARTED);
 		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    wifi_state->AP_active = false;
 		    wifi_state->AP_clients = 0;
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STOP");
+                }
 		break;
 
-    	case SYSTEM_EVENT_AP_STACONNECTED: {
+    	case WIFI_EVENT_AP_STACONNECTED: {
 		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    wifi_state->AP_clients++;
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
-		const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected;
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STACONNECTED");
+                }
+		wifi_event_ap_staconnected_t* staconnected = (wifi_event_ap_staconnected_t*) event_data;
+//		const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected;
             	ESP_LOGI(TAG, "Event AP connected, mac:" MACSTR ", aid:%d, conns:%d",
                        MAC2STR(staconnected->mac), staconnected->aid, wifi_state->AP_clients);
 		break;
 	}
-    	case SYSTEM_EVENT_AP_STADISCONNECTED: {
+    	case WIFI_EVENT_AP_STADISCONNECTED: {
 		if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) {
 		    if (wifi_state->AP_clients > 0)
 		    	wifi_state->AP_clients--;
 		    else
 		    	wifi_state->AP_clients = 0;
 		    xSemaphoreGive(xSemaphoreWiFi);
-		}
-		const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected;
+		} else {
+                    ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STADISCONNECTED");
+                }
+		wifi_event_ap_stadisconnected_t* stadisconnected = (wifi_event_ap_stadisconnected_t*) event_data;
+//		const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected;
             	ESP_LOGI(TAG, "Event AP disconnected, mac:" MACSTR ", aid:%d, conns:%d",
                        MAC2STR(stadisconnected->mac), stadisconnected->aid, wifi_state->AP_clients);
 		break;
 	}
-	case SYSTEM_EVENT_AP_STAIPASSIGNED:
-		break;
-
-	//   SYSTEM_EVENT_AP_PROBEREQRECVED	18
-	//   SYSTEM_EVENT_GOT_IP6		19
-	//   SYSTEM_EVENT_ETH_START		20
-	//   SYSTEM_EVENT_ETH_STOP		21
-	//   SYSTEM_EVENT_ETH_CONNECTED		22
-	//   SYSTEM_EVENT_ETH_DISCONNECTED	23
-	//   SYSTEM_EVENT_ETH_GOT_IP		24
-
 	default:
-		printf("Unknown event %d\n", event->event_id);
+		ESP_LOGW(TAG, "Unknown WiFi event %d", event_id);
         	break;
     }
-    return ESP_OK;
+}
+
+
+
+static void got_ip_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
+{
+    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");
+            	}
+
+                /*
+                 * There doesn't seem to be support for configuring NTP via DHCP so
+                 * we need to hardcode the ntp servers. The preffered server can be
+                 * set via the setup screen. It should be on your LAN, else leave it
+                 * empty. And if you are on a different lan someday, there is no extra
+                 * delay because the hostname will not be found. 
+                 */
+                sntp_stop();
+                if (strlen(config.ntp_server))
+                    sntp_setservername(0, config.ntp_server);
+                sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby
+                sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED);
+                sntp_set_time_sync_notification_cb(time_sync_notification_cb);
+                sntp_init();
+#if 0
+                if (strlen(config.ntp_server))
+                    ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0));
+                ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1));
+#endif
+                break;
+
+        case SYSTEM_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");
+            	}
+                sntp_stop();
+                break;
+
+        default:
+            ESP_LOGW(TAG, "Unknown IP event %d", event_id);
+            break;
+    }
 }
 
 
@@ -384,7 +393,7 @@
     xEventGroupWifi = xEventGroupCreate();
     /* initialize the tcp stack */
     tcpip_adapter_init();
-    ESP_ERROR_CHECK(esp_event_loop_init(task_wifi_EventHandler, NULL));
+    ESP_ERROR_CHECK(esp_event_loop_create_default());
 
     /*
      * memory allocation of objects used by the task 
@@ -429,11 +438,15 @@
      */
     wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
     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_wifi_set_storage(WIFI_STORAGE_RAM));
     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
     ESP_ERROR_CHECK(esp_wifi_set_bandwidth(WIFI_IF_AP, config.ap_bandwidth));
 
-    // configure the softAP and start it */
+    /* configure the softAP and start it */
     wifi_config_t ap_config = {
 	.ap = {
 	    .ssid_len = 0,

mercurial