ublox-cellular-base-SARA-R5

Dependents:   example-ublox-cellular-psm

Committer:
fahimalavi
Date:
Fri Jun 26 09:49:08 2020 +0500
Revision:
39:945019c3d194
Parent:
38:b33dc3d26690
SARA-R5 after first demo of u-track FW

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fahimalavi 26:e4e444cc7b14 1 /* Copyright (c) 2019 ublox Limited
RobMeades 0:5cffef3371f6 2 *
RobMeades 0:5cffef3371f6 3 * Licensed under the Apache License, Version 2.0 (the "License");
RobMeades 0:5cffef3371f6 4 * you may not use this file except in compliance with the License.
RobMeades 0:5cffef3371f6 5 * You may obtain a copy of the License at
RobMeades 0:5cffef3371f6 6 *
RobMeades 0:5cffef3371f6 7 * http://www.apache.org/licenses/LICENSE-2.0
RobMeades 0:5cffef3371f6 8 *
RobMeades 0:5cffef3371f6 9 * Unless required by applicable law or agreed to in writing, software
RobMeades 0:5cffef3371f6 10 * distributed under the License is distributed on an "AS IS" BASIS,
RobMeades 0:5cffef3371f6 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
RobMeades 0:5cffef3371f6 12 * See the License for the specific language governing permissions and
RobMeades 0:5cffef3371f6 13 * limitations under the License.
RobMeades 0:5cffef3371f6 14 */
RobMeades 0:5cffef3371f6 15
RobMeades 0:5cffef3371f6 16 #include "UARTSerial.h"
RobMeades 0:5cffef3371f6 17 #include "APN_db.h"
RobMeades 0:5cffef3371f6 18 #include "UbloxCellularBase.h"
RobMeades 0:5cffef3371f6 19 #include "onboard_modem_api.h"
RobMeades 0:5cffef3371f6 20 #ifdef FEATURE_COMMON_PAL
RobMeades 0:5cffef3371f6 21 #include "mbed_trace.h"
RobMeades 0:5cffef3371f6 22 #define TRACE_GROUP "UCB"
RobMeades 0:5cffef3371f6 23 #else
rob.meades@u-blox.com 2:73fcc33c9400 24 #define tr_debug(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 2:73fcc33c9400 25 #define tr_info(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 2:73fcc33c9400 26 #define tr_warn(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 2:73fcc33c9400 27 #define tr_error(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
wajahat.abbas@u-blox.com 34:d239824bfb8f 28 #define tr_critical(format, ...) debug("\n" format "\n", ## __VA_ARGS__)
RobMeades 0:5cffef3371f6 29 #endif
RobMeades 0:5cffef3371f6 30
RobMeades 14:e420232ee4e7 31 /* Array to convert the 3G qual number into a median EC_NO_LEV number.
RobMeades 14:e420232ee4e7 32 */
RobMeades 14:e420232ee4e7 33 /* 0 1 2 3 4 5 6 7 */
fahim.alavi@u-blox.com 15:93b157a47b8d 34 /* 44, 41, 35, 29, 23, 17, 11, 7*/
fahim.alavi@u-blox.com 15:93b157a47b8d 35 const int qualConvert3G[] = {-2, -4, -7, -10, -13, -16, -19, -21};
RobMeades 14:e420232ee4e7 36
RobMeades 14:e420232ee4e7 37 /* Array to convert the 3G "rssi" number into a dBm RSCP value rounded up to the
RobMeades 14:e420232ee4e7 38 * nearest whole number.
RobMeades 14:e420232ee4e7 39 */
RobMeades 14:e420232ee4e7 40 const int rscpConvert3G[] = {-108, -105, -103, -100, -98, -96, -94, -93, /* 0 - 7 */
RobMeades 14:e420232ee4e7 41 -91, -89, -88, -85, -83, -80, -78, -76, /* 8 - 15 */
RobMeades 14:e420232ee4e7 42 -74, -73, -70, -68, -66, -64, -63, -60, /* 16 - 23 */
RobMeades 14:e420232ee4e7 43 -58, -56, -54, -53, -51, -49, -48, -46}; /* 24 - 31 */
RobMeades 14:e420232ee4e7 44
RobMeades 14:e420232ee4e7 45 /* Array to convert the LTE rssi number into a dBm value rounded up to the
RobMeades 14:e420232ee4e7 46 * nearest whole number.
RobMeades 14:e420232ee4e7 47 */
RobMeades 14:e420232ee4e7 48 const int rssiConvertLte[] = {-118, -115, -113, -110, -108, -105, -103, -100, /* 0 - 7 */
RobMeades 14:e420232ee4e7 49 -98, -95, -93, -90, -88, -85, -83, -80, /* 8 - 15 */
RobMeades 14:e420232ee4e7 50 -78, -76, -74, -73, -71, -69, -68, -65, /* 16 - 23 */
RobMeades 14:e420232ee4e7 51 -63, -61, -60, -59, -58, -55, -53, -48}; /* 24 - 31 */
RobMeades 14:e420232ee4e7 52
RobMeades 0:5cffef3371f6 53 /**********************************************************************
RobMeades 0:5cffef3371f6 54 * PRIVATE METHODS
RobMeades 0:5cffef3371f6 55 **********************************************************************/
RobMeades 0:5cffef3371f6 56
RobMeades 0:5cffef3371f6 57 void UbloxCellularBase::set_nwk_reg_status_csd(int status)
RobMeades 0:5cffef3371f6 58 {
RobMeades 0:5cffef3371f6 59 switch (status) {
RobMeades 0:5cffef3371f6 60 case CSD_NOT_REGISTERED_NOT_SEARCHING:
RobMeades 0:5cffef3371f6 61 case CSD_NOT_REGISTERED_SEARCHING:
RobMeades 0:5cffef3371f6 62 tr_info("Not (yet) registered for circuit switched service");
RobMeades 0:5cffef3371f6 63 break;
RobMeades 0:5cffef3371f6 64 case CSD_REGISTERED:
RobMeades 0:5cffef3371f6 65 case CSD_REGISTERED_ROAMING:
RobMeades 0:5cffef3371f6 66 tr_info("Registered for circuit switched service");
RobMeades 0:5cffef3371f6 67 break;
RobMeades 0:5cffef3371f6 68 case CSD_REGISTRATION_DENIED:
RobMeades 0:5cffef3371f6 69 tr_info("Circuit switched service denied");
RobMeades 0:5cffef3371f6 70 break;
RobMeades 0:5cffef3371f6 71 case CSD_UNKNOWN_COVERAGE:
RobMeades 0:5cffef3371f6 72 tr_info("Out of circuit switched service coverage");
RobMeades 0:5cffef3371f6 73 break;
RobMeades 0:5cffef3371f6 74 case CSD_SMS_ONLY:
RobMeades 0:5cffef3371f6 75 tr_info("SMS service only");
RobMeades 0:5cffef3371f6 76 break;
RobMeades 0:5cffef3371f6 77 case CSD_SMS_ONLY_ROAMING:
RobMeades 0:5cffef3371f6 78 tr_info("SMS service only");
RobMeades 0:5cffef3371f6 79 break;
RobMeades 0:5cffef3371f6 80 case CSD_CSFB_NOT_PREFERRED:
RobMeades 0:5cffef3371f6 81 tr_info("Registered for circuit switched service with CSFB not preferred");
RobMeades 0:5cffef3371f6 82 break;
RobMeades 0:5cffef3371f6 83 default:
RobMeades 0:5cffef3371f6 84 tr_info("Unknown circuit switched service registration status. %d", status);
RobMeades 0:5cffef3371f6 85 break;
RobMeades 0:5cffef3371f6 86 }
RobMeades 0:5cffef3371f6 87
RobMeades 0:5cffef3371f6 88 _dev_info.reg_status_csd = static_cast<NetworkRegistrationStatusCsd>(status);
RobMeades 0:5cffef3371f6 89 }
RobMeades 0:5cffef3371f6 90
RobMeades 0:5cffef3371f6 91 void UbloxCellularBase::set_nwk_reg_status_psd(int status)
RobMeades 0:5cffef3371f6 92 {
RobMeades 0:5cffef3371f6 93 switch (status) {
RobMeades 0:5cffef3371f6 94 case PSD_NOT_REGISTERED_NOT_SEARCHING:
RobMeades 0:5cffef3371f6 95 case PSD_NOT_REGISTERED_SEARCHING:
RobMeades 0:5cffef3371f6 96 tr_info("Not (yet) registered for packet switched service");
RobMeades 0:5cffef3371f6 97 break;
RobMeades 0:5cffef3371f6 98 case PSD_REGISTERED:
RobMeades 0:5cffef3371f6 99 case PSD_REGISTERED_ROAMING:
RobMeades 0:5cffef3371f6 100 tr_info("Registered for packet switched service");
RobMeades 0:5cffef3371f6 101 break;
RobMeades 0:5cffef3371f6 102 case PSD_REGISTRATION_DENIED:
RobMeades 0:5cffef3371f6 103 tr_info("Packet switched service denied");
RobMeades 0:5cffef3371f6 104 break;
RobMeades 0:5cffef3371f6 105 case PSD_UNKNOWN_COVERAGE:
RobMeades 0:5cffef3371f6 106 tr_info("Out of packet switched service coverage");
RobMeades 0:5cffef3371f6 107 break;
RobMeades 0:5cffef3371f6 108 case PSD_EMERGENCY_SERVICES_ONLY:
RobMeades 0:5cffef3371f6 109 tr_info("Limited access for packet switched service. Emergency use only.");
RobMeades 0:5cffef3371f6 110 break;
RobMeades 0:5cffef3371f6 111 default:
RobMeades 0:5cffef3371f6 112 tr_info("Unknown packet switched service registration status. %d", status);
RobMeades 0:5cffef3371f6 113 break;
RobMeades 0:5cffef3371f6 114 }
RobMeades 0:5cffef3371f6 115
RobMeades 0:5cffef3371f6 116 _dev_info.reg_status_psd = static_cast<NetworkRegistrationStatusPsd>(status);
RobMeades 0:5cffef3371f6 117 }
RobMeades 0:5cffef3371f6 118
RobMeades 0:5cffef3371f6 119 void UbloxCellularBase::set_nwk_reg_status_eps(int status)
RobMeades 0:5cffef3371f6 120 {
RobMeades 0:5cffef3371f6 121 switch (status) {
RobMeades 0:5cffef3371f6 122 case EPS_NOT_REGISTERED_NOT_SEARCHING:
RobMeades 0:5cffef3371f6 123 case EPS_NOT_REGISTERED_SEARCHING:
RobMeades 0:5cffef3371f6 124 tr_info("Not (yet) registered for EPS service");
RobMeades 0:5cffef3371f6 125 break;
RobMeades 0:5cffef3371f6 126 case EPS_REGISTERED:
RobMeades 0:5cffef3371f6 127 case EPS_REGISTERED_ROAMING:
RobMeades 0:5cffef3371f6 128 tr_info("Registered for EPS service");
RobMeades 0:5cffef3371f6 129 break;
RobMeades 0:5cffef3371f6 130 case EPS_REGISTRATION_DENIED:
RobMeades 0:5cffef3371f6 131 tr_info("EPS service denied");
RobMeades 0:5cffef3371f6 132 break;
RobMeades 0:5cffef3371f6 133 case EPS_UNKNOWN_COVERAGE:
RobMeades 0:5cffef3371f6 134 tr_info("Out of EPS service coverage");
RobMeades 0:5cffef3371f6 135 break;
RobMeades 0:5cffef3371f6 136 case EPS_EMERGENCY_SERVICES_ONLY:
RobMeades 0:5cffef3371f6 137 tr_info("Limited access for EPS service. Emergency use only.");
RobMeades 0:5cffef3371f6 138 break;
RobMeades 0:5cffef3371f6 139 default:
RobMeades 0:5cffef3371f6 140 tr_info("Unknown EPS service registration status. %d", status);
RobMeades 0:5cffef3371f6 141 break;
RobMeades 0:5cffef3371f6 142 }
RobMeades 0:5cffef3371f6 143
RobMeades 0:5cffef3371f6 144 _dev_info.reg_status_eps = static_cast<NetworkRegistrationStatusEps>(status);
RobMeades 0:5cffef3371f6 145 }
RobMeades 0:5cffef3371f6 146
wajahat.abbas@u-blox.com 23:eaab8e812a5d 147 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 23:eaab8e812a5d 148 void UbloxCellularBase::set_modem_psm_state(int status)
wajahat.abbas@u-blox.com 23:eaab8e812a5d 149 {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 150 switch (status) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 151 case ASLEEP:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 152 tr_info("Modem is going in PSM sleep");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 153 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 154 case AWAKE:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 155 tr_info("Modem is awake from PSM sleep");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 156 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 157 default:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 158 tr_info("Unknown PSM state. %d", status);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 159 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 160 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 161
wajahat.abbas@u-blox.com 23:eaab8e812a5d 162 _dev_info.modem_psm_state = static_cast<ModemPSMState>(status);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 163 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 164 #endif
wajahat.abbas@u-blox.com 23:eaab8e812a5d 165
RobMeades 14:e420232ee4e7 166 void UbloxCellularBase::set_rat(int acTStatus)
RobMeades 0:5cffef3371f6 167 {
RobMeades 14:e420232ee4e7 168 switch (acTStatus) {
RobMeades 0:5cffef3371f6 169 case GSM:
RobMeades 0:5cffef3371f6 170 case COMPACT_GSM:
RobMeades 0:5cffef3371f6 171 tr_info("Connected in GSM");
RobMeades 0:5cffef3371f6 172 break;
RobMeades 0:5cffef3371f6 173 case UTRAN:
RobMeades 0:5cffef3371f6 174 tr_info("Connected to UTRAN");
RobMeades 0:5cffef3371f6 175 break;
RobMeades 0:5cffef3371f6 176 case EDGE:
RobMeades 0:5cffef3371f6 177 tr_info("Connected to EDGE");
RobMeades 0:5cffef3371f6 178 break;
RobMeades 0:5cffef3371f6 179 case HSDPA:
RobMeades 0:5cffef3371f6 180 tr_info("Connected to HSDPA");
RobMeades 0:5cffef3371f6 181 break;
RobMeades 0:5cffef3371f6 182 case HSUPA:
RobMeades 0:5cffef3371f6 183 tr_info("Connected to HSPA");
RobMeades 0:5cffef3371f6 184 break;
RobMeades 0:5cffef3371f6 185 case HSDPA_HSUPA:
RobMeades 0:5cffef3371f6 186 tr_info("Connected to HDPA/HSPA");
RobMeades 0:5cffef3371f6 187 break;
RobMeades 0:5cffef3371f6 188 case LTE:
RobMeades 0:5cffef3371f6 189 tr_info("Connected to LTE");
RobMeades 0:5cffef3371f6 190 break;
fahimalavi 10:c4281fa79b8f 191 case EC_GSM_IoT:
fahimalavi 10:c4281fa79b8f 192 tr_info("Connected to EC_GSM_IoT");
fahimalavi 10:c4281fa79b8f 193 break;
fahimalavi 10:c4281fa79b8f 194 case E_UTRAN_NB_S1:
fahimalavi 10:c4281fa79b8f 195 tr_info("Connected to E_UTRAN NB1");
fahimalavi 10:c4281fa79b8f 196 break;
RobMeades 0:5cffef3371f6 197 default:
RobMeades 14:e420232ee4e7 198 tr_info("Unknown RAT %d", acTStatus);
RobMeades 0:5cffef3371f6 199 break;
RobMeades 0:5cffef3371f6 200 }
RobMeades 0:5cffef3371f6 201
RobMeades 14:e420232ee4e7 202 _dev_info.rat = static_cast<RadioAccessNetworkType>(acTStatus);
RobMeades 0:5cffef3371f6 203 }
RobMeades 0:5cffef3371f6 204
RobMeades 0:5cffef3371f6 205 bool UbloxCellularBase::get_iccid()
RobMeades 0:5cffef3371f6 206 {
RobMeades 0:5cffef3371f6 207 bool success;
RobMeades 0:5cffef3371f6 208 LOCK();
RobMeades 0:5cffef3371f6 209
RobMeades 0:5cffef3371f6 210 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 211
RobMeades 0:5cffef3371f6 212 // Returns the ICCID (Integrated Circuit Card ID) of the SIM-card.
RobMeades 0:5cffef3371f6 213 // ICCID is a serial number identifying the SIM.
RobMeades 0:5cffef3371f6 214 // AT Command Manual UBX-13002752, section 4.12
RobMeades 0:5cffef3371f6 215 success = _at->send("AT+CCID") && _at->recv("+CCID: %20[^\n]\nOK\n", _dev_info.iccid);
RobMeades 0:5cffef3371f6 216 tr_info("DevInfo: ICCID=%s", _dev_info.iccid);
RobMeades 0:5cffef3371f6 217
RobMeades 0:5cffef3371f6 218 UNLOCK();
RobMeades 0:5cffef3371f6 219 return success;
RobMeades 0:5cffef3371f6 220 }
RobMeades 0:5cffef3371f6 221
RobMeades 0:5cffef3371f6 222 bool UbloxCellularBase::get_imsi()
RobMeades 0:5cffef3371f6 223 {
RobMeades 0:5cffef3371f6 224 bool success;
RobMeades 0:5cffef3371f6 225 LOCK();
RobMeades 0:5cffef3371f6 226
RobMeades 0:5cffef3371f6 227 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 228
RobMeades 0:5cffef3371f6 229 // International mobile subscriber identification
RobMeades 0:5cffef3371f6 230 // AT Command Manual UBX-13002752, section 4.11
RobMeades 0:5cffef3371f6 231 success = _at->send("AT+CIMI") && _at->recv("%15[^\n]\nOK\n", _dev_info.imsi);
RobMeades 0:5cffef3371f6 232 tr_info("DevInfo: IMSI=%s", _dev_info.imsi);
RobMeades 0:5cffef3371f6 233
RobMeades 0:5cffef3371f6 234 UNLOCK();
RobMeades 0:5cffef3371f6 235 return success;
RobMeades 0:5cffef3371f6 236 }
RobMeades 0:5cffef3371f6 237
RobMeades 0:5cffef3371f6 238 bool UbloxCellularBase::get_imei()
RobMeades 0:5cffef3371f6 239 {
RobMeades 0:5cffef3371f6 240 bool success;
RobMeades 0:5cffef3371f6 241 LOCK();
RobMeades 0:5cffef3371f6 242
RobMeades 0:5cffef3371f6 243 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 244
RobMeades 0:5cffef3371f6 245 // International mobile equipment identifier
RobMeades 0:5cffef3371f6 246 // AT Command Manual UBX-13002752, section 4.7
RobMeades 0:5cffef3371f6 247 success = _at->send("AT+CGSN") && _at->recv("%15[^\n]\nOK\n", _dev_info.imei);
RobMeades 0:5cffef3371f6 248 tr_info("DevInfo: IMEI=%s", _dev_info.imei);
RobMeades 0:5cffef3371f6 249
RobMeades 0:5cffef3371f6 250 UNLOCK();
RobMeades 0:5cffef3371f6 251 return success;
RobMeades 0:5cffef3371f6 252 }
RobMeades 0:5cffef3371f6 253
RobMeades 0:5cffef3371f6 254 bool UbloxCellularBase::get_meid()
RobMeades 0:5cffef3371f6 255 {
RobMeades 0:5cffef3371f6 256 bool success;
RobMeades 0:5cffef3371f6 257 LOCK();
RobMeades 0:5cffef3371f6 258
RobMeades 0:5cffef3371f6 259 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 260
RobMeades 0:5cffef3371f6 261 // Mobile equipment identifier
RobMeades 0:5cffef3371f6 262 // AT Command Manual UBX-13002752, section 4.8
RobMeades 0:5cffef3371f6 263 success = _at->send("AT+GSN") && _at->recv("%18[^\n]\nOK\n", _dev_info.meid);
RobMeades 0:5cffef3371f6 264 tr_info("DevInfo: MEID=%s", _dev_info.meid);
RobMeades 0:5cffef3371f6 265
RobMeades 0:5cffef3371f6 266 UNLOCK();
RobMeades 0:5cffef3371f6 267 return success;
RobMeades 0:5cffef3371f6 268 }
RobMeades 0:5cffef3371f6 269
RobMeades 0:5cffef3371f6 270 bool UbloxCellularBase::set_sms()
RobMeades 0:5cffef3371f6 271 {
RobMeades 0:5cffef3371f6 272 bool success = false;
RobMeades 0:5cffef3371f6 273 char buf[32];
RobMeades 0:5cffef3371f6 274 LOCK();
RobMeades 0:5cffef3371f6 275
RobMeades 0:5cffef3371f6 276 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 277
RobMeades 0:5cffef3371f6 278 // Set up SMS format and enable URC
RobMeades 0:5cffef3371f6 279 // AT Command Manual UBX-13002752, section 11
fahimalavi 39:945019c3d194 280 #if 0 // SARA-R5 changes
RobMeades 0:5cffef3371f6 281 if (_at->send("AT+CMGF=1") && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 282 tr_debug("SMS in text mode");
RobMeades 0:5cffef3371f6 283 if (_at->send("AT+CNMI=2,1") && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 284 tr_debug("SMS URC enabled");
RobMeades 0:5cffef3371f6 285 // Set to CS preferred since PS preferred doesn't work
RobMeades 0:5cffef3371f6 286 // on some networks
RobMeades 0:5cffef3371f6 287 if (_at->send("AT+CGSMS=1") && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 288 tr_debug("SMS set to CS preferred");
RobMeades 0:5cffef3371f6 289 success = true;
RobMeades 0:5cffef3371f6 290 memset (buf, 0, sizeof (buf));
RobMeades 0:5cffef3371f6 291 if (_at->send("AT+CSCA?") &&
RobMeades 0:5cffef3371f6 292 _at->recv("+CSCA: \"%31[^\"]\"", buf) &&
RobMeades 0:5cffef3371f6 293 _at->recv("OK")) {
RobMeades 0:5cffef3371f6 294 tr_info("SMS Service Centre address is \"%s\"", buf);
RobMeades 0:5cffef3371f6 295 }
RobMeades 0:5cffef3371f6 296 }
RobMeades 0:5cffef3371f6 297 }
RobMeades 0:5cffef3371f6 298 }
fahimalavi 39:945019c3d194 299 #else // SARA-R5 changes
fahimalavi 39:945019c3d194 300 success = true;
fahimalavi 39:945019c3d194 301 #endif
RobMeades 0:5cffef3371f6 302
RobMeades 0:5cffef3371f6 303 UNLOCK();
RobMeades 0:5cffef3371f6 304 return success;
RobMeades 0:5cffef3371f6 305 }
RobMeades 0:5cffef3371f6 306
RobMeades 0:5cffef3371f6 307 void UbloxCellularBase::parser_abort_cb()
RobMeades 0:5cffef3371f6 308 {
RobMeades 0:5cffef3371f6 309 _at->abort();
RobMeades 0:5cffef3371f6 310 }
RobMeades 0:5cffef3371f6 311
RobMeades 0:5cffef3371f6 312 // Callback for CME ERROR and CMS ERROR.
RobMeades 0:5cffef3371f6 313 void UbloxCellularBase::CMX_ERROR_URC()
RobMeades 0:5cffef3371f6 314 {
RobMeades 0:5cffef3371f6 315 char buf[48];
RobMeades 0:5cffef3371f6 316
RobMeades 0:5cffef3371f6 317 if (read_at_to_char(buf, sizeof (buf), '\n') > 0) {
RobMeades 0:5cffef3371f6 318 tr_debug("AT error %s", buf);
RobMeades 0:5cffef3371f6 319 }
RobMeades 0:5cffef3371f6 320 parser_abort_cb();
RobMeades 0:5cffef3371f6 321 }
RobMeades 0:5cffef3371f6 322
RobMeades 0:5cffef3371f6 323 // Callback for circuit switched registration URC.
RobMeades 0:5cffef3371f6 324 void UbloxCellularBase::CREG_URC()
RobMeades 0:5cffef3371f6 325 {
RobMeades 0:5cffef3371f6 326 char buf[10];
RobMeades 0:5cffef3371f6 327 int status;
RobMeades 14:e420232ee4e7 328 int acTStatus;
RobMeades 0:5cffef3371f6 329
RobMeades 0:5cffef3371f6 330 // If this is the URC it will be a single
RobMeades 0:5cffef3371f6 331 // digit followed by \n. If it is the
RobMeades 0:5cffef3371f6 332 // answer to a CREG query, it will be
RobMeades 0:5cffef3371f6 333 // a ": %d,%d\n" where the second digit
RobMeades 0:5cffef3371f6 334 // indicates the status
RobMeades 0:5cffef3371f6 335 // Note: not calling _at->recv() from here as we're
RobMeades 0:5cffef3371f6 336 // already in an _at->recv()
RobMeades 0:5cffef3371f6 337 if (read_at_to_char(buf, sizeof (buf), '\n') > 0) {
RobMeades 14:e420232ee4e7 338 if (sscanf(buf, ": %*d,%d,%*d,%*d,%d,", &status, &acTStatus) == 2) {
RobMeades 14:e420232ee4e7 339 set_nwk_reg_status_csd(status);
RobMeades 14:e420232ee4e7 340 set_rat(acTStatus);
RobMeades 14:e420232ee4e7 341 } else if (sscanf(buf, ": %*d,%d", &status) == 1) {
RobMeades 0:5cffef3371f6 342 set_nwk_reg_status_csd(status);
RobMeades 0:5cffef3371f6 343 } else if (sscanf(buf, ": %d", &status) == 1) {
RobMeades 0:5cffef3371f6 344 set_nwk_reg_status_csd(status);
RobMeades 0:5cffef3371f6 345 }
RobMeades 0:5cffef3371f6 346 }
RobMeades 0:5cffef3371f6 347 }
RobMeades 0:5cffef3371f6 348
RobMeades 0:5cffef3371f6 349 // Callback for packet switched registration URC.
RobMeades 0:5cffef3371f6 350 void UbloxCellularBase::CGREG_URC()
RobMeades 0:5cffef3371f6 351 {
RobMeades 0:5cffef3371f6 352 char buf[10];
RobMeades 0:5cffef3371f6 353 int status;
RobMeades 14:e420232ee4e7 354 int acTStatus;
RobMeades 0:5cffef3371f6 355
RobMeades 0:5cffef3371f6 356 // If this is the URC it will be a single
RobMeades 0:5cffef3371f6 357 // digit followed by \n. If it is the
RobMeades 0:5cffef3371f6 358 // answer to a CGREG query, it will be
RobMeades 0:5cffef3371f6 359 // a ": %d,%d\n" where the second digit
RobMeades 0:5cffef3371f6 360 // indicates the status
RobMeades 0:5cffef3371f6 361 // Note: not calling _at->recv() from here as we're
RobMeades 0:5cffef3371f6 362 // already in an _at->recv()
RobMeades 0:5cffef3371f6 363 if (read_at_to_char(buf, sizeof (buf), '\n') > 0) {
RobMeades 14:e420232ee4e7 364 if (sscanf(buf, ": %*d,%d,%*d,%*d,%d,", &status, &acTStatus) == 2) {
RobMeades 14:e420232ee4e7 365 set_nwk_reg_status_csd(status);
RobMeades 14:e420232ee4e7 366 set_rat(acTStatus);
RobMeades 14:e420232ee4e7 367 } else if (sscanf(buf, ": %*d,%d", &status) == 1) {
RobMeades 0:5cffef3371f6 368 set_nwk_reg_status_psd(status);
RobMeades 0:5cffef3371f6 369 } else if (sscanf(buf, ": %d", &status) == 1) {
RobMeades 0:5cffef3371f6 370 set_nwk_reg_status_psd(status);
RobMeades 0:5cffef3371f6 371 }
RobMeades 0:5cffef3371f6 372 }
RobMeades 0:5cffef3371f6 373 }
RobMeades 0:5cffef3371f6 374
RobMeades 0:5cffef3371f6 375 // Callback for EPS registration URC.
RobMeades 0:5cffef3371f6 376 void UbloxCellularBase::CEREG_URC()
RobMeades 0:5cffef3371f6 377 {
RobMeades 0:5cffef3371f6 378 char buf[10];
RobMeades 0:5cffef3371f6 379 int status;
RobMeades 14:e420232ee4e7 380 int acTStatus;
RobMeades 0:5cffef3371f6 381
RobMeades 0:5cffef3371f6 382 // If this is the URC it will be a single
RobMeades 0:5cffef3371f6 383 // digit followed by \n. If it is the
RobMeades 0:5cffef3371f6 384 // answer to a CEREG query, it will be
RobMeades 0:5cffef3371f6 385 // a ": %d,%d\n" where the second digit
RobMeades 0:5cffef3371f6 386 // indicates the status
RobMeades 0:5cffef3371f6 387 // Note: not calling _at->recv() from here as we're
RobMeades 0:5cffef3371f6 388 // already in an _at->recv()
RobMeades 0:5cffef3371f6 389 if (read_at_to_char(buf, sizeof (buf), '\n') > 0) {
RobMeades 14:e420232ee4e7 390 if (sscanf(buf, ": %*d,%d,%*d,%*d,%d,", &status, &acTStatus) == 2) {
RobMeades 14:e420232ee4e7 391 set_nwk_reg_status_csd(status);
RobMeades 14:e420232ee4e7 392 set_rat(acTStatus);
RobMeades 14:e420232ee4e7 393 } else if (sscanf(buf, ": %*d,%d", &status) == 1) {
RobMeades 0:5cffef3371f6 394 set_nwk_reg_status_eps(status);
RobMeades 0:5cffef3371f6 395 } else if (sscanf(buf, ": %d", &status) == 1) {
RobMeades 0:5cffef3371f6 396 set_nwk_reg_status_eps(status);
RobMeades 0:5cffef3371f6 397 }
RobMeades 0:5cffef3371f6 398 }
RobMeades 0:5cffef3371f6 399 }
RobMeades 0:5cffef3371f6 400
RobMeades 0:5cffef3371f6 401 // Callback UMWI, just filtering it out.
RobMeades 0:5cffef3371f6 402 void UbloxCellularBase::UMWI_URC()
RobMeades 0:5cffef3371f6 403 {
RobMeades 0:5cffef3371f6 404 char buf[10];
RobMeades 0:5cffef3371f6 405
RobMeades 0:5cffef3371f6 406 // Note: not calling _at->recv() from here as we're
RobMeades 0:5cffef3371f6 407 // already in an _at->recv()
RobMeades 0:5cffef3371f6 408 read_at_to_char(buf, sizeof (buf), '\n');
RobMeades 0:5cffef3371f6 409 }
RobMeades 0:5cffef3371f6 410
wajahat.abbas@u-blox.com 23:eaab8e812a5d 411 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 23:eaab8e812a5d 412 // Callback UUPSMR, set/clear flag for modem psm state.
wajahat.abbas@u-blox.com 23:eaab8e812a5d 413 void UbloxCellularBase::UUPSMR_URC()
wajahat.abbas@u-blox.com 23:eaab8e812a5d 414 {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 415 int status;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 416 char buf[10];
wajahat.abbas@u-blox.com 23:eaab8e812a5d 417
wajahat.abbas@u-blox.com 23:eaab8e812a5d 418 if (read_at_to_char(buf, sizeof (buf), '\n') > 0) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 419 if (sscanf(buf, ": %d", &status) == 1) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 420 set_modem_psm_state(status);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 421 //call application registered callbacks
wajahat.abbas@u-blox.com 23:eaab8e812a5d 422 if (status == AWAKE) { //modem coming out of sleep
wajahat.abbas@u-blox.com 23:eaab8e812a5d 423 if (_func_psm_coming_out) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 424 _func_psm_coming_out(_cb_param_psm_coming_out);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 425 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 426 } else if(status == ASLEEP) { //modem going into sleep
wajahat.abbas@u-blox.com 23:eaab8e812a5d 427 if (_func_psm_going_in) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 428 _func_psm_going_in(_cb_param_psm_going_in);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 429 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 430 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 431 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 432 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 433 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 434 #endif
RobMeades 0:5cffef3371f6 435 /**********************************************************************
RobMeades 0:5cffef3371f6 436 * PROTECTED METHODS
RobMeades 0:5cffef3371f6 437 **********************************************************************/
RobMeades 0:5cffef3371f6 438
RobMeades 0:5cffef3371f6 439 #if MODEM_ON_BOARD
RobMeades 0:5cffef3371f6 440 void UbloxCellularBase::modem_init()
RobMeades 0:5cffef3371f6 441 {
RobMeades 0:5cffef3371f6 442 ::onboard_modem_init();
RobMeades 0:5cffef3371f6 443 }
RobMeades 0:5cffef3371f6 444
RobMeades 0:5cffef3371f6 445 void UbloxCellularBase::modem_deinit()
RobMeades 0:5cffef3371f6 446 {
RobMeades 0:5cffef3371f6 447 ::onboard_modem_deinit();
RobMeades 0:5cffef3371f6 448 }
RobMeades 0:5cffef3371f6 449
RobMeades 0:5cffef3371f6 450 void UbloxCellularBase::modem_power_up()
RobMeades 0:5cffef3371f6 451 {
RobMeades 0:5cffef3371f6 452 ::onboard_modem_power_up();
RobMeades 0:5cffef3371f6 453 }
RobMeades 0:5cffef3371f6 454
RobMeades 0:5cffef3371f6 455 void UbloxCellularBase::modem_power_down()
RobMeades 0:5cffef3371f6 456 {
RobMeades 0:5cffef3371f6 457 ::onboard_modem_power_down();
RobMeades 0:5cffef3371f6 458 }
RobMeades 0:5cffef3371f6 459 #else
RobMeades 0:5cffef3371f6 460 void UbloxCellularBase::modem_init()
RobMeades 0:5cffef3371f6 461 {
RobMeades 0:5cffef3371f6 462 // Meant to be overridden
RobMeades 0:5cffef3371f6 463 }
RobMeades 0:5cffef3371f6 464
RobMeades 0:5cffef3371f6 465 void UbloxCellularBase::modem_deinit()
RobMeades 0:5cffef3371f6 466 {
RobMeades 0:5cffef3371f6 467 // Meant to be overridden
RobMeades 0:5cffef3371f6 468 }
RobMeades 0:5cffef3371f6 469
RobMeades 0:5cffef3371f6 470 void UbloxCellularBase::modem_power_up()
RobMeades 0:5cffef3371f6 471 {
RobMeades 0:5cffef3371f6 472 // Meant to be overridden
RobMeades 0:5cffef3371f6 473 }
RobMeades 0:5cffef3371f6 474
RobMeades 0:5cffef3371f6 475 void UbloxCellularBase::modem_power_down()
RobMeades 0:5cffef3371f6 476 {
RobMeades 0:5cffef3371f6 477 // Mmeant to be overridden
RobMeades 0:5cffef3371f6 478 }
RobMeades 0:5cffef3371f6 479 #endif
RobMeades 0:5cffef3371f6 480
RobMeades 0:5cffef3371f6 481 // Constructor.
RobMeades 0:5cffef3371f6 482 // Note: to allow this base class to be inherited as a virtual base class
RobMeades 0:5cffef3371f6 483 // by everyone, it takes no parameters. See also comment above classInit()
RobMeades 0:5cffef3371f6 484 // in the header file.
RobMeades 0:5cffef3371f6 485 UbloxCellularBase::UbloxCellularBase()
RobMeades 0:5cffef3371f6 486 {
RobMeades 0:5cffef3371f6 487 _pin = NULL;
RobMeades 0:5cffef3371f6 488 _at = NULL;
RobMeades 0:5cffef3371f6 489 _at_timeout = AT_PARSER_TIMEOUT;
RobMeades 0:5cffef3371f6 490 _fh = NULL;
RobMeades 0:5cffef3371f6 491 _modem_initialised = false;
RobMeades 0:5cffef3371f6 492 _sim_pin_check_enabled = false;
RobMeades 0:5cffef3371f6 493 _debug_trace_on = false;
RobMeades 0:5cffef3371f6 494
RobMeades 0:5cffef3371f6 495 _dev_info.dev = DEV_TYPE_NONE;
RobMeades 0:5cffef3371f6 496 _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 497 _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 498 _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 499 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 23:eaab8e812a5d 500 _dev_info.modem_psm_state = AWAKE;
wajahat.abbas@u-blox.com 34:d239824bfb8f 501 _psm_status = UNKNOWN;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 502 _cb_param_psm_going_in = NULL;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 503 _func_psm_going_in = NULL;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 504 _cb_param_psm_coming_out = NULL;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 505 _func_psm_coming_out = NULL;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 506 #endif
RobMeades 0:5cffef3371f6 507 }
RobMeades 0:5cffef3371f6 508
RobMeades 0:5cffef3371f6 509 // Destructor.
RobMeades 0:5cffef3371f6 510 UbloxCellularBase::~UbloxCellularBase()
RobMeades 0:5cffef3371f6 511 {
RobMeades 0:5cffef3371f6 512 deinit();
RobMeades 0:5cffef3371f6 513 delete _at;
RobMeades 0:5cffef3371f6 514 delete _fh;
RobMeades 0:5cffef3371f6 515 }
RobMeades 0:5cffef3371f6 516
RobMeades 0:5cffef3371f6 517 // Initialise the portions of this class that are parameterised.
RobMeades 0:5cffef3371f6 518 void UbloxCellularBase::baseClassInit(PinName tx, PinName rx,
RobMeades 0:5cffef3371f6 519 int baud, bool debug_on)
RobMeades 0:5cffef3371f6 520 {
RobMeades 0:5cffef3371f6 521 // Only initialise ourselves if it's not already been done
RobMeades 0:5cffef3371f6 522 if (_at == NULL) {
RobMeades 0:5cffef3371f6 523 if (_debug_trace_on == false) {
RobMeades 0:5cffef3371f6 524 _debug_trace_on = debug_on;
RobMeades 0:5cffef3371f6 525 }
rob.meades@u-blox.com 4:2e640a101db1 526 _baud = baud;
RobMeades 0:5cffef3371f6 527
RobMeades 0:5cffef3371f6 528 // Set up File Handle for buffered serial comms with cellular module
RobMeades 0:5cffef3371f6 529 // (which will be used by the AT parser)
rob.meades@u-blox.com 4:2e640a101db1 530 // Note: the UART is initialised to run no faster than 115200 because
rob.meades@u-blox.com 4:2e640a101db1 531 // the modems cannot reliably auto-baud at faster rates. The faster
rob.meades@u-blox.com 4:2e640a101db1 532 // rate is adopted later with a specific AT command and the
rob.meades@u-blox.com 4:2e640a101db1 533 // UARTSerial rate is adjusted at that time
rob.meades@u-blox.com 4:2e640a101db1 534 if (baud > 115200) {
rob.meades@u-blox.com 4:2e640a101db1 535 baud = 115200;
rob.meades@u-blox.com 4:2e640a101db1 536 }
fahimalavi 39:945019c3d194 537 #if 0 // SARA-R5
fahimalavi 39:945019c3d194 538 _fh = new UARTSerial(tx, rx, 0);
fahimalavi 39:945019c3d194 539 #else
RobMeades 0:5cffef3371f6 540 _fh = new UARTSerial(tx, rx, baud);
fahimalavi 39:945019c3d194 541 #endif
RobMeades 0:5cffef3371f6 542
RobMeades 0:5cffef3371f6 543 // Set up the AT parser
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 544 #ifdef TARGET_UBLOX_C030_R41XM
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 545 _at = new UbloxATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 546 _at_timeout, _debug_trace_on);
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 547 #else
RobMeades 0:5cffef3371f6 548 _at = new ATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
rob.meades@u-blox.com 3:f9b2cd6f72b1 549 _at_timeout, _debug_trace_on);
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 550 #endif
RobMeades 0:5cffef3371f6 551
RobMeades 0:5cffef3371f6 552 // Error cases, out of band handling
RobMeades 0:5cffef3371f6 553 _at->oob("ERROR", callback(this, &UbloxCellularBase::parser_abort_cb));
RobMeades 0:5cffef3371f6 554 _at->oob("+CME ERROR", callback(this, &UbloxCellularBase::CMX_ERROR_URC));
RobMeades 0:5cffef3371f6 555 _at->oob("+CMS ERROR", callback(this, &UbloxCellularBase::CMX_ERROR_URC));
RobMeades 0:5cffef3371f6 556
RobMeades 0:5cffef3371f6 557 // Registration status, out of band handling
RobMeades 0:5cffef3371f6 558 _at->oob("+CREG", callback(this, &UbloxCellularBase::CREG_URC));
RobMeades 0:5cffef3371f6 559 _at->oob("+CGREG", callback(this, &UbloxCellularBase::CGREG_URC));
RobMeades 0:5cffef3371f6 560 _at->oob("+CEREG", callback(this, &UbloxCellularBase::CEREG_URC));
RobMeades 0:5cffef3371f6 561
RobMeades 0:5cffef3371f6 562 // Capture the UMWI, just to stop it getting in the way
RobMeades 0:5cffef3371f6 563 _at->oob("+UMWI", callback(this, &UbloxCellularBase::UMWI_URC));
wajahat.abbas@u-blox.com 23:eaab8e812a5d 564 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 23:eaab8e812a5d 565 // Handle PSM URC for going in and coming out of PSM
wajahat.abbas@u-blox.com 23:eaab8e812a5d 566 _at->oob("+UUPSMR", callback(this, &UbloxCellularBase::UUPSMR_URC));
wajahat.abbas@u-blox.com 23:eaab8e812a5d 567 #endif
RobMeades 0:5cffef3371f6 568 }
RobMeades 0:5cffef3371f6 569 }
RobMeades 0:5cffef3371f6 570
RobMeades 0:5cffef3371f6 571 // Set the AT parser timeout.
RobMeades 0:5cffef3371f6 572 // Note: the AT interface should be locked before this is called.
RobMeades 0:5cffef3371f6 573 void UbloxCellularBase::at_set_timeout(int timeout) {
RobMeades 0:5cffef3371f6 574
RobMeades 0:5cffef3371f6 575 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 576
RobMeades 0:5cffef3371f6 577 _at_timeout = timeout;
RobMeades 0:5cffef3371f6 578 _at->set_timeout(timeout);
RobMeades 0:5cffef3371f6 579 }
RobMeades 0:5cffef3371f6 580
RobMeades 0:5cffef3371f6 581 // Read up to size bytes from the AT interface up to a "end".
RobMeades 0:5cffef3371f6 582 // Note: the AT interface should be locked before this is called.
RobMeades 0:5cffef3371f6 583 int UbloxCellularBase::read_at_to_char(char * buf, int size, char end)
RobMeades 0:5cffef3371f6 584 {
RobMeades 0:5cffef3371f6 585 int count = 0;
RobMeades 0:5cffef3371f6 586 int x = 0;
RobMeades 0:5cffef3371f6 587
RobMeades 0:5cffef3371f6 588 if (size > 0) {
RobMeades 0:5cffef3371f6 589 for (count = 0; (count < size) && (x >= 0) && (x != end); count++) {
RobMeades 0:5cffef3371f6 590 x = _at->getc();
RobMeades 0:5cffef3371f6 591 *(buf + count) = (char) x;
RobMeades 0:5cffef3371f6 592 }
RobMeades 0:5cffef3371f6 593
RobMeades 0:5cffef3371f6 594 count--;
RobMeades 0:5cffef3371f6 595 *(buf + count) = 0;
RobMeades 0:5cffef3371f6 596
RobMeades 0:5cffef3371f6 597 // Convert line endings:
RobMeades 0:5cffef3371f6 598 // If end was '\n' (0x0a) and the preceding character was 0x0d, then
RobMeades 0:5cffef3371f6 599 // overwrite that with null as well.
RobMeades 0:5cffef3371f6 600 if ((count > 0) && (end == '\n') && (*(buf + count - 1) == '\x0d')) {
RobMeades 0:5cffef3371f6 601 count--;
RobMeades 0:5cffef3371f6 602 *(buf + count) = 0;
RobMeades 0:5cffef3371f6 603 }
RobMeades 0:5cffef3371f6 604 }
RobMeades 0:5cffef3371f6 605
RobMeades 0:5cffef3371f6 606 return count;
RobMeades 0:5cffef3371f6 607 }
RobMeades 0:5cffef3371f6 608
RobMeades 0:5cffef3371f6 609 // Power up the modem.
RobMeades 0:5cffef3371f6 610 // Enables the GPIO lines to the modem and then wriggles the power line in short pulses.
RobMeades 0:5cffef3371f6 611 bool UbloxCellularBase::power_up()
RobMeades 0:5cffef3371f6 612 {
RobMeades 0:5cffef3371f6 613 bool success = false;
RobMeades 0:5cffef3371f6 614
RobMeades 0:5cffef3371f6 615 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 616
RobMeades 0:5cffef3371f6 617 /* Initialize GPIO lines */
RobMeades 0:5cffef3371f6 618 tr_info("Powering up modem...");
pilotak 7:c2cf27a981b3 619 modem_init();
RobMeades 0:5cffef3371f6 620 /* Give modem a little time to settle down */
mudassar0121 37:a2466fcd63c3 621 ThisThread::sleep_for(250);
RobMeades 0:5cffef3371f6 622
RobMeades 0:5cffef3371f6 623 for (int retry_count = 0; !success && (retry_count < 20); retry_count++) {
wajahat.abbas@u-blox.com 16:afb3ca2d9915 624 //In case of SARA-R4, modem takes a while to turn on, constantly toggling the power pin every ~2 secs causes the modem to never power up.
wajahat.abbas@u-blox.com 34:d239824bfb8f 625 if ( (retry_count % 5) == 0) {
wajahat.abbas@u-blox.com 16:afb3ca2d9915 626 modem_power_up();
wajahat.abbas@u-blox.com 16:afb3ca2d9915 627 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 628 success = is_modem_ready();
RobMeades 0:5cffef3371f6 629 }
RobMeades 0:5cffef3371f6 630
wajahat.abbas@u-blox.com 34:d239824bfb8f 631 return success;
wajahat.abbas@u-blox.com 34:d239824bfb8f 632 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 633
wajahat.abbas@u-blox.com 34:d239824bfb8f 634 bool UbloxCellularBase::setup_modem()
wajahat.abbas@u-blox.com 34:d239824bfb8f 635 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 636 bool success = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 637 LOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 638
wajahat.abbas@u-blox.com 34:d239824bfb8f 639 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 34:d239824bfb8f 640
wajahat.abbas@u-blox.com 34:d239824bfb8f 641 // Set the final baud rate
wajahat.abbas@u-blox.com 34:d239824bfb8f 642 if (_at->send("AT+IPR=%d", _baud) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 643 // Need to wait for things to be sorted out on the modem side
mudassar0121 37:a2466fcd63c3 644 ThisThread::sleep_for(100);
wajahat.abbas@u-blox.com 34:d239824bfb8f 645 ((UARTSerial *)_fh)->set_baud(_baud);
wajahat.abbas@u-blox.com 34:d239824bfb8f 646
rob.meades@u-blox.com 4:2e640a101db1 647 // Turn off modem echoing and turn on verbose responses
rob.meades@u-blox.com 4:2e640a101db1 648 success = _at->send("ATE0;+CMEE=2") && _at->recv("OK") &&
rob.meades@u-blox.com 4:2e640a101db1 649 // The following commands are best sent separately
rob.meades@u-blox.com 4:2e640a101db1 650 _at->send("AT&K0") && _at->recv("OK") && // Turn off RTC/CTS handshaking
rob.meades@u-blox.com 4:2e640a101db1 651 _at->send("AT&C1") && _at->recv("OK") && // Set DCD circuit(109), changes in accordance with the carrier detect status
rob.meades@u-blox.com 4:2e640a101db1 652 _at->send("AT&D0") && _at->recv("OK"); // Set DTR circuit, we ignore the state change of DTR
rob.meades@u-blox.com 4:2e640a101db1 653 }
RobMeades 0:5cffef3371f6 654
RobMeades 0:5cffef3371f6 655 if (!success) {
RobMeades 0:5cffef3371f6 656 tr_error("Preliminary modem setup failed.");
RobMeades 0:5cffef3371f6 657 }
RobMeades 0:5cffef3371f6 658
RobMeades 0:5cffef3371f6 659 UNLOCK();
RobMeades 0:5cffef3371f6 660 return success;
RobMeades 0:5cffef3371f6 661 }
RobMeades 0:5cffef3371f6 662
wajahat.abbas@u-blox.com 34:d239824bfb8f 663 bool UbloxCellularBase::is_modem_ready()
wajahat.abbas@u-blox.com 34:d239824bfb8f 664 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 665 bool success = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 666 int at_timeout;
wajahat.abbas@u-blox.com 34:d239824bfb8f 667 LOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 668
wajahat.abbas@u-blox.com 34:d239824bfb8f 669 at_timeout = _at_timeout; // Has to be inside LOCK()s
wajahat.abbas@u-blox.com 34:d239824bfb8f 670
wajahat.abbas@u-blox.com 34:d239824bfb8f 671 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 34:d239824bfb8f 672
wajahat.abbas@u-blox.com 34:d239824bfb8f 673 _at->flush();
wajahat.abbas@u-blox.com 34:d239824bfb8f 674 at_set_timeout(1000);
wajahat.abbas@u-blox.com 34:d239824bfb8f 675 if (_at->send("AT")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 676 // C027 needs a delay here
mudassar0121 37:a2466fcd63c3 677 ThisThread::sleep_for(100);
wajahat.abbas@u-blox.com 34:d239824bfb8f 678 if (_at->recv("OK")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 679 success = true;
wajahat.abbas@u-blox.com 34:d239824bfb8f 680 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 681 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 682 at_set_timeout(at_timeout);
wajahat.abbas@u-blox.com 34:d239824bfb8f 683
wajahat.abbas@u-blox.com 34:d239824bfb8f 684 UNLOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 685 return success;
wajahat.abbas@u-blox.com 34:d239824bfb8f 686 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 687
wajahat.abbas@u-blox.com 34:d239824bfb8f 688 bool UbloxCellularBase::initialize_modem()
wajahat.abbas@u-blox.com 34:d239824bfb8f 689 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 690 bool success = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 691
wajahat.abbas@u-blox.com 34:d239824bfb8f 692 if (power_up()) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 693 success = setup_modem();
wajahat.abbas@u-blox.com 34:d239824bfb8f 694 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 695 tr_error("Preliminary modem setup failed.");
wajahat.abbas@u-blox.com 34:d239824bfb8f 696 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 697 return success;
wajahat.abbas@u-blox.com 34:d239824bfb8f 698 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 699
RobMeades 0:5cffef3371f6 700 // Power down modem via AT interface.
RobMeades 0:5cffef3371f6 701 void UbloxCellularBase::power_down()
RobMeades 0:5cffef3371f6 702 {
RobMeades 0:5cffef3371f6 703 LOCK();
RobMeades 0:5cffef3371f6 704
RobMeades 0:5cffef3371f6 705 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 706
Mudassar Hussain 17:c6a4d5072589 707 // power-off modem
pilotak 7:c2cf27a981b3 708 modem_power_down();
pilotak 7:c2cf27a981b3 709 modem_deinit();
RobMeades 0:5cffef3371f6 710
Mudassar Hussain 17:c6a4d5072589 711 if (_modem_initialised && (_at != NULL)) {
Mudassar Hussain 17:c6a4d5072589 712 int at_timeout = _at_timeout; // Save previous timeout
wajahat.abbas@u-blox.com 23:eaab8e812a5d 713 _at->set_timeout(1000);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 714 // Check modem is powered off
wajahat.abbas@u-blox.com 23:eaab8e812a5d 715 if(_at->send("AT") && _at->recv("OK")) {
Mudassar Hussain 17:c6a4d5072589 716 _at->send("AT+CPWROFF") && _at->recv("OK");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 717 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 718 _at->set_timeout(at_timeout);
Mudassar Hussain 17:c6a4d5072589 719 }
Mudassar Hussain 17:c6a4d5072589 720
RobMeades 0:5cffef3371f6 721 _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 722 _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 723 _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 724
RobMeades 0:5cffef3371f6 725 UNLOCK();
RobMeades 0:5cffef3371f6 726 }
RobMeades 0:5cffef3371f6 727
RobMeades 0:5cffef3371f6 728 // Get the device ID.
RobMeades 0:5cffef3371f6 729 bool UbloxCellularBase::set_device_identity(DeviceType *dev)
RobMeades 0:5cffef3371f6 730 {
RobMeades 0:5cffef3371f6 731 char buf[20];
RobMeades 0:5cffef3371f6 732 bool success;
RobMeades 0:5cffef3371f6 733 LOCK();
RobMeades 0:5cffef3371f6 734
RobMeades 0:5cffef3371f6 735 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 736
RobMeades 0:5cffef3371f6 737 success = _at->send("ATI") && _at->recv("%19[^\n]\nOK\n", buf);
RobMeades 0:5cffef3371f6 738
RobMeades 0:5cffef3371f6 739 if (success) {
RobMeades 0:5cffef3371f6 740 if (strstr(buf, "SARA-G35"))
RobMeades 0:5cffef3371f6 741 *dev = DEV_SARA_G35;
RobMeades 0:5cffef3371f6 742 else if (strstr(buf, "LISA-U200-03S"))
RobMeades 0:5cffef3371f6 743 *dev = DEV_LISA_U2_03S;
RobMeades 0:5cffef3371f6 744 else if (strstr(buf, "LISA-U2"))
RobMeades 0:5cffef3371f6 745 *dev = DEV_LISA_U2;
RobMeades 0:5cffef3371f6 746 else if (strstr(buf, "SARA-U2"))
RobMeades 0:5cffef3371f6 747 *dev = DEV_SARA_U2;
fahimalavi 38:b33dc3d26690 748 else if (strstr(buf, "SARA-R4") || strstr(buf, "SARA-R5"))
fahimalavi 10:c4281fa79b8f 749 *dev = DEV_SARA_R4;
RobMeades 0:5cffef3371f6 750 else if (strstr(buf, "LEON-G2"))
RobMeades 0:5cffef3371f6 751 *dev = DEV_LEON_G2;
RobMeades 0:5cffef3371f6 752 else if (strstr(buf, "TOBY-L2"))
RobMeades 0:5cffef3371f6 753 *dev = DEV_TOBY_L2;
RobMeades 0:5cffef3371f6 754 else if (strstr(buf, "MPCI-L2"))
RobMeades 0:5cffef3371f6 755 *dev = DEV_MPCI_L2;
fahimalavi 38:b33dc3d26690 756 else
fahimalavi 38:b33dc3d26690 757 *dev = DEV_SARA_R4;
RobMeades 0:5cffef3371f6 758 }
RobMeades 0:5cffef3371f6 759
fahimalavi 38:b33dc3d26690 760 //_at->send("AT+CGMR") && _at->recv("%5[^\n]\nOK\n", buf);
fahimalavi 38:b33dc3d26690 761
RobMeades 0:5cffef3371f6 762 UNLOCK();
RobMeades 0:5cffef3371f6 763 return success;
RobMeades 0:5cffef3371f6 764 }
RobMeades 0:5cffef3371f6 765
RobMeades 0:5cffef3371f6 766 // Send initialisation AT commands that are specific to the device.
RobMeades 0:5cffef3371f6 767 bool UbloxCellularBase::device_init(DeviceType dev)
RobMeades 0:5cffef3371f6 768 {
RobMeades 0:5cffef3371f6 769 bool success = false;
RobMeades 0:5cffef3371f6 770 LOCK();
RobMeades 0:5cffef3371f6 771
RobMeades 0:5cffef3371f6 772 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 773
RobMeades 0:5cffef3371f6 774 if ((dev == DEV_LISA_U2) || (dev == DEV_LEON_G2) || (dev == DEV_TOBY_L2)) {
RobMeades 0:5cffef3371f6 775 success = _at->send("AT+UGPIOC=20,2") && _at->recv("OK");
RobMeades 0:5cffef3371f6 776 } else if ((dev == DEV_SARA_U2) || (dev == DEV_SARA_G35)) {
RobMeades 0:5cffef3371f6 777 success = _at->send("AT+UGPIOC=16,2") && _at->recv("OK");
RobMeades 0:5cffef3371f6 778 } else {
RobMeades 0:5cffef3371f6 779 success = true;
RobMeades 0:5cffef3371f6 780 }
RobMeades 0:5cffef3371f6 781
RobMeades 0:5cffef3371f6 782 UNLOCK();
RobMeades 0:5cffef3371f6 783 return success;
RobMeades 0:5cffef3371f6 784 }
RobMeades 0:5cffef3371f6 785
RobMeades 0:5cffef3371f6 786 // Get the SIM card going.
RobMeades 0:5cffef3371f6 787 bool UbloxCellularBase::initialise_sim_card()
RobMeades 0:5cffef3371f6 788 {
RobMeades 0:5cffef3371f6 789 bool success = false;
RobMeades 0:5cffef3371f6 790 int retry_count = 0;
RobMeades 0:5cffef3371f6 791 bool done = false;
RobMeades 0:5cffef3371f6 792 LOCK();
RobMeades 0:5cffef3371f6 793
RobMeades 0:5cffef3371f6 794 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 795
RobMeades 0:5cffef3371f6 796 /* SIM initialisation may take a significant amount, so an error is
RobMeades 0:5cffef3371f6 797 * kind of expected. We should retry 10 times until we succeed or timeout. */
RobMeades 0:5cffef3371f6 798 for (retry_count = 0; !done && (retry_count < 10); retry_count++) {
RobMeades 0:5cffef3371f6 799 char pinstr[16];
RobMeades 0:5cffef3371f6 800
RobMeades 0:5cffef3371f6 801 if (_at->send("AT+CPIN?") && _at->recv("+CPIN: %15[^\n]\n", pinstr) &&
RobMeades 0:5cffef3371f6 802 _at->recv("OK")) {
RobMeades 0:5cffef3371f6 803 done = true;
RobMeades 0:5cffef3371f6 804 if (strcmp(pinstr, "SIM PIN") == 0) {
RobMeades 0:5cffef3371f6 805 _sim_pin_check_enabled = true;
RobMeades 0:5cffef3371f6 806 if (_at->send("AT+CPIN=\"%s\"", _pin)) {
RobMeades 0:5cffef3371f6 807 if (_at->recv("OK")) {
RobMeades 0:5cffef3371f6 808 tr_info("PIN correct");
RobMeades 0:5cffef3371f6 809 success = true;
RobMeades 0:5cffef3371f6 810 } else {
RobMeades 0:5cffef3371f6 811 tr_error("Incorrect PIN");
RobMeades 0:5cffef3371f6 812 }
RobMeades 0:5cffef3371f6 813 }
RobMeades 0:5cffef3371f6 814 } else if (strcmp(pinstr, "READY") == 0) {
RobMeades 0:5cffef3371f6 815 _sim_pin_check_enabled = false;
RobMeades 0:5cffef3371f6 816 tr_info("No PIN required");
RobMeades 0:5cffef3371f6 817 success = true;
RobMeades 0:5cffef3371f6 818 } else {
RobMeades 0:5cffef3371f6 819 tr_debug("Unexpected response from SIM: \"%s\"", pinstr);
RobMeades 0:5cffef3371f6 820 }
RobMeades 0:5cffef3371f6 821 }
RobMeades 0:5cffef3371f6 822
RobMeades 0:5cffef3371f6 823 /* wait for a second before retry */
mudassar0121 37:a2466fcd63c3 824 ThisThread::sleep_for(1000);
RobMeades 0:5cffef3371f6 825 }
RobMeades 0:5cffef3371f6 826
RobMeades 0:5cffef3371f6 827 if (done) {
RobMeades 0:5cffef3371f6 828 tr_info("SIM Ready.");
RobMeades 0:5cffef3371f6 829 } else {
RobMeades 0:5cffef3371f6 830 tr_error("SIM not ready.");
RobMeades 0:5cffef3371f6 831 }
RobMeades 0:5cffef3371f6 832
RobMeades 0:5cffef3371f6 833 UNLOCK();
RobMeades 0:5cffef3371f6 834 return success;
RobMeades 0:5cffef3371f6 835 }
RobMeades 0:5cffef3371f6 836
RobMeades 0:5cffef3371f6 837 /**********************************************************************
RobMeades 0:5cffef3371f6 838 * PUBLIC METHODS
RobMeades 0:5cffef3371f6 839 **********************************************************************/
RobMeades 0:5cffef3371f6 840
RobMeades 0:5cffef3371f6 841 // Initialise the modem.
RobMeades 0:5cffef3371f6 842 bool UbloxCellularBase::init(const char *pin)
RobMeades 0:5cffef3371f6 843 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 844 int x;
RobMeades 0:5cffef3371f6 845 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 846
RobMeades 0:5cffef3371f6 847 if (!_modem_initialised) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 848 if (initialize_modem()) {
RobMeades 0:5cffef3371f6 849 tr_info("Modem Ready.");
RobMeades 0:5cffef3371f6 850 if (pin != NULL) {
RobMeades 0:5cffef3371f6 851 _pin = pin;
RobMeades 0:5cffef3371f6 852 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 853 #ifdef TARGET_UBLOX_C027
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 854 if (set_functionality_mode(FUNC_MIN)) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 855 #else
fahimalavi 38:b33dc3d26690 856 // MAke sure it is valid of SARA-R5 only
fahimalavi 38:b33dc3d26690 857 if (set_functionality_mode(FUNC_MIN)) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 858 #endif
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 859 if (initialise_sim_card()) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 860 #ifdef TARGET_UBLOX_C030_R41XM
fahimalavi 26:e4e444cc7b14 861 int mno_profile;
wajahat.abbas@u-blox.com 34:d239824bfb8f 862 if (get_mno_profile(&mno_profile)) {
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 863 #ifdef MBED_CONF_APP_DEFAULT_MNO_PROFILE
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 864 if (mno_profile != MBED_CONF_APP_DEFAULT_MNO_PROFILE && set_mno_profile((MNOProfile)MBED_CONF_APP_DEFAULT_MNO_PROFILE)) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 865 reboot_modem();
wajahat.abbas@u-blox.com 34:d239824bfb8f 866 while(is_modem_ready() == false) {
mudassar0121 37:a2466fcd63c3 867 ThisThread::sleep_for(1000);
wajahat.abbas@u-blox.com 34:d239824bfb8f 868 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 869 setup_modem();
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 870 mno_profile = MBED_CONF_APP_DEFAULT_MNO_PROFILE;
wajahat.abbas@u-blox.com 34:d239824bfb8f 871 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 872 #endif
fahimalavi 38:b33dc3d26690 873 /*if (mno_profile == SW_DEFAULT) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 874 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 875 _default_profile_is_set = true;
wajahat.abbas@u-blox.com 34:d239824bfb8f 876 return false;
fahimalavi 38:b33dc3d26690 877 }*/
wajahat.abbas@u-blox.com 34:d239824bfb8f 878 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 879 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 34:d239824bfb8f 880 int status = 0, periodic_time = 0, active_time = 0;
wajahat.abbas@u-blox.com 34:d239824bfb8f 881 if (_psm_status == UNKNOWN) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 882 if (get_power_saving_mode(&status, &periodic_time, &active_time)) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 883 if (status) { //PSM is already enabled either by a previous run or MNO profile
wajahat.abbas@u-blox.com 34:d239824bfb8f 884 tr_info("PSM is already enabled, periodic_time %d, active_time %d", periodic_time, active_time);
wajahat.abbas@u-blox.com 34:d239824bfb8f 885 _psm_status = ENABLED;
wajahat.abbas@u-blox.com 34:d239824bfb8f 886 if ( !(set_psm_urcs(true)) ) { //enable PSM URCs
wajahat.abbas@u-blox.com 34:d239824bfb8f 887 tr_error("Modem does not support PSM URCs, disabling PSM");
fahimalavi 38:b33dc3d26690 888 //disable_power_saving_mode();
wajahat.abbas@u-blox.com 34:d239824bfb8f 889 } else if (!_func_psm_going_in){
wajahat.abbas@u-blox.com 34:d239824bfb8f 890 tr_critical("!!PSM IS ENABLED, CALLBACK NOT ATTACHED. PLEASE REGISTER ONE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 891 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 892 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 893 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 894 } else if (_psm_status == ENABLED && !_func_psm_going_in){
wajahat.abbas@u-blox.com 34:d239824bfb8f 895 tr_critical("!!PSM IS ENABLED, CALLBACK NOT ATTACHED. PLEASE REGISTER ONE!!");
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 896 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 897 #elif TARGET_UBLOX_C030_R410M
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 898 disable_power_saving_mode(); //PSM is currently not supported by driver for R410M due to lack of URCs
wajahat.abbas@u-blox.com 23:eaab8e812a5d 899 #endif
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 900 if (_at->is_idle_mode_enabled() == false || _psm_status == ENABLED) {
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 901 //application has not yet enabled idle mode so disable it
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 902 //PSM got enabled by MNO, disable idle mode.
fahimalavi 38:b33dc3d26690 903 //set_idle_mode(false);
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 904 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 905 #endif
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 906 if (set_device_identity(&_dev_info.dev) && // Set up device identity
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 907 device_init(_dev_info.dev)) {// Initialise this device
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 908 // Get the integrated circuit ID of the SIM
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 909 if (get_iccid()) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 910 // Try a few times to get the IMSI (since on some modems this can
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 911 // take a while to be retrieved, especially if a SIM PIN
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 912 // was set)
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 913 for (x = 0; (x < 3) && !get_imsi(); x++) {
mudassar0121 37:a2466fcd63c3 914 ThisThread::sleep_for(1000);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 915 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 916
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 917 if (x < 3) { // If we got the IMSI, can get the others
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 918 if (get_imei() && // Get international mobile equipment identifier
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 919 get_meid() && // Probably the same as the IMEI
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 920 set_sms()) { // And set up SMS
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 921 // The modem is initialised.
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 922 _modem_initialised = true;
fahimalavi 38:b33dc3d26690 923 _at->send("AT+CSCON=1") && _at->recv("OK");
fahimalavi 38:b33dc3d26690 924 _at->send("AT+CPSMS=1") && _at->recv("OK");
fahimalavi 26:e4e444cc7b14 925 tr_info("Modem initialized");
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 926 }
rob.meades@u-blox.com 6:8fadf1e49487 927 }
rob.meades@u-blox.com 6:8fadf1e49487 928 }
rob.meades@u-blox.com 6:8fadf1e49487 929 }
RobMeades 0:5cffef3371f6 930 }
RobMeades 0:5cffef3371f6 931 }
RobMeades 0:5cffef3371f6 932 }
RobMeades 0:5cffef3371f6 933 }
RobMeades 0:5cffef3371f6 934
RobMeades 0:5cffef3371f6 935 return _modem_initialised;
RobMeades 0:5cffef3371f6 936 }
RobMeades 0:5cffef3371f6 937
RobMeades 0:5cffef3371f6 938 // Perform registration.
RobMeades 0:5cffef3371f6 939 bool UbloxCellularBase::nwk_registration()
RobMeades 0:5cffef3371f6 940 {
RobMeades 0:5cffef3371f6 941 bool atSuccess = false;
RobMeades 0:5cffef3371f6 942 bool registered = false;
RobMeades 0:5cffef3371f6 943 int status;
RobMeades 0:5cffef3371f6 944 int at_timeout;
RobMeades 0:5cffef3371f6 945 LOCK();
RobMeades 0:5cffef3371f6 946
RobMeades 0:5cffef3371f6 947 at_timeout = _at_timeout; // Has to be inside LOCK()s
RobMeades 0:5cffef3371f6 948
RobMeades 0:5cffef3371f6 949 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 950
RobMeades 0:5cffef3371f6 951 if (!is_registered_psd() && !is_registered_csd() && !is_registered_eps()) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 952 if (set_functionality_mode(FUNC_FULL)) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 953 tr_info("Searching Network...");
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 954 // Enable the packet switched and network registration unsolicited result codes
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 955 if (_at->send("AT+CREG=1") && _at->recv("OK") &&
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 956 _at->send("AT+CGREG=1") && _at->recv("OK")) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 957 atSuccess = true;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 958 if (_at->send("AT+CEREG=1")) {
RobMeades 0:5cffef3371f6 959 _at->recv("OK");
RobMeades 0:5cffef3371f6 960 // Don't check return value as this works for LTE only
RobMeades 0:5cffef3371f6 961 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 962
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 963 if (atSuccess) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 964 // See if we are already in automatic mode
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 965 if (_at->send("AT+COPS?") && _at->recv("+COPS: %d", &status) &&
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 966 _at->recv("OK")) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 967 // If not, set it
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 968 if (status != 0) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 969 // Don't check return code here as there's not much
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 970 // we can do if this fails.
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 971 _at->send("AT+COPS=0") && _at->recv("OK");
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 972 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 973 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 974
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 975 // Query the registration status directly as well,
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 976 // just in case
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 977 if (_at->send("AT+CREG?") && _at->recv("OK")) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 978 // Answer will be processed by URC
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 979 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 980 if (_at->send("AT+CGREG?") && _at->recv("OK")) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 981 // Answer will be processed by URC
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 982 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 983 if (_at->send("AT+CEREG?")) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 984 _at->recv("OK");
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 985 // Don't check return value as this works for LTE only
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 986 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 987 }
RobMeades 0:5cffef3371f6 988 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 989 // Wait for registration to succeed
RobMeades 0:5cffef3371f6 990 at_set_timeout(1000);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 991 for (int waitSeconds = 0; !registered && (waitSeconds < 180); waitSeconds++) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 992 registered = is_registered_psd() || is_registered_csd() || is_registered_eps();
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 993 _at->recv(UNNATURAL_STRING);
RobMeades 0:5cffef3371f6 994 }
RobMeades 0:5cffef3371f6 995 at_set_timeout(at_timeout);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 996
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 997 if (registered) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 998 // This should return quickly but sometimes the status field is not returned
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 999 // so make the timeout short
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1000 at_set_timeout(1000);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1001 if (_at->send("AT+COPS?") && _at->recv("+COPS: %*d,%*d,\"%*[^\"]\",%d\nOK\n", &status)) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1002 set_rat(status);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1003 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1004 at_set_timeout(at_timeout);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1005 }
RobMeades 0:5cffef3371f6 1006 }
RobMeades 0:5cffef3371f6 1007 } else {
RobMeades 0:5cffef3371f6 1008 registered = true;
RobMeades 0:5cffef3371f6 1009 }
RobMeades 0:5cffef3371f6 1010
RobMeades 0:5cffef3371f6 1011 UNLOCK();
RobMeades 0:5cffef3371f6 1012 return registered;
RobMeades 0:5cffef3371f6 1013 }
RobMeades 0:5cffef3371f6 1014
RobMeades 0:5cffef3371f6 1015 bool UbloxCellularBase::is_registered_csd()
RobMeades 0:5cffef3371f6 1016 {
RobMeades 0:5cffef3371f6 1017 return (_dev_info.reg_status_csd == CSD_REGISTERED) ||
RobMeades 0:5cffef3371f6 1018 (_dev_info.reg_status_csd == CSD_REGISTERED_ROAMING) ||
RobMeades 0:5cffef3371f6 1019 (_dev_info.reg_status_csd == CSD_CSFB_NOT_PREFERRED);
RobMeades 0:5cffef3371f6 1020 }
RobMeades 0:5cffef3371f6 1021
RobMeades 0:5cffef3371f6 1022 bool UbloxCellularBase::is_registered_psd()
RobMeades 0:5cffef3371f6 1023 {
RobMeades 0:5cffef3371f6 1024 return (_dev_info.reg_status_psd == PSD_REGISTERED) ||
RobMeades 0:5cffef3371f6 1025 (_dev_info.reg_status_psd == PSD_REGISTERED_ROAMING);
RobMeades 0:5cffef3371f6 1026 }
RobMeades 0:5cffef3371f6 1027
RobMeades 0:5cffef3371f6 1028 bool UbloxCellularBase::is_registered_eps()
RobMeades 0:5cffef3371f6 1029 {
RobMeades 0:5cffef3371f6 1030 return (_dev_info.reg_status_eps == EPS_REGISTERED) ||
RobMeades 0:5cffef3371f6 1031 (_dev_info.reg_status_eps == EPS_REGISTERED_ROAMING);
RobMeades 0:5cffef3371f6 1032 }
RobMeades 0:5cffef3371f6 1033
RobMeades 0:5cffef3371f6 1034 // Perform deregistration.
RobMeades 0:5cffef3371f6 1035 bool UbloxCellularBase::nwk_deregistration()
RobMeades 0:5cffef3371f6 1036 {
RobMeades 0:5cffef3371f6 1037 bool success = false;
RobMeades 0:5cffef3371f6 1038 LOCK();
RobMeades 0:5cffef3371f6 1039
RobMeades 0:5cffef3371f6 1040 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 1041
mudassar0121 27:250eaef6232d 1042 int at_timeout = _at_timeout; // Has to be inside LOCK()s
fahimalavi 26:e4e444cc7b14 1043 at_set_timeout(3*60*1000); //command has 3 minutes timeout
fahimalavi 26:e4e444cc7b14 1044
RobMeades 0:5cffef3371f6 1045 if (_at->send("AT+COPS=2") && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 1046 _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 1047 _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 1048 _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING;
RobMeades 0:5cffef3371f6 1049 success = true;
RobMeades 0:5cffef3371f6 1050 }
RobMeades 0:5cffef3371f6 1051
mudassar0121 27:250eaef6232d 1052 at_set_timeout(at_timeout);
RobMeades 0:5cffef3371f6 1053 UNLOCK();
RobMeades 0:5cffef3371f6 1054 return success;
RobMeades 0:5cffef3371f6 1055 }
RobMeades 0:5cffef3371f6 1056
RobMeades 0:5cffef3371f6 1057 // Put the modem into its lowest power state.
RobMeades 0:5cffef3371f6 1058 void UbloxCellularBase::deinit()
RobMeades 0:5cffef3371f6 1059 {
RobMeades 0:5cffef3371f6 1060 power_down();
RobMeades 0:5cffef3371f6 1061 _modem_initialised = false;
RobMeades 0:5cffef3371f6 1062 }
RobMeades 0:5cffef3371f6 1063
RobMeades 0:5cffef3371f6 1064 // Set the PIN.
RobMeades 0:5cffef3371f6 1065 void UbloxCellularBase::set_pin(const char *pin) {
RobMeades 0:5cffef3371f6 1066 _pin = pin;
RobMeades 0:5cffef3371f6 1067 }
RobMeades 0:5cffef3371f6 1068
RobMeades 0:5cffef3371f6 1069 // Enable or disable SIM pin checking.
rob.meades@u-blox.com 4:2e640a101db1 1070 bool UbloxCellularBase::sim_pin_check_enable(bool enableNotDisable)
RobMeades 0:5cffef3371f6 1071 {
RobMeades 0:5cffef3371f6 1072 bool success = false;;
RobMeades 0:5cffef3371f6 1073 LOCK();
RobMeades 0:5cffef3371f6 1074
RobMeades 0:5cffef3371f6 1075 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 1076
RobMeades 0:5cffef3371f6 1077 if (_pin != NULL) {
RobMeades 0:5cffef3371f6 1078 if (_sim_pin_check_enabled && !enableNotDisable) {
RobMeades 0:5cffef3371f6 1079 // Disable the SIM lock
RobMeades 0:5cffef3371f6 1080 if (_at->send("AT+CLCK=\"SC\",0,\"%s\"", _pin) && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 1081 _sim_pin_check_enabled = false;
RobMeades 0:5cffef3371f6 1082 success = true;
RobMeades 0:5cffef3371f6 1083 }
RobMeades 0:5cffef3371f6 1084 } else if (!_sim_pin_check_enabled && enableNotDisable) {
RobMeades 0:5cffef3371f6 1085 // Enable the SIM lock
RobMeades 0:5cffef3371f6 1086 if (_at->send("AT+CLCK=\"SC\",1,\"%s\"", _pin) && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 1087 _sim_pin_check_enabled = true;
RobMeades 0:5cffef3371f6 1088 success = true;
RobMeades 0:5cffef3371f6 1089 }
RobMeades 0:5cffef3371f6 1090 } else {
RobMeades 0:5cffef3371f6 1091 success = true;
RobMeades 0:5cffef3371f6 1092 }
RobMeades 0:5cffef3371f6 1093 }
RobMeades 0:5cffef3371f6 1094
RobMeades 0:5cffef3371f6 1095 UNLOCK();
RobMeades 0:5cffef3371f6 1096 return success;
RobMeades 0:5cffef3371f6 1097 }
RobMeades 0:5cffef3371f6 1098
RobMeades 0:5cffef3371f6 1099 // Change the pin code for the SIM card.
RobMeades 0:5cffef3371f6 1100 bool UbloxCellularBase::change_sim_pin(const char *pin)
RobMeades 0:5cffef3371f6 1101 {
RobMeades 0:5cffef3371f6 1102 bool success = false;;
RobMeades 0:5cffef3371f6 1103 LOCK();
RobMeades 0:5cffef3371f6 1104
RobMeades 0:5cffef3371f6 1105 MBED_ASSERT(_at != NULL);
RobMeades 0:5cffef3371f6 1106
RobMeades 0:5cffef3371f6 1107 // Change the SIM pin
RobMeades 0:5cffef3371f6 1108 if ((pin != NULL) && (_pin != NULL)) {
RobMeades 0:5cffef3371f6 1109 if (_at->send("AT+CPWD=\"SC\",\"%s\",\"%s\"", _pin, pin) && _at->recv("OK")) {
RobMeades 0:5cffef3371f6 1110 _pin = pin;
RobMeades 0:5cffef3371f6 1111 success = true;
RobMeades 0:5cffef3371f6 1112 }
RobMeades 0:5cffef3371f6 1113 }
RobMeades 0:5cffef3371f6 1114
RobMeades 0:5cffef3371f6 1115 UNLOCK();
RobMeades 0:5cffef3371f6 1116 return success;
RobMeades 0:5cffef3371f6 1117 }
RobMeades 0:5cffef3371f6 1118
RobMeades 14:e420232ee4e7 1119 // Get the IMEI.
fahim alavi 13:158a035b1b50 1120 bool UbloxCellularBase::get_imei(char *imei_to_send, int size)
fahim alavi 13:158a035b1b50 1121 {
fahim alavi 13:158a035b1b50 1122 bool success;
fahim alavi 13:158a035b1b50 1123 LOCK();
fahim alavi 13:158a035b1b50 1124
fahim alavi 13:158a035b1b50 1125 MBED_ASSERT(_at != NULL);
fahim alavi 13:158a035b1b50 1126
fahim alavi 13:158a035b1b50 1127 // International mobile equipment identifier
fahim alavi 13:158a035b1b50 1128 // AT Command Manual UBX-13002752, section 4.7
fahim alavi 13:158a035b1b50 1129 success = _at->send("AT+CGSN") && _at->recv("%15[^\n]\nOK\n", _dev_info.imei);
fahim alavi 13:158a035b1b50 1130 tr_info("DevInfo: IMEI=%s", _dev_info.imei);
fahim alavi 13:158a035b1b50 1131
wajahat.abbas@u-blox.com 34:d239824bfb8f 1132 if (success) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1133 memcpy(imei_to_send,_dev_info.imei,size);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1134 imei_to_send[size-1] = '\0';
wajahat.abbas@u-blox.com 34:d239824bfb8f 1135 }
fahim alavi 13:158a035b1b50 1136
fahim alavi 13:158a035b1b50 1137 UNLOCK();
fahim alavi 13:158a035b1b50 1138 return success;
fahim alavi 13:158a035b1b50 1139 }
fahim alavi 13:158a035b1b50 1140
RobMeades 14:e420232ee4e7 1141 // Get the IMEI of the module.
RobMeades 14:e420232ee4e7 1142 const char *UbloxCellularBase::imei()
RobMeades 14:e420232ee4e7 1143 {
RobMeades 14:e420232ee4e7 1144 return _dev_info.imei;
RobMeades 14:e420232ee4e7 1145 }
RobMeades 14:e420232ee4e7 1146
RobMeades 14:e420232ee4e7 1147 // Get the Mobile Equipment ID (which may be the same as the IMEI).
RobMeades 14:e420232ee4e7 1148 const char *UbloxCellularBase::meid()
RobMeades 14:e420232ee4e7 1149 {
RobMeades 14:e420232ee4e7 1150 return _dev_info.meid;
RobMeades 14:e420232ee4e7 1151 }
RobMeades 14:e420232ee4e7 1152
RobMeades 14:e420232ee4e7 1153 // Get the IMSI of the SIM.
RobMeades 14:e420232ee4e7 1154 const char *UbloxCellularBase::imsi()
RobMeades 14:e420232ee4e7 1155 {
RobMeades 14:e420232ee4e7 1156 // (try) to update the IMSI, just in case the SIM has changed
RobMeades 14:e420232ee4e7 1157 get_imsi();
RobMeades 14:e420232ee4e7 1158
RobMeades 14:e420232ee4e7 1159 return _dev_info.imsi;
RobMeades 14:e420232ee4e7 1160 }
RobMeades 14:e420232ee4e7 1161
RobMeades 14:e420232ee4e7 1162 // Get the ICCID of the SIM.
RobMeades 14:e420232ee4e7 1163 const char *UbloxCellularBase::iccid()
RobMeades 14:e420232ee4e7 1164 {
RobMeades 14:e420232ee4e7 1165 // (try) to update the ICCID, just in case the SIM has changed
RobMeades 14:e420232ee4e7 1166 get_iccid();
RobMeades 14:e420232ee4e7 1167
RobMeades 14:e420232ee4e7 1168 return _dev_info.iccid;
RobMeades 14:e420232ee4e7 1169 }
RobMeades 14:e420232ee4e7 1170
RobMeades 14:e420232ee4e7 1171 // Get the RSSI in dBm.
RobMeades 14:e420232ee4e7 1172 int UbloxCellularBase::rssi()
RobMeades 14:e420232ee4e7 1173 {
RobMeades 14:e420232ee4e7 1174 char buf[7] = {0};
RobMeades 14:e420232ee4e7 1175 int rssi = 0;
RobMeades 14:e420232ee4e7 1176 int qual = 0;
RobMeades 14:e420232ee4e7 1177 int rssiRet = 0;
RobMeades 14:e420232ee4e7 1178 bool success;
RobMeades 14:e420232ee4e7 1179 LOCK();
RobMeades 14:e420232ee4e7 1180
RobMeades 14:e420232ee4e7 1181 MBED_ASSERT(_at != NULL);
RobMeades 14:e420232ee4e7 1182
RobMeades 14:e420232ee4e7 1183 success = _at->send("AT+CSQ") && _at->recv("+CSQ: %6[^\n]\nOK\n", buf);
RobMeades 14:e420232ee4e7 1184
RobMeades 14:e420232ee4e7 1185 if (success) {
RobMeades 14:e420232ee4e7 1186 if (sscanf(buf, "%d,%d", &rssi, &qual) == 2) {
RobMeades 14:e420232ee4e7 1187 // AT+CSQ returns a coded RSSI value and an RxQual value
RobMeades 14:e420232ee4e7 1188 // For 2G an RSSI of 0 corresponds to -113 dBm or less,
RobMeades 14:e420232ee4e7 1189 // an RSSI of 31 corresponds to -51 dBm or less and hence
RobMeades 14:e420232ee4e7 1190 // each value is a 2 dB step.
RobMeades 14:e420232ee4e7 1191 // For LTE the mapping is defined in the array rssiConvertLte[].
RobMeades 14:e420232ee4e7 1192 // For 3G the mapping to RSCP is defined in the array rscpConvert3G[]
RobMeades 14:e420232ee4e7 1193 // and the RSSI value is then RSCP - the EC_NO_LEV number derived
RobMeades 14:e420232ee4e7 1194 // by putting the qual number through qualConvert3G[].
RobMeades 14:e420232ee4e7 1195 if ((rssi >= 0) && (rssi <= 31)) {
RobMeades 14:e420232ee4e7 1196 switch (_dev_info.rat) {
RobMeades 14:e420232ee4e7 1197 case UTRAN:
RobMeades 14:e420232ee4e7 1198 case HSDPA:
RobMeades 14:e420232ee4e7 1199 case HSUPA:
RobMeades 14:e420232ee4e7 1200 case HSDPA_HSUPA:
RobMeades 14:e420232ee4e7 1201 // 3G
RobMeades 14:e420232ee4e7 1202 if ((qual >= 0) && (qual <= 7)) {
RobMeades 14:e420232ee4e7 1203 qual = qualConvert3G[qual];
fahim.alavi@u-blox.com 15:93b157a47b8d 1204 rssiRet = rscpConvert3G[rssi];
fahim.alavi@u-blox.com 15:93b157a47b8d 1205 rssiRet -= qual;
RobMeades 14:e420232ee4e7 1206 }
fahim.alavi@u-blox.com 15:93b157a47b8d 1207
RobMeades 14:e420232ee4e7 1208 break;
RobMeades 14:e420232ee4e7 1209 case LTE:
RobMeades 14:e420232ee4e7 1210 // LTE
RobMeades 14:e420232ee4e7 1211 rssiRet = rssiConvertLte[rssi];
RobMeades 14:e420232ee4e7 1212 break;
RobMeades 14:e420232ee4e7 1213 case GSM:
RobMeades 14:e420232ee4e7 1214 case COMPACT_GSM:
RobMeades 14:e420232ee4e7 1215 case EDGE:
RobMeades 14:e420232ee4e7 1216 default:
RobMeades 14:e420232ee4e7 1217 // GSM or assumed GSM if the RAT is not known
RobMeades 14:e420232ee4e7 1218 rssiRet = -(113 - (rssi << 2));
RobMeades 14:e420232ee4e7 1219 break;
RobMeades 14:e420232ee4e7 1220 }
RobMeades 14:e420232ee4e7 1221 }
RobMeades 14:e420232ee4e7 1222 }
RobMeades 14:e420232ee4e7 1223 }
RobMeades 14:e420232ee4e7 1224
RobMeades 14:e420232ee4e7 1225 UNLOCK();
RobMeades 14:e420232ee4e7 1226 return rssiRet;
RobMeades 14:e420232ee4e7 1227 }
RobMeades 14:e420232ee4e7 1228
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1229 //RAT should be set in a detached state (AT+COPS=2)
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1230 bool UbloxCellularBase::set_modem_rat(RAT selected_rat, RAT preferred_rat, RAT second_preferred_rat)
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1231 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1232 #ifdef TARGET_UBLOX_C030_R41XM
wajahat.abbas@u-blox.com 34:d239824bfb8f 1233 if (_default_profile_is_set == true) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1234 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1235 return false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1236 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1237 #endif
wajahat.abbas@u-blox.com 34:d239824bfb8f 1238
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1239 bool success = false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1240 char command[16] = {0x00};
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1241
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1242 //check if modem is registered with network
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1243 if (is_registered_csd() || is_registered_psd() || is_registered_eps()) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1244 tr_error("RAT should only be set in detached state");
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1245 return false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1246 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1247
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1248 if (preferred_rat != NOT_USED && second_preferred_rat != NOT_USED) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1249 sprintf(command, "AT+URAT=%d,%d,%d", selected_rat, preferred_rat, second_preferred_rat);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1250 } else if (preferred_rat != NOT_USED) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1251 sprintf(command, "AT+URAT=%d,%d", selected_rat, preferred_rat);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1252 } else if (second_preferred_rat != NOT_USED) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1253 sprintf(command, "AT+URAT=%d,%d", selected_rat, second_preferred_rat);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1254 } else {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1255 sprintf(command, "AT+URAT=%d", selected_rat);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1256 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1257
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1258 LOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1259 if (_at->send(command) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1260 success = true;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1261 } else {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1262 tr_error("unable to set the specified RAT");
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1263 success = false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1264 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1265 UNLOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1266
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1267 return success;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1268 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1269
wajahat.abbas@u-blox.com 22:779971811c46 1270 bool UbloxCellularBase::get_modem_rat(int *selected_rat, int *preferred_rat, int *second_preferred_rat)
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1271 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1272 #ifdef TARGET_UBLOX_C030_R41XM
wajahat.abbas@u-blox.com 34:d239824bfb8f 1273 if (_default_profile_is_set == true) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1274 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1275 return false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1276 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1277 #endif
wajahat.abbas@u-blox.com 34:d239824bfb8f 1278
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1279 bool success = false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1280 char buf[24] = {0x00};
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1281
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1282 if (selected_rat == NULL || preferred_rat == NULL || second_preferred_rat == NULL) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1283 tr_info("invalid pointers");
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1284 return false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1285 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1286
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1287 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1288
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1289 *selected_rat = NOT_USED;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1290 *preferred_rat = NOT_USED;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1291 *second_preferred_rat = NOT_USED;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1292
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1293 LOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1294
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1295 if (_at->send("AT+URAT?") && _at->recv("%23[^\n]\nOK\n", buf)) {
wajahat.abbas@u-blox.com 22:779971811c46 1296 if (sscanf(buf, "+URAT: %d,%d,%d", selected_rat, preferred_rat, second_preferred_rat) == 3) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1297 success = true;
wajahat.abbas@u-blox.com 22:779971811c46 1298 } else if (sscanf(buf, "+URAT: %d,%d", selected_rat, preferred_rat) == 2) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1299 success = true;
wajahat.abbas@u-blox.com 22:779971811c46 1300 } else if (sscanf(buf, "+URAT: %d", selected_rat) == 1) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1301 success = true;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1302 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1303 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1304
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1305 UNLOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1306 return success;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1307 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1308
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1309 //application should call init() or connect() in order to initialize the modem
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1310 bool UbloxCellularBase::reboot_modem()
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1311 {
fahimalavi 38:b33dc3d26690 1312 // SARA-R5 only
fahimalavi 38:b33dc3d26690 1313 return (set_functionality_mode(FUNC_RESET_WITH_SIM));
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1314 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1315
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1316 bool UbloxCellularBase::set_functionality_mode(FunctionalityMode mode)
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1317 {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1318 bool return_val = false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1319 int at_timeout;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1320 LOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1321
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1322 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1323
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1324 at_timeout = _at_timeout; // Has to be inside LOCK()s
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1325 at_set_timeout(3*60*1000); //command has 3 minutes timeout
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1326
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1327 if (_at->send("AT+CFUN=%d", mode) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1328 return_val = true;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1329 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1330
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1331 if (mode == FUNC_RESET || mode == FUNC_RESET_WITH_SIM) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1332 _modem_initialised = false;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1333 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1334
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1335 at_set_timeout(at_timeout);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1336 UNLOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1337
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1338 return return_val;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1339 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1340
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1341 bool UbloxCellularBase::get_functionality_mode(int *mode)
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1342 {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1343 bool return_val = false;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1344
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1345 if (mode == NULL) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1346 return false;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1347 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1348
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1349 LOCK();
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1350 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1351
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1352 if ( (_at->send("AT+CFUN?") && _at->recv("+CFUN: %d", mode) && _at->recv("OK")) ) {
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1353 return_val = true;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1354 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1355
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1356 UNLOCK();
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1357 return return_val;
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1358 }
wajahat.abbas@u-blox.com 24:e26a6ab0dd75 1359
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1360 #ifdef TARGET_UBLOX_C030_R41XM
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1361 bool UbloxCellularBase::set_mno_profile(MNOProfile profile)
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1362 {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1363 bool return_val = false;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1364 int current_profile;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1365 MNOProfile arr[MAX_NUM_PROFILES] = { SW_DEFAULT, SIM_ICCID, ATT, TMO, VODAFONE, DT, STANDARD_EU
wajahat.abbas@u-blox.com 34:d239824bfb8f 1366 #ifdef TARGET_UBLOX_C030_R410M
wajahat.abbas@u-blox.com 29:8a38f91009ad 1367 , VERIZON, TELSTRA, CT, SPRINT, TELUS
wajahat.abbas@u-blox.com 29:8a38f91009ad 1368 #endif
wajahat.abbas@u-blox.com 29:8a38f91009ad 1369 };
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1370
wajahat.abbas@u-blox.com 29:8a38f91009ad 1371 if (is_registered_csd() || is_registered_psd() || is_registered_eps()) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1372 tr_error("MNO profile should only be set in detached state");
wajahat.abbas@u-blox.com 29:8a38f91009ad 1373 return false;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1374 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1375
wajahat.abbas@u-blox.com 29:8a38f91009ad 1376 if (get_mno_profile(&current_profile)) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1377 if (current_profile == profile) { //Ref to UBX-18019856 7.1.7, parameters will be updated only if we switch to another profile first
wajahat.abbas@u-blox.com 29:8a38f91009ad 1378 for (uint8_t index = 0; index < MAX_NUM_PROFILES; index++) { //get the index of current profile and use the next one
wajahat.abbas@u-blox.com 29:8a38f91009ad 1379 if (arr[index] == current_profile) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1380 index = ((index + 1) % MAX_NUM_PROFILES);
wajahat.abbas@u-blox.com 29:8a38f91009ad 1381 current_profile = arr[index];
wajahat.abbas@u-blox.com 29:8a38f91009ad 1382 break;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1383 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1384 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1385
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1386 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1387 if (_at->send("AT+UMNOPROF=%d", current_profile) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1388 tr_info("temporary MNO profile set: %d", current_profile);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1389 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1390 UNLOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1391 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1392 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1393 if (_at->send("AT+UMNOPROF=%d", profile) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1394 if (profile == SW_DEFAULT) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1395 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1396 _default_profile_is_set = true;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1397 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1398 _default_profile_is_set = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1399 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1400 return_val = true;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1401 } else {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1402 tr_error("unable to set user specified profile");
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1403 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1404 UNLOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1405 } else {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1406 tr_error("could not read MNO profile");
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1407 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1408
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1409 return return_val;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1410 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1411
wajahat.abbas@u-blox.com 22:779971811c46 1412 bool UbloxCellularBase::get_mno_profile(int *profile)
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1413 {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1414 bool return_val = false;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1415 char buf[4] = {0x00};
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1416
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1417 if (profile == NULL) {
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1418 return false;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1419 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1420
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1421 LOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1422 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1423
wajahat.abbas@u-blox.com 29:8a38f91009ad 1424 if (_at->send("AT+UMNOPROF?") && _at->recv("+UMNOPROF: %3[^\n]\nOK\n", buf)) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1425 *profile = atoi(buf);
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1426 return_val = true;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1427 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1428
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1429 UNLOCK();
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1430 return return_val;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1431 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1432 // Enable or Disable the UPSV power saving mode
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1433 bool UbloxCellularBase::set_idle_mode(bool enable)
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1434 {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1435 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 34:d239824bfb8f 1436 if (_psm_status == ENABLED && enable == true) {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1437 return false;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1438 }
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1439 #endif
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1440
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1441 bool success = false;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1442 LOCK();
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1443
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1444 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1445
fahimalavi 38:b33dc3d26690 1446 // SARA-R5 only
fahimalavi 38:b33dc3d26690 1447 if (_at->send("AT+UPSV=1") && _at->recv("OK")) {
fahimalavi 38:b33dc3d26690 1448 // if (enable == true) {
fahimalavi 38:b33dc3d26690 1449 // _at->idle_mode_enabled();
fahimalavi 38:b33dc3d26690 1450 // }
fahimalavi 38:b33dc3d26690 1451 // else {
fahimalavi 38:b33dc3d26690 1452 // _at->idle_mode_disabled();
fahimalavi 38:b33dc3d26690 1453 // }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1454 success = true;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1455 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1456
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1457 UNLOCK();
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1458 return success;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1459 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1460
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1461 bool UbloxCellularBase::get_idle_mode(int *status)
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1462 {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1463 bool return_val = false;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1464
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1465 if (status == NULL) {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1466 return false;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1467 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1468
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1469 LOCK();
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1470 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1471
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1472 if ( (_at->send("AT+UPSV?") && _at->recv("+UPSV: %d", status) && _at->recv("OK")) ) {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1473 if (*status == 4) {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1474 *status = 1;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1475 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1476 return_val = true;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1477 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1478
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1479 UNLOCK();
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1480 return return_val;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1481 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1482
wajahat.abbas@u-blox.com 29:8a38f91009ad 1483 int UbloxCellularBase::set_receive_period(int mode, tEDRXAccessTechnology act_type, uint8_t edrx_value) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1484 char edrx[5];
wajahat.abbas@u-blox.com 29:8a38f91009ad 1485 uint_to_binary_str(edrx_value, edrx, 5, 4);
wajahat.abbas@u-blox.com 29:8a38f91009ad 1486 edrx[4] = '\0';
wajahat.abbas@u-blox.com 29:8a38f91009ad 1487 int status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1488
wajahat.abbas@u-blox.com 29:8a38f91009ad 1489 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1490
wajahat.abbas@u-blox.com 29:8a38f91009ad 1491 if (_at->send("AT+CEDRXS=%d,%d,\"%s\"", mode, act_type, edrx) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1492 status = 0;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1493 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1494 else {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1495 status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1496 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1497
wajahat.abbas@u-blox.com 29:8a38f91009ad 1498
wajahat.abbas@u-blox.com 29:8a38f91009ad 1499 UNLOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1500
wajahat.abbas@u-blox.com 29:8a38f91009ad 1501 return status;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1502 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1503
wajahat.abbas@u-blox.com 29:8a38f91009ad 1504 int UbloxCellularBase::set_receive_period(int mode, tEDRXAccessTechnology act_type) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1505 int status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1506
wajahat.abbas@u-blox.com 29:8a38f91009ad 1507 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1508
wajahat.abbas@u-blox.com 29:8a38f91009ad 1509 if (_at->send("AT+CEDRXS=%d,%d", mode, act_type) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1510
wajahat.abbas@u-blox.com 29:8a38f91009ad 1511 status = 0;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1512 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1513 else {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1514 status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1515 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1516
wajahat.abbas@u-blox.com 29:8a38f91009ad 1517 UNLOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1518
wajahat.abbas@u-blox.com 29:8a38f91009ad 1519 return status;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1520 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1521
wajahat.abbas@u-blox.com 29:8a38f91009ad 1522 int UbloxCellularBase::set_receive_period(int mode) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1523 int status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1524
wajahat.abbas@u-blox.com 29:8a38f91009ad 1525 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1526
wajahat.abbas@u-blox.com 29:8a38f91009ad 1527 if (_at->send("AT+CEDRXS=%d", mode) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1528
wajahat.abbas@u-blox.com 29:8a38f91009ad 1529 status = 0;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1530 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1531 else {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1532 status = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1533 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1534
wajahat.abbas@u-blox.com 29:8a38f91009ad 1535 UNLOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1536
wajahat.abbas@u-blox.com 29:8a38f91009ad 1537 return status;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1538 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1539
wajahat.abbas@u-blox.com 29:8a38f91009ad 1540 uint32_t UbloxCellularBase::get_receive_period() {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1541 uint32_t edrx_value = 2;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1542 char buf[24] = {0x00};
wajahat.abbas@u-blox.com 29:8a38f91009ad 1543 char edrx_val[5];
wajahat.abbas@u-blox.com 29:8a38f91009ad 1544 tEDRXAccessTechnology act_type;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1545
wajahat.abbas@u-blox.com 29:8a38f91009ad 1546 LOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1547
wajahat.abbas@u-blox.com 29:8a38f91009ad 1548 if (_at->send("AT+CEDRXS?") && _at->recv("%23[^\n]\nOK\n", buf)) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1549 if (sscanf(buf, "+CEDRXS: %d,\"%s\"", (int *)&act_type, edrx_val) == 2) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1550
wajahat.abbas@u-blox.com 29:8a38f91009ad 1551 edrx_value = binary_str_to_uint(edrx_val,4);
wajahat.abbas@u-blox.com 29:8a38f91009ad 1552 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1553 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1554
wajahat.abbas@u-blox.com 29:8a38f91009ad 1555 if (_at->send("AT+CEDRXRDP") && _at->recv("OK")) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1556 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1557
wajahat.abbas@u-blox.com 29:8a38f91009ad 1558 tr_info("edrx_value. %d", edrx_value);
wajahat.abbas@u-blox.com 29:8a38f91009ad 1559
wajahat.abbas@u-blox.com 29:8a38f91009ad 1560 UNLOCK();
wajahat.abbas@u-blox.com 29:8a38f91009ad 1561 return edrx_value;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1562 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1563
wajahat.abbas@u-blox.com 29:8a38f91009ad 1564 void UbloxCellularBase::uint_to_binary_str(uint32_t num, char* str, int str_size, int bit_cnt)
wajahat.abbas@u-blox.com 29:8a38f91009ad 1565 {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1566 if (!str || str_size < bit_cnt) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1567 return;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1568 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1569 int tmp, pos = 0;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1570
wajahat.abbas@u-blox.com 29:8a38f91009ad 1571 for (int i = 31; i >= 0; i--) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1572 tmp = num >> i;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1573 if (i < bit_cnt) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1574 if (tmp&1) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1575 str[pos] = 1 + '0';
wajahat.abbas@u-blox.com 29:8a38f91009ad 1576 } else {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1577 str[pos] = 0 + '0';
wajahat.abbas@u-blox.com 29:8a38f91009ad 1578 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1579 pos++;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1580 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1581 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1582 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1583
wajahat.abbas@u-blox.com 29:8a38f91009ad 1584 uint32_t UbloxCellularBase::binary_str_to_uint(const char *binary_string, int binary_string_length)
wajahat.abbas@u-blox.com 29:8a38f91009ad 1585 {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1586 if (!binary_string || !binary_string_length) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1587 return 0;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1588 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1589
wajahat.abbas@u-blox.com 29:8a38f91009ad 1590 int integer_output = 0, base_exp = 1;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1591
wajahat.abbas@u-blox.com 29:8a38f91009ad 1592 for (int i = binary_string_length - 1; i >= 0; i--) {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1593 if (binary_string[i] == '1') {
wajahat.abbas@u-blox.com 29:8a38f91009ad 1594 integer_output += (base_exp << (binary_string_length - (i+1)));
wajahat.abbas@u-blox.com 29:8a38f91009ad 1595 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1596 }
wajahat.abbas@u-blox.com 29:8a38f91009ad 1597
wajahat.abbas@u-blox.com 29:8a38f91009ad 1598 return integer_output;
wajahat.abbas@u-blox.com 29:8a38f91009ad 1599 }
fahimalavi 30:38230504a646 1600
fahimalavi 30:38230504a646 1601 bool UbloxCellularBase::set_band_bitmask(RAT rat, uint64_t bitmask) {
fahimalavi 30:38230504a646 1602
wajahat.abbas@u-blox.com 34:d239824bfb8f 1603 if (_default_profile_is_set == true) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1604 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1605 return false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1606 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1607
fahimalavi 30:38230504a646 1608 bool status = false;
fahimalavi 30:38230504a646 1609 UBandmaskRAT eBandMastRat;
fahimalavi 30:38230504a646 1610
fahimalavi 30:38230504a646 1611 if(rat == LTE_CATM1) {
fahimalavi 30:38230504a646 1612 eBandMastRat = UBANDMASK_RAT_LTE_CATM1;
fahimalavi 30:38230504a646 1613 }
fahimalavi 30:38230504a646 1614 else if(rat == LTE_CATNB1) {
fahimalavi 30:38230504a646 1615 eBandMastRat = UBANDMASK_RAT_LTE_CATNB1;
fahimalavi 30:38230504a646 1616 }
fahimalavi 30:38230504a646 1617 else {
fahimalavi 30:38230504a646 1618 tr_error("Invalid RAT for Band mask selection: %d", rat);
fahimalavi 30:38230504a646 1619
fahimalavi 30:38230504a646 1620 return false;
fahimalavi 30:38230504a646 1621 }
fahimalavi 30:38230504a646 1622
fahimalavi 30:38230504a646 1623 tr_info("UBANDMASK RAT %d, bitmask : %llu", eBandMastRat, bitmask);
fahimalavi 30:38230504a646 1624
fahimalavi 30:38230504a646 1625 LOCK();
fahimalavi 30:38230504a646 1626
fahimalavi 30:38230504a646 1627 if (_at->send("AT+UBANDMASK=%d,%llu", eBandMastRat, bitmask) && _at->recv("OK")) {
fahimalavi 30:38230504a646 1628
fahimalavi 30:38230504a646 1629 status = true;
fahimalavi 30:38230504a646 1630 }
fahimalavi 30:38230504a646 1631 UNLOCK();
fahimalavi 30:38230504a646 1632
fahimalavi 30:38230504a646 1633 return status;
fahimalavi 30:38230504a646 1634 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1635 bool UbloxCellularBase::get_band_bitmask(uint64_t *m1_bitmask, uint64_t *nb1_bitmask)
wajahat.abbas@u-blox.com 34:d239824bfb8f 1636 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1637 if (_default_profile_is_set == true) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1638 tr_critical("!!CANNOT USE PROFILE 0(SW_DEFAULT). PLEASE SET AN APPROPRIATE MNO PROFILE!!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1639 return false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1640 }
fahimalavi 31:b0a6a610d114 1641
fahimalavi 31:b0a6a610d114 1642 bool status = false;
fahimalavi 31:b0a6a610d114 1643 int eBandMastRat0, eBandMastRat1;
fahimalavi 31:b0a6a610d114 1644
fahimalavi 31:b0a6a610d114 1645 LOCK();
fahimalavi 31:b0a6a610d114 1646
qasim-ublox 32:1fc4850f1253 1647 if(_at->send("AT+UBANDMASK?") && _at->recv("+UBANDMASK: %d,%llu,%d,%llu\nOK\n", &eBandMastRat0, m1_bitmask, &eBandMastRat1, nb1_bitmask)) {
fahimalavi 31:b0a6a610d114 1648
fahimalavi 31:b0a6a610d114 1649 status = true;
fahimalavi 31:b0a6a610d114 1650 }
fahimalavi 31:b0a6a610d114 1651 UNLOCK();
fahimalavi 31:b0a6a610d114 1652
fahimalavi 31:b0a6a610d114 1653 return status;
fahimalavi 31:b0a6a610d114 1654 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1655
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1656 bool UbloxCellularBase::disable_power_saving_mode()
wajahat.abbas@u-blox.com 34:d239824bfb8f 1657 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1658 bool return_value = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1659
wajahat.abbas@u-blox.com 34:d239824bfb8f 1660 LOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 1661 if (_at->send("AT+CPSMS=0") && _at->recv("OK")) {
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1662 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1663 _at->send("AT+UPSMR=0");
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1664 _at->recv("OK");
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1665 #endif
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1666 _psm_status = DISABLED;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1667 return_value = true;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1668 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1669 UNLOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 1670
wajahat.abbas@u-blox.com 34:d239824bfb8f 1671 return return_value;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1672 }
fahimalavi 30:38230504a646 1673 #endif //TARGET_UBLOX_C030_R41XM
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1674
wajahat.abbas@u-blox.com 34:d239824bfb8f 1675
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1676 #ifdef TARGET_UBLOX_C030_R412M
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1677 bool UbloxCellularBase::get_power_saving_mode(int *status, int *periodic_time, int *active_time)
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1678 {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1679 char pt_encoded[8+1];// timer value encoded as 3GPP IE
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1680 char at_encoded[8+1];// timer value encoded as 3GPP IE
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1681 int value, multiplier;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1682 bool return_val;
wajahat.abbas@u-blox.com 20:31d5e048fbfa 1683
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1684 if (status == NULL || periodic_time == NULL || active_time == NULL) {
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1685 return false;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1686 }
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1687
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1688 LOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1689 //+UCPSMS:1,,,"01000011","01000011"
wajahat.abbas@u-blox.com 34:d239824bfb8f 1690 if (_at->send("AT+UCPSMS?") && _at->recv("+UCPSMS:%d,,,\"%8c\",\"%8c\"\nOK\n", status, pt_encoded, at_encoded)) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1691 if (*status == true) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1692 //PSM is enabled, decode the timer values, periodic TAU first
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1693 value = (pt_encoded[7]- '0');
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1694 value += (pt_encoded[6]- '0') << 1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1695 value += (pt_encoded[5]- '0') << 2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1696 value += (pt_encoded[4]- '0') << 3;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1697 value += (pt_encoded[3]- '0') << 4;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1698
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1699 multiplier = (pt_encoded[2]- '0');
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1700 multiplier += (pt_encoded[1]- '0') << 1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1701 multiplier += (pt_encoded[0]- '0') << 2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1702
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1703 switch(multiplier) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1704 //10 minutes
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1705 case 0:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1706 value = value*10*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1707 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1708
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1709 //1 hour
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1710 case 1:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1711 value = value*60*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1712 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1713
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1714 //10 hours
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1715 case 2:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1716 value = value*10*60*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1717 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1718
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1719 //2 seconds
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1720 case 3:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1721 value = value*2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1722 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1723
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1724 //30 seconds
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1725 case 4:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1726 value = value*30;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1727 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1728
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1729 //1 minute
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1730 case 5:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1731 value = value*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1732 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1733
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1734 //320 hours
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1735 case 6:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1736 value = value*320*60*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1737 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1738
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1739 default:
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1740 value = -1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1741 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1742 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1743 *periodic_time = value;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1744
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1745 //decode the active time
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1746 value = (at_encoded[7]- '0');
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1747 value += (at_encoded[6]- '0') << 1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1748 value += (at_encoded[5]- '0') << 2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1749 value += (at_encoded[4]- '0') << 3;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1750 value += (at_encoded[3]- '0') << 4;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1751
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1752 multiplier = (at_encoded[2]- '0');
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1753 multiplier += (at_encoded[1]- '0') << 1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1754 multiplier += (at_encoded[0]- '0') << 2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1755
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1756 switch(multiplier) {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1757 //2 seconds
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1758 case 0:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1759 value = value*2;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1760 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1761
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1762 //1 minute
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1763 case 1:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1764 value = value*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1765 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1766
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1767 //decihours (6minutes)
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1768 case 2:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1769 value = value*6*60;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1770 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1771
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1772 default:
wajahat.abbas@u-blox.com 36:2f8ef6ac16dc 1773 value = -1;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1774 break;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1775 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1776 *active_time = value;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1777 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1778 return_val = true;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1779 } else {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1780 return_val = false;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1781 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1782 UNLOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1783 return return_val;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1784 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1785
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1786 bool UbloxCellularBase::set_power_saving_mode(int periodic_time, int active_time)
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1787 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1788
fahimalavi 38:b33dc3d26690 1789 // SARA-R5 only
fahimalavi 38:b33dc3d26690 1790 if (_at->send("AT+CPSMS=1,,,\"%s\",\"%s\"", "10000101","00000011") && _at->recv("OK")) {
fahimalavi 38:b33dc3d26690 1791 //tr_error("Please disable idle mode(+UPSV) first");
fahimalavi 38:b33dc3d26690 1792 _psm_status = ENABLED;
fahimalavi 38:b33dc3d26690 1793 return true;
wajahat.abbas@u-blox.com 25:e67d3d9d2e7e 1794 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1795 bool return_val = false;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1796
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1797 LOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1798 int at_timeout = _at_timeout;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1799 at_set_timeout(10000); //AT+CPSMS has response time of < 10s
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1800
fahimalavi 38:b33dc3d26690 1801 // SARA-R5 only
fahimalavi 38:b33dc3d26690 1802 if (_at->send("AT+UPSMR?") && _at->recv("OK") || 1) { //PSM string encoding code borrowed from AT_CellularPower.cpp
wajahat.abbas@u-blox.com 34:d239824bfb8f 1803 /**
wajahat.abbas@u-blox.com 34:d239824bfb8f 1804 Table 10.5.163a/3GPP TS 24.008: GPRS Timer 3 information element
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1805
wajahat.abbas@u-blox.com 34:d239824bfb8f 1806 Bits 5 to 1 represent the binary coded timer value.
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1807
wajahat.abbas@u-blox.com 34:d239824bfb8f 1808 Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
wajahat.abbas@u-blox.com 34:d239824bfb8f 1809 8 7 6
wajahat.abbas@u-blox.com 34:d239824bfb8f 1810 0 0 0 value is incremented in multiples of 10 minutes
wajahat.abbas@u-blox.com 34:d239824bfb8f 1811 0 0 1 value is incremented in multiples of 1 hour
wajahat.abbas@u-blox.com 34:d239824bfb8f 1812 0 1 0 value is incremented in multiples of 10 hours
wajahat.abbas@u-blox.com 34:d239824bfb8f 1813 0 1 1 value is incremented in multiples of 2 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1814 1 0 0 value is incremented in multiples of 30 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1815 1 0 1 value is incremented in multiples of 1 minute
wajahat.abbas@u-blox.com 34:d239824bfb8f 1816 1 1 0 value is incremented in multiples of 320 hours (NOTE 1)
wajahat.abbas@u-blox.com 34:d239824bfb8f 1817 1 1 1 value indicates that the timer is deactivated (NOTE 2).
wajahat.abbas@u-blox.com 34:d239824bfb8f 1818 */
wajahat.abbas@u-blox.com 34:d239824bfb8f 1819 char pt[8+1];// timer value encoded as 3GPP IE
wajahat.abbas@u-blox.com 34:d239824bfb8f 1820 const int ie_value_max = 0x1f;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1821 uint32_t periodic_timer = 0;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1822 if (periodic_time <= 2*ie_value_max) { // multiples of 2 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1823 periodic_timer = periodic_time/2;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1824 strcpy(pt, "01100000");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1825 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1826 if (periodic_time <= 30*ie_value_max) { // multiples of 30 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1827 periodic_timer = periodic_time/30;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1828 strcpy(pt, "10000000");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1829 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1830 if (periodic_time <= 60*ie_value_max) { // multiples of 1 minute
wajahat.abbas@u-blox.com 34:d239824bfb8f 1831 periodic_timer = periodic_time/60;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1832 strcpy(pt, "10100000");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1833 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1834 if (periodic_time <= 10*60*ie_value_max) { // multiples of 10 minutes
wajahat.abbas@u-blox.com 34:d239824bfb8f 1835 periodic_timer = periodic_time/(10*60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1836 strcpy(pt, "00000000");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1837 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1838 if (periodic_time <= 60*60*ie_value_max) { // multiples of 1 hour
wajahat.abbas@u-blox.com 34:d239824bfb8f 1839 periodic_timer = periodic_time/(60*60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1840 strcpy(pt, "00100000");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1841 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1842 if (periodic_time <= 10*60*60*ie_value_max) { // multiples of 10 hours
wajahat.abbas@u-blox.com 34:d239824bfb8f 1843 periodic_timer = periodic_time/(10*60*60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1844 strcpy(pt, "01000000");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1845 } else { // multiples of 320 hours
wajahat.abbas@u-blox.com 34:d239824bfb8f 1846 int t = periodic_time / (320*60*60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1847 if (t > ie_value_max) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1848 t = ie_value_max;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1849 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1850 periodic_timer = t;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1851 strcpy(pt, "11000000");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1852 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1853 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1854 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1855 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1856 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1857 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1858
wajahat.abbas@u-blox.com 34:d239824bfb8f 1859 uint_to_binary_str(periodic_timer, &pt[3], sizeof(pt)-3, 5);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1860 pt[8] = '\0';
wajahat.abbas@u-blox.com 34:d239824bfb8f 1861
wajahat.abbas@u-blox.com 34:d239824bfb8f 1862 /**
wajahat.abbas@u-blox.com 34:d239824bfb8f 1863 Table 10.5.172/3GPP TS 24.008: GPRS Timer information element
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1864
wajahat.abbas@u-blox.com 34:d239824bfb8f 1865 Bits 5 to 1 represent the binary coded timer value.
wajahat.abbas@u-blox.com 34:d239824bfb8f 1866
wajahat.abbas@u-blox.com 34:d239824bfb8f 1867 Bits 6 to 8 defines the timer value unit for the GPRS timer as follows:
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1868
wajahat.abbas@u-blox.com 34:d239824bfb8f 1869 8 7 6
wajahat.abbas@u-blox.com 34:d239824bfb8f 1870 0 0 0 value is incremented in multiples of 2 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1871 0 0 1 value is incremented in multiples of 1 minute
wajahat.abbas@u-blox.com 34:d239824bfb8f 1872 0 1 0 value is incremented in multiples of decihours
wajahat.abbas@u-blox.com 34:d239824bfb8f 1873 1 1 1 value indicates that the timer is deactivated.
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1874
wajahat.abbas@u-blox.com 34:d239824bfb8f 1875 Other values shall be interpreted as multiples of 1 minute in this version of the protocol.
wajahat.abbas@u-blox.com 34:d239824bfb8f 1876 */
wajahat.abbas@u-blox.com 34:d239824bfb8f 1877 char at[8+1];
wajahat.abbas@u-blox.com 34:d239824bfb8f 1878 uint32_t active_timer; // timer value encoded as 3GPP IE
wajahat.abbas@u-blox.com 34:d239824bfb8f 1879 if (active_time <= 2*ie_value_max) { // multiples of 2 seconds
wajahat.abbas@u-blox.com 34:d239824bfb8f 1880 active_timer = active_time/2;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1881 strcpy(at, "00000000");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1882 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1883 if (active_time <= 60*ie_value_max) { // multiples of 1 minute
wajahat.abbas@u-blox.com 34:d239824bfb8f 1884 active_timer = (1<<5) | (active_time/60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1885 strcpy(at, "00100000");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1886 } else { // multiples of decihours
wajahat.abbas@u-blox.com 34:d239824bfb8f 1887 int t = active_time / (6*60);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1888 if (t > ie_value_max) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1889 t = ie_value_max;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1890 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1891 active_timer = t;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1892 strcpy(at, "01000000");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1893 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1894 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1895
wajahat.abbas@u-blox.com 34:d239824bfb8f 1896 uint_to_binary_str(active_timer, &at[3], sizeof(at)-3, 5);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1897 at[8] = '\0';
wajahat.abbas@u-blox.com 34:d239824bfb8f 1898
wajahat.abbas@u-blox.com 34:d239824bfb8f 1899 if (_at->send("AT+CPSMS=1,,,\"%s\",\"%s\"", pt, at) && _at->recv("OK")) {
fahimalavi 38:b33dc3d26690 1900 //SARA-R5 only
fahimalavi 38:b33dc3d26690 1901 if (!set_psm_urcs(true)) {//enable the PSM URC
wajahat.abbas@u-blox.com 34:d239824bfb8f 1902 tr_info("PSM enabled successfully!");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1903 _psm_status = ENABLED;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1904 return_val = true;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1905 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1906 tr_error("Error enabling PSM URCs, PSM not enabled");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1907 _at->send("AT+CPSMS=0");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1908 _at->recv("OK");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1909 return_val = false;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1910 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1911 } else {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1912 tr_error("+CPSMS command failed");
wajahat.abbas@u-blox.com 34:d239824bfb8f 1913 return_val = false;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1914 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1915 } else {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1916 tr_error("PSM URCs not supported by this version of modem");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1917 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1918
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1919 at_set_timeout(at_timeout);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1920 UNLOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1921 return return_val;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1922 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1923
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1924 bool UbloxCellularBase::is_modem_awake()
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1925 {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1926 return (_dev_info.modem_psm_state == AWAKE);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1927 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1928
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1929 //application should call init() or connect() in order to initialize the modem
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1930 void UbloxCellularBase::wakeup_modem()
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1931 {
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1932 LOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1933
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1934 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1935
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1936 tr_info("Waking up modem...");
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1937
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1938 modem_power_up();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1939
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1940 _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1941 _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1942 _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1943 _modem_initialised = false;
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1944
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1945 UNLOCK();
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1946 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1947
wajahat.abbas@u-blox.com 34:d239824bfb8f 1948 bool UbloxCellularBase::set_psm_urcs(bool enable)
wajahat.abbas@u-blox.com 34:d239824bfb8f 1949 {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1950
wajahat.abbas@u-blox.com 34:d239824bfb8f 1951 bool success = false;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1952 LOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 1953
wajahat.abbas@u-blox.com 34:d239824bfb8f 1954 MBED_ASSERT(_at != NULL);
wajahat.abbas@u-blox.com 34:d239824bfb8f 1955
wajahat.abbas@u-blox.com 34:d239824bfb8f 1956 if (_at->send("AT+UPSMR=%d", enable ? 1 : 0) && _at->recv("OK")) {
wajahat.abbas@u-blox.com 34:d239824bfb8f 1957 success = true;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1958 }
wajahat.abbas@u-blox.com 34:d239824bfb8f 1959
wajahat.abbas@u-blox.com 34:d239824bfb8f 1960 UNLOCK();
wajahat.abbas@u-blox.com 34:d239824bfb8f 1961 return success;
wajahat.abbas@u-blox.com 34:d239824bfb8f 1962 }
wajahat.abbas@u-blox.com 23:eaab8e812a5d 1963 #endif
wajahat.abbas@u-blox.com 29:8a38f91009ad 1964
RobMeades 0:5cffef3371f6 1965 // End of File
RobMeades 0:5cffef3371f6 1966