Async scan + bugfixes (#947)
* Support asynchronous WiFi scan * Fixed buffer overflow in getChipId * ESP compatibility fixes * fixup! ESP compatibility fixes
This commit is contained in:
parent
44eeebbc6f
commit
6bbaf64daf
4 changed files with 70 additions and 26 deletions
|
|
@ -325,7 +325,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *getChipID() {
|
const char *getChipID() {
|
||||||
static char id[PICO_UNIQUE_BOARD_ID_SIZE_BYTES + 1] = { 0 };
|
static char id[2 * PICO_UNIQUE_BOARD_ID_SIZE_BYTES + 1] = { 0 };
|
||||||
if (!id[0]) {
|
if (!id[0]) {
|
||||||
pico_get_unique_board_id_string(id, sizeof(id));
|
pico_get_unique_board_id_string(id, sizeof(id));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ void ArduinoOTAClass::begin(bool useMDNS) {
|
||||||
_useMDNS = useMDNS;
|
_useMDNS = useMDNS;
|
||||||
|
|
||||||
if (!_hostname.length()) {
|
if (!_hostname.length()) {
|
||||||
char tmp[15];
|
char tmp[2 * PICO_UNIQUE_BOARD_ID_SIZE_BYTES + 6];
|
||||||
sprintf(tmp, "pico-%s", rp2040.getChipID());
|
sprintf(tmp, "pico-%s", rp2040.getChipID());
|
||||||
_hostname = tmp;
|
_hostname = tmp;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,17 +44,20 @@ const char* WiFiClass::firmwareVersion() {
|
||||||
return PICO_SDK_VERSION_STRING;
|
return PICO_SDK_VERSION_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WiFiClass::mode(_wifiModeESP m) {
|
void WiFiClass::mode(WiFiMode_t m) {
|
||||||
_calledESP = true;
|
_calledESP = true;
|
||||||
switch (m) {
|
switch (m) {
|
||||||
case WIFI_OFF:
|
case WiFiMode_t::WIFI_OFF:
|
||||||
end();
|
end();
|
||||||
break;
|
break;
|
||||||
case WIFI_AP:
|
case WiFiMode_t::WIFI_AP:
|
||||||
_modeESP = WIFI_AP;
|
_modeESP = WiFiMode_t::WIFI_AP;
|
||||||
break;
|
break;
|
||||||
case WIFI_STA:
|
case WiFiMode_t::WIFI_STA:
|
||||||
_modeESP = WIFI_STA;
|
_modeESP = WiFiMode_t::WIFI_STA;
|
||||||
|
break;
|
||||||
|
case WiFiMode_t::WIFI_AP_STA:
|
||||||
|
_modeESP = WiFiMode_t::WIFI_STA;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -86,7 +89,7 @@ int WiFiClass::begin(const char* ssid, const char *passphrase) {
|
||||||
|
|
||||||
_ssid = ssid;
|
_ssid = ssid;
|
||||||
_password = passphrase;
|
_password = passphrase;
|
||||||
_wifi.setSSID(ssid);
|
_wifi.setSSID(_ssid.c_str());
|
||||||
_wifi.setPassword(passphrase);
|
_wifi.setPassword(passphrase);
|
||||||
_wifi.setTimeout(_timeout);
|
_wifi.setTimeout(_timeout);
|
||||||
_wifi.setSTA();
|
_wifi.setSTA();
|
||||||
|
|
@ -123,7 +126,7 @@ uint8_t WiFiClass::beginAP(const char *ssid, const char* passphrase) {
|
||||||
|
|
||||||
_ssid = ssid;
|
_ssid = ssid;
|
||||||
_password = passphrase;
|
_password = passphrase;
|
||||||
_wifi.setSSID(ssid);
|
_wifi.setSSID(_ssid.c_str());
|
||||||
_wifi.setPassword(passphrase);
|
_wifi.setPassword(passphrase);
|
||||||
_wifi.setTimeout(_timeout);
|
_wifi.setTimeout(_timeout);
|
||||||
_wifi.setAP();
|
_wifi.setAP();
|
||||||
|
|
@ -234,7 +237,7 @@ const char *WiFiClass::getHostname() {
|
||||||
|
|
||||||
return: one value of wl_status_t enum
|
return: one value of wl_status_t enum
|
||||||
*/
|
*/
|
||||||
int WiFiClass::disconnect(void) {
|
int WiFiClass::disconnect(bool wifi_off __unused) {
|
||||||
if (_dhcpServer) {
|
if (_dhcpServer) {
|
||||||
dhcp_server_deinit(_dhcpServer);
|
dhcp_server_deinit(_dhcpServer);
|
||||||
free(_dhcpServer);
|
free(_dhcpServer);
|
||||||
|
|
@ -300,7 +303,7 @@ IPAddress WiFiClass::gatewayIP() {
|
||||||
|
|
||||||
return: ssid string
|
return: ssid string
|
||||||
*/
|
*/
|
||||||
const char* WiFiClass::SSID() {
|
const String &WiFiClass::SSID() {
|
||||||
return _ssid;
|
return _ssid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -396,7 +399,7 @@ int WiFiClass::_scanCB(void *env, const cyw43_ev_scan_result_t *result) {
|
||||||
|
|
||||||
return: Number of discovered networks
|
return: Number of discovered networks
|
||||||
*/
|
*/
|
||||||
int8_t WiFiClass::scanNetworks() {
|
int8_t WiFiClass::scanNetworks(bool async) {
|
||||||
cyw43_wifi_scan_options_t scan_options;
|
cyw43_wifi_scan_options_t scan_options;
|
||||||
memset(&scan_options, 0, sizeof(scan_options));
|
memset(&scan_options, 0, sizeof(scan_options));
|
||||||
_scan.clear();
|
_scan.clear();
|
||||||
|
|
@ -409,11 +412,27 @@ int8_t WiFiClass::scanNetworks() {
|
||||||
if (err) {
|
if (err) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint32_t now = millis();
|
if (!async) {
|
||||||
while (cyw43_wifi_scan_active(&cyw43_state) && (millis() - now < 10000)) {
|
uint32_t now = millis();
|
||||||
delay(10);
|
while (cyw43_wifi_scan_active(&cyw43_state) && (millis() - now < 10000)) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
|
return _scan.size();
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
return _scan.size();
|
}
|
||||||
|
|
||||||
|
int8_t WiFiClass::scanComplete() {
|
||||||
|
if (cyw43_wifi_scan_active(&cyw43_state)) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return _scan.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WiFiClass::scanDelete() {
|
||||||
|
_scan.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
typedef void(*FeedHostProcessorWatchdogFuncPointer)();
|
typedef void(*FeedHostProcessorWatchdogFuncPointer)();
|
||||||
|
|
||||||
typedef enum { WIFI_STA, WIFI_AP, WIFI_OFF } _wifiModeESP; // For ESP8266 compatibility
|
typedef enum { WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3 } WiFiMode_t; // For ESP8266 compatibility
|
||||||
|
|
||||||
class WiFiClass {
|
class WiFiClass {
|
||||||
public:
|
public:
|
||||||
|
|
@ -46,7 +46,18 @@ public:
|
||||||
*/
|
*/
|
||||||
static const char* firmwareVersion();
|
static const char* firmwareVersion();
|
||||||
|
|
||||||
void mode(_wifiModeESP m); // For ESP8266 compatibility
|
void mode(WiFiMode_t m); // For ESP8266 compatibility
|
||||||
|
|
||||||
|
WiFiMode_t getMode() {
|
||||||
|
if (_wifiHWInitted) {
|
||||||
|
if (_apMode) {
|
||||||
|
return WiFiMode_t::WIFI_AP;
|
||||||
|
} else {
|
||||||
|
return WiFiMode_t::WIFI_STA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return WiFiMode_t::WIFI_OFF;
|
||||||
|
};
|
||||||
|
|
||||||
/* Start WiFi connection for OPEN networks
|
/* Start WiFi connection for OPEN networks
|
||||||
|
|
||||||
|
|
@ -138,7 +149,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
String softAPSSID() {
|
String softAPSSID() {
|
||||||
return String(SSID());
|
return SSID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -205,7 +216,7 @@ public:
|
||||||
|
|
||||||
return: one value of wl_status_t enum
|
return: one value of wl_status_t enum
|
||||||
*/
|
*/
|
||||||
int disconnect(void);
|
int disconnect(bool wifi_off = false);
|
||||||
|
|
||||||
void end(void);
|
void end(void);
|
||||||
|
|
||||||
|
|
@ -249,7 +260,7 @@ public:
|
||||||
|
|
||||||
return: ssid string
|
return: ssid string
|
||||||
*/
|
*/
|
||||||
const char* SSID();
|
const String &SSID();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Return the current BSSID associated with the network.
|
Return the current BSSID associated with the network.
|
||||||
|
|
@ -281,9 +292,23 @@ public:
|
||||||
/*
|
/*
|
||||||
Start scan WiFi networks available
|
Start scan WiFi networks available
|
||||||
|
|
||||||
|
param async: whether to perform asynchronous scan
|
||||||
|
|
||||||
return: Number of discovered networks
|
return: Number of discovered networks
|
||||||
*/
|
*/
|
||||||
int8_t scanNetworks();
|
int8_t scanNetworks(bool async = false);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return number of scanned WiFi networks
|
||||||
|
|
||||||
|
return: Number of discovered networks
|
||||||
|
*/
|
||||||
|
int8_t scanComplete();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Delete scan results
|
||||||
|
*/
|
||||||
|
void scanDelete();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Return the SSID discovered during the network scan.
|
Return the SSID discovered during the network scan.
|
||||||
|
|
@ -357,8 +382,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int _timeout = 10000;
|
int _timeout = 10000;
|
||||||
const char * _ssid = nullptr;
|
String _ssid;
|
||||||
const char * _password = nullptr;
|
String _password;
|
||||||
bool _wifiHWInitted = false;
|
bool _wifiHWInitted = false;
|
||||||
bool _apMode = false;
|
bool _apMode = false;
|
||||||
|
|
||||||
|
|
@ -371,7 +396,7 @@ private:
|
||||||
|
|
||||||
// ESP compat
|
// ESP compat
|
||||||
bool _calledESP = false; // Should we behave like the ESP8266 for connect?
|
bool _calledESP = false; // Should we behave like the ESP8266 for connect?
|
||||||
_wifiModeESP _modeESP = WIFI_STA;
|
WiFiMode_t _modeESP = WIFI_STA;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WiFiClass WiFi;
|
extern WiFiClass WiFi;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue