8000 WiFi - prepare for alternative drivers (#1935) · LinusHeu/arduino-pico@fef8d2c · GitHub
[go: up one dir, main page]

Skip to content

Commit fef8d2c

Browse files
authored
WiFi - prepare for alternative drivers (earlephilhower#1935)
1 parent 916c31d commit fef8d2c

File tree

6 files changed

+467
-148
lines changed

6 files changed

+467
-148
lines changed

libraries/WiFi/src/WiFiClass.cpp

Lines changed: 29 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
*/
2222

2323
#include <inttypes.h>
24-
#include <pico/cyw43_arch.h>
25-
#include <cyw43.h>
2624
#include "lwip/raw.h"
2725
#include "lwip/icmp.h"
2826
#include "lwip/inet_chksum.h"
@@ -31,7 +29,12 @@
3129

3230
// This is the real WiFi network object, we just tickle it to do our magic
3331
#include <LwipEthernet.h>
32+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
33+
#include <pico/cyw43_arch.h>
3434
static CYW43lwIP _wifi(1);
35+
#else
36+
static NoDriverLwIP _wifi;
37+
#endif
3538

3639
WiFiClass::WiFiClass() {
3740
}
@@ -75,7 +78,6 @@ int WiFiClass::beginBSSID(const char* ssid, const uint8_t *bssid) {
7578
return begin(ssid, nullptr, bssid);
7679
}
7780

78-
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
7981
/* Start WiFi connection with passphrase
8082
the most secure supported mode will be automatically selected
8183
@@ -166,8 +168,8 @@ uint8_t WiFiClass::beginAP(const char *ssid, const char* passphrase) {
166168

167169
return WL_CONNECTED;
168170
}
169-
#endif
170171

172+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
171173
uint8_t WiFiClass::softAPgetStationNum() {
172174
if (!_apMode || !_wifiHWInitted) {
173175
return 0;
@@ -182,10 +184,10 @@ uint8_t WiFiClass::softAPgetStationNum() {
182184
free(macs);
183185
return m;
184186
}
185-
187+
#endif
186188

187189
bool WiFiClass::connected() {
188-
return (_apMode && _wifiHWInitted) || (_wifi.connected() && localIP().isSet() && (cyw43_wifi_link_status(&cyw43_state, _apMode ? 1 : 0) == CYW43_LINK_JOIN));
190+
return (_apMode && _wifiHWInitted) || (_wifi.connected() && localIP().isSet());
189191
}
190192

191193
/* Change Ip configuration settings disabling the dhcp client
@@ -270,7 +272,6 @@ int WiFiClass::disconnect(bool wifi_off __unused) {
270272
}
271273
if (_wifiHWInitted) {
272274
_wifiHWInitted = false;
273-
cyw43_wifi_leave(&cyw43_state, _apMode ? 1 : 0);
274275
_wifi.end();
275276
}
276277
return WL_DISCONNECTED;
@@ -288,12 +289,13 @@ void WiFiClass::end(void) {
288289
return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH
289290
*/
290291
uint8_t* WiFiClass::macAddress(uint8_t* mac) {
292+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
291293
if (!_wifiHWInitted) {
292294
_apMode = false;
293295
cyw43_wifi_set_up(&cyw43_state, _apMode ? 1 : 0, true, CYW43_COUNTRY_WORLDWIDE);
294296
}
295-
cyw43_wifi_get_mac(&cyw43_state, _apMode ? 1 : 0, mac);
296-
return mac;
297+
#endif
298+
return _wifi.macAddress(_apMode, mac);
297299
}
298300

299301
/*
@@ -348,30 +350,11 @@ const String &WiFiClass::SSID() {
348350
return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH
349351
*/
350352
uint8_t* WiFiClass::BSSID(uint8_t* bssid) {
351-
#ifndef CYW43_IOCTL_GET_BSSID
352-
#define CYW43_IOCTL_GET_BSSID ( (uint32_t)23 * 2 )
353-
#endif
354-
355-
if (_wifi.connected()) {
356-
cyw43_ioctl(&cyw43_state, CYW43_IOCTL_GET_BSSID, WL_MAC_ADDR_LENGTH, bssid, CYW43_ITF_STA);
357-
} else {
358-
memset(bssid, 0, WL_MAC_ADDR_LENGTH);
359-
}
360-
return bssid;
353+
return _wifi.BSSID(bssid);
361354
}
362355

363356
int WiFiClass::channel() {
364-
#ifndef CYW43_IOCTL_GET_CHANNEL
365-
#define CYW43_IOCTL_GET_CHANNEL 0x3a
366-
#endif
367-
368-
int32_t channel;
369-
if (_wifi.connected()) {
370-
cyw43_ioctl(&cyw43_state, CYW43_IOCTL_GET_CHANNEL, sizeof channel, (uint8_t *)&channel, CYW43_ITF_STA);
371-
} else {
372-
channel = -1;
373-
}
374-
return channel;
357+
return _wifi.channel();
375358
}
376359

377360

@@ -382,17 +365,7 @@ int WiFiClass::channel() {
382365
return: signed value
383366
*/
384367
int32_t WiFiClass::RSSI() {
385-
#ifndef CYW43_IOCTL_GET_RSSI
386-
#define CYW43_IOCTL_GET_RSSI 0xFE
387-
#endif
388-
389-
int32_t rssi;
390-
if (_wifi.connected()) {
391-
cyw43_ioctl(&cyw43_state, CYW43_IOCTL_GET_RSSI, sizeof rssi, (uint8_t *)&rssi, CYW43_ITF_STA);
392-
} else {
393-
rssi = -255;
394-
}
395-
return rssi;
368+
return _wifi.RSSI();
396369
}
397370

398371
/*
@@ -401,31 +374,10 @@ int32_t WiFiClass::RSSI() {
401374
return: one value of wl_enc_type enum
402375
*/
403376
uint8_t WiFiClass::encryptionType() {
404-
// TODO - Driver does not return this?!
405377
if (_password == nullptr) {
406378
return ENC_TYPE_NONE;
407379
}
408-
return ENC_TYPE_AUTO;
409-
}
410-
411-
//TODO - this can be in the class
412-
static uint64_t _to64(uint8_t b[8]) {
413-
uint64_t x = 0;
414-
for (int i = 0; i < 6; i++) {
415-
x <<= 8LL;
416-
x |= b[i] & 255;
417-
}
418-
return x;
419-
}
420-
421-
int WiFiClass::_scanCB(void *env, const cyw43_ev_scan_result_t *result) {
422-
WiFiClass *w = (WiFiClass *)env;
423-
if (result) {
424-
cyw43_ev_scan_result_t s;
425-
memcpy(&s, result, sizeof(s));
426-
w->_scan.insert_or_assign(_to64(s.bssid), s);
427-
}
428-
return 0;
380+
return _wifi.encryptionType();
429381
}
430382

431383
/*
@@ -434,39 +386,22 @@ int WiFiClass::_scanCB(void *env, const cyw43_ev_scan_result_t *result) {
434386
return: Number of discovered networks
435387
*/
436388
int8_t WiFiClass::scanNetworks(bool async) {
437-
cyw43_wifi_scan_options_t scan_options;
438-
memset(&scan_options, 0, sizeof(scan_options));
439-
_scan.clear();
440389
if (!_wifiHWInitted) {
441390
_apMode = false;
391+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
442392
cyw43_arch_enable_sta_mode();
393+
#endif
443394
_wifiHWInitted = true;
444395
}
445-
int err = cyw43_wifi_scan(&cyw43_state, &scan_options, this, _scanCB);
446-
if (err) {
447-
return 0;
448-
}
449-
if (!async) {
450-
uint32_t now = millis();
451-
while (cyw43_wifi_scan_active(&cyw43_state) && (millis() - now < 10000)) {
452-
delay(10);
453-
}
454-
return _scan.size();
455-
} else {
456-
return -1;
457-
}
396+
return _wifi.scanNetworks(async);
458397
}
459398

460399
int8_t WiFiClass::scanComplete() {
461-
if (cyw43_wifi_scan_active(&cyw43_state)) {
462-
return -1;
463-
} else {
464-
return _scan.size();
465-
}
400+
return _wifi.scanComplete();
466401
}
467402

468403
void WiFiClass::scanDelete() {
469-
_scan.clear();
404+
_wifi.scanDelete();
470405
}
471406

472407
/*
@@ -477,14 +412,7 @@ void WiFiClass::scanDelete() {
477412
return: ssid string of the specified item on the networks scanned list
478413
*/
479414
const char*WiFiClass::SSID(uint8_t networkItem) {
480-
if (networkItem >= _scan.size()) {
481-
return nullptr;
482-
}
483-
auto it = _scan.begin();
484-
for (int i = 0; i < networkItem; i++) {
485-
++it;
486-
}
487-
return (const char *)it->second.ssid;
415+
return _wifi.SSID(networkItem);
488416
}
489417

490418
/*
@@ -495,44 +423,15 @@ const char*WiFiClass::SSID(uint8_t networkItem) {
495423
return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list
496424
*/
497425
uint8_t WiFiClass::encryptionType(uint8_t networkItem) {
498-
if (networkItem >= _scan.size()) {
499-
return ENC_TYPE_UNKNOWN;
500-
}
501-
auto it = _scan.begin();
502-
for (int i = 0; i < networkItem; i++) {
503-
++it;
504-
}
505-
// TODO - the driver returns a small integer but does not actually provide a way of mapping that to the proper enc type. My best guesses here...
506-
switch (it->second.auth_mode) {
507-
case 0: return ENC_TYPE_NONE;
508-
case 3: return ENC_TYPE_TKIP;
509-
case 5: return ENC_TYPE_CCMP;
510-
case 7: return ENC_TYPE_AUTO;
511-
}
512-
return ENC_TYPE_UNKNOWN;
426+
return _wifi.encryptionType(networkItem);
513427
}
514428

515429
uint8_t* WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) {
516-
if (networkItem >= _scan.size()) {
517-
return nullptr;
518-
}
519-
auto it = _scan.begin();
520-
for (int i = 0; i < networkItem; i++) {
521-
++it;
522-
}
523-
memcpy(bssid, it->second.bssid, 6);
524-
return bssid;
430+
return _wifi.BSSID(networkItem, bssid);
525431
}
526432

527433
uint8_t WiFiClass::channel(uint8_t networkItem) {
528-
if (networkItem >= _scan.size()) {
529-
return 255;
530-
}
531-
auto it = _scan.begin();
532-
for (int i = 0; i < networkItem; i++) {
533-
++it;
534-
}
535-
return it->second.channel;
434+
return _wifi.channel(networkItem);
536435
}
537436

538437
/*
@@ -543,14 +442,7 @@ uint8_t WiFiClass::channel(uint8_t networkItem) {
543442
return: signed value of RSSI of the specified item on the networks scanned list
544443
*/
545444
int32_t WiFiClass::RSSI(uint8_t networkItem) {
546-
if (networkItem >= _scan.size()) {
547-
return -9999;
548-
}
549-
auto it = _scan.begin();
550-
for (int i = 0; i < networkItem; i++) {
551-
++it;
552-
}
553-
return it->second.rssi;
445+
return _wifi.RSSI(networkItem);
554446
}
555447

556448
/*
@@ -562,14 +454,7 @@ uint8_t WiFiClass::status() {
562454
if (_apMode && _wifiHWInitted) {
563455
return WL_CONNECTED;
564456
}
565-
switch (cyw43_wifi_link_status(&cyw43_state, _apMode ? 1 : 0)) {
566-
case CYW43_LINK_DOWN: return WL_IDLE_STATUS;
567-
case CYW43_LINK_JOIN: return localIP().isSet() ? WL_CONNECTED : WL_DISCONNECTED;
568-
case CYW43_LINK_FAIL: return WL_CONNECT_FAILED;
569-
case CYW43_LINK_NONET: return WL_CONNECT_FAILED;
570-
case CYW43_LINK_BADAUTH: return WL_CONNECT_FAILED;
571-
}
572-
return WL_NO_MODULE;
457+
return _wifi.status();
573458
}
574459

575460
/*
@@ -599,17 +484,19 @@ unsigned long WiFiClass::getTime() {
599484
return millis();
600485
}
601486

487+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
602488
void WiFiClass::aggressiveLowPowerMode() {
603489
cyw43_wifi_pm(&cyw43_state, CYW43_AGGRESSIVE_PM);
604490
}
605491

606492
void WiFiClass::defaultLowPowerMode() {
607493
cyw43_wifi_pm(&cyw43_state, CYW43_DEFAULT_PM);
608494
}
495+
#endif
609496

610497
// The difference between the default CYW43_DEFAULT_PM (0xA11142) and not low power (0xA11140) is that it changed from "Powersave mode on specified interface with High throughput" to "No Powersave mode". All other parameters stayed the same.
611498
void WiFiClass::noLowPowerMode() {
612-
cyw43_wifi_pm(&cyw43_state, 0xA11140);
499+
_wifi.noLowPowerMode();
613500
}
614501

615502
int WiFiClass::ping(const char* hostname, uint8_t ttl) {

libraries/WiFi/src/WiFiClass.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323
#pragma once
2424

2525
#include <Arduino.h>
26+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
2627
#include <lwIP_CYW43.h>
28+
#else
29+
#include "utility/lwIP_nodriver.h"
30+
#endif
2731
#include "WiFi.h"
2832

2933
#include <inttypes.h>
3034
#include <map>
3135

32-
#include <cyw43.h>
3336
#include "dhcpserver/dhcpserver.h"
3437

3538
#define WIFI_FIRMWARE_LATEST_VERSION PICO_SDK_VERSION_STRING
@@ -136,7 +139,9 @@ class WiFiClass {
136139
return true;
137140
}
138141

142+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
139143
uint8_t softAPgetStationNum();
144+
#endif
140145

141146
IPAddress softAPIP() {
142147
return localIP();
@@ -381,8 +386,10 @@ class WiFiClass {
381386

382387
unsigned long getTime();
383388

389+
#ifdef ARDUINO_RASPBERRY_PI_PICO_W
384390
void aggressiveLowPowerMode();
385391
void defaultLowPowerMode();
392+
#endif
386393
void noLowPowerMode();
387394

388395
int ping(const char* hostname, uint8_t ttl = 128);
@@ -411,10 +418,6 @@ class WiFiClass {
411418
bool _wifiHWInitted = false;
412419
bool _apMode = false;
413420

414-
// WiFi Scan callback
415-
std::map<uint64_t, cyw43_ev_scan_result_t> _scan;
416-
static int _scanCB(void *env, const cyw43_ev_scan_result_t *result);
417-
418421
// DHCP for AP mode
419422
dhcp_server_t *_dhcpServer = nullptr;
420423

0 commit comments

Comments
 (0)
0