ublox-cellular-base

Committer:
mudassar0121
Date:
Thu Apr 02 15:59:41 2020 +0500
Revision:
40:19c834eb9106
Parent:
37:a2466fcd63c3
Removed onboard_modem_api and UARTSerial, added UBLOX_onboard_modem_api and BufferedSerial to power up modem

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