Base class for the ublox-xxx-cellular-xxx classes. Cannot be used standalone, only inherited by classes that do properly useful stuff. Or, to put it another way, if you are using any of the ublox-xxx-cellular-xxx classes, you will need this class also.
Dependents: example-ublox-cellular-interface example-ublox-cellular-driver-gen HelloMQTT example-ublox-cellular-interface_r410M ... more
Revision 20:31d5e048fbfa, committed 2019-03-22
- Comitter:
- wajahat.abbas@u-blox.com
- Date:
- Fri Mar 22 13:45:51 2019 +0500
- Parent:
- 19:15f31e074d67
- Child:
- 21:98aea8f49cd8
- Commit message:
- Added support for +URAT and +UMNOPROF commands
Changed in this revision
--- a/UbloxCellularBase.cpp Mon Sep 17 10:46:14 2018 +0000
+++ b/UbloxCellularBase.cpp Fri Mar 22 13:45:51 2019 +0500
@@ -1061,5 +1061,152 @@
return rssiRet;
}
+//RAT should be set in a detached state (AT+COPS=2)
+bool UbloxCellularBase::set_modem_rat(RAT selected_rat, RAT preferred_rat, RAT second_preferred_rat)
+{
+ bool success = false;
+ char command[16] = {0x00};
+
+ //check if modem is registered with network
+ if (is_registered_csd() || is_registered_psd() || is_registered_eps()) {
+ tr_error("RAT should only be set in detached state");
+ return false;
+ }
+
+ if (preferred_rat != NOT_USED && second_preferred_rat != NOT_USED) {
+ sprintf(command, "AT+URAT=%d,%d,%d", selected_rat, preferred_rat, second_preferred_rat);
+ } else if (preferred_rat != NOT_USED) {
+ sprintf(command, "AT+URAT=%d,%d", selected_rat, preferred_rat);
+ } else if (second_preferred_rat != NOT_USED) {
+ sprintf(command, "AT+URAT=%d,%d", selected_rat, second_preferred_rat);
+ } else {
+ sprintf(command, "AT+URAT=%d", selected_rat);
+ }
+
+ LOCK();
+ if (_at->send(command) && _at->recv("OK")) {
+ success = true;
+ } else {
+ tr_error("unable to set the specified RAT");
+ success = false;
+ }
+ UNLOCK();
+
+ return success;
+}
+
+bool UbloxCellularBase::get_modem_rat(RAT *selected_rat, RAT *preferred_rat, RAT *second_preferred_rat)
+{
+ bool success = false;
+ char buf[24] = {0x00};
+
+ if (selected_rat == NULL || preferred_rat == NULL || second_preferred_rat == NULL) {
+ tr_info("invalid pointers");
+ return false;
+ }
+
+ MBED_ASSERT(_at != NULL);
+
+ *selected_rat = NOT_USED;
+ *preferred_rat = NOT_USED;
+ *second_preferred_rat = NOT_USED;
+
+ LOCK();
+
+ if (_at->send("AT+URAT?") && _at->recv("%23[^\n]\nOK\n", buf)) {
+ if (sscanf(buf, "+URAT: %d,%d,%d", (int*)selected_rat, (int*)preferred_rat, (int*)second_preferred_rat) == 3) {
+ success = true;
+ } else if (sscanf(buf, "+URAT: %d,%d", (int*)selected_rat, (int*)preferred_rat) == 2) {
+ success = true;
+ } else if (sscanf(buf, "+URAT: %d", (int*)selected_rat) == 1) {
+ success = true;
+ }
+ }
+
+ UNLOCK();
+ return success;
+}
+
+// Power down modem via AT interface.
+bool UbloxCellularBase::reboot_modem()
+{
+ bool return_val = false;
+ int at_timeout;
+ LOCK();
+
+ MBED_ASSERT(_at != NULL);
+
+ at_timeout = _at_timeout; // Has to be inside LOCK()s
+ at_set_timeout(3*60*1000); //command has 3 minutes timeout
+ tr_info("rebooting modem...");
+
+ if (_at->send("AT+CFUN=15") && _at->recv("OK")) {
+ tr_info("reboot successful");
+ return_val = true;
+ }
+
+ _dev_info.reg_status_csd = CSD_NOT_REGISTERED_NOT_SEARCHING;
+ _dev_info.reg_status_psd = PSD_NOT_REGISTERED_NOT_SEARCHING;
+ _dev_info.reg_status_eps = EPS_NOT_REGISTERED_NOT_SEARCHING;
+ _modem_initialised = false;
+ at_set_timeout(at_timeout);
+ UNLOCK();
+
+ return return_val;
+}
+
+#ifdef TARGET_UBLOX_C030_R41XM
+bool UbloxCellularBase::set_mno_profile(MNOProfile profile)
+{
+ bool return_val = false;
+
+ MNOProfile mno_profile;
+ if (get_mno_profile(&mno_profile)) {
+ tr_info("Current MNO profile is: %d", (int)mno_profile);
+ if (mno_profile != profile) {
+
+ if (is_registered_csd() || is_registered_psd() || is_registered_eps()) {
+ tr_error("MNO profile should only be set in detached state");
+ return false;
+ }
+
+ LOCK();
+ if (_at->send("AT+UMNOPROF=%d", profile) && _at->recv("OK")) {
+ return_val = true;
+ } else {
+ tr_error("unable to set specified profile");
+ }
+ UNLOCK();
+
+ } else {
+ return_val = true;
+ }
+ } else {
+ tr_error("could not read MNO profile");
+ }
+
+ return return_val;
+}
+
+bool UbloxCellularBase::get_mno_profile(MNOProfile *profile)
+{
+ bool return_val = false;
+
+ if (profile == NULL) {
+ return false;
+ }
+
+ LOCK();
+ MBED_ASSERT(_at != NULL);
+
+ if ( (_at->send("AT+UMNOPROF?") && _at->recv("+UMNOPROF: %d", (int*)profile) && _at->recv("OK")) ) {
+ return_val = true;
+ }
+
+ UNLOCK();
+ return return_val;
+}
+#endif
+
// End of File
--- a/UbloxCellularBase.h Mon Sep 17 10:46:14 2018 +0000
+++ b/UbloxCellularBase.h Fri Mar 22 13:45:51 2019 +0500
@@ -174,6 +174,89 @@
*/
int rssi();
+ /** RAT values for +URAT command
+ * R412M only supports value 7 (CatM1), 8 (NB1), and 9 (GPRS)
+ */
+ typedef enum {
+ GSM_GPRS_EGPRS = 0,
+ GSM_UMTS = 1,
+ UMTS = 2,
+ URAT_LTE = 3,
+ GSM_UMTS_LTE = 4,
+ GSM_LTE = 5,
+ UMTS_LTE = 6,
+ LTE_CATM1 = 7,
+ LTE_CATNB1 = 8,
+ GPRS_EGPRS = 9,
+ NOT_USED = 255
+ } RAT;
+
+#ifdef TARGET_UBLOX_C030_R41XM
+ /** Supported MNO profiles for SARA-R4.
+ */
+ typedef enum {
+ SW_DEFAULT = 0,
+ SIM_ICCID = 1,
+ ATT = 2,
+ VERIZON = 3,
+ TELSTRA = 4,
+ TMO = 5,
+ CT = 6,
+ VODAFONE = 19,
+ TELUS = 21,
+ DT = 31,
+ STANDARD_EU = 100
+ } MNOProfile;
+
+ #if MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE
+ #define DEFAULT_MNO_PROFILE (MNOProfile)MBED_CONF_UBLOX_CELL_DEFAULT_MNO_PROFILE
+ #else
+ #define DEFAULT_MNO_PROFILE SW_DEFAULT
+ #endif
+
+ /** Reads the current MNO profile from modem and sets it to user specified profile
+ *
+ * @return true if operation was successful, false if there was an error
+ */
+ bool set_mno_profile(MNOProfile profile = DEFAULT_MNO_PROFILE);
+
+ /** Get current MNO profile.
+ *
+ * @param profile pointer to variable that can hold the value for returned profile
+ * @return true if operation was successful, false if there was an error
+ */
+ bool get_mno_profile(MNOProfile *profile);
+#endif
+
+ /** Set Radio Access Technology on modem.
+ *
+ * Note: RAT should only be set in detached state and a reboot is required for settings to take effect
+ *
+ * @param selected_rat Radio Access Technology to use
+ * @param preferred_rat Radio Access Technology to use if selected_rat is not available
+ * @param second_preferred_rat Radio Access Technology to use if selected_rat and preferred_rat are not available
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool set_modem_rat(RAT selected_rat, RAT preferred_rat = NOT_USED, RAT second_preferred_rat = NOT_USED);
+
+ /** Get last saved values for RAT using +URAT read command. Note: The current selected RAT is indicated by DeviceInfo.rat
+ *
+ * @param selected_rat pointer to variable that can hold the value for selected_rat
+ * @param preferred_rat pointer to variable that can hold the value for preferred_rat
+ * @param second_preferred_rat pointer to variable that can hold the value for second_preferred_rat
+ *
+ * Note: NOT_USED will be returned in the variables if dual or tri modes are not enabled.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool get_modem_rat(RAT *selected_rat, RAT *preferred_rat, RAT *second_preferred_rat);
+
+ /** reboot the modem using AT+CFUN=15.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool reboot_modem();
protected:
#define OUTPUT_ENTER_KEY "\r"
--- a/mbed_lib.json Mon Sep 17 10:46:14 2018 +0000
+++ b/mbed_lib.json Fri Mar 22 13:45:51 2019 +0500
@@ -3,6 +3,7 @@
"config": {
"baud-rate": 115200,
"at-parser-buffer-size": 256,
- "at-parser-timeout": 8000
+ "at-parser-timeout": 8000,
+ "default-mno-profile": 0
}
}
u-blox