Skip to content

Commit da5aca8

Browse files
committed
support server.accept() for WiFiNINA library
1 parent 63823f9 commit da5aca8

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

arduino/libraries/WiFi/src/WiFiServer.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ void WiFiServer::begin()
7474

7575
WiFiClient WiFiServer::available(uint8_t* status)
7676
{
77-
int result = lwip_accept(_socket, NULL, 0);
77+
int result = -1;
78+
if (_accepted_sock >= 0) {
79+
result = _accepted_sock;
80+
_accepted_sock = -1;
81+
} else {
82+
result = lwip_accept(_socket, NULL, 0);
83+
}
7884

7985
if (status) {
8086
*status = (result != -1);
@@ -111,6 +117,25 @@ WiFiClient WiFiServer::available(uint8_t* status)
111117
return WiFiClient(result);
112118
}
113119

120+
WiFiClient WiFiServer::accept()
121+
{
122+
int result = -1;
123+
if (_accepted_sock >= 0) {
124+
result = _accepted_sock;
125+
_accepted_sock = -1;
126+
} else {
127+
result = lwip_accept(_socket, NULL, 0);
128+
}
129+
return WiFiClient(result);
130+
}
131+
132+
bool WiFiServer::hasClient() {
133+
if (_accepted_sock != -1)
134+
return true;
135+
_accepted_sock = lwip_accept(_socket, NULL, 0);
136+
return (_accepted_sock != -1);
137+
}
138+
114139
uint8_t WiFiServer::status() {
115140
// Deprecated.
116141
return 0;

arduino/libraries/WiFi/src/WiFiServer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class WiFiServer /*: public Server*/ {
3232
WiFiServer();
3333
WiFiServer(uint16_t);
3434
WiFiClient available(uint8_t* status = NULL);
35+
WiFiClient accept();
36+
bool hasClient();
3537
void begin();
3638
virtual size_t write(uint8_t);
3739
virtual size_t write(const uint8_t *buf, size_t size);
@@ -45,6 +47,7 @@ class WiFiServer /*: public Server*/ {
4547
uint16_t _port;
4648
int _socket;
4749
int _spawnedSockets[CONFIG_LWIP_MAX_SOCKETS];
50+
int _accepted_sock = -1;
4851
};
4952

5053
#endif // WIFISERVER_H

main/CommandHandler.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,10 +454,24 @@ int availDataTcp(const uint8_t command[], uint8_t response[])
454454

455455
if (socketTypes[socket] == 0x00) {
456456
if (tcpServers[socket]) {
457-
WiFiClient client = tcpServers[socket].available();
458457

458+
uint8_t accept = command[6];
459459
available = 255;
460460

461+
if (accept) {
462+
for (int i = 0; i < MAX_SOCKETS; i++) {
463+
if (socketTypes[i] == 255) {
464+
WiFiClient client = tcpServers[socket].accept();
465+
if (client) {
466+
socketTypes[i] = 0x00;
467+
tcpClients[i] = client;
468+
available = i;
469+
}
470+
break;
471+
}
472+
}
473+
} else {
474+
WiFiClient client = tcpServers[socket].available();
461475
if (client) {
462476
// try to find existing socket slot
463477
for (int i = 0; i < MAX_SOCKETS; i++) {
@@ -489,6 +503,7 @@ int availDataTcp(const uint8_t command[], uint8_t response[])
489503
}
490504
}
491505
}
506+
}
492507
} else {
493508
available = tcpClients[socket].available();
494509
}
@@ -1680,7 +1695,7 @@ void CommandHandlerClass::updateGpio0Pin()
16801695

16811696
for (int i = 0; i < MAX_SOCKETS; i++) {
16821697
if (socketTypes[i] == 0x00) {
1683-
if (tcpServers[i] && tcpServers[i].available()) {
1698+
if (tcpServers[i] && (tcpServers[i].hasClient() || tcpServers[i].available())) {
16841699
available = 1;
16851700
break;
16861701
} else if (tcpClients[i] && tcpClients[i].connected() && tcpClients[i].available()) {

0 commit comments

Comments
 (0)