emw312 driver

Fork of emw3162-driver by Maggie Mei

Committer:
Maggie17
Date:
Tue Nov 01 02:18:18 2016 +0000
Revision:
0:2d5090e1ceb4
Child:
2:fb6251306b21
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Maggie17 0:2d5090e1ceb4 1 /* ESP8266 implementation of NetworkInterfaceAPI
Maggie17 0:2d5090e1ceb4 2 * Copyright (c) 2015 ARM Limited
Maggie17 0:2d5090e1ceb4 3 *
Maggie17 0:2d5090e1ceb4 4 * Licensed under the Apache License, Version 2.0 (the "License");
Maggie17 0:2d5090e1ceb4 5 * you may not use this file except in compliance with the License.
Maggie17 0:2d5090e1ceb4 6 * You may obtain a copy of the License at
Maggie17 0:2d5090e1ceb4 7 *
Maggie17 0:2d5090e1ceb4 8 * http://www.apache.org/licenses/LICENSE-2.0
Maggie17 0:2d5090e1ceb4 9 *
Maggie17 0:2d5090e1ceb4 10 * Unless required by applicable law or agreed to in writing, software
Maggie17 0:2d5090e1ceb4 11 * distributed under the License is distributed on an "AS IS" BASIS,
Maggie17 0:2d5090e1ceb4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Maggie17 0:2d5090e1ceb4 13 * See the License for the specific language governing permissions and
Maggie17 0:2d5090e1ceb4 14 * limitations under the License.
Maggie17 0:2d5090e1ceb4 15 */
Maggie17 0:2d5090e1ceb4 16
Maggie17 0:2d5090e1ceb4 17
Maggie17 0:2d5090e1ceb4 18 #include "EMW3162Interface.h"
Maggie17 0:2d5090e1ceb4 19
Maggie17 0:2d5090e1ceb4 20 // Various timeouts for different ESP8266 operations
Maggie17 0:2d5090e1ceb4 21 #define ESP8266_CONNECT_TIMEOUT 15000
Maggie17 0:2d5090e1ceb4 22 #define ESP8266_SEND_TIMEOUT 500
Maggie17 0:2d5090e1ceb4 23 #define ESP8266_RECV_TIMEOUT 0
Maggie17 0:2d5090e1ceb4 24 #define ESP8266_MISC_TIMEOUT 500
Maggie17 0:2d5090e1ceb4 25
Maggie17 0:2d5090e1ceb4 26
Maggie17 0:2d5090e1ceb4 27 // ESP8266Interface implementation
Maggie17 0:2d5090e1ceb4 28 ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug)
Maggie17 0:2d5090e1ceb4 29 : _esp(tx, rx, debug)
Maggie17 0:2d5090e1ceb4 30 {
Maggie17 0:2d5090e1ceb4 31 memset(_ids, 0, sizeof(_ids));
Maggie17 0:2d5090e1ceb4 32 memset(_cbs, 0, sizeof(_cbs));
Maggie17 0:2d5090e1ceb4 33
Maggie17 0:2d5090e1ceb4 34 _esp.attach(this, &ESP8266Interface::event);
Maggie17 0:2d5090e1ceb4 35 }
Maggie17 0:2d5090e1ceb4 36
Maggie17 0:2d5090e1ceb4 37 int ESP8266Interface::connect(
Maggie17 0:2d5090e1ceb4 38 const char *ssid,
Maggie17 0:2d5090e1ceb4 39 const char *pass,
Maggie17 0:2d5090e1ceb4 40 nsapi_security_t security)
Maggie17 0:2d5090e1ceb4 41 {
Maggie17 0:2d5090e1ceb4 42 _esp.setTimeout(ESP8266_CONNECT_TIMEOUT);
Maggie17 0:2d5090e1ceb4 43
Maggie17 0:2d5090e1ceb4 44 if (!_esp.startup()) {
Maggie17 0:2d5090e1ceb4 45 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 46 }
Maggie17 0:2d5090e1ceb4 47
Maggie17 0:2d5090e1ceb4 48 if (!_esp.dhcp(true)) {
Maggie17 0:2d5090e1ceb4 49 return NSAPI_ERROR_DHCP_FAILURE;
Maggie17 0:2d5090e1ceb4 50 }
Maggie17 0:2d5090e1ceb4 51
Maggie17 0:2d5090e1ceb4 52 if (!_esp.connect(ssid, pass)) {
Maggie17 0:2d5090e1ceb4 53 return NSAPI_ERROR_NO_CONNECTION;
Maggie17 0:2d5090e1ceb4 54 }
Maggie17 0:2d5090e1ceb4 55
Maggie17 0:2d5090e1ceb4 56 if (!_esp.getIPAddress()) {
Maggie17 0:2d5090e1ceb4 57 return NSAPI_ERROR_DHCP_FAILURE;
Maggie17 0:2d5090e1ceb4 58 }
Maggie17 0:2d5090e1ceb4 59
Maggie17 0:2d5090e1ceb4 60 return 0;
Maggie17 0:2d5090e1ceb4 61 }
Maggie17 0:2d5090e1ceb4 62
Maggie17 0:2d5090e1ceb4 63 int ESP8266Interface::disconnect()
Maggie17 0:2d5090e1ceb4 64 {
Maggie17 0:2d5090e1ceb4 65 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 66
Maggie17 0:2d5090e1ceb4 67 if (!_esp.disconnect()) {
Maggie17 0:2d5090e1ceb4 68 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 69 }
Maggie17 0:2d5090e1ceb4 70
Maggie17 0:2d5090e1ceb4 71 return 0;
Maggie17 0:2d5090e1ceb4 72 }
Maggie17 0:2d5090e1ceb4 73
Maggie17 0:2d5090e1ceb4 74 const char* ESP8266Interface::get_ip_address()
Maggie17 0:2d5090e1ceb4 75 {
Maggie17 0:2d5090e1ceb4 76 return _esp.getIPAddress();
Maggie17 0:2d5090e1ceb4 77 }
Maggie17 0:2d5090e1ceb4 78
Maggie17 0:2d5090e1ceb4 79 const char* ESP8266Interface::get_mac_address()
Maggie17 0:2d5090e1ceb4 80 {
Maggie17 0:2d5090e1ceb4 81 return _esp.getMACAddress();
Maggie17 0:2d5090e1ceb4 82 }
Maggie17 0:2d5090e1ceb4 83
Maggie17 0:2d5090e1ceb4 84 struct esp8266_socket {
Maggie17 0:2d5090e1ceb4 85 int id;
Maggie17 0:2d5090e1ceb4 86 int socketId;
Maggie17 0:2d5090e1ceb4 87 nsapi_protocol_t proto;
Maggie17 0:2d5090e1ceb4 88 bool connected;
Maggie17 0:2d5090e1ceb4 89 };
Maggie17 0:2d5090e1ceb4 90
Maggie17 0:2d5090e1ceb4 91 int ESP8266Interface::socket_open(void **handle, nsapi_protocol_t proto)
Maggie17 0:2d5090e1ceb4 92 {
Maggie17 0:2d5090e1ceb4 93 // Look for an unused socket
Maggie17 0:2d5090e1ceb4 94 int id = -1;
Maggie17 0:2d5090e1ceb4 95
Maggie17 0:2d5090e1ceb4 96 for (int i = 1; i < ESP8266_SOCKET_COUNT; i++) {
Maggie17 0:2d5090e1ceb4 97 if (!_ids[i]) {
Maggie17 0:2d5090e1ceb4 98 id = i;
Maggie17 0:2d5090e1ceb4 99 _ids[i] = true;
Maggie17 0:2d5090e1ceb4 100 break;
Maggie17 0:2d5090e1ceb4 101 }
Maggie17 0:2d5090e1ceb4 102 }
Maggie17 0:2d5090e1ceb4 103
Maggie17 0:2d5090e1ceb4 104 if (id == -1) {
Maggie17 0:2d5090e1ceb4 105 return NSAPI_ERROR_NO_SOCKET;
Maggie17 0:2d5090e1ceb4 106 }
Maggie17 0:2d5090e1ceb4 107
Maggie17 0:2d5090e1ceb4 108 struct esp8266_socket *socket = new struct esp8266_socket;
Maggie17 0:2d5090e1ceb4 109 if (!socket) {
Maggie17 0:2d5090e1ceb4 110 return NSAPI_ERROR_NO_SOCKET;
Maggie17 0:2d5090e1ceb4 111 }
Maggie17 0:2d5090e1ceb4 112
Maggie17 0:2d5090e1ceb4 113 socket->id = id;
Maggie17 0:2d5090e1ceb4 114 socket->socketId = 0;
Maggie17 0:2d5090e1ceb4 115 socket->proto = proto;
Maggie17 0:2d5090e1ceb4 116 socket->connected = false;
Maggie17 0:2d5090e1ceb4 117 *handle = socket;
Maggie17 0:2d5090e1ceb4 118 return 0;
Maggie17 0:2d5090e1ceb4 119 }
Maggie17 0:2d5090e1ceb4 120
Maggie17 0:2d5090e1ceb4 121 int ESP8266Interface::socket_close(void *handle)
Maggie17 0:2d5090e1ceb4 122 {
Maggie17 0:2d5090e1ceb4 123 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 124 int err = 0;
Maggie17 0:2d5090e1ceb4 125 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 126
Maggie17 0:2d5090e1ceb4 127 if (!_esp.close(socket->socketId)) {
Maggie17 0:2d5090e1ceb4 128 err = NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 129 }
Maggie17 0:2d5090e1ceb4 130
Maggie17 0:2d5090e1ceb4 131 _ids[socket->id] = false;
Maggie17 0:2d5090e1ceb4 132 delete socket;
Maggie17 0:2d5090e1ceb4 133 return err;
Maggie17 0:2d5090e1ceb4 134 }
Maggie17 0:2d5090e1ceb4 135
Maggie17 0:2d5090e1ceb4 136 int ESP8266Interface::socket_bind(void *handle, const SocketAddress &address)
Maggie17 0:2d5090e1ceb4 137 {
Maggie17 0:2d5090e1ceb4 138 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 139 }
Maggie17 0:2d5090e1ceb4 140
Maggie17 0:2d5090e1ceb4 141 int ESP8266Interface::socket_listen(void *handle, int backlog)
Maggie17 0:2d5090e1ceb4 142 {
Maggie17 0:2d5090e1ceb4 143 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 144 }
Maggie17 0:2d5090e1ceb4 145
Maggie17 0:2d5090e1ceb4 146 int ESP8266Interface::socket_connect(void *handle, const SocketAddress &addr)
Maggie17 0:2d5090e1ceb4 147 {
Maggie17 0:2d5090e1ceb4 148 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 149 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 150
Maggie17 0:2d5090e1ceb4 151 const char *proto = (socket->proto == NSAPI_UDP) ? "UNICAST" : "CLIENT";
Maggie17 0:2d5090e1ceb4 152 socket -> socketId = _esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port());
Maggie17 0:2d5090e1ceb4 153 if (!(socket -> socketId)) {
Maggie17 0:2d5090e1ceb4 154 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 155 }
Maggie17 0:2d5090e1ceb4 156
Maggie17 0:2d5090e1ceb4 157 socket->connected = true;
Maggie17 0:2d5090e1ceb4 158 return 0;
Maggie17 0:2d5090e1ceb4 159 }
Maggie17 0:2d5090e1ceb4 160
Maggie17 0:2d5090e1ceb4 161 int ESP8266Interface::socket_accept(void **handle, void *server)
Maggie17 0:2d5090e1ceb4 162 {
Maggie17 0:2d5090e1ceb4 163 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 164 }
Maggie17 0:2d5090e1ceb4 165
Maggie17 0:2d5090e1ceb4 166 int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 167 {
Maggie17 0:2d5090e1ceb4 168 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 169 _esp.setTimeout(ESP8266_SEND_TIMEOUT);
Maggie17 0:2d5090e1ceb4 170
Maggie17 0:2d5090e1ceb4 171 if (!_esp.send(socket->socketId, data, size)) {
Maggie17 0:2d5090e1ceb4 172 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 173 }
Maggie17 0:2d5090e1ceb4 174
Maggie17 0:2d5090e1ceb4 175 return size;
Maggie17 0:2d5090e1ceb4 176 }
Maggie17 0:2d5090e1ceb4 177
Maggie17 0:2d5090e1ceb4 178 int ESP8266Interface::socket_recv(void *handle, void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 179 {
Maggie17 0:2d5090e1ceb4 180 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 181 _esp.setTimeout(ESP8266_RECV_TIMEOUT);
Maggie17 0:2d5090e1ceb4 182
Maggie17 0:2d5090e1ceb4 183 int32_t recv = _esp.recv(socket->socketId, data, size);
Maggie17 0:2d5090e1ceb4 184 if (recv < 0) {
Maggie17 0:2d5090e1ceb4 185 return NSAPI_ERROR_WOULD_BLOCK;
Maggie17 0:2d5090e1ceb4 186 }
Maggie17 0:2d5090e1ceb4 187
Maggie17 0:2d5090e1ceb4 188 return recv;
Maggie17 0:2d5090e1ceb4 189 }
Maggie17 0:2d5090e1ceb4 190
Maggie17 0:2d5090e1ceb4 191 int ESP8266Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 192 {
Maggie17 0:2d5090e1ceb4 193 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 194 if (!socket->connected) {
Maggie17 0:2d5090e1ceb4 195 int err = socket_connect(socket, addr);
Maggie17 0:2d5090e1ceb4 196 if (err < 0) {
Maggie17 0:2d5090e1ceb4 197 return err;
Maggie17 0:2d5090e1ceb4 198 }
Maggie17 0:2d5090e1ceb4 199 }
Maggie17 0:2d5090e1ceb4 200
Maggie17 0:2d5090e1ceb4 201 return socket_send(socket, data, size);
Maggie17 0:2d5090e1ceb4 202 }
Maggie17 0:2d5090e1ceb4 203
Maggie17 0:2d5090e1ceb4 204 int ESP8266Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 205 {
Maggie17 0:2d5090e1ceb4 206 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 207 return socket_recv(socket, data, size);
Maggie17 0:2d5090e1ceb4 208 }
Maggie17 0:2d5090e1ceb4 209
Maggie17 0:2d5090e1ceb4 210 void ESP8266Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
Maggie17 0:2d5090e1ceb4 211 {
Maggie17 0:2d5090e1ceb4 212 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
Maggie17 0:2d5090e1ceb4 213 _cbs[socket->id].callback = callback;
Maggie17 0:2d5090e1ceb4 214 _cbs[socket->id].data = data;
Maggie17 0:2d5090e1ceb4 215 }
Maggie17 0:2d5090e1ceb4 216
Maggie17 0:2d5090e1ceb4 217 void ESP8266Interface::event() {
Maggie17 0:2d5090e1ceb4 218 for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
Maggie17 0:2d5090e1ceb4 219 if (_cbs[i].callback) {
Maggie17 0:2d5090e1ceb4 220 _cbs[i].callback(_cbs[i].data);
Maggie17 0:2d5090e1ceb4 221 }
Maggie17 0:2d5090e1ceb4 222 }
Maggie17 0:2d5090e1ceb4 223 }