USB Host Library for Sprint Dongles

Dependencies:   Socket USBHostWANDongleSprint lwip-sys lwip

Dependents:   SprintUSBModemWebsocketTest SprintUSBModemHTTPClientTest SprintUSBModemNTPClientTest SprintUSBModemSMSTest ... more

Fork of SprintUSBModem_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Mon Dec 10 18:23:49 2012 +0000
Revision:
14:f6f17843e5ef
Parent:
13:75171617d543
Separate USB/Sprint dev flows, fix regression in mbed rev. 41+ lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8f57713b2147 1 /* SprintUSBModem.cpp */
donatien 0:8f57713b2147 2 /* Copyright (C) 2012 mbed.org, MIT License
donatien 0:8f57713b2147 3 *
donatien 0:8f57713b2147 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 0:8f57713b2147 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
donatien 0:8f57713b2147 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
donatien 0:8f57713b2147 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
donatien 0:8f57713b2147 8 * furnished to do so, subject to the following conditions:
donatien 0:8f57713b2147 9 *
donatien 0:8f57713b2147 10 * The above copyright notice and this permission notice shall be included in all copies or
donatien 0:8f57713b2147 11 * substantial portions of the Software.
donatien 0:8f57713b2147 12 *
donatien 0:8f57713b2147 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 0:8f57713b2147 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 0:8f57713b2147 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 0:8f57713b2147 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:8f57713b2147 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 0:8f57713b2147 18 */
donatien 0:8f57713b2147 19
donatien 0:8f57713b2147 20 #define __DEBUG__ 3
donatien 0:8f57713b2147 21 #ifndef __MODULE__
donatien 0:8f57713b2147 22 #define __MODULE__ "SprintUSBModem.cpp"
donatien 0:8f57713b2147 23 #endif
donatien 0:8f57713b2147 24
donatien 0:8f57713b2147 25 #include "core/fwk.h"
donatien 0:8f57713b2147 26
donatien 0:8f57713b2147 27 #include "SprintUSBModem.h"
donatien 0:8f57713b2147 28
donatien 3:9dd2b131afa0 29 #define USE_ONE_PORT 1
donatien 2:f4d9c4ea17f9 30
donatien 2:f4d9c4ea17f9 31 SprintUSBModem::SprintUSBModem(PinName powerGatingPin /*= NC*/, bool powerGatingOnWhenPinHigh /* = true*/) : m_dongle(),
donatien 4:23100b0757d6 32 m_stream(m_dongle.getSerial(0)),
donatien 4:23100b0757d6 33 m_at(&m_stream),
donatien 4:23100b0757d6 34 m_sms(&m_at), m_ppp(&m_stream),
donatien 2:f4d9c4ea17f9 35 m_dongleConnected(false), m_ipInit(false), m_smsInit(false), m_atOpen(false),
donatien 2:f4d9c4ea17f9 36 m_powerGatingPin(powerGatingPin), m_powerGatingOnWhenPinHigh(powerGatingOnWhenPinHigh)
donatien 0:8f57713b2147 37 {
donatien 2:f4d9c4ea17f9 38 if( m_powerGatingPin != NC )
donatien 2:f4d9c4ea17f9 39 {
donatien 2:f4d9c4ea17f9 40 power(false); //Dongle will have to be powered on manually
donatien 2:f4d9c4ea17f9 41 }
donatien 0:8f57713b2147 42 }
donatien 0:8f57713b2147 43
donatien 2:f4d9c4ea17f9 44 class CSSProcessor : public IATCommandsProcessor
donatien 0:8f57713b2147 45 {
donatien 0:8f57713b2147 46 public:
donatien 2:f4d9c4ea17f9 47 CSSProcessor() : status(STATUS_REGISTERING)
donatien 0:8f57713b2147 48 {
donatien 0:8f57713b2147 49
donatien 0:8f57713b2147 50 }
donatien 2:f4d9c4ea17f9 51 enum REGISTERING_STATUS { STATUS_REGISTERING, STATUS_OK };
donatien 0:8f57713b2147 52 REGISTERING_STATUS getStatus()
donatien 0:8f57713b2147 53 {
donatien 0:8f57713b2147 54 return status;
donatien 0:8f57713b2147 55 }
donatien 0:8f57713b2147 56 private:
donatien 0:8f57713b2147 57 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
donatien 0:8f57713b2147 58 {
donatien 2:f4d9c4ea17f9 59 char r;
donatien 2:f4d9c4ea17f9 60 if( sscanf(line, "%*d, %c", &r) == 1 )
donatien 0:8f57713b2147 61 {
donatien 0:8f57713b2147 62 switch(r)
donatien 0:8f57713b2147 63 {
donatien 2:f4d9c4ea17f9 64 case 'Z':
donatien 0:8f57713b2147 65 status = STATUS_REGISTERING;
donatien 0:8f57713b2147 66 break;
donatien 0:8f57713b2147 67 default:
donatien 2:f4d9c4ea17f9 68 status = STATUS_OK;
donatien 0:8f57713b2147 69 break;
donatien 0:8f57713b2147 70 }
donatien 0:8f57713b2147 71 }
donatien 0:8f57713b2147 72 return OK;
donatien 0:8f57713b2147 73 }
donatien 0:8f57713b2147 74 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
donatien 0:8f57713b2147 75 {
donatien 0:8f57713b2147 76 return OK;
donatien 0:8f57713b2147 77 }
donatien 0:8f57713b2147 78 volatile REGISTERING_STATUS status;
donatien 0:8f57713b2147 79 };
donatien 0:8f57713b2147 80
donatien 0:8f57713b2147 81 int SprintUSBModem::connect(const char* apn, const char* user, const char* password)
donatien 0:8f57713b2147 82 {
donatien 0:8f57713b2147 83 if( !m_ipInit )
donatien 0:8f57713b2147 84 {
donatien 0:8f57713b2147 85 m_ipInit = true;
donatien 0:8f57713b2147 86 m_ppp.init();
donatien 0:8f57713b2147 87 }
donatien 0:8f57713b2147 88 m_ppp.setup(user, password);
donatien 0:8f57713b2147 89
donatien 0:8f57713b2147 90 int ret = init();
donatien 0:8f57713b2147 91 if(ret)
donatien 0:8f57713b2147 92 {
donatien 0:8f57713b2147 93 return ret;
donatien 0:8f57713b2147 94 }
donatien 0:8f57713b2147 95
donatien 0:8f57713b2147 96 #if USE_ONE_PORT
donatien 0:8f57713b2147 97 m_smsInit = false; //SMS status reset
donatien 2:f4d9c4ea17f9 98 //m_ussdInit = false; //USSD status reset
donatien 2:f4d9c4ea17f9 99 //m_linkMonitorInit = false; //Link monitor status reset
donatien 0:8f57713b2147 100 #endif
donatien 0:8f57713b2147 101
donatien 0:8f57713b2147 102 ATCommandsInterface::ATResult result;
donatien 0:8f57713b2147 103
donatien 0:8f57713b2147 104 if(apn != NULL)
donatien 0:8f57713b2147 105 {
donatien 0:8f57713b2147 106 char cmd[48];
donatien 0:8f57713b2147 107 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
donatien 0:8f57713b2147 108 ret = m_at.executeSimple(cmd, &result);
donatien 0:8f57713b2147 109 DBG("Result of command: Err code=%d", ret);
donatien 0:8f57713b2147 110 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
donatien 0:8f57713b2147 111 DBG("APN set to %s", apn);
donatien 0:8f57713b2147 112 }
donatien 0:8f57713b2147 113
donatien 0:8f57713b2147 114
donatien 0:8f57713b2147 115 //Connect
donatien 0:8f57713b2147 116 DBG("Connecting");
donatien 0:8f57713b2147 117 #if USE_ONE_PORT
donatien 0:8f57713b2147 118 m_at.close(); // Closing AT parser
donatien 0:8f57713b2147 119 m_atOpen = false; //Will need to be reinitialized afterwards
donatien 0:8f57713b2147 120 #endif
donatien 0:8f57713b2147 121
donatien 0:8f57713b2147 122 DBG("Connecting PPP");
donatien 0:8f57713b2147 123
donatien 0:8f57713b2147 124 ret = m_ppp.connect();
donatien 0:8f57713b2147 125 DBG("Result of connect: Err code=%d", ret);
donatien 0:8f57713b2147 126 return ret;
donatien 0:8f57713b2147 127 }
donatien 0:8f57713b2147 128
donatien 0:8f57713b2147 129
donatien 0:8f57713b2147 130 int SprintUSBModem::disconnect()
donatien 0:8f57713b2147 131 {
donatien 0:8f57713b2147 132 DBG("Disconnecting from PPP");
donatien 0:8f57713b2147 133 int ret = m_ppp.disconnect();
donatien 0:8f57713b2147 134 if(ret)
donatien 0:8f57713b2147 135 {
donatien 0:8f57713b2147 136 ERR("Disconnect returned %d, still trying to disconnect", ret);
donatien 0:8f57713b2147 137 }
donatien 0:8f57713b2147 138
donatien 0:8f57713b2147 139 //Ugly but leave dongle time to recover
donatien 0:8f57713b2147 140 Thread::wait(500);
donatien 0:8f57713b2147 141
donatien 0:8f57713b2147 142 #if USE_ONE_PORT
donatien 0:8f57713b2147 143 ATCommandsInterface::ATResult result;
donatien 0:8f57713b2147 144 DBG("Starting AT thread");
donatien 0:8f57713b2147 145 ret = m_at.open();
donatien 0:8f57713b2147 146 if(ret)
donatien 0:8f57713b2147 147 {
donatien 0:8f57713b2147 148 return ret;
donatien 0:8f57713b2147 149 }
donatien 0:8f57713b2147 150 #endif
donatien 0:8f57713b2147 151
donatien 0:8f57713b2147 152 DBG("Trying to hangup");
donatien 0:8f57713b2147 153
donatien 0:8f57713b2147 154 #if 0 //Does not appear to work
donatien 0:8f57713b2147 155 int tries = 10;
donatien 0:8f57713b2147 156 do
donatien 0:8f57713b2147 157 {
donatien 0:8f57713b2147 158 ret = m_at.executeSimple("+++", &result, 1000);
donatien 0:8f57713b2147 159 DBG("Result of command: Err code=%d\n", ret);
donatien 0:8f57713b2147 160 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 0:8f57713b2147 161 } while(tries-- && ret);
donatien 0:8f57713b2147 162 if(!ret)
donatien 0:8f57713b2147 163 {
donatien 0:8f57713b2147 164 ret = m_at.executeSimple("ATH", &result);
donatien 0:8f57713b2147 165 DBG("Result of command: Err code=%d\n", ret);
donatien 0:8f57713b2147 166 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 0:8f57713b2147 167 }
donatien 0:8f57713b2147 168 #endif
donatien 0:8f57713b2147 169
donatien 0:8f57713b2147 170 #if USE_ONE_PORT
donatien 0:8f57713b2147 171 //Reinit AT parser
donatien 0:8f57713b2147 172 ret = m_at.init();
donatien 0:8f57713b2147 173 DBG("Result of command: Err code=%d\n", ret);
donatien 0:8f57713b2147 174 if(ret)
donatien 0:8f57713b2147 175 {
donatien 0:8f57713b2147 176 m_at.close(); // Closing AT parser
donatien 0:8f57713b2147 177 DBG("AT Parser closed, could not complete disconnection");
donatien 0:8f57713b2147 178 return NET_TIMEOUT;
donatien 0:8f57713b2147 179 }
donatien 0:8f57713b2147 180
donatien 0:8f57713b2147 181 #if 0
donatien 0:8f57713b2147 182 m_at.close(); // Closing AT parser
donatien 0:8f57713b2147 183 DBG("AT Parser closed");
donatien 0:8f57713b2147 184 #endif
donatien 0:8f57713b2147 185 #endif
donatien 0:8f57713b2147 186 return OK;
donatien 0:8f57713b2147 187 }
donatien 0:8f57713b2147 188
donatien 0:8f57713b2147 189 int SprintUSBModem::sendSM(const char* number, const char* message)
donatien 0:8f57713b2147 190 {
donatien 0:8f57713b2147 191 int ret = init();
donatien 0:8f57713b2147 192 if(ret)
donatien 0:8f57713b2147 193 {
donatien 0:8f57713b2147 194 return ret;
donatien 0:8f57713b2147 195 }
donatien 0:8f57713b2147 196
donatien 0:8f57713b2147 197 if(!m_smsInit)
donatien 0:8f57713b2147 198 {
donatien 0:8f57713b2147 199 ret = m_sms.init();
donatien 0:8f57713b2147 200 if(ret)
donatien 0:8f57713b2147 201 {
donatien 0:8f57713b2147 202 return ret;
donatien 0:8f57713b2147 203 }
donatien 0:8f57713b2147 204 m_smsInit = true;
donatien 0:8f57713b2147 205 }
donatien 0:8f57713b2147 206
donatien 0:8f57713b2147 207 ret = m_sms.send(number, message);
donatien 0:8f57713b2147 208 if(ret)
donatien 0:8f57713b2147 209 {
donatien 0:8f57713b2147 210 return ret;
donatien 0:8f57713b2147 211 }
donatien 0:8f57713b2147 212
donatien 0:8f57713b2147 213 return OK;
donatien 0:8f57713b2147 214 }
donatien 0:8f57713b2147 215
donatien 0:8f57713b2147 216 int SprintUSBModem::getSM(char* number, char* message, size_t maxLength)
donatien 0:8f57713b2147 217 {
donatien 0:8f57713b2147 218 int ret = init();
donatien 0:8f57713b2147 219 if(ret)
donatien 0:8f57713b2147 220 {
donatien 0:8f57713b2147 221 return ret;
donatien 0:8f57713b2147 222 }
donatien 0:8f57713b2147 223
donatien 0:8f57713b2147 224 if(!m_smsInit)
donatien 0:8f57713b2147 225 {
donatien 0:8f57713b2147 226 ret = m_sms.init();
donatien 0:8f57713b2147 227 if(ret)
donatien 0:8f57713b2147 228 {
donatien 0:8f57713b2147 229 return ret;
donatien 0:8f57713b2147 230 }
donatien 0:8f57713b2147 231 m_smsInit = true;
donatien 0:8f57713b2147 232 }
donatien 0:8f57713b2147 233
donatien 0:8f57713b2147 234 ret = m_sms.get(number, message, maxLength);
donatien 0:8f57713b2147 235 if(ret)
donatien 0:8f57713b2147 236 {
donatien 0:8f57713b2147 237 return ret;
donatien 0:8f57713b2147 238 }
donatien 0:8f57713b2147 239
donatien 0:8f57713b2147 240 return OK;
donatien 0:8f57713b2147 241 }
donatien 0:8f57713b2147 242
donatien 0:8f57713b2147 243 int SprintUSBModem::getSMCount(size_t* pCount)
donatien 0:8f57713b2147 244 {
donatien 0:8f57713b2147 245 int ret = init();
donatien 0:8f57713b2147 246 if(ret)
donatien 0:8f57713b2147 247 {
donatien 0:8f57713b2147 248 return ret;
donatien 0:8f57713b2147 249 }
donatien 0:8f57713b2147 250
donatien 0:8f57713b2147 251 if(!m_smsInit)
donatien 0:8f57713b2147 252 {
donatien 0:8f57713b2147 253 ret = m_sms.init();
donatien 0:8f57713b2147 254 if(ret)
donatien 0:8f57713b2147 255 {
donatien 0:8f57713b2147 256 return ret;
donatien 0:8f57713b2147 257 }
donatien 0:8f57713b2147 258 m_smsInit = true;
donatien 0:8f57713b2147 259 }
donatien 0:8f57713b2147 260
donatien 0:8f57713b2147 261 ret = m_sms.getCount(pCount);
donatien 0:8f57713b2147 262 if(ret)
donatien 0:8f57713b2147 263 {
donatien 0:8f57713b2147 264 return ret;
donatien 0:8f57713b2147 265 }
donatien 0:8f57713b2147 266
donatien 0:8f57713b2147 267 return OK;
donatien 0:8f57713b2147 268 }
donatien 0:8f57713b2147 269
donatien 0:8f57713b2147 270 ATCommandsInterface* SprintUSBModem::getATCommandsInterface()
donatien 0:8f57713b2147 271 {
donatien 0:8f57713b2147 272 return &m_at;
donatien 0:8f57713b2147 273 }
donatien 0:8f57713b2147 274
donatien 2:f4d9c4ea17f9 275 int SprintUSBModem::power(bool enable)
donatien 2:f4d9c4ea17f9 276 {
donatien 2:f4d9c4ea17f9 277 if( m_powerGatingPin == NC )
donatien 2:f4d9c4ea17f9 278 {
donatien 2:f4d9c4ea17f9 279 return NET_INVALID; //A pin name has not been provided in the constructor
donatien 2:f4d9c4ea17f9 280 }
donatien 2:f4d9c4ea17f9 281
donatien 2:f4d9c4ea17f9 282 if(!enable) //Will force components to re-init
donatien 2:f4d9c4ea17f9 283 {
donatien 2:f4d9c4ea17f9 284 cleanup();
donatien 2:f4d9c4ea17f9 285 }
donatien 2:f4d9c4ea17f9 286
donatien 2:f4d9c4ea17f9 287 DigitalOut powerGatingOut(m_powerGatingPin);
donatien 2:f4d9c4ea17f9 288 powerGatingOut = m_powerGatingOnWhenPinHigh?enable:!enable;
donatien 2:f4d9c4ea17f9 289
donatien 2:f4d9c4ea17f9 290 return OK;
donatien 2:f4d9c4ea17f9 291 }
donatien 2:f4d9c4ea17f9 292
donatien 2:f4d9c4ea17f9 293 bool SprintUSBModem::power()
donatien 2:f4d9c4ea17f9 294 {
donatien 2:f4d9c4ea17f9 295 if( m_powerGatingPin == NC )
donatien 2:f4d9c4ea17f9 296 {
donatien 2:f4d9c4ea17f9 297 return true; //Assume power is always on
donatien 2:f4d9c4ea17f9 298 }
donatien 2:f4d9c4ea17f9 299
donatien 2:f4d9c4ea17f9 300 DigitalOut powerGatingOut(m_powerGatingPin);
donatien 2:f4d9c4ea17f9 301 return m_powerGatingOnWhenPinHigh?powerGatingOut:!powerGatingOut;
donatien 2:f4d9c4ea17f9 302 }
donatien 2:f4d9c4ea17f9 303
donatien 0:8f57713b2147 304 int SprintUSBModem::init()
donatien 0:8f57713b2147 305 {
donatien 0:8f57713b2147 306 if( !m_dongleConnected )
donatien 0:8f57713b2147 307 {
donatien 2:f4d9c4ea17f9 308 if(!power())
donatien 2:f4d9c4ea17f9 309 {
donatien 2:f4d9c4ea17f9 310 //Obviously cannot initialize the dongle if it is disconnected...
donatien 2:f4d9c4ea17f9 311 ERR("Power is off");
donatien 2:f4d9c4ea17f9 312 return NET_INVALID;
donatien 2:f4d9c4ea17f9 313 }
donatien 0:8f57713b2147 314 m_dongleConnected = true;
donatien 0:8f57713b2147 315 while( !m_dongle.connected() )
donatien 0:8f57713b2147 316 {
donatien 0:8f57713b2147 317 m_dongle.tryConnect();
donatien 2:f4d9c4ea17f9 318 Thread::wait(100);
donatien 0:8f57713b2147 319 }
donatien 0:8f57713b2147 320 }
donatien 0:8f57713b2147 321
donatien 0:8f57713b2147 322 if(m_atOpen)
donatien 0:8f57713b2147 323 {
donatien 0:8f57713b2147 324 return OK;
donatien 0:8f57713b2147 325 }
donatien 0:8f57713b2147 326
donatien 0:8f57713b2147 327 DBG("Starting AT thread if needed");
donatien 0:8f57713b2147 328 int ret = m_at.open();
donatien 0:8f57713b2147 329 if(ret)
donatien 0:8f57713b2147 330 {
donatien 0:8f57713b2147 331 return ret;
donatien 0:8f57713b2147 332 }
donatien 0:8f57713b2147 333
donatien 0:8f57713b2147 334 DBG("Sending initialisation commands");
donatien 0:8f57713b2147 335 ret = m_at.init();
donatien 0:8f57713b2147 336 if(ret)
donatien 0:8f57713b2147 337 {
donatien 0:8f57713b2147 338 return ret;
donatien 0:8f57713b2147 339 }
donatien 0:8f57713b2147 340
donatien 0:8f57713b2147 341 if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINT598U)
donatien 0:8f57713b2147 342 {
donatien 0:8f57713b2147 343 INFO("Using a Sprint 598U Dongle");
donatien 0:8f57713b2147 344 }
donatien 13:75171617d543 345 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINTMC5728V)
donatien 13:75171617d543 346 {
donatien 13:75171617d543 347 INFO("Using a Sprint MC5728V Dongle");
donatien 13:75171617d543 348 }
donatien 0:8f57713b2147 349 else
donatien 0:8f57713b2147 350 {
donatien 0:8f57713b2147 351 WARN("Using an Unknown Dongle");
donatien 0:8f57713b2147 352 }
donatien 0:8f57713b2147 353
donatien 0:8f57713b2147 354 ATCommandsInterface::ATResult result;
donatien 0:8f57713b2147 355
donatien 0:8f57713b2147 356 //Wait for network registration
donatien 2:f4d9c4ea17f9 357 CSSProcessor cssProcessor;
donatien 0:8f57713b2147 358 do
donatien 0:8f57713b2147 359 {
donatien 0:8f57713b2147 360 DBG("Waiting for network registration");
donatien 2:f4d9c4ea17f9 361 ret = m_at.execute("AT+CSS?", &cssProcessor, &result);
donatien 0:8f57713b2147 362 DBG("Result of command: Err code=%d\n", ret);
donatien 0:8f57713b2147 363 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
donatien 2:f4d9c4ea17f9 364 if(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING)
donatien 0:8f57713b2147 365 {
donatien 0:8f57713b2147 366 Thread::wait(3000);
donatien 0:8f57713b2147 367 }
donatien 2:f4d9c4ea17f9 368 } while(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING);
donatien 0:8f57713b2147 369
donatien 0:8f57713b2147 370 m_atOpen = true;
donatien 0:8f57713b2147 371
donatien 0:8f57713b2147 372 return OK;
donatien 0:8f57713b2147 373 }
donatien 0:8f57713b2147 374
donatien 2:f4d9c4ea17f9 375 int SprintUSBModem::cleanup()
donatien 2:f4d9c4ea17f9 376 {
donatien 2:f4d9c4ea17f9 377 if(m_ppp.isConnected())
donatien 2:f4d9c4ea17f9 378 {
donatien 2:f4d9c4ea17f9 379 WARN("Data connection is still open"); //Try to encourage good behaviour from the user
donatien 2:f4d9c4ea17f9 380 m_ppp.disconnect();
donatien 2:f4d9c4ea17f9 381 }
donatien 2:f4d9c4ea17f9 382
donatien 2:f4d9c4ea17f9 383 m_smsInit = false;
donatien 2:f4d9c4ea17f9 384 // m_linkMonitorInit = false;
donatien 2:f4d9c4ea17f9 385 //We don't reset m_ipInit as PPPIPInterface::init() only needs to be called once
donatien 2:f4d9c4ea17f9 386
donatien 2:f4d9c4ea17f9 387 if(m_atOpen)
donatien 2:f4d9c4ea17f9 388 {
donatien 2:f4d9c4ea17f9 389 m_at.close();
donatien 2:f4d9c4ea17f9 390 m_atOpen = false;
donatien 2:f4d9c4ea17f9 391 }
donatien 2:f4d9c4ea17f9 392
donatien 2:f4d9c4ea17f9 393 m_dongle.disconnect();
donatien 2:f4d9c4ea17f9 394 m_dongleConnected = false;
donatien 2:f4d9c4ea17f9 395
donatien 2:f4d9c4ea17f9 396 return OK;
donatien 2:f4d9c4ea17f9 397 }
donatien 0:8f57713b2147 398