From 4a88b0ecdab66bed5948cae5579536d10eabecae Mon Sep 17 00:00:00 2001 From: Maurizio Porrato Date: Sat, 25 Feb 2017 15:07:57 +0000 Subject: [PATCH] Added wifi network scanning --- src/network.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/network.h | 17 +++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/network.c b/src/network.c index 6885a7a..735463b 100644 --- a/src/network.c +++ b/src/network.c @@ -9,6 +9,52 @@ #include #include "common.h" +#include "network.h" + +SemaphoreHandle_t semNetworks; + +struct network_info networks[MAX_NETWORKS]; + +static void scan_done_cb(void *arg, sdk_scan_status_t status) { + int i; + + if (xSemaphoreTake(semNetworks, TIME_MS(50)) == pdTRUE) { + if (status != SCAN_OK) { + networks[0].channel = networks[0].rssi = 0; + } else { + struct sdk_bss_info *bss = (struct sdk_bss_info *)arg; + // first one is invalid + bss = bss->next.stqe_next; + + for (i=0; NULL != bss && ibssid, sizeof(networks[i].bssid)); + memcpy(networks[i].ssid, bss->ssid, sizeof(networks[i].ssid)); + networks[i].channel = bss->channel; + networks[i].rssi= bss->rssi; + networks[i].authmode = bss->authmode; + networks[i].is_hidden = bss->is_hidden; + + bss = bss->next.stqe_next; + } + if (i < MAX_NETWORKS) { + networks[i].channel = networks[i].rssi = 0; + } + } + + xSemaphoreGive(semNetworks); + } +} + +void NetworkScanTask(void *p) { + networks[0].channel = networks[0].rssi = 0; + semNetworks = xSemaphoreCreateMutex(); + + for (;;) { + sdk_wifi_station_scan(NULL, scan_done_cb); + vTaskDelay(TIME_MS(5000)); + } +} + /* This task ensures the network connection is up. * If the network has not been configured yet, diff --git a/src/network.h b/src/network.h index daaf032..006803e 100644 --- a/src/network.h +++ b/src/network.h @@ -1,6 +1,23 @@ #ifndef _NETWORK_H_ #define _NETWORK_H_ +#include + +extern SemaphoreHandle_t semNetworks; + +struct network_info { + uint8_t bssid[6]; + uint8_t ssid[32]; + uint8_t channel; + int8_t rssi; + AUTH_MODE authmode; + uint8_t is_hidden; +}; + +#define MAX_NETWORKS 20 +extern struct network_info networks[MAX_NETWORKS]; + void NetworkConnectionTask(void *p); +void NetworkScanTask(void *p); #endif