Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WizFi250Interface by
WizFi250Interface.cpp@1:116433d24e91, 2017-08-18 (annotated)
- Committer:
- cliff1
- Date:
- Fri Aug 18 04:50:17 2017 +0000
- Revision:
- 1:116433d24e91
- Parent:
- 0:e3dc9e54a15b
Test 5.5
Who changed what in which revision?
| User | Revision | Line number | New 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 |
