123

Fork of WizFi250Interface_1 by cliff Hong

Committer:
cliff1
Date:
Thu Sep 21 01:01:02 2017 +0000
Revision:
3:f78b0e66ed67
Parent:
1:046a828fe0d2
test20170921

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"
cliff1 1:046a828fe0d2 19 #include "mbed_debug.h"
kaizen 0:e3dc9e54a15b 20
kaizen 0:e3dc9e54a15b 21 // Various timeouts for different WizFi250 operations
kaizen 0:e3dc9e54a15b 22 #define WizFi250_CONNECT_TIMEOUT 15000
kaizen 0:e3dc9e54a15b 23 #define WizFi250_SEND_TIMEOUT 500
kaizen 0:e3dc9e54a15b 24 #define WizFi250_RECV_TIMEOUT 0
kaizen 0:e3dc9e54a15b 25 #define WizFi250_MISC_TIMEOUT 500
kaizen 0:e3dc9e54a15b 26
kaizen 0:e3dc9e54a15b 27 #define WizFi250_DELAY_MS 300
kaizen 0:e3dc9e54a15b 28
kaizen 0:e3dc9e54a15b 29
kaizen 0:e3dc9e54a15b 30 // WizFi250Interface implementation
kaizen 0:e3dc9e54a15b 31 WizFi250Interface::WizFi250Interface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud)
kaizen 0:e3dc9e54a15b 32 : _wizfi250(tx, rx, cts, rts, reset, alarm, baud)
kaizen 0:e3dc9e54a15b 33 {
kaizen 0:e3dc9e54a15b 34 memset(_ids, 0, sizeof(_ids));
kaizen 0:e3dc9e54a15b 35 }
kaizen 0:e3dc9e54a15b 36
cliff1 1:046a828fe0d2 37
cliff1 1:046a828fe0d2 38 int WizFi250Interface::connect()
cliff1 1:046a828fe0d2 39 {
cliff1 1:046a828fe0d2 40 return 0;
cliff1 1:046a828fe0d2 41 }
cliff1 1:046a828fe0d2 42
kaizen 0:e3dc9e54a15b 43 int WizFi250Interface::connect(
kaizen 0:e3dc9e54a15b 44 const char *ssid,
kaizen 0:e3dc9e54a15b 45 const char *pass,
cliff1 1:046a828fe0d2 46 nsapi_security_t security,
cliff1 1:046a828fe0d2 47 uint8_t channel )
kaizen 0:e3dc9e54a15b 48 {
kaizen 0:e3dc9e54a15b 49 if (!_wizfi250.startup())
kaizen 0:e3dc9e54a15b 50 {
kaizen 0:e3dc9e54a15b 51 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:e3dc9e54a15b 52 }
kaizen 0:e3dc9e54a15b 53
kaizen 0:e3dc9e54a15b 54 _wizfi250.setSsid(ssid);
kaizen 0:e3dc9e54a15b 55 _wizfi250.setSec(WizFi250::SEC_AUTO, pass);
kaizen 0:e3dc9e54a15b 56 _wizfi250.setAddress("");
kaizen 0:e3dc9e54a15b 57
kaizen 0:e3dc9e54a15b 58 if( _wizfi250.join(WizFi250::WM_STATION) == -1)
kaizen 0:e3dc9e54a15b 59 {
kaizen 0:e3dc9e54a15b 60 return NSAPI_ERROR_NO_CONNECTION;
kaizen 0:e3dc9e54a15b 61 }
kaizen 0:e3dc9e54a15b 62
kaizen 0:e3dc9e54a15b 63 return 0;
kaizen 0:e3dc9e54a15b 64 }
kaizen 0:e3dc9e54a15b 65
cliff1 1:046a828fe0d2 66 int WizFi250Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
cliff1 1:046a828fe0d2 67 {
cliff1 1:046a828fe0d2 68 return 0;
cliff1 1:046a828fe0d2 69 }
cliff1 1:046a828fe0d2 70
cliff1 1:046a828fe0d2 71 int WizFi250Interface::set_channel(uint8_t channel)
cliff1 1:046a828fe0d2 72 {
cliff1 1:046a828fe0d2 73 return NSAPI_ERROR_UNSUPPORTED;
cliff1 1:046a828fe0d2 74 }
cliff1 1:046a828fe0d2 75
kaizen 0:e3dc9e54a15b 76 int WizFi250Interface::disconnect()
kaizen 0:e3dc9e54a15b 77 {
kaizen 0:e3dc9e54a15b 78 if ( _wizfi250.cmdWLEAVE() == -1 ) return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:e3dc9e54a15b 79
kaizen 0:e3dc9e54a15b 80 return 0;
kaizen 0:e3dc9e54a15b 81 }
kaizen 0:e3dc9e54a15b 82
kaizen 0:e3dc9e54a15b 83 const char *WizFi250Interface::get_ip_address()
kaizen 0:e3dc9e54a15b 84 {
kaizen 0:e3dc9e54a15b 85 return _wizfi250.getIPAddress();
kaizen 0:e3dc9e54a15b 86 }
kaizen 0:e3dc9e54a15b 87
kaizen 0:e3dc9e54a15b 88 const char *WizFi250Interface::get_mac_address()
kaizen 0:e3dc9e54a15b 89 {
kaizen 0:e3dc9e54a15b 90 return _wizfi250.getMACAddress();
kaizen 0:e3dc9e54a15b 91 }
kaizen 0:e3dc9e54a15b 92
kaizen 0:e3dc9e54a15b 93 struct wizfi250_socket {
kaizen 0:e3dc9e54a15b 94 int id;
kaizen 0:e3dc9e54a15b 95 nsapi_protocol_t proto;
kaizen 0:e3dc9e54a15b 96 bool connected;
kaizen 0:e3dc9e54a15b 97 };
kaizen 0:e3dc9e54a15b 98
kaizen 0:e3dc9e54a15b 99 int WizFi250Interface::socket_open(void **handle, nsapi_protocol_t proto)
kaizen 0:e3dc9e54a15b 100 {
kaizen 0:e3dc9e54a15b 101 // Look for an unused socket
kaizen 0:e3dc9e54a15b 102
kaizen 0:e3dc9e54a15b 103 /*
kaizen 0:e3dc9e54a15b 104 int id = -1;
kaizen 0:e3dc9e54a15b 105
kaizen 0:e3dc9e54a15b 106 for (int i = 0; i < WIZFI250_SOCKET_COUNT; i++) {
kaizen 0:e3dc9e54a15b 107 if (_ids[i] == false) {
kaizen 0:e3dc9e54a15b 108 id = i;
kaizen 0:e3dc9e54a15b 109 _ids[i] = true;
kaizen 0:e3dc9e54a15b 110 break;
kaizen 0:e3dc9e54a15b 111 }
kaizen 0:e3dc9e54a15b 112 }
kaizen 0:e3dc9e54a15b 113
kaizen 0:e3dc9e54a15b 114 if (id == -1) {
kaizen 0:e3dc9e54a15b 115 return NSAPI_ERROR_NO_SOCKET;
kaizen 0:e3dc9e54a15b 116 }
kaizen 0:e3dc9e54a15b 117 */
kaizen 0:e3dc9e54a15b 118
kaizen 0:e3dc9e54a15b 119 struct wizfi250_socket *socket = new struct wizfi250_socket;
kaizen 0:e3dc9e54a15b 120 if (!socket) {
kaizen 0:e3dc9e54a15b 121 return NSAPI_ERROR_NO_SOCKET;
kaizen 0:e3dc9e54a15b 122 }
kaizen 0:e3dc9e54a15b 123
kaizen 0:e3dc9e54a15b 124 socket->id = -1;
kaizen 0:e3dc9e54a15b 125 socket->proto = proto;
kaizen 0:e3dc9e54a15b 126 socket->connected = false;
kaizen 0:e3dc9e54a15b 127 *handle = socket;
kaizen 0:e3dc9e54a15b 128 return 0;
kaizen 0:e3dc9e54a15b 129 }
kaizen 0:e3dc9e54a15b 130
kaizen 0:e3dc9e54a15b 131 int WizFi250Interface::socket_close(void *handle)
kaizen 0:e3dc9e54a15b 132 {
kaizen 0:e3dc9e54a15b 133 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 134 int err = 0;
kaizen 0:e3dc9e54a15b 135
kaizen 0:e3dc9e54a15b 136 if(socket->id == -1){
kaizen 0:e3dc9e54a15b 137 err = NSAPI_ERROR_NO_SOCKET;
kaizen 0:e3dc9e54a15b 138 }
kaizen 0:e3dc9e54a15b 139 else if (_wizfi250.close(socket->id) == -1) {
kaizen 0:e3dc9e54a15b 140 err = NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:e3dc9e54a15b 141 }
kaizen 0:e3dc9e54a15b 142
kaizen 0:e3dc9e54a15b 143 _ids[socket->id] = false;
kaizen 0:e3dc9e54a15b 144 wait_ms(WizFi250_DELAY_MS);
kaizen 0:e3dc9e54a15b 145 delete socket;
kaizen 0:e3dc9e54a15b 146 return err;
kaizen 0:e3dc9e54a15b 147 }
kaizen 0:e3dc9e54a15b 148
kaizen 0:e3dc9e54a15b 149 int WizFi250Interface::socket_bind(void *handle, const SocketAddress &address)
kaizen 0:e3dc9e54a15b 150 {
kaizen 0:e3dc9e54a15b 151 return NSAPI_ERROR_UNSUPPORTED;
kaizen 0:e3dc9e54a15b 152 }
kaizen 0:e3dc9e54a15b 153
kaizen 0:e3dc9e54a15b 154 int WizFi250Interface::socket_listen(void *handle, int backlog)
kaizen 0:e3dc9e54a15b 155 {
kaizen 0:e3dc9e54a15b 156 return NSAPI_ERROR_UNSUPPORTED;
kaizen 0:e3dc9e54a15b 157 }
kaizen 0:e3dc9e54a15b 158
kaizen 0:e3dc9e54a15b 159 int WizFi250Interface::socket_connect(void *handle, const SocketAddress &addr)
kaizen 0:e3dc9e54a15b 160 {
kaizen 0:e3dc9e54a15b 161 int cid=-1;
kaizen 0:e3dc9e54a15b 162 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 163
kaizen 0:e3dc9e54a15b 164 WizFi250::Protocol proto = (socket->proto == NSAPI_UDP) ? WizFi250::PROTO_UDP : WizFi250::PROTO_TCP;
kaizen 0:e3dc9e54a15b 165 if((cid = _wizfi250.open(proto, addr.get_ip_address(), addr.get_port())) == -1 )
kaizen 0:e3dc9e54a15b 166 {
kaizen 0:e3dc9e54a15b 167 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:e3dc9e54a15b 168 }
kaizen 0:e3dc9e54a15b 169
kaizen 0:e3dc9e54a15b 170 if(cid >= WIZFI250_SOCKET_COUNT)
kaizen 0:e3dc9e54a15b 171 {
kaizen 0:e3dc9e54a15b 172 return NSAPI_ERROR_NO_SOCKET;
kaizen 0:e3dc9e54a15b 173 }
kaizen 0:e3dc9e54a15b 174
kaizen 0:e3dc9e54a15b 175 _ids[cid] = true;
kaizen 0:e3dc9e54a15b 176 socket->id = cid;
kaizen 0:e3dc9e54a15b 177 socket->connected = true;
kaizen 0:e3dc9e54a15b 178 wait_ms(WizFi250_DELAY_MS);
cliff1 3:f78b0e66ed67 179 printf("TEST 200\r\n");
kaizen 0:e3dc9e54a15b 180 return 0;
kaizen 0:e3dc9e54a15b 181 }
kaizen 0:e3dc9e54a15b 182
cliff1 1:046a828fe0d2 183 //int WizFi250Interface::socket_accept(void **handle, void *server)
cliff1 1:046a828fe0d2 184 //{
cliff1 1:046a828fe0d2 185 // return NSAPI_ERROR_UNSUPPORTED;
cliff1 1:046a828fe0d2 186 //}
cliff1 1:046a828fe0d2 187
cliff1 1:046a828fe0d2 188 int WizFi250Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
kaizen 0:e3dc9e54a15b 189 {
kaizen 0:e3dc9e54a15b 190 return NSAPI_ERROR_UNSUPPORTED;
kaizen 0:e3dc9e54a15b 191 }
kaizen 0:e3dc9e54a15b 192
kaizen 0:e3dc9e54a15b 193 int WizFi250Interface::socket_send(void *handle, const void *data, unsigned size)
kaizen 0:e3dc9e54a15b 194 {
kaizen 0:e3dc9e54a15b 195 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 196
kaizen 0:e3dc9e54a15b 197 if ( _wizfi250.send(socket->id, (const char*)data, size) == -1 ) {
kaizen 0:e3dc9e54a15b 198 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:e3dc9e54a15b 199 }
kaizen 0:e3dc9e54a15b 200
kaizen 0:e3dc9e54a15b 201 return size;
kaizen 0:e3dc9e54a15b 202 }
kaizen 0:e3dc9e54a15b 203
kaizen 0:e3dc9e54a15b 204 int WizFi250Interface::socket_recv(void *handle, void *data, unsigned size)
kaizen 0:e3dc9e54a15b 205 {
kaizen 0:e3dc9e54a15b 206 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 207
kaizen 0:e3dc9e54a15b 208 int32_t recv = _wizfi250.recv(socket->id, (char*)data, size);
kaizen 0:e3dc9e54a15b 209 if (recv < 0) {
kaizen 0:e3dc9e54a15b 210 return NSAPI_ERROR_WOULD_BLOCK;
kaizen 0:e3dc9e54a15b 211 }
kaizen 0:e3dc9e54a15b 212
kaizen 0:e3dc9e54a15b 213 return recv;
kaizen 0:e3dc9e54a15b 214 }
kaizen 0:e3dc9e54a15b 215
kaizen 0:e3dc9e54a15b 216 int WizFi250Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
kaizen 0:e3dc9e54a15b 217 {
kaizen 0:e3dc9e54a15b 218 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 219 if (!socket->connected) {
kaizen 0:e3dc9e54a15b 220 int err = socket_connect(socket, addr);
kaizen 0:e3dc9e54a15b 221 if (err < 0) {
kaizen 0:e3dc9e54a15b 222 return err;
kaizen 0:e3dc9e54a15b 223 }
kaizen 0:e3dc9e54a15b 224 }
kaizen 0:e3dc9e54a15b 225
kaizen 0:e3dc9e54a15b 226 return socket_send(socket, data, size);
kaizen 0:e3dc9e54a15b 227 }
kaizen 0:e3dc9e54a15b 228
kaizen 0:e3dc9e54a15b 229 int WizFi250Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
kaizen 0:e3dc9e54a15b 230 {
kaizen 0:e3dc9e54a15b 231 struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
kaizen 0:e3dc9e54a15b 232 return socket_recv(socket, data, size);
kaizen 0:e3dc9e54a15b 233 }
kaizen 0:e3dc9e54a15b 234
kaizen 0:e3dc9e54a15b 235 void WizFi250Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
kaizen 0:e3dc9e54a15b 236 {
kaizen 0:e3dc9e54a15b 237 }
kaizen 0:e3dc9e54a15b 238