142 return false; |
142 return false; |
143 } |
143 } |
144 |
144 |
145 |
145 |
146 |
146 |
147 esp_err_t task_wifi_EventHandler(void *ctx, system_event_t *event) |
147 static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) |
148 { |
148 { |
149 switch(event->event_id) { |
149 switch(event_id) { |
150 case SYSTEM_EVENT_SCAN_DONE: |
150 case WIFI_EVENT_SCAN_DONE: |
151 // Get the results so the memory used is freed. |
151 // Get the results so the memory used is freed. |
152 ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, accessp_records)); |
152 ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_num, accessp_records)); |
153 _wifi_Scanned = ap_num; |
153 _wifi_Scanned = ap_num; |
154 _wifi_ScanDone = true; |
154 _wifi_ScanDone = true; |
155 break; |
155 break; |
156 |
156 |
157 case SYSTEM_EVENT_STA_START: |
157 case WIFI_EVENT_STA_START: |
158 // Set the configured hostname for the dhcp client. |
158 // Set the configured hostname for the dhcp client. |
159 ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname)); |
159 ESP_ERROR_CHECK(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, config.hostname)); |
160 esp_wifi_connect(); |
160 esp_wifi_connect(); |
161 break; |
161 break; |
162 |
162 |
163 // SYSTEM_EVENT_STA_STOP 3 |
163 case WIFI_EVENT_STA_CONNECTED: { |
164 case SYSTEM_EVENT_STA_CONNECTED: { |
164 system_event_sta_connected_t* event = (wifi_event_sta_connected_t*) event_data; |
165 const system_event_sta_connected_t *connected = &event->event_info.connected; |
|
166 ESP_LOGI(TAG, "Event STA connected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", channel:%d, authmode:%s", |
|
167 connected->ssid, connected->ssid_len, MAC2STR(connected->bssid), connected->channel, apsec[connected->authmode]); |
|
168 wifi_ap_record_t ap_info; |
165 wifi_ap_record_t ap_info; |
169 esp_wifi_sta_get_ap_info(&ap_info); |
166 esp_wifi_sta_get_ap_info(&ap_info); |
|
167 ESP_LOGI(TAG, "Event STA connected, ssid:%s, bssid:" MACSTR ", channel:%d, rssi: %d, authmode:%s", |
|
168 ap_info.ssid, MAC2STR(ap_info.bssid), event->channel, ap_info.rssi, apsec[event->authmode]); |
170 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
169 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
171 wifi_state->STA_connected = true; |
170 wifi_state->STA_connected = true; |
172 wifi_state->STA_rssi = ap_info.rssi; |
171 wifi_state->STA_rssi = ap_info.rssi; |
173 sprintf(wifi_state->STA_ssid, "%s", ap_info.ssid); |
172 sprintf(wifi_state->STA_ssid, "%s", ap_info.ssid); |
174 xSemaphoreGive(xSemaphoreWiFi); |
173 xSemaphoreGive(xSemaphoreWiFi); |
175 } |
174 } else { |
|
175 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_CONNECTED"); |
|
176 } |
176 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); |
177 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); |
177 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); |
178 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); |
178 break; |
179 break; |
179 } |
180 } |
180 case SYSTEM_EVENT_STA_DISCONNECTED: { |
181 case WIFI_EVENT_STA_DISCONNECTED: { |
181 const system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected; |
182 wifi_event_sta_disconnected_t* disconnected = (wifi_event_sta_disconnected_t*) event_data; |
182 wifi_ap_record_t ap; |
183 wifi_ap_record_t ap; |
183 |
184 |
184 ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d", |
185 ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d", |
185 disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason); |
186 disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason); |
186 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) { |
187 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
187 wifi_state->STA_connected = false; |
188 wifi_state->STA_connected = false; |
188 wifi_state->STA_online = false; |
189 wifi_state->STA_online = false; |
189 wifi_state->STA_rssi = 0; |
190 wifi_state->STA_rssi = 0; |
190 xSemaphoreGive(xSemaphoreWiFi); |
191 xSemaphoreGive(xSemaphoreWiFi); |
191 } |
192 } else { |
|
193 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_STA_DISCONNECTED"); |
|
194 } |
192 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); |
195 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_STA_CONNECTED); |
193 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); |
196 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_STA_DISCONNECTED); |
194 sntp_stop(); |
197 sntp_stop(); |
195 |
198 |
196 if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && ! _wifi_ScanAPs) { |
199 if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && ! _wifi_ScanAPs) { |
231 if (FetchStaConfig()) { |
234 if (FetchStaConfig()) { |
232 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); |
235 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT); |
233 } |
236 } |
234 break; |
237 break; |
235 } |
238 } |
236 // SYSTEM_EVENT_STA_AUTHMODE_CHANGE 6 |
239 case WIFI_EVENT_AP_START: |
237 case SYSTEM_EVENT_STA_GOT_IP: |
|
238 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP); |
|
239 tcpip_adapter_ip_info_t ip; |
|
240 memset(&ip, 0, sizeof(tcpip_adapter_ip_info_t)); |
|
241 if (tcpip_adapter_get_ip_info(ESP_IF_WIFI_STA, &ip) == 0) { |
|
242 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) { |
|
243 wifi_state->STA_online = true; |
|
244 snprintf(wifi_state->STA_ip, 16, IPSTR, IP2STR(&ip.ip)); |
|
245 snprintf(wifi_state->STA_nm, 16, IPSTR, IP2STR(&ip.netmask)); |
|
246 snprintf(wifi_state->STA_gw, 16, IPSTR, IP2STR(&ip.gw)); |
|
247 xSemaphoreGive(xSemaphoreWiFi); |
|
248 } |
|
249 } |
|
250 /* |
|
251 * There doesn't seem to be support for configuring NTP via DHCP so |
|
252 * we need to hardcode the ntp servers. The preffered server can be |
|
253 * set via the setup screen. It should be on your LAN, else leave it |
|
254 * empty. And if you are on a different lan someday, there is no extra |
|
255 * delay because the hostname will not be found. |
|
256 */ |
|
257 sntp_stop(); |
|
258 if (strlen(config.ntp_server)) |
|
259 sntp_setservername(0, config.ntp_server); |
|
260 sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby |
|
261 sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED); |
|
262 sntp_set_time_sync_notification_cb(time_sync_notification_cb); |
|
263 sntp_init(); |
|
264 #if 0 |
|
265 if (strlen(config.ntp_server)) |
|
266 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0)); |
|
267 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1)); |
|
268 #endif |
|
269 break; |
|
270 |
|
271 case SYSTEM_EVENT_STA_LOST_IP: |
|
272 ESP_LOGW(TAG, "Lost IP address"); |
|
273 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP); |
|
274 if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) { |
|
275 wifi_state->STA_ip[0] = '\0'; |
|
276 wifi_state->STA_nm[0] = '\0'; |
|
277 wifi_state->STA_gw[0] = '\0'; |
|
278 wifi_state->STA_online = false; |
|
279 xSemaphoreGive(xSemaphoreWiFi); |
|
280 } |
|
281 sntp_stop(); |
|
282 break; |
|
283 |
|
284 // SYSTEM_EVENT_STA_WPS_ER_SUCCESS 9 |
|
285 // SYSTEM_EVENT_STA_WPS_ER_FAILED 10 |
|
286 // SYSTEM_EVENT_STA_WPS_ER_TIMEOUT 11 |
|
287 // SYSTEM_EVENT_STA_WPS_ER_PIN 12 |
|
288 |
|
289 case SYSTEM_EVENT_AP_START: |
|
290 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); |
240 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); |
291 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
241 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
292 wifi_state->AP_active = true; |
242 wifi_state->AP_active = true; |
293 wifi_state->AP_clients = 0; |
243 wifi_state->AP_clients = 0; |
294 xSemaphoreGive(xSemaphoreWiFi); |
244 xSemaphoreGive(xSemaphoreWiFi); |
295 } |
245 } else { |
|
246 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_START"); |
|
247 } |
296 break; |
248 break; |
297 |
249 |
298 case SYSTEM_EVENT_AP_STOP: |
250 case WIFI_EVENT_AP_STOP: |
299 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); |
251 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_AP_STARTED); |
300 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
252 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
301 wifi_state->AP_active = false; |
253 wifi_state->AP_active = false; |
302 wifi_state->AP_clients = 0; |
254 wifi_state->AP_clients = 0; |
303 xSemaphoreGive(xSemaphoreWiFi); |
255 xSemaphoreGive(xSemaphoreWiFi); |
304 } |
256 } else { |
|
257 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STOP"); |
|
258 } |
305 break; |
259 break; |
306 |
260 |
307 case SYSTEM_EVENT_AP_STACONNECTED: { |
261 case WIFI_EVENT_AP_STACONNECTED: { |
308 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
262 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
309 wifi_state->AP_clients++; |
263 wifi_state->AP_clients++; |
310 xSemaphoreGive(xSemaphoreWiFi); |
264 xSemaphoreGive(xSemaphoreWiFi); |
311 } |
265 } else { |
312 const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected; |
266 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STACONNECTED"); |
|
267 } |
|
268 wifi_event_ap_staconnected_t* staconnected = (wifi_event_ap_staconnected_t*) event_data; |
|
269 // const system_event_ap_staconnected_t *staconnected = &event->event_info.sta_connected; |
313 ESP_LOGI(TAG, "Event AP connected, mac:" MACSTR ", aid:%d, conns:%d", |
270 ESP_LOGI(TAG, "Event AP connected, mac:" MACSTR ", aid:%d, conns:%d", |
314 MAC2STR(staconnected->mac), staconnected->aid, wifi_state->AP_clients); |
271 MAC2STR(staconnected->mac), staconnected->aid, wifi_state->AP_clients); |
315 break; |
272 break; |
316 } |
273 } |
317 case SYSTEM_EVENT_AP_STADISCONNECTED: { |
274 case WIFI_EVENT_AP_STADISCONNECTED: { |
318 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
275 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
319 if (wifi_state->AP_clients > 0) |
276 if (wifi_state->AP_clients > 0) |
320 wifi_state->AP_clients--; |
277 wifi_state->AP_clients--; |
321 else |
278 else |
322 wifi_state->AP_clients = 0; |
279 wifi_state->AP_clients = 0; |
323 xSemaphoreGive(xSemaphoreWiFi); |
280 xSemaphoreGive(xSemaphoreWiFi); |
324 } |
281 } else { |
325 const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected; |
282 ESP_LOGE(TAG, "wifi_event_handler() lock error WIFI_EVENT_AP_STADISCONNECTED"); |
|
283 } |
|
284 wifi_event_ap_stadisconnected_t* stadisconnected = (wifi_event_ap_stadisconnected_t*) event_data; |
|
285 // const system_event_ap_stadisconnected_t *stadisconnected = &event->event_info.sta_disconnected; |
326 ESP_LOGI(TAG, "Event AP disconnected, mac:" MACSTR ", aid:%d, conns:%d", |
286 ESP_LOGI(TAG, "Event AP disconnected, mac:" MACSTR ", aid:%d, conns:%d", |
327 MAC2STR(stadisconnected->mac), stadisconnected->aid, wifi_state->AP_clients); |
287 MAC2STR(stadisconnected->mac), stadisconnected->aid, wifi_state->AP_clients); |
328 break; |
288 break; |
329 } |
289 } |
330 case SYSTEM_EVENT_AP_STAIPASSIGNED: |
|
331 break; |
|
332 |
|
333 // SYSTEM_EVENT_AP_PROBEREQRECVED 18 |
|
334 // SYSTEM_EVENT_GOT_IP6 19 |
|
335 // SYSTEM_EVENT_ETH_START 20 |
|
336 // SYSTEM_EVENT_ETH_STOP 21 |
|
337 // SYSTEM_EVENT_ETH_CONNECTED 22 |
|
338 // SYSTEM_EVENT_ETH_DISCONNECTED 23 |
|
339 // SYSTEM_EVENT_ETH_GOT_IP 24 |
|
340 |
|
341 default: |
290 default: |
342 printf("Unknown event %d\n", event->event_id); |
291 ESP_LOGW(TAG, "Unknown WiFi event %d", event_id); |
343 break; |
292 break; |
344 } |
293 } |
345 return ESP_OK; |
294 } |
|
295 |
|
296 |
|
297 |
|
298 static void got_ip_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) |
|
299 { |
|
300 switch (event_id) { |
|
301 |
|
302 case IP_EVENT_STA_GOT_IP: |
|
303 xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_HAS_IP); |
|
304 ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; |
|
305 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
|
306 wifi_state->STA_online = true; |
|
307 snprintf(wifi_state->STA_ip, 16, "%s", ip4addr_ntoa(&event->ip_info.ip)); |
|
308 snprintf(wifi_state->STA_nm, 16, "%s", ip4addr_ntoa(&event->ip_info.netmask)); |
|
309 snprintf(wifi_state->STA_gw, 16, "%s", ip4addr_ntoa(&event->ip_info.gw)); |
|
310 xSemaphoreGive(xSemaphoreWiFi); |
|
311 } else { |
|
312 ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_GOT_IP"); |
|
313 } |
|
314 |
|
315 /* |
|
316 * There doesn't seem to be support for configuring NTP via DHCP so |
|
317 * we need to hardcode the ntp servers. The preffered server can be |
|
318 * set via the setup screen. It should be on your LAN, else leave it |
|
319 * empty. And if you are on a different lan someday, there is no extra |
|
320 * delay because the hostname will not be found. |
|
321 */ |
|
322 sntp_stop(); |
|
323 if (strlen(config.ntp_server)) |
|
324 sntp_setservername(0, config.ntp_server); |
|
325 sntp_setservername(1, (char *)"pool.ntp.org"); // Will get you servers nearby |
|
326 sntp_set_sync_mode(SNTP_SYNC_MODE_IMMED); |
|
327 sntp_set_time_sync_notification_cb(time_sync_notification_cb); |
|
328 sntp_init(); |
|
329 #if 0 |
|
330 if (strlen(config.ntp_server)) |
|
331 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(0)); |
|
332 ESP_LOGI(TAG, "NTP server %s", sntp_getservername(1)); |
|
333 #endif |
|
334 break; |
|
335 |
|
336 case SYSTEM_EVENT_STA_LOST_IP: |
|
337 ESP_LOGW(TAG, "Lost IP address"); |
|
338 xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP); |
|
339 if (xSemaphoreTake(xSemaphoreWiFi, 25) == pdTRUE) { |
|
340 wifi_state->STA_ip[0] = '\0'; |
|
341 wifi_state->STA_nm[0] = '\0'; |
|
342 wifi_state->STA_gw[0] = '\0'; |
|
343 wifi_state->STA_online = false; |
|
344 xSemaphoreGive(xSemaphoreWiFi); |
|
345 } else { |
|
346 ESP_LOGE(TAG, "got_ip_event_handler() lock error IP_EVENT_STA_LOST_IP"); |
|
347 } |
|
348 sntp_stop(); |
|
349 break; |
|
350 |
|
351 default: |
|
352 ESP_LOGW(TAG, "Unknown IP event %d", event_id); |
|
353 break; |
|
354 } |
346 } |
355 } |
347 |
356 |
348 |
357 |
349 |
358 |
350 void time_sync_notification_cb(struct timeval *tv) |
359 void time_sync_notification_cb(struct timeval *tv) |