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.
Diff: UbloxCellularBase.h
- Revision:
- 0:5cffef3371f6
- Child:
- 1:5aaecf2572dc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/UbloxCellularBase.h Mon Jun 12 21:28:56 2017 +0000
@@ -0,0 +1,381 @@
+/* Copyright (c) 2017 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UBLOX_CELLULAR_BASE_
+#define UBLOX_CELLULAR_BASE_
+
+#include "mbed.h"
+#include "ATCmdParser.h"
+#include "FileHandle.h"
+
+/**********************************************************************
+ * CLASSES
+ **********************************************************************/
+
+/** UbloxCellularBase class.
+ *
+ * This class provides all the base support for generic u-blox modems
+ * on C030 and C027 boards: module identification, power-up, network
+ * registration, etc.
+ */
+class UbloxCellularBase {
+
+public:
+ /** Circuit Switched network registration status (CREG Usage).
+ * UBX-13001820 - AT Commands Example Application Note (Section 7.10.3).
+ */
+ typedef enum {
+ CSD_NOT_REGISTERED_NOT_SEARCHING = 0,
+ CSD_REGISTERED = 1,
+ CSD_NOT_REGISTERED_SEARCHING = 2,
+ CSD_REGISTRATION_DENIED = 3,
+ CSD_UNKNOWN_COVERAGE = 4,
+ CSD_REGISTERED_ROAMING = 5,
+ CSD_SMS_ONLY = 6,
+ CSD_SMS_ONLY_ROAMING = 7,
+ CSD_CSFB_NOT_PREFERRED = 9
+ } NetworkRegistrationStatusCsd;
+
+ /** Packet Switched network registration status (CGREG Usage).
+ * UBX-13001820 - AT Commands Example Application Note (Section 18.27.3).
+ */
+ typedef enum {
+ PSD_NOT_REGISTERED_NOT_SEARCHING = 0,
+ PSD_REGISTERED = 1,
+ PSD_NOT_REGISTERED_SEARCHING = 2,
+ PSD_REGISTRATION_DENIED = 3,
+ PSD_UNKNOWN_COVERAGE = 4,
+ PSD_REGISTERED_ROAMING = 5,
+ PSD_EMERGENCY_SERVICES_ONLY = 8
+ } NetworkRegistrationStatusPsd;
+
+ /** EPS network registration status (CEREG Usage).
+ * UBX-13001820 - AT Commands Example Application Note (Section 18.36.3).
+ */
+ typedef enum {
+ EPS_NOT_REGISTERED_NOT_SEARCHING = 0,
+ EPS_REGISTERED = 1,
+ EPS_NOT_REGISTERED_SEARCHING = 2,
+ EPS_REGISTRATION_DENIED = 3,
+ EPS_UNKNOWN_COVERAGE = 4,
+ EPS_REGISTERED_ROAMING = 5,
+ EPS_EMERGENCY_SERVICES_ONLY = 8
+ } NetworkRegistrationStatusEps;
+
+ /** Initialise the modem, ready for use.
+ *
+ * @param pin PIN for the SIM card.
+ * @return true if successful, otherwise false.
+ */
+ bool init(const char *pin = 0);
+
+ /** Perform registration with the network.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool nwk_registration();
+
+ /** True if the modem is registered for circuit
+ * switched data, otherwise false.
+ */
+ bool is_registered_csd();
+
+ /** True if the modem is registered for packet
+ * switched data, otherwise false.
+ */
+ bool is_registered_psd();
+
+ /** True if the modem is registered for enhanced
+ * packet switched data (i.e. LTE and beyond),
+ * otherwise false.
+ */
+ bool is_registered_eps();
+
+ /** Perform deregistration from the network.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool nwk_deregistration();
+
+ /** Put the modem into its lowest power state.
+ */
+ void deinit();
+
+ /** Set the PIN code for the SIM card.
+ *
+ * @param pin PIN for the SIM card.
+ */
+ void set_pin(const char *pin);
+
+ /** Enable or disable SIM pin checking.
+ *
+ * @param enableNotDisable true if SIM PIN checking is to be enabled,
+ * otherwise false.
+ * @return true if successful, otherwise false.
+ */
+ bool sim_pin_check_enable(bool enableNotDisable);
+
+ /** Change the SIM pin.
+ *
+ * @param new_pin the new PIN to use.
+ * @return true if successful, otherwise false.
+ */
+ bool change_sim_pin(const char *new_pin);
+
+protected:
+
+ #define OUTPUT_ENTER_KEY "\r"
+
+ #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE
+ #define AT_PARSER_BUFFER_SIZE MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_BUFFER_SIZE
+ #else
+ #define AT_PARSER_BUFFER_SIZE 256
+ #endif
+
+ #if MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT
+ #define AT_PARSER_TIMEOUT MBED_CONF_UBLOX_CELL_GEN_DRV_AT_PARSER_TIMEOUT
+ #else
+ #define AT_PARSER_TIMEOUT 8*1000 // Milliseconds
+ #endif
+
+ /** A string that would not normally be sent by the modem on the AT interface.
+ */
+ #define UNNATURAL_STRING "\x01"
+
+ /** Supported u-blox modem variants.
+ */
+ typedef enum {
+ DEV_TYPE_NONE = 0,
+ DEV_SARA_G35,
+ DEV_LISA_U2,
+ DEV_LISA_U2_03S,
+ DEV_SARA_U2,
+ DEV_LEON_G2,
+ DEV_TOBY_L2,
+ DEV_MPCI_L2
+ } DeviceType;
+
+ /** Network registration status.
+ * UBX-13001820 - AT Commands Example Application Note (Section 4.1.4.5).
+ */
+ typedef enum {
+ GSM = 0,
+ COMPACT_GSM = 1,
+ UTRAN = 2,
+ EDGE = 3,
+ HSDPA = 4,
+ HSUPA = 5,
+ HSDPA_HSUPA = 6,
+ LTE = 7
+ } RadioAccessNetworkType;
+
+ /** Info about the modem.
+ */
+ typedef struct {
+ DeviceType dev;
+ char iccid[20 + 1]; //!< Integrated Circuit Card ID.
+ char imsi[15 + 1]; //!< International Mobile Station Identity.
+ char imei[15 + 1]; //!< International Mobile Equipment Identity.
+ char meid[18 + 1]; //!< Mobile Equipment IDentifier.
+ volatile RadioAccessNetworkType rat; //!< Type of network (e.g. 2G, 3G, LTE).
+ volatile NetworkRegistrationStatusCsd reg_status_csd; //!< Circuit switched attach status.
+ volatile NetworkRegistrationStatusPsd reg_status_psd; //!< Packet switched attach status.
+ volatile NetworkRegistrationStatusEps reg_status_eps; //!< Evolved Packet Switched (e.g. LTE) attach status.
+ } DeviceInfo;
+
+ /* IMPORTANT: the variables below are available to
+ * classes that inherit this in order to keep things
+ * simple. However, ONLY this class should free
+ * any of the pointers, or there will be havoc.
+ */
+
+ /** Point to the instance of the AT parser in use.
+ */
+ ATCmdParser *_at;
+
+ /** The current AT parser timeout value.
+ */
+ int _at_timeout;
+
+ /** File handle used by the AT parser.
+ */
+ FileHandle *_fh;
+
+ /** The mutex resource.
+ */
+ Mutex _mtx;
+
+ /** General info about the modem as a device.
+ */
+ DeviceInfo _dev_info;
+
+ /** The SIM PIN to use.
+ */
+ const char *_pin;
+
+ /** Set to true to spit out debug traces.
+ */
+ bool _debug_trace_on;
+
+ /** True if the modem is ready register to the network,
+ * otherwise false.
+ */
+ bool _modem_initialised;
+
+ /** True it the SIM requires a PIN, otherwise false.
+ */
+ bool _sim_pin_check_enabled;
+
+ /** Sets the modem up for powering on
+ *
+ * modem_init() is equivalent to plugging in the device, e.g., attaching power and serial port.
+ * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target.
+ */
+ virtual void modem_init();
+
+ /** Sets the modem in unplugged state
+ *
+ * modem_deinit() will be equivalent to pulling the plug off of the device, i.e., detaching power
+ * and serial port. This puts the modem in lowest power state.
+ * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target.
+ */
+ virtual void modem_deinit();
+
+ /** Powers up the modem
+ *
+ * modem_power_up() is equivalent to pressing the soft power button.
+ * The driver may repeat this if the modem is not responsive to AT commands.
+ * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target.
+ */
+ virtual void modem_power_up();
+
+ /** Powers down the modem
+ *
+ * modem_power_down() is equivalent to turning off the modem by button press.
+ * Uses onboard_modem_api.h where the implementation of onboard_modem_api is provided by the target.
+ */
+ virtual void modem_power_down();
+
+ /* Note: constructor and destructor protected so that this
+ * class can only ever be inherited, never used directly.
+ */
+ UbloxCellularBase();
+ ~UbloxCellularBase();
+
+ /** Initialise this class.
+ *
+ * @param tx the UART TX data pin to which the modem is attached.
+ * @param rx the UART RX data pin to which the modem is attached.
+ * @param baud the UART baud rate.
+ * @param debug_on true to switch AT interface debug on, otherwise false.
+ *
+ * Note: it would be more natural to do this in the constructor
+ * however, to avoid the diamond of death, this class is only
+ * every inherited virtually. Classes that are inherited virtually
+ * do not get passed parameters in their constructor and hence
+ * classInit() must be called separately by the first one to wake
+ * the beast.
+ */
+ void baseClassInit(PinName tx = MDMTXD,
+ PinName rx = MDMRXD,
+ int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE,
+ bool debug_on = false);
+
+ /** Set the AT parser timeout.
+ */
+ void at_set_timeout(int timeout);
+
+ /** Read up to size characters from buf
+ * or until the character "end" is reached, overwriting
+ * the newline with 0 and ensuring a terminator
+ * in all cases.
+ *
+ * @param buf the buffer to write to.
+ * @param size the size of the buffer.
+ * @param end the character to stop at.
+ * @return the number of characters read,
+ * not including the terminator.
+ */
+ int read_at_to_char(char * buf, int size, char end);
+
+ /** Powers up the modem.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool power_up();
+
+ /** Power down the modem.
+ */
+ void power_down();
+
+ /** Lock a mutex when accessing the modem.
+ */
+ void lock(void) { _mtx.lock(); }
+
+ /** Helper to make sure that lock unlock pair is always balanced
+ */
+ #define LOCK() { lock()
+
+ /** Unlock the modem when done accessing it.
+ */
+ void unlock(void) { _mtx.unlock(); }
+
+ /** Helper to make sure that lock unlock pair is always balanced
+ */
+ #define UNLOCK() } unlock()
+
+ /** Set the device identity in _dev_info
+ * based on the ATI string returned by
+ * the module.
+ *
+ * @return true if dev is a known value,
+ * otherwise false.
+ */
+ bool set_device_identity(DeviceType *dev);
+
+ /** Perform any modem initialisation that is
+ * specialised by device type.
+ *
+ * @return true if successful, otherwise false.
+ */
+ bool device_init(DeviceType dev);
+
+ /** Set up the SIM.
+ *
+ * @return true if successful, otherwiss false.
+ */
+ bool initialise_sim_card();
+
+private:
+
+ void set_nwk_reg_status_csd(int status);
+ void set_nwk_reg_status_psd(int status);
+ void set_nwk_reg_status_eps(int status);
+ void set_rat(int AcTStatus);
+ bool get_iccid();
+ bool get_imsi();
+ bool get_imei();
+ bool get_meid();
+ bool set_sms();
+ void parser_abort_cb();
+ void CMX_ERROR_URC();
+ void CREG_URC();
+ void CGREG_URC();
+ void CEREG_URC();
+ void UMWI_URC();
+};
+
+#endif //_UBLOX_CELLULAR_DRIVER_GEN_BASE_
+