u-blox USB modems (GSM and CDMA)

Dependencies:   CellularUSBModem

Dependents:   C027_CANInterfaceComm C027_ModemTransparentUSBCDC_revb UbloxModemHTTPClientTest C027_HTTPClientTest ... more

Legacy Networking Libray

This is an mbed 2 networking library. For an mbed OS 5 compatible library, please see:

Import libraryC027Interface

Socket interface for C027Interface. Implements the NetworkSocketAPI

Committer:
mbed_official
Date:
Tue Mar 04 13:51:49 2014 +0000
Revision:
9:71550cccbe73
Parent:
5:60b48a013e86
Use latest version of CellularUSBModem

Who changed what in which revision?

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