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) 2019 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 "UbloxATCmdParser.h" 00022 #include "FileHandle.h" 00023 00024 #ifdef TARGET_UBLOX_C030_R410M 00025 #define MAX_NUM_PROFILES 12 //ref to enum MNOProfile 00026 #elif TARGET_UBLOX_C030_R412M 00027 #define MAX_NUM_PROFILES 7 00028 #endif 00029 00030 /********************************************************************** 00031 * CLASSES 00032 **********************************************************************/ 00033 00034 /** UbloxCellularBase class. 00035 * 00036 * This class provides all the base support for generic u-blox modems 00037 * on C030 and C027 boards: module identification, power-up, network 00038 * registration, etc. 00039 */ 00040 class UbloxCellularBase { 00041 00042 public: 00043 /** Circuit Switched network registration status (CREG Usage). 00044 * UBX-13001820 - AT Commands Example Application Note (Section 7.10.3). 00045 */ 00046 typedef enum { 00047 CSD_NOT_REGISTERED_NOT_SEARCHING = 0, 00048 CSD_REGISTERED = 1, 00049 CSD_NOT_REGISTERED_SEARCHING = 2, 00050 CSD_REGISTRATION_DENIED = 3, 00051 CSD_UNKNOWN_COVERAGE = 4, 00052 CSD_REGISTERED_ROAMING = 5, 00053 CSD_SMS_ONLY = 6, 00054 CSD_SMS_ONLY_ROAMING = 7, 00055 CSD_CSFB_NOT_PREFERRED = 9 00056 } NetworkRegistrationStatusCsd; 00057 00058 /** Packet Switched network registration status (CGREG Usage). 00059 * UBX-13001820 - AT Commands Example Application Note (Section 18.27.3). 00060 */ 00061 typedef enum { 00062 PSD_NOT_REGISTERED_NOT_SEARCHING = 0, 00063 PSD_REGISTERED = 1, 00064 PSD_NOT_REGISTERED_SEARCHING = 2, 00065 PSD_REGISTRATION_DENIED = 3, 00066 PSD_UNKNOWN_COVERAGE = 4, 00067 PSD_REGISTERED_ROAMING = 5, 00068 PSD_EMERGENCY_SERVICES_ONLY = 8 00069 } NetworkRegistrationStatusPsd; 00070 00071 /** EPS network registration status (CEREG Usage). 00072 * UBX-13001820 - AT Commands Example Application Note (Section 18.36.3). 00073 */ 00074 typedef enum { 00075 EPS_NOT_REGISTERED_NOT_SEARCHING = 0, 00076 EPS_REGISTERED = 1, 00077 EPS_NOT_REGISTERED_SEARCHING = 2, 00078 EPS_REGISTRATION_DENIED = 3, 00079 EPS_UNKNOWN_COVERAGE = 4, 00080 EPS_REGISTERED_ROAMING = 5, 00081 EPS_EMERGENCY_SERVICES_ONLY = 8 00082 } NetworkRegistrationStatusEps; 00083 00084 /** modem PSM states. 00085 * 00086 */ 00087 typedef enum { 00088 AWAKE = 0, 00089 ASLEEP = 1 00090 } ModemPSMState; 00091 00092 /** 00093 * edrx access technology 00094 */ 00095 typedef enum { 00096 EDRXGSM_EC_GSM_IoT_mode = 1, 00097 EDRXGSM_A_Gb_mode, 00098 EDRXUTRAN_Iu_mode, 00099 EDRXEUTRAN_WB_S1_mode, 00100 EDRXEUTRAN_NB_S1_mode 00101 }tEDRXAccessTechnology; 00102 00103 #ifdef TARGET_UBLOX_C030_R41XM 00104 /** Supported MNO profiles for SARA-R4. 00105 */ 00106 typedef enum { 00107 SW_DEFAULT = 0, 00108 SIM_ICCID = 1, 00109 ATT = 2, 00110 TMO = 5, 00111 VODAFONE = 19, 00112 DT = 31, 00113 STANDARD_EU = 100 00114 #ifdef TARGET_UBLOX_C030_R410M 00115 , VERIZON = 3, 00116 TELSTRA = 4, 00117 CT = 6, 00118 SPRINT = 8, 00119 TELUS = 21 00120 #endif 00121 } MNOProfile; 00122 00123 typedef enum { 00124 UBANDMASK_RAT_LTE_CATM1 = 0, 00125 UBANDMASK_RAT_LTE_CATNB1 = 1 00126 00127 } UBandmaskRAT; 00128 #endif 00129 00130 /** Initialise the modem, ready for use. 00131 * 00132 * @param pin PIN for the SIM card. 00133 * @return true if successful, otherwise false. 00134 */ 00135 bool init(const char *pin = 0); 00136 00137 /** Perform registration with the network. 00138 * 00139 * @return true if successful, otherwise false. 00140 */ 00141 bool nwk_registration(); 00142 00143 /** True if the modem is registered for circuit 00144 * switched data, otherwise false. 00145 */ 00146 bool is_registered_csd(); 00147 00148 /** True if the modem is registered for packet 00149 * switched data, otherwise false. 00150 */ 00151 bool is_registered_psd(); 00152 00153 /** True if the modem is registered for enhanced 00154 * packet switched data (i.e. LTE and beyond), 00155 * otherwise false. 00156 */ 00157 bool is_registered_eps(); 00158 00159 /** Perform deregistration from the network. 00160 * 00161 * @return true if successful, otherwise false. 00162 */ 00163 bool nwk_deregistration(); 00164 00165 /** Put the modem into its lowest power state. 00166 */ 00167 void deinit(); 00168 00169 /** Set the PIN code for the SIM card. 00170 * 00171 * @param pin PIN for the SIM card. 00172 */ 00173 void set_pin(const char *pin); 00174 00175 /** Enable or disable SIM pin checking. 00176 * 00177 * @param enableNotDisable true if SIM PIN checking is to be enabled, 00178 * otherwise false. 00179 * @return true if successful, otherwise false. 00180 */ 00181 bool sim_pin_check_enable(bool enableNotDisable); 00182 00183 /** Change the SIM pin. 00184 * 00185 * @param new_pin the new PIN to use. 00186 * @return true if successful, otherwise false. 00187 */ 00188 bool change_sim_pin(const char *new_pin); 00189 00190 /** Get the IMEI. 00191 * 00192 * @return true if successful, otherwise false. 00193 */ 00194 MBED_DEPRECATED("This method is now replaced by const char * imei(), please use that instead") 00195 bool get_imei(char *imei_to_send, int size); 00196 00197 /** Get the IMEI of the module. 00198 * 00199 * @return a pointer to the IMEI as a null-terminated string. 00200 */ 00201 const char *imei(); 00202 00203 /** Get the Mobile Equipment ID (which may be the same as the IMEI). 00204 * 00205 * @return a pointer to the Mobile Equipment ID as a null-terminated string. 00206 */ 00207 const char *meid(); 00208 00209 /** Get the IMSI of the SIM. 00210 * 00211 * @return a pointer to the IMSI as a null-terminated string. 00212 */ 00213 const char *imsi(); 00214 00215 /** Get the ICCID of the SIM. 00216 * 00217 * @return a pointer to the ICCID as a null-terminated string. 00218 */ 00219 const char *iccid(); 00220 00221 /** Get the RSSI. 00222 * 00223 * @return the RSSI in dBm. If it is not possible to obtain an 00224 * RSSI reading at the time (e.g. because the modem is in 00225 * data mode rather than AT command mode) then 0 is returned. 00226 */ 00227 int rssi(); 00228 00229 /** RAT values for +URAT command 00230 * R412M only supports value 7 (CatM1), 8 (NB1), and 9 (GPRS) 00231 */ 00232 typedef enum { 00233 GSM_GPRS_EGPRS = 0, 00234 GSM_UMTS = 1, 00235 UMTS = 2, 00236 URAT_LTE = 3, 00237 GSM_UMTS_LTE = 4, 00238 GSM_LTE = 5, 00239 UMTS_LTE = 6, 00240 LTE_CATM1 = 7, 00241 LTE_CATNB1 = 8, 00242 GPRS_EGPRS = 9, 00243 NOT_USED = -1 00244 } RAT; 00245 00246 /** Module functionality modes. Ref to section 5.3.3 of UBX-13002752 for details. 00247 */ 00248 typedef enum { 00249 FUNC_MIN = 0, 00250 FUNC_FULL = 1, 00251 FUNC_AIRPLANE = 4, 00252 FUNC_EN_SIM_TLKT_DEDICATED = 6, 00253 FUNC_DS_SIM_TLKT = 7, 00254 FUNC_EN_SIM_TLKT_RAW = 9, 00255 FUNC_RESET = 15, 00256 FUNC_RESET_WITH_SIM = 16, 00257 FUNC_MIN_WITH_SIM = 19, 00258 FUNC_HALT = 127 00259 } FunctionalityMode; 00260 00261 #ifdef TARGET_UBLOX_C030_R41XM 00262 /** Set MNO profile. Profile will be applied on next boot. 00263 * 00264 * User can also specify profile in mbed_app.json ("default-mno-profile": 100) and in that case profile will be applied in init(). 00265 * Modem will also be rebooted so that profile parameters can be applied. 00266 * 00267 * Note: MNO profile should only be set in detached state and a reboot is required for settings to take effect 00268 * Note 2: ref to UBX-17003787 B.5, setting MNO profile can change other parameters such as PSM, Band mask, URAT etc. 00269 * Application must always set a profile first and if required, change parameters afterwards. 00270 * Note 3: ref to UBX-17003787 B.5, some profiles have locked parameters and modem will return ERROR if you try to change those. 00271 * It is suggested to switch to a profile e.g. STANDARD_EU (100) and then change the parameters as required. 00272 * @param profile MNO profile to use 00273 * @return true if operation was successful, false if there was an error 00274 */ 00275 bool set_mno_profile(MNOProfile profile); 00276 00277 /** Get current MNO profile. 00278 * 00279 * @param profile pointer to variable that can hold the value for returned profile 00280 * @return true if operation was successful, false if there was an error 00281 */ 00282 bool get_mno_profile(int *profile); 00283 00284 /** Enable or disable the UPSV Power Saving Mode. 00285 * 00286 * @param idle_mode_value 1: enable idle mode 00287 * 0: disable idle mode 00288 * @return true if successful, otherwise false. 00289 */ 00290 bool set_idle_mode(bool enable = false); 00291 00292 /** Queries the modem for idle mode status. 00293 * 00294 * @param status pointer to variable that can hold the value for idle mode status 00295 * 1: enabled 00296 * 0: disabled 00297 * @return true if successful, otherwise false. 00298 */ 00299 bool get_idle_mode(int *status); 00300 #endif 00301 00302 /** Set Radio Access Technology on modem. 00303 * 00304 * Note: RAT should only be set in detached state and a reboot is required for settings to take effect 00305 * 00306 * @param selected_rat Radio Access Technology to use 00307 * @param preferred_rat Radio Access Technology to use if selected_rat is not available 00308 * @param second_preferred_rat Radio Access Technology to use if selected_rat and preferred_rat are not available 00309 * 00310 * @return true if successful, otherwise false. 00311 */ 00312 bool set_modem_rat(RAT selected_rat, RAT preferred_rat = NOT_USED, RAT second_preferred_rat = NOT_USED); 00313 00314 /** Get last saved values for RAT using +URAT read command. Note: The current selected RAT is indicated by DeviceInfo.rat 00315 * 00316 * @param selected_rat pointer to variable that can hold the value for selected_rat 00317 * @param preferred_rat pointer to variable that can hold the value for preferred_rat 00318 * @param second_preferred_rat pointer to variable that can hold the value for second_preferred_rat 00319 * 00320 * Note: NOT_USED will be returned in the variables if dual or tri modes are not enabled. 00321 * 00322 * @return true if successful, otherwise false. 00323 */ 00324 bool get_modem_rat(int *selected_rat, int *preferred_rat, int *second_preferred_rat); 00325 00326 /** Sets the modem to specified functionality mode. 00327 * 00328 * @return true if successful, otherwise false. 00329 */ 00330 bool set_functionality_mode(FunctionalityMode mode); 00331 00332 /** Get the modem functionality mode 00333 * 00334 * @return true if successful, otherwise false. 00335 */ 00336 bool get_functionality_mode(int *mode); 00337 00338 /** reboot the modem using AT+CFUN=15. Application should call init() or connect() before making any other API calls. 00339 * 00340 * @return true if successful, otherwise false. 00341 */ 00342 bool reboot_modem(); 00343 00344 #ifdef TARGET_UBLOX_C030_R412M 00345 /** Important: Callback function is executed in context of AT parser so a user should not issue any AT commands from inside the callback. 00346 * It is recommended to set a flag/event/signal in callback and application can use that to wake up the modem and re-initialize it 00347 * 00348 * application callback for modem going in to PSM sleep 00349 * 00350 * @param func callback function to be executed when modem is going in to PSM sleep 00351 * @param param parameter to be passed to callback function. 00352 */ 00353 void attach_cb_psm_going_in(Callback<void(void*)> func, void *param) 00354 { 00355 _func_psm_going_in = func; 00356 _cb_param_psm_going_in = param; 00357 } 00358 00359 /** Important: Callback function is executed in context of AT parser so a user should not issue any AT commands from inside the callback. 00360 * It is recommended to set a flag/event/signal in callback and application can use that to wake up the modem and re-initialize it 00361 * 00362 * application callback for modem coming out of PSM sleep 00363 * 00364 * @param func callback function to be executed when modem is coming out of PSM sleep. 00365 * @param param parameter to be passed to callback function. 00366 */ 00367 void attach_cb_psm_coming_out(Callback<void(void*)> func, void *param) 00368 { 00369 _func_psm_coming_out = func; 00370 _cb_param_psm_coming_out = param; 00371 } 00372 00373 /** de-register the application callback for modem going in to PSM sleep 00374 * 00375 */ 00376 void detach_cb_psm_going_in() 00377 { 00378 _func_psm_going_in = NULL; 00379 _cb_param_psm_going_in = NULL; 00380 } 00381 00382 /** de-register application callback for modem coming out of PSM sleep 00383 * 00384 */ 00385 void detach_cb_psm_coming_out() 00386 { 00387 _func_psm_coming_out = NULL; 00388 _cb_param_psm_coming_out = NULL; 00389 } 00390 00391 /** Enable or disable the 3GPP PSM. 00392 * 00393 * Note: Application should reboot the module after enabling PSM in order to enter PSM state. (reboot_modem()) 00394 * Note: Modem can be woken up by toggling the power-on signal. (wakeup_modem()) 00395 * Note: When device enters PSM, all connections(PPP, sockets) and settings that are not saved in NV memory(ATE0, CREG etc) are lost. 00396 * host application should be prepared to re-initialize the modem and re-establish the connections. 00397 * Note: PSM is disabled if both periodic_time and active_time are 0. 00398 * Note: Not all variants/firmware versions support PSM URCs and in that case function will return false. 00399 * 00400 * PSM string encoding code is borrowed from AT_CellularPower.cpp 00401 * 00402 * @param periodic_time requested periodic TAU in seconds. 00403 * @param active_time requested active time in seconds. 00404 * @param func callback function to execute when modem goes to sleep 00405 * @param ptr parameter to callback function 00406 * @return True if successful, otherwise false. 00407 */ 00408 bool set_power_saving_mode(int periodic_tau, int active_time); 00409 00410 /** Reads the 3GPP PSM status (enabled or disabled) and returns assigned periodic tau and active time values. 00411 * 00412 * @param status 0: PSM disabled, 1: PSM enabled 00413 * @param periodic_tau assigned periodic TAU in seconds. 00414 * @param active_time assigned active time in seconds 00415 * @return True if command successful, otherwise false. 00416 */ 00417 bool get_power_saving_mode(int *status, int *periodic_tau, int *active_time); 00418 00419 /** Wake up the modem from PSM. Ref to comment on set_power_saving_mode, application should call init() or connect() 00420 * before making any other API calls. 00421 */ 00422 void wakeup_modem(); 00423 00424 /** True if the modem is not in PSM sleep 00425 * otherwise false. 00426 */ 00427 bool is_modem_awake(); 00428 #endif 00429 00430 #ifdef TARGET_UBLOX_C030_R41XM 00431 /** Set discontinuous reception time on cellular device. 00432 * SARA-R404M / SARA-R410M-02B / SARA-R410M-52B / SARA-R412M / SARA-N4 : The <Paging_time_window> parameter cannot be set by means of the set command. 00433 * 00434 * 00435 * @remark See 3GPP TS 27.007 eDRX for details. 00436 * 00437 * @param mode disable or enable the use of eDRX 00438 * @param act_type type of access technology 00439 * @param edrx_value requested edxr value. Extended DRX parameters information element. 00440 * 00441 * @return 0 on success 00442 * 1 on failure 00443 */ 00444 int set_receive_period(int mode, tEDRXAccessTechnology act_type, uint8_t edrx_value); 00445 00446 /** Set discontinuous reception time on cellular device. 00447 * 00448 * @remark See 3GPP TS 27.007 eDRX for details. 00449 * 00450 * @param mode disable or enable the use of eDRX 00451 * @param act_type type of access technology 00452 * 00453 * @return 0 on success 00454 * 1 on failure 00455 */ 00456 int set_receive_period(int mode, tEDRXAccessTechnology act_type); 00457 00458 /** Set discontinuous reception time on cellular device. (Disable) 00459 * 00460 * @remark See 3GPP TS 27.007 eDRX for details. 00461 * 00462 * @param mode disable or enable the use of eDRX 00463 * 00464 * @return 0 on success 00465 * 1 on failure 00466 */ 00467 int set_receive_period(int mode); 00468 00469 /** get discontinuous reception time on cellular device. 00470 * 00471 * @remark See 3GPP TS 27.007 eDRX for details. 00472 * 00473 * @return uint32_t 00474 */ 00475 uint32_t get_receive_period(); 00476 00477 /** set band select bitmask 00478 * 00479 * @param RAT RAT type 00480 * @param bitmask bitmask 00481 * @return True if successful, otherwise false. 00482 */ 00483 bool set_band_bitmask(RAT rat, uint64_t bitmask); 00484 00485 /** get band select bitmasks 00486 * 00487 * @param m1_bitmask pointer to band select bitmask of M1 00488 * @param nb1_bitmask pointer to band select bitmask of NB1 00489 * @return True if successful, otherwise false. 00490 */ 00491 bool get_band_bitmask(uint64_t *m1_bitmask, uint64_t *nb1_bitmask); 00492 00493 /** disables the PSM 00494 * 00495 * @return True if successful, otherwise false. 00496 */ 00497 bool disable_power_saving_mode(); 00498 #endif 00499 00500 protected: 00501 00502 #define OUTPUT_ENTER_KEY "\r" 00503 00504 #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE 00505 #define AT_PARSER_BUFFER_SIZE MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE 00506 #else 00507 #define AT_PARSER_BUFFER_SIZE 256 00508 #endif 00509 00510 #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT 00511 #define AT_PARSER_TIMEOUT MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT 00512 #else 00513 #define AT_PARSER_TIMEOUT 8*1000 // Milliseconds 00514 #endif 00515 00516 /** A string that would not normally be sent by the modem on the AT interface. 00517 */ 00518 #define UNNATURAL_STRING "\x01" 00519 00520 /** Supported u-blox modem variants. 00521 */ 00522 typedef enum { 00523 DEV_TYPE_NONE = 0, 00524 DEV_SARA_G35, 00525 DEV_LISA_U2, 00526 DEV_LISA_U2_03S, 00527 DEV_SARA_U2, 00528 DEV_SARA_R4, 00529 DEV_LEON_G2, 00530 DEV_TOBY_L2, 00531 DEV_MPCI_L2 00532 } DeviceType; 00533 00534 /** Network registration status. 00535 * UBX-13001820 - AT Commands Example Application Note (Section 4.1.4.5). 00536 */ 00537 typedef enum { 00538 GSM = 0, 00539 COMPACT_GSM = 1, 00540 UTRAN = 2, 00541 EDGE = 3, 00542 HSDPA = 4, 00543 HSUPA = 5, 00544 HSDPA_HSUPA = 6, 00545 LTE = 7, 00546 EC_GSM_IoT = 8, 00547 E_UTRAN_NB_S1 = 9 00548 } RadioAccessNetworkType; 00549 00550 /** Info about the modem. 00551 */ 00552 typedef struct { 00553 DeviceType dev; 00554 char iccid[20 + 1]; //!< Integrated Circuit Card ID. 00555 char imsi[15 + 1]; //!< International Mobile Station Identity. 00556 char imei[15 + 1]; //!< International Mobile Equipment Identity. 00557 char meid[18 + 1]; //!< Mobile Equipment IDentifier. 00558 volatile RadioAccessNetworkType rat; //!< Type of network (e.g. 2G, 3G, LTE). 00559 volatile NetworkRegistrationStatusCsd reg_status_csd; //!< Circuit switched attach status. 00560 volatile NetworkRegistrationStatusPsd reg_status_psd; //!< Packet switched attach status. 00561 volatile NetworkRegistrationStatusEps reg_status_eps; //!< Evolved Packet Switched (e.g. LTE) attach status. 00562 #ifdef TARGET_UBLOX_C030_R412M 00563 volatile ModemPSMState modem_psm_state; //!< last known modem PSM state 00564 #endif 00565 } DeviceInfo; 00566 00567 /* IMPORTANT: the variables below are available to 00568 * classes that inherit this in order to keep things 00569 * simple. However, ONLY this class should free 00570 * any of the pointers, or there will be havoc. 00571 */ 00572 00573 /** Point to the instance of the AT parser in use. 00574 */ 00575 #ifdef TARGET_UBLOX_C030_R41XM 00576 UbloxATCmdParser *_at; 00577 #else 00578 ATCmdParser *_at; 00579 #endif 00580 00581 /** The current AT parser timeout value. 00582 */ 00583 int _at_timeout; 00584 00585 /** File handle used by the AT parser. 00586 */ 00587 FileHandle *_fh; 00588 00589 /** The mutex resource. 00590 */ 00591 Mutex _mtx; 00592 00593 /** General info about the modem as a device. 00594 */ 00595 DeviceInfo _dev_info; 00596 00597 /** The SIM PIN to use. 00598 */ 00599 const char *_pin; 00600 00601 /** Set to true to spit out debug traces. 00602 */ 00603 bool _debug_trace_on; 00604 00605 /** The baud rate to the modem. 00606 */ 00607 int _baud; 00608 00609 /** True if the modem is ready register to the network, 00610 * otherwise false. 00611 */ 00612 bool _modem_initialised; 00613 00614 /** True it the SIM requires a PIN, otherwise false. 00615 */ 00616 bool _sim_pin_check_enabled; 00617 00618 /** Sets the modem up for powering on 00619 * 00620 * modem_init() is equivalent to plugging in the device, e.g., attaching power and serial port. 00621 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00622 */ 00623 virtual void modem_init(); 00624 00625 /** Sets the modem in unplugged state 00626 * 00627 * modem_deinit() will be equivalent to pulling the plug off of the device, i.e., detaching power 00628 * and serial port. This puts the modem in lowest power state. 00629 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00630 */ 00631 virtual void modem_deinit(); 00632 00633 /** Powers up the modem 00634 * 00635 * modem_power_up() is equivalent to pressing the soft power button. 00636 * The driver may repeat this if the modem is not responsive to AT commands. 00637 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00638 */ 00639 virtual void modem_power_up(); 00640 00641 /** Powers down the modem 00642 * 00643 * modem_power_down() is equivalent to turning off the modem by button press. 00644 * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target. 00645 */ 00646 virtual void modem_power_down(); 00647 00648 /* Note: constructor and destructor protected so that this 00649 * class can only ever be inherited, never used directly. 00650 */ 00651 UbloxCellularBase(); 00652 ~UbloxCellularBase(); 00653 00654 /** Initialise this class. 00655 * 00656 * @param tx the UART TX data pin to which the modem is attached. 00657 * @param rx the UART RX data pin to which the modem is attached. 00658 * @param baud the UART baud rate. 00659 * @param debug_on true to switch AT interface debug on, otherwise false. 00660 * 00661 * Note: it would be more natural to do this in the constructor 00662 * however, to avoid the diamond of death, this class is only 00663 * every inherited virtually. Classes that are inherited virtually 00664 * do not get passed parameters in their constructor and hence 00665 * classInit() must be called separately by the first one to wake 00666 * the beast. 00667 */ 00668 void baseClassInit(PinName tx = MDMTXD, 00669 PinName rx = MDMRXD, 00670 int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE, 00671 bool debug_on = false); 00672 00673 /** Set the AT parser timeout. 00674 */ 00675 void at_set_timeout(int timeout); 00676 00677 /** Read up to size characters from buf 00678 * or until the character "end" is reached, overwriting 00679 * the newline with 0 and ensuring a terminator 00680 * in all cases. 00681 * 00682 * @param buf the buffer to write to. 00683 * @param size the size of the buffer. 00684 * @param end the character to stop at. 00685 * @return the number of characters read, 00686 * not including the terminator. 00687 */ 00688 int read_at_to_char(char * buf, int size, char end); 00689 00690 /** Powers up the modem. 00691 * 00692 * @return true if successful, otherwise false. 00693 */ 00694 bool power_up(); 00695 00696 /** Setup the modem baudrate, echo and flow control 00697 * 00698 * @return true if successful, otherwise false. 00699 */ 00700 bool setup_modem(); 00701 00702 /** Check if modem is accepting AT commands 00703 * 00704 * @return true if successful, otherwise false. 00705 */ 00706 bool is_modem_ready(); 00707 00708 /** Powers up the modem and set it up for application use. 00709 * 00710 * @return true if successful, otherwise false. 00711 */ 00712 bool initialize_modem(); 00713 00714 /** Power down the modem. 00715 */ 00716 void power_down(); 00717 00718 /** Lock a mutex when accessing the modem. 00719 */ 00720 void lock(void) { _mtx.lock(); } 00721 00722 /** Helper to make sure that lock unlock pair is always balanced 00723 */ 00724 #define LOCK() { lock() 00725 00726 /** Unlock the modem when done accessing it. 00727 */ 00728 void unlock(void) { _mtx.unlock(); } 00729 00730 /** Helper to make sure that lock unlock pair is always balanced 00731 */ 00732 #define UNLOCK() } unlock() 00733 00734 /** Set the device identity in _dev_info 00735 * based on the ATI string returned by 00736 * the module. 00737 * 00738 * @return true if dev is a known value, 00739 * otherwise false. 00740 */ 00741 bool set_device_identity(DeviceType *dev); 00742 00743 /** Perform any modem initialisation that is 00744 * specialised by device type. 00745 * 00746 * @return true if successful, otherwise false. 00747 */ 00748 bool device_init(DeviceType dev); 00749 00750 /** Set up the SIM. 00751 * 00752 * @return true if successful, otherwiss false. 00753 */ 00754 bool initialise_sim_card(); 00755 00756 #ifdef TARGET_UBLOX_C030_R41XM 00757 /** Converts the given uint to binary string. Fills the given str starting from [0] with the number of bits defined by bit_cnt 00758 * For example uint_to_binary_string(9, str, 10) would fill str "0000001001" 00759 * For example uint_to_binary_string(9, str, 3) would fill str "001" 00760 * 00761 * @param num uint to converts to binary string 00762 * @param str buffer for converted binary string 00763 * @param str_size size of the str buffer 00764 * @param bit_cnt defines how many bits are filled to buffer started from lsb 00765 */ 00766 void uint_to_binary_str(uint32_t num, char* str, int str_size, int bit_cnt); 00767 00768 /** Converts the given binary string to uint. 00769 * For example binary_str_to_uint("0000001001", 10) would return 9 00770 * 00771 * @param binary_string binary string from where chars are converted to uint 00772 * @param binary_string_length length of the param binary_string 00773 * @return uint represented by the binary string 00774 */ 00775 uint32_t binary_str_to_uint(const char *binary_string, int binary_string_length); 00776 00777 #endif 00778 00779 private: 00780 00781 void set_nwk_reg_status_csd(int status); 00782 void set_nwk_reg_status_psd(int status); 00783 void set_nwk_reg_status_eps(int status); 00784 void set_rat(int AcTStatus); 00785 bool get_iccid(); 00786 bool get_imsi(); 00787 bool get_imei(); 00788 bool get_meid(); 00789 bool set_sms(); 00790 void parser_abort_cb(); 00791 void CMX_ERROR_URC(); 00792 void CREG_URC(); 00793 void CGREG_URC(); 00794 void CEREG_URC(); 00795 void UMWI_URC(); 00796 #ifdef TARGET_UBLOX_C030_R412M 00797 bool set_psm_urcs(bool enable); 00798 void UUPSMR_URC(); 00799 void *_cb_param_psm_going_in; 00800 Callback<void(void*)> _func_psm_going_in; /**< Callback. */ 00801 void *_cb_param_psm_coming_out; 00802 Callback<void(void*)> _func_psm_coming_out; /**< Callback. */ 00803 void set_modem_psm_state(int state); 00804 #endif 00805 #ifdef TARGET_UBLOX_C030_R41XM 00806 bool _default_profile_is_set; 00807 typedef enum { 00808 DISABLED = 0, 00809 ENABLED = 1, 00810 UNKNOWN = 2 00811 } PSMStatus; 00812 PSMStatus _psm_status; 00813 #endif 00814 }; 00815 00816 #endif // _UBLOX_CELLULAR_BASE_ 00817
Generated on Wed Jul 13 2022 04:04:19 by
1.7.2