Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* ESP8266Interface Example
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2015 ARM Limited
kenjiArai 0:5b88d5760320 3 *
kenjiArai 0:5b88d5760320 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 5 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 6 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 7 *
kenjiArai 0:5b88d5760320 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 9 *
kenjiArai 0:5b88d5760320 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 13 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 14 * limitations under the License.
kenjiArai 0:5b88d5760320 15 */
kenjiArai 0:5b88d5760320 16
kenjiArai 0:5b88d5760320 17 #ifndef ESP8266_H
kenjiArai 0:5b88d5760320 18 #define ESP8266_H
kenjiArai 0:5b88d5760320 19
kenjiArai 1:9db0e321a9f4 20 #if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_API_PRESENT)
kenjiArai 0:5b88d5760320 21 #include <stdint.h>
kenjiArai 0:5b88d5760320 22
kenjiArai 0:5b88d5760320 23 #include "drivers/UARTSerial.h"
kenjiArai 0:5b88d5760320 24 #include "features/netsocket/nsapi_types.h"
kenjiArai 0:5b88d5760320 25 #include "features/netsocket/WiFiAccessPoint.h"
kenjiArai 0:5b88d5760320 26 #include "PinNames.h"
kenjiArai 0:5b88d5760320 27 #include "platform/ATCmdParser.h"
kenjiArai 0:5b88d5760320 28 #include "platform/Callback.h"
kenjiArai 0:5b88d5760320 29 #include "platform/mbed_error.h"
kenjiArai 0:5b88d5760320 30 #include "rtos/Mutex.h"
kenjiArai 1:9db0e321a9f4 31 #include "rtos/ThisThread.h"
kenjiArai 0:5b88d5760320 32
kenjiArai 0:5b88d5760320 33 // Various timeouts for different ESP8266 operations
kenjiArai 0:5b88d5760320 34 #ifndef ESP8266_CONNECT_TIMEOUT
kenjiArai 0:5b88d5760320 35 #define ESP8266_CONNECT_TIMEOUT 15000
kenjiArai 0:5b88d5760320 36 #endif
kenjiArai 0:5b88d5760320 37 #ifndef ESP8266_SEND_TIMEOUT
kenjiArai 0:5b88d5760320 38 #define ESP8266_SEND_TIMEOUT 2000
kenjiArai 0:5b88d5760320 39 #endif
kenjiArai 0:5b88d5760320 40 #ifndef ESP8266_RECV_TIMEOUT
kenjiArai 0:5b88d5760320 41 #define ESP8266_RECV_TIMEOUT 2000
kenjiArai 0:5b88d5760320 42 #endif
kenjiArai 0:5b88d5760320 43 #ifndef ESP8266_MISC_TIMEOUT
kenjiArai 0:5b88d5760320 44 #define ESP8266_MISC_TIMEOUT 2000
kenjiArai 0:5b88d5760320 45 #endif
kenjiArai 0:5b88d5760320 46
kenjiArai 0:5b88d5760320 47 #define ESP8266_SCAN_TIME_MIN 0 // [ms]
kenjiArai 0:5b88d5760320 48 #define ESP8266_SCAN_TIME_MAX 1500 // [ms]
kenjiArai 0:5b88d5760320 49 #define ESP8266_SCAN_TIME_MIN_DEFAULT 120 // [ms]
kenjiArai 0:5b88d5760320 50 #define ESP8266_SCAN_TIME_MAX_DEFAULT 360 // [ms]
kenjiArai 0:5b88d5760320 51
kenjiArai 0:5b88d5760320 52 // Firmware version
kenjiArai 0:5b88d5760320 53 #define ESP8266_SDK_VERSION 2000000
kenjiArai 0:5b88d5760320 54 #define ESP8266_SDK_VERSION_MAJOR ESP8266_SDK_VERSION/1000000
kenjiArai 0:5b88d5760320 55
kenjiArai 0:5b88d5760320 56 #define ESP8266_AT_VERSION 1000000
kenjiArai 0:5b88d5760320 57 #define ESP8266_AT_VERSION_MAJOR ESP8266_AT_VERSION/1000000
kenjiArai 0:5b88d5760320 58 #define ESP8266_AT_VERSION_TCP_PASSIVE_MODE 1070000
kenjiArai 0:5b88d5760320 59 #define ESP8266_AT_VERSION_WIFI_SCAN_CHANGE 1060000
kenjiArai 0:5b88d5760320 60
kenjiArai 0:5b88d5760320 61 #define FW_AT_LEAST_VERSION(MAJOR,MINOR,PATCH,NUSED/*Not used*/,REF) \
kenjiArai 0:5b88d5760320 62 (((MAJOR)*1000000+(MINOR)*10000+(PATCH)*100) >= REF ? true : false)
kenjiArai 0:5b88d5760320 63
kenjiArai 0:5b88d5760320 64 /** ESP8266Interface class.
kenjiArai 0:5b88d5760320 65 This is an interface to a ESP8266 radio.
kenjiArai 0:5b88d5760320 66 */
kenjiArai 0:5b88d5760320 67 class ESP8266 {
kenjiArai 0:5b88d5760320 68 public:
kenjiArai 0:5b88d5760320 69 ESP8266(PinName tx, PinName rx, bool debug = false, PinName rts = NC, PinName cts = NC);
kenjiArai 0:5b88d5760320 70
kenjiArai 0:5b88d5760320 71 /**
kenjiArai 0:5b88d5760320 72 * ESP8266 firmware SDK version
kenjiArai 0:5b88d5760320 73 *
kenjiArai 0:5b88d5760320 74 * @param major Major version number
kenjiArai 0:5b88d5760320 75 * @param minor Minor version number
kenjiArai 0:5b88d5760320 76 * @param patch Patch version number
kenjiArai 0:5b88d5760320 77 */
kenjiArai 0:5b88d5760320 78 struct fw_sdk_version {
kenjiArai 0:5b88d5760320 79 int major;
kenjiArai 0:5b88d5760320 80 int minor;
kenjiArai 0:5b88d5760320 81 int patch;
kenjiArai 0:5b88d5760320 82 fw_sdk_version(int major, int minor, int patch) : major(major), minor(minor), patch(patch) {}
kenjiArai 0:5b88d5760320 83 };
kenjiArai 0:5b88d5760320 84
kenjiArai 0:5b88d5760320 85 /**
kenjiArai 0:5b88d5760320 86 * ESP8266 firmware AT version
kenjiArai 0:5b88d5760320 87 *
kenjiArai 0:5b88d5760320 88 * @param major Major version number
kenjiArai 0:5b88d5760320 89 * @param minor Minor version number
kenjiArai 0:5b88d5760320 90 * @param patch Patch version number
kenjiArai 0:5b88d5760320 91 */
kenjiArai 0:5b88d5760320 92 struct fw_at_version {
kenjiArai 0:5b88d5760320 93 int major;
kenjiArai 0:5b88d5760320 94 int minor;
kenjiArai 0:5b88d5760320 95 int patch;
kenjiArai 0:5b88d5760320 96 fw_at_version(int major, int minor, int patch) : major(major), minor(minor), patch(patch) {}
kenjiArai 0:5b88d5760320 97 };
kenjiArai 0:5b88d5760320 98
kenjiArai 0:5b88d5760320 99 /**
kenjiArai 0:5b88d5760320 100 * Check AT command interface of ESP8266
kenjiArai 0:5b88d5760320 101 *
kenjiArai 0:5b88d5760320 102 * @return true if ready to respond on AT commands
kenjiArai 0:5b88d5760320 103 */
kenjiArai 0:5b88d5760320 104 bool at_available(void);
kenjiArai 0:5b88d5760320 105
kenjiArai 0:5b88d5760320 106 /**
kenjiArai 0:5b88d5760320 107 * Disable echo - required for OOB processing to work
kenjiArai 0:5b88d5760320 108 *
kenjiArai 0:5b88d5760320 109 * @return true if echo was successfully disabled
kenjiArai 0:5b88d5760320 110 */
kenjiArai 0:5b88d5760320 111 bool echo_off(void);
kenjiArai 0:5b88d5760320 112
kenjiArai 0:5b88d5760320 113 /**
kenjiArai 0:5b88d5760320 114 * Check sdk version from which firmware is created
kenjiArai 0:5b88d5760320 115 *
kenjiArai 0:5b88d5760320 116 * @return fw_sdk_version which tells major, minor and patch version
kenjiArai 0:5b88d5760320 117 */
kenjiArai 0:5b88d5760320 118 struct fw_sdk_version sdk_version(void);
kenjiArai 0:5b88d5760320 119
kenjiArai 0:5b88d5760320 120 /**
kenjiArai 0:5b88d5760320 121 * Check AT instruction set version from which firmware is created
kenjiArai 0:5b88d5760320 122 *
kenjiArai 0:5b88d5760320 123 * @return fw_at_version which tells major, minor and patch version
kenjiArai 0:5b88d5760320 124 */
kenjiArai 0:5b88d5760320 125 struct fw_at_version at_version(void);
kenjiArai 0:5b88d5760320 126
kenjiArai 0:5b88d5760320 127 /**
kenjiArai 0:5b88d5760320 128 * Startup the ESP8266
kenjiArai 0:5b88d5760320 129 *
kenjiArai 0:5b88d5760320 130 * @param mode mode of WIFI 1-client, 2-host, 3-both
kenjiArai 0:5b88d5760320 131 * @return true only if ESP8266 was setup correctly
kenjiArai 0:5b88d5760320 132 */
kenjiArai 0:5b88d5760320 133 bool startup(int mode);
kenjiArai 0:5b88d5760320 134
kenjiArai 0:5b88d5760320 135 /**
kenjiArai 0:5b88d5760320 136 * Reset ESP8266
kenjiArai 0:5b88d5760320 137 *
kenjiArai 0:5b88d5760320 138 * @return true only if ESP8266 resets successfully
kenjiArai 0:5b88d5760320 139 */
kenjiArai 0:5b88d5760320 140 bool reset(void);
kenjiArai 0:5b88d5760320 141
kenjiArai 0:5b88d5760320 142 /**
kenjiArai 0:5b88d5760320 143 * Enable/Disable DHCP
kenjiArai 0:5b88d5760320 144 *
kenjiArai 0:5b88d5760320 145 * @param enabled DHCP enabled when true
kenjiArai 0:5b88d5760320 146 * @param mode mode of DHCP 0-softAP, 1-station, 2-both
kenjiArai 0:5b88d5760320 147 * @return true only if ESP8266 enables/disables DHCP successfully
kenjiArai 0:5b88d5760320 148 */
kenjiArai 0:5b88d5760320 149 bool dhcp(bool enabled, int mode);
kenjiArai 0:5b88d5760320 150
kenjiArai 0:5b88d5760320 151 /**
kenjiArai 0:5b88d5760320 152 * Connect ESP8266 to AP
kenjiArai 0:5b88d5760320 153 *
kenjiArai 0:5b88d5760320 154 * @param ap the name of the AP
kenjiArai 0:5b88d5760320 155 * @param passPhrase the password of AP
kenjiArai 0:5b88d5760320 156 * @return NSAPI_ERROR_OK in success, negative error code in failure
kenjiArai 0:5b88d5760320 157 */
kenjiArai 0:5b88d5760320 158 nsapi_error_t connect(const char *ap, const char *passPhrase);
kenjiArai 0:5b88d5760320 159
kenjiArai 0:5b88d5760320 160 /**
kenjiArai 0:5b88d5760320 161 * Disconnect ESP8266 from AP
kenjiArai 0:5b88d5760320 162 *
kenjiArai 0:5b88d5760320 163 * @return true only if ESP8266 is disconnected successfully
kenjiArai 0:5b88d5760320 164 */
kenjiArai 0:5b88d5760320 165 bool disconnect(void);
kenjiArai 0:5b88d5760320 166
kenjiArai 0:5b88d5760320 167 /**
kenjiArai 0:5b88d5760320 168 * Get the IP address of ESP8266
kenjiArai 0:5b88d5760320 169 *
kenjiArai 0:5b88d5760320 170 * @return null-teriminated IP address or null if no IP address is assigned
kenjiArai 0:5b88d5760320 171 */
kenjiArai 0:5b88d5760320 172 const char *ip_addr(void);
kenjiArai 0:5b88d5760320 173
kenjiArai 0:5b88d5760320 174 /**
kenjiArai 0:5b88d5760320 175 * Get the MAC address of ESP8266
kenjiArai 0:5b88d5760320 176 *
kenjiArai 0:5b88d5760320 177 * @return null-terminated MAC address or null if no MAC address is assigned
kenjiArai 0:5b88d5760320 178 */
kenjiArai 0:5b88d5760320 179 const char *mac_addr(void);
kenjiArai 0:5b88d5760320 180
kenjiArai 0:5b88d5760320 181 /** Get the local gateway
kenjiArai 0:5b88d5760320 182 *
kenjiArai 0:5b88d5760320 183 * @return Null-terminated representation of the local gateway
kenjiArai 0:5b88d5760320 184 * or null if no network mask has been recieved
kenjiArai 0:5b88d5760320 185 */
kenjiArai 0:5b88d5760320 186 const char *gateway();
kenjiArai 0:5b88d5760320 187
kenjiArai 0:5b88d5760320 188 /** Get the local network mask
kenjiArai 0:5b88d5760320 189 *
kenjiArai 0:5b88d5760320 190 * @return Null-terminated representation of the local network mask
kenjiArai 0:5b88d5760320 191 * or null if no network mask has been recieved
kenjiArai 0:5b88d5760320 192 */
kenjiArai 0:5b88d5760320 193 const char *netmask();
kenjiArai 0:5b88d5760320 194
kenjiArai 0:5b88d5760320 195 /* Return RSSI for active connection
kenjiArai 0:5b88d5760320 196 *
kenjiArai 0:5b88d5760320 197 * @return Measured RSSI
kenjiArai 0:5b88d5760320 198 */
kenjiArai 0:5b88d5760320 199 int8_t rssi();
kenjiArai 0:5b88d5760320 200
kenjiArai 0:5b88d5760320 201 /** Scan mode
kenjiArai 0:5b88d5760320 202 */
kenjiArai 0:5b88d5760320 203 enum scan_mode {
kenjiArai 0:5b88d5760320 204 SCANMODE_ACTIVE = 0, /*!< active mode */
kenjiArai 0:5b88d5760320 205 SCANMODE_PASSIVE = 1 /*!< passive mode */
kenjiArai 0:5b88d5760320 206 };
kenjiArai 0:5b88d5760320 207
kenjiArai 0:5b88d5760320 208 /** Scan for available networks
kenjiArai 0:5b88d5760320 209 *
kenjiArai 0:5b88d5760320 210 * @param ap Pointer to allocated array to store discovered AP
kenjiArai 0:5b88d5760320 211 * @param limit Size of allocated @a res array, or 0 to only count available AP
kenjiArai 0:5b88d5760320 212 * @param t_max Maximum scan time per channel
kenjiArai 0:5b88d5760320 213 * @param t_min Minimum scan time per channel in active mode, can be omitted in passive mode
kenjiArai 0:5b88d5760320 214 * @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error
kenjiArai 0:5b88d5760320 215 * see @a nsapi_error
kenjiArai 0:5b88d5760320 216 */
kenjiArai 0:5b88d5760320 217 int scan(WiFiAccessPoint *res, unsigned limit, scan_mode mode, unsigned t_max, unsigned t_min);
kenjiArai 0:5b88d5760320 218
kenjiArai 0:5b88d5760320 219 /**Perform a dns query
kenjiArai 0:5b88d5760320 220 *
kenjiArai 0:5b88d5760320 221 * @param name Hostname to resolve
kenjiArai 0:5b88d5760320 222 * @param ip Buffer to store IP address
kenjiArai 0:5b88d5760320 223 * @return 0 true on success, false on failure
kenjiArai 0:5b88d5760320 224 */
kenjiArai 0:5b88d5760320 225 bool dns_lookup(const char *name, char *ip);
kenjiArai 0:5b88d5760320 226
kenjiArai 0:5b88d5760320 227 /**
kenjiArai 0:5b88d5760320 228 * Open a socketed connection
kenjiArai 0:5b88d5760320 229 *
kenjiArai 0:5b88d5760320 230 * @param type the type of socket to open "UDP" or "TCP"
kenjiArai 0:5b88d5760320 231 * @param id id to give the new socket, valid 0-4
kenjiArai 0:5b88d5760320 232 * @param port port to open connection with
kenjiArai 0:5b88d5760320 233 * @param addr the IP address of the destination
kenjiArai 0:5b88d5760320 234 * @param port the port on the destination
kenjiArai 0:5b88d5760320 235 * @param local_port UDP socket's local port, zero means any
kenjiArai 0:5b88d5760320 236 * @return NSAPI_ERROR_OK in success, negative error code in failure
kenjiArai 0:5b88d5760320 237 */
kenjiArai 0:5b88d5760320 238 nsapi_error_t open_udp(int id, const char *addr, int port, int local_port = 0);
kenjiArai 0:5b88d5760320 239
kenjiArai 0:5b88d5760320 240 /**
kenjiArai 0:5b88d5760320 241 * Open a socketed connection
kenjiArai 0:5b88d5760320 242 *
kenjiArai 0:5b88d5760320 243 * @param type the type of socket to open "UDP" or "TCP"
kenjiArai 0:5b88d5760320 244 * @param id id to give the new socket, valid 0-4
kenjiArai 0:5b88d5760320 245 * @param port port to open connection with
kenjiArai 0:5b88d5760320 246 * @param addr the IP address of the destination
kenjiArai 0:5b88d5760320 247 * @param port the port on the destination
kenjiArai 0:5b88d5760320 248 * @param tcp_keepalive TCP connection's keep alive time, zero means disabled
kenjiArai 0:5b88d5760320 249 * @return NSAPI_ERROR_OK in success, negative error code in failure
kenjiArai 0:5b88d5760320 250 */
kenjiArai 0:5b88d5760320 251 nsapi_error_t open_tcp(int id, const char *addr, int port, int keepalive = 0);
kenjiArai 0:5b88d5760320 252
kenjiArai 0:5b88d5760320 253 /**
kenjiArai 0:5b88d5760320 254 * Sends data to an open socket
kenjiArai 0:5b88d5760320 255 *
kenjiArai 0:5b88d5760320 256 * @param id id of socket to send to
kenjiArai 0:5b88d5760320 257 * @param data data to be sent
kenjiArai 0:5b88d5760320 258 * @param amount amount of data to be sent - max 1024
kenjiArai 0:5b88d5760320 259 * @return NSAPI_ERROR_OK in success, negative error code in failure
kenjiArai 0:5b88d5760320 260 */
kenjiArai 0:5b88d5760320 261 nsapi_error_t send(int id, const void *data, uint32_t amount);
kenjiArai 0:5b88d5760320 262
kenjiArai 0:5b88d5760320 263 /**
kenjiArai 0:5b88d5760320 264 * Receives datagram from an open UDP socket
kenjiArai 0:5b88d5760320 265 *
kenjiArai 0:5b88d5760320 266 * @param id id to receive from
kenjiArai 0:5b88d5760320 267 * @param data placeholder for returned information
kenjiArai 0:5b88d5760320 268 * @param amount number of bytes to be received
kenjiArai 0:5b88d5760320 269 * @return the number of bytes received
kenjiArai 0:5b88d5760320 270 */
kenjiArai 0:5b88d5760320 271 int32_t recv_udp(int id, void *data, uint32_t amount, uint32_t timeout = ESP8266_RECV_TIMEOUT);
kenjiArai 0:5b88d5760320 272
kenjiArai 0:5b88d5760320 273 /**
kenjiArai 0:5b88d5760320 274 * Receives stream data from an open TCP socket
kenjiArai 0:5b88d5760320 275 *
kenjiArai 0:5b88d5760320 276 * @param id id to receive from
kenjiArai 0:5b88d5760320 277 * @param data placeholder for returned information
kenjiArai 0:5b88d5760320 278 * @param amount number of bytes to be received
kenjiArai 0:5b88d5760320 279 * @return the number of bytes received
kenjiArai 0:5b88d5760320 280 */
kenjiArai 0:5b88d5760320 281 int32_t recv_tcp(int id, void *data, uint32_t amount, uint32_t timeout = ESP8266_RECV_TIMEOUT);
kenjiArai 0:5b88d5760320 282
kenjiArai 0:5b88d5760320 283 /**
kenjiArai 0:5b88d5760320 284 * Closes a socket
kenjiArai 0:5b88d5760320 285 *
kenjiArai 0:5b88d5760320 286 * @param id id of socket to close, valid only 0-4
kenjiArai 0:5b88d5760320 287 * @return true only if socket is closed successfully
kenjiArai 0:5b88d5760320 288 */
kenjiArai 0:5b88d5760320 289 bool close(int id);
kenjiArai 0:5b88d5760320 290
kenjiArai 0:5b88d5760320 291 /**
kenjiArai 0:5b88d5760320 292 * Allows timeout to be changed between commands
kenjiArai 0:5b88d5760320 293 *
kenjiArai 0:5b88d5760320 294 * @param timeout_ms timeout of the connection
kenjiArai 0:5b88d5760320 295 */
kenjiArai 0:5b88d5760320 296 void set_timeout(uint32_t timeout_ms = ESP8266_MISC_TIMEOUT);
kenjiArai 0:5b88d5760320 297
kenjiArai 0:5b88d5760320 298 /**
kenjiArai 0:5b88d5760320 299 * Checks if data is available
kenjiArai 0:5b88d5760320 300 */
kenjiArai 0:5b88d5760320 301 bool readable();
kenjiArai 0:5b88d5760320 302
kenjiArai 0:5b88d5760320 303 /**
kenjiArai 0:5b88d5760320 304 * Checks if data can be written
kenjiArai 0:5b88d5760320 305 */
kenjiArai 0:5b88d5760320 306 bool writeable();
kenjiArai 0:5b88d5760320 307
kenjiArai 0:5b88d5760320 308 /**
kenjiArai 0:5b88d5760320 309 * Attach a function to call whenever sigio happens in the serial
kenjiArai 0:5b88d5760320 310 *
kenjiArai 0:5b88d5760320 311 * @param func A pointer to a void function, or 0 to set as none
kenjiArai 0:5b88d5760320 312 */
kenjiArai 0:5b88d5760320 313 void sigio(mbed::Callback<void()> func);
kenjiArai 0:5b88d5760320 314
kenjiArai 0:5b88d5760320 315 /**
kenjiArai 0:5b88d5760320 316 * Attach a function to call whenever sigio happens in the serial
kenjiArai 0:5b88d5760320 317 *
kenjiArai 0:5b88d5760320 318 * @param obj pointer to the object to call the member function on
kenjiArai 0:5b88d5760320 319 * @param method pointer to the member function to call
kenjiArai 0:5b88d5760320 320 */
kenjiArai 0:5b88d5760320 321 template <typename T, typename M>
kenjiArai 0:5b88d5760320 322 void sigio(T *obj, M method)
kenjiArai 0:5b88d5760320 323 {
kenjiArai 0:5b88d5760320 324 sigio(mbed::Callback<void()>(obj, method));
kenjiArai 0:5b88d5760320 325 }
kenjiArai 0:5b88d5760320 326
kenjiArai 0:5b88d5760320 327 /**
kenjiArai 0:5b88d5760320 328 * Attach a function to call whenever network state has changed.
kenjiArai 0:5b88d5760320 329 *
kenjiArai 0:5b88d5760320 330 * @param func A pointer to a void function, or 0 to set as none
kenjiArai 0:5b88d5760320 331 */
kenjiArai 0:5b88d5760320 332 void attach(mbed::Callback<void()> status_cb);
kenjiArai 0:5b88d5760320 333
kenjiArai 0:5b88d5760320 334 template <typename T, typename M>
kenjiArai 0:5b88d5760320 335 void attach(T *obj, M method)
kenjiArai 0:5b88d5760320 336 {
kenjiArai 0:5b88d5760320 337 attach(mbed::Callback<void()>(obj, method));
kenjiArai 0:5b88d5760320 338 }
kenjiArai 0:5b88d5760320 339
kenjiArai 0:5b88d5760320 340 /**
kenjiArai 0:5b88d5760320 341 * Read default Wifi mode from flash
kenjiArai 0:5b88d5760320 342 *
kenjiArai 0:5b88d5760320 343 * return Station, SoftAP or SoftAP+Station - 0 on failure
kenjiArai 0:5b88d5760320 344 */
kenjiArai 0:5b88d5760320 345 int8_t default_wifi_mode();
kenjiArai 0:5b88d5760320 346
kenjiArai 0:5b88d5760320 347 /**
kenjiArai 0:5b88d5760320 348 * Default Wifi mode written to flash only if changes
kenjiArai 0:5b88d5760320 349 */
kenjiArai 0:5b88d5760320 350 bool set_default_wifi_mode(const int8_t mode);
kenjiArai 0:5b88d5760320 351
kenjiArai 0:5b88d5760320 352 /**
kenjiArai 0:5b88d5760320 353 * @param track_ap if TRUE, sets the county code to be the same as the AP's that ESP is connected to,
kenjiArai 0:5b88d5760320 354 * if FALSE the code will not change
kenjiArai 0:5b88d5760320 355 * @param country_code ISO 3166-1 Alpha-2 coded country code
kenjiArai 0:5b88d5760320 356 * @param channel_start the channel number to start at
kenjiArai 0:5b88d5760320 357 * @param channels number of channels
kenjiArai 0:5b88d5760320 358 */
kenjiArai 0:5b88d5760320 359 bool set_country_code_policy(bool track_ap, const char *country_code, int channel_start, int channels);
kenjiArai 0:5b88d5760320 360
kenjiArai 0:5b88d5760320 361 /** Get the connection status
kenjiArai 0:5b88d5760320 362 *
kenjiArai 0:5b88d5760320 363 * @return The connection status according to ConnectionStatusType
kenjiArai 0:5b88d5760320 364 */
kenjiArai 0:5b88d5760320 365 nsapi_connection_status_t connection_status() const;
kenjiArai 0:5b88d5760320 366
kenjiArai 0:5b88d5760320 367 /**
kenjiArai 0:5b88d5760320 368 * Start board's and ESP8266's UART flow control
kenjiArai 0:5b88d5760320 369 *
kenjiArai 0:5b88d5760320 370 * @return true if started
kenjiArai 0:5b88d5760320 371 */
kenjiArai 0:5b88d5760320 372 bool start_uart_hw_flow_ctrl();
kenjiArai 0:5b88d5760320 373
kenjiArai 0:5b88d5760320 374 /**
kenjiArai 0:5b88d5760320 375 * Stop board's and ESP8266's UART flow control
kenjiArai 0:5b88d5760320 376 *
kenjiArai 0:5b88d5760320 377 * @return true if started
kenjiArai 0:5b88d5760320 378 */
kenjiArai 0:5b88d5760320 379 bool stop_uart_hw_flow_ctrl();
kenjiArai 0:5b88d5760320 380
kenjiArai 0:5b88d5760320 381 /*
kenjiArai 0:5b88d5760320 382 * From AT firmware v1.7.0.0 onwards enables TCP passive mode
kenjiArai 0:5b88d5760320 383 */
kenjiArai 0:5b88d5760320 384 bool cond_enable_tcp_passive_mode();
kenjiArai 0:5b88d5760320 385
kenjiArai 0:5b88d5760320 386 /**
kenjiArai 0:5b88d5760320 387 * For executing OOB processing on background
kenjiArai 0:5b88d5760320 388 *
kenjiArai 0:5b88d5760320 389 * @param timeout AT parser receive timeout
kenjiArai 0:5b88d5760320 390 * @param if TRUE, process all OOBs instead of only one
kenjiArai 0:5b88d5760320 391 */
kenjiArai 0:5b88d5760320 392 void bg_process_oob(uint32_t timeout, bool all);
kenjiArai 0:5b88d5760320 393
kenjiArai 0:5b88d5760320 394 /**
kenjiArai 0:5b88d5760320 395 * Flush the serial port input buffers.
kenjiArai 0:5b88d5760320 396 *
kenjiArai 0:5b88d5760320 397 * If you do HW reset for ESP module, you should
kenjiArai 0:5b88d5760320 398 * flush the input buffers from existing responses
kenjiArai 0:5b88d5760320 399 * from the device.
kenjiArai 0:5b88d5760320 400 */
kenjiArai 0:5b88d5760320 401 void flush();
kenjiArai 0:5b88d5760320 402
kenjiArai 0:5b88d5760320 403 static const int8_t WIFIMODE_STATION = 1;
kenjiArai 0:5b88d5760320 404 static const int8_t WIFIMODE_SOFTAP = 2;
kenjiArai 0:5b88d5760320 405 static const int8_t WIFIMODE_STATION_SOFTAP = 3;
kenjiArai 0:5b88d5760320 406 static const int8_t SOCKET_COUNT = 5;
kenjiArai 0:5b88d5760320 407
kenjiArai 1:9db0e321a9f4 408 /**
kenjiArai 1:9db0e321a9f4 409 * Enables or disables uart input and deep sleep
kenjiArai 1:9db0e321a9f4 410 *
kenjiArai 1:9db0e321a9f4 411 * @param lock if TRUE, uart input is enabled and deep sleep is locked
kenjiArai 1:9db0e321a9f4 412 * if FALSE, uart input is disabled and deep sleep is unlocked
kenjiArai 1:9db0e321a9f4 413 */
kenjiArai 1:9db0e321a9f4 414 int uart_enable_input(bool lock);
kenjiArai 1:9db0e321a9f4 415
kenjiArai 0:5b88d5760320 416 private:
kenjiArai 0:5b88d5760320 417 // FW version
kenjiArai 0:5b88d5760320 418 struct fw_sdk_version _sdk_v;
kenjiArai 0:5b88d5760320 419 struct fw_at_version _at_v;
kenjiArai 0:5b88d5760320 420
kenjiArai 0:5b88d5760320 421 // FW version specific settings and functionalities
kenjiArai 0:5b88d5760320 422 bool _tcp_passive;
kenjiArai 0:5b88d5760320 423 int32_t _recv_tcp_passive(int id, void *data, uint32_t amount, uint32_t timeout);
kenjiArai 0:5b88d5760320 424 mbed::Callback<void()> _callback;
kenjiArai 0:5b88d5760320 425
kenjiArai 0:5b88d5760320 426 // UART settings
kenjiArai 0:5b88d5760320 427 mbed::UARTSerial _serial;
kenjiArai 0:5b88d5760320 428 PinName _serial_rts;
kenjiArai 0:5b88d5760320 429 PinName _serial_cts;
kenjiArai 0:5b88d5760320 430 rtos::Mutex _smutex; // Protect serial port access
kenjiArai 0:5b88d5760320 431
kenjiArai 0:5b88d5760320 432 // AT Command Parser
kenjiArai 0:5b88d5760320 433 mbed::ATCmdParser _parser;
kenjiArai 0:5b88d5760320 434
kenjiArai 0:5b88d5760320 435 // Wifi scan result handling
kenjiArai 0:5b88d5760320 436 bool _recv_ap(nsapi_wifi_ap_t *ap);
kenjiArai 0:5b88d5760320 437
kenjiArai 0:5b88d5760320 438 // Socket data buffer
kenjiArai 0:5b88d5760320 439 struct packet {
kenjiArai 0:5b88d5760320 440 struct packet *next;
kenjiArai 0:5b88d5760320 441 int id;
kenjiArai 0:5b88d5760320 442 uint32_t len; // Remaining length
kenjiArai 0:5b88d5760320 443 uint32_t alloc_len; // Original length
kenjiArai 0:5b88d5760320 444 // data follows
kenjiArai 0:5b88d5760320 445 } *_packets, * *_packets_end;
kenjiArai 0:5b88d5760320 446 void _clear_socket_packets(int id);
kenjiArai 0:5b88d5760320 447 int _sock_active_id;
kenjiArai 0:5b88d5760320 448
kenjiArai 0:5b88d5760320 449 // Memory statistics
kenjiArai 0:5b88d5760320 450 size_t _heap_usage; // (Socket data buffer usage)
kenjiArai 0:5b88d5760320 451
kenjiArai 0:5b88d5760320 452 // OOB processing
kenjiArai 0:5b88d5760320 453 void _process_oob(uint32_t timeout, bool all);
kenjiArai 0:5b88d5760320 454
kenjiArai 0:5b88d5760320 455 // OOB message handlers
kenjiArai 0:5b88d5760320 456 void _oob_packet_hdlr();
kenjiArai 0:5b88d5760320 457 void _oob_connect_err();
kenjiArai 0:5b88d5760320 458 void _oob_conn_already();
kenjiArai 0:5b88d5760320 459 void _oob_err();
kenjiArai 0:5b88d5760320 460 void _oob_socket0_closed();
kenjiArai 0:5b88d5760320 461 void _oob_socket1_closed();
kenjiArai 0:5b88d5760320 462 void _oob_socket2_closed();
kenjiArai 0:5b88d5760320 463 void _oob_socket3_closed();
kenjiArai 0:5b88d5760320 464 void _oob_socket4_closed();
kenjiArai 0:5b88d5760320 465 void _oob_connection_status();
kenjiArai 0:5b88d5760320 466 void _oob_socket_close_err();
kenjiArai 0:5b88d5760320 467 void _oob_watchdog_reset();
kenjiArai 0:5b88d5760320 468 void _oob_busy();
kenjiArai 0:5b88d5760320 469 void _oob_tcp_data_hdlr();
kenjiArai 0:5b88d5760320 470 void _oob_ready();
kenjiArai 0:5b88d5760320 471 void _oob_scan_results();
kenjiArai 1:9db0e321a9f4 472 void _oob_ok_received();
kenjiArai 0:5b88d5760320 473
kenjiArai 0:5b88d5760320 474 // OOB state variables
kenjiArai 0:5b88d5760320 475 int _connect_error;
kenjiArai 0:5b88d5760320 476 bool _disconnect;
kenjiArai 0:5b88d5760320 477 bool _fail;
kenjiArai 0:5b88d5760320 478 bool _sock_already;
kenjiArai 0:5b88d5760320 479 bool _closed;
kenjiArai 0:5b88d5760320 480 bool _error;
kenjiArai 0:5b88d5760320 481 bool _busy;
kenjiArai 0:5b88d5760320 482 bool _reset_done;
kenjiArai 1:9db0e321a9f4 483 bool _ok_received;
kenjiArai 0:5b88d5760320 484
kenjiArai 0:5b88d5760320 485 // Modem's address info
kenjiArai 0:5b88d5760320 486 char _ip_buffer[16];
kenjiArai 0:5b88d5760320 487 char _gateway_buffer[16];
kenjiArai 0:5b88d5760320 488 char _netmask_buffer[16];
kenjiArai 0:5b88d5760320 489 char _mac_buffer[18];
kenjiArai 0:5b88d5760320 490
kenjiArai 0:5b88d5760320 491 // Modem's socket info
kenjiArai 0:5b88d5760320 492 struct _sock_info {
kenjiArai 0:5b88d5760320 493 bool open;
kenjiArai 0:5b88d5760320 494 nsapi_protocol_t proto;
kenjiArai 0:5b88d5760320 495 char *tcp_data;
kenjiArai 0:5b88d5760320 496 int32_t tcp_data_avbl; // Data waiting on modem
kenjiArai 0:5b88d5760320 497 int32_t tcp_data_rcvd;
kenjiArai 0:5b88d5760320 498 };
kenjiArai 0:5b88d5760320 499 struct _sock_info _sock_i[SOCKET_COUNT];
kenjiArai 0:5b88d5760320 500
kenjiArai 0:5b88d5760320 501 // Scan results
kenjiArai 0:5b88d5760320 502 struct _scan_results {
kenjiArai 0:5b88d5760320 503 WiFiAccessPoint *res;
kenjiArai 0:5b88d5760320 504 unsigned limit;
kenjiArai 0:5b88d5760320 505 unsigned cnt;
kenjiArai 0:5b88d5760320 506 };
kenjiArai 0:5b88d5760320 507 struct _scan_results _scan_r;
kenjiArai 0:5b88d5760320 508
kenjiArai 0:5b88d5760320 509 // Connection state reporting
kenjiArai 0:5b88d5760320 510 nsapi_connection_status_t _conn_status;
kenjiArai 0:5b88d5760320 511 mbed::Callback<void()> _conn_stat_cb; // ESP8266Interface registered
kenjiArai 0:5b88d5760320 512 };
kenjiArai 0:5b88d5760320 513 #endif
kenjiArai 0:5b88d5760320 514 #endif