This is WizFi250 library for NetworkInterfaceAPI of mbed5

Dependents:   HelloWizFi250Interface

Committer:
kaizen
Date:
Tue Aug 30 00:05:24 2016 +0000
Revision:
0:e3dc9e54a15b
First release WizFi250Interface for NetworkInterfaceAPI

Who changed what in which revision?

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