Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
UbloxCellularBase.h
00001 /* Copyright (c) 2017 ARM Limited 00002 * 00003 * Licensed under the Apache License, Version 2.0 (the "License"); 00004 * you may not use this file except in compliance with the License. 00005 * You may obtain a copy of the License at 00006 * 00007 * http://www.apache.org/licenses/LICENSE-2.0 00008 * 00009 * Unless required by applicable law or agreed to in writing, software 00010 * distributed under the License is distributed on an "AS IS" BASIS, 00011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00012 * See the License for the specific language governing permissions and 00013 * limitations under the License. 00014 */ 00015 00016 #ifndef _UBLOX_CELLULAR_BASE_ 00017 #define _UBLOX_CELLULAR_BASE_ 00018 00019 #include "mbed.h" 00020 #include "mbed_toolchain.h" // for MBED_DEPRECATED 00021 #include "ATCmdParser.h" 00022 #include "FileHandle.h" 00023 00024 #define PLMN_SIZE 24 00025 /********************************************************************** 00026 * CLASSES 00027 **********************************************************************/ 00028 00029 /** UbloxCellularBase class. 00030 * 00031 * This class provides all the base support for generic u-blox modems 00032 * on C030 and C027 boards: module identification, power-up, network 00033 * registration, etc. 00034 */ 00035 class UbloxCellularBase { 00036 00037 public: 00038 /** Circuit Switched network registration status (CREG Usage). 00039 * UBX-13001820 - AT Commands Example Application Note (Section 7.10.3). 00040 */ 00041 typedef enum { 00042 CSD_NOT_REGISTERED_NOT_SEARCHING = 0, 00043 CSD_REGISTERED = 1, 00044 CSD_NOT_REGISTERED_SEARCHING = 2, 00045 CSD_REGISTRATION_DENIED = 3, 00046 CSD_UNKNOWN_COVERAGE = 4, 00047 CSD_REGISTERED_ROAMING = 5, 00048 CSD_SMS_ONLY = 6, 00049 CSD_SMS_ONLY_ROAMING = 7, 00050 CSD_CSFB_NOT_PREFERRED = 9 00051 } NetworkRegistrationStatusCsd; 00052 00053 /** Packet Switched network registration status (CGREG Usage). 00054 * UBX-13001820 - AT Commands Example Application Note (Section 18.27.3). 00055 */ 00056 typedef enum { 00057 PSD_NOT_REGISTERED_NOT_SEARCHING = 0, 00058 PSD_REGISTERED = 1, 00059 PSD_NOT_REGISTERED_SEARCHING = 2, 00060 PSD_REGISTRATION_DENIED = 3, 00061 PSD_UNKNOWN_COVERAGE = 4, 00062 PSD_REGISTERED_ROAMING = 5, 00063 PSD_EMERGENCY_SERVICES_ONLY = 8 00064 } NetworkRegistrationStatusPsd; 00065 00066 /** EPS network registration status (CEREG Usage). 00067 * UBX-13001820 - AT Commands Example Application Note (Section 18.36.3). 00068 */ 00069 typedef enum { 00070 EPS_NOT_REGISTERED_NOT_SEARCHING = 0, 00071 EPS_REGISTERED = 1, 00072 EPS_NOT_REGISTERED_SEARCHING = 2, 00073 EPS_REGISTRATION_DENIED = 3, 00074 EPS_UNKNOWN_COVERAGE = 4, 00075 EPS_REGISTERED_ROAMING = 5, 00076 EPS_EMERGENCY_SERVICES_ONLY = 8 00077 } NetworkRegistrationStatusEps; 00078 00079 /** Initialise the modem, ready for use. 00080 * 00081 * @param pin PIN for the SIM card. 00082 * @return true if successful, otherwise false. 00083 */ 00084 bool init(const char *pin = 0); 00085 00086 /** Perform registration with the network. 00087 * 00088 * @return true if successful, otherwise false. 00089 */ 00090 bool nwk_registration(); 00091 00092 /** True if the modem is registered for circuit 00093 * switched data, otherwise false. 00094 */ 00095 bool is_registered_csd(); 00096 00097 /** True if the modem is registered for packet 00098 * switched data, otherwise false. 00099 */ 00100 bool is_registered_psd(); 00101 00102 /** True if the modem is registered for enhanced 00103 * packet switched data (i.e. LTE and beyond), 00104 * otherwise false. 00105 */ 00106 bool is_registered_eps(); 00107 00108 /** Perform deregistration from the network. 00109 * 00110 * @return true if successful, otherwise false. 00111 */ 00112 bool nwk_deregistration(); 00113 00114 /** Put the modem into its lowest power state. 00115 */ 00116 void deinit(); 00117 00118 /** Set the PIN code for the SIM card. 00119 * 00120 * @param pin PIN for the SIM card. 00121 */ 00122 void set_pin(const char *pin); 00123 00124 /** Enable or disable SIM pin checking. 00125 * 00126 * @param enableNotDisable true if SIM PIN checking is to be enabled, 00127 * otherwise false. 00128 * @return true if successful, otherwise false. 00129 */ 00130 bool sim_pin_check_enable(bool enableNotDisable); 00131 00132 /** Change the SIM pin. 00133 * 00134 * @param new_pin the new PIN to use. 00135 * @return true if successful, otherwise false. 00136 */ 00137 bool change_sim_pin(const char *new_pin); 00138 00139 /** Get the IMEI. 00140 * 00141 * @return true if successful, otherwise false. 00142 */ 00143 MBED_DEPRECATED("This method is now replaced by const char * imei(), please use that instead") 00144 bool get_imei(char *imei_to_send, int size); 00145 00146 /** Get the IMEI of the module. 00147 * 00148 * @return a pointer to the IMEI as a null-terminated string. 00149 */ 00150 const char *imei(); 00151 00152 /** Get the Mobile Equipment ID (which may be the same as the IMEI). 00153 * 00154 * @return a pointer to the Mobile Equipment ID as a null-terminated string. 00155 */ 00156 const char *meid(); 00157 00158 /** Get the IMSI of the SIM. 00159 * 00160 * @return a pointer to the IMSI as a null-terminated string. 00161 */ 00162 const char *imsi(); 00163 00164 /** Get the ICCID of the SIM. 00165 * 00166 * @return a pointer to the ICCID as a null-terminated string. 00167 */ 00168 const char *iccid(); 00169 00170 /** Get the RSSI. 00171 * 00172 * @return the RSSI in dBm. If it is not possible to obtain an 00173 * RSSI reading at the time (e.g. because the modem is in 00174 * data mode rather than AT command mode) then 0 is returned. 00175 */ 00176 int rssi(); 00177 00178 /** RAT values for +URAT command 00179 * R412M only supports value 7 (CatM1), 8 (NB1), and 9 (GPRS) 00180 */ 00181 typedef enum { 00182 GSM_GPRS_EGPRS = 0, 00183 GSM_UMTS = 1, 00184 UMTS = 2, 00185 URAT_LTE = 3, 00186 GSM_UMTS_LTE = 4, 00187 GSM_LTE = 5, 00188 UMTS_LTE = 6, 00189 LTE_CATM1 = 7, 00190 LTE_CATNB1 = 8, 00191 GPRS_EGPRS = 9, 00192 NOT_USED = 255 00193 } RAT; 00194 00195 #ifdef TARGET_UBLOX_C030_R41XM 00196 /** Supported MNO profiles for SARA-R4. 00197 */ 00198 typedef enum { 00199 SW_DEFAULT = 0, 00200 SIM_ICCID = 1, 00201 ATT = 2, 00202 VERIZON = 3, 00203 TELSTRA = 4, 00204 TMO = 5, 00205 CT = 6, 00206 VODAFONE = 19, 00207 TELUS = 21, 00208 DT = 31, 00209 STANDARD_EU = 100 00210 } MNOProfile; 00211 00212 #if MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE 00213 #define DEFAULT_MNO_PROFILE (MNOProfile)MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE 00214 #else 00215 #define DEFAULT_MNO_PROFILE SW_DEFAULT 00216 #endif 00217 00218 /** Reads the current MNO profile from modem and sets it to user specified profile. 00219 * User can also specify profile in mbed_lib.json file and call set_mno_profile without any arguments. 00220 * 00221 * Note: MNO profile should only be set in detached state and a reboot is required for settings to take effect 00222 * 00223 * @param profile MNO profile to use 00224 * @return true if operation was successful, false if there was an error 00225 */ 00226 bool set_mno_profile(MNOProfile profile = DEFAULT_MNO_PROFILE); 00227 00228 /** Get current MNO profile. 00229 * 00230 * @param profile pointer to variable that can hold the value for returned profile 00231 * @return true if operation was successful, false if there was an error 00232 */ 00233 bool get_mno_profile(MNOProfile *profile); 00234 #endif 00235 00236 /** Set Radio Access Technology on modem. 00237 * 00238 * Note: RAT should only be set in detached state and a reboot is required for settings to take effect 00239 * 00240 * @param selected_rat Radio Access Technology to use 00241 * @param preferred_rat Radio Access Technology to use if selected_rat is not available 00242 * @param second_preferred_rat Radio Access Technology to use if selected_rat and preferred_rat are not available 00243 * 00244 * @return true if successful, otherwise false. 00245 */ 00246 bool set_modem_rat(RAT selected_rat, RAT preferred_rat = NOT_USED, RAT second_preferred_rat = NOT_USED); 00247 00248 /** Get last saved values for RAT using +URAT read command. Note: The current selected RAT is indicated by DeviceInfo.rat 00249 * 00250 * @param selected_rat pointer to variable that can hold the value for selected_rat 00251 * @param preferred_rat pointer to variable that can hold the value for preferred_rat 00252 * @param second_preferred_rat pointer to variable that can hold the value for second_preferred_rat 00253 * 00254 * Note: NOT_USED will be returned in the variables if dual or tri modes are not enabled. 00255 * 00256 * @return true if successful, otherwise false. 00257 */ 00258 bool get_modem_rat(RAT *selected_rat, RAT *preferred_rat, RAT *second_preferred_rat); 00259 00260 /** reboot the modem using AT+CFUN=15. 00261 * 00262 * @return true if successful, otherwise false. 00263 */ 00264 bool reboot_modem(); 00265 protected: 00266 00267 #define OUTPUT_ENTER_KEY "\r" 00268 00269 #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE 00270 #define AT_PARSER_BUFFER_SIZE MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE 00271 #else 00272 #define AT_PARSER_BUFFER_SIZE 256 00273 #endif 00274 00275 #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT 00276 #define AT_PARSER_TIMEOUT MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT 00277 #else 00278 #define AT_PARSER_TIMEOUT 8*1000 // Milliseconds 00279 #endif 00280 00281 /** A string that would not normally be sent by the modem on the AT interface. 00282 */ 00283 #define UNNATURAL_STRING "\x01" 00284 00285 /** Supported u-blox modem variants. 00286 */ 00287 typedef enum { 00288 DEV_TYPE_NONE = 0, 00289 DEV_SARA_G35, 00290 DEV_LISA_U2, 00291 DEV_LISA_U2_03S, 00292 DEV_SARA_U2, 00293 DEV_SARA_R4, 00294 DEV_LEON_G2, 00295 DEV_TOBY_L2, 00296 DEV_MPCI_L2 00297 } DeviceType; 00298 00299 /** Network registration status. 00300 * UBX-13001820 - AT Commands Example Application Note (Section 4.1.4.5). 00301 */ 00302 typedef enum { 00303 GSM = 0, 00304 COMPACT_GSM = 1, 00305 UTRAN = 2, 00306 EDGE = 3, 00307 HSDPA = 4, 00308 HSUPA = 5, 00309 HSDPA_HSUPA = 6, 00310 LTE = 7, 00311 EC_GSM_IoT = 8, 00312 E_UTRAN_NB_S1 = 9 00313 } RadioAccessNetworkType; 00314 00315 /** Info about the modem. 00316 */ 00317 typedef struct { 00318 DeviceType dev; 00319 char iccid[20 + 1]; //!< Integrated Circuit Card ID. 00320 char imsi[15 + 1]; //!< International Mobile Station Identity. 00321 char imei[15 + 1]; //!< International Mobile Equipment Identity. 00322 char meid[18 + 1]; //!< Mobile Equipment IDentifier. 00323 volatile RadioAccessNetworkType rat; //!< Type of network (e.g. 2G, 3G, LTE). 00324 volatile NetworkRegistrationStatusCsd reg_status_csd; //!< Circuit switched attach status. 00325 volatile NetworkRegistrationStatusPsd reg_status_psd; //!< Packet switched attach status. 00326 volatile NetworkRegistrationStatusEps reg_status_eps; //!< Evolved Packet Switched (e.g. LTE) attach status. 00327 } DeviceInfo; 00328 00329 /* IMPORTANT: the variables below are available to 00330 * classes that inherit this in order to keep things 00331 * simple. However, ONLY this class should free 00332 * any of the pointers, or there will be havoc. 00333 */ 00334 00335 /** Point to the instance of the AT parser in use. 00336 */ 00337 ATCmdParser *_at; 00338 00339 /** The current AT parser timeout value. 00340 */ 00341 int _at_timeout; 00342 00343 /** File handle used by the AT parser. 00344 */ 00345 FileHandle *_fh; 00346 00347 /** The mutex resource. 00348 */ 00349 Mutex _mtx; 00350 00351 /** General info about the modem as a device. 00352 */ 00353 DeviceInfo _dev_info; 00354 00355 /** The SIM PIN to use. 00356 */ 00357 const char *_pin; 00358 00359 /** Set to true to spit out debug traces. 00360 */ 00361 bool _debug_trace_on; 00362 00363 /** The baud rate to the modem. 00364 */ 00365 int _baud; 00366 00367 /** True if the modem is ready register to the network, 00368 * otherwise false. 00369 */ 00370 bool _modem_initialised; 00371 00372 /** True it the SIM requires a PIN, otherwise false. 00373 */ 00374 bool _sim_pin_check_enabled; 00375 00376 /** Sets the modem up for powering on 00377 * 00378 * modem_init() is equivalent to plugging in the device, e.g., attaching power and serial port. 00379 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00380 */ 00381 virtual void modem_init(); 00382 00383 /** Sets the modem in unplugged state 00384 * 00385 * modem_deinit() will be equivalent to pulling the plug off of the device, i.e., detaching power 00386 * and serial port. This puts the modem in lowest power state. 00387 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00388 */ 00389 virtual void modem_deinit(); 00390 00391 /** Powers up the modem 00392 * 00393 * modem_power_up() is equivalent to pressing the soft power button. 00394 * The driver may repeat this if the modem is not responsive to AT commands. 00395 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00396 */ 00397 virtual void modem_power_up(); 00398 00399 /** Powers down the modem 00400 * 00401 * modem_power_down() is equivalent to turning off the modem by button press. 00402 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00403 */ 00404 virtual void modem_power_down(); 00405 00406 /* Note: constructor and destructor protected so that this 00407 * class can only ever be inherited, never used directly. 00408 */ 00409 UbloxCellularBase(); 00410 ~UbloxCellularBase(); 00411 00412 /** Initialise this class. 00413 * 00414 * @param tx the UART TX data pin to which the modem is attached. 00415 * @param rx the UART RX data pin to which the modem is attached. 00416 * @param baud the UART baud rate. 00417 * @param debug_on true to switch AT interface debug on, otherwise false. 00418 * 00419 * Note: it would be more natural to do this in the constructor 00420 * however, to avoid the diamond of death, this class is only 00421 * every inherited virtually. Classes that are inherited virtually 00422 * do not get passed parameters in their constructor and hence 00423 * classInit() must be called separately by the first one to wake 00424 * the beast. 00425 */ 00426 void baseClassInit(PinName tx = MDMTXD, 00427 PinName rx = MDMRXD, 00428 int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE, 00429 bool debug_on = false); 00430 00431 /** Set the AT parser timeout. 00432 */ 00433 void at_set_timeout(int timeout); 00434 00435 /** Read up to size characters from buf 00436 * or until the character "end" is reached, overwriting 00437 * the newline with 0 and ensuring a terminator 00438 * in all cases. 00439 * 00440 * @param buf the buffer to write to. 00441 * @param size the size of the buffer. 00442 * @param end the character to stop at. 00443 * @return the number of characters read, 00444 * not including the terminator. 00445 */ 00446 int read_at_to_char(char * buf, int size, char end); 00447 00448 /** Powers up the modem. 00449 * 00450 * @return true if successful, otherwise false. 00451 */ 00452 bool power_up(); 00453 00454 /** Power down the modem. 00455 */ 00456 void power_down(); 00457 00458 /** Lock a mutex when accessing the modem. 00459 */ 00460 void lock(void) { _mtx.lock(); } 00461 00462 /** Helper to make sure that lock unlock pair is always balanced 00463 */ 00464 #define LOCK() { lock() 00465 00466 /** Unlock the modem when done accessing it. 00467 */ 00468 void unlock(void) { _mtx.unlock(); } 00469 00470 /** Helper to make sure that lock unlock pair is always balanced 00471 */ 00472 #define UNLOCK() } unlock() 00473 00474 /** Set the device identity in _dev_info 00475 * based on the ATI string returned by 00476 * the module. 00477 * 00478 * @return true if dev is a known value, 00479 * otherwise false. 00480 */ 00481 bool set_device_identity(DeviceType *dev); 00482 00483 /** Perform any modem initialisation that is 00484 * specialised by device type. 00485 * 00486 * @return true if successful, otherwise false. 00487 */ 00488 bool device_init(DeviceType dev); 00489 00490 /** Set up the SIM. 00491 * 00492 * @return true if successful, otherwiss false. 00493 */ 00494 bool initialise_sim_card(); 00495 00496 /** PLMN for manual registration 00497 */ 00498 char _plmn[PLMN_SIZE + 1]; 00499 private: 00500 00501 void set_nwk_reg_status_csd(int status); 00502 void set_nwk_reg_status_psd(int status); 00503 void set_nwk_reg_status_eps(int status); 00504 void set_rat(int AcTStatus); 00505 bool get_iccid(); 00506 bool get_imsi(); 00507 bool get_imei(); 00508 bool get_meid(); 00509 bool set_sms(); 00510 void parser_abort_cb(); 00511 void CMX_ERROR_URC(); 00512 void CREG_URC(); 00513 void CGREG_URC(); 00514 void CEREG_URC(); 00515 void UMWI_URC(); 00516 }; 00517 00518 #endif // _UBLOX_CELLULAR_BASE_ 00519
Generated on Sun Jul 31 2022 21:56:42 by
1.7.2