Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
sam_grove
Date:
Tue Oct 08 00:08:22 2013 +0000
Revision:
21:3f45e53afe4f
Parent:
8:301426550c6c
Added http client test. Return from post seems to be a bit wonky but haven't looked closely at this

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 5:3f93dd1d4cb3 1 /* SprintUSBModem.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
mike.pulice@proxy-usa.com 7:655438fd019f 20 #define __DEBUG__ 4
sam_grove 5:3f93dd1d4cb3 21 #ifndef __MODULE__
sam_grove 5:3f93dd1d4cb3 22 #define __MODULE__ "SprintUSBModem.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
sam_grove 5:3f93dd1d4cb3 27 #include "SprintUSBModem.h"
sam_grove 5:3f93dd1d4cb3 28
sam_grove 5:3f93dd1d4cb3 29 #define USE_ONE_PORT 1
sam_grove 5:3f93dd1d4cb3 30
mike.pulice@proxy-usa.com 7:655438fd019f 31 SprintUSBModem::SprintUSBModem(PinName powerGatingPin /*= NC*/, bool powerGatingOnWhenPinHigh /* = true*/, int serial /* 0 */) : m_dongle(),
mike.pulice@proxy-usa.com 7:655438fd019f 32 m_stream(m_dongle.getSerial(serial)),
sam_grove 5:3f93dd1d4cb3 33 m_at(&m_stream),
sam_grove 5:3f93dd1d4cb3 34 m_sms(&m_at), m_ppp(&m_stream),
sam_grove 5:3f93dd1d4cb3 35 m_dongleConnected(false), m_ipInit(false), m_smsInit(false), m_atOpen(false),
sam_grove 5:3f93dd1d4cb3 36 m_powerGatingPin(powerGatingPin), m_powerGatingOnWhenPinHigh(powerGatingOnWhenPinHigh)
sam_grove 5:3f93dd1d4cb3 37 {
sam_grove 5:3f93dd1d4cb3 38 if( m_powerGatingPin != NC )
sam_grove 5:3f93dd1d4cb3 39 {
sam_grove 5:3f93dd1d4cb3 40 power(false); //Dongle will have to be powered on manually
sam_grove 5:3f93dd1d4cb3 41 }
sam_grove 5:3f93dd1d4cb3 42 }
sam_grove 5:3f93dd1d4cb3 43
sam_grove 5:3f93dd1d4cb3 44 class CSSProcessor : public IATCommandsProcessor
sam_grove 5:3f93dd1d4cb3 45 {
sam_grove 5:3f93dd1d4cb3 46 public:
sam_grove 5:3f93dd1d4cb3 47 CSSProcessor() : status(STATUS_REGISTERING)
sam_grove 5:3f93dd1d4cb3 48 {
sam_grove 5:3f93dd1d4cb3 49
sam_grove 5:3f93dd1d4cb3 50 }
sam_grove 5:3f93dd1d4cb3 51 enum REGISTERING_STATUS { STATUS_REGISTERING, STATUS_OK };
sam_grove 5:3f93dd1d4cb3 52 REGISTERING_STATUS getStatus()
sam_grove 5:3f93dd1d4cb3 53 {
sam_grove 5:3f93dd1d4cb3 54 return status;
sam_grove 5:3f93dd1d4cb3 55 }
sam_grove 5:3f93dd1d4cb3 56 private:
sam_grove 5:3f93dd1d4cb3 57 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
sam_grove 5:3f93dd1d4cb3 58 {
mike.pulice@proxy-usa.com 8:301426550c6c 59 char b;
mike.pulice@proxy-usa.com 8:301426550c6c 60 char bc[3] = "";
mike.pulice@proxy-usa.com 8:301426550c6c 61 int sid = 99999;
mike.pulice@proxy-usa.com 8:301426550c6c 62
mike.pulice@proxy-usa.com 8:301426550c6c 63 //if( sscanf(line, "%*d, %c", &r) == 1 )
mike.pulice@proxy-usa.com 8:301426550c6c 64 if(sscanf(line, "%*s %c,%2s,%d", &b,bc,&sid)==3)
mike.pulice@proxy-usa.com 8:301426550c6c 65 {
mike.pulice@proxy-usa.com 8:301426550c6c 66 if(strcmp("Z", bc) == 0)
mike.pulice@proxy-usa.com 8:301426550c6c 67 status = STATUS_REGISTERING;
mike.pulice@proxy-usa.com 8:301426550c6c 68 else
mike.pulice@proxy-usa.com 8:301426550c6c 69 status = STATUS_OK;
sam_grove 5:3f93dd1d4cb3 70 }
sam_grove 5:3f93dd1d4cb3 71 return OK;
sam_grove 5:3f93dd1d4cb3 72 }
sam_grove 5:3f93dd1d4cb3 73 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
sam_grove 5:3f93dd1d4cb3 74 {
sam_grove 5:3f93dd1d4cb3 75 return OK;
sam_grove 5:3f93dd1d4cb3 76 }
sam_grove 5:3f93dd1d4cb3 77 volatile REGISTERING_STATUS status;
sam_grove 5:3f93dd1d4cb3 78 };
sam_grove 5:3f93dd1d4cb3 79
sam_grove 5:3f93dd1d4cb3 80 int SprintUSBModem::connect(const char* apn, const char* user, const char* password)
sam_grove 5:3f93dd1d4cb3 81 {
sam_grove 5:3f93dd1d4cb3 82 if( !m_ipInit )
sam_grove 5:3f93dd1d4cb3 83 {
sam_grove 5:3f93dd1d4cb3 84 m_ipInit = true;
sam_grove 5:3f93dd1d4cb3 85 m_ppp.init();
sam_grove 5:3f93dd1d4cb3 86 }
sam_grove 5:3f93dd1d4cb3 87 m_ppp.setup(user, password);
sam_grove 5:3f93dd1d4cb3 88
sam_grove 5:3f93dd1d4cb3 89 int ret = init();
sam_grove 5:3f93dd1d4cb3 90 if(ret)
sam_grove 5:3f93dd1d4cb3 91 {
sam_grove 5:3f93dd1d4cb3 92 return ret;
sam_grove 5:3f93dd1d4cb3 93 }
sam_grove 5:3f93dd1d4cb3 94
sam_grove 5:3f93dd1d4cb3 95 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 96 m_smsInit = false; //SMS status reset
sam_grove 5:3f93dd1d4cb3 97 //m_ussdInit = false; //USSD status reset
sam_grove 5:3f93dd1d4cb3 98 //m_linkMonitorInit = false; //Link monitor status reset
sam_grove 5:3f93dd1d4cb3 99 #endif
sam_grove 5:3f93dd1d4cb3 100
sam_grove 5:3f93dd1d4cb3 101 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 102
sam_grove 5:3f93dd1d4cb3 103 if(apn != NULL)
sam_grove 5:3f93dd1d4cb3 104 {
sam_grove 5:3f93dd1d4cb3 105 char cmd[48];
sam_grove 5:3f93dd1d4cb3 106 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
sam_grove 5:3f93dd1d4cb3 107 ret = m_at.executeSimple(cmd, &result);
sam_grove 5:3f93dd1d4cb3 108 DBG("Result of command: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 109 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 110 DBG("APN set to %s", apn);
sam_grove 5:3f93dd1d4cb3 111 }
sam_grove 5:3f93dd1d4cb3 112
sam_grove 5:3f93dd1d4cb3 113
sam_grove 5:3f93dd1d4cb3 114 //Connect
sam_grove 5:3f93dd1d4cb3 115 DBG("Connecting");
sam_grove 5:3f93dd1d4cb3 116 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 117 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 118 m_atOpen = false; //Will need to be reinitialized afterwards
sam_grove 5:3f93dd1d4cb3 119 #endif
sam_grove 5:3f93dd1d4cb3 120
sam_grove 5:3f93dd1d4cb3 121 DBG("Connecting PPP");
sam_grove 5:3f93dd1d4cb3 122
sam_grove 5:3f93dd1d4cb3 123 ret = m_ppp.connect();
sam_grove 5:3f93dd1d4cb3 124 DBG("Result of connect: Err code=%d", ret);
sam_grove 5:3f93dd1d4cb3 125 return ret;
sam_grove 5:3f93dd1d4cb3 126 }
sam_grove 5:3f93dd1d4cb3 127
sam_grove 5:3f93dd1d4cb3 128
sam_grove 5:3f93dd1d4cb3 129 int SprintUSBModem::disconnect()
sam_grove 5:3f93dd1d4cb3 130 {
sam_grove 5:3f93dd1d4cb3 131 DBG("Disconnecting from PPP");
sam_grove 5:3f93dd1d4cb3 132 int ret = m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 133 if(ret)
sam_grove 5:3f93dd1d4cb3 134 {
sam_grove 5:3f93dd1d4cb3 135 ERR("Disconnect returned %d, still trying to disconnect", ret);
sam_grove 5:3f93dd1d4cb3 136 }
sam_grove 5:3f93dd1d4cb3 137
sam_grove 5:3f93dd1d4cb3 138 //Ugly but leave dongle time to recover
sam_grove 5:3f93dd1d4cb3 139 Thread::wait(500);
sam_grove 5:3f93dd1d4cb3 140
sam_grove 5:3f93dd1d4cb3 141 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 142 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 143 DBG("Starting AT thread");
sam_grove 5:3f93dd1d4cb3 144 ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 145 if(ret)
sam_grove 5:3f93dd1d4cb3 146 {
sam_grove 5:3f93dd1d4cb3 147 return ret;
sam_grove 5:3f93dd1d4cb3 148 }
sam_grove 5:3f93dd1d4cb3 149 #endif
sam_grove 5:3f93dd1d4cb3 150
sam_grove 5:3f93dd1d4cb3 151 DBG("Trying to hangup");
sam_grove 5:3f93dd1d4cb3 152
sam_grove 5:3f93dd1d4cb3 153 #if 0 //Does not appear to work
sam_grove 5:3f93dd1d4cb3 154 int tries = 10;
sam_grove 5:3f93dd1d4cb3 155 do
sam_grove 5:3f93dd1d4cb3 156 {
sam_grove 5:3f93dd1d4cb3 157 ret = m_at.executeSimple("+++", &result, 1000);
sam_grove 5:3f93dd1d4cb3 158 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 159 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 160 } while(tries-- && ret);
sam_grove 5:3f93dd1d4cb3 161 if(!ret)
sam_grove 5:3f93dd1d4cb3 162 {
sam_grove 5:3f93dd1d4cb3 163 ret = m_at.executeSimple("ATH", &result);
sam_grove 5:3f93dd1d4cb3 164 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 165 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 166 }
sam_grove 5:3f93dd1d4cb3 167 #endif
sam_grove 5:3f93dd1d4cb3 168
sam_grove 5:3f93dd1d4cb3 169 #if USE_ONE_PORT
sam_grove 5:3f93dd1d4cb3 170 //Reinit AT parser
sam_grove 5:3f93dd1d4cb3 171 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 172 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 173 if(ret)
sam_grove 5:3f93dd1d4cb3 174 {
sam_grove 5:3f93dd1d4cb3 175 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 176 DBG("AT Parser closed, could not complete disconnection");
sam_grove 5:3f93dd1d4cb3 177 return NET_TIMEOUT;
sam_grove 5:3f93dd1d4cb3 178 }
sam_grove 5:3f93dd1d4cb3 179
sam_grove 5:3f93dd1d4cb3 180 #if 0
sam_grove 5:3f93dd1d4cb3 181 m_at.close(); // Closing AT parser
sam_grove 5:3f93dd1d4cb3 182 DBG("AT Parser closed");
sam_grove 5:3f93dd1d4cb3 183 #endif
sam_grove 5:3f93dd1d4cb3 184 #endif
sam_grove 5:3f93dd1d4cb3 185 return OK;
sam_grove 5:3f93dd1d4cb3 186 }
sam_grove 5:3f93dd1d4cb3 187
sam_grove 5:3f93dd1d4cb3 188 int SprintUSBModem::sendSM(const char* number, const char* message)
sam_grove 5:3f93dd1d4cb3 189 {
sam_grove 5:3f93dd1d4cb3 190 int ret = init();
sam_grove 5:3f93dd1d4cb3 191 if(ret)
sam_grove 5:3f93dd1d4cb3 192 {
sam_grove 5:3f93dd1d4cb3 193 return ret;
sam_grove 5:3f93dd1d4cb3 194 }
sam_grove 5:3f93dd1d4cb3 195
sam_grove 5:3f93dd1d4cb3 196 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 197 {
sam_grove 5:3f93dd1d4cb3 198 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 199 if(ret)
sam_grove 5:3f93dd1d4cb3 200 {
sam_grove 5:3f93dd1d4cb3 201 return ret;
sam_grove 5:3f93dd1d4cb3 202 }
sam_grove 5:3f93dd1d4cb3 203 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 204 }
sam_grove 5:3f93dd1d4cb3 205
sam_grove 5:3f93dd1d4cb3 206 ret = m_sms.send(number, message);
sam_grove 5:3f93dd1d4cb3 207 if(ret)
sam_grove 5:3f93dd1d4cb3 208 {
sam_grove 5:3f93dd1d4cb3 209 return ret;
sam_grove 5:3f93dd1d4cb3 210 }
sam_grove 5:3f93dd1d4cb3 211
sam_grove 5:3f93dd1d4cb3 212 return OK;
sam_grove 5:3f93dd1d4cb3 213 }
sam_grove 5:3f93dd1d4cb3 214
sam_grove 5:3f93dd1d4cb3 215 int SprintUSBModem::getSM(char* number, char* message, size_t maxLength)
sam_grove 5:3f93dd1d4cb3 216 {
sam_grove 5:3f93dd1d4cb3 217 int ret = init();
sam_grove 5:3f93dd1d4cb3 218 if(ret)
sam_grove 5:3f93dd1d4cb3 219 {
sam_grove 5:3f93dd1d4cb3 220 return ret;
sam_grove 5:3f93dd1d4cb3 221 }
sam_grove 5:3f93dd1d4cb3 222
sam_grove 5:3f93dd1d4cb3 223 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 224 {
sam_grove 5:3f93dd1d4cb3 225 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 226 if(ret)
sam_grove 5:3f93dd1d4cb3 227 {
sam_grove 5:3f93dd1d4cb3 228 return ret;
sam_grove 5:3f93dd1d4cb3 229 }
sam_grove 5:3f93dd1d4cb3 230 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 231 }
sam_grove 5:3f93dd1d4cb3 232
sam_grove 5:3f93dd1d4cb3 233 ret = m_sms.get(number, message, maxLength);
sam_grove 5:3f93dd1d4cb3 234 if(ret)
sam_grove 5:3f93dd1d4cb3 235 {
sam_grove 5:3f93dd1d4cb3 236 return ret;
sam_grove 5:3f93dd1d4cb3 237 }
sam_grove 5:3f93dd1d4cb3 238
sam_grove 5:3f93dd1d4cb3 239 return OK;
sam_grove 5:3f93dd1d4cb3 240 }
sam_grove 5:3f93dd1d4cb3 241
sam_grove 5:3f93dd1d4cb3 242 int SprintUSBModem::getSMCount(size_t* pCount)
sam_grove 5:3f93dd1d4cb3 243 {
sam_grove 5:3f93dd1d4cb3 244 int ret = init();
sam_grove 5:3f93dd1d4cb3 245 if(ret)
sam_grove 5:3f93dd1d4cb3 246 {
sam_grove 5:3f93dd1d4cb3 247 return ret;
sam_grove 5:3f93dd1d4cb3 248 }
sam_grove 5:3f93dd1d4cb3 249
sam_grove 5:3f93dd1d4cb3 250 if(!m_smsInit)
sam_grove 5:3f93dd1d4cb3 251 {
sam_grove 5:3f93dd1d4cb3 252 ret = m_sms.init();
sam_grove 5:3f93dd1d4cb3 253 if(ret)
sam_grove 5:3f93dd1d4cb3 254 {
sam_grove 5:3f93dd1d4cb3 255 return ret;
sam_grove 5:3f93dd1d4cb3 256 }
sam_grove 5:3f93dd1d4cb3 257 m_smsInit = true;
sam_grove 5:3f93dd1d4cb3 258 }
sam_grove 5:3f93dd1d4cb3 259
sam_grove 5:3f93dd1d4cb3 260 ret = m_sms.getCount(pCount);
sam_grove 5:3f93dd1d4cb3 261 if(ret)
sam_grove 5:3f93dd1d4cb3 262 {
sam_grove 5:3f93dd1d4cb3 263 return ret;
sam_grove 5:3f93dd1d4cb3 264 }
sam_grove 5:3f93dd1d4cb3 265
sam_grove 5:3f93dd1d4cb3 266 return OK;
sam_grove 5:3f93dd1d4cb3 267 }
sam_grove 5:3f93dd1d4cb3 268
sam_grove 5:3f93dd1d4cb3 269 ATCommandsInterface* SprintUSBModem::getATCommandsInterface()
sam_grove 5:3f93dd1d4cb3 270 {
sam_grove 5:3f93dd1d4cb3 271 return &m_at;
sam_grove 5:3f93dd1d4cb3 272 }
sam_grove 5:3f93dd1d4cb3 273
sam_grove 5:3f93dd1d4cb3 274 int SprintUSBModem::power(bool enable)
sam_grove 5:3f93dd1d4cb3 275 {
sam_grove 5:3f93dd1d4cb3 276 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 277 {
sam_grove 5:3f93dd1d4cb3 278 return NET_INVALID; //A pin name has not been provided in the constructor
sam_grove 5:3f93dd1d4cb3 279 }
sam_grove 5:3f93dd1d4cb3 280
sam_grove 5:3f93dd1d4cb3 281 if(!enable) //Will force components to re-init
sam_grove 5:3f93dd1d4cb3 282 {
sam_grove 5:3f93dd1d4cb3 283 cleanup();
sam_grove 5:3f93dd1d4cb3 284 }
sam_grove 5:3f93dd1d4cb3 285
sam_grove 5:3f93dd1d4cb3 286 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 287 powerGatingOut = m_powerGatingOnWhenPinHigh?enable:!enable;
sam_grove 5:3f93dd1d4cb3 288
sam_grove 5:3f93dd1d4cb3 289 return OK;
sam_grove 5:3f93dd1d4cb3 290 }
sam_grove 5:3f93dd1d4cb3 291
sam_grove 5:3f93dd1d4cb3 292 bool SprintUSBModem::power()
sam_grove 5:3f93dd1d4cb3 293 {
sam_grove 5:3f93dd1d4cb3 294 if( m_powerGatingPin == NC )
sam_grove 5:3f93dd1d4cb3 295 {
sam_grove 5:3f93dd1d4cb3 296 return true; //Assume power is always on
sam_grove 5:3f93dd1d4cb3 297 }
sam_grove 5:3f93dd1d4cb3 298
sam_grove 5:3f93dd1d4cb3 299 DigitalOut powerGatingOut(m_powerGatingPin);
sam_grove 5:3f93dd1d4cb3 300 return m_powerGatingOnWhenPinHigh?powerGatingOut:!powerGatingOut;
sam_grove 5:3f93dd1d4cb3 301 }
sam_grove 5:3f93dd1d4cb3 302
sam_grove 5:3f93dd1d4cb3 303 int SprintUSBModem::init()
sam_grove 5:3f93dd1d4cb3 304 {
sam_grove 5:3f93dd1d4cb3 305 if( !m_dongleConnected )
sam_grove 5:3f93dd1d4cb3 306 {
sam_grove 5:3f93dd1d4cb3 307 if(!power())
sam_grove 5:3f93dd1d4cb3 308 {
sam_grove 5:3f93dd1d4cb3 309 //Obviously cannot initialize the dongle if it is disconnected...
sam_grove 5:3f93dd1d4cb3 310 ERR("Power is off");
sam_grove 5:3f93dd1d4cb3 311 return NET_INVALID;
sam_grove 5:3f93dd1d4cb3 312 }
sam_grove 5:3f93dd1d4cb3 313 m_dongleConnected = true;
sam_grove 5:3f93dd1d4cb3 314 while( !m_dongle.connected() )
sam_grove 5:3f93dd1d4cb3 315 {
sam_grove 5:3f93dd1d4cb3 316 m_dongle.tryConnect();
sam_grove 5:3f93dd1d4cb3 317 Thread::wait(100);
sam_grove 5:3f93dd1d4cb3 318 }
sam_grove 5:3f93dd1d4cb3 319 }
sam_grove 5:3f93dd1d4cb3 320
sam_grove 5:3f93dd1d4cb3 321 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 322 {
sam_grove 5:3f93dd1d4cb3 323 return OK;
sam_grove 5:3f93dd1d4cb3 324 }
sam_grove 5:3f93dd1d4cb3 325
sam_grove 5:3f93dd1d4cb3 326 DBG("Starting AT thread if needed");
sam_grove 5:3f93dd1d4cb3 327 int ret = m_at.open();
sam_grove 5:3f93dd1d4cb3 328 if(ret)
sam_grove 5:3f93dd1d4cb3 329 {
sam_grove 5:3f93dd1d4cb3 330 return ret;
sam_grove 5:3f93dd1d4cb3 331 }
sam_grove 5:3f93dd1d4cb3 332
sam_grove 5:3f93dd1d4cb3 333 DBG("Sending initialisation commands");
sam_grove 5:3f93dd1d4cb3 334 ret = m_at.init();
sam_grove 5:3f93dd1d4cb3 335 if(ret)
sam_grove 5:3f93dd1d4cb3 336 {
sam_grove 5:3f93dd1d4cb3 337 return ret;
sam_grove 5:3f93dd1d4cb3 338 }
sam_grove 5:3f93dd1d4cb3 339
sam_grove 5:3f93dd1d4cb3 340 if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINT598U)
sam_grove 5:3f93dd1d4cb3 341 {
sam_grove 5:3f93dd1d4cb3 342 INFO("Using a Sprint 598U Dongle");
sam_grove 5:3f93dd1d4cb3 343 }
sam_grove 5:3f93dd1d4cb3 344 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_SPRINTMC5728V)
sam_grove 5:3f93dd1d4cb3 345 {
sam_grove 5:3f93dd1d4cb3 346 INFO("Using a Sprint MC5728V Dongle");
sam_grove 5:3f93dd1d4cb3 347 }
sam_grove 5:3f93dd1d4cb3 348 else if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_UBLOXC200)
sam_grove 5:3f93dd1d4cb3 349 {
sam_grove 5:3f93dd1d4cb3 350 INFO("Using a UBLOX C200 Dongle");
sam_grove 5:3f93dd1d4cb3 351 }
sam_grove 5:3f93dd1d4cb3 352 else
sam_grove 5:3f93dd1d4cb3 353 {
sam_grove 5:3f93dd1d4cb3 354 WARN("Using an Unknown Dongle");
sam_grove 5:3f93dd1d4cb3 355 }
sam_grove 5:3f93dd1d4cb3 356
sam_grove 5:3f93dd1d4cb3 357 ATCommandsInterface::ATResult result;
sam_grove 5:3f93dd1d4cb3 358
sam_grove 5:3f93dd1d4cb3 359 //Wait for network registration
sam_grove 5:3f93dd1d4cb3 360 CSSProcessor cssProcessor;
sam_grove 5:3f93dd1d4cb3 361 do
sam_grove 5:3f93dd1d4cb3 362 {
sam_grove 5:3f93dd1d4cb3 363 DBG("Waiting for network registration");
sam_grove 5:3f93dd1d4cb3 364 ret = m_at.execute("AT+CSS?", &cssProcessor, &result);
sam_grove 5:3f93dd1d4cb3 365 DBG("Result of command: Err code=%d\n", ret);
sam_grove 5:3f93dd1d4cb3 366 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
sam_grove 5:3f93dd1d4cb3 367 if(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING)
sam_grove 5:3f93dd1d4cb3 368 {
sam_grove 5:3f93dd1d4cb3 369 Thread::wait(3000);
sam_grove 5:3f93dd1d4cb3 370 }
sam_grove 5:3f93dd1d4cb3 371 } while(cssProcessor.getStatus() == CSSProcessor::STATUS_REGISTERING);
sam_grove 5:3f93dd1d4cb3 372
sam_grove 5:3f93dd1d4cb3 373 m_atOpen = true;
sam_grove 5:3f93dd1d4cb3 374
sam_grove 5:3f93dd1d4cb3 375 return OK;
sam_grove 5:3f93dd1d4cb3 376 }
sam_grove 5:3f93dd1d4cb3 377
sam_grove 5:3f93dd1d4cb3 378 int SprintUSBModem::cleanup()
sam_grove 5:3f93dd1d4cb3 379 {
sam_grove 5:3f93dd1d4cb3 380 if(m_ppp.isConnected())
sam_grove 5:3f93dd1d4cb3 381 {
sam_grove 5:3f93dd1d4cb3 382 WARN("Data connection is still open"); //Try to encourage good behaviour from the user
sam_grove 5:3f93dd1d4cb3 383 m_ppp.disconnect();
sam_grove 5:3f93dd1d4cb3 384 }
sam_grove 5:3f93dd1d4cb3 385
sam_grove 5:3f93dd1d4cb3 386 m_smsInit = false;
sam_grove 5:3f93dd1d4cb3 387 // m_linkMonitorInit = false;
sam_grove 5:3f93dd1d4cb3 388 //We don't reset m_ipInit as PPPIPInterface::init() only needs to be called once
sam_grove 5:3f93dd1d4cb3 389
sam_grove 5:3f93dd1d4cb3 390 if(m_atOpen)
sam_grove 5:3f93dd1d4cb3 391 {
sam_grove 5:3f93dd1d4cb3 392 m_at.close();
sam_grove 5:3f93dd1d4cb3 393 m_atOpen = false;
sam_grove 5:3f93dd1d4cb3 394 }
sam_grove 5:3f93dd1d4cb3 395
sam_grove 5:3f93dd1d4cb3 396 m_dongle.disconnect();
sam_grove 5:3f93dd1d4cb3 397 m_dongleConnected = false;
sam_grove 5:3f93dd1d4cb3 398
sam_grove 5:3f93dd1d4cb3 399 return OK;
sam_grove 5:3f93dd1d4cb3 400 }
sam_grove 5:3f93dd1d4cb3 401