From 0b540af2f76aaa9a2db19e3841e3896f8a0987ba Mon Sep 17 00:00:00 2001 From: dannybackx Date: Wed, 15 Mar 2017 17:43:44 +0100 Subject: [PATCH] Query the signal strength of a wifi network --- cmd/cmd.h | 1 + cmd/handlers.c | 55 ++++++++++++++++++++++++++++++++++++---------- esp-link/cgiwifi.c | 13 ++++++++++- esp-link/cgiwifi.h | 3 ++- 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/cmd/cmd.h b/cmd/cmd.h index c8af296..8471a29 100644 --- a/cmd/cmd.h +++ b/cmd/cmd.h @@ -64,6 +64,7 @@ typedef enum { CMD_WIFI_GET_APCOUNT = 50, /* */ CMD_WIFI_GET_APNAME, CMD_WIFI_SELECT_SSID, + CMD_WIFI_SIGNAL_STRENGTH, // Query RSSI } CmdName; diff --git a/cmd/handlers.c b/cmd/handlers.c index 4490d88..e1f9783 100644 --- a/cmd/handlers.c +++ b/cmd/handlers.c @@ -35,6 +35,8 @@ static void cmdAddCallback(CmdPacket *cmd); static void cmdWifiGetApCount(CmdPacket *cmd); static void cmdWifiGetApName(CmdPacket *cmd); +static void cmdWifiSelectSSID(CmdPacket *cmd); +static void cmdWifiSignalStrength(CmdPacket *cmd); void cmdMqttGetClientId(CmdPacket *cmd); @@ -55,8 +57,10 @@ const CmdList commands[] = { {CMD_GET_WIFI_INFO, "GET_WIFI_INFO", cmdGetWifiInfo}, {CMD_SET_WIFI_INFO, "SET_WIFI_INFO", cmdSetWifiInfo}, - {CMD_WIFI_GET_APCOUNT,"WIFI_GET_APCOUNT", cmdWifiGetApCount}, - {CMD_WIFI_GET_APNAME, "WIFI_GET_APNAME", cmdWifiGetApName}, + {CMD_WIFI_GET_APCOUNT, "WIFI_GET_APCOUNT", cmdWifiGetApCount}, + {CMD_WIFI_GET_APNAME, "WIFI_GET_APNAME", cmdWifiGetApName}, + {CMD_WIFI_SELECT_SSID, "WIFI_SELECT_SSID", cmdWifiSelectSSID}, + {CMD_WIFI_SIGNAL_STRENGTH, "WIFI_SIGNAL_STRENGTH", cmdWifiSignalStrength}, #ifdef MQTT {CMD_MQTT_SETUP, "MQTT_SETUP", MQTTCMD_Setup}, @@ -220,11 +224,6 @@ cmdGetWifiInfo(CmdPacket *cmd) { cmdResponseEnd(); } -static void ICACHE_FLASH_ATTR -cmdSetWifiInfo(CmdPacket *cmd) { - os_printf("SetWifiInfo()\n"); -} - // Command handler to add a callback to the named-callbacks list, this is for a callback to the uC static void ICACHE_FLASH_ATTR cmdAddCallback(CmdPacket *cmd) { @@ -246,8 +245,7 @@ cmdAddCallback(CmdPacket *cmd) { } // Query the number of wifi access points -static void ICACHE_FLASH_ATTR -cmdWifiGetApCount(CmdPacket *cmd) { +static void ICACHE_FLASH_ATTR cmdWifiGetApCount(CmdPacket *cmd) { int n = wifiGetApCount(); os_printf("WifiGetApCount : %d\n", n); cmdResponseStart(CMD_RESP_V, n, 0); @@ -255,8 +253,7 @@ cmdWifiGetApCount(CmdPacket *cmd) { } // Query the name of a wifi access point -static void ICACHE_FLASH_ATTR -cmdWifiGetApName(CmdPacket *cmd) { +static void ICACHE_FLASH_ATTR cmdWifiGetApName(CmdPacket *cmd) { CmdRequest req; cmdRequest(&req, cmd); @@ -280,3 +277,39 @@ cmdWifiGetApName(CmdPacket *cmd) { cmdResponseBody(myssid, strlen(myssid)+1); cmdResponseEnd(); } + +/* + * Select a wireless network. + */ +static void ICACHE_FLASH_ATTR cmdWifiSelectSSID(CmdPacket *cmd) { +} + +/* + * Once we're attached to some wireless network, choose not to pick up address from + * DHCP or so but set our own. + */ +static void ICACHE_FLASH_ATTR cmdSetWifiInfo(CmdPacket *cmd) { + os_printf("SetWifiInfo()\n"); +} + +static void ICACHE_FLASH_ATTR cmdWifiSignalStrength(CmdPacket *cmd) { + CmdRequest req; + + cmdRequest(&req, cmd); + + int argc = cmdGetArgc(&req); + if (argc != 1) { + os_printf("cmdWifiSignalStrength: argc %d\n", argc); + return; + } + + int32_t i; + cmdPopArg(&req, (uint8_t*)&i, 4); + os_printf("cmdWifiSignalStrength: argc %d, ", argc); + os_printf("i %d\n", i); + + int rssi = wifiSignalStrength(i); + + cmdResponseStart(CMD_RESP_V, rssi, 0); + cmdResponseEnd(); +} diff --git a/esp-link/cgiwifi.c b/esp-link/cgiwifi.c index 9e79341..3d7f8bd 100644 --- a/esp-link/cgiwifi.c +++ b/esp-link/cgiwifi.c @@ -152,7 +152,7 @@ void ICACHE_FLASH_ATTR wifiStartMDNS(struct ip_addr ip) { //WiFi access point data typedef struct { char ssid[32]; - sint8 rssi; + sint8 rssi; // Received signal strength indication char enc; } ApData; @@ -970,3 +970,14 @@ int ICACHE_FLASH_ATTR wifiConnect(char *ssid, char *pass) { return 0; } +ICACHE_FLASH_ATTR int wifiSignalStrength(int i) { + sint8 rssi; + + if (i < 0) + rssi = wifi_station_get_rssi(); // Current network's signal strength + else if (i >= cgiWifiAps.noAps) + rssi = 0; // FIX ME + else + rssi = cgiWifiAps.apData[i]->rssi; // Signal strength of any known network + return rssi; +} diff --git a/esp-link/cgiwifi.h b/esp-link/cgiwifi.h index 0e1805c..983974a 100644 --- a/esp-link/cgiwifi.h +++ b/esp-link/cgiwifi.h @@ -25,6 +25,7 @@ extern uint8_t wifiState; extern bool mdns_started; int wifiGetApCount(); -void wifiGetApName(int i, char *ptr); +void wifiGetApName(int, char *); +int wifiSignalStrength(int); #endif