RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /* ESP8266Interface Example
kevman 2:7aab896b1a3b 2 * Copyright (c) 2015 ARM Limited
kevman 2:7aab896b1a3b 3 *
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 2:7aab896b1a3b 5 * you may not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 2:7aab896b1a3b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16
kevman 2:7aab896b1a3b 17 #ifndef ESP8266_H
kevman 2:7aab896b1a3b 18 #define ESP8266_H
kevman 2:7aab896b1a3b 19
kevman 2:7aab896b1a3b 20 #include "ATCmdParser.h"
kevman 2:7aab896b1a3b 21 #include "nsapi_types.h"
kevman 2:7aab896b1a3b 22 #include "rtos.h"
kevman 2:7aab896b1a3b 23
kevman 2:7aab896b1a3b 24 // Various timeouts for different ESP8266 operations
kevman 2:7aab896b1a3b 25 #ifndef ESP8266_CONNECT_TIMEOUT
kevman 2:7aab896b1a3b 26 #define ESP8266_CONNECT_TIMEOUT 15000
kevman 2:7aab896b1a3b 27 #endif
kevman 2:7aab896b1a3b 28 #ifndef ESP8266_SEND_TIMEOUT
kevman 2:7aab896b1a3b 29 #define ESP8266_SEND_TIMEOUT 2000
kevman 2:7aab896b1a3b 30 #endif
kevman 2:7aab896b1a3b 31 #ifndef ESP8266_RECV_TIMEOUT
kevman 2:7aab896b1a3b 32 #define ESP8266_RECV_TIMEOUT 2000
kevman 2:7aab896b1a3b 33 #endif
kevman 2:7aab896b1a3b 34 #ifndef ESP8266_MISC_TIMEOUT
kevman 2:7aab896b1a3b 35 #define ESP8266_MISC_TIMEOUT 2000
kevman 2:7aab896b1a3b 36 #endif
kevman 2:7aab896b1a3b 37
kevman 2:7aab896b1a3b 38 /** ESP8266Interface class.
kevman 2:7aab896b1a3b 39 This is an interface to a ESP8266 radio.
kevman 2:7aab896b1a3b 40 */
kevman 2:7aab896b1a3b 41 class ESP8266
kevman 2:7aab896b1a3b 42 {
kevman 2:7aab896b1a3b 43 public:
kevman 2:7aab896b1a3b 44 ESP8266(PinName tx, PinName rx, bool debug=false);
kevman 2:7aab896b1a3b 45
kevman 2:7aab896b1a3b 46 /**
kevman 2:7aab896b1a3b 47 * Check firmware version of ESP8266
kevman 2:7aab896b1a3b 48 *
kevman 2:7aab896b1a3b 49 * @return integer firmware version or -1 if firmware query command gives outdated response
kevman 2:7aab896b1a3b 50 */
kevman 2:7aab896b1a3b 51 int get_firmware_version(void);
kevman 2:7aab896b1a3b 52
kevman 2:7aab896b1a3b 53 /**
kevman 2:7aab896b1a3b 54 * Startup the ESP8266
kevman 2:7aab896b1a3b 55 *
kevman 2:7aab896b1a3b 56 * @param mode mode of WIFI 1-client, 2-host, 3-both
kevman 2:7aab896b1a3b 57 * @return true only if ESP8266 was setup correctly
kevman 2:7aab896b1a3b 58 */
kevman 2:7aab896b1a3b 59 bool startup(int mode);
kevman 2:7aab896b1a3b 60
kevman 2:7aab896b1a3b 61 /**
kevman 2:7aab896b1a3b 62 * Reset ESP8266
kevman 2:7aab896b1a3b 63 *
kevman 2:7aab896b1a3b 64 * @return true only if ESP8266 resets successfully
kevman 2:7aab896b1a3b 65 */
kevman 2:7aab896b1a3b 66 bool reset(void);
kevman 2:7aab896b1a3b 67
kevman 2:7aab896b1a3b 68 /**
kevman 2:7aab896b1a3b 69 * Enable/Disable DHCP
kevman 2:7aab896b1a3b 70 *
kevman 2:7aab896b1a3b 71 * @param enabled DHCP enabled when true
kevman 2:7aab896b1a3b 72 * @param mode mode of DHCP 0-softAP, 1-station, 2-both
kevman 2:7aab896b1a3b 73 * @return true only if ESP8266 enables/disables DHCP successfully
kevman 2:7aab896b1a3b 74 */
kevman 2:7aab896b1a3b 75 bool dhcp(bool enabled, int mode);
kevman 2:7aab896b1a3b 76
kevman 2:7aab896b1a3b 77 /**
kevman 2:7aab896b1a3b 78 * Connect ESP8266 to AP
kevman 2:7aab896b1a3b 79 *
kevman 2:7aab896b1a3b 80 * @param ap the name of the AP
kevman 2:7aab896b1a3b 81 * @param passPhrase the password of AP
kevman 2:7aab896b1a3b 82 * @return NSAPI_ERROR_OK only if ESP8266 is connected successfully
kevman 2:7aab896b1a3b 83 */
kevman 2:7aab896b1a3b 84 nsapi_error_t connect(const char *ap, const char *passPhrase);
kevman 2:7aab896b1a3b 85
kevman 2:7aab896b1a3b 86 /**
kevman 2:7aab896b1a3b 87 * Disconnect ESP8266 from AP
kevman 2:7aab896b1a3b 88 *
kevman 2:7aab896b1a3b 89 * @return true only if ESP8266 is disconnected successfully
kevman 2:7aab896b1a3b 90 */
kevman 2:7aab896b1a3b 91 bool disconnect(void);
kevman 2:7aab896b1a3b 92
kevman 2:7aab896b1a3b 93 /**
kevman 2:7aab896b1a3b 94 * Get the IP address of ESP8266
kevman 2:7aab896b1a3b 95 *
kevman 2:7aab896b1a3b 96 * @return null-teriminated IP address or null if no IP address is assigned
kevman 2:7aab896b1a3b 97 */
kevman 2:7aab896b1a3b 98 const char *getIPAddress(void);
kevman 2:7aab896b1a3b 99
kevman 2:7aab896b1a3b 100 /**
kevman 2:7aab896b1a3b 101 * Get the MAC address of ESP8266
kevman 2:7aab896b1a3b 102 *
kevman 2:7aab896b1a3b 103 * @return null-terminated MAC address or null if no MAC address is assigned
kevman 2:7aab896b1a3b 104 */
kevman 2:7aab896b1a3b 105 const char *getMACAddress(void);
kevman 2:7aab896b1a3b 106
kevman 2:7aab896b1a3b 107 /** Get the local gateway
kevman 2:7aab896b1a3b 108 *
kevman 2:7aab896b1a3b 109 * @return Null-terminated representation of the local gateway
kevman 2:7aab896b1a3b 110 * or null if no network mask has been recieved
kevman 2:7aab896b1a3b 111 */
kevman 2:7aab896b1a3b 112 const char *getGateway();
kevman 2:7aab896b1a3b 113
kevman 2:7aab896b1a3b 114 /** Get the local network mask
kevman 2:7aab896b1a3b 115 *
kevman 2:7aab896b1a3b 116 * @return Null-terminated representation of the local network mask
kevman 2:7aab896b1a3b 117 * or null if no network mask has been recieved
kevman 2:7aab896b1a3b 118 */
kevman 2:7aab896b1a3b 119 const char *getNetmask();
kevman 2:7aab896b1a3b 120
kevman 2:7aab896b1a3b 121 /* Return RSSI for active connection
kevman 2:7aab896b1a3b 122 *
kevman 2:7aab896b1a3b 123 * @return Measured RSSI
kevman 2:7aab896b1a3b 124 */
kevman 2:7aab896b1a3b 125 int8_t getRSSI();
kevman 2:7aab896b1a3b 126
kevman 2:7aab896b1a3b 127 /** Scan for available networks
kevman 2:7aab896b1a3b 128 *
kevman 2:7aab896b1a3b 129 * @param ap Pointer to allocated array to store discovered AP
kevman 2:7aab896b1a3b 130 * @param limit Size of allocated @a res array, or 0 to only count available AP
kevman 2:7aab896b1a3b 131 * @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error
kevman 2:7aab896b1a3b 132 * see @a nsapi_error
kevman 2:7aab896b1a3b 133 */
kevman 2:7aab896b1a3b 134 int scan(WiFiAccessPoint *res, unsigned limit);
kevman 2:7aab896b1a3b 135
kevman 2:7aab896b1a3b 136 /**Perform a dns query
kevman 2:7aab896b1a3b 137 *
kevman 2:7aab896b1a3b 138 * @param name Hostname to resolve
kevman 2:7aab896b1a3b 139 * @param ip Buffer to store IP address
kevman 2:7aab896b1a3b 140 * @return 0 true on success, false on failure
kevman 2:7aab896b1a3b 141 */
kevman 2:7aab896b1a3b 142 bool dns_lookup(const char *name, char *ip);
kevman 2:7aab896b1a3b 143
kevman 2:7aab896b1a3b 144 /**
kevman 2:7aab896b1a3b 145 * Open a socketed connection
kevman 2:7aab896b1a3b 146 *
kevman 2:7aab896b1a3b 147 * @param type the type of socket to open "UDP" or "TCP"
kevman 2:7aab896b1a3b 148 * @param id id to give the new socket, valid 0-4
kevman 2:7aab896b1a3b 149 * @param port port to open connection with
kevman 2:7aab896b1a3b 150 * @param addr the IP address of the destination
kevman 2:7aab896b1a3b 151 * @param port the port on the destination
kevman 2:7aab896b1a3b 152 * @param local_port UDP socket's local port, zero means any
kevman 2:7aab896b1a3b 153 * @return true only if socket opened successfully
kevman 2:7aab896b1a3b 154 */
kevman 2:7aab896b1a3b 155 nsapi_error_t open_udp(int id, const char* addr, int port, int local_port = 0);
kevman 2:7aab896b1a3b 156
kevman 2:7aab896b1a3b 157 /**
kevman 2:7aab896b1a3b 158 * Open a socketed connection
kevman 2:7aab896b1a3b 159 *
kevman 2:7aab896b1a3b 160 * @param type the type of socket to open "UDP" or "TCP"
kevman 2:7aab896b1a3b 161 * @param id id to give the new socket, valid 0-4
kevman 2:7aab896b1a3b 162 * @param port port to open connection with
kevman 2:7aab896b1a3b 163 * @param addr the IP address of the destination
kevman 2:7aab896b1a3b 164 * @param port the port on the destination
kevman 2:7aab896b1a3b 165 * @param tcp_keepalive TCP connection's keep alive time, zero means disabled
kevman 2:7aab896b1a3b 166 * @return true only if socket opened successfully
kevman 2:7aab896b1a3b 167 */
kevman 2:7aab896b1a3b 168 bool open_tcp(int id, const char* addr, int port, int keepalive = 0);
kevman 2:7aab896b1a3b 169
kevman 2:7aab896b1a3b 170 /**
kevman 2:7aab896b1a3b 171 * Sends data to an open socket
kevman 2:7aab896b1a3b 172 *
kevman 2:7aab896b1a3b 173 * @param id id of socket to send to
kevman 2:7aab896b1a3b 174 * @param data data to be sent
kevman 2:7aab896b1a3b 175 * @param amount amount of data to be sent - max 1024
kevman 2:7aab896b1a3b 176 * @return NSAPI_ERROR_OK in success, negative error code in failure
kevman 2:7aab896b1a3b 177 */
kevman 2:7aab896b1a3b 178 nsapi_error_t send(int id, const void *data, uint32_t amount);
kevman 2:7aab896b1a3b 179
kevman 2:7aab896b1a3b 180 /**
kevman 2:7aab896b1a3b 181 * Receives datagram from an open UDP socket
kevman 2:7aab896b1a3b 182 *
kevman 2:7aab896b1a3b 183 * @param id id to receive from
kevman 2:7aab896b1a3b 184 * @param data placeholder for returned information
kevman 2:7aab896b1a3b 185 * @param amount number of bytes to be received
kevman 2:7aab896b1a3b 186 * @return the number of bytes received
kevman 2:7aab896b1a3b 187 */
kevman 2:7aab896b1a3b 188 int32_t recv_udp(int id, void *data, uint32_t amount, uint32_t timeout=ESP8266_RECV_TIMEOUT);
kevman 2:7aab896b1a3b 189
kevman 2:7aab896b1a3b 190 /**
kevman 2:7aab896b1a3b 191 * Receives stream data from an open TCP socket
kevman 2:7aab896b1a3b 192 *
kevman 2:7aab896b1a3b 193 * @param id id to receive from
kevman 2:7aab896b1a3b 194 * @param data placeholder for returned information
kevman 2:7aab896b1a3b 195 * @param amount number of bytes to be received
kevman 2:7aab896b1a3b 196 * @return the number of bytes received
kevman 2:7aab896b1a3b 197 */
kevman 2:7aab896b1a3b 198 int32_t recv_tcp(int id, void *data, uint32_t amount, uint32_t timeout=ESP8266_RECV_TIMEOUT);
kevman 2:7aab896b1a3b 199
kevman 2:7aab896b1a3b 200 /**
kevman 2:7aab896b1a3b 201 * Closes a socket
kevman 2:7aab896b1a3b 202 *
kevman 2:7aab896b1a3b 203 * @param id id of socket to close, valid only 0-4
kevman 2:7aab896b1a3b 204 * @return true only if socket is closed successfully
kevman 2:7aab896b1a3b 205 */
kevman 2:7aab896b1a3b 206 bool close(int id);
kevman 2:7aab896b1a3b 207
kevman 2:7aab896b1a3b 208 /**
kevman 2:7aab896b1a3b 209 * Allows timeout to be changed between commands
kevman 2:7aab896b1a3b 210 *
kevman 2:7aab896b1a3b 211 * @param timeout_ms timeout of the connection
kevman 2:7aab896b1a3b 212 */
kevman 2:7aab896b1a3b 213 void setTimeout(uint32_t timeout_ms=ESP8266_MISC_TIMEOUT);
kevman 2:7aab896b1a3b 214
kevman 2:7aab896b1a3b 215 /**
kevman 2:7aab896b1a3b 216 * Checks if data is available
kevman 2:7aab896b1a3b 217 */
kevman 2:7aab896b1a3b 218 bool readable();
kevman 2:7aab896b1a3b 219
kevman 2:7aab896b1a3b 220 /**
kevman 2:7aab896b1a3b 221 * Checks if data can be written
kevman 2:7aab896b1a3b 222 */
kevman 2:7aab896b1a3b 223 bool writeable();
kevman 2:7aab896b1a3b 224
kevman 2:7aab896b1a3b 225 /**
kevman 2:7aab896b1a3b 226 * Attach a function to call whenever sigio happens in the serial
kevman 2:7aab896b1a3b 227 *
kevman 2:7aab896b1a3b 228 * @param func A pointer to a void function, or 0 to set as none
kevman 2:7aab896b1a3b 229 */
kevman 2:7aab896b1a3b 230 void sigio(Callback<void()> func);
kevman 2:7aab896b1a3b 231
kevman 2:7aab896b1a3b 232 /**
kevman 2:7aab896b1a3b 233 * Attach a function to call whenever sigio happens in the serial
kevman 2:7aab896b1a3b 234 *
kevman 2:7aab896b1a3b 235 * @param obj pointer to the object to call the member function on
kevman 2:7aab896b1a3b 236 * @param method pointer to the member function to call
kevman 2:7aab896b1a3b 237 */
kevman 2:7aab896b1a3b 238 template <typename T, typename M>
kevman 2:7aab896b1a3b 239 void sigio(T *obj, M method) {
kevman 2:7aab896b1a3b 240 sigio(Callback<void()>(obj, method));
kevman 2:7aab896b1a3b 241 }
kevman 2:7aab896b1a3b 242
kevman 2:7aab896b1a3b 243 /**
kevman 2:7aab896b1a3b 244 * Attach a function to call whenever network state has changed
kevman 2:7aab896b1a3b 245 *
kevman 2:7aab896b1a3b 246 * @param func A pointer to a void function, or 0 to set as none
kevman 2:7aab896b1a3b 247 */
kevman 2:7aab896b1a3b 248 void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
kevman 2:7aab896b1a3b 249
kevman 2:7aab896b1a3b 250 /**
kevman 2:7aab896b1a3b 251 * Read default Wifi mode from flash
kevman 2:7aab896b1a3b 252 *
kevman 2:7aab896b1a3b 253 * return Station, SoftAP or SoftAP+Station - 0 on failure
kevman 2:7aab896b1a3b 254 */
kevman 2:7aab896b1a3b 255 int8_t get_default_wifi_mode();
kevman 2:7aab896b1a3b 256
kevman 2:7aab896b1a3b 257 /**
kevman 2:7aab896b1a3b 258 * Write default Wifi mode to flash
kevman 2:7aab896b1a3b 259 */
kevman 2:7aab896b1a3b 260 bool set_default_wifi_mode(const int8_t mode);
kevman 2:7aab896b1a3b 261
kevman 2:7aab896b1a3b 262 /** Get the connection status
kevman 2:7aab896b1a3b 263 *
kevman 2:7aab896b1a3b 264 * @return The connection status according to ConnectionStatusType
kevman 2:7aab896b1a3b 265 */
kevman 2:7aab896b1a3b 266 nsapi_connection_status_t get_connection_status() const;
kevman 2:7aab896b1a3b 267
kevman 2:7aab896b1a3b 268 static const int8_t WIFIMODE_STATION = 1;
kevman 2:7aab896b1a3b 269 static const int8_t WIFIMODE_SOFTAP = 2;
kevman 2:7aab896b1a3b 270 static const int8_t WIFIMODE_STATION_SOFTAP = 3;
kevman 2:7aab896b1a3b 271 static const int8_t SOCKET_COUNT = 5;
kevman 2:7aab896b1a3b 272
kevman 2:7aab896b1a3b 273 private:
kevman 2:7aab896b1a3b 274 UARTSerial _serial;
kevman 2:7aab896b1a3b 275 ATCmdParser _parser;
kevman 2:7aab896b1a3b 276 Mutex _smutex; // Protect serial port access
kevman 2:7aab896b1a3b 277
kevman 2:7aab896b1a3b 278 struct packet {
kevman 2:7aab896b1a3b 279 struct packet *next;
kevman 2:7aab896b1a3b 280 int id;
kevman 2:7aab896b1a3b 281 uint32_t len;
kevman 2:7aab896b1a3b 282 // data follows
kevman 2:7aab896b1a3b 283 } *_packets, **_packets_end;
kevman 2:7aab896b1a3b 284 void _packet_handler();
kevman 2:7aab896b1a3b 285 void _connect_error_handler();
kevman 2:7aab896b1a3b 286 bool recv_ap(nsapi_wifi_ap_t *ap);
kevman 2:7aab896b1a3b 287 void _oob_socket0_closed_handler();
kevman 2:7aab896b1a3b 288 void _oob_socket1_closed_handler();
kevman 2:7aab896b1a3b 289 void _oob_socket2_closed_handler();
kevman 2:7aab896b1a3b 290 void _oob_socket3_closed_handler();
kevman 2:7aab896b1a3b 291 void _oob_socket4_closed_handler();
kevman 2:7aab896b1a3b 292 void _connection_status_handler();
kevman 2:7aab896b1a3b 293 void _oob_socket_close_error();
kevman 2:7aab896b1a3b 294 void _clear_socket_packets(int id);
kevman 2:7aab896b1a3b 295
kevman 2:7aab896b1a3b 296 char _ip_buffer[16];
kevman 2:7aab896b1a3b 297 char _gateway_buffer[16];
kevman 2:7aab896b1a3b 298 char _netmask_buffer[16];
kevman 2:7aab896b1a3b 299 char _mac_buffer[18];
kevman 2:7aab896b1a3b 300
kevman 2:7aab896b1a3b 301 int _connect_error;
kevman 2:7aab896b1a3b 302 bool _fail;
kevman 2:7aab896b1a3b 303 bool _closed;
kevman 2:7aab896b1a3b 304 int _socket_open[SOCKET_COUNT];
kevman 2:7aab896b1a3b 305 nsapi_connection_status_t _connection_status;
kevman 2:7aab896b1a3b 306 Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
kevman 2:7aab896b1a3b 307 };
kevman 2:7aab896b1a3b 308
kevman 2:7aab896b1a3b 309 #endif