8000 Port to Raspberry Pi Pico W core · smartcoder00/arduinoWebSockets@d9a5c62 · GitHub
[go: up one dir, main page]

Skip to content

Commit d9a5c62

Browse files
earlephilhowerLinks2004
authored andcommitted
Port to Raspberry Pi Pico W core
Add support for the onboard WiFi chip on the Raspberry Pi Pico W (RP2040 based ) board using the arduino-pico Arduino core at https://github.com/earlephilhower/arduino-pico The PicoW WiFi stack is a mashup of the ESP8266 and ESP32 cores, so only minimal changes were required. Defines a new NETWORK_TYPE for the PicoW. ESP8266 examples renames to ESP8266_PICO because they all work unmodified (except for OTA which is handled differently on the Pico)
1 parent 323592f commit d9a5c62

File tree

28 files changed

+61
-25
lines changed

28 files changed

+61
-25
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ a WebSocket Server and Client for Arduino based on RFC6455.
2626
- ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/)
2727
- ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32)
2828
- ESP31B
29+
- Raspberry Pi Pico W [Arduino for Pico](https://github.com/earlephilhower/arduino-pico)
2930
- Particle with STM32 ARM Cortex M3
3031
- ATmega328 with Ethernet Shield (ATmega branch)
3132
- ATmega328 with enc28j60 (ATmega branch)

examples/esp8266/WebSocketClientOTA/WebSocketClientOTA.ino renamed to examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88
#include <Arduino.h>
99
#include <ArduinoJson.h>
1010

11-
#ifdef ESP8266
11+
#if defined(ESP8266)
1212
#include <ESP8266WiFi.h>
1313
#include <ESP8266mDNS.h>
14-
#include <Updater.h>
15-
#endif
16-
#ifdef ESP32
14+
#include <Updater.h>
15+
#elif defined(ESP32)
1716
#include "WiFi.h"
1817
#include "ESPmDNS.h"
19-
#include <Update.h>
18+
#include <Update.h>
19+
#else
20+
#error Unsupported device
2021
#endif
2122

2223
#include <WiFiUdp.h>

src/WebSockets.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ void WebSockets::handl 10000 eWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t
482482
switch(header->opCode) {
483483
case WSop_text:
484484
DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload);
485-
// no break here!
485+
// fallthrough
486486
case WSop_binary:
487487
case WSop_continuation:
488488
messageReceived(client, header->opCode, payload, header->payloadLen, header->fin);

src/WebSockets.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@
8484
#define GET_FREE_HEAP System.freeMemory()
8585
#define WEBSOCKETS_YIELD()
8686
#define WEBSOCKETS_YIELD_MORE()
87+
88+
#elif defined(ARDUINO_ARCH_RP2040)
89+
90+
#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024)
91+
#define WEBSOCKETS_USE_BIG_MEM
92+
#define GET_FREE_HEAP rp2040.getFreeHeap()
93+
#define WEBSOCKETS_YIELD() yield()
94+
#define WEBSOCKETS_YIELD_MORE() delay(1)
95+
8796
#else
8897

8998
// atmega328p has only 2KB ram!
@@ -104,6 +113,7 @@
104113
#define NETWORK_ENC28J60 (3)
105114
#define NETWORK_ESP32 (4)
106115
#define NETWORK_ESP32_ETH (5)
116+
#define NETWORK_RP2040 (6)
107117

108118
// max size of the WS Message Header
109119
#define WEBSOCKETS_MAX_HEADER_SIZE (14)
@@ -118,6 +128,10 @@
118128
#elif defined(ESP32)
119129
#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32
120130
//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH
131+
132+
#elif defined(ARDUINO_ARCH_RP2040)
133+
#define WEBSOCKETS_NETWORK_TYPE NETWORK_RP2040
134+
121135
#else
122136
#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100
123137

@@ -201,6 +215,15 @@
201215
#define WEBSOCKETS_NETWORK_CLASS WiFiClient
202216
#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer
203217

218+
#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
219+
220+
#include <WiFi.h>
221+
#include <WiFiClientSecure.h>
222+
#define SSL_BARESSL
223+
#define WEBSOCKETS_NETWORK_CLASS WiFiClient
224+
#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure
225+
#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer
226+
204227
#else
205228
#error "no network type selected!"
206229
#endif

src/WebSockets4WebServer.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,30 @@
2828
#include <WebSocketsServer.h>
2929
#include <ESP8266WebServer.h>
3030

31-
#if WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK
31+
32+
#if ((WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)) && WEBSERVER_HAS_HOOK
3233

3334
class WebSockets4WebServer : public WebSocketsServerCore {
35+
#if defined(ESP8266)
36+
using WebServerClass = ESP8266WebServer;
37+
#else
38+
using WebServerClass = WebServer;
39+
#endif
40+
3441
public:
3542
WebSockets4WebServer(const String & origin = "", const String & protocol = "arduino")
3643
: WebSocketsServerCore(origin, protocol) {
3744
begin();
3845
}
3946

40-
ESP8266WebServer::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) {
47+
WebServerClass::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) {
4148
onEvent(event);
4249

43-
return< F438 /span> [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, ESP8266WebServer::ContentTypeFunction contentType) {
50+
return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, WebServerClass::ContentTypeFunction contentType) {
4451
(void)contentType;
4552

4653
if(!(method == "GET" && url.indexOf(wsRootDir) == 0)) {
47-
return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE;
54+
return WebServerClass::CLIENT_REQUEST_CAN_CONTINUE;
4855
}
4956

5057
// allocate a WiFiClient copy (like in WebSocketsServer::handleNewClients())
@@ -63,7 +70,7 @@ class WebSockets4WebServer : public WebSocketsServerCore {
6370
}
6471

6572
// tell webserver to not close but forget about this client
66-
return ESP8266WebServer::CLIENT_IS_GIVEN;
73+
return WebServerClass::CLIENT_IS_GIVEN;
6774
};
6875
}
6976
};

src/WebSocketsClient.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ void WebSocketsClient::begin(const char * host, uint16_t port, const char * url,
7676

7777
#ifdef ESP8266
7878
randomSeed(RANDOM_REG32);
79+
#elif defined(ARDUINO_ARCH_RP2040)
80+
randomSeed(rp2040.hwrand32());
7981
#else
8082
// todo find better seed
8183
randomSeed(millis());
@@ -224,7 +226,7 @@ void WebSocketsClient::loop(void) {
224226
_client.ssl->setCACert(_CA_cert);
225227
#elif defined(ESP8266) && defined(SSL_AXTLS)
226228
_client.ssl->setCACert((const uint8_t *)_CA_cert, strlen(_CA_cert) + 1);
227-
#elif defined(ESP8266) && defined(SSL_BARESSL)
229+
#elif (defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)) && defined(SSL_BARESSL)
228230
_client.ssl->setTrustAnchors(_CA_cert);
229231
#else
230232
#error setCACert not implemented
@@ -473,7 +475,7 @@ void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, u
473475
void WebSocketsClient::clientDisconnect(WSclient_t * client) {
474476
bool event = false;
475477

476-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
478+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
477479
if(client->isSSL && client->ssl) {
478480
if(client->ssl->connected()) {
479481
client->ssl->flush();
@@ -864,7 +866,7 @@ void WebSocketsClient::connectedCb() {
864866
_client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT);
865867
#endif
866868

867-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
869+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
868870
_client.tcp->setNoDelay(true);
869871
#endif
870872

src/WebSocketsServer.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ void WebSocketsServerCore::begin(void) {
8585
#elif defined(ESP32)
8686
#define DR_REG_RNG_BASE 0x3ff75144
8787
randomSeed(READ_PERI_REG(DR_REG_RNG_BASE));
88+
#elif defined(ARDUINO_ARCH_RP2040)
89+
randomSeed(rp2040.hwrand32());
8890
#else
8991
// TODO find better seed
9092
randomSeed(millis());
@@ -394,7 +396,7 @@ bool WebSocketsServerCore::clientIsConnected(uint8_t num) {
394396
return clientIsConnected(client);
395397
}
396398

397-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
399+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
398400
/**
399401
* get an IP for a client
400402
* @param num uint8_t client id
@@ -439,7 +441,7 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien
439441
client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT);
440442
#endif
441443
client->status = WSC_HEADER;
442-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
444+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
443445
#ifndef NODEBUG_WEBSOCKETS
444446
IPAddress ip = client->tcp->remoteIP();
445447
#endif
@@ -521,7 +523,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) {
521523
}
522524
if(client->tcp) {
523525
if(client->tcp->connected()) {
524-
#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32)
526+
#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_RP2040)
525527
client->tcp->flush();
526528
#endif
527529
client->tcp->stop();
@@ -540,7 +542,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) {
540542
* @param client WSclient_t * ptr to the client struct
541543
*/
542544
void WebSocketsServerCore::clientDisconnect(WSclient_t * client) {
543-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
545+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
544546
if(client->isSSL && client->ssl) {
545547
if(client->ssl->connected()) {
546548
client->ssl->flush();
@@ -614,7 +616,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc
614616

615617
if(!client) {
616618
// no free space to handle client
617-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
619+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
618620
#ifndef NODEBUG_WEBSOCKETS
619621
IPAddress ip = tcpClient->remoteIP();
620622
#endif
@@ -639,7 +641,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc
639641
* Handle incoming Connection Request
640642
*/
641643
void WebSocketsServer::handleNewClients(void) {
642-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
644+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
643645
while(_server->hasClient()) {
644646
#endif
645647

@@ -652,7 +654,7 @@ void WebSocketsServer::handleNewClients(void) {
652654

653655
handleNewClient(tcpClient);
654656

655-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
657+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
656658
}
657659
#endif
658660
}
@@ -923,7 +925,7 @@ void WebSocketsServer::begin(void) {
923925

924926
void WebSocketsServer::close(void) {
925927
WebSocketsServerCore::close();
926-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266)
928+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
927929
_server->close();
928930
#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC)
929931
_server->end();

src/WebSocketsServer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class WebSocketsServerCore : protected WebSockets {
9090
void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount);
9191
void disableHeartbeat();
9292

93-
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32)
93+
#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)
9494
IPAddress remoteIP(uint8_t num);
9595
#endif
9696

src/libb64/cdecode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64
99
#include <core_esp8266_features.h>
1010
#endif
1111

12-
#if defined(ESP32)
12+
#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
1313
#define CORE_HAS_LIBB64
1414
#endif
1515

src/libb64/cencode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64
99
#include <core_esp8266_features.h>
1010
#endif
1111

12-
#if defined(ESP32)
12+
#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
1313
#define CORE_HAS_LIBB64
1414
#endif
1515

0 commit comments

Comments
 (0)
0