zhang chenhong / Mbed 2 deprecated IDW01M1_Cloud_IBM

Dependencies:   mbed Servo X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI NDefLib MQTT

Committer:
mridup
Date:
Fri Apr 08 12:07:17 2016 +0000
Revision:
0:cbf8bc43bc9e
changes for optimization in Keil compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:cbf8bc43bc9e 1 /* SpwfSAInterface implementation of NetworkInterfaceAPI
mridup 0:cbf8bc43bc9e 2 * Copyright (c) 2015 ARM Limited
mridup 0:cbf8bc43bc9e 3 *
mridup 0:cbf8bc43bc9e 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:cbf8bc43bc9e 5 * you may not use this file except in compliance with the License.
mridup 0:cbf8bc43bc9e 6 * You may obtain a copy of the License at
mridup 0:cbf8bc43bc9e 7 *
mridup 0:cbf8bc43bc9e 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:cbf8bc43bc9e 9 *
mridup 0:cbf8bc43bc9e 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:cbf8bc43bc9e 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:cbf8bc43bc9e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:cbf8bc43bc9e 13 * See the License for the specific language governing permissions and
mridup 0:cbf8bc43bc9e 14 * limitations under the License.
mridup 0:cbf8bc43bc9e 15 */
mridup 0:cbf8bc43bc9e 16
mridup 0:cbf8bc43bc9e 17 #include "SPWFInterface.h"
mridup 0:cbf8bc43bc9e 18
mridup 0:cbf8bc43bc9e 19 // Various timeouts for different SPWF operations
mridup 0:cbf8bc43bc9e 20 #define SPWF_CONNECT_TIMEOUT 20000
mridup 0:cbf8bc43bc9e 21 #define SPWF_SEND_TIMEOUT 500
mridup 0:cbf8bc43bc9e 22 #define SPWF_RECV_TIMEOUT 10000
mridup 0:cbf8bc43bc9e 23 #define SPWF_MISC_TIMEOUT 15000
mridup 0:cbf8bc43bc9e 24
mridup 0:cbf8bc43bc9e 25 /**
mridup 0:cbf8bc43bc9e 26 * The singleton which represents the SpwfSAInterface.
mridup 0:cbf8bc43bc9e 27 *
mridup 0:cbf8bc43bc9e 28 */
mridup 0:cbf8bc43bc9e 29 static SpwfSAInterface spwf_device(PA_9, PA_10, PC_12, PC_8, PA_12, true);
mridup 0:cbf8bc43bc9e 30
mridup 0:cbf8bc43bc9e 31 /**
mridup 0:cbf8bc43bc9e 32 * Export the instance to the user.
mridup 0:cbf8bc43bc9e 33 */
mridup 0:cbf8bc43bc9e 34 SpwfSAInterface *createSPWFInstance(void)
mridup 0:cbf8bc43bc9e 35 {
mridup 0:cbf8bc43bc9e 36 return (&spwf_device);
mridup 0:cbf8bc43bc9e 37 }
mridup 0:cbf8bc43bc9e 38
mridup 0:cbf8bc43bc9e 39 // SpwfSAInterface implementation
mridup 0:cbf8bc43bc9e 40 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, PinName rst, PinName wkup, PinName rts, bool debug)
mridup 0:cbf8bc43bc9e 41 : _spwf(tx, rx, rst, wkup, rts)
mridup 0:cbf8bc43bc9e 42 {
mridup 0:cbf8bc43bc9e 43 memset(_ids, 0, sizeof(_ids));
mridup 0:cbf8bc43bc9e 44 }
mridup 0:cbf8bc43bc9e 45
mridup 0:cbf8bc43bc9e 46 SpwfSAInterface::~SpwfSAInterface()
mridup 0:cbf8bc43bc9e 47 {
mridup 0:cbf8bc43bc9e 48 }
mridup 0:cbf8bc43bc9e 49
mridup 0:cbf8bc43bc9e 50 int32_t SpwfSAInterface::init(void)
mridup 0:cbf8bc43bc9e 51 {
mridup 0:cbf8bc43bc9e 52 _spwf.setTimeout(SPWF_MISC_TIMEOUT);
mridup 0:cbf8bc43bc9e 53 return (_spwf.init());
mridup 0:cbf8bc43bc9e 54 }
mridup 0:cbf8bc43bc9e 55
mridup 0:cbf8bc43bc9e 56 int32_t SpwfSAInterface::connect(
mridup 0:cbf8bc43bc9e 57 const char *ap,
mridup 0:cbf8bc43bc9e 58 const char *pass_phrase,
mridup 0:cbf8bc43bc9e 59 ns_security_t security)
mridup 0:cbf8bc43bc9e 60 {
mridup 0:cbf8bc43bc9e 61 _spwf.setTimeout(SPWF_CONNECT_TIMEOUT);
mridup 0:cbf8bc43bc9e 62
mridup 0:cbf8bc43bc9e 63 if(security == NS_SECURITY_WPA2) return NS_ERROR_DEVICE_ERROR;
mridup 0:cbf8bc43bc9e 64
mridup 0:cbf8bc43bc9e 65 WiFi_Priv_Mode mode = (WiFi_Priv_Mode)security;
mridup 0:cbf8bc43bc9e 66
mridup 0:cbf8bc43bc9e 67 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));//0 on success
mridup 0:cbf8bc43bc9e 68 }
mridup 0:cbf8bc43bc9e 69
mridup 0:cbf8bc43bc9e 70 int32_t SpwfSAInterface::disconnect()
mridup 0:cbf8bc43bc9e 71 {
mridup 0:cbf8bc43bc9e 72 //_spwf.setTimeout(SPWF_SEND_TIMEOUT);
mridup 0:cbf8bc43bc9e 73
mridup 0:cbf8bc43bc9e 74 return (_spwf.disconnect());
mridup 0:cbf8bc43bc9e 75 }
mridup 0:cbf8bc43bc9e 76
mridup 0:cbf8bc43bc9e 77 const char *SpwfSAInterface::getIPAddress()
mridup 0:cbf8bc43bc9e 78 {
mridup 0:cbf8bc43bc9e 79 return _spwf.getIPAddress();
mridup 0:cbf8bc43bc9e 80 }
mridup 0:cbf8bc43bc9e 81
mridup 0:cbf8bc43bc9e 82 const char *SpwfSAInterface::getMACAddress()
mridup 0:cbf8bc43bc9e 83 {
mridup 0:cbf8bc43bc9e 84 return _spwf.getMACAddress();
mridup 0:cbf8bc43bc9e 85 }
mridup 0:cbf8bc43bc9e 86
mridup 0:cbf8bc43bc9e 87 void SpwfSAInterface::setid(bool set, int id)
mridup 0:cbf8bc43bc9e 88 {
mridup 0:cbf8bc43bc9e 89 if(set)
mridup 0:cbf8bc43bc9e 90 _ids[id] = true;
mridup 0:cbf8bc43bc9e 91 else
mridup 0:cbf8bc43bc9e 92 _ids[id] = false;
mridup 0:cbf8bc43bc9e 93 }
mridup 0:cbf8bc43bc9e 94
mridup 0:cbf8bc43bc9e 95 SocketInterface *SpwfSAInterface::createSocket(ns_protocol_t proto)
mridup 0:cbf8bc43bc9e 96 {
mridup 0:cbf8bc43bc9e 97 return new SpwfSASocket(this, &_spwf, proto);
mridup 0:cbf8bc43bc9e 98 }
mridup 0:cbf8bc43bc9e 99
mridup 0:cbf8bc43bc9e 100 void SpwfSAInterface::destroySocket(SocketInterface *iface)
mridup 0:cbf8bc43bc9e 101 {
mridup 0:cbf8bc43bc9e 102 SpwfSASocket *socket = (SpwfSASocket *)iface;
mridup 0:cbf8bc43bc9e 103 _ids[socket->_id] = false;
mridup 0:cbf8bc43bc9e 104 delete socket;
mridup 0:cbf8bc43bc9e 105 }
mridup 0:cbf8bc43bc9e 106
mridup 0:cbf8bc43bc9e 107
mridup 0:cbf8bc43bc9e 108 // SpwfSASocket implementation
mridup 0:cbf8bc43bc9e 109 int32_t SpwfSAInterface::SpwfSASocket::open(const char *ip, uint16_t port)
mridup 0:cbf8bc43bc9e 110 {
mridup 0:cbf8bc43bc9e 111 uint8_t sock_id = -1;
mridup 0:cbf8bc43bc9e 112
mridup 0:cbf8bc43bc9e 113 //__spwf->setTimeout(SPWF_SEND_TIMEOUT);
mridup 0:cbf8bc43bc9e 114
mridup 0:cbf8bc43bc9e 115 const char *proto = (_proto == NS_UDP) ? "u" : "t";//"s" for secure socket?
mridup 0:cbf8bc43bc9e 116
mridup 0:cbf8bc43bc9e 117 __spwf->socket_client_open((uint8_t*)ip, (uint32_t)port, (uint8_t *)proto, &sock_id);
mridup 0:cbf8bc43bc9e 118
mridup 0:cbf8bc43bc9e 119 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:cbf8bc43bc9e 120 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:cbf8bc43bc9e 121 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:cbf8bc43bc9e 122
mridup 0:cbf8bc43bc9e 123 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:cbf8bc43bc9e 124 {
mridup 0:cbf8bc43bc9e 125 _id = sock_id;//the socket ID of this Socket instance
mridup 0:cbf8bc43bc9e 126 _itf->setid(true, _id);
mridup 0:cbf8bc43bc9e 127 //_itf->c_table.insert(pair <char *, vector <uint16_t> > ((char*)ip, port));
mridup 0:cbf8bc43bc9e 128 }
mridup 0:cbf8bc43bc9e 129 else
mridup 0:cbf8bc43bc9e 130 return NS_ERROR_NO_SOCKET;
mridup 0:cbf8bc43bc9e 131
mridup 0:cbf8bc43bc9e 132 return 0;//0 means SUCCESS
mridup 0:cbf8bc43bc9e 133 }
mridup 0:cbf8bc43bc9e 134
mridup 0:cbf8bc43bc9e 135 int32_t SpwfSAInterface::SpwfSASocket::close()
mridup 0:cbf8bc43bc9e 136 {
mridup 0:cbf8bc43bc9e 137 int32_t err;
mridup 0:cbf8bc43bc9e 138
mridup 0:cbf8bc43bc9e 139 //__spwf->setTimeout(SPWF_SEND_TIMEOUT);
mridup 0:cbf8bc43bc9e 140
mridup 0:cbf8bc43bc9e 141 _itf->setid(false, _id);
mridup 0:cbf8bc43bc9e 142 //_itf->c_table.empty();
mridup 0:cbf8bc43bc9e 143
mridup 0:cbf8bc43bc9e 144 err = __spwf->socket_client_close((uint8_t)_id);
mridup 0:cbf8bc43bc9e 145
mridup 0:cbf8bc43bc9e 146 return err;
mridup 0:cbf8bc43bc9e 147 }
mridup 0:cbf8bc43bc9e 148
mridup 0:cbf8bc43bc9e 149 int32_t SpwfSAInterface::SpwfSASocket::send(const void *data, uint32_t size)
mridup 0:cbf8bc43bc9e 150 {
mridup 0:cbf8bc43bc9e 151 int32_t err;
mridup 0:cbf8bc43bc9e 152
mridup 0:cbf8bc43bc9e 153 //__spwf->setTimeout(SPWF_SEND_TIMEOUT);
mridup 0:cbf8bc43bc9e 154
mridup 0:cbf8bc43bc9e 155 err = __spwf->socket_client_write((uint8_t)_id, (uint16_t)size, (char*)data);
mridup 0:cbf8bc43bc9e 156
mridup 0:cbf8bc43bc9e 157 return err;
mridup 0:cbf8bc43bc9e 158 }
mridup 0:cbf8bc43bc9e 159
mridup 0:cbf8bc43bc9e 160 //return no of bytes read
mridup 0:cbf8bc43bc9e 161 int32_t SpwfSAInterface::SpwfSASocket::recv(void *data, uint32_t size)
mridup 0:cbf8bc43bc9e 162 {
mridup 0:cbf8bc43bc9e 163 int32_t recv;
mridup 0:cbf8bc43bc9e 164
mridup 0:cbf8bc43bc9e 165 __spwf->setTimeout(SPWF_RECV_TIMEOUT);
mridup 0:cbf8bc43bc9e 166
mridup 0:cbf8bc43bc9e 167 recv = __spwf->socket_client_recv((uint8_t)_id, (uint16_t)size, (char*)data);
mridup 0:cbf8bc43bc9e 168
mridup 0:cbf8bc43bc9e 169
mridup 0:cbf8bc43bc9e 170 return recv;
mridup 0:cbf8bc43bc9e 171
mridup 0:cbf8bc43bc9e 172 }
mridup 0:cbf8bc43bc9e 173
mridup 0:cbf8bc43bc9e 174 void SpwfSAInterface::debug(const char * string)
mridup 0:cbf8bc43bc9e 175 {
mridup 0:cbf8bc43bc9e 176 _spwf.debug_print(string);
mridup 0:cbf8bc43bc9e 177 }