Skip to content

Commit 5d6bc60

Browse files
author
Veijo Pesonen
committed
Organizing internal functions and data structures
1 parent 4468a15 commit 5d6bc60

File tree

2 files changed

+97
-76
lines changed

2 files changed

+97
-76
lines changed

ESP8266/ESP8266.cpp

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -26,43 +26,43 @@
2626
#define ESP8266_ALL_SOCKET_IDS -1
2727

2828
ESP8266::ESP8266(PinName tx, PinName rx, bool debug, PinName rts, PinName cts)
29-
: _serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
29+
: _sdk_v(-1,-1,-1),
30+
_at_v(-1,-1,-1),
31+
_tcp_passive(false),
32+
_serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
3033
_serial_rts(rts),
3134
_serial_cts(cts),
3235
_parser(&_serial),
33-
_tcp_passive(false),
3436
_packets(0),
3537
_packets_end(&_packets),
36-
_sdk_v(-1,-1,-1),
37-
_at_v(-1,-1,-1),
38+
_heap_usage(0),
3839
_connect_error(0),
3940
_fail(false),
4041
_sock_already(false),
4142
_closed(false),
42-
_connection_status(NSAPI_STATUS_DISCONNECTED),
43-
_heap_usage(0)
43+
_connection_status(NSAPI_STATUS_DISCONNECTED)
4444
{
4545
_serial.set_baud( ESP8266_DEFAULT_BAUD_RATE );
4646
_parser.debug_on(debug);
4747
_parser.set_delimiter("\r\n");
48-
_parser.oob("+IPD", callback(this, &ESP8266::_packet_handler));
48+
_parser.oob("+IPD", callback(this, &ESP8266::_oob_packet_hdlr));
4949
//Note: espressif at command document says that this should be +CWJAP_CUR:<error code>
5050
//but seems that at least current version is not sending it
5151
//https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
5252
//Also seems that ERROR is not sent, but FAIL instead
53-
_parser.oob("+CWJAP:", callback(this, &ESP8266::_connect_error_handler));
54-
_parser.oob("0,CLOSED", callback(this, &ESP8266::_oob_socket0_closed_handler));
55-
_parser.oob("1,CLOSED", callback(this, &ESP8266::_oob_socket1_closed_handler));
56-
_parser.oob("2,CLOSED", callback(this, &ESP8266::_oob_socket2_closed_handler));
57-
_parser.oob("3,CLOSED", callback(this, &ESP8266::_oob_socket3_closed_handler));
58-
_parser.oob("4,CLOSED", callback(this, &ESP8266::_oob_socket4_closed_handler));
59-
_parser.oob("WIFI ", callback(this, &ESP8266::_connection_status_handler));
60-
_parser.oob("UNLINK", callback(this, &ESP8266::_oob_socket_close_error));
61-
_parser.oob("ALREADY CONNECTED", callback(this, &ESP8266::_oob_cipstart_already_connected));
53+
_parser.oob("0,CLOSED", callback(this, &ESP8266::_oob_socket0_closed));
54+
_parser.oob("1,CLOSED", callback(this, &ESP8266::_oob_socket1_closed));
55+
_parser.oob("2,CLOSED", callback(this, &ESP8266::_oob_socket2_closed));
56+
_parser.oob("3,CLOSED", callback(this, &ESP8266::_oob_socket3_closed));
57+
_parser.oob("4,CLOSED", callback(this, &ESP8266::_oob_socket4_closed));
58+
_parser.oob("+CWJAP:", callback(this, &ESP8266::_oob_connect_err));
59+
_parser.oob("WIFI ", callback(this, &ESP8266::_oob_connection_status));
60+
_parser.oob("UNLINK", callback(this, &ESP8266::_oob_socket_close_err));
61+
_parser.oob("ALREADY CONNECTED", callback(this, &ESP8266::_oob_cipstart_already));
6262

6363
for(int i= 0; i < SOCKET_COUNT; i++) {
64-
_sinfo[i].open = false;
65-
_sinfo[i].proto = NSAPI_UDP;
64+
_sock_i[i].open = false;
65+
_sock_i[i].proto = NSAPI_UDP;
6666
}
6767
}
6868

@@ -377,7 +377,7 @@ int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
377377
return NSAPI_ERROR_DEVICE_ERROR;
378378
}
379379

380-
while (recv_ap(&ap)) {
380+
while (_recv_ap(&ap)) {
381381
if (cnt < limit) {
382382
res[cnt] = WiFiAccessPoint(ap);
383383
}
@@ -398,7 +398,7 @@ nsapi_error_t ESP8266::open_udp(int id, const char* addr, int port, int local_po
398398
static const char *type = "UDP";
399399
bool done = false;
400400

401-
if (id >= SOCKET_COUNT || _sinfo[id].open) {
401+
if (id >= SOCKET_COUNT || _sock_i[id].open) {
402402
return NSAPI_ERROR_PARAMETER;
403403
}
404404

@@ -423,8 +423,8 @@ nsapi_error_t ESP8266::open_udp(int id, const char* addr, int port, int local_po
423423
}
424424
continue;
425425
}
426-
_sinfo[id].open = true;
427-
_sinfo[id].proto = NSAPI_UDP;
426+
_sock_i[id].open = true;
427+
_sock_i[id].proto = NSAPI_UDP;
428428
break;
429429
}
430430
}
@@ -440,7 +440,7 @@ nsapi_error_t ESP8266::open_tcp(int id, const char* addr, int port, int keepaliv
440440
static const char *type = "TCP";
441441
bool done = false;
442442

443-
if (id >= SOCKET_COUNT || _sinfo[id].open) {
443+
if (id >= SOCKET_COUNT || _sock_i[id].open) {
444444
return NSAPI_ERROR_PARAMETER;
445445
}
446446

@@ -465,8 +465,8 @@ nsapi_error_t ESP8266::open_tcp(int id, const char* addr, int port, int keepaliv
465465
}
466466
continue;
467467
}
468-
_sinfo[id].open = true;
469-
_sinfo[id].proto = NSAPI_TCP;
468+
_sock_i[id].open = true;
469+
_sock_i[id].proto = NSAPI_TCP;
470470
break;
471471
}
472472
}
@@ -509,7 +509,7 @@ nsapi_error_t ESP8266::send(int id, const void *data, uint32_t amount)
509509
return NSAPI_ERROR_DEVICE_ERROR;
510510
}
511511

512-
void ESP8266::_packet_handler()
512+
void ESP8266::_oob_packet_hdlr()
513513
{
514514
int id;
515515
int amount;
@@ -521,8 +521,8 @@ void ESP8266::_packet_handler()
521521
}
522522
// In passive mode amount not used...
523523
if(_tcp_passive
524-
&& _sinfo[id].open == true
525-
&& _sinfo[id].proto == NSAPI_TCP) {
524+
&& _sock_i[id].open == true
525+
&& _sock_i[id].proto == NSAPI_TCP) {
526526
if (!_parser.recv("%d\n", &amount)) {
527527
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER, MBED_ERROR_CODE_ENODATA), \
528528
"ESP8266::_packet_handler(): Data length missing");
@@ -565,7 +565,7 @@ void ESP8266::_packet_handler()
565565
_packets_end = &packet->next;
566566
}
567567

568-
void ESP8266::process_oob(uint32_t timeout, bool all) {
568+
void ESP8266::_process_oob(uint32_t timeout, bool all) {
569569
set_timeout(timeout);
570570
// Poll for inbound packets
571571
while (_parser.process_oob() && all) {
@@ -592,7 +592,7 @@ int32_t ESP8266::_recv_tcp_passive(int id, void *data, uint32_t amount, uint32_t
592592
}
593593

594594
// Socket closed, doesn't mean there couldn't be data left
595-
if (!_sinfo[id].open) {
595+
if (!_sock_i[id].open) {
596596
done = _parser.send("AT+CIPRECVDATA=%d,%lu", id, amount)
597597
&& _parser.recv("+CIPRECVDATA,%ld:", &len)
598598
&& _parser.read((char*)data, len)
@@ -615,7 +615,7 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount, uint32_t timeout)
615615

616616
// No flow control, drain the USART receive register ASAP to avoid data overrun
617617
if (_serial_rts == NC) {
618-
process_oob(timeout, true);
618+
_process_oob(timeout, true);
619619
}
620620

621621
// check if any packets are ready for us
@@ -649,14 +649,14 @@ int32_t ESP8266::recv_tcp(int id, void *data, uint32_t amount, uint32_t timeout)
649649
}
650650
}
651651
}
652-
if(!_sinfo[id].open) {
652+
if(!_sock_i[id].open) {
653653
_smutex.unlock();
654654
return 0;
655655
}
656656

657657
// Flow control, read from USART receive register only when no more data is buffered, and as little as possible
658658
if (_serial_rts != NC) {
659-
process_oob(timeout, false);
659+
_process_oob(timeout, false);
660660
}
661661
_smutex.unlock();
662662

@@ -670,7 +670,7 @@ int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount, uint32_t timeout)
670670

671671
// No flow control, drain the USART receive register ASAP to avoid data overrun
672672
if (_serial_rts == NC) {
673-
process_oob(timeout, true);
673+
_process_oob(timeout, true);
674674
}
675675

676676
set_timeout();
@@ -699,7 +699,7 @@ int32_t ESP8266::recv_udp(int id, void *data, uint32_t amount, uint32_t timeout)
699699

700700
// Flow control, read from USART receive register only when no more data is buffered, and as little as possible
701701
if (_serial_rts != NC) {
702-
process_oob(timeout, false);
702+
_process_oob(timeout, false);
703703
}
704704

705705
_smutex.unlock();
@@ -738,15 +738,15 @@ bool ESP8266::close(int id)
738738
if (!_parser.recv("OK\n")) {
739739
if (_closed) { // UNLINK ERROR
740740
_closed = false;
741-
_sinfo[id].open = false;
741+
_sock_i[id].open = false;
742742
_clear_socket_packets(id);
743743
_smutex.unlock();
744744
// ESP8266 has a habit that it might close a socket on its own.
745745
//debug("ESP8266: socket %d already closed when calling close\n", id);
746746
return true;
747747
}
748748
} else {
749-
_socket_open[id].id = -1;
749+
_sock_i[id].open = false;
750750
_clear_socket_packets(id);
751751
_smutex.unlock();
752752
return true;
@@ -783,7 +783,7 @@ void ESP8266::attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
783783
_connection_status_cb = status_cb;
784784
}
785785

786-
bool ESP8266::recv_ap(nsapi_wifi_ap_t *ap)
786+
bool ESP8266::_recv_ap(nsapi_wifi_ap_t *ap)
787787
{
788788
int sec;
789789
int dummy;
@@ -801,7 +801,7 @@ bool ESP8266::recv_ap(nsapi_wifi_ap_t *ap)
801801
return ret;
802802
}
803803

804-
void ESP8266::_connect_error_handler()
804+
void ESP8266::_oob_connect_err()
805805
{
806806
_fail = false;
807807
_connect_error = 0;
@@ -813,46 +813,46 @@ void ESP8266::_connect_error_handler()
813813
}
814814

815815

816-
void ESP8266::_oob_cipstart_already_connected()
816+
void ESP8266::_oob_cipstart_already()
817817
{
818818
_sock_already = true;
819819
_parser.abort();
820820
}
821821

822-
void ESP8266::_oob_socket_close_error()
822+
void ESP8266::_oob_socket_close_err()
823823
{
824824
if (_parser.recv("ERROR\n")) {
825825
_closed = true; // Not possible to pinpoint to a certain socket
826826
_parser.abort();
827827
}
828828
}
829829

830-
void ESP8266::_oob_socket0_closed_handler()
830+
void ESP8266::_oob_socket0_closed()
831831
{
832-
_sinfo[0].open = false;
832+
_sock_i[0].open = false;
833833
}
834834

835-
void ESP8266::_oob_socket1_closed_handler()
835+
void ESP8266::_oob_socket1_closed()
836836
{
837-
_sinfo[1].open = false;
837+
_sock_i[1].open = false;
838838
}
839839

840-
void ESP8266::_oob_socket2_closed_handler()
840+
void ESP8266::_oob_socket2_closed()
841841
{
842-
_sinfo[2].open = false;
842+
_sock_i[2].open = false;
843843
}
844844

845-
void ESP8266::_oob_socket3_closed_handler()
845+
void ESP8266::_oob_socket3_closed()
846846
{
847-
_sinfo[3].open = false;
847+
_sock_i[3].open = false;
848848
}
849849

850-
void ESP8266::_oob_socket4_closed_handler()
850+
void ESP8266::_oob_socket4_closed()
851851
{
852-
_sinfo[4].open = false;
852+
_sock_i[4].open = false;
853853
}
854854

855-
void ESP8266::_connection_status_handler()
855+
void ESP8266::_oob_connection_status()
856856
{
857857
char status[13];
858858
if (_parser.recv("%12[^\"]\n", status)) {

ESP8266/ESP8266.h

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -343,55 +343,76 @@ class ESP8266
343343
static const int8_t SOCKET_COUNT = 5;
344344

345345
private:
346+
// FW version
347+
struct fw_sdk_version _sdk_v;
348+
struct fw_at_version _at_v;
349+
350+
// FW version specific settings and functionalities
351+
bool _tcp_passive;
352+
int32_t _recv_tcp_passive(int id, void *data, uint32_t amount, uint32_t timeout);
353+
354+
// UART settings
346355
UARTSerial _serial;
347356
PinName _serial_rts;
348357
PinName _serial_cts;
349-
ATCmdParser _parser;
350358
Mutex _smutex; // Protect serial port access
351-
bool _tcp_passive;
352359

360+
// AT Command Parser
361+
ATCmdParser _parser;
362+
363+
// Wifi scan result handling
364+
bool _recv_ap(nsapi_wifi_ap_t *ap);
365+
366+
// Socket data buffer
353367
struct packet {
354368
struct packet *next;
355369
int id;
356370
uint32_t len; // Remaining length
357371
uint32_t alloc_len; // Original length
358372
// data follows
359373
} *_packets, **_packets_end;
360-
361-
struct fw_sdk_version _sdk_v;
362-
struct fw_at_version _at_v;
363-
void _packet_handler();
364-
void _connect_error_handler();
365-
void _oob_cipstart_already_connected();
366-
bool recv_ap(nsapi_wifi_ap_t *ap);
367-
void _oob_socket0_closed_handler();
368-
void _oob_socket1_closed_handler();
369-
void _oob_socket2_closed_handler();
370-
void _oob_socket3_closed_handler();
371-
void _oob_socket4_closed_handler();
372-
void _connection_status_handler();
373-
void _oob_socket_close_error();
374374
void _clear_socket_packets(int id);
375-
void process_oob(uint32_t timeout, bool all);
376-
int32_t _recv_tcp_passive(int id, void *data, uint32_t amount, uint32_t timeout);
377375

376+
// Memory statistics
377+
size_t _heap_usage; // (Socket data buffer usage)
378+
379+
// OOB processing
380+
void _process_oob(uint32_t timeout, bool all);
381+
382+
// OOB message handlers
383+
void _oob_packet_hdlr();
384+
void _oob_connect_err();
385+
void _oob_cipstart_already();
386+
void _oob_socket0_closed();
387+
void _oob_socket1_closed();
388+
void _oob_socket2_closed();
389+
void _oob_socket3_closed();
390+
void _oob_socket4_closed();
391+
void _oob_connection_status();
392+
void _oob_socket_close_err();
393+
394+
// OOB state variables
395+
int _connect_error;
396+
bool _fail;
397+
bool _sock_already;
398+
bool _closed;
399+
400+
// Modem's address info
378401
char _ip_buffer[16];
379402
char _gateway_buffer[16];
380403
char _netmask_buffer[16];
381404
char _mac_buffer[18];
405+
406+
// Modem's socket info
382407
struct _sock_info {
383408
bool open;
384409
nsapi_protocol_t proto;
385410
};
411+
struct _sock_info _sock_i[SOCKET_COUNT];
386412

387-
int _connect_error;
388-
bool _fail;
389-
bool _sock_already;
390-
bool _closed;
391-
struct _sock_info _sinfo[SOCKET_COUNT];
413+
// Connection state reporting
392414
nsapi_connection_status_t _connection_status;
393415
Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
394-
size_t _heap_usage;
395416
};
396417

397418
#endif

0 commit comments

Comments
 (0)