wifi test

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JMF 0:24d3eb812fd4 1 /**
JMF 0:24d3eb812fd4 2 * copyright (c) 2017-2018, James Flynn
JMF 0:24d3eb812fd4 3 * SPDX-License-Identifier: Apache-2.0
JMF 0:24d3eb812fd4 4 */
JMF 0:24d3eb812fd4 5
JMF 0:24d3eb812fd4 6 /*
JMF 0:24d3eb812fd4 7 * Licensed under the Apache License, Version 2.0 (the "License");
JMF 0:24d3eb812fd4 8 * you may not use this file except in compliance with the License.
JMF 0:24d3eb812fd4 9 * You may obtain a copy of the License at
JMF 0:24d3eb812fd4 10 *
JMF 0:24d3eb812fd4 11 * http://www.apache.org/licenses/LICENSE-2.0
JMF 0:24d3eb812fd4 12 *
JMF 0:24d3eb812fd4 13 * Unless required by applicable law or agreed to in writing, software
JMF 0:24d3eb812fd4 14 * distributed under the License is distributed on an "AS IS" BASIS,
JMF 0:24d3eb812fd4 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JMF 0:24d3eb812fd4 16 *
JMF 0:24d3eb812fd4 17 * See the License for the specific language governing permissions and
JMF 0:24d3eb812fd4 18 * limitations under the License.
JMF 0:24d3eb812fd4 19 *
JMF 0:24d3eb812fd4 20 */
JMF 0:24d3eb812fd4 21
JMF 0:24d3eb812fd4 22 /**
JMF 0:24d3eb812fd4 23 * @file WNC14A2AInterface.cpp
JMF 0:24d3eb812fd4 24 * @brief WNC14A2A implementation of NetworkInterfaceAPI for Mbed OS
JMF 0:24d3eb812fd4 25 *
JMF 0:24d3eb812fd4 26 * @author James Flynn
JMF 0:24d3eb812fd4 27 *
JMF 0:24d3eb812fd4 28 * @date 1-Feb-2018
JMF 0:24d3eb812fd4 29 */
JMF 0:24d3eb812fd4 30
JMF 0:24d3eb812fd4 31 #include "WNC14A2AInterface.h"
JMF 0:24d3eb812fd4 32 #include <Thread.h>
JMF 0:24d3eb812fd4 33 #include "mbed_events.h"
JMF 0:24d3eb812fd4 34 #include "WNCIO.h"
JMF 0:24d3eb812fd4 35
JMF 0:24d3eb812fd4 36 #include <string>
JMF 0:24d3eb812fd4 37 #include <ctype.h>
JMF 0:24d3eb812fd4 38
JMF 0:24d3eb812fd4 39 #define WNC_DEBUG 0 //1=enable the WNC startup debug output
JMF 0:24d3eb812fd4 40 //0=disable the WNC startup debug output
JMF 0:24d3eb812fd4 41 #define STOP_ON_FE 1 //1=hang forever if a fatal error occurs
JMF 0:24d3eb812fd4 42 //0=simply return failed response for all socket calls
JMF 0:24d3eb812fd4 43 #define DISPLAY_FE 1 //1 to display the fatal error when it occurs
JMF 0:24d3eb812fd4 44 //0 to NOT display the fatal error
JMF 0:24d3eb812fd4 45 #define RESETON_FE 0 //1 to cause the MCU to reset on fatal error
JMF 0:24d3eb812fd4 46 //0 to NOT reset the MCU
JMF 0:24d3eb812fd4 47
JMF 0:24d3eb812fd4 48 /** Error Handling macros & data
JMF 0:24d3eb812fd4 49 * @brief The macros CHK_WNCFE is used to check if a fatal error has occured. If it has
JMF 0:24d3eb812fd4 50 * then execute the action specified: fail, void, null, resume
JMF 0:24d3eb812fd4 51 *
JMF 0:24d3eb812fd4 52 * CHK_WNCFE( condition-to-check, fail|void|null|resume )
JMF 0:24d3eb812fd4 53 *
JMF 0:24d3eb812fd4 54 * 'fail' if you want FATAL_WNC_ERROR to be called.
JMF 0:24d3eb812fd4 55 * 'void' if you want to execute a void return
JMF 0:24d3eb812fd4 56 * 'null' if you want to execute a null return
JMF 0:24d3eb812fd4 57 * 'resume' if you simply want to resume program execution
JMF 0:24d3eb812fd4 58 *
JMF 0:24d3eb812fd4 59 * There are several settings that control how FATAL_WNC_ERROR behaves:
JMF 0:24d3eb812fd4 60 * 1) RESETON_FE determines if the system will reset or hang.
JMF 0:24d3eb812fd4 61 * 2) DISPLAY_FE determine if an error message is generated or not
JMF 0:24d3eb812fd4 62 *
JMF 0:24d3eb812fd4 63 * The DISPLAY_FE setting determines if a failure message is displayed.
JMF 0:24d3eb812fd4 64 * If set to 1, user sees this messageo:
JMF 0:24d3eb812fd4 65 *
JMF 0:24d3eb812fd4 66 * WNC FAILED @ source-file-name:source-file-line-number
JMF 0:24d3eb812fd4 67 *
JMF 0:24d3eb812fd4 68 * if not set, nothing is displayed.
JMF 0:24d3eb812fd4 69 */
JMF 0:24d3eb812fd4 70
JMF 0:24d3eb812fd4 71 #define FATAL_FLAG WncController::WNC_NO_RESPONSE
JMF 0:24d3eb812fd4 72 #define WNC_GOOD WncController::WNC_ON
JMF 0:24d3eb812fd4 73
JMF 0:24d3eb812fd4 74 #define RETfail return -1
JMF 0:24d3eb812fd4 75 #define RETvoid return
JMF 0:24d3eb812fd4 76 #define RETnull return NULL
JMF 0:24d3eb812fd4 77 #define RETresume
JMF 0:24d3eb812fd4 78
JMF 0:24d3eb812fd4 79 #define DORET(x) RET##x
JMF 0:24d3eb812fd4 80
JMF 0:24d3eb812fd4 81 #define TOSTR(x) #x
JMF 0:24d3eb812fd4 82 #define INTSTR(x) TOSTR(x)
JMF 0:24d3eb812fd4 83 #define FATAL_STR (char*)(__FILE__ ":" INTSTR(__LINE__))
JMF 0:24d3eb812fd4 84
JMF 0:24d3eb812fd4 85 #if RESETON_FE == 1 //reset on fatal error
JMF 0:24d3eb812fd4 86 #define MCURESET ((*((volatile unsigned long *)0xE000ED0CU))=(unsigned long)((0x5fa<<16) | 0x04L))
JMF 0:24d3eb812fd4 87 #define RSTMSG "RESET MCU! "
JMF 0:24d3eb812fd4 88 #else
JMF 0:24d3eb812fd4 89 #define MCURESET
JMF 0:24d3eb812fd4 90 #define RSTMSG ""
JMF 0:24d3eb812fd4 91 #endif
JMF 0:24d3eb812fd4 92
JMF 0:24d3eb812fd4 93 #if DISPLAY_FE == 1 //display fatal error message
JMF 0:24d3eb812fd4 94 #define PFE {if(_debugUart)_debugUart->printf((char*)RSTMSG "\r\n>>WNC FAILED @ %s\r\n", FATAL_STR);}
JMF 0:24d3eb812fd4 95 #else
JMF 0:24d3eb812fd4 96 #define PFE
JMF 0:24d3eb812fd4 97 #endif
JMF 0:24d3eb812fd4 98
JMF 0:24d3eb812fd4 99 #if STOP_ON_FE == 1 //halt cpu on fatal error
JMF 0:24d3eb812fd4 100 #define FATAL_WNC_ERROR(v) {_fatal_err_loc=FATAL_STR;PFE;MCURESET;while(1);}
JMF 0:24d3eb812fd4 101 #else
JMF 0:24d3eb812fd4 102 #define FATAL_WNC_ERROR(v) {_fatal_err_loc=FATAL_STR;PFE;DORET(v);}
JMF 0:24d3eb812fd4 103 #endif
JMF 0:24d3eb812fd4 104
JMF 0:24d3eb812fd4 105 #define CHK_WNCFE(x,y) if( x ){FATAL_WNC_ERROR(y);}
JMF 0:24d3eb812fd4 106
JMF 0:24d3eb812fd4 107 //
JMF 0:24d3eb812fd4 108 // Define different levels of debug output
JMF 0:24d3eb812fd4 109 //
JMF 0:24d3eb812fd4 110 #define DBGMSG_DRV 0x04 //driver enter/exit info
JMF 0:24d3eb812fd4 111 #define DBGMSG_EQ 0x08 //driver event queue info
JMF 0:24d3eb812fd4 112 #define DBGMSG_SMS 0x10 //driver SMS info
JMF 0:24d3eb812fd4 113 #define DBGMSG_ARRY 0x20 //dump driver arrays
JMF 0:24d3eb812fd4 114
JMF 0:24d3eb812fd4 115 #define WNC14A2A_READ_TIMEOUTMS 4000 //duration to read no data to receive in MS
JMF 0:24d3eb812fd4 116 #define WNC14A2A_COMMUNICATION_TIMEOUT 100 //how long (ms) to wait for a WNC14A2A connect response
JMF 0:24d3eb812fd4 117 #define WNC_BUFF_SIZE 1500 //total number of bytes in a single WNC call
JMF 0:24d3eb812fd4 118 #define UART_BUFF_SIZE 4096 //size of our internal uart buffer.. define in *.json file
JMF 0:24d3eb812fd4 119
JMF 0:24d3eb812fd4 120 #define EQ_FREQ 250 //frequency in ms to check for Tx/Rx data
JMF 0:24d3eb812fd4 121 #define EQ_FREQ_SLOW 2000 //frequency in ms to check when in slow monitor mode
JMF 0:24d3eb812fd4 122
JMF 0:24d3eb812fd4 123 //
JMF 0:24d3eb812fd4 124 // The WNC device does not generate interrutps on received data, so this software polls
JMF 0:24d3eb812fd4 125 // for data availablility. To implement a non-blocking mode, simulate interrupts using
JMF 0:24d3eb812fd4 126 // mbed OS Event Queues. These Constants are used to manage the Rx/Tx states.
JMF 0:24d3eb812fd4 127 //
JMF 0:24d3eb812fd4 128 #define READ_INIT 10
JMF 0:24d3eb812fd4 129 #define READ_START 11
JMF 0:24d3eb812fd4 130 #define READ_ACTIVE 12
JMF 0:24d3eb812fd4 131 #define DATA_AVAILABLE 13
JMF 0:24d3eb812fd4 132 #define TX_IDLE 20
JMF 0:24d3eb812fd4 133 #define TX_STARTING 21
JMF 0:24d3eb812fd4 134 #define TX_ACTIVE 22
JMF 0:24d3eb812fd4 135 #define TX_COMPLETE 23
JMF 0:24d3eb812fd4 136
JMF 0:24d3eb812fd4 137 #if MBED_CONF_APP_WNC_DEBUG == true
JMF 0:24d3eb812fd4 138 #define debugOutput(...) WNC14A2AInterface::_dbOut(__VA_ARGS__)
JMF 0:24d3eb812fd4 139 #define debugDump_arry(...) WNC14A2AInterface::_dbDump_arry(__VA_ARGS__)
JMF 0:24d3eb812fd4 140 #else
JMF 0:24d3eb812fd4 141 #define debugOutput(...) {/* __VA_ARGS__ */}
JMF 0:24d3eb812fd4 142 #define debugDump_arry(...) {/* __VA_ARGS__ */}
JMF 0:24d3eb812fd4 143 #endif
JMF 0:24d3eb812fd4 144
JMF 0:24d3eb812fd4 145 /* Constructor
JMF 0:24d3eb812fd4 146 *
JMF 0:24d3eb812fd4 147 * @brief May be invoked with or without the debug pointer.
JMF 0:24d3eb812fd4 148 * @note After the constructor has completed, call check
JMF 0:24d3eb812fd4 149 * m_errors to determine if any errors occured. Possible values:
JMF 0:24d3eb812fd4 150 * NSAPI_ERROR_UNSUPPORTED
JMF 0:24d3eb812fd4 151 * NSAPI_ERROR_DEVICE_ERROR
JMF 0:24d3eb812fd4 152 */
JMF 0:24d3eb812fd4 153 WNC14A2AInterface::WNC14A2AInterface(WNCDebug *dbg) :
JMF 0:24d3eb812fd4 154 m_wncpoweredup(0),
JMF 0:24d3eb812fd4 155 m_debug(0),
JMF 0:24d3eb812fd4 156 m_pwnc(NULL),
JMF 0:24d3eb812fd4 157 m_errors(NSAPI_ERROR_OK),
JMF 0:24d3eb812fd4 158 m_smsmoning(0),
JMF 0:24d3eb812fd4 159 _active_socket(0),
JMF 0:24d3eb812fd4 160 mdmUart(MBED_CONF_WNC14A2A_LIBRARY_WNC_TXD,MBED_CONF_WNC14A2A_LIBRARY_WNC_RXD,115200),
JMF 0:24d3eb812fd4 161 wnc_io(&mdmUart)
JMF 0:24d3eb812fd4 162 {
JMF 0:24d3eb812fd4 163 _debugUart = dbg;
JMF 0:24d3eb812fd4 164 memset(_mac_address,0x00,sizeof(_mac_address));
JMF 0:24d3eb812fd4 165 memset(_socTxS,0x00,sizeof(_socTxS));
JMF 0:24d3eb812fd4 166 memset(_socRxS,0x00,sizeof(_socRxS));
JMF 0:24d3eb812fd4 167 for( unsigned int i=0; i<WNC14A2A_SOCKET_COUNT; i++ ) {
JMF 0:24d3eb812fd4 168 _sockets[i].socket = i;
JMF 0:24d3eb812fd4 169 _sockets[i].addr = NULL;
JMF 0:24d3eb812fd4 170 _sockets[i].opened=false;
JMF 0:24d3eb812fd4 171
JMF 0:24d3eb812fd4 172 _sockets[i].connected=false;
JMF 0:24d3eb812fd4 173 _sockets[i].proto=1;
JMF 0:24d3eb812fd4 174 _socRxS[i].m_rx_socket=i;
JMF 0:24d3eb812fd4 175 _socTxS[i].m_tx_socket=i;
JMF 0:24d3eb812fd4 176 }
JMF 0:24d3eb812fd4 177 }
JMF 0:24d3eb812fd4 178
JMF 0:24d3eb812fd4 179 //! Standard destructor
JMF 0:24d3eb812fd4 180 WNC14A2AInterface::~WNC14A2AInterface()
JMF 0:24d3eb812fd4 181 {
JMF 0:24d3eb812fd4 182 if( m_pwnc )
JMF 0:24d3eb812fd4 183 delete m_pwnc; //free the existing WncControllerK64F object
JMF 0:24d3eb812fd4 184 }
JMF 0:24d3eb812fd4 185
JMF 0:24d3eb812fd4 186 // - - - - - - -
JMF 0:24d3eb812fd4 187 // SMS Functions
JMF 0:24d3eb812fd4 188 // - - - - - - -
JMF 0:24d3eb812fd4 189
JMF 0:24d3eb812fd4 190 char* WNC14A2AInterface::getSMSnbr( void )
JMF 0:24d3eb812fd4 191 {
JMF 0:24d3eb812fd4 192 char * ret=NULL;
JMF 0:24d3eb812fd4 193 string iccid_str;
JMF 0:24d3eb812fd4 194 static string msisdn_str;
JMF 0:24d3eb812fd4 195
JMF 0:24d3eb812fd4 196 if( !m_pwnc ) {
JMF 0:24d3eb812fd4 197 m_errors=NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 198 return NULL;
JMF 0:24d3eb812fd4 199 }
JMF 0:24d3eb812fd4 200 CHK_WNCFE(( m_pwnc->getWncStatus() == FATAL_FLAG ), null);
JMF 0:24d3eb812fd4 201
JMF 0:24d3eb812fd4 202 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 203 if( !m_pwnc->getICCID(&iccid_str) ) {
JMF 0:24d3eb812fd4 204 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 205 return ret;
JMF 0:24d3eb812fd4 206 }
JMF 0:24d3eb812fd4 207
JMF 0:24d3eb812fd4 208 if( m_pwnc->convertICCIDtoMSISDN(iccid_str, &msisdn_str) )
JMF 0:24d3eb812fd4 209 ret = (char*)msisdn_str.c_str();
JMF 0:24d3eb812fd4 210 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 211 return ret;
JMF 0:24d3eb812fd4 212 }
JMF 0:24d3eb812fd4 213
JMF 0:24d3eb812fd4 214 void WNC14A2AInterface::sms_attach(void (*callback)(IOTSMS *))
JMF 0:24d3eb812fd4 215 {
JMF 0:24d3eb812fd4 216 debugOutput("ENTER/EXIT sms_attach()");
JMF 0:24d3eb812fd4 217 _sms_cb = callback;
JMF 0:24d3eb812fd4 218 }
JMF 0:24d3eb812fd4 219
JMF 0:24d3eb812fd4 220 void WNC14A2AInterface::sms_start(void)
JMF 0:24d3eb812fd4 221 {
JMF 0:24d3eb812fd4 222 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 223 m_pwnc->deleteSMSTextFromMem('*');
JMF 0:24d3eb812fd4 224 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 225 }
JMF 0:24d3eb812fd4 226
JMF 0:24d3eb812fd4 227 void WNC14A2AInterface::sms_listen(uint16_t pp)
JMF 0:24d3eb812fd4 228 {
JMF 0:24d3eb812fd4 229 debugOutput("ENTER sms_listen(%d)",pp);
JMF 0:24d3eb812fd4 230
JMF 0:24d3eb812fd4 231 if( m_smsmoning )
JMF 0:24d3eb812fd4 232 m_smsmoning = false;
JMF 0:24d3eb812fd4 233 if( pp < 1)
JMF 0:24d3eb812fd4 234 pp = 30;
JMF 0:24d3eb812fd4 235
JMF 0:24d3eb812fd4 236 debugOutput("setup sms_listen event queue");
JMF 0:24d3eb812fd4 237 _smsThread.start(callback(&sms_queue,&EventQueue::dispatch_forever));
JMF 0:24d3eb812fd4 238
JMF 0:24d3eb812fd4 239 sms_start();
JMF 0:24d3eb812fd4 240 sms_queue.call_every(pp*1000, mbed::Callback<void()>((WNC14A2AInterface*)this,&WNC14A2AInterface::handle_sms_event));
JMF 0:24d3eb812fd4 241
JMF 0:24d3eb812fd4 242 m_smsmoning = true;
JMF 0:24d3eb812fd4 243 debugOutput("EXIT sms_listen()");
JMF 0:24d3eb812fd4 244 }
JMF 0:24d3eb812fd4 245
JMF 0:24d3eb812fd4 246 void WNC14A2AInterface::handle_sms_event()
JMF 0:24d3eb812fd4 247 {
JMF 0:24d3eb812fd4 248 int msgs_available;
JMF 0:24d3eb812fd4 249 debugOutput("ENTER handle_sms_event()");
JMF 0:24d3eb812fd4 250
JMF 0:24d3eb812fd4 251 if ( _sms_cb && m_smsmoning ) {
JMF 0:24d3eb812fd4 252 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 253 msgs_available = m_pwnc->readUnreadSMSText(&m_smsmsgs, true);
JMF 0:24d3eb812fd4 254 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 255 if( msgs_available ) {
JMF 0:24d3eb812fd4 256 debugOutput("Have %d unread texts present",m_smsmsgs.msgCount);
JMF 0:24d3eb812fd4 257 for( int i=0; i< m_smsmsgs.msgCount; i++ ) {
JMF 0:24d3eb812fd4 258 m_MsgText.number = m_smsmsgs.e[i].number;
JMF 0:24d3eb812fd4 259 m_MsgText.date = m_smsmsgs.e[i].date;
JMF 0:24d3eb812fd4 260 m_MsgText.time = m_smsmsgs.e[i].time;
JMF 0:24d3eb812fd4 261 m_MsgText.msg = m_smsmsgs.e[i].msg;
JMF 0:24d3eb812fd4 262 _sms_cb(&m_MsgText);
JMF 0:24d3eb812fd4 263 }
JMF 0:24d3eb812fd4 264 }
JMF 0:24d3eb812fd4 265 }
JMF 0:24d3eb812fd4 266 debugOutput("EXIT handle_sms_event");
JMF 0:24d3eb812fd4 267 }
JMF 0:24d3eb812fd4 268
JMF 0:24d3eb812fd4 269 int WNC14A2AInterface::getSMS(IOTSMS **pmsg)
JMF 0:24d3eb812fd4 270 {
JMF 0:24d3eb812fd4 271 int msgs_available=0;
JMF 0:24d3eb812fd4 272
JMF 0:24d3eb812fd4 273 debugOutput("ENTER getSMS()");
JMF 0:24d3eb812fd4 274 if( !m_pwnc )
JMF 0:24d3eb812fd4 275 m_errors=NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 276 else{
JMF 0:24d3eb812fd4 277 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 278 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 279 msgs_available = m_pwnc->readUnreadSMSText(&m_smsmsgs, true);
JMF 0:24d3eb812fd4 280 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 281 }
JMF 0:24d3eb812fd4 282
JMF 0:24d3eb812fd4 283 if( msgs_available ) {
JMF 0:24d3eb812fd4 284 debugOutput("Have %d unread texts present",m_smsmsgs.msgCount);
JMF 0:24d3eb812fd4 285 for( int i=0; i< m_smsmsgs.msgCount; i++ ) {
JMF 0:24d3eb812fd4 286 m_MsgText_array[i].number = m_smsmsgs.e[i].number;
JMF 0:24d3eb812fd4 287 m_MsgText_array[i].date = m_smsmsgs.e[i].date;
JMF 0:24d3eb812fd4 288 m_MsgText_array[i].time = m_smsmsgs.e[i].time;
JMF 0:24d3eb812fd4 289 m_MsgText_array[i].msg = m_smsmsgs.e[i].msg;
JMF 0:24d3eb812fd4 290 pmsg[i] = (IOTSMS*)&m_MsgText_array[i];
JMF 0:24d3eb812fd4 291 }
JMF 0:24d3eb812fd4 292 msgs_available = m_smsmsgs.msgCount;
JMF 0:24d3eb812fd4 293 }
JMF 0:24d3eb812fd4 294 debugOutput("EXIT getSMS");
JMF 0:24d3eb812fd4 295 return msgs_available;
JMF 0:24d3eb812fd4 296 }
JMF 0:24d3eb812fd4 297
JMF 0:24d3eb812fd4 298
JMF 0:24d3eb812fd4 299 int WNC14A2AInterface::sendIOTSms(const string& number, const string& message)
JMF 0:24d3eb812fd4 300 {
JMF 0:24d3eb812fd4 301 debugOutput("ENTER sendIOTSms(%s,%s)",number.c_str(), message.c_str());
JMF 0:24d3eb812fd4 302
JMF 0:24d3eb812fd4 303 if( !m_pwnc )
JMF 0:24d3eb812fd4 304 return (m_errors=NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 305 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 306
JMF 0:24d3eb812fd4 307 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 308 int i = m_pwnc->sendSMSText((char*)number.c_str(), message.c_str());
JMF 0:24d3eb812fd4 309 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 310
JMF 0:24d3eb812fd4 311 debugOutput("EXIT sendIOTSms(%s,%s)",number.c_str(), message.c_str());
JMF 0:24d3eb812fd4 312 return i;
JMF 0:24d3eb812fd4 313 }
JMF 0:24d3eb812fd4 314
JMF 0:24d3eb812fd4 315
JMF 0:24d3eb812fd4 316 // - - - - - - - - - - -
JMF 0:24d3eb812fd4 317 // WNC Control Functions
JMF 0:24d3eb812fd4 318 // - - - - - - - - - - -
JMF 0:24d3eb812fd4 319
JMF 0:24d3eb812fd4 320 nsapi_error_t WNC14A2AInterface::connect() //can be called with no arguments or with arguments
JMF 0:24d3eb812fd4 321 {
JMF 0:24d3eb812fd4 322 debugOutput("ENTER connect(void)");
JMF 0:24d3eb812fd4 323 return connect(NULL,NULL,NULL);
JMF 0:24d3eb812fd4 324 }
JMF 0:24d3eb812fd4 325
JMF 0:24d3eb812fd4 326 nsapi_error_t WNC14A2AInterface::connect(const char *apn, const char *username, const char *password)
JMF 0:24d3eb812fd4 327 {
JMF 0:24d3eb812fd4 328 //
JMF 0:24d3eb812fd4 329 // GPIO Pins used to initialize the WNC parts on the Avnet WNC Shield
JMF 0:24d3eb812fd4 330 //
JMF 0:24d3eb812fd4 331 // on powerup, 0 = boot mode, 1 = normal boot
JMF 0:24d3eb812fd4 332 // 0=let modem sleep, 1=keep modem awake -- Note: pulled high on shield
JMF 0:24d3eb812fd4 333 // active high
JMF 0:24d3eb812fd4 334 // 0 = disabled (all signals high impedence, 1 = translation active
JMF 0:24d3eb812fd4 335 // WNC doesn't utilize RTS/CTS but the pin is connected
JMF 0:24d3eb812fd4 336
JMF 0:24d3eb812fd4 337 static DigitalOut mdm_uart2_rx_boot_mode_sel(MBED_CONF_WNC14A2A_LIBRARY_WNC_RX_BOOT_SEL);
JMF 0:24d3eb812fd4 338 static DigitalOut mdm_power_on(MBED_CONF_WNC14A2A_LIBRARY_WNC_POWER_ON);
JMF 0:24d3eb812fd4 339 static DigitalOut mdm_wakeup_in(MBED_CONF_WNC14A2A_LIBRARY_WNC_WAKEUP);
JMF 0:24d3eb812fd4 340 static DigitalOut mdm_reset(MBED_CONF_WNC14A2A_LIBRARY_WNC_RESET);
JMF 0:24d3eb812fd4 341 static DigitalOut shield_3v3_1v8_sig_trans_ena(MBED_CONF_WNC14A2A_LIBRARY_WNC_LVLTRANSLATOR);
JMF 0:24d3eb812fd4 342 static DigitalOut mdm_uart1_cts(MBED_CONF_WNC14A2A_LIBRARY_WNC_CTS);
JMF 0:24d3eb812fd4 343
JMF 0:24d3eb812fd4 344 //! associations for the controller class to use. Order of pins is critical.
JMF 0:24d3eb812fd4 345 static WncControllerK64F_fk::WncGpioPinListK64F wncPinList = {
JMF 0:24d3eb812fd4 346 &mdm_uart2_rx_boot_mode_sel,
JMF 0:24d3eb812fd4 347 &mdm_power_on,
JMF 0:24d3eb812fd4 348 &mdm_wakeup_in,
JMF 0:24d3eb812fd4 349 &mdm_reset,
JMF 0:24d3eb812fd4 350 &shield_3v3_1v8_sig_trans_ena,
JMF 0:24d3eb812fd4 351 &mdm_uart1_cts
JMF 0:24d3eb812fd4 352 };
JMF 0:24d3eb812fd4 353
JMF 0:24d3eb812fd4 354 debugOutput("ENTER connect(apn,user,pass)");
JMF 0:24d3eb812fd4 355
JMF 0:24d3eb812fd4 356 if( m_pwnc == NULL ) {
JMF 0:24d3eb812fd4 357 m_pwnc = new WncControllerK64F_fk::WncControllerK64F(&wncPinList, &wnc_io, _debugUart);
JMF 0:24d3eb812fd4 358 if( !m_pwnc ) {
JMF 0:24d3eb812fd4 359 debugOutput("FAILED to open WncControllerK64!");
JMF 0:24d3eb812fd4 360 m_errors = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 361 return NSAPI_ERROR_NO_MEMORY;
JMF 0:24d3eb812fd4 362 }
JMF 0:24d3eb812fd4 363 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 364 #if MBED_CONF_APP_WNC_DEBUG == true
JMF 0:24d3eb812fd4 365 m_pwnc->enableDebug( (MBED_CONF_APP_WNC_DEBUG_SETTING&1), (MBED_CONF_APP_WNC_DEBUG_SETTING&2) );
JMF 0:24d3eb812fd4 366 #endif
JMF 0:24d3eb812fd4 367 }
JMF 0:24d3eb812fd4 368
JMF 0:24d3eb812fd4 369 _eqThread.start(callback(&wnc_queue,&EventQueue::dispatch_forever));
JMF 0:24d3eb812fd4 370
JMF 0:24d3eb812fd4 371 if (!apn)
JMF 0:24d3eb812fd4 372 apn = "m2m.com.attz";
JMF 0:24d3eb812fd4 373
JMF 0:24d3eb812fd4 374 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 375 if (!m_wncpoweredup) {
JMF 0:24d3eb812fd4 376 debugOutput("call powerWncOn(%s,40)",apn);
JMF 0:24d3eb812fd4 377 m_wncpoweredup=m_pwnc->powerWncOn(apn,40);
JMF 0:24d3eb812fd4 378 m_errors = m_wncpoweredup? 1:0;
JMF 0:24d3eb812fd4 379 }
JMF 0:24d3eb812fd4 380 else { //powerWncOn already called, set a new APN
JMF 0:24d3eb812fd4 381 debugOutput("set APN=%s",apn);
JMF 0:24d3eb812fd4 382 m_errors = m_pwnc->setApnName(apn)? 1:0;
JMF 0:24d3eb812fd4 383 }
JMF 0:24d3eb812fd4 384
JMF 0:24d3eb812fd4 385 m_errors |= m_pwnc->getWncNetworkingStats(&myNetStats)? 2:0;
JMF 0:24d3eb812fd4 386 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 387
JMF 0:24d3eb812fd4 388 debugOutput("EXIT connect (%02X)",m_errors);
JMF 0:24d3eb812fd4 389 return (!m_errors)? NSAPI_ERROR_NO_CONNECTION : NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 390 }
JMF 0:24d3eb812fd4 391
JMF 0:24d3eb812fd4 392 const char* WNC14A2AInterface::getWNCRev(void)
JMF 0:24d3eb812fd4 393 {
JMF 0:24d3eb812fd4 394 if( m_pwnc ) {
JMF 0:24d3eb812fd4 395 const char * str = m_pwnc->getFirmRev();
JMF 0:24d3eb812fd4 396 return &str[12];
JMF 0:24d3eb812fd4 397 }
JMF 0:24d3eb812fd4 398 else
JMF 0:24d3eb812fd4 399 return NULL;
JMF 0:24d3eb812fd4 400 }
JMF 0:24d3eb812fd4 401
JMF 0:24d3eb812fd4 402
JMF 0:24d3eb812fd4 403 const char *WNC14A2AInterface::get_ip_address()
JMF 0:24d3eb812fd4 404 {
JMF 0:24d3eb812fd4 405 const char *ptr=NULL;
JMF 0:24d3eb812fd4 406
JMF 0:24d3eb812fd4 407 if( !m_pwnc ) {
JMF 0:24d3eb812fd4 408 m_errors=NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 409 return ptr;
JMF 0:24d3eb812fd4 410 }
JMF 0:24d3eb812fd4 411 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), null);
JMF 0:24d3eb812fd4 412
JMF 0:24d3eb812fd4 413 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 414 if ( m_pwnc->getWncNetworkingStats(&myNetStats) ) {
JMF 0:24d3eb812fd4 415 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 416 ptr = &myNetStats.ip[0];
JMF 0:24d3eb812fd4 417 }
JMF 0:24d3eb812fd4 418 else{
JMF 0:24d3eb812fd4 419 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 420 m_errors=NSAPI_ERROR_NO_CONNECTION;
JMF 0:24d3eb812fd4 421 }
JMF 0:24d3eb812fd4 422 return ptr;
JMF 0:24d3eb812fd4 423 }
JMF 0:24d3eb812fd4 424
JMF 0:24d3eb812fd4 425 const char *WNC14A2AInterface::get_mac_address()
JMF 0:24d3eb812fd4 426 {
JMF 0:24d3eb812fd4 427 string mac, str;
JMF 0:24d3eb812fd4 428 debugOutput("ENTER get_mac_address()");
JMF 0:24d3eb812fd4 429
JMF 0:24d3eb812fd4 430 if( m_pwnc ) {
JMF 0:24d3eb812fd4 431 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), null);
JMF 0:24d3eb812fd4 432 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 433 if( m_pwnc->getICCID(&str) ) {
JMF 0:24d3eb812fd4 434 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 435 mac = str.substr(3,20);
JMF 0:24d3eb812fd4 436 mac[2]=mac[5]=mac[8]=mac[11]=mac[14]=':';
JMF 0:24d3eb812fd4 437 strncpy(_mac_address, mac.c_str(), mac.length());
JMF 0:24d3eb812fd4 438 debugOutput("EXIT get_mac_address() - %s",_mac_address);
JMF 0:24d3eb812fd4 439 return _mac_address;
JMF 0:24d3eb812fd4 440 }
JMF 0:24d3eb812fd4 441 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 442 }
JMF 0:24d3eb812fd4 443 debugOutput("EXIT get_mac_address() - NULL");
JMF 0:24d3eb812fd4 444 return NULL;
JMF 0:24d3eb812fd4 445 }
JMF 0:24d3eb812fd4 446
JMF 0:24d3eb812fd4 447 NetworkStack *WNC14A2AInterface::get_stack() {
JMF 0:24d3eb812fd4 448 debugOutput("ENTER/EXIT get_stack()");
JMF 0:24d3eb812fd4 449 return this;
JMF 0:24d3eb812fd4 450 }
JMF 0:24d3eb812fd4 451
JMF 0:24d3eb812fd4 452 nsapi_error_t WNC14A2AInterface::disconnect()
JMF 0:24d3eb812fd4 453 {
JMF 0:24d3eb812fd4 454 debugOutput("ENTER/EXIT disconnect()");
JMF 0:24d3eb812fd4 455 return NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 456 }
JMF 0:24d3eb812fd4 457
JMF 0:24d3eb812fd4 458 nsapi_error_t WNC14A2AInterface::set_credentials(const char *apn, const char *username, const char *password)
JMF 0:24d3eb812fd4 459 {
JMF 0:24d3eb812fd4 460
JMF 0:24d3eb812fd4 461 m_errors=NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 462 debugOutput("ENTER set_credentials()");
JMF 0:24d3eb812fd4 463
JMF 0:24d3eb812fd4 464 if( !m_pwnc )
JMF 0:24d3eb812fd4 465 return (m_errors=NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 466 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 467
JMF 0:24d3eb812fd4 468 if( !apn )
JMF 0:24d3eb812fd4 469 return (m_errors=NSAPI_ERROR_PARAMETER);
JMF 0:24d3eb812fd4 470
JMF 0:24d3eb812fd4 471 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 472 if( !m_pwnc->setApnName(apn) )
JMF 0:24d3eb812fd4 473 m_errors=NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 474 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 475 debugOutput("EXIT set_credentials()");
JMF 0:24d3eb812fd4 476 return m_errors;
JMF 0:24d3eb812fd4 477 }
JMF 0:24d3eb812fd4 478
JMF 0:24d3eb812fd4 479 bool WNC14A2AInterface::registered()
JMF 0:24d3eb812fd4 480 {
JMF 0:24d3eb812fd4 481 debugOutput("ENTER registered()");
JMF 0:24d3eb812fd4 482 m_errors=NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 483
JMF 0:24d3eb812fd4 484 if( !m_pwnc ) {
JMF 0:24d3eb812fd4 485 return (m_errors=NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 486 }
JMF 0:24d3eb812fd4 487 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 488
JMF 0:24d3eb812fd4 489 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 490 if ( m_pwnc->getWncStatus() != WNC_GOOD )
JMF 0:24d3eb812fd4 491 m_errors=NSAPI_ERROR_NO_CONNECTION;
JMF 0:24d3eb812fd4 492 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 493
JMF 0:24d3eb812fd4 494 debugOutput("EXIT registered()");
JMF 0:24d3eb812fd4 495 return (m_errors==NSAPI_ERROR_OK);
JMF 0:24d3eb812fd4 496 }
JMF 0:24d3eb812fd4 497
JMF 0:24d3eb812fd4 498
JMF 0:24d3eb812fd4 499 void WNC14A2AInterface::doDebug( int v )
JMF 0:24d3eb812fd4 500 {
JMF 0:24d3eb812fd4 501 #if MBED_CONF_APP_WNC_DEBUG == true
JMF 0:24d3eb812fd4 502 m_debug= v;
JMF 0:24d3eb812fd4 503 debugOutput("SET debug flag to 0x%02X",v);
JMF 0:24d3eb812fd4 504 #endif
JMF 0:24d3eb812fd4 505 }
JMF 0:24d3eb812fd4 506
JMF 0:24d3eb812fd4 507 /** function to dump a user provided array.
JMF 0:24d3eb812fd4 508 *
JMF 0:24d3eb812fd4 509 * @author James Flynn
JMF 0:24d3eb812fd4 510 * @param data pointer to the data array to dump
JMF 0:24d3eb812fd4 511 * @param size number of bytes to dump
JMF 0:24d3eb812fd4 512 * @return void
JMF 0:24d3eb812fd4 513 * @date 1-Feb-2018
JMF 0:24d3eb812fd4 514 */
JMF 0:24d3eb812fd4 515 void WNC14A2AInterface::_dbDump_arry( const uint8_t* data, unsigned int size )
JMF 0:24d3eb812fd4 516 {
JMF 0:24d3eb812fd4 517 #if MBED_CONF_APP_WNC_DEBUG == true
JMF 0:24d3eb812fd4 518 char buffer[256];
JMF 0:24d3eb812fd4 519 unsigned int i, k;
JMF 0:24d3eb812fd4 520
JMF 0:24d3eb812fd4 521 if( _debugUart != NULL && (m_debug & DBGMSG_ARRY) ) {
JMF 0:24d3eb812fd4 522 for (i=0; i<size; i+=16) {
JMF 0:24d3eb812fd4 523 sprintf(buffer,"[WNC Driver]:0x%04X: ",i);
JMF 0:24d3eb812fd4 524 _debugUart->puts(buffer);
JMF 0:24d3eb812fd4 525 for (k=0; k<16; k++) {
JMF 0:24d3eb812fd4 526 sprintf(buffer, "%02X ", data[i+k]);
JMF 0:24d3eb812fd4 527 _debugUart->puts(buffer);
JMF 0:24d3eb812fd4 528 }
JMF 0:24d3eb812fd4 529 _debugUart->puts(" -- ");
JMF 0:24d3eb812fd4 530 for (k=0; k<16; k++) {
JMF 0:24d3eb812fd4 531 sprintf(buffer, "%2c", isprint(data[i+k])? data[i+k]:'.');
JMF 0:24d3eb812fd4 532 _debugUart->puts(buffer);
JMF 0:24d3eb812fd4 533 }
JMF 0:24d3eb812fd4 534 _debugUart->puts("\n\r");
JMF 0:24d3eb812fd4 535 }
JMF 0:24d3eb812fd4 536 }
JMF 0:24d3eb812fd4 537 #endif
JMF 0:24d3eb812fd4 538 }
JMF 0:24d3eb812fd4 539
JMF 0:24d3eb812fd4 540 void WNC14A2AInterface::_dbOut(const char *format, ...)
JMF 0:24d3eb812fd4 541 {
JMF 0:24d3eb812fd4 542 #if MBED_CONF_APP_WNC_DEBUG == true
JMF 0:24d3eb812fd4 543 char buffer[256];
JMF 0:24d3eb812fd4 544
JMF 0:24d3eb812fd4 545 sprintf(buffer,"[WNC Driver]: ");
JMF 0:24d3eb812fd4 546 if( _debugUart != NULL && (m_debug & (DBGMSG_DRV|DBGMSG_EQ|DBGMSG_SMS)) ) {
JMF 0:24d3eb812fd4 547 va_list args;
JMF 0:24d3eb812fd4 548 va_start (args, format);
JMF 0:24d3eb812fd4 549 _debugUart->puts(buffer);
JMF 0:24d3eb812fd4 550 if( m_debug & DBGMSG_DRV )
JMF 0:24d3eb812fd4 551 vsnprintf(buffer, sizeof(buffer), format, args);
JMF 0:24d3eb812fd4 552 if( m_debug & DBGMSG_EQ )
JMF 0:24d3eb812fd4 553 vsnprintf(buffer, sizeof(buffer), format, args);
JMF 0:24d3eb812fd4 554 if( m_debug & DBGMSG_SMS )
JMF 0:24d3eb812fd4 555 vsnprintf(buffer, sizeof(buffer), format, args);
JMF 0:24d3eb812fd4 556 _debugUart->puts(buffer);
JMF 0:24d3eb812fd4 557 _debugUart->putc('\n');
JMF 0:24d3eb812fd4 558 va_end (args);
JMF 0:24d3eb812fd4 559 }
JMF 0:24d3eb812fd4 560 #endif
JMF 0:24d3eb812fd4 561 }
JMF 0:24d3eb812fd4 562
JMF 0:24d3eb812fd4 563 // - - - - - - - - - - - - - - -
JMF 0:24d3eb812fd4 564 // WNC Socket Based operatioins
JMF 0:24d3eb812fd4 565 // - - - - - - - - - - - - - - -
JMF 0:24d3eb812fd4 566
JMF 0:24d3eb812fd4 567 nsapi_error_t WNC14A2AInterface::gethostbyname(const char* name, SocketAddress *address, nsapi_version_t version)
JMF 0:24d3eb812fd4 568 {
JMF 0:24d3eb812fd4 569 nsapi_error_t ret = NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 570 char ipAddrStr[25];
JMF 0:24d3eb812fd4 571
JMF 0:24d3eb812fd4 572 debugOutput("ENTER gethostbyname(); IP=%s; PORT=%d; URL=%s;", address->get_ip_address(), address->get_port(), name);
JMF 0:24d3eb812fd4 573
JMF 0:24d3eb812fd4 574 if( !m_pwnc )
JMF 0:24d3eb812fd4 575 return (m_errors=NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 576 CHK_WNCFE((m_pwnc->getWncStatus()==FATAL_FLAG), fail);
JMF 0:24d3eb812fd4 577
JMF 0:24d3eb812fd4 578 memset(ipAddrStr,0x00,sizeof(ipAddrStr));
JMF 0:24d3eb812fd4 579
JMF 0:24d3eb812fd4 580 //Execute DNS query.
JMF 0:24d3eb812fd4 581 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 582 if( !m_pwnc->resolveUrl(_active_socket, name) )
JMF 0:24d3eb812fd4 583 ret = m_errors = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 584
JMF 0:24d3eb812fd4 585 //Get IP address that the URL was resolved to
JMF 0:24d3eb812fd4 586 if( !m_pwnc->getIpAddr(_active_socket, ipAddrStr) )
JMF 0:24d3eb812fd4 587 ret = m_errors = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 588 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 589
JMF 0:24d3eb812fd4 590 address->set_ip_address(ipAddrStr);
JMF 0:24d3eb812fd4 591
JMF 0:24d3eb812fd4 592 debugOutput("EXIT gethostbyname(); IP=%s; PORT=%d; URL=%s;", address->get_ip_address(), address->get_port(), name);
JMF 0:24d3eb812fd4 593 return (m_errors = ret);
JMF 0:24d3eb812fd4 594 }
JMF 0:24d3eb812fd4 595
JMF 0:24d3eb812fd4 596 int WNC14A2AInterface::socket_open(void **handle, nsapi_protocol_t proto)
JMF 0:24d3eb812fd4 597 {
JMF 0:24d3eb812fd4 598 unsigned int i;
JMF 0:24d3eb812fd4 599
JMF 0:24d3eb812fd4 600 debugOutput("ENTER socket_open()");
JMF 0:24d3eb812fd4 601
JMF 0:24d3eb812fd4 602 //find the next available socket...
JMF 0:24d3eb812fd4 603 for( i=0; i<WNC14A2A_SOCKET_COUNT; i++ )
JMF 0:24d3eb812fd4 604 if( !_sockets[i].opened )
JMF 0:24d3eb812fd4 605 break;
JMF 0:24d3eb812fd4 606
JMF 0:24d3eb812fd4 607 if( i == WNC14A2A_SOCKET_COUNT ) {
JMF 0:24d3eb812fd4 608 m_errors=NSAPI_ERROR_NO_SOCKET;
JMF 0:24d3eb812fd4 609 return -1;
JMF 0:24d3eb812fd4 610 }
JMF 0:24d3eb812fd4 611
JMF 0:24d3eb812fd4 612 _sockets[i].socket = i; //save index later
JMF 0:24d3eb812fd4 613 _sockets[i].opened = true;
JMF 0:24d3eb812fd4 614 _sockets[i].connected=false;
JMF 0:24d3eb812fd4 615 _sockets[i].proto = (proto==NSAPI_UDP)?0:1;
JMF 0:24d3eb812fd4 616 _sockets[i]._callback = NULL;
JMF 0:24d3eb812fd4 617 _sockets[i]._cb_data = NULL;
JMF 0:24d3eb812fd4 618
JMF 0:24d3eb812fd4 619 _socRxS[i].m_rx_wnc_state = READ_START;
JMF 0:24d3eb812fd4 620 _socRxS[i].m_rx_disTO = false;
JMF 0:24d3eb812fd4 621 _socTxS[i].m_tx_wnc_state = TX_IDLE;
JMF 0:24d3eb812fd4 622
JMF 0:24d3eb812fd4 623 *handle = &_sockets[i];
JMF 0:24d3eb812fd4 624
JMF 0:24d3eb812fd4 625 debugOutput("EXIT socket_open; Socket=%d, OPEN=%s, protocol =%s",
JMF 0:24d3eb812fd4 626 i, _sockets[i].opened?"YES":"NO", (!_sockets[i].proto)?"UDP":"TCP");
JMF 0:24d3eb812fd4 627
JMF 0:24d3eb812fd4 628 return (m_errors = NSAPI_ERROR_OK);
JMF 0:24d3eb812fd4 629 }
JMF 0:24d3eb812fd4 630
JMF 0:24d3eb812fd4 631 int WNC14A2AInterface::socket_connect(void *handle, const SocketAddress &address)
JMF 0:24d3eb812fd4 632 {
JMF 0:24d3eb812fd4 633 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 634 int err = 0;
JMF 0:24d3eb812fd4 635
JMF 0:24d3eb812fd4 636 debugOutput("ENTER socket_connect(); Socket=%d; IP=%s; PORT=%d;", wnc->socket, address.get_ip_address(), address.get_port());
JMF 0:24d3eb812fd4 637
JMF 0:24d3eb812fd4 638 if (!wnc->opened )
JMF 0:24d3eb812fd4 639 return (m_errors = NSAPI_ERROR_NO_SOCKET);
JMF 0:24d3eb812fd4 640
JMF 0:24d3eb812fd4 641 wnc->addr = address;
JMF 0:24d3eb812fd4 642
JMF 0:24d3eb812fd4 643 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 644 if( wnc->url.empty() )
JMF 0:24d3eb812fd4 645 err = !m_pwnc->openSocketIpAddr(wnc->socket, address.get_ip_address(), address.get_port(), wnc->proto, WNC14A2A_COMMUNICATION_TIMEOUT);
JMF 0:24d3eb812fd4 646 else
JMF 0:24d3eb812fd4 647 err = !m_pwnc->openSocketUrl(wnc->socket, wnc->url.c_str(), wnc->addr.get_port(), wnc->proto);
JMF 0:24d3eb812fd4 648 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 649
JMF 0:24d3eb812fd4 650 if( !err ) {
JMF 0:24d3eb812fd4 651 wnc->connected = true;
JMF 0:24d3eb812fd4 652 _socRxS[wnc->socket].m_rx_wnc_state = READ_START;
JMF 0:24d3eb812fd4 653 _socTxS[wnc->socket].m_tx_wnc_state = TX_IDLE;
JMF 0:24d3eb812fd4 654
JMF 0:24d3eb812fd4 655 if( wnc->_callback != NULL )
JMF 0:24d3eb812fd4 656 wnc->_callback( wnc->_cb_data );
JMF 0:24d3eb812fd4 657 }
JMF 0:24d3eb812fd4 658
JMF 0:24d3eb812fd4 659 return err;
JMF 0:24d3eb812fd4 660 }
JMF 0:24d3eb812fd4 661
JMF 0:24d3eb812fd4 662 int WNC14A2AInterface::socket_close(void *handle)
JMF 0:24d3eb812fd4 663 {
JMF 0:24d3eb812fd4 664 WNCSOCKET *wnc = (WNCSOCKET*)handle;
JMF 0:24d3eb812fd4 665 RXEVENT *rxsock;
JMF 0:24d3eb812fd4 666 TXEVENT *txsock;
JMF 0:24d3eb812fd4 667 bool err = false;
JMF 0:24d3eb812fd4 668
JMF 0:24d3eb812fd4 669 debugOutput("ENTER socket_close()");
JMF 0:24d3eb812fd4 670
JMF 0:24d3eb812fd4 671 rxsock = &_socRxS[wnc->socket];
JMF 0:24d3eb812fd4 672 txsock = &_socTxS[wnc->socket];
JMF 0:24d3eb812fd4 673
JMF 0:24d3eb812fd4 674 txsock->m_tx_wnc_state = TX_IDLE; //reset TX state
JMF 0:24d3eb812fd4 675 if( rxsock->m_rx_wnc_state != READ_START ) { //reset RX state
JMF 0:24d3eb812fd4 676 rxsock->m_rx_disTO=false;
JMF 0:24d3eb812fd4 677 while( rxsock->m_rx_wnc_state != DATA_AVAILABLE )
JMF 0:24d3eb812fd4 678 wait(1); //someone called close while a read was happening
JMF 0:24d3eb812fd4 679 }
JMF 0:24d3eb812fd4 680
JMF 0:24d3eb812fd4 681 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 682 if( !m_pwnc->closeSocket(wnc->socket) ) {
JMF 0:24d3eb812fd4 683 m_errors = NSAPI_ERROR_DEVICE_ERROR;
JMF 0:24d3eb812fd4 684 err = true;
JMF 0:24d3eb812fd4 685 }
JMF 0:24d3eb812fd4 686 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 687
JMF 0:24d3eb812fd4 688 if( !err ) {
JMF 0:24d3eb812fd4 689 wnc->opened = false; //no longer in use
JMF 0:24d3eb812fd4 690 wnc->addr = NULL; //not open
JMF 0:24d3eb812fd4 691 wnc->connected= false;
JMF 0:24d3eb812fd4 692 wnc->proto = 1; //assume TCP for now
JMF 0:24d3eb812fd4 693 m_errors = NSAPI_ERROR_OK;
JMF 0:24d3eb812fd4 694 wnc->_cb_data = NULL;
JMF 0:24d3eb812fd4 695 wnc->_callback= NULL;
JMF 0:24d3eb812fd4 696 }
JMF 0:24d3eb812fd4 697
JMF 0:24d3eb812fd4 698 debugOutput("EXIT socket_close()");
JMF 0:24d3eb812fd4 699 return err;
JMF 0:24d3eb812fd4 700 }
JMF 0:24d3eb812fd4 701
JMF 0:24d3eb812fd4 702
JMF 0:24d3eb812fd4 703 void WNC14A2AInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
JMF 0:24d3eb812fd4 704 {
JMF 0:24d3eb812fd4 705 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 706
JMF 0:24d3eb812fd4 707 debugOutput("ENTER/EXIT socket_attach()");
JMF 0:24d3eb812fd4 708 wnc->_callback = callback;
JMF 0:24d3eb812fd4 709 wnc->_cb_data = data;
JMF 0:24d3eb812fd4 710 }
JMF 0:24d3eb812fd4 711
JMF 0:24d3eb812fd4 712 int WNC14A2AInterface::socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size)
JMF 0:24d3eb812fd4 713 {
JMF 0:24d3eb812fd4 714 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 715
JMF 0:24d3eb812fd4 716 debugOutput("ENTER socket_sendto()");
JMF 0:24d3eb812fd4 717
JMF 0:24d3eb812fd4 718 if (!wnc->connected) {
JMF 0:24d3eb812fd4 719 int err = socket_connect(wnc, address);
JMF 0:24d3eb812fd4 720 if (err < 0)
JMF 0:24d3eb812fd4 721 return err;
JMF 0:24d3eb812fd4 722 }
JMF 0:24d3eb812fd4 723 wnc->addr = address;
JMF 0:24d3eb812fd4 724
JMF 0:24d3eb812fd4 725 debugOutput("EXIT socket_sendto()");
JMF 0:24d3eb812fd4 726 return socket_send(wnc, data, size);
JMF 0:24d3eb812fd4 727 }
JMF 0:24d3eb812fd4 728
JMF 0:24d3eb812fd4 729 int WNC14A2AInterface::socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size)
JMF 0:24d3eb812fd4 730 {
JMF 0:24d3eb812fd4 731 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 732 debugOutput("ENTER socket_recvfrom()");
JMF 0:24d3eb812fd4 733
JMF 0:24d3eb812fd4 734 if (!wnc->connected) {
JMF 0:24d3eb812fd4 735 debugOutput("need to open a WNC socket first");
JMF 0:24d3eb812fd4 736 int err = socket_connect(wnc, *address);
JMF 0:24d3eb812fd4 737 if (err < 0)
JMF 0:24d3eb812fd4 738 return err;
JMF 0:24d3eb812fd4 739 }
JMF 0:24d3eb812fd4 740
JMF 0:24d3eb812fd4 741 int ret = socket_recv(wnc, (char *)buffer, size);
JMF 0:24d3eb812fd4 742 if (ret >= 0 && address)
JMF 0:24d3eb812fd4 743 *address = wnc->addr;
JMF 0:24d3eb812fd4 744 debugOutput("EXIT socket_recvfrom()");
JMF 0:24d3eb812fd4 745 return ret;
JMF 0:24d3eb812fd4 746 }
JMF 0:24d3eb812fd4 747
JMF 0:24d3eb812fd4 748
JMF 0:24d3eb812fd4 749 int inline WNC14A2AInterface::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address)
JMF 0:24d3eb812fd4 750 {
JMF 0:24d3eb812fd4 751 debugOutput("ENTER/EXIT socket_accept() -- not supported");
JMF 0:24d3eb812fd4 752 m_errors = NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 753 return -1;
JMF 0:24d3eb812fd4 754 }
JMF 0:24d3eb812fd4 755
JMF 0:24d3eb812fd4 756 int inline WNC14A2AInterface::socket_bind(void *handle, const SocketAddress &address)
JMF 0:24d3eb812fd4 757 {
JMF 0:24d3eb812fd4 758 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 759
JMF 0:24d3eb812fd4 760 debugOutput("ENTER/EXIT socket_bind(), use address '%s', port %d", address.get_ip_address(),address.get_port());
JMF 0:24d3eb812fd4 761 _socRxS[wnc->socket].m_rx_disTO=true; //for us, simply disable the Rx timeout to keep monitoring for data
JMF 0:24d3eb812fd4 762 return (m_errors = NSAPI_ERROR_OK);
JMF 0:24d3eb812fd4 763 }
JMF 0:24d3eb812fd4 764
JMF 0:24d3eb812fd4 765
JMF 0:24d3eb812fd4 766 int inline WNC14A2AInterface::socket_listen(void *handle, int backlog)
JMF 0:24d3eb812fd4 767 {
JMF 0:24d3eb812fd4 768 debugOutput("ENTER/EXIT socket_listen() -- not supported");
JMF 0:24d3eb812fd4 769 m_errors = NSAPI_ERROR_UNSUPPORTED;
JMF 0:24d3eb812fd4 770 return -1;
JMF 0:24d3eb812fd4 771 }
JMF 0:24d3eb812fd4 772
JMF 0:24d3eb812fd4 773
JMF 0:24d3eb812fd4 774 int WNC14A2AInterface::socket_send(void *handle, const void *data, unsigned size)
JMF 0:24d3eb812fd4 775 {
JMF 0:24d3eb812fd4 776 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 777 TXEVENT *txsock;
JMF 0:24d3eb812fd4 778
JMF 0:24d3eb812fd4 779 debugOutput("ENTER socket_send() send %d bytes",size);
JMF 0:24d3eb812fd4 780 txsock = &_socTxS[wnc->socket];
JMF 0:24d3eb812fd4 781
JMF 0:24d3eb812fd4 782 if( size < 1 || data == NULL ) // should never happen but have seen it
JMF 0:24d3eb812fd4 783 return 0;
JMF 0:24d3eb812fd4 784
JMF 0:24d3eb812fd4 785 switch( txsock->m_tx_wnc_state ) {
JMF 0:24d3eb812fd4 786 case TX_IDLE:
JMF 0:24d3eb812fd4 787 txsock->m_tx_wnc_state = TX_STARTING;
JMF 0:24d3eb812fd4 788 debugDump_arry((const uint8_t*)data,size);
JMF 0:24d3eb812fd4 789 txsock->m_tx_dptr = (uint8_t*)data;
JMF 0:24d3eb812fd4 790 txsock->m_tx_orig_size = size;
JMF 0:24d3eb812fd4 791 txsock->m_tx_req_size = (uint32_t)size;
JMF 0:24d3eb812fd4 792 txsock->m_tx_total_sent= 0;
JMF 0:24d3eb812fd4 793 txsock->m_tx_callback = wnc->_callback;
JMF 0:24d3eb812fd4 794 txsock->m_tx_cb_data = wnc->_cb_data;
JMF 0:24d3eb812fd4 795
JMF 0:24d3eb812fd4 796 if( txsock->m_tx_req_size > UART_BUFF_SIZE )
JMF 0:24d3eb812fd4 797 txsock->m_tx_req_size= UART_BUFF_SIZE;
JMF 0:24d3eb812fd4 798
JMF 0:24d3eb812fd4 799 if( !tx_event(txsock) ) { //if we didn't sent all the data at once, continue in background
JMF 0:24d3eb812fd4 800 txsock->m_tx_wnc_state = TX_ACTIVE;
JMF 0:24d3eb812fd4 801 wnc_queue.call_in(EQ_FREQ,mbed::Callback<void()>((WNC14A2AInterface*)this,&WNC14A2AInterface::wnc_eq_event));
JMF 0:24d3eb812fd4 802 return NSAPI_ERROR_WOULD_BLOCK;
JMF 0:24d3eb812fd4 803 }
JMF 0:24d3eb812fd4 804 // fall through
JMF 0:24d3eb812fd4 805
JMF 0:24d3eb812fd4 806 case TX_COMPLETE:
JMF 0:24d3eb812fd4 807 debugOutput("EXIT socket_send(), sent %d bytes", txsock->m_tx_total_sent);
JMF 0:24d3eb812fd4 808 txsock->m_tx_wnc_state = TX_IDLE;
JMF 0:24d3eb812fd4 809 return txsock->m_tx_total_sent;
JMF 0:24d3eb812fd4 810
JMF 0:24d3eb812fd4 811 case TX_ACTIVE:
JMF 0:24d3eb812fd4 812 case TX_STARTING:
JMF 0:24d3eb812fd4 813 return NSAPI_ERROR_WOULD_BLOCK;
JMF 0:24d3eb812fd4 814
JMF 0:24d3eb812fd4 815 default:
JMF 0:24d3eb812fd4 816 debugOutput("EXIT socket_send(), NSAPI_ERROR_DEVICE_ERROR");
JMF 0:24d3eb812fd4 817 return (m_errors = NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 818 }
JMF 0:24d3eb812fd4 819 }
JMF 0:24d3eb812fd4 820
JMF 0:24d3eb812fd4 821 int WNC14A2AInterface::tx_event(TXEVENT *ptr)
JMF 0:24d3eb812fd4 822 {
JMF 0:24d3eb812fd4 823 debugOutput("ENTER tx_event(), socket %d",ptr->m_tx_socket);
JMF 0:24d3eb812fd4 824
JMF 0:24d3eb812fd4 825 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 826 if( m_pwnc->write(ptr->m_tx_socket, ptr->m_tx_dptr, ptr->m_tx_req_size) )
JMF 0:24d3eb812fd4 827 ptr->m_tx_total_sent += ptr->m_tx_req_size;
JMF 0:24d3eb812fd4 828 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 829
JMF 0:24d3eb812fd4 830 if( ptr->m_tx_total_sent < ptr->m_tx_orig_size ) {
JMF 0:24d3eb812fd4 831 ptr->m_tx_dptr += ptr->m_tx_req_size;
JMF 0:24d3eb812fd4 832 ptr->m_tx_req_size = ptr->m_tx_orig_size-ptr->m_tx_total_sent;
JMF 0:24d3eb812fd4 833
JMF 0:24d3eb812fd4 834 if( ptr->m_tx_req_size > UART_BUFF_SIZE)
JMF 0:24d3eb812fd4 835 ptr->m_tx_req_size= UART_BUFF_SIZE;
JMF 0:24d3eb812fd4 836
JMF 0:24d3eb812fd4 837 debugOutput("EXIT tx_event(), send %d more bytes.",ptr->m_tx_req_size);
JMF 0:24d3eb812fd4 838 return 0;
JMF 0:24d3eb812fd4 839 }
JMF 0:24d3eb812fd4 840 debugOutput("EXIT tx_event, socket %d, data sent",ptr->m_tx_socket);
JMF 0:24d3eb812fd4 841 ptr->m_tx_wnc_state = TX_COMPLETE;
JMF 0:24d3eb812fd4 842 if( ptr->m_tx_callback != NULL )
JMF 0:24d3eb812fd4 843 ptr->m_tx_callback( ptr->m_tx_cb_data );
JMF 0:24d3eb812fd4 844 ptr->m_tx_cb_data = NULL;
JMF 0:24d3eb812fd4 845 ptr->m_tx_callback = NULL;
JMF 0:24d3eb812fd4 846
JMF 0:24d3eb812fd4 847 return 1;
JMF 0:24d3eb812fd4 848 }
JMF 0:24d3eb812fd4 849
JMF 0:24d3eb812fd4 850 int WNC14A2AInterface::socket_recv(void *handle, void *data, unsigned size)
JMF 0:24d3eb812fd4 851 {
JMF 0:24d3eb812fd4 852 WNCSOCKET *wnc = (WNCSOCKET *)handle;
JMF 0:24d3eb812fd4 853 RXEVENT *rxsock;
JMF 0:24d3eb812fd4 854
JMF 0:24d3eb812fd4 855 rxsock = &_socRxS[wnc->socket];
JMF 0:24d3eb812fd4 856 debugOutput("ENTER socket_recv(), socket %d, request %d bytes",wnc->socket, size);
JMF 0:24d3eb812fd4 857
JMF 0:24d3eb812fd4 858 if( size < 1 || data == NULL ) { // should never happen
JMF 0:24d3eb812fd4 859 return 0;
JMF 0:24d3eb812fd4 860 }
JMF 0:24d3eb812fd4 861
JMF 0:24d3eb812fd4 862 switch( rxsock->m_rx_wnc_state ) {
JMF 0:24d3eb812fd4 863 case READ_START: //need to start a read sequence of events
JMF 0:24d3eb812fd4 864 rxsock->m_rx_wnc_state= READ_INIT;
JMF 0:24d3eb812fd4 865 rxsock->m_rx_dptr = (uint8_t*)data;
JMF 0:24d3eb812fd4 866 rxsock->m_rx_req_size = (uint32_t)size;
JMF 0:24d3eb812fd4 867 rxsock->m_rx_total_cnt= 0;
JMF 0:24d3eb812fd4 868 rxsock->m_rx_timer = 0;
JMF 0:24d3eb812fd4 869 rxsock->m_rx_return_cnt=0;
JMF 0:24d3eb812fd4 870
JMF 0:24d3eb812fd4 871 if( rxsock->m_rx_req_size > WNC_BUFF_SIZE)
JMF 0:24d3eb812fd4 872 rxsock->m_rx_req_size= WNC_BUFF_SIZE;
JMF 0:24d3eb812fd4 873
JMF 0:24d3eb812fd4 874 rxsock->m_rx_callback = wnc->_callback;
JMF 0:24d3eb812fd4 875 rxsock->m_rx_cb_data = wnc->_cb_data;
JMF 0:24d3eb812fd4 876
JMF 0:24d3eb812fd4 877 if( !rx_event(rxsock) ){
JMF 0:24d3eb812fd4 878 rxsock->m_rx_wnc_state = READ_ACTIVE;
JMF 0:24d3eb812fd4 879 wnc_queue.call_in(EQ_FREQ,mbed::Callback<void()>((WNC14A2AInterface*)this,&WNC14A2AInterface::wnc_eq_event));
JMF 0:24d3eb812fd4 880 return NSAPI_ERROR_WOULD_BLOCK;
JMF 0:24d3eb812fd4 881 }
JMF 0:24d3eb812fd4 882 // fall through
JMF 0:24d3eb812fd4 883
JMF 0:24d3eb812fd4 884 case DATA_AVAILABLE:
JMF 0:24d3eb812fd4 885 debugOutput("EXIT socket_recv(),socket %d, return %d bytes",wnc->socket, rxsock->m_rx_return_cnt);
JMF 0:24d3eb812fd4 886 debugDump_arry((const uint8_t*)data,rxsock->m_rx_return_cnt);
JMF 0:24d3eb812fd4 887 rxsock->m_rx_wnc_state = READ_START;
JMF 0:24d3eb812fd4 888 return rxsock->m_rx_return_cnt;
JMF 0:24d3eb812fd4 889
JMF 0:24d3eb812fd4 890 case READ_ACTIVE:
JMF 0:24d3eb812fd4 891 case READ_INIT:
JMF 0:24d3eb812fd4 892 //jmf rxsock->m_rx_timer = 0; //reset the time-out timer
JMF 0:24d3eb812fd4 893 return NSAPI_ERROR_WOULD_BLOCK;
JMF 0:24d3eb812fd4 894
JMF 0:24d3eb812fd4 895 default:
JMF 0:24d3eb812fd4 896 debugOutput("EXIT socket_recv(), NSAPI_ERROR_DEVICE_ERROR");
JMF 0:24d3eb812fd4 897 return (m_errors = NSAPI_ERROR_DEVICE_ERROR);
JMF 0:24d3eb812fd4 898 }
JMF 0:24d3eb812fd4 899 }
JMF 0:24d3eb812fd4 900
JMF 0:24d3eb812fd4 901
JMF 0:24d3eb812fd4 902 int WNC14A2AInterface::rx_event(RXEVENT *ptr)
JMF 0:24d3eb812fd4 903 {
JMF 0:24d3eb812fd4 904 debugOutput("ENTER rx_event() for socket %d", ptr->m_rx_socket);
JMF 0:24d3eb812fd4 905 _pwnc_mutex.lock();
JMF 0:24d3eb812fd4 906 int cnt = m_pwnc->read(ptr->m_rx_socket, ptr->m_rx_dptr, ptr->m_rx_req_size);
JMF 0:24d3eb812fd4 907 _pwnc_mutex.unlock();
JMF 0:24d3eb812fd4 908
JMF 0:24d3eb812fd4 909 if( cnt ) { //got data, return it to the caller
JMF 0:24d3eb812fd4 910 debugOutput("data received on socket %d, cnt=%d", ptr->m_rx_socket,cnt);
JMF 0:24d3eb812fd4 911 ptr->m_rx_wnc_state = DATA_AVAILABLE;
JMF 0:24d3eb812fd4 912 ptr->m_rx_return_cnt = cnt;
JMF 0:24d3eb812fd4 913 if( ptr->m_rx_callback != NULL )
JMF 0:24d3eb812fd4 914 ptr->m_rx_callback( ptr->m_rx_cb_data );
JMF 0:24d3eb812fd4 915 ptr->m_rx_cb_data = NULL;
JMF 0:24d3eb812fd4 916 ptr->m_rx_callback = NULL;
JMF 0:24d3eb812fd4 917 return 1;
JMF 0:24d3eb812fd4 918 }
JMF 0:24d3eb812fd4 919 if( ++ptr->m_rx_timer > (WNC14A2A_READ_TIMEOUTMS/EQ_FREQ) && !ptr->m_rx_disTO ) { //timed out waiting, return 0 to caller
JMF 0:24d3eb812fd4 920 debugOutput("EXIT rx_event(), rx data TIME-OUT!");
JMF 0:24d3eb812fd4 921 ptr->m_rx_wnc_state = DATA_AVAILABLE;
JMF 0:24d3eb812fd4 922 ptr->m_rx_return_cnt = 0;
JMF 0:24d3eb812fd4 923 if( ptr->m_rx_callback != NULL )
JMF 0:24d3eb812fd4 924 ptr->m_rx_callback( ptr->m_rx_cb_data );
JMF 0:24d3eb812fd4 925 ptr->m_rx_cb_data = NULL;
JMF 0:24d3eb812fd4 926 ptr->m_rx_callback = NULL;
JMF 0:24d3eb812fd4 927 return 1;
JMF 0:24d3eb812fd4 928 }
JMF 0:24d3eb812fd4 929
JMF 0:24d3eb812fd4 930 debugOutput("EXIT rx_event(), socket %d, sechedule for more data.",ptr->m_rx_socket);
JMF 0:24d3eb812fd4 931 return 0;
JMF 0:24d3eb812fd4 932 }
JMF 0:24d3eb812fd4 933
JMF 0:24d3eb812fd4 934 void WNC14A2AInterface::wnc_eq_event()
JMF 0:24d3eb812fd4 935 {
JMF 0:24d3eb812fd4 936 int done = 1;
JMF 0:24d3eb812fd4 937 bool goSlow = true;
JMF 0:24d3eb812fd4 938
JMF 0:24d3eb812fd4 939 for( unsigned int i=0; i<WNC14A2A_SOCKET_COUNT; i++ ) {
JMF 0:24d3eb812fd4 940 if( _socRxS[i].m_rx_wnc_state == READ_ACTIVE || _socRxS[i].m_rx_disTO) {
JMF 0:24d3eb812fd4 941 done &= rx_event(&_socRxS[i]);
JMF 0:24d3eb812fd4 942 goSlow &= ( _socRxS[i].m_rx_timer > ((WNC14A2A_READ_TIMEOUTMS/EQ_FREQ)*(EQ_FREQ_SLOW/EQ_FREQ)) );
JMF 0:24d3eb812fd4 943
JMF 0:24d3eb812fd4 944 if( goSlow )
JMF 0:24d3eb812fd4 945 _socRxS[i].m_rx_timer = (WNC14A2A_READ_TIMEOUTMS/EQ_FREQ)*(EQ_FREQ_SLOW/EQ_FREQ);
JMF 0:24d3eb812fd4 946 }
JMF 0:24d3eb812fd4 947
JMF 0:24d3eb812fd4 948 if( _socTxS[i].m_tx_wnc_state == TX_ACTIVE ) {
JMF 0:24d3eb812fd4 949 goSlow = false;
JMF 0:24d3eb812fd4 950 debugOutput("CALL TX_event() for socket %d", i);
JMF 0:24d3eb812fd4 951 done &= tx_event(&_socTxS[i]);
JMF 0:24d3eb812fd4 952 }
JMF 0:24d3eb812fd4 953 }
JMF 0:24d3eb812fd4 954
JMF 0:24d3eb812fd4 955 if( !done )
JMF 0:24d3eb812fd4 956 wnc_queue.call_in((goSlow?EQ_FREQ_SLOW:EQ_FREQ),mbed::Callback<void()>((WNC14A2AInterface*)this,&WNC14A2AInterface::wnc_eq_event));
JMF 0:24d3eb812fd4 957 }