Skip to content

Commit 6739d37

Browse files
committed
Implemented wifi client (not fully debugged yet)
Former-commit-id: 04ae6eb
1 parent 66504e2 commit 6739d37

File tree

7 files changed

+298
-23
lines changed

7 files changed

+298
-23
lines changed

libraries/WiFiS3/src/Modem.cpp

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#include "Modem.h"
22

3-
#define PROMPT_OK "OK\r\n"
4-
#define PROMPT_ERROR "ERROR\r\n"
3+
#define RESULT_OK "OK\r\n"
4+
#define RESULT_ERROR "ERROR\r\n"
5+
#define RESULT_DATA "DATA\r\n"
56

67
ModemClass::ModemClass(int tx, int rx) : beginned(false), delete_serial(false), _timeout(MODEM_TIMEOUT) {
78
_serial = new UART(tx,rx);
@@ -29,6 +30,60 @@ void ModemClass::end(){
2930
_serial->end();
3031
}
3132

33+
34+
bool ModemClass::passthrough(const uint8_t *data, size_t size) {
35+
Serial.println("[CALL] ModemClass::passthrough");
36+
_serial->write(data,size);
37+
bool res = false;
38+
bool found = false;
39+
string data_res = "";
40+
unsigned long start_time = millis();
41+
while(millis() - start_time < _timeout && !found){
42+
while(_serial->available()){
43+
char c = _serial->read();
44+
data_res += c;
45+
if(string::npos != data_res.rfind(RESULT_OK)){
46+
found = true;
47+
res = true;
48+
break;
49+
}
50+
else if (string::npos != data_res.rfind(RESULT_ERROR)) {
51+
res = false;
52+
break;
53+
}
54+
}
55+
}
56+
#ifdef MODEM_DEBUG
57+
Serial.print(" passthrough, rx |>>");
58+
Serial.print(data_res.c_str());
59+
Serial.println("<<|");
60+
if(res) {
61+
Serial.println(" Result: OK");
62+
}
63+
else {
64+
Serial.println(" Result: FAILED");
65+
}
66+
#endif
67+
return res;
68+
}
69+
70+
void ModemClass::write_nowait(const string &cmd, string &str, char * fmt, ...) {
71+
72+
memset(tx_buff,0x00,MAX_BUFF_SIZE);
73+
va_list va;
74+
va_start (va, fmt);
75+
vsprintf ((char *)tx_buff, fmt, va);
76+
va_end (va);
77+
#ifdef MODEM_DEBUG
78+
Serial.print(" Write Call no wait, command sent: ");
79+
Serial.write(tx_buff,strlen((char *)tx_buff));
80+
Serial.println();
81+
#endif
82+
_serial->write(tx_buff,strlen((char *)tx_buff));
83+
return;
84+
}
85+
86+
3287
bool ModemClass::write(const string &prompt, string &data_res, char * fmt, ...){
3388

3489
data_res.clear();
@@ -56,9 +111,23 @@ bool ModemClass::buf_read(const string &prompt, string &data_res) {
56111
while(_serial->available()){
57112
char c = _serial->read();
58113
data_res += c;
59-
if(string::npos != data_res.rfind(PROMPT_OK)){
114+
if(string::npos != data_res.rfind(RESULT_DATA)) {
115+
found = true;
116+
data_res = data_res.substr(0, data_res.length() - sizeof(RESULT_DATA));
117+
if(prompt != DO_NOT_CHECK_CMD) {
118+
if(removeAtBegin(data_res, prompt)) {
119+
Serial.println("DATA RECIVED");
120+
res = true;
121+
}
122+
}
123+
else {
124+
res = true;
125+
}
126+
break;
127+
}
128+
else if(string::npos != data_res.rfind(RESULT_OK)){
60129
found = true;
61-
data_res = data_res.substr(0, data_res.length() - sizeof(PROMPT_OK));
130+
data_res = data_res.substr(0, data_res.length() - sizeof(RESULT_OK));
62131
if(prompt != DO_NOT_CHECK_CMD) {
63132
if(removeAtBegin(data_res, prompt)) {
64133
res = true;
@@ -69,8 +138,8 @@ bool ModemClass::buf_read(const string &prompt, string &data_res) {
69138
}
70139
break;
71140
}
72-
else if (string::npos != data_res.rfind(PROMPT_ERROR)) {
73-
data_res.substr(0, data_res.length() - sizeof(PROMPT_ERROR));
141+
else if (string::npos != data_res.rfind(RESULT_ERROR)) {
142+
data_res.substr(0, data_res.length() - sizeof(RESULT_ERROR));
74143
res = false;
75144
break;
76145
}

libraries/WiFiS3/src/Modem.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ModemClass {
2626
void begin(int badurate = 115200);
2727
void end();
2828
bool write(const string &cmd, string &str, char * fmt, ...);
29+
void write_nowait(const string &cmd, string &str, char * fmt, ...);
30+
31+
bool passthrough(const uint8_t *data, size_t size);
2932

3033
bool beginned;
3134

libraries/WiFiS3/src/WiFi.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ uint8_t CWifi::encryptionType() {
446446
/* -------------------------------------------------------------------------- */
447447
uint8_t CWifi::status() {
448448
/* -------------------------------------------------------------------------- */
449+
modem.begin();
449450
string res = "";
450451
if(modem.write(string(PROMPT(_GETSTATUS)), res, CMD_READ(_GETSTATUS))) {
451452
return atoi(res.c_str());

libraries/WiFiS3/src/WiFiClient.cpp

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
#include "WiFiClient.h"
2+
3+
/* -------------------------------------------------------------------------- */
4+
WiFiClient::WiFiClient() : _sock(-1) { }
5+
/* -------------------------------------------------------------------------- */
6+
7+
/* -------------------------------------------------------------------------- */
8+
void WiFiClient::getSocket() {
9+
/* -------------------------------------------------------------------------- */
10+
if(_sock == -1) {
11+
string res = "";
12+
modem.begin();
13+
14+
if(modem.write(string(PROMPT(_BEGINCLIENT)),res, "%s" , CMD(_BEGINCLIENT))) {
15+
_sock = atoi(res.c_str());
16+
Serial.print("GET SOCKET: ");
17+
Serial.println(_sock);
18+
}
19+
}
20+
}
21+
22+
23+
24+
/* -------------------------------------------------------------------------- */
25+
int WiFiClient::connect(IPAddress ip, uint16_t port){
26+
/* -------------------------------------------------------------------------- */
27+
getSocket();
28+
if(_sock >= 0) {
29+
string res = "";
30+
modem.begin();
31+
if(modem.write(string(PROMPT(_CLIENTCONNECTIP)),res, "%s%d,%s,%d\r\n" , CMD_WRITE(_CLIENTCONNECTIP), _sock, ip.toString(),port)) {
32+
return 1;
33+
}
34+
}
35+
return 0;
36+
}
37+
38+
/* -------------------------------------------------------------------------- */
39+
int WiFiClient::connect(const char *host, uint16_t port){
40+
/* -------------------------------------------------------------------------- */
41+
getSocket();
42+
if(_sock >= 0) {
43+
string res = "";
44+
modem.begin();
45+
if(modem.write(string(PROMPT(_CLIENTCONNECTNAME)),res, "%s%d,%s,%d\r\n" , CMD_WRITE(_CLIENTCONNECTNAME), _sock, host,port)) {
46+
return 1;
47+
}
48+
}
49+
return 0;
50+
}
51+
52+
/* -------------------------------------------------------------------------- */
53+
size_t WiFiClient::write(uint8_t b){
54+
/* -------------------------------------------------------------------------- */
55+
return write(&b, 1);
56+
}
57+
58+
/* -------------------------------------------------------------------------- */
59+
size_t WiFiClient::write(const uint8_t *buf, size_t size){
60+
/* -------------------------------------------------------------------------- */
61+
if(_sock >= 0) {
62+
string res = "";
63+
modem.begin();
64+
modem.write_nowait(string(PROMPT(_CLIENTSEND)),res, "%s%d,%d\r\n" , CMD_WRITE(_CLIENTSEND), _sock, size);
65+
if(modem.passthrough(buf,size)) {
66+
return size;
67+
}
68+
69+
}
70+
return 0;
71+
72+
}
73+
74+
75+
76+
/* -------------------------------------------------------------------------- */
77+
int WiFiClient::available(){
78+
/* -------------------------------------------------------------------------- */
79+
int rv = 0;
80+
if(_sock >= 0) {
81+
string res = "";
82+
modem.begin();
83+
if(modem.write(string(PROMPT(_AVAILABLE)),res, "%s%d\r\n" , CMD_WRITE(_AVAILABLE), _sock)) {
84+
rv = atoi(res.c_str());
85+
}
86+
}
87+
return rv;
88+
}
89+
90+
/* -------------------------------------------------------------------------- */
91+
int WiFiClient::read() {
92+
/* -------------------------------------------------------------------------- */
93+
uint8_t b;
94+
if(read(&b, 1) == 1) {
95+
return b;
96+
}
97+
return -1;
98+
}
99+
100+
/* -------------------------------------------------------------------------- */
101+
int WiFiClient::read(uint8_t *buf, size_t size) {
102+
/* -------------------------------------------------------------------------- */
103+
int rv = -1;
104+
if(_sock >= 0) {
105+
string res = "";
106+
modem.begin();
107+
vector<string> tokens;
108+
if(modem.write(string(PROMPT(_CLIENTRECEIVE)),res, "%s%d,%d\r\n" , CMD_WRITE(_CLIENTRECEIVE), _sock, size)) {
109+
split(tokens, res, string("|"));
110+
if(tokens.size() >= 2) {
111+
rv = atoi(tokens[0].c_str());
112+
memcpy(buf,tokens[1].data(), (rv < size) ? rv : size);
113+
}
114+
}
115+
}
116+
return rv;
117+
}
118+
119+
/* -------------------------------------------------------------------------- */
120+
int WiFiClient::peek() {
121+
/* -------------------------------------------------------------------------- */
122+
int rv = -1;
123+
if(_sock >= 0) {
124+
string res = "";
125+
modem.begin();
126+
if(modem.write(string(PROMPT(_PEEK)),res, "%s%d\r\n" , CMD_WRITE(_PEEK), _sock)) {
127+
rv = atoi(res.c_str());
128+
}
129+
}
130+
return rv;
131+
}
132+
133+
134+
/* -------------------------------------------------------------------------- */
135+
void WiFiClient::flush() {
136+
/* -------------------------------------------------------------------------- */
137+
if(_sock >= 0) {
138+
string res = "";
139+
modem.begin();
140+
modem.write(string(PROMPT(_CLIENTFLUSH)),res, "%s%d\r\n" , CMD_WRITE(_CLIENTFLUSH), _sock);
141+
}
142+
}
143+
144+
/* -------------------------------------------------------------------------- */
145+
void WiFiClient::stop() {
146+
/* -------------------------------------------------------------------------- */
147+
if(_sock >= 0) {
148+
string res = "";
149+
modem.begin();
150+
modem.write(string(PROMPT(_CLIENTCLOSE)),res, "%s%d\r\n" , CMD_WRITE(_CLIENTCLOSE), _sock);
151+
_sock = -1;
152+
}
153+
}
154+
155+
/* -------------------------------------------------------------------------- */
156+
uint8_t WiFiClient::connected() {
157+
/* -------------------------------------------------------------------------- */
158+
uint8_t rv = 0;
159+
if(_sock >= 0) {
160+
string res = "";
161+
modem.begin();
162+
if(modem.write(string(PROMPT(_CLIENTCONNECTED)),res, "%s%d\r\n" , CMD_WRITE(_CLIENTCONNECTED), _sock)) {
163+
rv = atoi(res.c_str());
164+
}
165+
}
166+
return rv;
167+
}
168+
169+
170+
171+
/* -------------------------------------------------------------------------- */
172+
IPAddress WiFiClient::remoteIP() {
173+
/* -------------------------------------------------------------------------- */
174+
IPAddress ip;
175+
if(_sock >= 0) {
176+
string res = "";
177+
modem.begin();
178+
if(modem.write(string(PROMPT(_REMOTEIP)),res, "%s%d\r\n" , CMD_WRITE(_REMOTEIP), _sock)) {
179+
ip.fromString(res.c_str());
180+
return ip;
181+
}
182+
}
183+
return IPAddress(0,0,0,0);
184+
}
185+
186+
/* -------------------------------------------------------------------------- */
187+
uint16_t WiFiClient::remotePort(){
188+
/* -------------------------------------------------------------------------- */
189+
uint16_t rv = 0;
190+
if(_sock >= 0) {
191+
string res = "";
192+
modem.begin();
193+
if(modem.write(string(PROMPT(_REMOTEPORT)),res, "%s%d\r\n" , CMD_WRITE(_REMOTEPORT), _sock)) {
194+
rv = atoi(res.c_str());
195+
return rv;
196+
}
197+
}
198+
return rv;
199+
}

libraries/WiFiS3/src/WifiClient.h renamed to libraries/WiFiS3/src/WiFiClient.h

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,46 +24,43 @@
2424
#include "Print.h"
2525
#include "Client.h"
2626
#include "IPAddress.h"
27+
#include "WiFiCommands.h"
28+
#include "WiFiTypes.h"
29+
#include "Modem.h"
30+
31+
2732

2833
class WiFiClient : public Client {
2934

3035
public:
3136
WiFiClient();
32-
WiFiClient(uint8_t sock);
33-
34-
uint8_t status();
3537
virtual int connect(IPAddress ip, uint16_t port);
3638
virtual int connect(const char *host, uint16_t port);
37-
virtual int connectSSL(IPAddress ip, uint16_t port);
38-
virtual int connectSSL(const char *host, uint16_t port);
39-
virtual int connectBearSSL(IPAddress ip, uint16_t port);
40-
virtual int connectBearSSL(const char *host, uint16_t port);
4139
virtual size_t write(uint8_t);
4240
virtual size_t write(const uint8_t *buf, size_t size);
43-
virtual size_t retry(const uint8_t *buf, size_t size, bool write);
4441
virtual int available();
4542
virtual int read();
4643
virtual int read(uint8_t *buf, size_t size);
4744
virtual int peek();
48-
virtual void setRetry(bool retry);
4945
virtual void flush();
5046
virtual void stop();
5147
virtual uint8_t connected();
52-
virtual operator bool();
48+
virtual operator bool() {
49+
return _sock != -1;
50+
}
5351

5452
virtual IPAddress remoteIP();
5553
virtual uint16_t remotePort();
5654

5755
friend class WiFiServer;
58-
friend class WiFiDrv;
59-
56+
6057
using Print::write;
6158

6259
private:
63-
static uint16_t _srcport;
64-
uint8_t _sock; //not used
65-
uint16_t _socket;
66-
bool _retrySend;
60+
int8_t _sock;
61+
void getSocket();
62+
63+
6764
};
6865

6966
#endif

libraries/WiFiS3/src/WiFiS3.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@
2121
#define WiFiS3_h
2222

2323
#include "WiFi.h"
24+
#include "WiFiClient.h"
2425

2526
#endif

0 commit comments

Comments
 (0)