ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
jacobjohnson
Date:
Mon Feb 27 17:45:05 2017 +0000
Revision:
1:f30bdcd2b33b
Parent:
0:098463de4c5d
changed the inputscale from 1 to 7 in analogin_api.c.  This will need to be changed later, and accessed from the main level, but for now this allows the  adc to read a value from 0 to 3.7V, instead of just up to 1V.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /* UbloxUSBGSMModem.cpp */
group-onsemi 0:098463de4c5d 2 /* Copyright (C) 2012 mbed.org, MIT License
group-onsemi 0:098463de4c5d 3 *
group-onsemi 0:098463de4c5d 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
group-onsemi 0:098463de4c5d 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
group-onsemi 0:098463de4c5d 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
group-onsemi 0:098463de4c5d 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
group-onsemi 0:098463de4c5d 8 * furnished to do so, subject to the following conditions:
group-onsemi 0:098463de4c5d 9 *
group-onsemi 0:098463de4c5d 10 * The above copyright notice and this permission notice shall be included in all copies or
group-onsemi 0:098463de4c5d 11 * substantial portions of the Software.
group-onsemi 0:098463de4c5d 12 *
group-onsemi 0:098463de4c5d 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
group-onsemi 0:098463de4c5d 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
group-onsemi 0:098463de4c5d 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
group-onsemi 0:098463de4c5d 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
group-onsemi 0:098463de4c5d 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
group-onsemi 0:098463de4c5d 18 */
group-onsemi 0:098463de4c5d 19
group-onsemi 0:098463de4c5d 20 #define __DEBUG__ 3
group-onsemi 0:098463de4c5d 21 #ifndef __MODULE__
group-onsemi 0:098463de4c5d 22 #define __MODULE__ "UbloxUSBGSMModem.cpp"
group-onsemi 0:098463de4c5d 23 #endif
group-onsemi 0:098463de4c5d 24
group-onsemi 0:098463de4c5d 25 #include "core/fwk.h"
group-onsemi 0:098463de4c5d 26
group-onsemi 0:098463de4c5d 27 #include "UbloxUSBGSMModem.h"
group-onsemi 0:098463de4c5d 28 #include "UbloxGSMModemInitializer.h"
group-onsemi 0:098463de4c5d 29 #include "USBHost.h"
group-onsemi 0:098463de4c5d 30
group-onsemi 0:098463de4c5d 31 UbloxUSBGSMModem::UbloxUSBGSMModem(PinName powerGatingPin /*= NC*/, bool powerGatingOnWhenPinHigh /* = true*/) :
group-onsemi 0:098463de4c5d 32 m_dongle(), // Construct WANDongle: USB interface with two serial channels to the modem (USBSerialStream objects)
group-onsemi 0:098463de4c5d 33 m_atStream(m_dongle.getSerial(1)), // AT commands are sent down one serial channel.
group-onsemi 0:098463de4c5d 34 m_pppStream(m_dongle.getSerial(0)), // PPP connections are managed via another serial channel.
group-onsemi 0:098463de4c5d 35 m_at(&m_atStream), // Construct ATCommandsInterface with the AT serial channel
group-onsemi 0:098463de4c5d 36 m_sms(&m_at), // Construct SMSInterface with the ATCommandsInterface
group-onsemi 0:098463de4c5d 37 m_ussd(&m_at), // Construct USSDInterface with the ATCommandsInterface
group-onsemi 0:098463de4c5d 38 m_linkMonitor(&m_at), // Construct LinkMonitor with the ATCommandsInterface
group-onsemi 0:098463de4c5d 39 m_ppp(&m_pppStream), // Construct PPPIPInterface with the PPP serial channel
group-onsemi 0:098463de4c5d 40 m_dongleConnected(false), // Dongle is initially not ready for anything
group-onsemi 0:098463de4c5d 41 m_ipInit(false), // PPIPInterface connection is initially down
group-onsemi 0:098463de4c5d 42 m_smsInit(false), // SMSInterface starts un-initialised
group-onsemi 0:098463de4c5d 43 m_ussdInit(false), // USSDInterface starts un-initialised
group-onsemi 0:098463de4c5d 44 m_linkMonitorInit(false), // LinkMonitor subsystem starts un-initialised
group-onsemi 0:098463de4c5d 45 m_atOpen(false), // ATCommandsInterface starts in a closed state
group-onsemi 0:098463de4c5d 46 m_powerGatingPin(powerGatingPin), // set power gating pin
group-onsemi 0:098463de4c5d 47 m_powerGatingOnWhenPinHigh(powerGatingOnWhenPinHigh) // set state semantics for power gating pin
group-onsemi 0:098463de4c5d 48 {
group-onsemi 0:098463de4c5d 49 USBHost* host = USBHost::getHostInst();
group-onsemi 0:098463de4c5d 50 m_dongle.addInitializer(new UbloxGSMModemInitializer(host));
group-onsemi 0:098463de4c5d 51 if( m_powerGatingPin != NC )
group-onsemi 0:098463de4c5d 52 {
group-onsemi 0:098463de4c5d 53 power(false); //Dongle will have to be powered on manually
group-onsemi 0:098463de4c5d 54 }
group-onsemi 0:098463de4c5d 55 }
group-onsemi 0:098463de4c5d 56
group-onsemi 0:098463de4c5d 57 class CREGProcessor : public IATCommandsProcessor
group-onsemi 0:098463de4c5d 58 {
group-onsemi 0:098463de4c5d 59 public:
group-onsemi 0:098463de4c5d 60 CREGProcessor() : status(STATUS_REGISTERING)
group-onsemi 0:098463de4c5d 61 {
group-onsemi 0:098463de4c5d 62
group-onsemi 0:098463de4c5d 63 }
group-onsemi 0:098463de4c5d 64 enum REGISTERING_STATUS { STATUS_REGISTERING, STATUS_OK, STATUS_FAILED };
group-onsemi 0:098463de4c5d 65 REGISTERING_STATUS getStatus()
group-onsemi 0:098463de4c5d 66 {
group-onsemi 0:098463de4c5d 67 return status;
group-onsemi 0:098463de4c5d 68 }
group-onsemi 0:098463de4c5d 69 private:
group-onsemi 0:098463de4c5d 70 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
group-onsemi 0:098463de4c5d 71 {
group-onsemi 0:098463de4c5d 72 int r;
group-onsemi 0:098463de4c5d 73 if( sscanf(line, "+CREG: %*d,%d", &r) == 1 )
group-onsemi 0:098463de4c5d 74 {
group-onsemi 0:098463de4c5d 75 switch(r)
group-onsemi 0:098463de4c5d 76 {
group-onsemi 0:098463de4c5d 77 case 1:
group-onsemi 0:098463de4c5d 78 case 5:
group-onsemi 0:098463de4c5d 79 status = STATUS_OK;
group-onsemi 0:098463de4c5d 80 break;
group-onsemi 0:098463de4c5d 81 case 0:
group-onsemi 0:098463de4c5d 82 case 2:
group-onsemi 0:098463de4c5d 83 status = STATUS_REGISTERING;
group-onsemi 0:098463de4c5d 84 break;
group-onsemi 0:098463de4c5d 85 case 3:
group-onsemi 0:098463de4c5d 86 default:
group-onsemi 0:098463de4c5d 87 status = STATUS_FAILED;
group-onsemi 0:098463de4c5d 88 break;
group-onsemi 0:098463de4c5d 89 }
group-onsemi 0:098463de4c5d 90 }
group-onsemi 0:098463de4c5d 91 return OK;
group-onsemi 0:098463de4c5d 92 }
group-onsemi 0:098463de4c5d 93 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
group-onsemi 0:098463de4c5d 94 {
group-onsemi 0:098463de4c5d 95 return OK;
group-onsemi 0:098463de4c5d 96 }
group-onsemi 0:098463de4c5d 97 volatile REGISTERING_STATUS status;
group-onsemi 0:098463de4c5d 98 };
group-onsemi 0:098463de4c5d 99
group-onsemi 0:098463de4c5d 100 #if 0
group-onsemi 0:098463de4c5d 101 class COPSProcessor : public IATCommandsProcessor
group-onsemi 0:098463de4c5d 102 {
group-onsemi 0:098463de4c5d 103 public:
group-onsemi 0:098463de4c5d 104 COPSProcessor() : valid(false)
group-onsemi 0:098463de4c5d 105 {
group-onsemi 0:098463de4c5d 106 network[0] = '\0';
group-onsemi 0:098463de4c5d 107 apn[0] = '\0';
group-onsemi 0:098463de4c5d 108 bearer[0] = '\0';
group-onsemi 0:098463de4c5d 109 }
group-onsemi 0:098463de4c5d 110 char* getNetwork()
group-onsemi 0:098463de4c5d 111 {
group-onsemi 0:098463de4c5d 112 return network;
group-onsemi 0:098463de4c5d 113 }
group-onsemi 0:098463de4c5d 114 char* getAPN()
group-onsemi 0:098463de4c5d 115 {
group-onsemi 0:098463de4c5d 116 return apn;
group-onsemi 0:098463de4c5d 117 }
group-onsemi 0:098463de4c5d 118 char* getBearer()
group-onsemi 0:098463de4c5d 119 {
group-onsemi 0:098463de4c5d 120 return bearer;
group-onsemi 0:098463de4c5d 121 }
group-onsemi 0:098463de4c5d 122 bool isValid()
group-onsemi 0:098463de4c5d 123 {
group-onsemi 0:098463de4c5d 124 return valid;
group-onsemi 0:098463de4c5d 125 }
group-onsemi 0:098463de4c5d 126 private:
group-onsemi 0:098463de4c5d 127 virtual int onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
group-onsemi 0:098463de4c5d 128 {
group-onsemi 0:098463de4c5d 129 int networkId;
group-onsemi 0:098463de4c5d 130 int bearerId;
group-onsemi 0:098463de4c5d 131 int s = sscanf(line, "+COPS: %*d,%*d,\"%d\",%d", &networkId, &bearerId);
group-onsemi 0:098463de4c5d 132 if( s == 2 )
group-onsemi 0:098463de4c5d 133 {
group-onsemi 0:098463de4c5d 134 switch(networkId)
group-onsemi 0:098463de4c5d 135 {
group-onsemi 0:098463de4c5d 136 case 23415:
group-onsemi 0:098463de4c5d 137 strcpy(network, "Vodafone UK");
group-onsemi 0:098463de4c5d 138 strcpy(apn, "pp.vodafone.co.uk");
group-onsemi 0:098463de4c5d 139 valid = true;
group-onsemi 0:098463de4c5d 140 break;
group-onsemi 0:098463de4c5d 141 case 20810:
group-onsemi 0:098463de4c5d 142 strcpy(network, "SFR FR");
group-onsemi 0:098463de4c5d 143 strcpy(apn, "websfr");
group-onsemi 0:098463de4c5d 144 valid = true;
group-onsemi 0:098463de4c5d 145 break;
group-onsemi 0:098463de4c5d 146 default:
group-onsemi 0:098463de4c5d 147 break;
group-onsemi 0:098463de4c5d 148 }
group-onsemi 0:098463de4c5d 149 }
group-onsemi 0:098463de4c5d 150 else
group-onsemi 0:098463de4c5d 151 {
group-onsemi 0:098463de4c5d 152 return OK;
group-onsemi 0:098463de4c5d 153 }
group-onsemi 0:098463de4c5d 154 switch(bearerId)
group-onsemi 0:098463de4c5d 155 {
group-onsemi 0:098463de4c5d 156 case 0: strcpy(bearer, "GSM"); break;
group-onsemi 0:098463de4c5d 157 case 1: strcpy(bearer, "GSM Compact"); break;
group-onsemi 0:098463de4c5d 158 case 2: strcpy(bearer, "UTRAN"); break;
group-onsemi 0:098463de4c5d 159 case 3: strcpy(bearer, "GSM w/EGPRS"); break;
group-onsemi 0:098463de4c5d 160 case 4: strcpy(bearer, "UTRAN w/HSDPA"); break;
group-onsemi 0:098463de4c5d 161 case 5: strcpy(bearer, "UTRAN w/HSUPA"); break;
group-onsemi 0:098463de4c5d 162 case 6: strcpy(bearer, "UTRAN w/HSDPA and HSUPA"); break;
group-onsemi 0:098463de4c5d 163 case 7: strcpy(bearer, "E-UTRAN"); break;
group-onsemi 0:098463de4c5d 164
group-onsemi 0:098463de4c5d 165 default:
group-onsemi 0:098463de4c5d 166 break;
group-onsemi 0:098463de4c5d 167 }
group-onsemi 0:098463de4c5d 168 return OK;
group-onsemi 0:098463de4c5d 169 }
group-onsemi 0:098463de4c5d 170 virtual int onNewEntryPrompt(ATCommandsInterface* pInst)
group-onsemi 0:098463de4c5d 171 {
group-onsemi 0:098463de4c5d 172 return OK;
group-onsemi 0:098463de4c5d 173 }
group-onsemi 0:098463de4c5d 174 char network[24];
group-onsemi 0:098463de4c5d 175 char bearer[24];
group-onsemi 0:098463de4c5d 176 char apn[24];
group-onsemi 0:098463de4c5d 177 volatile bool valid;
group-onsemi 0:098463de4c5d 178 };
group-onsemi 0:098463de4c5d 179 #endif
group-onsemi 0:098463de4c5d 180
group-onsemi 0:098463de4c5d 181 int UbloxUSBGSMModem::connect(const char* apn, const char* user, const char* password)
group-onsemi 0:098463de4c5d 182 {
group-onsemi 0:098463de4c5d 183 if( !m_ipInit )
group-onsemi 0:098463de4c5d 184 {
group-onsemi 0:098463de4c5d 185 m_ipInit = true;
group-onsemi 0:098463de4c5d 186 m_ppp.init();
group-onsemi 0:098463de4c5d 187 }
group-onsemi 0:098463de4c5d 188 m_ppp.setup(user, password, DEFAULT_MSISDN_GSM);
group-onsemi 0:098463de4c5d 189
group-onsemi 0:098463de4c5d 190 int ret = init();
group-onsemi 0:098463de4c5d 191 if(ret)
group-onsemi 0:098463de4c5d 192 {
group-onsemi 0:098463de4c5d 193 return ret;
group-onsemi 0:098463de4c5d 194 }
group-onsemi 0:098463de4c5d 195
group-onsemi 0:098463de4c5d 196 #if USE_ONE_PORT
group-onsemi 0:098463de4c5d 197 m_smsInit = false; //SMS status reset
group-onsemi 0:098463de4c5d 198 m_ussdInit = false; //USSD status reset
group-onsemi 0:098463de4c5d 199 m_linkMonitorInit = false; //Link monitor status reset
group-onsemi 0:098463de4c5d 200 #endif
group-onsemi 0:098463de4c5d 201
group-onsemi 0:098463de4c5d 202 ATCommandsInterface::ATResult result;
group-onsemi 0:098463de4c5d 203
group-onsemi 0:098463de4c5d 204 #if 0
group-onsemi 0:098463de4c5d 205 //Get network info & select corresponding APN
group-onsemi 0:098463de4c5d 206 COPSProcessor copsProcessor;
group-onsemi 0:098463de4c5d 207 DBG("Get network info & select APN from DB");
group-onsemi 0:098463de4c5d 208 ret = m_at.execute("AT+COPS=,2;+COPS?", &copsProcessor, &result); //Configure to get operator's info in numeric code & get operator's id
group-onsemi 0:098463de4c5d 209 DBG("Result of command: Err code=%d", ret);
group-onsemi 0:098463de4c5d 210 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
group-onsemi 0:098463de4c5d 211
group-onsemi 0:098463de4c5d 212 if(!copsProcessor.isValid())
group-onsemi 0:098463de4c5d 213 {
group-onsemi 0:098463de4c5d 214 WARN("Connected to an unknown network, try to connect with default parameters");
group-onsemi 0:098463de4c5d 215 DBG("Connected with %s", copsProcessor.getBearer());
group-onsemi 0:098463de4c5d 216 }
group-onsemi 0:098463de4c5d 217 else
group-onsemi 0:098463de4c5d 218 {
group-onsemi 0:098463de4c5d 219 DBG("Connected to %s with %s", copsProcessor.getNetwork(), copsProcessor.getBearer());
group-onsemi 0:098463de4c5d 220 char cmd[48];
group-onsemi 0:098463de4c5d 221 int tries = 3;
group-onsemi 0:098463de4c5d 222 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", copsProcessor.getAPN());
group-onsemi 0:098463de4c5d 223 do //Try 3 times because for some reasons it can fail with the K3772-Z dongle
group-onsemi 0:098463de4c5d 224 {
group-onsemi 0:098463de4c5d 225 ret = m_at.executeSimple(cmd, &result);
group-onsemi 0:098463de4c5d 226 DBG("Result of command: Err code=%d", ret);
group-onsemi 0:098463de4c5d 227 } while(ret && --tries);
group-onsemi 0:098463de4c5d 228 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
group-onsemi 0:098463de4c5d 229 DBG("APN set to %s", copsProcessor.getAPN());
group-onsemi 0:098463de4c5d 230 }
group-onsemi 0:098463de4c5d 231 #else
group-onsemi 0:098463de4c5d 232 if(apn != NULL)
group-onsemi 0:098463de4c5d 233 {
group-onsemi 0:098463de4c5d 234 char cmd[48];
group-onsemi 0:098463de4c5d 235 int tries = 30;
group-onsemi 0:098463de4c5d 236 sprintf(cmd, "AT+CGDCONT=1,\"IP\",\"%s\"", apn);
group-onsemi 0:098463de4c5d 237 do //Try 30 times because for some reasons it can fail *a lot* with the K3772-Z dongle
group-onsemi 0:098463de4c5d 238 {
group-onsemi 0:098463de4c5d 239 ret = m_at.executeSimple(cmd, &result);
group-onsemi 0:098463de4c5d 240 DBG("Result of command: Err code=%d", ret);
group-onsemi 0:098463de4c5d 241 if(ret)
group-onsemi 0:098463de4c5d 242 {
group-onsemi 0:098463de4c5d 243 Thread::wait(500);
group-onsemi 0:098463de4c5d 244 }
group-onsemi 0:098463de4c5d 245 } while(ret && --tries);
group-onsemi 0:098463de4c5d 246 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
group-onsemi 0:098463de4c5d 247 DBG("APN set to %s", apn);
group-onsemi 0:098463de4c5d 248 }
group-onsemi 0:098463de4c5d 249 #endif
group-onsemi 0:098463de4c5d 250
group-onsemi 0:098463de4c5d 251
group-onsemi 0:098463de4c5d 252 //Connect
group-onsemi 0:098463de4c5d 253 DBG("Connecting");
group-onsemi 0:098463de4c5d 254 #if 0
group-onsemi 0:098463de4c5d 255 ret = m_at.executeSimple("ATDT *99#", &result);
group-onsemi 0:098463de4c5d 256 DBG("Result of command: Err code=%d", ret);
group-onsemi 0:098463de4c5d 257 DBG("ATResult: AT return=%d (code %d)", result.result, result.code);
group-onsemi 0:098463de4c5d 258 #endif
group-onsemi 0:098463de4c5d 259 #if USE_ONE_PORT
group-onsemi 0:098463de4c5d 260 m_at.close(); // Closing AT parser
group-onsemi 0:098463de4c5d 261 m_atOpen = false; //Will need to be reinitialized afterwards
group-onsemi 0:098463de4c5d 262 #endif
group-onsemi 0:098463de4c5d 263
group-onsemi 0:098463de4c5d 264 #if 0
group-onsemi 0:098463de4c5d 265 DBG("AT Parser closed");
group-onsemi 0:098463de4c5d 266 if( (ret!=NET_MOREINFO) || (result.result != ATCommandsInterface::ATResult::AT_CONNECT))
group-onsemi 0:098463de4c5d 267 {
group-onsemi 0:098463de4c5d 268 ERR("Could not connect");
group-onsemi 0:098463de4c5d 269 return ret; //Could not connect
group-onsemi 0:098463de4c5d 270 }
group-onsemi 0:098463de4c5d 271 #endif
group-onsemi 0:098463de4c5d 272 DBG("Connecting PPP");
group-onsemi 0:098463de4c5d 273
group-onsemi 0:098463de4c5d 274 ret = m_ppp.connect();
group-onsemi 0:098463de4c5d 275 DBG("Result of connect: Err code=%d", ret);
group-onsemi 0:098463de4c5d 276 return ret;
group-onsemi 0:098463de4c5d 277 }
group-onsemi 0:098463de4c5d 278
group-onsemi 0:098463de4c5d 279
group-onsemi 0:098463de4c5d 280 int UbloxUSBGSMModem::disconnect()
group-onsemi 0:098463de4c5d 281 {
group-onsemi 0:098463de4c5d 282 DBG("Disconnecting from PPP");
group-onsemi 0:098463de4c5d 283 int ret = m_ppp.disconnect();
group-onsemi 0:098463de4c5d 284 if(ret)
group-onsemi 0:098463de4c5d 285 {
group-onsemi 0:098463de4c5d 286 ERR("Disconnect returned %d, still trying to disconnect", ret);
group-onsemi 0:098463de4c5d 287 }
group-onsemi 0:098463de4c5d 288
group-onsemi 0:098463de4c5d 289 //Ugly but leave dongle time to recover
group-onsemi 0:098463de4c5d 290 Thread::wait(500);
group-onsemi 0:098463de4c5d 291
group-onsemi 0:098463de4c5d 292 #if USE_ONE_PORT
group-onsemi 0:098463de4c5d 293 ATCommandsInterface::ATResult result;
group-onsemi 0:098463de4c5d 294 DBG("Starting AT thread");
group-onsemi 0:098463de4c5d 295 ret = m_at.open();
group-onsemi 0:098463de4c5d 296 if(ret)
group-onsemi 0:098463de4c5d 297 {
group-onsemi 0:098463de4c5d 298 return ret;
group-onsemi 0:098463de4c5d 299 }
group-onsemi 0:098463de4c5d 300 #endif
group-onsemi 0:098463de4c5d 301
group-onsemi 0:098463de4c5d 302 DBG("Trying to hangup");
group-onsemi 0:098463de4c5d 303
group-onsemi 0:098463de4c5d 304 #if 0 //Does not appear to work
group-onsemi 0:098463de4c5d 305 int tries = 10;
group-onsemi 0:098463de4c5d 306 do
group-onsemi 0:098463de4c5d 307 {
group-onsemi 0:098463de4c5d 308 ret = m_at.executeSimple("+++", &result, 1000);
group-onsemi 0:098463de4c5d 309 DBG("Result of command: Err code=%d\n", ret);
group-onsemi 0:098463de4c5d 310 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
group-onsemi 0:098463de4c5d 311 } while(tries-- && ret);
group-onsemi 0:098463de4c5d 312 if(!ret)
group-onsemi 0:098463de4c5d 313 {
group-onsemi 0:098463de4c5d 314 ret = m_at.executeSimple("ATH", &result);
group-onsemi 0:098463de4c5d 315 DBG("Result of command: Err code=%d\n", ret);
group-onsemi 0:098463de4c5d 316 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
group-onsemi 0:098463de4c5d 317 }
group-onsemi 0:098463de4c5d 318 #endif
group-onsemi 0:098463de4c5d 319
group-onsemi 0:098463de4c5d 320 #if USE_ONE_PORT
group-onsemi 0:098463de4c5d 321 //Reinit AT parser
group-onsemi 0:098463de4c5d 322 ret = m_at.init();
group-onsemi 0:098463de4c5d 323 DBG("Result of command: Err code=%d\n", ret);
group-onsemi 0:098463de4c5d 324 if(ret)
group-onsemi 0:098463de4c5d 325 {
group-onsemi 0:098463de4c5d 326 m_at.close(); // Closing AT parser
group-onsemi 0:098463de4c5d 327 DBG("AT Parser closed, could not complete disconnection");
group-onsemi 0:098463de4c5d 328 return NET_TIMEOUT;
group-onsemi 0:098463de4c5d 329 }
group-onsemi 0:098463de4c5d 330
group-onsemi 0:098463de4c5d 331 #if 0
group-onsemi 0:098463de4c5d 332 m_at.close(); // Closing AT parser
group-onsemi 0:098463de4c5d 333 DBG("AT Parser closed");
group-onsemi 0:098463de4c5d 334 #endif
group-onsemi 0:098463de4c5d 335 #endif
group-onsemi 0:098463de4c5d 336 return OK;
group-onsemi 0:098463de4c5d 337 }
group-onsemi 0:098463de4c5d 338
group-onsemi 0:098463de4c5d 339 int UbloxUSBGSMModem::sendSM(const char* number, const char* message)
group-onsemi 0:098463de4c5d 340 {
group-onsemi 0:098463de4c5d 341 int ret = init();
group-onsemi 0:098463de4c5d 342 if(ret)
group-onsemi 0:098463de4c5d 343 {
group-onsemi 0:098463de4c5d 344 return ret;
group-onsemi 0:098463de4c5d 345 }
group-onsemi 0:098463de4c5d 346
group-onsemi 0:098463de4c5d 347 if(!m_smsInit)
group-onsemi 0:098463de4c5d 348 {
group-onsemi 0:098463de4c5d 349 ret = m_sms.init();
group-onsemi 0:098463de4c5d 350 if(ret)
group-onsemi 0:098463de4c5d 351 {
group-onsemi 0:098463de4c5d 352 return ret;
group-onsemi 0:098463de4c5d 353 }
group-onsemi 0:098463de4c5d 354 m_smsInit = true;
group-onsemi 0:098463de4c5d 355 }
group-onsemi 0:098463de4c5d 356
group-onsemi 0:098463de4c5d 357 ret = m_sms.send(number, message);
group-onsemi 0:098463de4c5d 358 if(ret)
group-onsemi 0:098463de4c5d 359 {
group-onsemi 0:098463de4c5d 360 return ret;
group-onsemi 0:098463de4c5d 361 }
group-onsemi 0:098463de4c5d 362
group-onsemi 0:098463de4c5d 363 return OK;
group-onsemi 0:098463de4c5d 364 }
group-onsemi 0:098463de4c5d 365
group-onsemi 0:098463de4c5d 366 int UbloxUSBGSMModem::getSM(char* number, char* message, size_t maxLength)
group-onsemi 0:098463de4c5d 367 {
group-onsemi 0:098463de4c5d 368 int ret = init();
group-onsemi 0:098463de4c5d 369 if(ret)
group-onsemi 0:098463de4c5d 370 {
group-onsemi 0:098463de4c5d 371 return ret;
group-onsemi 0:098463de4c5d 372 }
group-onsemi 0:098463de4c5d 373
group-onsemi 0:098463de4c5d 374 if(!m_smsInit)
group-onsemi 0:098463de4c5d 375 {
group-onsemi 0:098463de4c5d 376 ret = m_sms.init();
group-onsemi 0:098463de4c5d 377 if(ret)
group-onsemi 0:098463de4c5d 378 {
group-onsemi 0:098463de4c5d 379 return ret;
group-onsemi 0:098463de4c5d 380 }
group-onsemi 0:098463de4c5d 381 m_smsInit = true;
group-onsemi 0:098463de4c5d 382 }
group-onsemi 0:098463de4c5d 383
group-onsemi 0:098463de4c5d 384 ret = m_sms.get(number, message, maxLength);
group-onsemi 0:098463de4c5d 385 if(ret)
group-onsemi 0:098463de4c5d 386 {
group-onsemi 0:098463de4c5d 387 return ret;
group-onsemi 0:098463de4c5d 388 }
group-onsemi 0:098463de4c5d 389
group-onsemi 0:098463de4c5d 390 return OK;
group-onsemi 0:098463de4c5d 391 }
group-onsemi 0:098463de4c5d 392
group-onsemi 0:098463de4c5d 393 int UbloxUSBGSMModem::getSMCount(size_t* pCount)
group-onsemi 0:098463de4c5d 394 {
group-onsemi 0:098463de4c5d 395 int ret = init();
group-onsemi 0:098463de4c5d 396 if(ret)
group-onsemi 0:098463de4c5d 397 {
group-onsemi 0:098463de4c5d 398 return ret;
group-onsemi 0:098463de4c5d 399 }
group-onsemi 0:098463de4c5d 400
group-onsemi 0:098463de4c5d 401 if(!m_smsInit)
group-onsemi 0:098463de4c5d 402 {
group-onsemi 0:098463de4c5d 403 ret = m_sms.init();
group-onsemi 0:098463de4c5d 404 if(ret)
group-onsemi 0:098463de4c5d 405 {
group-onsemi 0:098463de4c5d 406 return ret;
group-onsemi 0:098463de4c5d 407 }
group-onsemi 0:098463de4c5d 408 m_smsInit = true;
group-onsemi 0:098463de4c5d 409 }
group-onsemi 0:098463de4c5d 410
group-onsemi 0:098463de4c5d 411 ret = m_sms.getCount(pCount);
group-onsemi 0:098463de4c5d 412 if(ret)
group-onsemi 0:098463de4c5d 413 {
group-onsemi 0:098463de4c5d 414 return ret;
group-onsemi 0:098463de4c5d 415 }
group-onsemi 0:098463de4c5d 416
group-onsemi 0:098463de4c5d 417 return OK;
group-onsemi 0:098463de4c5d 418 }
group-onsemi 0:098463de4c5d 419
group-onsemi 0:098463de4c5d 420 int UbloxUSBGSMModem::sendUSSD(const char* command, char* result, size_t maxLength)
group-onsemi 0:098463de4c5d 421 {
group-onsemi 0:098463de4c5d 422 int ret = init();
group-onsemi 0:098463de4c5d 423 if(ret)
group-onsemi 0:098463de4c5d 424 {
group-onsemi 0:098463de4c5d 425 return ret;
group-onsemi 0:098463de4c5d 426 }
group-onsemi 0:098463de4c5d 427
group-onsemi 0:098463de4c5d 428 if(!m_ussdInit)
group-onsemi 0:098463de4c5d 429 {
group-onsemi 0:098463de4c5d 430 ret = m_ussd.init();
group-onsemi 0:098463de4c5d 431 if(ret)
group-onsemi 0:098463de4c5d 432 {
group-onsemi 0:098463de4c5d 433 return ret;
group-onsemi 0:098463de4c5d 434 }
group-onsemi 0:098463de4c5d 435 m_ussdInit = true;
group-onsemi 0:098463de4c5d 436 }
group-onsemi 0:098463de4c5d 437
group-onsemi 0:098463de4c5d 438 ret = m_ussd.send(command, result, maxLength);
group-onsemi 0:098463de4c5d 439 if(ret)
group-onsemi 0:098463de4c5d 440 {
group-onsemi 0:098463de4c5d 441 return ret;
group-onsemi 0:098463de4c5d 442 }
group-onsemi 0:098463de4c5d 443
group-onsemi 0:098463de4c5d 444 return OK;
group-onsemi 0:098463de4c5d 445 }
group-onsemi 0:098463de4c5d 446
group-onsemi 0:098463de4c5d 447 int UbloxUSBGSMModem::getLinkState(int* pRssi, LinkMonitor::REGISTRATION_STATE* pRegistrationState, LinkMonitor::BEARER* pBearer)
group-onsemi 0:098463de4c5d 448 {
group-onsemi 0:098463de4c5d 449 int ret = init();
group-onsemi 0:098463de4c5d 450 if(ret)
group-onsemi 0:098463de4c5d 451 {
group-onsemi 0:098463de4c5d 452 return ret;
group-onsemi 0:098463de4c5d 453 }
group-onsemi 0:098463de4c5d 454
group-onsemi 0:098463de4c5d 455 if(!m_linkMonitorInit)
group-onsemi 0:098463de4c5d 456 {
group-onsemi 0:098463de4c5d 457 ret = m_linkMonitor.init();
group-onsemi 0:098463de4c5d 458 if(ret)
group-onsemi 0:098463de4c5d 459 {
group-onsemi 0:098463de4c5d 460 return ret;
group-onsemi 0:098463de4c5d 461 }
group-onsemi 0:098463de4c5d 462 m_linkMonitorInit = true;
group-onsemi 0:098463de4c5d 463 }
group-onsemi 0:098463de4c5d 464
group-onsemi 0:098463de4c5d 465 ret = m_linkMonitor.getState(pRssi, pRegistrationState, pBearer);
group-onsemi 0:098463de4c5d 466 if(ret)
group-onsemi 0:098463de4c5d 467 {
group-onsemi 0:098463de4c5d 468 return ret;
group-onsemi 0:098463de4c5d 469 }
group-onsemi 0:098463de4c5d 470
group-onsemi 0:098463de4c5d 471 return OK;
group-onsemi 0:098463de4c5d 472 }
group-onsemi 0:098463de4c5d 473
group-onsemi 0:098463de4c5d 474
group-onsemi 0:098463de4c5d 475 ATCommandsInterface* UbloxUSBGSMModem::getATCommandsInterface()
group-onsemi 0:098463de4c5d 476 {
group-onsemi 0:098463de4c5d 477 return &m_at;
group-onsemi 0:098463de4c5d 478 }
group-onsemi 0:098463de4c5d 479
group-onsemi 0:098463de4c5d 480 int UbloxUSBGSMModem::power(bool enable)
group-onsemi 0:098463de4c5d 481 {
group-onsemi 0:098463de4c5d 482 if( m_powerGatingPin == NC )
group-onsemi 0:098463de4c5d 483 {
group-onsemi 0:098463de4c5d 484 return NET_INVALID; //A pin name has not been provided in the constructor
group-onsemi 0:098463de4c5d 485 }
group-onsemi 0:098463de4c5d 486
group-onsemi 0:098463de4c5d 487 if(!enable) //Will force components to re-init
group-onsemi 0:098463de4c5d 488 {
group-onsemi 0:098463de4c5d 489 cleanup();
group-onsemi 0:098463de4c5d 490 }
group-onsemi 0:098463de4c5d 491
group-onsemi 0:098463de4c5d 492 DigitalOut powerGatingOut(m_powerGatingPin);
group-onsemi 0:098463de4c5d 493 powerGatingOut = m_powerGatingOnWhenPinHigh?enable:!enable;
group-onsemi 0:098463de4c5d 494
group-onsemi 0:098463de4c5d 495 return OK;
group-onsemi 0:098463de4c5d 496 }
group-onsemi 0:098463de4c5d 497
group-onsemi 0:098463de4c5d 498 bool UbloxUSBGSMModem::power()
group-onsemi 0:098463de4c5d 499 {
group-onsemi 0:098463de4c5d 500 if( m_powerGatingPin == NC )
group-onsemi 0:098463de4c5d 501 {
group-onsemi 0:098463de4c5d 502 return true; //Assume power is always on
group-onsemi 0:098463de4c5d 503 }
group-onsemi 0:098463de4c5d 504
group-onsemi 0:098463de4c5d 505 DigitalOut powerGatingOut(m_powerGatingPin);
group-onsemi 0:098463de4c5d 506 return m_powerGatingOnWhenPinHigh?powerGatingOut:!powerGatingOut;
group-onsemi 0:098463de4c5d 507 }
group-onsemi 0:098463de4c5d 508
group-onsemi 0:098463de4c5d 509 int UbloxUSBGSMModem::init()
group-onsemi 0:098463de4c5d 510 {
group-onsemi 0:098463de4c5d 511 if( !m_dongleConnected )
group-onsemi 0:098463de4c5d 512 {
group-onsemi 0:098463de4c5d 513 if(!power())
group-onsemi 0:098463de4c5d 514 {
group-onsemi 0:098463de4c5d 515 //Obviously cannot initialize the dongle if it is disconnected...
group-onsemi 0:098463de4c5d 516 ERR("Power is off");
group-onsemi 0:098463de4c5d 517 return NET_INVALID;
group-onsemi 0:098463de4c5d 518 }
group-onsemi 0:098463de4c5d 519 m_dongleConnected = true;
group-onsemi 0:098463de4c5d 520 while( !m_dongle.connected() )
group-onsemi 0:098463de4c5d 521 {
group-onsemi 0:098463de4c5d 522 m_dongle.tryConnect();
group-onsemi 0:098463de4c5d 523 Thread::wait(10);
group-onsemi 0:098463de4c5d 524 }
group-onsemi 0:098463de4c5d 525 }
group-onsemi 0:098463de4c5d 526
group-onsemi 0:098463de4c5d 527 if(m_atOpen)
group-onsemi 0:098463de4c5d 528 {
group-onsemi 0:098463de4c5d 529 return OK;
group-onsemi 0:098463de4c5d 530 }
group-onsemi 0:098463de4c5d 531
group-onsemi 0:098463de4c5d 532 DBG("Starting AT thread if needed");
group-onsemi 0:098463de4c5d 533 int ret = m_at.open();
group-onsemi 0:098463de4c5d 534 if(ret)
group-onsemi 0:098463de4c5d 535 {
group-onsemi 0:098463de4c5d 536 return ret;
group-onsemi 0:098463de4c5d 537 }
group-onsemi 0:098463de4c5d 538
group-onsemi 0:098463de4c5d 539 DBG("Sending initialisation commands");
group-onsemi 0:098463de4c5d 540 ret = m_at.init();
group-onsemi 0:098463de4c5d 541 if(ret)
group-onsemi 0:098463de4c5d 542 {
group-onsemi 0:098463de4c5d 543 return ret;
group-onsemi 0:098463de4c5d 544 }
group-onsemi 0:098463de4c5d 545
group-onsemi 0:098463de4c5d 546 if(m_dongle.getDongleType() == WAN_DONGLE_TYPE_UBLOX_LISAU200)
group-onsemi 0:098463de4c5d 547 {
group-onsemi 0:098463de4c5d 548 INFO("Using a u-blox LISA-U");
group-onsemi 0:098463de4c5d 549 }
group-onsemi 0:098463de4c5d 550 else
group-onsemi 0:098463de4c5d 551 {
group-onsemi 0:098463de4c5d 552 WARN("Using an Unknown Dongle");
group-onsemi 0:098463de4c5d 553 }
group-onsemi 0:098463de4c5d 554
group-onsemi 0:098463de4c5d 555 ATCommandsInterface::ATResult result;
group-onsemi 0:098463de4c5d 556
group-onsemi 0:098463de4c5d 557 //Wait for network registration
group-onsemi 0:098463de4c5d 558 CREGProcessor cregProcessor;
group-onsemi 0:098463de4c5d 559 do
group-onsemi 0:098463de4c5d 560 {
group-onsemi 0:098463de4c5d 561 DBG("Waiting for network registration");
group-onsemi 0:098463de4c5d 562 ret = m_at.execute("AT+CREG?", &cregProcessor, &result);
group-onsemi 0:098463de4c5d 563 DBG("Result of command: Err code=%d\n", ret);
group-onsemi 0:098463de4c5d 564 DBG("ATResult: AT return=%d (code %d)\n", result.result, result.code);
group-onsemi 0:098463de4c5d 565 if(cregProcessor.getStatus() == CREGProcessor::STATUS_REGISTERING)
group-onsemi 0:098463de4c5d 566 {
group-onsemi 0:098463de4c5d 567 Thread::wait(3000);
group-onsemi 0:098463de4c5d 568 }
group-onsemi 0:098463de4c5d 569 } while(cregProcessor.getStatus() == CREGProcessor::STATUS_REGISTERING);
group-onsemi 0:098463de4c5d 570 if(cregProcessor.getStatus() == CREGProcessor::STATUS_FAILED)
group-onsemi 0:098463de4c5d 571 {
group-onsemi 0:098463de4c5d 572 ERR("Registration denied");
group-onsemi 0:098463de4c5d 573 return NET_AUTH;
group-onsemi 0:098463de4c5d 574 }
group-onsemi 0:098463de4c5d 575
group-onsemi 0:098463de4c5d 576 m_atOpen = true;
group-onsemi 0:098463de4c5d 577
group-onsemi 0:098463de4c5d 578 return OK;
group-onsemi 0:098463de4c5d 579 }
group-onsemi 0:098463de4c5d 580
group-onsemi 0:098463de4c5d 581 int UbloxUSBGSMModem::cleanup()
group-onsemi 0:098463de4c5d 582 {
group-onsemi 0:098463de4c5d 583 if(m_ppp.isConnected())
group-onsemi 0:098463de4c5d 584 {
group-onsemi 0:098463de4c5d 585 WARN("Data connection is still open"); //Try to encourage good behaviour from the user
group-onsemi 0:098463de4c5d 586 m_ppp.disconnect();
group-onsemi 0:098463de4c5d 587 }
group-onsemi 0:098463de4c5d 588
group-onsemi 0:098463de4c5d 589 m_smsInit = false;
group-onsemi 0:098463de4c5d 590 m_ussdInit = false;
group-onsemi 0:098463de4c5d 591 m_linkMonitorInit = false;
group-onsemi 0:098463de4c5d 592 //We don't reset m_ipInit as PPPIPInterface::init() only needs to be called once
group-onsemi 0:098463de4c5d 593
group-onsemi 0:098463de4c5d 594 if(m_atOpen)
group-onsemi 0:098463de4c5d 595 {
group-onsemi 0:098463de4c5d 596 m_at.close();
group-onsemi 0:098463de4c5d 597 m_atOpen = false;
group-onsemi 0:098463de4c5d 598 }
group-onsemi 0:098463de4c5d 599
group-onsemi 0:098463de4c5d 600 m_dongle.disconnect();
group-onsemi 0:098463de4c5d 601 m_dongleConnected = false;
group-onsemi 0:098463de4c5d 602
group-onsemi 0:098463de4c5d 603 return OK;
group-onsemi 0:098463de4c5d 604 }
group-onsemi 0:098463de4c5d 605