support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Committer:
walser
Date:
Thu Feb 25 13:22:34 2016 +0000
Revision:
138:dafbbf31bf76
Parent:
137:6a7a5c4f35f6
Improve connection checking of TCP socket.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mazgch 17:296d94a006b4 1 #pragma once
mazgch 17:296d94a006b4 2
mazgch 17:296d94a006b4 3 #include "mbed.h"
mazgch 21:c4d64830bf02 4 #include <stdarg.h>
mazgch 21:c4d64830bf02 5
mazgch 18:e5697801df29 6 #include "Pipe.h"
mazgch 18:e5697801df29 7 #include "SerialPipe.h"
mazgch 17:296d94a006b4 8
mazgch 130:3189949981ec 9 #ifdef TARGET_UBLOX_C027
mazgch 130:3189949981ec 10 // you can change this is you like to use a shield even on the C027
mazgch 75:ce6e12067d0c 11 #define MDM_IF(onboard,shield) onboard
mazgch 19:2b5d097ca15d 12 #else
mazgch 75:ce6e12067d0c 13 #define MDM_IF(onboard,shield) shield
mazgch 19:2b5d097ca15d 14 #endif
mazgch 18:e5697801df29 15
mazgch 74:208e3e32d263 16 //! include debug capabilty on more powerful targets with a dedicated debug port
mazgch 74:208e3e32d263 17 #if defined(TARGET_LPC1768) || defined(TARGET_LPC4088) || defined(TARGET_K64F)
mazgch 74:208e3e32d263 18 #define MDM_DEBUG
mazgch 74:208e3e32d263 19 #endif
mazgch 74:208e3e32d263 20
mazgch 38:e6cab4632d84 21 /** basic modem parser class
mazgch 38:e6cab4632d84 22 */
mazgch 18:e5697801df29 23 class MDMParser
mazgch 18:e5697801df29 24 {
mazgch 18:e5697801df29 25 public:
mazgch 31:a0bed6c1e05d 26 //! Constructor
mazgch 76:f7c3dd568dae 27 MDMParser(void);
mazgch 44:9d12223b78ff 28 //! get static instance
mazgch 44:9d12223b78ff 29 static MDMParser* getInstance() { return inst; };
mazgch 31:a0bed6c1e05d 30
mazgch 31:a0bed6c1e05d 31 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 32 // Types
mazgch 31:a0bed6c1e05d 33 // ----------------------------------------------------------------
mazgch 38:e6cab4632d84 34 //! MT Device Types
mazgch 123:66cef6353b13 35 typedef enum { DEV_UNKNOWN,
msinig 133:57b208dd96fb 36 DEV_SARA_G35, DEV_LISA_U2, DEV_LISA_U2_03S, DEV_LISA_C2,
mazgch 125:25a292afbac6 37 DEV_SARA_U2, DEV_LEON_G2, DEV_TOBY_L2, DEV_MPCI_L2 } Dev;
mazgch 38:e6cab4632d84 38 //! SIM Status
msinig 134:2fbd5723e063 39 typedef enum { SIM_UNKNOWN, SIM_MISSING, SIM_PIN, SIM_PUK, SIM_READY, WRONG_PIN } Sim;
mazgch 38:e6cab4632d84 40 //! SIM Status
mazgch 76:f7c3dd568dae 41 typedef enum { LPM_DISABLED, LPM_ENABLED, LPM_ACTIVE } Lpm;
msinig 134:2fbd5723e063 42 //! COPS status
msinig 134:2fbd5723e063 43 typedef enum { COPS_UNKOWN, COPS_AUTOMATIC_REG, COPS_MANUAL_REG, COPS_DISABLED_REG} CopsMode;
mazgch 38:e6cab4632d84 44 //! Device status
mazgch 33:fb8fb5021b09 45 typedef struct {
mazgch 34:3b3b7807c0c3 46 Dev dev; //!< Device Type
mazgch 35:9275215a3a5b 47 Lpm lpm; //!< Power Saving
mazgch 34:3b3b7807c0c3 48 Sim sim; //!< SIM Card Status
mazgch 34:3b3b7807c0c3 49 char ccid[20+1]; //!< Integrated Circuit Card ID
mazgch 34:3b3b7807c0c3 50 char imsi[15+1]; //!< International Mobile Station Identity
mazgch 34:3b3b7807c0c3 51 char imei[15+1]; //!< International Mobile Equipment Identity
mazgch 34:3b3b7807c0c3 52 char meid[18+1]; //!< Mobile Equipment IDentifier
mazgch 34:3b3b7807c0c3 53 char manu[16]; //!< Manufacturer (u-blox)
mazgch 34:3b3b7807c0c3 54 char model[16]; //!< Model Name (LISA-U200, LISA-C200 or SARA-G350)
mazgch 34:3b3b7807c0c3 55 char ver[16]; //!< Software Version
mazgch 38:e6cab4632d84 56 } DevStatus;
mazgch 38:e6cab4632d84 57 //! Registration Status
mazgch 38:e6cab4632d84 58 typedef enum { REG_UNKNOWN, REG_DENIED, REG_NONE, REG_HOME, REG_ROAMING } Reg;
mazgch 38:e6cab4632d84 59 //! Access Technology
mazgch 123:66cef6353b13 60 typedef enum { ACT_UNKNOWN, ACT_GSM, ACT_EDGE, ACT_UTRAN, ACT_CDMA, ACT_LTE } AcT;
mazgch 38:e6cab4632d84 61 //! Network Status
mazgch 33:fb8fb5021b09 62 typedef struct {
mazgch 79:291df065e345 63 Reg csd; //!< CSD Registration Status (Circuit Switched Data)
mazgch 79:291df065e345 64 Reg psd; //!< PSD Registration status (Packet Switched Data)
mazgch 123:66cef6353b13 65 Reg eps; //!< EPS Registration status
mazgch 34:3b3b7807c0c3 66 AcT act; //!< Access Technology
mazgch 121:8da935c2c08c 67 int rssi; //!< Received Signal Strength Indication (in dBm, range -113..-51)
mazgch 54:7ba8e4c218e2 68 int ber; //!< Bit Error Rate (BER), see 3GPP TS 45.008 [20] subclause 8.2.4
mazgch 34:3b3b7807c0c3 69 char opr[16+1]; //!< Operator Name
mazgch 34:3b3b7807c0c3 70 char num[32]; //!< Mobile Directory Number
mazgch 54:7ba8e4c218e2 71 unsigned short lac; //!< location area code in hexadecimal format (2 bytes in hex)
mazgch 54:7ba8e4c218e2 72 unsigned int ci; //!< Cell ID in hexadecimal format (2 to 4 bytes in hex)
msinig 134:2fbd5723e063 73 CopsMode regStatus; //!< Cops mode
mazgch 38:e6cab4632d84 74 } NetStatus;
msinig 136:8dc8f48275fc 75 typedef enum { CELL_LAST = 0, CELL_GNSS, CELL_LOCATE, CELL_HYBRID} CellSensType;
msinig 136:8dc8f48275fc 76 typedef enum { CELL_DETAILED = 1, CELL_MULTIHYP = 2} CellRespType;
msinig 136:8dc8f48275fc 77 #define CELL_MAX_HYP (16 + 1)
msinig 136:8dc8f48275fc 78 int _locRcvPos; //!< Received positions
msinig 136:8dc8f48275fc 79 int _locExpPos; //!< Expected positions
msinig 133:57b208dd96fb 80 //! Cell Locate Data
msinig 133:57b208dd96fb 81 typedef struct {
msinig 133:57b208dd96fb 82 bool validData; //!< Flag for indicating if data is valid
msinig 133:57b208dd96fb 83 struct tm time; //!< GPS Timestamp
msinig 133:57b208dd96fb 84 float longitude; //!< Estimated longitude, in degrees
msinig 136:8dc8f48275fc 85 float latitude; //!< Estimated latitude, in degrees
msinig 133:57b208dd96fb 86 int altitutude; //!< Estimated altitude, in meters^2
msinig 133:57b208dd96fb 87 int uncertainty; //!< Maximum possible error, in meters
msinig 133:57b208dd96fb 88 int speed; //!< Speed over ground m/s^2
msinig 133:57b208dd96fb 89 int direction; //!< Course over ground in degrees
msinig 133:57b208dd96fb 90 int verticalAcc; //!< Vertical accuracy, in meters^2
msinig 136:8dc8f48275fc 91 CellSensType sensor; //!< Sensor used for last calculation
msinig 133:57b208dd96fb 92 int svUsed; //!< number of satellite used
msinig 136:8dc8f48275fc 93 }CellLocData;
mazgch 38:e6cab4632d84 94 //! An IP v4 address
mazgch 38:e6cab4632d84 95 typedef uint32_t IP;
mazgch 33:fb8fb5021b09 96 #define NOIP ((MDMParser::IP)0) //!< No IP address
mazgch 31:a0bed6c1e05d 97 // ip number formating and conversion
mazgch 31:a0bed6c1e05d 98 #define IPSTR "%d.%d.%d.%d"
mazgch 31:a0bed6c1e05d 99 #define IPNUM(ip) ((ip)>>24)&0xff, \
mazgch 31:a0bed6c1e05d 100 ((ip)>>16)&0xff, \
mazgch 31:a0bed6c1e05d 101 ((ip)>> 8)&0xff, \
mazgch 31:a0bed6c1e05d 102 ((ip)>> 0)&0xff
mazgch 31:a0bed6c1e05d 103 #define IPADR(a,b,c,d) ((((IP)(a))<<24) | \
mazgch 31:a0bed6c1e05d 104 (((IP)(b))<<16) | \
mazgch 31:a0bed6c1e05d 105 (((IP)(c))<< 8) | \
mazgch 31:a0bed6c1e05d 106 (((IP)(d))<< 0))
mazgch 31:a0bed6c1e05d 107
mazgch 31:a0bed6c1e05d 108
mazgch 31:a0bed6c1e05d 109 // ----------------------------------------------------------------
mazgch 57:869bd35f44cc 110 // Device
mazgch 31:a0bed6c1e05d 111 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 112
mazgch 80:34985b4d821e 113 typedef enum { AUTH_NONE, AUTH_PAP, AUTH_CHAP, AUTH_DETECT } Auth;
mazgch 80:34985b4d821e 114
mazgch 57:869bd35f44cc 115 /** Combined Init, checkNetStatus, join suitable for simple applications
mazgch 57:869bd35f44cc 116 \param simpin a optional pin of the SIM card
mazgch 57:869bd35f44cc 117 \param apn the of the network provider e.g. "internet" or "apn.provider.com"
mazgch 57:869bd35f44cc 118 \param username is the user name text string for the authentication phase
mazgch 57:869bd35f44cc 119 \param password is the password text string for the authentication phase
mazgch 80:34985b4d821e 120 \param auth is the authentication mode (CHAP,PAP,NONE or DETECT)
mazgch 57:869bd35f44cc 121 \return true if successful, false otherwise
mazgch 57:869bd35f44cc 122 */
mazgch 94:d697fe11f3e5 123 bool connect(const char* simpin = NULL,
mazgch 94:d697fe11f3e5 124 const char* apn = NULL, const char* username = NULL,
mazgch 94:d697fe11f3e5 125 const char* password = NULL, Auth auth = AUTH_DETECT,
mazgch 75:ce6e12067d0c 126 PinName pn MDM_IF( = MDMPWRON, = D4));
mazgch 57:869bd35f44cc 127
mazgch 31:a0bed6c1e05d 128 /** register (Attach) the MT to the GPRS service.
mazgch 57:869bd35f44cc 129 \param simpin a optional pin of the SIM card
mazgch 31:a0bed6c1e05d 130 \param status an optional struture to with device information
mazgch 31:a0bed6c1e05d 131 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 132 */
mazgch 123:66cef6353b13 133 virtual bool init(const char* simpin = NULL, DevStatus* status = NULL,
mazgch 75:ce6e12067d0c 134 PinName pn MDM_IF( = MDMPWRON, = D4));
mazgch 123:66cef6353b13 135
mazgch 120:0e718a4ea25e 136 /** get the current device status
mazgch 120:0e718a4ea25e 137 \param strocture holding the device information.
mazgch 120:0e718a4ea25e 138 */
mazgch 123:66cef6353b13 139 void getDevStatus(MDMParser::DevStatus* dev) { memcpy(dev, &_dev, sizeof(DevStatus)); }
mazgch 75:ce6e12067d0c 140
mazgch 75:ce6e12067d0c 141 /** register to the network
mazgch 75:ce6e12067d0c 142 \param status an optional structure to with network information
mazgch 75:ce6e12067d0c 143 \param timeout_ms -1 blocking, else non blocking timeout in ms
mazgch 75:ce6e12067d0c 144 \return true if successful and connected to network, false otherwise
mazgch 75:ce6e12067d0c 145 */
mazgch 75:ce6e12067d0c 146 bool registerNet(NetStatus* status = NULL, int timeout_ms = 180000);
mazgch 31:a0bed6c1e05d 147
mazgch 31:a0bed6c1e05d 148 /** check if the network is available
mazgch 31:a0bed6c1e05d 149 \param status an optional structure to with network information
mazgch 31:a0bed6c1e05d 150 \return true if successful and connected to network, false otherwise
mazgch 31:a0bed6c1e05d 151 */
mazgch 31:a0bed6c1e05d 152 bool checkNetStatus(NetStatus* status = NULL);
mazgch 31:a0bed6c1e05d 153
mazgch 31:a0bed6c1e05d 154 /** Power off the MT, This function has to be called prior to
mazgch 31:a0bed6c1e05d 155 switching off the supply.
mazgch 31:a0bed6c1e05d 156 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 157 */
mazgch 31:a0bed6c1e05d 158 bool powerOff(void);
mazgch 31:a0bed6c1e05d 159
mazgch 31:a0bed6c1e05d 160 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 161 // Data Connection (GPRS)
mazgch 31:a0bed6c1e05d 162 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 163
mazgch 31:a0bed6c1e05d 164 /** register (Attach) the MT to the GPRS service.
mazgch 31:a0bed6c1e05d 165 \param apn the of the network provider e.g. "internet" or "apn.provider.com"
mazgch 57:869bd35f44cc 166 \param username is the user name text string for the authentication phase
mazgch 31:a0bed6c1e05d 167 \param password is the password text string for the authentication phase
mazgch 80:34985b4d821e 168 \param auth is the authentication mode (CHAP,PAP,NONE or DETECT)
mazgch 31:a0bed6c1e05d 169 \return the ip that is assigned
mazgch 31:a0bed6c1e05d 170 */
mazgch 79:291df065e345 171 MDMParser::IP join(const char* apn = NULL, const char* username = NULL,
mazgch 79:291df065e345 172 const char* password = NULL, Auth auth = AUTH_DETECT);
mazgch 31:a0bed6c1e05d 173
mazgch 31:a0bed6c1e05d 174 /** deregister (detach) the MT from the GPRS service.
mazgch 31:a0bed6c1e05d 175 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 176 */
mazgch 31:a0bed6c1e05d 177 bool disconnect(void);
mazgch 31:a0bed6c1e05d 178
mazgch 31:a0bed6c1e05d 179 /** Translates a domain name to an IP address
mazgch 31:a0bed6c1e05d 180 \param host the domain name to translate e.g. "u-blox.com"
mazgch 31:a0bed6c1e05d 181 \return the IP if successful, 0 otherwise
mazgch 31:a0bed6c1e05d 182 */
mazgch 31:a0bed6c1e05d 183 MDMParser::IP gethostbyname(const char* host);
mazgch 31:a0bed6c1e05d 184
mazgch 120:0e718a4ea25e 185 /** get the current assigned IP address
mazgch 120:0e718a4ea25e 186 \return the ip that is assigned
mazgch 120:0e718a4ea25e 187 */
mazgch 123:66cef6353b13 188 MDMParser::IP getIpAddress(void) { return _ip; }
mazgch 123:66cef6353b13 189
mazgch 31:a0bed6c1e05d 190 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 191 // Sockets
mazgch 31:a0bed6c1e05d 192 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 193
mazgch 31:a0bed6c1e05d 194 //! Type of IP protocol
mazgch 31:a0bed6c1e05d 195 typedef enum { IPPROTO_TCP, IPPROTO_UDP } IpProtocol;
mazgch 31:a0bed6c1e05d 196
mazgch 31:a0bed6c1e05d 197 //! Socket error return codes
mazgch 31:a0bed6c1e05d 198 #define SOCKET_ERROR -1
mazgch 31:a0bed6c1e05d 199
mazgch 63:42cb563a25bc 200 /** Create a socket for a ip protocol (and optionaly bind)
mazgch 31:a0bed6c1e05d 201 \param ipproto the protocol (UDP or TCP)
mazgch 63:42cb563a25bc 202 \param port in case of UDP, this optional port where it is bind
mazgch 31:a0bed6c1e05d 203 \return the socket handle if successful or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 204 */
mazgch 63:42cb563a25bc 205 int socketSocket(IpProtocol ipproto, int port = -1);
mazgch 31:a0bed6c1e05d 206
mazgch 31:a0bed6c1e05d 207 /** make a socket connection
mazgch 31:a0bed6c1e05d 208 \param socket the socket handle
mazgch 31:a0bed6c1e05d 209 \param host the domain name to connect e.g. "u-blox.com"
mazgch 31:a0bed6c1e05d 210 \param port the port to connect
mazgch 31:a0bed6c1e05d 211 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 212 */
mazgch 31:a0bed6c1e05d 213 bool socketConnect(int socket, const char* host, int port);
mazgch 31:a0bed6c1e05d 214
mazgch 44:9d12223b78ff 215 /** make a socket connection
mazgch 44:9d12223b78ff 216 \param socket the socket handle
mazgch 44:9d12223b78ff 217 \return true if connected, false otherwise
mazgch 44:9d12223b78ff 218 */
mazgch 44:9d12223b78ff 219 bool socketIsConnected(int socket);
mazgch 44:9d12223b78ff 220
mazgch 44:9d12223b78ff 221 /** Get the number of bytes pending for reading for this socket
mazgch 44:9d12223b78ff 222 \param socket the socket handle
mazgch 44:9d12223b78ff 223 \param timeout_ms -1 blocking, else non blocking timeout in ms
mazgch 44:9d12223b78ff 224 \return 0 if successful or SOCKET_ERROR on failure
mazgch 44:9d12223b78ff 225 */
mazgch 66:69072b3c5bca 226 bool socketSetBlocking(int socket, int timeout_ms);
mazgch 44:9d12223b78ff 227
mazgch 31:a0bed6c1e05d 228 /** Write socket data
mazgch 31:a0bed6c1e05d 229 \param socket the socket handle
mazgch 31:a0bed6c1e05d 230 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 231 \param len the size of the buffer to write
mazgch 31:a0bed6c1e05d 232 \return the size written or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 233 */
mazgch 31:a0bed6c1e05d 234 int socketSend(int socket, const char * buf, int len);
mazgch 31:a0bed6c1e05d 235
mazgch 31:a0bed6c1e05d 236 /** Write socket data to a IP
mazgch 31:a0bed6c1e05d 237 \param socket the socket handle
mazgch 31:a0bed6c1e05d 238 \param ip the ip to send to
mazgch 31:a0bed6c1e05d 239 \param port the port to send to
mazgch 31:a0bed6c1e05d 240 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 241 \param len the size of the buffer to write
mazgch 31:a0bed6c1e05d 242 \return the size written or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 243 */
mazgch 31:a0bed6c1e05d 244 int socketSendTo(int socket, IP ip, int port, const char * buf, int len);
mazgch 31:a0bed6c1e05d 245
mazgch 31:a0bed6c1e05d 246 /** Get the number of bytes pending for reading for this socket
mazgch 31:a0bed6c1e05d 247 \param socket the socket handle
mazgch 31:a0bed6c1e05d 248 \return the number of bytes pending or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 249 */
mazgch 31:a0bed6c1e05d 250 int socketReadable(int socket);
mazgch 31:a0bed6c1e05d 251
mazgch 31:a0bed6c1e05d 252 /** Read this socket
mazgch 31:a0bed6c1e05d 253 \param socket the socket handle
mazgch 31:a0bed6c1e05d 254 \param buf the buffer to read into
mazgch 31:a0bed6c1e05d 255 \param len the size of the buffer to read into
mazgch 31:a0bed6c1e05d 256 \return the number of bytes read or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 257 */
mazgch 31:a0bed6c1e05d 258 int socketRecv(int socket, char* buf, int len);
mazgch 31:a0bed6c1e05d 259
mazgch 31:a0bed6c1e05d 260 /** Read from this socket
mazgch 31:a0bed6c1e05d 261 \param socket the socket handle
mazgch 63:42cb563a25bc 262 \param ip the ip of host where the data originates from
mazgch 63:42cb563a25bc 263 \param port the port where the data originates from
mazgch 31:a0bed6c1e05d 264 \param buf the buffer to read into
mazgch 31:a0bed6c1e05d 265 \param len the size of the buffer to read into
mazgch 31:a0bed6c1e05d 266 \return the number of bytes read or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 267 */
mazgch 63:42cb563a25bc 268 int socketRecvFrom(int socket, IP* ip, int* port, char* buf, int len);
mazgch 31:a0bed6c1e05d 269
mazgch 31:a0bed6c1e05d 270 /** Close a connectied socket (that was connected with #socketConnect)
mazgch 31:a0bed6c1e05d 271 \param socket the socket handle
mazgch 31:a0bed6c1e05d 272 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 273 */
mazgch 31:a0bed6c1e05d 274 bool socketClose(int socket);
mazgch 31:a0bed6c1e05d 275
mazgch 31:a0bed6c1e05d 276 /** Free the socket (that was allocated before by #socketSocket)
mazgch 31:a0bed6c1e05d 277 \param socket the socket handle
mazgch 31:a0bed6c1e05d 278 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 279 */
mazgch 31:a0bed6c1e05d 280 bool socketFree(int socket);
fdilenarda 135:cbccf4052d45 281
fdilenarda 135:cbccf4052d45 282 // ----------------------------------------------------------------
fdilenarda 135:cbccf4052d45 283 // HTTP
fdilenarda 135:cbccf4052d45 284 // ----------------------------------------------------------------
fdilenarda 135:cbccf4052d45 285
fdilenarda 135:cbccf4052d45 286 //! Type of HTTP Operational Codes (reference to HTTP control +UHTTP)
fdilenarda 135:cbccf4052d45 287 typedef enum { HTTP_IP_ADDRESS, HTTP_SERVER_NAME, HTTP_USER_NAME, HTTP_PASSWORD, \
fdilenarda 137:6a7a5c4f35f6 288 HTTP_AUTH_TYPE, HTTP_SERVER_PORT, HTTP_SECURE } HttpOpCode;
fdilenarda 135:cbccf4052d45 289
fdilenarda 135:cbccf4052d45 290 //! Type of HTTP Commands (reference to HTTP command +UHTTPC)
fdilenarda 135:cbccf4052d45 291 typedef enum { HTTP_HEAD, HTTP_GET, HTTP_DELETE, HTTP_PUT, \
fdilenarda 135:cbccf4052d45 292 HTTP_POST_FILE, HTTP_POST_DATA } HttpCmd;
fdilenarda 135:cbccf4052d45 293
fdilenarda 135:cbccf4052d45 294 //! HTTP Profile error return codes
fdilenarda 135:cbccf4052d45 295 #define HTTP_PROF_ERROR -1
fdilenarda 135:cbccf4052d45 296
fdilenarda 135:cbccf4052d45 297 /** find HTTP profile
fdilenarda 135:cbccf4052d45 298 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 299 */
fdilenarda 135:cbccf4052d45 300 int httpFindProfile();
fdilenarda 135:cbccf4052d45 301
fdilenarda 135:cbccf4052d45 302 /** get the number of bytes pending for reading for this HTTP profile
fdilenarda 135:cbccf4052d45 303 \param profile the HTTP profile handle
fdilenarda 135:cbccf4052d45 304 \param timeout_ms -1 blocking, else non blocking timeout in ms
fdilenarda 135:cbccf4052d45 305 \return 0 if successful or SOCKET_ERROR on failure
fdilenarda 135:cbccf4052d45 306 */
fdilenarda 135:cbccf4052d45 307 bool httpSetBlocking(int profile, int timeout_ms);
fdilenarda 135:cbccf4052d45 308
fdilenarda 135:cbccf4052d45 309 /** set the HTTP profile for commands management
fdilenarda 135:cbccf4052d45 310 \param profile the HTTP profile handle
fdilenarda 135:cbccf4052d45 311 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 312 */
fdilenarda 135:cbccf4052d45 313 bool httpSetProfileForCmdMng(int profile);
fdilenarda 135:cbccf4052d45 314
fdilenarda 135:cbccf4052d45 315 /** free the HTTP profile
fdilenarda 135:cbccf4052d45 316 \param profile the HTTP profile handle
fdilenarda 135:cbccf4052d45 317 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 318 */
fdilenarda 135:cbccf4052d45 319 bool httpFreeProfile(int profile);
fdilenarda 135:cbccf4052d45 320
fdilenarda 135:cbccf4052d45 321 /** reset HTTP profile
fdilenarda 135:cbccf4052d45 322 \param httpProfile the HTTP profile to be reset
fdilenarda 135:cbccf4052d45 323 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 324 */
fdilenarda 135:cbccf4052d45 325 bool httpResetProfile(int httpProfile);
fdilenarda 135:cbccf4052d45 326
fdilenarda 135:cbccf4052d45 327 /** set HTTP parameters
fdilenarda 135:cbccf4052d45 328 \param httpProfile the HTTP profile identifier
fdilenarda 135:cbccf4052d45 329 \param httpOpCode the HTTP operation code
fdilenarda 135:cbccf4052d45 330 \param httpInPar the HTTP input parameter
fdilenarda 135:cbccf4052d45 331 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 332 */
fdilenarda 135:cbccf4052d45 333 bool httpSetPar(int httpProfile, HttpOpCode httpOpCode, const char * httpInPar);
fdilenarda 135:cbccf4052d45 334
fdilenarda 135:cbccf4052d45 335 /** HTTP commands management
fdilenarda 135:cbccf4052d45 336 \param httpProfile the HTTP profile identifier
fdilenarda 135:cbccf4052d45 337 \param httpCmdCode the HTTP command code
fdilenarda 135:cbccf4052d45 338 \param httpPath the path of HTTP server resource
fdilenarda 135:cbccf4052d45 339 \param httpOut the filename where the HTTP server response will be stored
fdilenarda 135:cbccf4052d45 340 \param httpIn the input data (filename or string) to be sent
fdilenarda 135:cbccf4052d45 341 to the HTTP server with the command request
fdilenarda 135:cbccf4052d45 342 \param httpContentType the HTTP Content-Type identifier
fdilenarda 135:cbccf4052d45 343 \param httpCustomPar the parameter for an user defined HTTP Content-Type
fdilenarda 135:cbccf4052d45 344 \param buf the buffer to read into
fdilenarda 135:cbccf4052d45 345 \param len the size of the buffer to read into
fdilenarda 135:cbccf4052d45 346 \return true if successfully, false otherwise
fdilenarda 135:cbccf4052d45 347 */
fdilenarda 135:cbccf4052d45 348 bool httpCommand(int httpProfile, HttpCmd httpCmdCode, const char* httpPath, \
fdilenarda 135:cbccf4052d45 349 const char* httpOut, const char* httpIn, int httpContentType, \
fdilenarda 135:cbccf4052d45 350 const char* httpCustomPar, char* buf, int len);
fdilenarda 135:cbccf4052d45 351
fdilenarda 135:cbccf4052d45 352 /** get HTTP commands
fdilenarda 135:cbccf4052d45 353 \param httpCmdCode the HTTP command code (reference also the enum format)
fdilenarda 135:cbccf4052d45 354 \return HTTP command in string format
fdilenarda 135:cbccf4052d45 355 */
fdilenarda 135:cbccf4052d45 356 const char* getHTTPcmd(int httpCmdCode);
fdilenarda 135:cbccf4052d45 357
mazgch 31:a0bed6c1e05d 358 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 359 // SMS Short Message Service
mazgch 31:a0bed6c1e05d 360 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 361
mazgch 31:a0bed6c1e05d 362 /** count the number of sms in the device and optionally return a
mazgch 31:a0bed6c1e05d 363 list with indexes from the storage locations in the device.
mazgch 31:a0bed6c1e05d 364 \param stat what type of messages you can use use
mazgch 31:a0bed6c1e05d 365 "REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL"
mazgch 31:a0bed6c1e05d 366 \param ix list where to save the storage positions
mazgch 31:a0bed6c1e05d 367 \param num number of elements in the list
mazgch 31:a0bed6c1e05d 368 \return the number of messages, this can be bigger than num, -1 on failure
mazgch 31:a0bed6c1e05d 369 */
mazgch 31:a0bed6c1e05d 370 int smsList(const char* stat = "ALL", int* ix = NULL, int num = 0);
mazgch 31:a0bed6c1e05d 371
mazgch 31:a0bed6c1e05d 372 /** Read a Message from a storage position
mazgch 31:a0bed6c1e05d 373 \param ix the storage position to read
mazgch 31:a0bed6c1e05d 374 \param num the originator address (~16 chars)
mazgch 31:a0bed6c1e05d 375 \param buf a buffer where to save the sm
mazgch 31:a0bed6c1e05d 376 \param len the length of the sm
mazgch 31:a0bed6c1e05d 377 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 378 */
mazgch 31:a0bed6c1e05d 379 bool smsRead(int ix, char* num, char* buf, int len);
mazgch 31:a0bed6c1e05d 380
mazgch 31:a0bed6c1e05d 381 /** Send a message to a recipient
mazgch 31:a0bed6c1e05d 382 \param ix the storage position to delete
mazgch 31:a0bed6c1e05d 383 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 384 */
mazgch 31:a0bed6c1e05d 385 bool smsDelete(int ix);
mazgch 31:a0bed6c1e05d 386
mazgch 31:a0bed6c1e05d 387 /** Send a message to a recipient
mazgch 31:a0bed6c1e05d 388 \param num the phone number of the recipient
mazgch 31:a0bed6c1e05d 389 \param buf the content of the message to sent
mazgch 31:a0bed6c1e05d 390 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 391 */
mazgch 31:a0bed6c1e05d 392 bool smsSend(const char* num, const char* buf);
mazgch 31:a0bed6c1e05d 393
mazgch 31:a0bed6c1e05d 394 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 395 // USSD Unstructured Supplementary Service Data
mazgch 31:a0bed6c1e05d 396 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 397
mazgch 31:a0bed6c1e05d 398 /** Read a Message from a storage position
mazgch 31:a0bed6c1e05d 399 \param cmd the ussd command to send e.g "*#06#"
mazgch 31:a0bed6c1e05d 400 \param buf a buffer where to save the reply
mazgch 31:a0bed6c1e05d 401 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 402 */
mazgch 31:a0bed6c1e05d 403 bool ussdCommand(const char* cmd, char* buf);
mazgch 31:a0bed6c1e05d 404
mazgch 38:e6cab4632d84 405 // ----------------------------------------------------------------
mazgch 80:34985b4d821e 406 // FILE
mazgch 80:34985b4d821e 407 // ----------------------------------------------------------------
mazgch 80:34985b4d821e 408
mazgch 80:34985b4d821e 409 /** Delete a file in the local file system
mazgch 80:34985b4d821e 410 \param filename the name of the file
mazgch 80:34985b4d821e 411 \return true if successful, false otherwise
mazgch 80:34985b4d821e 412 */
mazgch 80:34985b4d821e 413 bool delFile(const char* filename);
mazgch 80:34985b4d821e 414
mazgch 80:34985b4d821e 415 /** Write some data to a file in the local file system
mazgch 80:34985b4d821e 416 \param filename the name of the file
mazgch 80:34985b4d821e 417 \param buf the data to write
mazgch 80:34985b4d821e 418 \param len the size of the data to write
mazgch 80:34985b4d821e 419 \return the number of bytes written
mazgch 80:34985b4d821e 420 */
mazgch 80:34985b4d821e 421 int writeFile(const char* filename, const char* buf, int len);
mazgch 80:34985b4d821e 422
fdilenarda 135:cbccf4052d45 423 /** Read a file from the local file system
mazgch 80:34985b4d821e 424 \param filename the name of the file
mazgch 80:34985b4d821e 425 \param buf a buffer to hold the data
mazgch 80:34985b4d821e 426 \param len the size to read
mazgch 80:34985b4d821e 427 \return the number of bytes read
mazgch 80:34985b4d821e 428 */
mazgch 80:34985b4d821e 429 int readFile(const char* filename, char* buf, int len);
fdilenarda 135:cbccf4052d45 430
fdilenarda 135:cbccf4052d45 431 /** Read a file from the local file system
fdilenarda 135:cbccf4052d45 432 (the file size is greater than MAX_SIZE bytes)
fdilenarda 135:cbccf4052d45 433 \param filename the name of the file
fdilenarda 135:cbccf4052d45 434 \param buf a buffer to hold the data
fdilenarda 135:cbccf4052d45 435 \param len the size to read
fdilenarda 135:cbccf4052d45 436 \return the number of bytes read
fdilenarda 135:cbccf4052d45 437 */
fdilenarda 135:cbccf4052d45 438 int readFileNew(const char* filename, char* buf, int len);
fdilenarda 135:cbccf4052d45 439
fdilenarda 135:cbccf4052d45 440 /** Retrieve information about the dimension of a file from the local FFS
fdilenarda 135:cbccf4052d45 441 \param filename the name of the file
fdilenarda 135:cbccf4052d45 442 \return the file dimension in number of bytes
fdilenarda 135:cbccf4052d45 443 */
fdilenarda 135:cbccf4052d45 444 int infoFile(const char* filename);
fdilenarda 135:cbccf4052d45 445
msinig 133:57b208dd96fb 446 // ----------------------------------------------------------------
msinig 136:8dc8f48275fc 447 // CellLocate
msinig 133:57b208dd96fb 448 // ----------------------------------------------------------------
msinig 133:57b208dd96fb 449
msinig 136:8dc8f48275fc 450 /** Configures CellLocate Tcp Aiding server
msinig 133:57b208dd96fb 451 \server_1 Host name of the primary MGA server
msinig 133:57b208dd96fb 452 \server_2 Host name of the secondary MGA server
msinig 133:57b208dd96fb 453 \token Authentication Token for MGA server access
msinig 133:57b208dd96fb 454 \days The number of days into the future the Offline data for the u-blox 7
msinig 133:57b208dd96fb 455 \period The number of weeks into the future the Offline data for u-blox M8
msinig 133:57b208dd96fb 456 \resolution Resolution of offline data for u-blox M8: 1 everyday, 0 every other day
msinig 133:57b208dd96fb 457 */
msinig 136:8dc8f48275fc 458 int cellLocSrvTcp(const char* token, const char* server_1 = "cell-live1.services.u-blox.com", \
msinig 133:57b208dd96fb 459 const char* server_2 = "cell-live2.services.u-blox.com", int days = 14, int period = 4, int resolution = 1);
msinig 133:57b208dd96fb 460
msinig 133:57b208dd96fb 461 /** Configures CellLocate Udp Aiding server
msinig 133:57b208dd96fb 462 \server_1 Host name of the primary MGA server
msinig 133:57b208dd96fb 463 \port Server port
msinig 133:57b208dd96fb 464 \latency Expected network latency in seconds from 0 to 10000ms
msinig 133:57b208dd96fb 465 \mode Assist now management, mode of operation: 0 data downloaded at GNSS power up,
msinig 133:57b208dd96fb 466 1 automatically kept alive, manual download
msinig 133:57b208dd96fb 467 */
msinig 133:57b208dd96fb 468 int cellLocSrvUdp(const char* server_1 = "cell-live1.services.u-blox.com", int port = 46434, int latency = 1000, int mode = 0);
msinig 133:57b208dd96fb 469
msinig 133:57b208dd96fb 470 /** Configures CellLocate URCs in the case of +ULOC operations
msinig 133:57b208dd96fb 471 \mode Urc configuration: 0 disabled, 1 enabled
msinig 133:57b208dd96fb 472 */
msinig 136:8dc8f48275fc 473 int cellLocUnsol(int mode);
msinig 133:57b208dd96fb 474
msinig 133:57b208dd96fb 475 /** Configures CellLocate location sensor
msinig 133:57b208dd96fb 476 \scanMode Network scan mode: 0 normal, 1 deep scan
msinig 133:57b208dd96fb 477 */
msinig 136:8dc8f48275fc 478 int cellLocConfig(int scanMode);
msinig 133:57b208dd96fb 479
msinig 133:57b208dd96fb 480 /** Request CellLocate
msinig 133:57b208dd96fb 481 This function is not blocking, the result has to be retrived using cellLocGet
msinig 136:8dc8f48275fc 482 \sensor Sensor selection:
msinig 133:57b208dd96fb 483 \timeout Timeout period in seconds (1 - 999)
msinig 133:57b208dd96fb 484 \accuracy Target accuracy in meters (1 - 999999)
msinig 136:8dc8f48275fc 485 \type
msinig 136:8dc8f48275fc 486 \hypotesis Maximum desired number of responses from CellLocate® (up to 16)
msinig 133:57b208dd96fb 487 */
msinig 136:8dc8f48275fc 488 int cellLocRequest(CellSensType sensor, int timeout, int accuracy, CellRespType type = CELL_DETAILED,int hypotesis = 1);
msinig 133:57b208dd96fb 489
msinig 136:8dc8f48275fc 490 /** Get a position record
msinig 133:57b208dd96fb 491 \data pointer to a CellLocData struct where the location will be copied in
msinig 136:8dc8f48275fc 492 \index of the position to retrive
msinig 136:8dc8f48275fc 493 \return 1 if data has been retrived and copied, 0 otherwise
msinig 133:57b208dd96fb 494 */
msinig 136:8dc8f48275fc 495 int cellLocGetData(CellLocData *data, int index =0);
msinig 136:8dc8f48275fc 496
msinig 136:8dc8f48275fc 497 /** Get number of position records received
msinig 136:8dc8f48275fc 498 \return number of position received
msinig 136:8dc8f48275fc 499 */
msinig 136:8dc8f48275fc 500 int cellLocGetRes();
msinig 136:8dc8f48275fc 501 /** Get expected number of position to be received
msinig 136:8dc8f48275fc 502 \return number of expected position to be received
msinig 136:8dc8f48275fc 503 */
msinig 136:8dc8f48275fc 504 int cellLocGetExpRes();
mazgch 80:34985b4d821e 505
mazgch 80:34985b4d821e 506 // ----------------------------------------------------------------
mazgch 74:208e3e32d263 507 // DEBUG/DUMP status to standard out (printf)
mazgch 54:7ba8e4c218e2 508 // ----------------------------------------------------------------
mazgch 54:7ba8e4c218e2 509
mazgch 74:208e3e32d263 510 /*! Set the debug level
mazgch 117:74e4e0109a9e 511 \param level -1 = OFF, 0 = ERROR, 1 = INFO(default), 2 = TRACE, 3 = ATCMD,TEST
mazgch 74:208e3e32d263 512 \return true if successful, false not possible
mazgch 74:208e3e32d263 513 */
mazgch 74:208e3e32d263 514 bool setDebug(int level);
mazgch 74:208e3e32d263 515
mazgch 73:2b32e0a21df2 516 //! helper type for DPRINT
mazgch 73:2b32e0a21df2 517 typedef int (*_DPRINT)(void* param, char const * format, ...);
mazgch 73:2b32e0a21df2 518
mazgch 73:2b32e0a21df2 519 //! helper to declate templates and void versions
mazgch 73:2b32e0a21df2 520 #define _DUMP_TEMPLATE(func, type, arg) \
mazgch 73:2b32e0a21df2 521 template<class T> \
mazgch 73:2b32e0a21df2 522 inline void func(type arg, \
mazgch 73:2b32e0a21df2 523 int (*dprint)( T* param, char const * format, ...), \
mazgch 73:2b32e0a21df2 524 T* param) { func(arg, (_DPRINT)dprint, (void*)param); } \
mazgch 73:2b32e0a21df2 525 static void func(type arg, \
mazgch 73:2b32e0a21df2 526 _DPRINT dprint = (_DPRINT)fprintf, \
mazgch 73:2b32e0a21df2 527 void* param = (void*)stdout);
mazgch 74:208e3e32d263 528
mazgch 54:7ba8e4c218e2 529 /** dump the device status to stdout using printf
mazgch 54:7ba8e4c218e2 530 \param status the status to convert to textual form,
mazgch 54:7ba8e4c218e2 531 unavailable fields are ommited (not printed)
mazgch 73:2b32e0a21df2 532 \param dprint a function pointer
mazgch 73:2b32e0a21df2 533 \param param the irst argument passed to dprint
mazgch 54:7ba8e4c218e2 534 */
mazgch 73:2b32e0a21df2 535 _DUMP_TEMPLATE(dumpDevStatus, MDMParser::DevStatus*, status)
mazgch 54:7ba8e4c218e2 536
mazgch 54:7ba8e4c218e2 537 /** dump the network status to stdout using printf
mazgch 54:7ba8e4c218e2 538 \param status the status to convert to textual form,
mazgch 54:7ba8e4c218e2 539 unavailable fields are ommited (not printed)
mazgch 73:2b32e0a21df2 540 \param dprint a function pointer
mazgch 73:2b32e0a21df2 541 \param param the irst argument passed to dprint
mazgch 54:7ba8e4c218e2 542 */
mazgch 73:2b32e0a21df2 543 _DUMP_TEMPLATE(dumpNetStatus, MDMParser::NetStatus*, status)
mazgch 73:2b32e0a21df2 544
mazgch 54:7ba8e4c218e2 545 /** dump the ip address to stdout using printf
mazgch 54:7ba8e4c218e2 546 \param ip the ip to convert to textual form,
mazgch 54:7ba8e4c218e2 547 unavailable fields are ommited (not printed)
mazgch 73:2b32e0a21df2 548 \param dprint a function pointer
mazgch 73:2b32e0a21df2 549 \param param the irst argument passed to dprint
mazgch 54:7ba8e4c218e2 550 */
mazgch 73:2b32e0a21df2 551 _DUMP_TEMPLATE(dumpIp, MDMParser::IP, ip)
mazgch 73:2b32e0a21df2 552
mazgch 54:7ba8e4c218e2 553 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 554 // Parseing
mazgch 31:a0bed6c1e05d 555 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 556
mazgch 51:e7b81c31baec 557 enum {
mazgch 51:e7b81c31baec 558 // waitFinalResp Responses
mazgch 52:8071747a7cb3 559 NOT_FOUND = 0,
mazgch 52:8071747a7cb3 560 WAIT = -1, // TIMEOUT
mazgch 52:8071747a7cb3 561 RESP_OK = -2,
mazgch 52:8071747a7cb3 562 RESP_ERROR = -3,
mazgch 52:8071747a7cb3 563 RESP_PROMPT = -4,
msinig 134:2fbd5723e063 564 RESP_ERROR_CME= -5,
mazgch 31:a0bed6c1e05d 565
mazgch 51:e7b81c31baec 566 // getLine Responses
mazgch 51:e7b81c31baec 567 #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length
mazgch 51:e7b81c31baec 568 #define TYPE(x) (x & 0xFF0000) //!< extract/mask the type
mazgch 51:e7b81c31baec 569
mazgch 51:e7b81c31baec 570 TYPE_UNKNOWN = 0x000000,
mazgch 51:e7b81c31baec 571 TYPE_OK = 0x110000,
mazgch 51:e7b81c31baec 572 TYPE_ERROR = 0x120000,
msinig 134:2fbd5723e063 573 TYPE_ERROR_CME = 0x130000,
mazgch 51:e7b81c31baec 574 TYPE_RING = 0x210000,
mazgch 51:e7b81c31baec 575 TYPE_CONNECT = 0x220000,
mazgch 51:e7b81c31baec 576 TYPE_NOCARRIER = 0x230000,
mazgch 51:e7b81c31baec 577 TYPE_NODIALTONE = 0x240000,
mazgch 51:e7b81c31baec 578 TYPE_BUSY = 0x250000,
mazgch 51:e7b81c31baec 579 TYPE_NOANSWER = 0x260000,
mazgch 51:e7b81c31baec 580 TYPE_PROMPT = 0x300000,
mazgch 51:e7b81c31baec 581 TYPE_PLUS = 0x400000,
mazgch 66:69072b3c5bca 582 TYPE_TEXT = 0x500000,
mazgch 66:69072b3c5bca 583
mazgch 66:69072b3c5bca 584 // special timout constant
mazgch 66:69072b3c5bca 585 TIMEOUT_BLOCKING = -1
mazgch 51:e7b81c31baec 586 };
mazgch 31:a0bed6c1e05d 587
mazgch 31:a0bed6c1e05d 588 /** Get a line from the physical interface. This function need
mazgch 31:a0bed6c1e05d 589 to be implemented in a inherited class. Usually just calls
mazgch 31:a0bed6c1e05d 590 #_getLine on the rx buffer pipe.
mazgch 31:a0bed6c1e05d 591
mazgch 31:a0bed6c1e05d 592 \param buf the buffer to store it
mazgch 31:a0bed6c1e05d 593 \param buf size of the buffer
mazgch 31:a0bed6c1e05d 594 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 595 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 596 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 597 */
mazgch 31:a0bed6c1e05d 598 virtual int getLine(char* buf, int len) = 0;
mazgch 28:4d9509e3b1cf 599
mazgch 101:edfeb8af206e 600 /* clear the pending input data
mazgch 101:edfeb8af206e 601 */
mazgch 101:edfeb8af206e 602 virtual void purge(void) = 0;
mazgch 101:edfeb8af206e 603
mazgch 31:a0bed6c1e05d 604 /** Write data to the device
mazgch 31:a0bed6c1e05d 605 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 606 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 607 \return bytes written
mazgch 31:a0bed6c1e05d 608 */
mazgch 31:a0bed6c1e05d 609 virtual int send(const char* buf, int len);
mazgch 21:c4d64830bf02 610
mazgch 31:a0bed6c1e05d 611 /** Write formated date to the physical interface (printf style)
mazgch 31:a0bed6c1e05d 612 \param fmt the format string
mazgch 31:a0bed6c1e05d 613 \param .. variable arguments to be formated
mazgch 31:a0bed6c1e05d 614 \return bytes written
mazgch 31:a0bed6c1e05d 615 */
mazgch 21:c4d64830bf02 616 int sendFormated(const char* format, ...);
mazgch 26:07be5faf8925 617
mazgch 31:a0bed6c1e05d 618 /** callback function for #waitFinalResp with void* as argument
mazgch 31:a0bed6c1e05d 619 \param type the #getLine response
mazgch 31:a0bed6c1e05d 620 \param buf the parsed line
mazgch 31:a0bed6c1e05d 621 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 622 \param param the optional argument passed to #waitFinalResp
mazgch 31:a0bed6c1e05d 623 \return WAIT if processing should continue,
mazgch 31:a0bed6c1e05d 624 any other value aborts #waitFinalResp and this retunr value retuned
mazgch 31:a0bed6c1e05d 625 */
mazgch 26:07be5faf8925 626 typedef int (*_CALLBACKPTR)(int type, const char* buf, int len, void* param);
mazgch 31:a0bed6c1e05d 627
mazgch 31:a0bed6c1e05d 628 /** Wait for a final respons
mazgch 31:a0bed6c1e05d 629 \param cb the optional callback function
mazgch 31:a0bed6c1e05d 630 \param param the optional callback function parameter
mazgch 58:e38a2e942fbb 631 \param timeout_ms the timeout to wait (See Estimated command
mazgch 58:e38a2e942fbb 632 response time of AT manual)
mazgch 31:a0bed6c1e05d 633 */
mazgch 31:a0bed6c1e05d 634 int waitFinalResp(_CALLBACKPTR cb = NULL,
mazgch 26:07be5faf8925 635 void* param = NULL,
mazgch 58:e38a2e942fbb 636 int timeout_ms = 10000);
mazgch 31:a0bed6c1e05d 637
mazgch 31:a0bed6c1e05d 638 /** template version of #waitFinalResp when using callbacks,
mazgch 31:a0bed6c1e05d 639 This template will allow the compiler to do type cheking but
mazgch 31:a0bed6c1e05d 640 internally symply casts the arguments and call the (void*)
mazgch 31:a0bed6c1e05d 641 version of #waitFinalResp.
mazgch 31:a0bed6c1e05d 642 \sa waitFinalResp
mazgch 31:a0bed6c1e05d 643 */
mazgch 26:07be5faf8925 644 template<class T>
mazgch 73:2b32e0a21df2 645 inline int waitFinalResp(int (*cb)(int type, const char* buf, int len, T* param),
mazgch 73:2b32e0a21df2 646 T* param,
mazgch 73:2b32e0a21df2 647 int timeout_ms = 10000)
mazgch 26:07be5faf8925 648 {
mazgch 26:07be5faf8925 649 return waitFinalResp((_CALLBACKPTR)cb, (void*)param, timeout_ms);
mazgch 26:07be5faf8925 650 }
mazgch 31:a0bed6c1e05d 651
mazgch 18:e5697801df29 652 protected:
mazgch 31:a0bed6c1e05d 653 /** Write bytes to the physical interface. This function should be
mazgch 31:a0bed6c1e05d 654 implemented in a inherited class.
mazgch 31:a0bed6c1e05d 655 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 656 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 657 \return bytes written
mazgch 31:a0bed6c1e05d 658 */
mazgch 18:e5697801df29 659 virtual int _send(const void* buf, int len) = 0;
mazgch 31:a0bed6c1e05d 660
mazgch 31:a0bed6c1e05d 661 /** Helper: Parse a line from the receiving buffered pipe
mazgch 31:a0bed6c1e05d 662 \param pipe the receiving buffer pipe
mazgch 31:a0bed6c1e05d 663 \param buf the parsed line
mazgch 31:a0bed6c1e05d 664 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 665 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 666 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 667 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 668 */
mazgch 31:a0bed6c1e05d 669 static int _getLine(Pipe<char>* pipe, char* buffer, int length);
mazgch 31:a0bed6c1e05d 670
mazgch 31:a0bed6c1e05d 671 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 672 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 673 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 674 \param sta the starting string, NULL if none
mazgch 31:a0bed6c1e05d 675 \param end the terminating string, NULL if none
mazgch 31:a0bed6c1e05d 676 \return size of parsed match
mazgch 31:a0bed6c1e05d 677 */
mazgch 31:a0bed6c1e05d 678 static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end);
mazgch 31:a0bed6c1e05d 679
mazgch 31:a0bed6c1e05d 680 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 681 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 682 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 683 \param fmt the formating string (%d any number, %c any char of last %d len)
mazgch 31:a0bed6c1e05d 684 \return size of parsed match
mazgch 31:a0bed6c1e05d 685 */
mazgch 31:a0bed6c1e05d 686 static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt);
mazgch 31:a0bed6c1e05d 687
mazgch 35:9275215a3a5b 688 protected:
mazgch 95:8282dbbe1492 689 // for rtos over riding by useing Rtos<MDMxx>
mazgch 95:8282dbbe1492 690 /** override in a rtos system, you us the wait function of a Thread
mazgch 95:8282dbbe1492 691 \param ms the number of milliseconds to wait
mazgch 95:8282dbbe1492 692 */
mazgch 95:8282dbbe1492 693 virtual void wait_ms(int ms) { if (ms) ::wait_ms(ms); }
mazgch 95:8282dbbe1492 694 //! override the lock in a rtos system
mazgch 95:8282dbbe1492 695 virtual void lock(void) { }
mazgch 95:8282dbbe1492 696 //! override the unlock in a rtos system
mazgch 95:8282dbbe1492 697 virtual void unlock(void) { }
mazgch 95:8282dbbe1492 698 protected:
mazgch 128:0415646a9934 699 bool _activateProfile(const char* apn, const char* username, const char* password, Auth auth);
mazgch 131:965a7cbc1e58 700 bool _activateProfileReuseExternal(void);
mazgch 128:0415646a9934 701 bool _activateProfileByCid(int cid, const char* apn, const char* username, const char* password, Auth auth);
mazgch 31:a0bed6c1e05d 702 // parsing callbacks for different AT commands and their parameter arguments
mazgch 31:a0bed6c1e05d 703 static int _cbString(int type, const char* buf, int len, char* str);
mazgch 31:a0bed6c1e05d 704 static int _cbInt(int type, const char* buf, int len, int* val);
mazgch 31:a0bed6c1e05d 705 // device
mazgch 32:8f12ac182bbb 706 static int _cbATI(int type, const char* buf, int len, Dev* dev);
mazgch 31:a0bed6c1e05d 707 static int _cbCPIN(int type, const char* buf, int len, Sim* sim);
mazgch 31:a0bed6c1e05d 708 static int _cbCCID(int type, const char* buf, int len, char* ccid);
mazgch 31:a0bed6c1e05d 709 // network
mazgch 54:7ba8e4c218e2 710 static int _cbCSQ(int type, const char* buf, int len, NetStatus* status);
mazgch 31:a0bed6c1e05d 711 static int _cbCOPS(int type, const char* buf, int len, NetStatus* status);
mazgch 31:a0bed6c1e05d 712 static int _cbCNUM(int type, const char* buf, int len, char* num);
mazgch 81:3966a5c17037 713 static int _cbUACTIND(int type, const char* buf, int len, int* i);
mazgch 131:965a7cbc1e58 714 static int _cbCGDCONT(int type, const char* buf, int len, int* cid);
mazgch 84:a05edb010176 715 static int _cbUDOPN(int type, const char* buf, int len, char* mccmnc);
mazgch 31:a0bed6c1e05d 716 // sockets
mazgch 32:8f12ac182bbb 717 static int _cbCMIP(int type, const char* buf, int len, IP* ip);
mazgch 31:a0bed6c1e05d 718 static int _cbUPSND(int type, const char* buf, int len, int* act);
mazgch 31:a0bed6c1e05d 719 static int _cbUPSND(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 720 static int _cbUDNSRN(int type, const char* buf, int len, IP* ip);
mazgch 103:197fa7920ad8 721 static int _cbUSOCR(int type, const char* buf, int len, int* handle);
mazgch 21:c4d64830bf02 722 static int _cbUSORD(int type, const char* buf, int len, char* out);
mazgch 21:c4d64830bf02 723 typedef struct { char* buf; IP ip; int port; } USORFparam;
mazgch 21:c4d64830bf02 724 static int _cbUSORF(int type, const char* buf, int len, USORFparam* param);
mazgch 21:c4d64830bf02 725 typedef struct { char* buf; char* num; } CMGRparam;
mazgch 132:de505da3aadf 726 static int _cbCUSD(int type, const char* buf, int len, char* resp);
mazgch 31:a0bed6c1e05d 727 // sms
mazgch 31:a0bed6c1e05d 728 typedef struct { int* ix; int num; } CMGLparam;
mazgch 31:a0bed6c1e05d 729 static int _cbCMGL(int type, const char* buf, int len, CMGLparam* param);
mazgch 21:c4d64830bf02 730 static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param);
mazgch 80:34985b4d821e 731 // file
mazgch 80:34985b4d821e 732 typedef struct { const char* filename; char* buf; int sz; int len; } URDFILEparam;
mazgch 115:d8d94b73c725 733 static int _cbUDELFILE(int type, const char* buf, int len, void*);
mazgch 80:34985b4d821e 734 static int _cbURDFILE(int type, const char* buf, int len, URDFILEparam* param);
fdilenarda 135:cbccf4052d45 735 static int _cbURDBLOCK(int type, const char* buf, int len, char* out);
fdilenarda 135:cbccf4052d45 736 static int _cbULSTFILE(int type, const char* buf, int len, int* infoFile);
mazgch 38:e6cab4632d84 737 // variables
mazgch 31:a0bed6c1e05d 738 DevStatus _dev; //!< collected device information
mazgch 31:a0bed6c1e05d 739 NetStatus _net; //!< collected network information
mazgch 31:a0bed6c1e05d 740 IP _ip; //!< assigned ip address
msinig 136:8dc8f48275fc 741 CellLocData _loc[CELL_MAX_HYP]; //!< CellLocate data
mazgch 31:a0bed6c1e05d 742 // management struture for sockets
mazgch 103:197fa7920ad8 743 typedef struct { int handle; int timeout_ms; volatile bool connected; volatile int pending; } SockCtrl;
mazgch 103:197fa7920ad8 744 // LISA-C has 6 TCP and 6 UDP sockets
mazgch 103:197fa7920ad8 745 // LISA-U and SARA-G have 7 sockets
mazgch 103:197fa7920ad8 746 SockCtrl _sockets[12];
mazgch 103:197fa7920ad8 747 int _findSocket(int handle = SOCKET_ERROR/* = CREATE*/);
fdilenarda 135:cbccf4052d45 748 // management structure for HTTP profiles
fdilenarda 135:cbccf4052d45 749 // it's possible to have up to 4 different HTTP profiles (LISA-C200, LISA-U200 and SARA-G350) having:
fdilenarda 135:cbccf4052d45 750 // param handle the current HTTP profile is in handling state or not (default value is HTTP_ERROR)
fdilenarda 135:cbccf4052d45 751 // param timeout_ms the timeout for the current HTTP command
fdilenarda 135:cbccf4052d45 752 // param pending the status for the current HTTP command (in processing state or not)
fdilenarda 135:cbccf4052d45 753 // param cmd the code for the current HTTP command
fdilenarda 135:cbccf4052d45 754 // param result the result for the current HTTP command once processed
fdilenarda 135:cbccf4052d45 755 typedef struct { int handle; int timeout_ms; bool pending; int cmd; int result; } HttpProfCtrl;
fdilenarda 135:cbccf4052d45 756 HttpProfCtrl _httpProfiles[4];
fdilenarda 135:cbccf4052d45 757 int _findProfile(int handle = HTTP_PROF_ERROR/* = CREATE*/);
mazgch 44:9d12223b78ff 758 static MDMParser* inst;
mazgch 76:f7c3dd568dae 759 bool _init;
mazgch 74:208e3e32d263 760 #ifdef TARGET_UBLOX_C027
mazgch 74:208e3e32d263 761 bool _onboard;
mazgch 74:208e3e32d263 762 #endif
mazgch 74:208e3e32d263 763 #ifdef MDM_DEBUG
mazgch 74:208e3e32d263 764 int _debugLevel;
mazgch 74:208e3e32d263 765 Timer _debugTime;
mazgch 117:74e4e0109a9e 766 void _debugPrint(int level, const char* color, const char* format, ...);
mazgch 74:208e3e32d263 767 #endif
mazgch 18:e5697801df29 768 };
mazgch 18:e5697801df29 769
mazgch 18:e5697801df29 770 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 771
mazgch 38:e6cab4632d84 772 /** modem class which uses a serial port
mazgch 38:e6cab4632d84 773 as physical interface.
mazgch 38:e6cab4632d84 774 */
mazgch 18:e5697801df29 775 class MDMSerial : public SerialPipe, public MDMParser
mazgch 17:296d94a006b4 776 {
mazgch 17:296d94a006b4 777 public:
mazgch 38:e6cab4632d84 778 /** Constructor
mazgch 38:e6cab4632d84 779
mazgch 38:e6cab4632d84 780 \param tx is the serial ports transmit pin (modem to CPU)
mazgch 38:e6cab4632d84 781 \param rx is the serial ports receive pin (CPU to modem)
mazgch 38:e6cab4632d84 782 \param baudrate the baudrate of the modem use 115200
mazgch 38:e6cab4632d84 783 \param rts is the serial ports ready to send pin (CPU to modem)
mazgch 38:e6cab4632d84 784 this pin is optional
mazgch 38:e6cab4632d84 785 \param cts is the serial ports clear to send pin (modem to CPU)
mazgch 38:e6cab4632d84 786 this pin is optional, but required for power saving to be enabled
mazgch 38:e6cab4632d84 787 \param rxSize the size of the serial rx buffer
mazgch 38:e6cab4632d84 788 \param txSize the size of the serial tx buffer
mazgch 38:e6cab4632d84 789 */
mazgch 75:ce6e12067d0c 790 MDMSerial(PinName tx MDM_IF( = MDMTXD, = D1 ),
mazgch 75:ce6e12067d0c 791 PinName rx MDM_IF( = MDMRXD, = D0 ),
mazgch 75:ce6e12067d0c 792 int baudrate MDM_IF( = MDMBAUD, = 115200 ),
mazgch 35:9275215a3a5b 793 #if DEVICE_SERIAL_FC
mazgch 75:ce6e12067d0c 794 PinName rts MDM_IF( = MDMRTS, = NC /* D2 resistor R62 on shield not mounted */ ),
mazgch 75:ce6e12067d0c 795 PinName cts MDM_IF( = MDMCTS, = NC /* D3 resistor R63 on shield not mounted */ ),
mazgch 35:9275215a3a5b 796 #endif
mazgch 19:2b5d097ca15d 797 int rxSize = 256 ,
mazgch 21:c4d64830bf02 798 int txSize = 128 );
mazgch 76:f7c3dd568dae 799 //! Destructor
mazgch 93:2b5478693c20 800 virtual ~MDMSerial(void);
mazgch 123:66cef6353b13 801
mazgch 38:e6cab4632d84 802 /** Get a line from the physical interface.
mazgch 38:e6cab4632d84 803 \param buf the buffer to store it
mazgch 38:e6cab4632d84 804 \param buf size of the buffer
mazgch 38:e6cab4632d84 805 \return type and length if something was found,
mazgch 38:e6cab4632d84 806 WAIT if not enough data is available
mazgch 38:e6cab4632d84 807 NOT_FOUND if nothing was found
mazgch 38:e6cab4632d84 808 */
mazgch 18:e5697801df29 809 virtual int getLine(char* buffer, int length);
mazgch 101:edfeb8af206e 810
mazgch 101:edfeb8af206e 811 /* clear the pending input data */
mazgch 101:edfeb8af206e 812 virtual void purge(void)
mazgch 101:edfeb8af206e 813 {
mazgch 101:edfeb8af206e 814 while (readable())
mazgch 101:edfeb8af206e 815 getc();
mazgch 101:edfeb8af206e 816 }
mazgch 18:e5697801df29 817 protected:
mazgch 38:e6cab4632d84 818 /** Write bytes to the physical interface.
mazgch 38:e6cab4632d84 819 \param buf the buffer to write
mazgch 38:e6cab4632d84 820 \param buf size of the buffer to write
mazgch 38:e6cab4632d84 821 \return bytes written
mazgch 38:e6cab4632d84 822 */
mazgch 18:e5697801df29 823 virtual int _send(const void* buf, int len);
mazgch 17:296d94a006b4 824 };
mazgch 18:e5697801df29 825
mazgch 18:e5697801df29 826 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 827
mazgch 38:e6cab4632d84 828 //#define HAVE_MDMUSB
mazgch 18:e5697801df29 829 #ifdef HAVE_MDMUSB
mazgch 18:e5697801df29 830 class MDMUsb : /*public UsbSerial,*/ public MDMParser
mazgch 18:e5697801df29 831 {
mazgch 18:e5697801df29 832 public:
mazgch 76:f7c3dd568dae 833 //! Constructor
mazgch 18:e5697801df29 834 MDMUsb(void);
mazgch 76:f7c3dd568dae 835 //! Destructor
mazgch 93:2b5478693c20 836 virtual ~MDMUsb(void);
mazgch 18:e5697801df29 837 virtual int getLine(char* buffer, int length);
mazgch 101:edfeb8af206e 838 virtual void purge(void) { }
mazgch 18:e5697801df29 839 protected:
mazgch 18:e5697801df29 840 virtual int _send(const void* buf, int len);
mazgch 18:e5697801df29 841 };
mazgch 18:e5697801df29 842 #endif
mazgch 18:e5697801df29 843
mazgch 95:8282dbbe1492 844 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 845
mazgch 95:8282dbbe1492 846 #ifdef RTOS_H
mazgch 95:8282dbbe1492 847 /** Use this template to override the lock and wait functions of the
mazgch 95:8282dbbe1492 848 modem driver in a Rtos system. For example declare it the modem
mazgch 95:8282dbbe1492 849 object as MDMRtos<MDMSerial> instead of MDMSerial.
mazgch 95:8282dbbe1492 850 */
mazgch 95:8282dbbe1492 851 template <class T>
mazgch 95:8282dbbe1492 852 class MDMRtos : public T
mazgch 95:8282dbbe1492 853 {
mazgch 95:8282dbbe1492 854 protected:
mazgch 95:8282dbbe1492 855 //! we assume that the modem runs in a thread so we yield when waiting
mazgch 95:8282dbbe1492 856 virtual void wait_ms(int ms) {
mazgch 95:8282dbbe1492 857 if (ms) Thread::wait(ms);
mazgch 95:8282dbbe1492 858 else Thread::yield();
mazgch 95:8282dbbe1492 859 }
mazgch 95:8282dbbe1492 860 //! lock a mutex when accessing the modem
mazgch 95:8282dbbe1492 861 virtual void lock(void) { _mtx.lock(); }
mazgch 95:8282dbbe1492 862 //! unlock the modem when done accessing it
mazgch 95:8282dbbe1492 863 virtual void unlock(void) { _mtx.unlock(); }
mazgch 95:8282dbbe1492 864 // the mutex resource
mazgch 95:8282dbbe1492 865 Mutex _mtx;
mazgch 95:8282dbbe1492 866 };
mazgch 95:8282dbbe1492 867 #endif