-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathESP8266.h
255 lines (221 loc) · 6.72 KB
/
ESP8266.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/* ESP8266Interface Example
* Copyright (c) 2015 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ESP8266_H
#define ESP8266_H
#include "ATParser.h"
enum SignalingAction {
ESP8266_SOCKET_CONNECT,
ESP8266_SOCKET_CLOSE
};
/** ESP8266Interface class.
This is an interface to a ESP8266 radio.
*/
class ESP8266
{
public:
ESP8266(PinName tx, PinName rx, Callback<void(SignalingAction, int)> signalingCallback, bool debug=false);
/**
* Check firmware version of ESP8266
*
* @return integer firmware version or -1 if firmware query command gives outdated response
*/
int get_firmware_version(void);
/**
* Startup the ESP8266
*
* @param mode mode of WIFI 1-client, 2-host, 3-both
* @return true only if ESP8266 was setup correctly
*/
bool startup(int mode);
/**
* Reset ESP8266
*
* @return true only if ESP8266 resets successfully
*/
bool reset(void);
/**
* Enable/Disable DHCP
*
* @param enabled DHCP enabled when true
* @param mode mode of DHCP 0-softAP, 1-station, 2-both
* @return true only if ESP8266 enables/disables DHCP successfully
*/
bool dhcp(bool enabled, int mode);
/**
* Connect ESP8266 to AP
*
* @param ap the name of the AP
* @param passPhrase the password of AP
* @return true only if ESP8266 is connected successfully
*/
bool connect(const char *ap, const char *passPhrase);
/**
* Disconnect ESP8266 from AP
*
* @return true only if ESP8266 is disconnected successfully
*/
bool disconnect(void);
/**
* Get the IP address of ESP8266
*
* @return null-teriminated IP address or null if no IP address is assigned
*/
const char *getIPAddress(void);
/**
* Get the MAC address of ESP8266
*
* @return null-terminated MAC address or null if no MAC address is assigned
*/
const char *getMACAddress(void);
/** Get the local gateway
*
* @return Null-terminated representation of the local gateway
* or null if no network mask has been recieved
*/
const char *getGateway();
/** Get the local network mask
*
* @return Null-terminated representation of the local network mask
* or null if no network mask has been recieved
*/
const char *getNetmask();
/* Return RSSI for active connection
*
* @return Measured RSSI
*/
int8_t getRSSI();
/**
* Check if ESP8266 is conenected
*
* @return true only if the chip has an IP address
*/
bool isConnected(void);
/** Scan for available networks
*
* @param ap Pointer to allocated array to store discovered AP
* @param limit Size of allocated @a res array, or 0 to only count available AP
* @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error
* see @a nsapi_error
*/
int scan(WiFiAccessPoint *res, unsigned limit);
/**Perform a dns query
*
* @param name Hostname to resolve
* @param ip Buffer to store IP address
* @return 0 true on success, false on failure
*/
bool dns_lookup(const char *name, char *ip);
/**
* Open a socketed connection
*
* @param type the type of socket to open "UDP" or "TCP"
* @param id id to give the new socket, valid 0-4
* @param port port to open connection with
* @param addr the IP address of the destination
* @return true only if socket opened successfully
*/
bool open(const char *type, int id, const char* addr, int port);
/**
* Sends data to an open socket
*
* @param id id of socket to send to
* @param data data to be sent
* @param amount amount of data to be sent - max 1024
* @return true only if data sent successfully
*/
bool send(int id, const void *data, uint32_t amount);
/**
* Receives data from an open socket
*
* @param id id to receive from
* @param data placeholder for returned information
* @param amount number of bytes to be received
* @return the number of bytes received
*/
int32_t recv(int id, void *data, uint32_t amount);
/**
* Closes a socket
*
* @param id id of socket to close, valid only 0-4
* @return true only if socket is closed successfully
*/
bool close(int id);
/**
* Allows timeout to be changed between commands
*
* @param timeout_ms timeout of the connection
*/
void setTimeout(uint32_t timeout_ms);
/**
* Checks if data is available
*/
bool readable();
/**
* Checks if data can be written
*/
bool writeable();
/**
* Attach a function to call whenever network state has changed
*
* @param func A pointer to a void function, or 0 to set as none
*/
void attach(Callback<void(int)> func);
/**
* Attach a function to call whenever network state has changed
*
* @param obj pointer to the object to call the member function on
* @param method pointer to the member function to call
*/
template <typename T, typename M>
void attach(T *obj, M method) {
attach(Callback<void(int)>(obj, method));
}
/**
* Start binding to a port
*
* @param address SocketAddress instance (only port is being used)
*/
bool bind(const SocketAddress& address);
private:
void attach_rx(int);
void process_command(char*, size_t);
BufferedSerial _serial;
ATParser _parser;
Callback<void(SignalingAction, int)> _signalingCallback;
struct packet {
struct packet *next;
int id;
uint32_t len;
// data follows
} *_packets, **_packets_end;
void _packet_handler();
bool recv_ap(nsapi_wifi_ap_t *ap);
char _ip_buffer[16];
char _gateway_buffer[16];
char _netmask_buffer[16];
char _mac_buffer[18];
// TCPServer mode needs a separate thread to dispatch RX IRQ commands from
EventQueue* event_queue;
Thread* event_thread;
char* rx_buffer;
size_t rx_ix;
uint32_t _incoming_socket_status[5];
uint32_t _global_socket_counter;
bool _in_server_mode;
struct packet *_ipd_packet;
char* _ipd_packet_data_ptr;
};
#endif