emw312 driver

Fork of emw3162-driver by Maggie Mei

Committer:
sarahmarshy
Date:
Thu Jan 12 17:21:34 2017 -0600
Revision:
4:2ab7d68a654c
Parent:
2:fb6251306b21
Updated to mbed-os

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