iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Committer:
mridup
Date:
Wed May 04 12:16:20 2016 +0000
Revision:
5:c83ffd44f40a
Parent:
4:d7d25616f1f7
Child:
6:e7a3fca2df10
changes adapting to NetworkStack v119

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:dc55f40eb04f 1 /* SpwfSAInterface implementation of NetworkInterfaceAPI
mridup 0:dc55f40eb04f 2 * Copyright (c) 2015 ARM Limited
mridup 0:dc55f40eb04f 3 *
mridup 0:dc55f40eb04f 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:dc55f40eb04f 5 * you may not use this file except in compliance with the License.
mridup 0:dc55f40eb04f 6 * You may obtain a copy of the License at
mridup 0:dc55f40eb04f 7 *
mridup 0:dc55f40eb04f 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:dc55f40eb04f 9 *
mridup 0:dc55f40eb04f 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:dc55f40eb04f 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:dc55f40eb04f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:dc55f40eb04f 13 * See the License for the specific language governing permissions and
mridup 0:dc55f40eb04f 14 * limitations under the License.
mridup 0:dc55f40eb04f 15 */
mridup 0:dc55f40eb04f 16
mridup 0:dc55f40eb04f 17 #include "SPWFInterface.h"
mridup 0:dc55f40eb04f 18
mridup 0:dc55f40eb04f 19 // Various timeouts for different SPWF operations
mridup 0:dc55f40eb04f 20 #define SPWF_CONNECT_TIMEOUT 20000
mridup 0:dc55f40eb04f 21 #define SPWF_SEND_TIMEOUT 500
mridup 5:c83ffd44f40a 22 #define SPWF_RECV_TIMEOUT 2000
mridup 0:dc55f40eb04f 23 #define SPWF_MISC_TIMEOUT 15000
mridup 5:c83ffd44f40a 24
mridup 5:c83ffd44f40a 25 // Handle structure for socket
mridup 5:c83ffd44f40a 26 struct spwf_socket {
mridup 5:c83ffd44f40a 27 int id;
mridup 5:c83ffd44f40a 28 nsapi_protocol_t proto;
mridup 5:c83ffd44f40a 29 bool connected;
mridup 5:c83ffd44f40a 30 };
mridup 0:dc55f40eb04f 31
mridup 0:dc55f40eb04f 32 // SpwfSAInterface implementation
mridup 0:dc55f40eb04f 33 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, PinName rst, PinName wkup, PinName rts, bool debug)
mridup 0:dc55f40eb04f 34 : _spwf(tx, rx, rst, wkup, rts)
mridup 0:dc55f40eb04f 35 {
mridup 0:dc55f40eb04f 36 memset(_ids, 0, sizeof(_ids));
mridup 3:fd9d20c4d3f0 37 isInitialized = false;
mridup 0:dc55f40eb04f 38 }
mridup 0:dc55f40eb04f 39
mridup 0:dc55f40eb04f 40 SpwfSAInterface::~SpwfSAInterface()
mridup 0:dc55f40eb04f 41 {
mridup 0:dc55f40eb04f 42 }
mridup 0:dc55f40eb04f 43
mridup 5:c83ffd44f40a 44 int SpwfSAInterface::init(void)
mridup 0:dc55f40eb04f 45 {
mridup 0:dc55f40eb04f 46 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:dc55f40eb04f 47 return (_spwf.init());
mridup 0:dc55f40eb04f 48 }
mridup 0:dc55f40eb04f 49
mridup 5:c83ffd44f40a 50 int SpwfSAInterface::connect(
mridup 0:dc55f40eb04f 51 const char *ap,
mridup 0:dc55f40eb04f 52 const char *pass_phrase,
mridup 5:c83ffd44f40a 53 nsapi_security_t security)
mridup 0:dc55f40eb04f 54 {
mridup 3:fd9d20c4d3f0 55 //initialize the device before connecting
mridup 3:fd9d20c4d3f0 56 if(!isInitialized)
mridup 3:fd9d20c4d3f0 57 {
mridup 3:fd9d20c4d3f0 58 if(init()==0)
mridup 3:fd9d20c4d3f0 59 isInitialized=true;
mridup 5:c83ffd44f40a 60 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:fd9d20c4d3f0 61 }
mridup 3:fd9d20c4d3f0 62
mridup 0:dc55f40eb04f 63 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
mridup 0:dc55f40eb04f 64
mridup 5:c83ffd44f40a 65 if(security == NSAPI_SECURITY_WPA2) return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:dc55f40eb04f 66
mridup 0:dc55f40eb04f 67 WiFi_Priv_Mode mode = (WiFi_Priv_Mode)security;
mridup 0:dc55f40eb04f 68
mridup 0:dc55f40eb04f 69 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));//0 on success
mridup 0:dc55f40eb04f 70 }
mridup 0:dc55f40eb04f 71
mridup 5:c83ffd44f40a 72 int SpwfSAInterface::disconnect()
mridup 5:c83ffd44f40a 73 {
mridup 0:dc55f40eb04f 74 return (_spwf.disconnect());
mridup 0:dc55f40eb04f 75 }
mridup 0:dc55f40eb04f 76
mridup 5:c83ffd44f40a 77 const char *SpwfSAInterface::get_ip_address()
mridup 0:dc55f40eb04f 78 {
mridup 0:dc55f40eb04f 79 return _spwf.getIPAddress();
mridup 0:dc55f40eb04f 80 }
mridup 0:dc55f40eb04f 81
mridup 5:c83ffd44f40a 82 const char *SpwfSAInterface::get_mac_address()
mridup 0:dc55f40eb04f 83 {
mridup 0:dc55f40eb04f 84 return _spwf.getMACAddress();
mridup 0:dc55f40eb04f 85 }
mridup 0:dc55f40eb04f 86
mridup 5:c83ffd44f40a 87
mridup 5:c83ffd44f40a 88 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:dc55f40eb04f 89 {
mridup 5:c83ffd44f40a 90 // Look for an unused socket
mridup 5:c83ffd44f40a 91 int id = -1;
mridup 5:c83ffd44f40a 92
mridup 5:c83ffd44f40a 93 struct spwf_socket *socket = new struct spwf_socket;
mridup 5:c83ffd44f40a 94 if (!socket) {
mridup 5:c83ffd44f40a 95 return NSAPI_ERROR_NO_SOCKET;
mridup 5:c83ffd44f40a 96 }
mridup 5:c83ffd44f40a 97
mridup 5:c83ffd44f40a 98 socket->id = id;
mridup 5:c83ffd44f40a 99 socket->proto = proto;
mridup 5:c83ffd44f40a 100 socket->connected = false;
mridup 5:c83ffd44f40a 101 *handle = socket;
mridup 5:c83ffd44f40a 102 return 0;
mridup 0:dc55f40eb04f 103 }
mridup 5:c83ffd44f40a 104
mridup 5:c83ffd44f40a 105 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 5:c83ffd44f40a 106 {
mridup 5:c83ffd44f40a 107 uint8_t sock_id = 9;
mridup 5:c83ffd44f40a 108 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 109
mridup 5:c83ffd44f40a 110 const char *proto = (socket->proto == NSAPI_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:dc55f40eb04f 111
mridup 5:c83ffd44f40a 112 _spwf.socket_client_open((uint8_t*)addr.get_ip_address(), (uint32_t)addr.get_port(), (uint8_t *)proto, &sock_id);//sock ID is allocated NOW
mridup 0:dc55f40eb04f 113
mridup 0:dc55f40eb04f 114 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:dc55f40eb04f 115 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:dc55f40eb04f 116 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:dc55f40eb04f 117
mridup 0:dc55f40eb04f 118 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:dc55f40eb04f 119 {
mridup 5:c83ffd44f40a 120 //_ids[socket->id] = false;
mridup 5:c83ffd44f40a 121 socket->id = sock_id;//the socket ID of this Socket instance
mridup 5:c83ffd44f40a 122 _ids[socket->id] = true;
mridup 5:c83ffd44f40a 123 socket->connected = true;
mridup 0:dc55f40eb04f 124 }
mridup 0:dc55f40eb04f 125 else
mridup 5:c83ffd44f40a 126 return NSAPI_ERROR_NO_SOCKET;
mridup 0:dc55f40eb04f 127
mridup 0:dc55f40eb04f 128 return 0;//0 means SUCCESS
mridup 0:dc55f40eb04f 129 }
mridup 5:c83ffd44f40a 130
mridup 5:c83ffd44f40a 131 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 5:c83ffd44f40a 132 {
mridup 5:c83ffd44f40a 133 return NSAPI_ERROR_UNSUPPORTED;
mridup 5:c83ffd44f40a 134 }
mridup 5:c83ffd44f40a 135
mridup 5:c83ffd44f40a 136 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:dc55f40eb04f 137 {
mridup 5:c83ffd44f40a 138 return NSAPI_ERROR_UNSUPPORTED;
mridup 5:c83ffd44f40a 139 }
mridup 5:c83ffd44f40a 140
mridup 5:c83ffd44f40a 141 int SpwfSAInterface::socket_accept(void **handle, void *server)
mridup 5:c83ffd44f40a 142 {
mridup 5:c83ffd44f40a 143 return NSAPI_ERROR_UNSUPPORTED;
mridup 5:c83ffd44f40a 144 }
mridup 5:c83ffd44f40a 145
mridup 5:c83ffd44f40a 146 int SpwfSAInterface::socket_close(void *handle)
mridup 5:c83ffd44f40a 147 {
mridup 5:c83ffd44f40a 148 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 149 int err = 0;
mridup 5:c83ffd44f40a 150 //_spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:dc55f40eb04f 151
mridup 5:c83ffd44f40a 152 if(socket->id!=-1)
mridup 5:c83ffd44f40a 153 {
mridup 5:c83ffd44f40a 154 if (_spwf.socket_client_close(socket->id)==-1) {
mridup 5:c83ffd44f40a 155 err = NSAPI_ERROR_DEVICE_ERROR;
mridup 5:c83ffd44f40a 156 }
mridup 5:c83ffd44f40a 157 _ids[socket->id] = false;
mridup 5:c83ffd44f40a 158 }
mridup 5:c83ffd44f40a 159
mridup 5:c83ffd44f40a 160 delete socket;
mridup 0:dc55f40eb04f 161 return err;
mridup 0:dc55f40eb04f 162 }
mridup 5:c83ffd44f40a 163
mridup 5:c83ffd44f40a 164 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 5:c83ffd44f40a 165 {
mridup 5:c83ffd44f40a 166 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 167 int err;
mridup 0:dc55f40eb04f 168
mridup 5:c83ffd44f40a 169 err = _spwf.socket_client_write((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 0:dc55f40eb04f 170
mridup 0:dc55f40eb04f 171 return err;
mridup 0:dc55f40eb04f 172 }
mridup 0:dc55f40eb04f 173
mridup 0:dc55f40eb04f 174 //return no of bytes read
mridup 5:c83ffd44f40a 175 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:dc55f40eb04f 176 {
mridup 5:c83ffd44f40a 177 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:dc55f40eb04f 178 int32_t recv;
mridup 0:dc55f40eb04f 179
mridup 5:c83ffd44f40a 180 _spwf.setTimeout(SPWF_RECV_TIMEOUT);
mridup 0:dc55f40eb04f 181
mridup 5:c83ffd44f40a 182 recv = _spwf.socket_client_recv((uint8_t)socket->id, (uint16_t)size, (char*)data);
mridup 5:c83ffd44f40a 183 if (recv < 0) {
mridup 5:c83ffd44f40a 184 return NSAPI_ERROR_WOULD_BLOCK;
mridup 5:c83ffd44f40a 185 }
mridup 0:dc55f40eb04f 186 return recv;
mridup 0:dc55f40eb04f 187
mridup 0:dc55f40eb04f 188 }
mridup 0:dc55f40eb04f 189
mridup 5:c83ffd44f40a 190 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 5:c83ffd44f40a 191 {
mridup 5:c83ffd44f40a 192 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 193 if (!socket->connected) {
mridup 5:c83ffd44f40a 194 int err = socket_connect(socket, addr);
mridup 5:c83ffd44f40a 195 if (err < 0) {
mridup 5:c83ffd44f40a 196 return err;
mridup 5:c83ffd44f40a 197 }
mridup 5:c83ffd44f40a 198 }
mridup 5:c83ffd44f40a 199
mridup 5:c83ffd44f40a 200 return socket_send(socket, data, size);
mridup 5:c83ffd44f40a 201 }
mridup 5:c83ffd44f40a 202
mridup 5:c83ffd44f40a 203 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 5:c83ffd44f40a 204 {
mridup 5:c83ffd44f40a 205 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 5:c83ffd44f40a 206 return socket_recv(socket, data, size);
mridup 5:c83ffd44f40a 207 }
mridup 5:c83ffd44f40a 208
mridup 5:c83ffd44f40a 209 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 5:c83ffd44f40a 210 {
mridup 5:c83ffd44f40a 211 //No implementation yet
mridup 5:c83ffd44f40a 212 }
mridup 5:c83ffd44f40a 213
mridup 0:dc55f40eb04f 214 void SpwfSAInterface::debug(const char * string)
mridup 0:dc55f40eb04f 215 {
mridup 0:dc55f40eb04f 216 _spwf.debug_print(string);
mridup 0:dc55f40eb04f 217 }