ublox-cellular-base_init
Revision 31:a673792bccd5, committed 2019-08-29
- Comitter:
- wajahat.abbas@u-blox.com
- Date:
- Thu Aug 29 12:49:10 2019 +0500
- Parent:
- 30:38230504a646
- Commit message:
- Set default profile in init
Changed in this revision
UbloxCellularBase.cpp | Show annotated file Show diff for this revision Revisions of this file |
UbloxCellularBase.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 38230504a646 -r a673792bccd5 UbloxCellularBase.cpp --- a/UbloxCellularBase.cpp Tue Aug 27 18:38:29 2019 +0500 +++ b/UbloxCellularBase.cpp Thu Aug 29 12:49:10 2019 +0500 @@ -501,6 +501,8 @@ #endif #ifdef TARGET_UBLOX_C030_R41XM _edrx_configured = false; + _first_run = false; + _default_mno_params = true; #endif } @@ -514,7 +516,7 @@ // Initialise the portions of this class that are parameterised. void UbloxCellularBase::baseClassInit(PinName tx, PinName rx, - int baud, bool debug_on) + int baud, bool debug_on, bool default_mno_params) { // Only initialise ourselves if it's not already been done if (_at == NULL) { @@ -536,6 +538,7 @@ // Set up the AT parser #ifdef TARGET_UBLOX_C030_R41XM + _default_mno_params = default_mno_params; _at = new UbloxATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE, _at_timeout, _debug_trace_on); #else @@ -816,29 +819,43 @@ if (set_functionality_mode(FUNC_AIRPLANE)) { #endif if (initialise_sim_card()) { +#ifdef TARGET_UBLOX_C030_R41XM int mno_profile; + if (_first_run == false) { //this is the first call for init() + _first_run = true; + + if (get_mno_profile(&mno_profile)) { + tr_info("Current MNO profile is: %d", mno_profile); + } + + if (_default_mno_params && (mno_profile != SW_DEFAULT)) { + tr_error("Selecting default MNO profile"); + set_mno_profile(SW_DEFAULT); + reboot_modem(); //reboot and re-init the modem so new parameters can take effect + power_up(); + set_functionality_mode(FUNC_AIRPLANE); + initialise_sim_card(); + } #ifdef TARGET_UBLOX_C030_R412M - if (_psm_status == false) { //psm is not enabled by application yet so disable it at start-up - set_power_saving_mode(0, 0); + else { + int status = 0, periodic_time = 0, active_time = 0; + if (get_power_saving_mode(&status, &periodic_time, &active_time)) { + if (status) { //PSM is already enabled either by a previous run or MNO profile + tr_info("PSM is already enabled, periodic_time %d, active_time %d", periodic_time, active_time); + _psm_status = true; + if ( !(set_psm_urcs(1)) ) { //enable PSM URCs + tr_error("Modem does not support PSM URCs, disabling PSM"); + set_power_saving_mode(0, 0); + } + } + } + } +#endif } -#endif -#ifdef TARGET_UBLOX_C030_R41XM if (_at->is_idle_mode_enabled() == false) { set_idle_mode(false); //disable idle mode at start up } - if(_edrx_configured == false) { - // A special form of the command can be given as +CEDRXS=3. - // In this form, eDRX will be disabled and data for all parameters in the command +CEDRXS will be removed or, - // if available, set to the manufacturer specific default values. - set_receive_period(3,UbloxCellularBase::EDRXGSM_A_Gb_mode); - set_receive_period(3,UbloxCellularBase::EDRXEUTRAN_WB_S1_mode); - set_receive_period(3,UbloxCellularBase::EDRXEUTRAN_NB_S1_mode); - } - get_receive_period(); - - if (get_mno_profile(&mno_profile)) - tr_info("Current MNO profile is: %d", mno_profile); #endif if (set_device_identity(&_dev_info.dev) && // Set up device identity device_init(_dev_info.dev)) {// Initialise this device @@ -1557,7 +1574,7 @@ LOCK(); //+UCPSMS:1,,,"01000011","01000011" - if (_at->send("AT+UCPSMS?") && _at->recv("+UCPSMS:%d,,,\"%8c\",\"%8c\"\n", status, pt_encoded, at_encoded)) { + if (_at->send("AT+UCPSMS?") && _at->recv("+UCPSMS:%d,,,\"%8c\",\"%8c\"\nOK\n", status, pt_encoded, at_encoded)) { if (*status == true) { //PSM is enabled, decode the timer values, periodic TAU first value = (pt_encoded[7]- '0'); @@ -1669,7 +1686,7 @@ if (periodic_time == 0 && active_time == 0) { // disable PSM if (_at->send("AT+CPSMS=0") && _at->recv("OK")) { - if (_at->send("AT+UPSMR=0") && _at->recv("OK")) {//disable the URC + if (set_psm_urcs(0)) {//disable the URC //de-register the callback detach_cb_psm_going_in(); detach_cb_psm_coming_out(); @@ -1775,7 +1792,7 @@ at[8] = '\0'; if (_at->send("AT+CPSMS=1,,,\"%s\",\"%s\"", pt, at) && _at->recv("OK")) { - if (_at->send("AT+UPSMR=1") && _at->recv("OK")) {//enable the PSM URC + if (set_psm_urcs(1)) {//enable the PSM URC tr_info("PSM enabled successfully!"); _psm_status = true; return_val = true; @@ -1819,6 +1836,22 @@ UNLOCK(); } + +bool UbloxCellularBase::set_psm_urcs(bool enable) +{ + + bool success = false; + LOCK(); + + MBED_ASSERT(_at != NULL); + + if (_at->send("AT+UPSMR=%d", enable ? 1 : 0) && _at->recv("OK")) { + success = true; + } + + UNLOCK(); + return success; +} #endif // End of File
diff -r 38230504a646 -r a673792bccd5 UbloxCellularBase.h --- a/UbloxCellularBase.h Tue Aug 27 18:38:29 2019 +0500 +++ b/UbloxCellularBase.h Thu Aug 29 12:49:10 2019 +0500 @@ -272,6 +272,8 @@ * Note: MNO profile should only be set in detached state and a reboot is required for settings to take effect * Note 2: ref to UBX-17003787 B.5, setting MNO profile can change other parameters such as PSM, Band mask, URAT etc. * Application must always set a profile first and if required, change parameters afterwards. + * Note 3: ref to UBX-17003787 B.5, some profiles have locked parameters and modem will return ERROR if you try to change those. + * It is suggested to switch to a profile e.g. STANDARD_EU (100) and then change the parameters as required. * @param profile MNO profile to use * @return true if operation was successful, false if there was an error */ @@ -657,7 +659,7 @@ void baseClassInit(PinName tx = MDMTXD, PinName rx = MDMRXD, int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE, - bool debug_on = false); + bool debug_on = false, bool default_mno_params = true); /** Set the AT parser timeout. */ @@ -765,6 +767,7 @@ void CEREG_URC(); void UMWI_URC(); #ifdef TARGET_UBLOX_C030_R412M + bool set_psm_urcs(bool enable); void UUPSMR_URC(); bool _psm_status; void *_cb_param_psm_going_in; @@ -775,6 +778,8 @@ #endif #ifdef TARGET_UBLOX_C030_R41XM bool _edrx_configured; + bool _first_run; + bool _default_mno_params; #endif };