emw3162 driver for mbed os 5

Fork of emw3162-driver by Maggie Mei

Committer:
Maggie17
Date:
Thu Nov 17 03:52:22 2016 +0000
Revision:
3:a6f80a95b039
Parent:
2:fb6251306b21
emw3162 driver for mbed os 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Maggie17 2:fb6251306b21 1 /* EMW3162 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 2:fb6251306b21 20 // Various timeouts for different EMW3162 operations
Maggie17 2:fb6251306b21 21 #define EMW3162_CONNECT_TIMEOUT 15000
Maggie17 2:fb6251306b21 22 #define EMW3162_SEND_TIMEOUT 500
Maggie17 2:fb6251306b21 23 #define EMW3162_RECV_TIMEOUT 0
Maggie17 2:fb6251306b21 24 #define EMW3162_MISC_TIMEOUT 500
Maggie17 0:2d5090e1ceb4 25
Maggie17 0:2d5090e1ceb4 26
Maggie17 2:fb6251306b21 27 // EMW3162Interface implementation
Maggie17 2:fb6251306b21 28 EMW3162Interface::EMW3162Interface(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 2:fb6251306b21 34 _esp.attach(this, &EMW3162Interface::event);
Maggie17 0:2d5090e1ceb4 35 }
Maggie17 0:2d5090e1ceb4 36
Maggie17 3:a6f80a95b039 37 int EMW3162Interface::connect()
Maggie17 3:a6f80a95b039 38 {
Maggie17 3:a6f80a95b039 39 return 0;
Maggie17 3:a6f80a95b039 40 }
Maggie17 3:a6f80a95b039 41 int EMW3162Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
Maggie17 3:a6f80a95b039 42 uint8_t channel)
Maggie17 0:2d5090e1ceb4 43 {
Maggie17 2:fb6251306b21 44 _esp.setTimeout(EMW3162_CONNECT_TIMEOUT);
Maggie17 0:2d5090e1ceb4 45
Maggie17 0:2d5090e1ceb4 46 if (!_esp.startup()) {
Maggie17 0:2d5090e1ceb4 47 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 48 }
Maggie17 0:2d5090e1ceb4 49
Maggie17 0:2d5090e1ceb4 50 if (!_esp.dhcp(true)) {
Maggie17 0:2d5090e1ceb4 51 return NSAPI_ERROR_DHCP_FAILURE;
Maggie17 0:2d5090e1ceb4 52 }
Maggie17 0:2d5090e1ceb4 53
Maggie17 0:2d5090e1ceb4 54 if (!_esp.connect(ssid, pass)) {
Maggie17 0:2d5090e1ceb4 55 return NSAPI_ERROR_NO_CONNECTION;
Maggie17 0:2d5090e1ceb4 56 }
Maggie17 0:2d5090e1ceb4 57
Maggie17 0:2d5090e1ceb4 58 if (!_esp.getIPAddress()) {
Maggie17 0:2d5090e1ceb4 59 return NSAPI_ERROR_DHCP_FAILURE;
Maggie17 0:2d5090e1ceb4 60 }
Maggie17 0:2d5090e1ceb4 61
Maggie17 3:a6f80a95b039 62 return NSAPI_ERROR_OK;
Maggie17 3:a6f80a95b039 63 }
Maggie17 3:a6f80a95b039 64
Maggie17 3:a6f80a95b039 65 int EMW3162Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
Maggie17 3:a6f80a95b039 66 {
Maggie17 0:2d5090e1ceb4 67 return 0;
Maggie17 0:2d5090e1ceb4 68 }
Maggie17 0:2d5090e1ceb4 69
Maggie17 3:a6f80a95b039 70 int EMW3162Interface::set_channel(uint8_t channel)
Maggie17 3:a6f80a95b039 71 {
Maggie17 3:a6f80a95b039 72 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 3:a6f80a95b039 73 }
Maggie17 3:a6f80a95b039 74
Maggie17 2:fb6251306b21 75 int EMW3162Interface::disconnect()
Maggie17 0:2d5090e1ceb4 76 {
Maggie17 2:fb6251306b21 77 _esp.setTimeout(EMW3162_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 78
Maggie17 0:2d5090e1ceb4 79 if (!_esp.disconnect()) {
Maggie17 0:2d5090e1ceb4 80 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 81 }
Maggie17 0:2d5090e1ceb4 82
Maggie17 0:2d5090e1ceb4 83 return 0;
Maggie17 0:2d5090e1ceb4 84 }
Maggie17 0:2d5090e1ceb4 85
Maggie17 2:fb6251306b21 86 const char* EMW3162Interface::get_ip_address()
Maggie17 0:2d5090e1ceb4 87 {
Maggie17 0:2d5090e1ceb4 88 return _esp.getIPAddress();
Maggie17 0:2d5090e1ceb4 89 }
Maggie17 0:2d5090e1ceb4 90
Maggie17 2:fb6251306b21 91 const char* EMW3162Interface::get_mac_address()
Maggie17 0:2d5090e1ceb4 92 {
Maggie17 0:2d5090e1ceb4 93 return _esp.getMACAddress();
Maggie17 0:2d5090e1ceb4 94 }
Maggie17 0:2d5090e1ceb4 95
Maggie17 3:a6f80a95b039 96 const char *EMW3162Interface::get_gateway()
Maggie17 3:a6f80a95b039 97 {
Maggie17 3:a6f80a95b039 98 return NULL;
Maggie17 3:a6f80a95b039 99 }
Maggie17 3:a6f80a95b039 100
Maggie17 3:a6f80a95b039 101 const char *EMW3162Interface::get_netmask()
Maggie17 3:a6f80a95b039 102 {
Maggie17 3:a6f80a95b039 103 return NULL;
Maggie17 3:a6f80a95b039 104 }
Maggie17 3:a6f80a95b039 105
Maggie17 3:a6f80a95b039 106 int8_t EMW3162Interface::get_rssi()
Maggie17 3:a6f80a95b039 107 {
Maggie17 3:a6f80a95b039 108 return 0;
Maggie17 3:a6f80a95b039 109 }
Maggie17 3:a6f80a95b039 110
Maggie17 3:a6f80a95b039 111 int EMW3162Interface::scan(WiFiAccessPoint *res, unsigned count)
Maggie17 3:a6f80a95b039 112 {
Maggie17 3:a6f80a95b039 113 return 0;
Maggie17 3:a6f80a95b039 114 }
Maggie17 3:a6f80a95b039 115
Maggie17 2:fb6251306b21 116 struct EMW3162_socket {
Maggie17 0:2d5090e1ceb4 117 int id;
Maggie17 0:2d5090e1ceb4 118 int socketId;
Maggie17 0:2d5090e1ceb4 119 nsapi_protocol_t proto;
Maggie17 0:2d5090e1ceb4 120 bool connected;
Maggie17 0:2d5090e1ceb4 121 };
Maggie17 0:2d5090e1ceb4 122
Maggie17 2:fb6251306b21 123 int EMW3162Interface::socket_open(void **handle, nsapi_protocol_t proto)
Maggie17 0:2d5090e1ceb4 124 {
Maggie17 0:2d5090e1ceb4 125 // Look for an unused socket
Maggie17 0:2d5090e1ceb4 126 int id = -1;
Maggie17 0:2d5090e1ceb4 127
Maggie17 2:fb6251306b21 128 for (int i = 1; i < EMW3162_SOCKET_COUNT; i++) {
Maggie17 0:2d5090e1ceb4 129 if (!_ids[i]) {
Maggie17 0:2d5090e1ceb4 130 id = i;
Maggie17 0:2d5090e1ceb4 131 _ids[i] = true;
Maggie17 0:2d5090e1ceb4 132 break;
Maggie17 0:2d5090e1ceb4 133 }
Maggie17 0:2d5090e1ceb4 134 }
Maggie17 0:2d5090e1ceb4 135
Maggie17 0:2d5090e1ceb4 136 if (id == -1) {
Maggie17 0:2d5090e1ceb4 137 return NSAPI_ERROR_NO_SOCKET;
Maggie17 0:2d5090e1ceb4 138 }
Maggie17 0:2d5090e1ceb4 139
Maggie17 2:fb6251306b21 140 struct EMW3162_socket *socket = new struct EMW3162_socket;
Maggie17 0:2d5090e1ceb4 141 if (!socket) {
Maggie17 0:2d5090e1ceb4 142 return NSAPI_ERROR_NO_SOCKET;
Maggie17 0:2d5090e1ceb4 143 }
Maggie17 0:2d5090e1ceb4 144
Maggie17 0:2d5090e1ceb4 145 socket->id = id;
Maggie17 0:2d5090e1ceb4 146 socket->socketId = 0;
Maggie17 0:2d5090e1ceb4 147 socket->proto = proto;
Maggie17 0:2d5090e1ceb4 148 socket->connected = false;
Maggie17 0:2d5090e1ceb4 149 *handle = socket;
Maggie17 0:2d5090e1ceb4 150 return 0;
Maggie17 0:2d5090e1ceb4 151 }
Maggie17 0:2d5090e1ceb4 152
Maggie17 2:fb6251306b21 153 int EMW3162Interface::socket_close(void *handle)
Maggie17 0:2d5090e1ceb4 154 {
Maggie17 2:fb6251306b21 155 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 0:2d5090e1ceb4 156 int err = 0;
Maggie17 2:fb6251306b21 157 _esp.setTimeout(EMW3162_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 158
Maggie17 0:2d5090e1ceb4 159 if (!_esp.close(socket->socketId)) {
Maggie17 0:2d5090e1ceb4 160 err = NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 161 }
Maggie17 0:2d5090e1ceb4 162
Maggie17 0:2d5090e1ceb4 163 _ids[socket->id] = false;
Maggie17 0:2d5090e1ceb4 164 delete socket;
Maggie17 0:2d5090e1ceb4 165 return err;
Maggie17 0:2d5090e1ceb4 166 }
Maggie17 0:2d5090e1ceb4 167
Maggie17 2:fb6251306b21 168 int EMW3162Interface::socket_bind(void *handle, const SocketAddress &address)
Maggie17 0:2d5090e1ceb4 169 {
Maggie17 0:2d5090e1ceb4 170 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 171 }
Maggie17 0:2d5090e1ceb4 172
Maggie17 2:fb6251306b21 173 int EMW3162Interface::socket_listen(void *handle, int backlog)
Maggie17 0:2d5090e1ceb4 174 {
Maggie17 0:2d5090e1ceb4 175 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 176 }
Maggie17 0:2d5090e1ceb4 177
Maggie17 2:fb6251306b21 178 int EMW3162Interface::socket_connect(void *handle, const SocketAddress &addr)
Maggie17 0:2d5090e1ceb4 179 {
Maggie17 2:fb6251306b21 180 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 2:fb6251306b21 181 _esp.setTimeout(EMW3162_MISC_TIMEOUT);
Maggie17 0:2d5090e1ceb4 182
Maggie17 0:2d5090e1ceb4 183 const char *proto = (socket->proto == NSAPI_UDP) ? "UNICAST" : "CLIENT";
Maggie17 0:2d5090e1ceb4 184 socket -> socketId = _esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port());
Maggie17 0:2d5090e1ceb4 185 if (!(socket -> socketId)) {
Maggie17 0:2d5090e1ceb4 186 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 187 }
Maggie17 0:2d5090e1ceb4 188
Maggie17 0:2d5090e1ceb4 189 socket->connected = true;
Maggie17 0:2d5090e1ceb4 190 return 0;
Maggie17 0:2d5090e1ceb4 191 }
Maggie17 0:2d5090e1ceb4 192
Maggie17 3:a6f80a95b039 193 int EMW3162Interface::socket_accept(void *handle, void **socket, SocketAddress *address)
Maggie17 0:2d5090e1ceb4 194 {
Maggie17 0:2d5090e1ceb4 195 return NSAPI_ERROR_UNSUPPORTED;
Maggie17 0:2d5090e1ceb4 196 }
Maggie17 0:2d5090e1ceb4 197
Maggie17 2:fb6251306b21 198 int EMW3162Interface::socket_send(void *handle, const void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 199 {
Maggie17 2:fb6251306b21 200 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 2:fb6251306b21 201 _esp.setTimeout(EMW3162_SEND_TIMEOUT);
Maggie17 0:2d5090e1ceb4 202
Maggie17 0:2d5090e1ceb4 203 if (!_esp.send(socket->socketId, data, size)) {
Maggie17 0:2d5090e1ceb4 204 return NSAPI_ERROR_DEVICE_ERROR;
Maggie17 0:2d5090e1ceb4 205 }
Maggie17 0:2d5090e1ceb4 206
Maggie17 0:2d5090e1ceb4 207 return size;
Maggie17 0:2d5090e1ceb4 208 }
Maggie17 0:2d5090e1ceb4 209
Maggie17 2:fb6251306b21 210 int EMW3162Interface::socket_recv(void *handle, void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 211 {
Maggie17 2:fb6251306b21 212 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 2:fb6251306b21 213 _esp.setTimeout(EMW3162_RECV_TIMEOUT);
Maggie17 0:2d5090e1ceb4 214
Maggie17 0:2d5090e1ceb4 215 int32_t recv = _esp.recv(socket->socketId, data, size);
Maggie17 0:2d5090e1ceb4 216 if (recv < 0) {
Maggie17 0:2d5090e1ceb4 217 return NSAPI_ERROR_WOULD_BLOCK;
Maggie17 0:2d5090e1ceb4 218 }
Maggie17 0:2d5090e1ceb4 219
Maggie17 0:2d5090e1ceb4 220 return recv;
Maggie17 0:2d5090e1ceb4 221 }
Maggie17 0:2d5090e1ceb4 222
Maggie17 2:fb6251306b21 223 int EMW3162Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 224 {
Maggie17 2:fb6251306b21 225 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 0:2d5090e1ceb4 226 if (!socket->connected) {
Maggie17 0:2d5090e1ceb4 227 int err = socket_connect(socket, addr);
Maggie17 0:2d5090e1ceb4 228 if (err < 0) {
Maggie17 0:2d5090e1ceb4 229 return err;
Maggie17 0:2d5090e1ceb4 230 }
Maggie17 0:2d5090e1ceb4 231 }
Maggie17 0:2d5090e1ceb4 232
Maggie17 0:2d5090e1ceb4 233 return socket_send(socket, data, size);
Maggie17 0:2d5090e1ceb4 234 }
Maggie17 0:2d5090e1ceb4 235
Maggie17 2:fb6251306b21 236 int EMW3162Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
Maggie17 0:2d5090e1ceb4 237 {
Maggie17 2:fb6251306b21 238 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 0:2d5090e1ceb4 239 return socket_recv(socket, data, size);
Maggie17 0:2d5090e1ceb4 240 }
Maggie17 0:2d5090e1ceb4 241
Maggie17 2:fb6251306b21 242 void EMW3162Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
Maggie17 0:2d5090e1ceb4 243 {
Maggie17 2:fb6251306b21 244 struct EMW3162_socket *socket = (struct EMW3162_socket *)handle;
Maggie17 0:2d5090e1ceb4 245 _cbs[socket->id].callback = callback;
Maggie17 0:2d5090e1ceb4 246 _cbs[socket->id].data = data;
Maggie17 0:2d5090e1ceb4 247 }
Maggie17 0:2d5090e1ceb4 248
Maggie17 2:fb6251306b21 249 void EMW3162Interface::event() {
Maggie17 2:fb6251306b21 250 for (int i = 0; i < EMW3162_SOCKET_COUNT; i++) {
Maggie17 0:2d5090e1ceb4 251 if (_cbs[i].callback) {
Maggie17 0:2d5090e1ceb4 252 _cbs[i].callback(_cbs[i].data);
Maggie17 0:2d5090e1ceb4 253 }
Maggie17 0:2d5090e1ceb4 254 }
Maggie17 0:2d5090e1ceb4 255 }