Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
sam_grove
Date:
Thu Sep 26 00:44:20 2013 -0500
Revision:
5:3f93dd1d4cb3
Exported program and replaced contents of the repo with the source
to build and debug using keil mdk. Libs NOT upto date are lwip, lwip-sys
and socket. these have newer versions under mbed_official but were starting
from a know working point

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 5:3f93dd1d4cb3 1 /* PPPIPInterface.cpp */
sam_grove 5:3f93dd1d4cb3 2 /* Copyright (C) 2012 mbed.org, MIT License
sam_grove 5:3f93dd1d4cb3 3 *
sam_grove 5:3f93dd1d4cb3 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 5:3f93dd1d4cb3 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
sam_grove 5:3f93dd1d4cb3 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
sam_grove 5:3f93dd1d4cb3 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
sam_grove 5:3f93dd1d4cb3 8 * furnished to do so, subject to the following conditions:
sam_grove 5:3f93dd1d4cb3 9 *
sam_grove 5:3f93dd1d4cb3 10 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 5:3f93dd1d4cb3 11 * substantial portions of the Software.
sam_grove 5:3f93dd1d4cb3 12 *
sam_grove 5:3f93dd1d4cb3 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 5:3f93dd1d4cb3 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 5:3f93dd1d4cb3 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 5:3f93dd1d4cb3 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 5:3f93dd1d4cb3 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 5:3f93dd1d4cb3 18 */
sam_grove 5:3f93dd1d4cb3 19
sam_grove 5:3f93dd1d4cb3 20 #define __DEBUG__ 0
sam_grove 5:3f93dd1d4cb3 21 #ifndef __MODULE__
sam_grove 5:3f93dd1d4cb3 22 #define __MODULE__ "PPPIPInterface.cpp"
sam_grove 5:3f93dd1d4cb3 23 #endif
sam_grove 5:3f93dd1d4cb3 24
sam_grove 5:3f93dd1d4cb3 25 #include "core/fwk.h"
sam_grove 5:3f93dd1d4cb3 26 #include "rtos.h"
sam_grove 5:3f93dd1d4cb3 27
sam_grove 5:3f93dd1d4cb3 28 #include "PPPIPInterface.h"
sam_grove 5:3f93dd1d4cb3 29
sam_grove 5:3f93dd1d4cb3 30 #define MSISDN "#777"
sam_grove 5:3f93dd1d4cb3 31 //TODO Pass this as parameter (*99# is used by GSM systems, #777 by CDMA systems--well at least Sprint!)
sam_grove 5:3f93dd1d4cb3 32
sam_grove 5:3f93dd1d4cb3 33 #define CONNECT_CMD "ATD " MSISDN "\x0D"
sam_grove 5:3f93dd1d4cb3 34 #define EXPECTED_RESP CONNECT_CMD "\x0D" "\x0A" "CONNECT" "\x0D" "\x0A"
sam_grove 5:3f93dd1d4cb3 35 #define EXPECTED_RESP_DATARATE CONNECT_CMD "\x0D" "\x0A" "CONNECT %d" "\x0D" "\x0A"
sam_grove 5:3f93dd1d4cb3 36 #define EXPECTED_RESP_MIN_LEN 20
sam_grove 5:3f93dd1d4cb3 37 #define OK_RESP "\x0D" "\x0A" "OK" "\x0D" "\x0A"
sam_grove 5:3f93dd1d4cb3 38 #define ESCAPE_SEQ "+++"
sam_grove 5:3f93dd1d4cb3 39 #define HANGUP_CMD "ATH" "\x0D"
sam_grove 5:3f93dd1d4cb3 40 #define NO_CARRIER_RESP "\x0D" "\x0A" "NO CARRIER" "\x0D" "\x0A"
sam_grove 5:3f93dd1d4cb3 41 extern "C" {
sam_grove 5:3f93dd1d4cb3 42 #include "lwip/ip_addr.h"
sam_grove 5:3f93dd1d4cb3 43 #include "lwip/inet.h"
sam_grove 5:3f93dd1d4cb3 44 #include "netif/ppp/ppp.h"
sam_grove 5:3f93dd1d4cb3 45 }
sam_grove 5:3f93dd1d4cb3 46
sam_grove 5:3f93dd1d4cb3 47 PPPIPInterface::PPPIPInterface(IOStream* pStream) : LwIPInterface(), m_linkStatusSphre(1), m_pppErrCode(0), m_pStream(pStream), m_streamAvail(true), m_pppd(-1)
sam_grove 5:3f93dd1d4cb3 48 {
sam_grove 5:3f93dd1d4cb3 49 m_linkStatusSphre.wait();
sam_grove 5:3f93dd1d4cb3 50 }
sam_grove 5:3f93dd1d4cb3 51
sam_grove 5:3f93dd1d4cb3 52 /*virtual*/ PPPIPInterface::~PPPIPInterface()
sam_grove 5:3f93dd1d4cb3 53 {
sam_grove 5:3f93dd1d4cb3 54
sam_grove 5:3f93dd1d4cb3 55 }
sam_grove 5:3f93dd1d4cb3 56
sam_grove 5:3f93dd1d4cb3 57 /*virtual*/ int PPPIPInterface::init() //Init PPP-specific stuff, create the right bindings, etc
sam_grove 5:3f93dd1d4cb3 58 {
sam_grove 5:3f93dd1d4cb3 59 DBG("Initializing LwIP");
sam_grove 5:3f93dd1d4cb3 60 LwIPInterface::init(); //Init LwIP, NOT including PPP
sam_grove 5:3f93dd1d4cb3 61 DBG("Initializing PPP");
sam_grove 5:3f93dd1d4cb3 62 pppInit();
sam_grove 5:3f93dd1d4cb3 63 DBG("Done");
sam_grove 5:3f93dd1d4cb3 64 return OK;
sam_grove 5:3f93dd1d4cb3 65 }
sam_grove 5:3f93dd1d4cb3 66
sam_grove 5:3f93dd1d4cb3 67 int PPPIPInterface::setup(const char* user, const char* pw)
sam_grove 5:3f93dd1d4cb3 68 {
sam_grove 5:3f93dd1d4cb3 69 DBG("Configuring PPP authentication method");
sam_grove 5:3f93dd1d4cb3 70 pppSetAuth(PPPAUTHTYPE_ANY, user, pw);
sam_grove 5:3f93dd1d4cb3 71 DBG("Done");
sam_grove 5:3f93dd1d4cb3 72 return OK;
sam_grove 5:3f93dd1d4cb3 73 }
sam_grove 5:3f93dd1d4cb3 74
sam_grove 5:3f93dd1d4cb3 75 /*virtual*/ int PPPIPInterface::connect()
sam_grove 5:3f93dd1d4cb3 76 {
sam_grove 5:3f93dd1d4cb3 77 int ret;
sam_grove 5:3f93dd1d4cb3 78 char buf[32];
sam_grove 5:3f93dd1d4cb3 79 size_t len;
sam_grove 5:3f93dd1d4cb3 80 DBG("Trying to connect with PPP");
sam_grove 5:3f93dd1d4cb3 81
sam_grove 5:3f93dd1d4cb3 82 cleanupLink();
sam_grove 5:3f93dd1d4cb3 83
sam_grove 5:3f93dd1d4cb3 84 DBG("Sending %s", CONNECT_CMD);
sam_grove 5:3f93dd1d4cb3 85
sam_grove 5:3f93dd1d4cb3 86 ret = m_pStream->write((uint8_t*)CONNECT_CMD, strlen(CONNECT_CMD), osWaitForever);
sam_grove 5:3f93dd1d4cb3 87 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 88 {
sam_grove 5:3f93dd1d4cb3 89 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 90 }
sam_grove 5:3f93dd1d4cb3 91
sam_grove 5:3f93dd1d4cb3 92 DBG("Expect %s", EXPECTED_RESP);
sam_grove 5:3f93dd1d4cb3 93
sam_grove 5:3f93dd1d4cb3 94 len = 0;
sam_grove 5:3f93dd1d4cb3 95 size_t readLen;
sam_grove 5:3f93dd1d4cb3 96 ret = m_pStream->read((uint8_t*)buf + len, &readLen, EXPECTED_RESP_MIN_LEN, 10000);
sam_grove 5:3f93dd1d4cb3 97 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 98 {
sam_grove 5:3f93dd1d4cb3 99 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 100 }
sam_grove 5:3f93dd1d4cb3 101 len += readLen;
sam_grove 5:3f93dd1d4cb3 102 while( (len < EXPECTED_RESP_MIN_LEN) || (buf[len-1] != LF) )
sam_grove 5:3f93dd1d4cb3 103 {
sam_grove 5:3f93dd1d4cb3 104 ret = m_pStream->read((uint8_t*)buf + len, &readLen, 1, 10000);
sam_grove 5:3f93dd1d4cb3 105 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 106 {
sam_grove 5:3f93dd1d4cb3 107 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 108 }
sam_grove 5:3f93dd1d4cb3 109 len += readLen;
sam_grove 5:3f93dd1d4cb3 110 }
sam_grove 5:3f93dd1d4cb3 111
sam_grove 5:3f93dd1d4cb3 112 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 113
sam_grove 5:3f93dd1d4cb3 114 DBG("Got %s[len %d]", buf, len);
sam_grove 5:3f93dd1d4cb3 115
sam_grove 5:3f93dd1d4cb3 116 int datarate = 0;
sam_grove 5:3f93dd1d4cb3 117 if( (sscanf( buf, EXPECTED_RESP_DATARATE, &datarate ) != 1) && (strcmp(EXPECTED_RESP, buf) != 0) )
sam_grove 5:3f93dd1d4cb3 118 {
sam_grove 5:3f93dd1d4cb3 119 //Discard buffer
sam_grove 5:3f93dd1d4cb3 120 do //Clear buf
sam_grove 5:3f93dd1d4cb3 121 {
sam_grove 5:3f93dd1d4cb3 122 ret = m_pStream->read((uint8_t*)buf, &len, 32, 0);
sam_grove 5:3f93dd1d4cb3 123 } while( (ret == OK) && (len > 0) );
sam_grove 5:3f93dd1d4cb3 124 return NET_CONN;
sam_grove 5:3f93dd1d4cb3 125 }
sam_grove 5:3f93dd1d4cb3 126
sam_grove 5:3f93dd1d4cb3 127 DBG("Transport link open");
sam_grove 5:3f93dd1d4cb3 128 if(datarate != 0)
sam_grove 5:3f93dd1d4cb3 129 {
sam_grove 5:3f93dd1d4cb3 130 DBG("Datarate: %d bps", datarate);
sam_grove 5:3f93dd1d4cb3 131 }
sam_grove 5:3f93dd1d4cb3 132 m_linkStatusSphre.wait(0);
sam_grove 5:3f93dd1d4cb3 133 if((m_pppd != -1) && (m_pppErrCode == 0)) //Already connected
sam_grove 5:3f93dd1d4cb3 134 {
sam_grove 5:3f93dd1d4cb3 135 return NET_INVALID;
sam_grove 5:3f93dd1d4cb3 136 }
sam_grove 5:3f93dd1d4cb3 137
sam_grove 5:3f93dd1d4cb3 138 ret = pppOverSerialOpen(this, PPPIPInterface::linkStatusCb, this);
sam_grove 5:3f93dd1d4cb3 139 if(ret < 0)
sam_grove 5:3f93dd1d4cb3 140 {
sam_grove 5:3f93dd1d4cb3 141 switch(ret)
sam_grove 5:3f93dd1d4cb3 142 {
sam_grove 5:3f93dd1d4cb3 143 case PPPERR_OPEN:
sam_grove 5:3f93dd1d4cb3 144 default:
sam_grove 5:3f93dd1d4cb3 145 return NET_FULL; //All available resources are already used
sam_grove 5:3f93dd1d4cb3 146 }
sam_grove 5:3f93dd1d4cb3 147 }
sam_grove 5:3f93dd1d4cb3 148 m_pppd = ret; //PPP descriptor
sam_grove 5:3f93dd1d4cb3 149 m_linkStatusSphre.wait(); //Block indefinitely; there should be a timeout there
sam_grove 5:3f93dd1d4cb3 150 if(m_pppErrCode != PPPERR_NONE)
sam_grove 5:3f93dd1d4cb3 151 {
sam_grove 5:3f93dd1d4cb3 152 m_pppd = -1;
sam_grove 5:3f93dd1d4cb3 153 }
sam_grove 5:3f93dd1d4cb3 154 switch(m_pppErrCode)
sam_grove 5:3f93dd1d4cb3 155 {
sam_grove 5:3f93dd1d4cb3 156 case PPPERR_NONE: //Connected OK
sam_grove 5:3f93dd1d4cb3 157 return OK;
sam_grove 5:3f93dd1d4cb3 158 case PPPERR_CONNECT: //Connection lost
sam_grove 5:3f93dd1d4cb3 159 return NET_INTERRUPTED;
sam_grove 5:3f93dd1d4cb3 160 case PPPERR_AUTHFAIL: //Authentication failed
sam_grove 5:3f93dd1d4cb3 161 return NET_AUTH;
sam_grove 5:3f93dd1d4cb3 162 case PPPERR_PROTOCOL: //Protocol error
sam_grove 5:3f93dd1d4cb3 163 return NET_PROTOCOL;
sam_grove 5:3f93dd1d4cb3 164 default:
sam_grove 5:3f93dd1d4cb3 165 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 166 }
sam_grove 5:3f93dd1d4cb3 167 }
sam_grove 5:3f93dd1d4cb3 168
sam_grove 5:3f93dd1d4cb3 169 /*virtual*/ int PPPIPInterface::disconnect()
sam_grove 5:3f93dd1d4cb3 170 {
sam_grove 5:3f93dd1d4cb3 171 int ret = m_linkStatusSphre.wait(0);
sam_grove 5:3f93dd1d4cb3 172 if(ret > 0) //Already disconnected?
sam_grove 5:3f93dd1d4cb3 173 {
sam_grove 5:3f93dd1d4cb3 174 m_pppd = -1; //Discard PPP descriptor
sam_grove 5:3f93dd1d4cb3 175 switch(m_pppErrCode)
sam_grove 5:3f93dd1d4cb3 176 {
sam_grove 5:3f93dd1d4cb3 177 case PPPERR_CONNECT: //Connection terminated
sam_grove 5:3f93dd1d4cb3 178 case PPPERR_AUTHFAIL: //Authentication failed
sam_grove 5:3f93dd1d4cb3 179 case PPPERR_PROTOCOL: //Protocol error
sam_grove 5:3f93dd1d4cb3 180 case PPPERR_USER:
sam_grove 5:3f93dd1d4cb3 181 return OK;
sam_grove 5:3f93dd1d4cb3 182 default:
sam_grove 5:3f93dd1d4cb3 183 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 184 }
sam_grove 5:3f93dd1d4cb3 185 }
sam_grove 5:3f93dd1d4cb3 186 else
sam_grove 5:3f93dd1d4cb3 187 {
sam_grove 5:3f93dd1d4cb3 188 if(m_pppd == -1)
sam_grove 5:3f93dd1d4cb3 189 {
sam_grove 5:3f93dd1d4cb3 190 return NET_INVALID;
sam_grove 5:3f93dd1d4cb3 191 }
sam_grove 5:3f93dd1d4cb3 192 pppClose(m_pppd);
sam_grove 5:3f93dd1d4cb3 193 do
sam_grove 5:3f93dd1d4cb3 194 {
sam_grove 5:3f93dd1d4cb3 195 m_linkStatusSphre.wait(); //Block indefinitely; there should be a timeout there
sam_grove 5:3f93dd1d4cb3 196 DBG("Received PPP err code %d", m_pppErrCode);
sam_grove 5:3f93dd1d4cb3 197 } while(m_pppErrCode != PPPERR_USER);
sam_grove 5:3f93dd1d4cb3 198 m_pppd = -1; //Discard PPP descriptor
sam_grove 5:3f93dd1d4cb3 199 }
sam_grove 5:3f93dd1d4cb3 200
sam_grove 5:3f93dd1d4cb3 201 Thread::wait(500);
sam_grove 5:3f93dd1d4cb3 202
sam_grove 5:3f93dd1d4cb3 203 DBG("Sending %s", ESCAPE_SEQ);
sam_grove 5:3f93dd1d4cb3 204
sam_grove 5:3f93dd1d4cb3 205 ret = m_pStream->write((uint8_t*)ESCAPE_SEQ, strlen(ESCAPE_SEQ), osWaitForever);
sam_grove 5:3f93dd1d4cb3 206 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 207 {
sam_grove 5:3f93dd1d4cb3 208 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 209 }
sam_grove 5:3f93dd1d4cb3 210
sam_grove 5:3f93dd1d4cb3 211 Thread::wait(500);
sam_grove 5:3f93dd1d4cb3 212
sam_grove 5:3f93dd1d4cb3 213 cleanupLink();
sam_grove 5:3f93dd1d4cb3 214
sam_grove 5:3f93dd1d4cb3 215 return OK;
sam_grove 5:3f93dd1d4cb3 216 }
sam_grove 5:3f93dd1d4cb3 217
sam_grove 5:3f93dd1d4cb3 218
sam_grove 5:3f93dd1d4cb3 219 int PPPIPInterface::cleanupLink()
sam_grove 5:3f93dd1d4cb3 220 {
sam_grove 5:3f93dd1d4cb3 221 int ret;
sam_grove 5:3f93dd1d4cb3 222 char buf[32];
sam_grove 5:3f93dd1d4cb3 223 size_t len;
sam_grove 5:3f93dd1d4cb3 224
sam_grove 5:3f93dd1d4cb3 225 do //Clear buf
sam_grove 5:3f93dd1d4cb3 226 {
sam_grove 5:3f93dd1d4cb3 227 ret = m_pStream->read((uint8_t*)buf, &len, 32, 100);
sam_grove 5:3f93dd1d4cb3 228 if(ret == OK)
sam_grove 5:3f93dd1d4cb3 229 {
sam_grove 5:3f93dd1d4cb3 230 buf[len] = '\0';
sam_grove 5:3f93dd1d4cb3 231 DBG("Got %s", buf);
sam_grove 5:3f93dd1d4cb3 232 }
sam_grove 5:3f93dd1d4cb3 233 } while( (ret == OK) && (len > 0) );
sam_grove 5:3f93dd1d4cb3 234
sam_grove 5:3f93dd1d4cb3 235 DBG("Sending %s", HANGUP_CMD);
sam_grove 5:3f93dd1d4cb3 236
sam_grove 5:3f93dd1d4cb3 237 ret = m_pStream->write((uint8_t*)HANGUP_CMD, strlen(HANGUP_CMD), osWaitForever);
sam_grove 5:3f93dd1d4cb3 238 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 239 {
sam_grove 5:3f93dd1d4cb3 240 return NET_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 241 }
sam_grove 5:3f93dd1d4cb3 242
sam_grove 5:3f93dd1d4cb3 243 size_t readLen;
sam_grove 5:3f93dd1d4cb3 244
sam_grove 5:3f93dd1d4cb3 245 //Hangup
sam_grove 5:3f93dd1d4cb3 246 DBG("Expect %s", HANGUP_CMD);
sam_grove 5:3f93dd1d4cb3 247
sam_grove 5:3f93dd1d4cb3 248 len = 0;
sam_grove 5:3f93dd1d4cb3 249 while( len < strlen(HANGUP_CMD) )
sam_grove 5:3f93dd1d4cb3 250 {
sam_grove 5:3f93dd1d4cb3 251 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(HANGUP_CMD) - len, 100);
sam_grove 5:3f93dd1d4cb3 252 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 253 {
sam_grove 5:3f93dd1d4cb3 254 break;
sam_grove 5:3f93dd1d4cb3 255 }
sam_grove 5:3f93dd1d4cb3 256 len += readLen;
sam_grove 5:3f93dd1d4cb3 257 /////
sam_grove 5:3f93dd1d4cb3 258 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 259 DBG("Got %s", buf);
sam_grove 5:3f93dd1d4cb3 260 }
sam_grove 5:3f93dd1d4cb3 261
sam_grove 5:3f93dd1d4cb3 262 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 263
sam_grove 5:3f93dd1d4cb3 264 DBG("Got %s[len %d]", buf, len);
sam_grove 5:3f93dd1d4cb3 265
sam_grove 5:3f93dd1d4cb3 266 //OK response
sam_grove 5:3f93dd1d4cb3 267 DBG("Expect %s", OK_RESP);
sam_grove 5:3f93dd1d4cb3 268
sam_grove 5:3f93dd1d4cb3 269 len = 0;
sam_grove 5:3f93dd1d4cb3 270 while( len < strlen(OK_RESP) )
sam_grove 5:3f93dd1d4cb3 271 {
sam_grove 5:3f93dd1d4cb3 272 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(OK_RESP) - len, 100);
sam_grove 5:3f93dd1d4cb3 273 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 274 {
sam_grove 5:3f93dd1d4cb3 275 break;
sam_grove 5:3f93dd1d4cb3 276 }
sam_grove 5:3f93dd1d4cb3 277 len += readLen;
sam_grove 5:3f93dd1d4cb3 278 /////
sam_grove 5:3f93dd1d4cb3 279 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 280 DBG("Got %s", buf);
sam_grove 5:3f93dd1d4cb3 281 }
sam_grove 5:3f93dd1d4cb3 282
sam_grove 5:3f93dd1d4cb3 283 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 284
sam_grove 5:3f93dd1d4cb3 285 DBG("Got %s[len %d]", buf, len);
sam_grove 5:3f93dd1d4cb3 286
sam_grove 5:3f93dd1d4cb3 287 //NO CARRIER event
sam_grove 5:3f93dd1d4cb3 288 DBG("Expect %s", NO_CARRIER_RESP);
sam_grove 5:3f93dd1d4cb3 289
sam_grove 5:3f93dd1d4cb3 290 len = 0;
sam_grove 5:3f93dd1d4cb3 291 while( len < strlen(NO_CARRIER_RESP) )
sam_grove 5:3f93dd1d4cb3 292 {
sam_grove 5:3f93dd1d4cb3 293 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(NO_CARRIER_RESP) - len, 100);
sam_grove 5:3f93dd1d4cb3 294 if( ret != OK )
sam_grove 5:3f93dd1d4cb3 295 {
sam_grove 5:3f93dd1d4cb3 296 break;
sam_grove 5:3f93dd1d4cb3 297 }
sam_grove 5:3f93dd1d4cb3 298 len += readLen;
sam_grove 5:3f93dd1d4cb3 299 /////
sam_grove 5:3f93dd1d4cb3 300 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 301 DBG("Got %s", buf);
sam_grove 5:3f93dd1d4cb3 302 }
sam_grove 5:3f93dd1d4cb3 303
sam_grove 5:3f93dd1d4cb3 304 buf[len]=0;
sam_grove 5:3f93dd1d4cb3 305
sam_grove 5:3f93dd1d4cb3 306 DBG("Got %s[len %d]", buf, len);
sam_grove 5:3f93dd1d4cb3 307
sam_grove 5:3f93dd1d4cb3 308 do //Clear buf
sam_grove 5:3f93dd1d4cb3 309 {
sam_grove 5:3f93dd1d4cb3 310 ret = m_pStream->read((uint8_t*)buf, &len, 32, 100);
sam_grove 5:3f93dd1d4cb3 311 if(ret == OK)
sam_grove 5:3f93dd1d4cb3 312 {
sam_grove 5:3f93dd1d4cb3 313 buf[len] = '\0';
sam_grove 5:3f93dd1d4cb3 314 DBG("Got %s", buf);
sam_grove 5:3f93dd1d4cb3 315 }
sam_grove 5:3f93dd1d4cb3 316 } while( (ret == OK) && (len > 0) );
sam_grove 5:3f93dd1d4cb3 317
sam_grove 5:3f93dd1d4cb3 318
sam_grove 5:3f93dd1d4cb3 319 return OK;
sam_grove 5:3f93dd1d4cb3 320 }
sam_grove 5:3f93dd1d4cb3 321
sam_grove 5:3f93dd1d4cb3 322 /*static*/ void PPPIPInterface::linkStatusCb(void *ctx, int errCode, void *arg) //PPP link status
sam_grove 5:3f93dd1d4cb3 323 {
sam_grove 5:3f93dd1d4cb3 324 PPPIPInterface* pIf = (PPPIPInterface*)ctx;
sam_grove 5:3f93dd1d4cb3 325 struct ppp_addrs* addrs = (struct ppp_addrs*) arg;
sam_grove 5:3f93dd1d4cb3 326
sam_grove 5:3f93dd1d4cb3 327 switch(errCode)
sam_grove 5:3f93dd1d4cb3 328 {
sam_grove 5:3f93dd1d4cb3 329 case PPPERR_NONE:
sam_grove 5:3f93dd1d4cb3 330 WARN("Connected via PPP.");
sam_grove 5:3f93dd1d4cb3 331 DBG("Local IP address: %s", inet_ntoa(addrs->our_ipaddr));
sam_grove 5:3f93dd1d4cb3 332 DBG("Netmask: %s", inet_ntoa(addrs->netmask));
sam_grove 5:3f93dd1d4cb3 333 DBG("Remote IP address: %s", inet_ntoa(addrs->his_ipaddr));
sam_grove 5:3f93dd1d4cb3 334 DBG("Primary DNS: %s", inet_ntoa(addrs->dns1));
sam_grove 5:3f93dd1d4cb3 335 DBG("Secondary DNS: %s", inet_ntoa(addrs->dns2));
sam_grove 5:3f93dd1d4cb3 336 pIf->setConnected(true);
sam_grove 5:3f93dd1d4cb3 337 pIf->setIPAddress(inet_ntoa(addrs->our_ipaddr));
sam_grove 5:3f93dd1d4cb3 338 break;
sam_grove 5:3f93dd1d4cb3 339 case PPPERR_CONNECT: //Connection lost
sam_grove 5:3f93dd1d4cb3 340 WARN("Connection lost/terminated");
sam_grove 5:3f93dd1d4cb3 341 pIf->setConnected(false);
sam_grove 5:3f93dd1d4cb3 342 break;
sam_grove 5:3f93dd1d4cb3 343 case PPPERR_AUTHFAIL: //Authentication failed
sam_grove 5:3f93dd1d4cb3 344 WARN("Authentication failed");
sam_grove 5:3f93dd1d4cb3 345 pIf->setConnected(false);
sam_grove 5:3f93dd1d4cb3 346 break;
sam_grove 5:3f93dd1d4cb3 347 case PPPERR_PROTOCOL: //Protocol error
sam_grove 5:3f93dd1d4cb3 348 WARN("Protocol error");
sam_grove 5:3f93dd1d4cb3 349 pIf->setConnected(false);
sam_grove 5:3f93dd1d4cb3 350 break;
sam_grove 5:3f93dd1d4cb3 351 case PPPERR_USER:
sam_grove 5:3f93dd1d4cb3 352 WARN("Disconnected by user");
sam_grove 5:3f93dd1d4cb3 353 pIf->setConnected(false);
sam_grove 5:3f93dd1d4cb3 354 break;
sam_grove 5:3f93dd1d4cb3 355 default:
sam_grove 5:3f93dd1d4cb3 356 WARN("Unknown error (%d)", errCode);
sam_grove 5:3f93dd1d4cb3 357 pIf->setConnected(false);
sam_grove 5:3f93dd1d4cb3 358 break;
sam_grove 5:3f93dd1d4cb3 359 }
sam_grove 5:3f93dd1d4cb3 360
sam_grove 5:3f93dd1d4cb3 361 pIf->m_linkStatusSphre.wait(0); //If previous event has not been handled, "delete" it now
sam_grove 5:3f93dd1d4cb3 362 pIf->m_pppErrCode = errCode;
sam_grove 5:3f93dd1d4cb3 363 pIf->m_linkStatusSphre.release();
sam_grove 5:3f93dd1d4cb3 364 }
sam_grove 5:3f93dd1d4cb3 365
sam_grove 5:3f93dd1d4cb3 366 //LwIP PPP implementation
sam_grove 5:3f93dd1d4cb3 367 extern "C"
sam_grove 5:3f93dd1d4cb3 368 {
sam_grove 5:3f93dd1d4cb3 369
sam_grove 5:3f93dd1d4cb3 370 /**
sam_grove 5:3f93dd1d4cb3 371 * Writes to the serial device.
sam_grove 5:3f93dd1d4cb3 372 *
sam_grove 5:3f93dd1d4cb3 373 * @param fd serial device handle
sam_grove 5:3f93dd1d4cb3 374 * @param data pointer to data to send
sam_grove 5:3f93dd1d4cb3 375 * @param len length (in bytes) of data to send
sam_grove 5:3f93dd1d4cb3 376 * @return number of bytes actually sent
sam_grove 5:3f93dd1d4cb3 377 *
sam_grove 5:3f93dd1d4cb3 378 * @note This function will block until all data can be sent.
sam_grove 5:3f93dd1d4cb3 379 */
sam_grove 5:3f93dd1d4cb3 380 u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len)
sam_grove 5:3f93dd1d4cb3 381 {
sam_grove 5:3f93dd1d4cb3 382 DBG("sio_write");
sam_grove 5:3f93dd1d4cb3 383 PPPIPInterface* pIf = (PPPIPInterface*)fd;
sam_grove 5:3f93dd1d4cb3 384 int ret;
sam_grove 5:3f93dd1d4cb3 385 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
sam_grove 5:3f93dd1d4cb3 386 {
sam_grove 5:3f93dd1d4cb3 387 return 0;
sam_grove 5:3f93dd1d4cb3 388 }
sam_grove 5:3f93dd1d4cb3 389 ret = pIf->m_pStream->write(data, len, osWaitForever); //Blocks until all data is sent or an error happens
sam_grove 5:3f93dd1d4cb3 390 if(ret != OK)
sam_grove 5:3f93dd1d4cb3 391 {
sam_grove 5:3f93dd1d4cb3 392 return 0;
sam_grove 5:3f93dd1d4cb3 393 }
sam_grove 5:3f93dd1d4cb3 394 return len;
sam_grove 5:3f93dd1d4cb3 395 }
sam_grove 5:3f93dd1d4cb3 396
sam_grove 5:3f93dd1d4cb3 397 /**
sam_grove 5:3f93dd1d4cb3 398 * Reads from the serial device.
sam_grove 5:3f93dd1d4cb3 399 *
sam_grove 5:3f93dd1d4cb3 400 * @param fd serial device handle
sam_grove 5:3f93dd1d4cb3 401 * @param data pointer to data buffer for receiving
sam_grove 5:3f93dd1d4cb3 402 * @param len maximum length (in bytes) of data to receive
sam_grove 5:3f93dd1d4cb3 403 * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
sam_grove 5:3f93dd1d4cb3 404 *
sam_grove 5:3f93dd1d4cb3 405 * @note This function will block until data can be received. The blocking
sam_grove 5:3f93dd1d4cb3 406 * can be cancelled by calling sio_read_abort().
sam_grove 5:3f93dd1d4cb3 407 */
sam_grove 5:3f93dd1d4cb3 408 u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len)
sam_grove 5:3f93dd1d4cb3 409 {
sam_grove 5:3f93dd1d4cb3 410 DBG("sio_read");
sam_grove 5:3f93dd1d4cb3 411 PPPIPInterface* pIf = (PPPIPInterface*)fd;
sam_grove 5:3f93dd1d4cb3 412 int ret;
sam_grove 5:3f93dd1d4cb3 413 size_t readLen;
sam_grove 5:3f93dd1d4cb3 414 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
sam_grove 5:3f93dd1d4cb3 415 {
sam_grove 5:3f93dd1d4cb3 416 WARN("EXIT NOT AVAIL");
sam_grove 5:3f93dd1d4cb3 417 return 0;
sam_grove 5:3f93dd1d4cb3 418 }
sam_grove 5:3f93dd1d4cb3 419 ret = pIf->m_pStream->read(data, &readLen, len, osWaitForever); //Blocks until some data is received or an error happens
sam_grove 5:3f93dd1d4cb3 420 if(ret != OK)
sam_grove 5:3f93dd1d4cb3 421 {
sam_grove 5:3f93dd1d4cb3 422 return 0;
sam_grove 5:3f93dd1d4cb3 423 }
sam_grove 5:3f93dd1d4cb3 424 DBG("ret");
sam_grove 5:3f93dd1d4cb3 425 return readLen;
sam_grove 5:3f93dd1d4cb3 426 }
sam_grove 5:3f93dd1d4cb3 427
sam_grove 5:3f93dd1d4cb3 428 /**
sam_grove 5:3f93dd1d4cb3 429 * Aborts a blocking sio_read() call.
sam_grove 5:3f93dd1d4cb3 430 *
sam_grove 5:3f93dd1d4cb3 431 * @param fd serial device handle
sam_grove 5:3f93dd1d4cb3 432 */
sam_grove 5:3f93dd1d4cb3 433 void sio_read_abort(sio_fd_t fd)
sam_grove 5:3f93dd1d4cb3 434 {
sam_grove 5:3f93dd1d4cb3 435 DBG("sio_read_abort");
sam_grove 5:3f93dd1d4cb3 436 PPPIPInterface* pIf = (PPPIPInterface*)fd;
sam_grove 5:3f93dd1d4cb3 437 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
sam_grove 5:3f93dd1d4cb3 438 {
sam_grove 5:3f93dd1d4cb3 439 return;
sam_grove 5:3f93dd1d4cb3 440 }
sam_grove 5:3f93dd1d4cb3 441 pIf->m_pStream->abortRead();
sam_grove 5:3f93dd1d4cb3 442 DBG("ret");
sam_grove 5:3f93dd1d4cb3 443 }
sam_grove 5:3f93dd1d4cb3 444
sam_grove 5:3f93dd1d4cb3 445 }
sam_grove 5:3f93dd1d4cb3 446