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:
mazgch
Date:
Mon May 12 07:39:29 2014 +0000
Revision:
52:8071747a7cb3
Parent:
51:e7b81c31baec
Child:
54:7ba8e4c218e2
rename some constants to avoid issues with OK define in HttpClient

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 19:2b5d097ca15d 9 #ifdef TARGET_UBLOX_C027
mazgch 19:2b5d097ca15d 10 // if we detect the C027 platform we will assign the
mazgch 19:2b5d097ca15d 11 // default pinname and baudrate in the constructor
mazgch 19:2b5d097ca15d 12 // this helper macro will be used.
mazgch 19:2b5d097ca15d 13 #define _C027DEFAULT(name) = name
mazgch 19:2b5d097ca15d 14 #else
mazgch 19:2b5d097ca15d 15 #define _C027DEFAULT(name)
mazgch 19:2b5d097ca15d 16 #endif
mazgch 18:e5697801df29 17
mazgch 38:e6cab4632d84 18 /** basic modem parser class
mazgch 38:e6cab4632d84 19 */
mazgch 18:e5697801df29 20 class MDMParser
mazgch 18:e5697801df29 21 {
mazgch 18:e5697801df29 22 public:
mazgch 31:a0bed6c1e05d 23 //! Constructor
mazgch 35:9275215a3a5b 24 MDMParser();
mazgch 44:9d12223b78ff 25 //! get static instance
mazgch 44:9d12223b78ff 26 static MDMParser* getInstance() { return inst; };
mazgch 31:a0bed6c1e05d 27
mazgch 31:a0bed6c1e05d 28 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 29 // Types
mazgch 31:a0bed6c1e05d 30 // ----------------------------------------------------------------
mazgch 38:e6cab4632d84 31 //! MT Device Types
mazgch 38:e6cab4632d84 32 typedef enum { DEV_UNKNOWN, DEV_SARA_G350, DEV_LISA_U200, DEV_LISA_C200 } Dev;
mazgch 38:e6cab4632d84 33 //! SIM Status
mazgch 38:e6cab4632d84 34 typedef enum { SIM_UNKNOWN, SIM_PIN, SIM_READY } Sim;
mazgch 38:e6cab4632d84 35 //! SIM Status
mazgch 38:e6cab4632d84 36 typedef enum { LPM_DISABLED, LPM_ENABLED, LPM_ACTIVE, LPM_SLEEP } Lpm;
mazgch 38:e6cab4632d84 37 //! Device status
mazgch 33:fb8fb5021b09 38 typedef struct {
mazgch 34:3b3b7807c0c3 39 Dev dev; //!< Device Type
mazgch 35:9275215a3a5b 40 Lpm lpm; //!< Power Saving
mazgch 34:3b3b7807c0c3 41 Sim sim; //!< SIM Card Status
mazgch 34:3b3b7807c0c3 42 char ccid[20+1]; //!< Integrated Circuit Card ID
mazgch 34:3b3b7807c0c3 43 char imsi[15+1]; //!< International Mobile Station Identity
mazgch 34:3b3b7807c0c3 44 char imei[15+1]; //!< International Mobile Equipment Identity
mazgch 34:3b3b7807c0c3 45 char meid[18+1]; //!< Mobile Equipment IDentifier
mazgch 34:3b3b7807c0c3 46 char manu[16]; //!< Manufacturer (u-blox)
mazgch 34:3b3b7807c0c3 47 char model[16]; //!< Model Name (LISA-U200, LISA-C200 or SARA-G350)
mazgch 34:3b3b7807c0c3 48 char ver[16]; //!< Software Version
mazgch 38:e6cab4632d84 49 } DevStatus;
mazgch 38:e6cab4632d84 50 //! Registration Status
mazgch 38:e6cab4632d84 51 typedef enum { REG_UNKNOWN, REG_DENIED, REG_NONE, REG_HOME, REG_ROAMING } Reg;
mazgch 38:e6cab4632d84 52 //! Access Technology
mazgch 38:e6cab4632d84 53 typedef enum { ACT_UNKNOWN, ACT_GSM, ACT_EDGE, ACT_UTRAN, ACT_CDMA } AcT;
mazgch 38:e6cab4632d84 54 //! Network Status
mazgch 33:fb8fb5021b09 55 typedef struct {
mazgch 34:3b3b7807c0c3 56 Reg reg; //!< Registration Status
mazgch 34:3b3b7807c0c3 57 AcT act; //!< Access Technology
mazgch 34:3b3b7807c0c3 58 int rssi; //!< Received Signal Strength Indication (in dBm, range -113..-53)
mazgch 34:3b3b7807c0c3 59 char opr[16+1]; //!< Operator Name
mazgch 34:3b3b7807c0c3 60 char num[32]; //!< Mobile Directory Number
mazgch 38:e6cab4632d84 61 } NetStatus;
mazgch 38:e6cab4632d84 62 //! An IP v4 address
mazgch 38:e6cab4632d84 63 typedef uint32_t IP;
mazgch 33:fb8fb5021b09 64 #define NOIP ((MDMParser::IP)0) //!< No IP address
mazgch 31:a0bed6c1e05d 65 // ip number formating and conversion
mazgch 31:a0bed6c1e05d 66 #define IPSTR "%d.%d.%d.%d"
mazgch 31:a0bed6c1e05d 67 #define IPNUM(ip) ((ip)>>24)&0xff, \
mazgch 31:a0bed6c1e05d 68 ((ip)>>16)&0xff, \
mazgch 31:a0bed6c1e05d 69 ((ip)>> 8)&0xff, \
mazgch 31:a0bed6c1e05d 70 ((ip)>> 0)&0xff
mazgch 31:a0bed6c1e05d 71 #define IPADR(a,b,c,d) ((((IP)(a))<<24) | \
mazgch 31:a0bed6c1e05d 72 (((IP)(b))<<16) | \
mazgch 31:a0bed6c1e05d 73 (((IP)(c))<< 8) | \
mazgch 31:a0bed6c1e05d 74 (((IP)(d))<< 0))
mazgch 31:a0bed6c1e05d 75
mazgch 31:a0bed6c1e05d 76
mazgch 31:a0bed6c1e05d 77 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 78 // Data Connection (GPRS)
mazgch 31:a0bed6c1e05d 79 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 80
mazgch 31:a0bed6c1e05d 81 /** register (Attach) the MT to the GPRS service.
mazgch 31:a0bed6c1e05d 82 \param pin a optional pin of the SIM card
mazgch 31:a0bed6c1e05d 83 \param status an optional struture to with device information
mazgch 31:a0bed6c1e05d 84 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 85 */
mazgch 31:a0bed6c1e05d 86 bool init(const char* pin = NULL, DevStatus* status = NULL);
mazgch 31:a0bed6c1e05d 87
mazgch 31:a0bed6c1e05d 88 /** check if the network is available
mazgch 31:a0bed6c1e05d 89 \param status an optional structure to with network information
mazgch 31:a0bed6c1e05d 90 \return true if successful and connected to network, false otherwise
mazgch 31:a0bed6c1e05d 91 */
mazgch 31:a0bed6c1e05d 92 bool checkNetStatus(NetStatus* status = NULL);
mazgch 31:a0bed6c1e05d 93
mazgch 31:a0bed6c1e05d 94 /** Power off the MT, This function has to be called prior to
mazgch 31:a0bed6c1e05d 95 switching off the supply.
mazgch 31:a0bed6c1e05d 96 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 97 */
mazgch 31:a0bed6c1e05d 98 bool powerOff(void);
mazgch 31:a0bed6c1e05d 99
mazgch 31:a0bed6c1e05d 100 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 101 // Data Connection (GPRS)
mazgch 31:a0bed6c1e05d 102 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 103
mazgch 31:a0bed6c1e05d 104 /** register (Attach) the MT to the GPRS service.
mazgch 31:a0bed6c1e05d 105 \param apn the of the network provider e.g. "internet" or "apn.provider.com"
mazgch 31:a0bed6c1e05d 106 \param user is the user name text string for the authentication phase
mazgch 31:a0bed6c1e05d 107 \param password is the password text string for the authentication phase
mazgch 31:a0bed6c1e05d 108 \return the ip that is assigned
mazgch 31:a0bed6c1e05d 109 */
mazgch 31:a0bed6c1e05d 110 MDMParser::IP join(const char* apn = NULL, const char* user = NULL, const char* password = NULL);
mazgch 31:a0bed6c1e05d 111
mazgch 31:a0bed6c1e05d 112 /** deregister (detach) the MT from the GPRS service.
mazgch 31:a0bed6c1e05d 113 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 114 */
mazgch 31:a0bed6c1e05d 115 bool disconnect(void);
mazgch 31:a0bed6c1e05d 116
mazgch 31:a0bed6c1e05d 117 /** Translates a domain name to an IP address
mazgch 31:a0bed6c1e05d 118 \param host the domain name to translate e.g. "u-blox.com"
mazgch 31:a0bed6c1e05d 119 \return the IP if successful, 0 otherwise
mazgch 31:a0bed6c1e05d 120 */
mazgch 31:a0bed6c1e05d 121 MDMParser::IP gethostbyname(const char* host);
mazgch 31:a0bed6c1e05d 122
mazgch 31:a0bed6c1e05d 123 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 124 // Sockets
mazgch 31:a0bed6c1e05d 125 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 126
mazgch 31:a0bed6c1e05d 127 //! Type of IP protocol
mazgch 31:a0bed6c1e05d 128 typedef enum { IPPROTO_TCP, IPPROTO_UDP } IpProtocol;
mazgch 31:a0bed6c1e05d 129
mazgch 31:a0bed6c1e05d 130 //! Socket error return codes
mazgch 31:a0bed6c1e05d 131 #define SOCKET_ERROR -1
mazgch 31:a0bed6c1e05d 132
mazgch 31:a0bed6c1e05d 133 /** Create a socket for a ip protocol
mazgch 31:a0bed6c1e05d 134 \param ipproto the protocol (UDP or TCP)
mazgch 31:a0bed6c1e05d 135 \return the socket handle if successful or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 136 */
mazgch 31:a0bed6c1e05d 137 int socketSocket(IpProtocol ipproto);
mazgch 31:a0bed6c1e05d 138
mazgch 31:a0bed6c1e05d 139 /** make a socket connection
mazgch 31:a0bed6c1e05d 140 \param socket the socket handle
mazgch 31:a0bed6c1e05d 141 \param host the domain name to connect e.g. "u-blox.com"
mazgch 31:a0bed6c1e05d 142 \param port the port to connect
mazgch 31:a0bed6c1e05d 143 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 144 */
mazgch 31:a0bed6c1e05d 145 bool socketConnect(int socket, const char* host, int port);
mazgch 31:a0bed6c1e05d 146
mazgch 44:9d12223b78ff 147 /** make a socket connection
mazgch 44:9d12223b78ff 148 \param socket the socket handle
mazgch 44:9d12223b78ff 149 \return true if connected, false otherwise
mazgch 44:9d12223b78ff 150 */
mazgch 44:9d12223b78ff 151 bool socketIsConnected(int socket);
mazgch 44:9d12223b78ff 152
mazgch 44:9d12223b78ff 153 /** Get the number of bytes pending for reading for this socket
mazgch 44:9d12223b78ff 154 \param socket the socket handle
mazgch 44:9d12223b78ff 155 \param timeout_ms -1 blocking, else non blocking timeout in ms
mazgch 44:9d12223b78ff 156 \return 0 if successful or SOCKET_ERROR on failure
mazgch 44:9d12223b78ff 157 */
mazgch 44:9d12223b78ff 158 bool socketSetBlocking(int socket, unsigned int timeout_ms);
mazgch 44:9d12223b78ff 159
mazgch 31:a0bed6c1e05d 160 /** Write socket data
mazgch 31:a0bed6c1e05d 161 \param socket the socket handle
mazgch 31:a0bed6c1e05d 162 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 163 \param len the size of the buffer to write
mazgch 31:a0bed6c1e05d 164 \return the size written or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 165 */
mazgch 31:a0bed6c1e05d 166 int socketSend(int socket, const char * buf, int len);
mazgch 31:a0bed6c1e05d 167
mazgch 31:a0bed6c1e05d 168 /** Write socket data to a IP
mazgch 31:a0bed6c1e05d 169 \param socket the socket handle
mazgch 31:a0bed6c1e05d 170 \param ip the ip to send to
mazgch 31:a0bed6c1e05d 171 \param port the port to send to
mazgch 31:a0bed6c1e05d 172 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 173 \param len the size of the buffer to write
mazgch 31:a0bed6c1e05d 174 \return the size written or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 175 */
mazgch 31:a0bed6c1e05d 176 int socketSendTo(int socket, IP ip, int port, const char * buf, int len);
mazgch 31:a0bed6c1e05d 177
mazgch 31:a0bed6c1e05d 178 /** Get the number of bytes pending for reading for this socket
mazgch 31:a0bed6c1e05d 179 \param socket the socket handle
mazgch 31:a0bed6c1e05d 180 \return the number of bytes pending or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 181 */
mazgch 31:a0bed6c1e05d 182 int socketReadable(int socket);
mazgch 31:a0bed6c1e05d 183
mazgch 31:a0bed6c1e05d 184 /** Read this socket
mazgch 31:a0bed6c1e05d 185 \param socket the socket handle
mazgch 31:a0bed6c1e05d 186 \param buf the buffer to read into
mazgch 31:a0bed6c1e05d 187 \param len the size of the buffer to read into
mazgch 31:a0bed6c1e05d 188 \return the number of bytes read or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 189 */
mazgch 31:a0bed6c1e05d 190 int socketRecv(int socket, char* buf, int len);
mazgch 31:a0bed6c1e05d 191
mazgch 31:a0bed6c1e05d 192 /** Read from this socket
mazgch 31:a0bed6c1e05d 193 \param socket the socket handle
mazgch 31:a0bed6c1e05d 194 \param buf the buffer to read into
mazgch 31:a0bed6c1e05d 195 \param len the size of the buffer to read into
mazgch 31:a0bed6c1e05d 196 \param ip the ip of host where the data originates from
mazgch 31:a0bed6c1e05d 197 \return the number of bytes read or SOCKET_ERROR on failure
mazgch 31:a0bed6c1e05d 198 */
mazgch 31:a0bed6c1e05d 199 int socketRecvFrom(int socket, char* buf, int len, IP* ip);
mazgch 31:a0bed6c1e05d 200
mazgch 31:a0bed6c1e05d 201 /** Close a connectied socket (that was connected with #socketConnect)
mazgch 31:a0bed6c1e05d 202 \param socket the socket handle
mazgch 31:a0bed6c1e05d 203 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 204 */
mazgch 31:a0bed6c1e05d 205 bool socketClose(int socket);
mazgch 31:a0bed6c1e05d 206
mazgch 31:a0bed6c1e05d 207 /** Free the socket (that was allocated before by #socketSocket)
mazgch 31:a0bed6c1e05d 208 \param socket the socket handle
mazgch 31:a0bed6c1e05d 209 \return true if successfully, false otherwise
mazgch 31:a0bed6c1e05d 210 */
mazgch 31:a0bed6c1e05d 211 bool socketFree(int socket);
mazgch 31:a0bed6c1e05d 212
mazgch 31:a0bed6c1e05d 213 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 214 // SMS Short Message Service
mazgch 31:a0bed6c1e05d 215 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 216
mazgch 31:a0bed6c1e05d 217 /** count the number of sms in the device and optionally return a
mazgch 31:a0bed6c1e05d 218 list with indexes from the storage locations in the device.
mazgch 31:a0bed6c1e05d 219 \param stat what type of messages you can use use
mazgch 31:a0bed6c1e05d 220 "REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL"
mazgch 31:a0bed6c1e05d 221 \param ix list where to save the storage positions
mazgch 31:a0bed6c1e05d 222 \param num number of elements in the list
mazgch 31:a0bed6c1e05d 223 \return the number of messages, this can be bigger than num, -1 on failure
mazgch 31:a0bed6c1e05d 224 */
mazgch 31:a0bed6c1e05d 225 int smsList(const char* stat = "ALL", int* ix = NULL, int num = 0);
mazgch 31:a0bed6c1e05d 226
mazgch 31:a0bed6c1e05d 227 /** Read a Message from a storage position
mazgch 31:a0bed6c1e05d 228 \param ix the storage position to read
mazgch 31:a0bed6c1e05d 229 \param num the originator address (~16 chars)
mazgch 31:a0bed6c1e05d 230 \param buf a buffer where to save the sm
mazgch 31:a0bed6c1e05d 231 \param len the length of the sm
mazgch 31:a0bed6c1e05d 232 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 233 */
mazgch 31:a0bed6c1e05d 234 bool smsRead(int ix, char* num, char* buf, int len);
mazgch 31:a0bed6c1e05d 235
mazgch 31:a0bed6c1e05d 236 /** Send a message to a recipient
mazgch 31:a0bed6c1e05d 237 \param ix the storage position to delete
mazgch 31:a0bed6c1e05d 238 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 239 */
mazgch 31:a0bed6c1e05d 240 bool smsDelete(int ix);
mazgch 31:a0bed6c1e05d 241
mazgch 31:a0bed6c1e05d 242 /** Send a message to a recipient
mazgch 31:a0bed6c1e05d 243 \param num the phone number of the recipient
mazgch 31:a0bed6c1e05d 244 \param buf the content of the message to sent
mazgch 31:a0bed6c1e05d 245 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 246 */
mazgch 31:a0bed6c1e05d 247 bool smsSend(const char* num, const char* buf);
mazgch 31:a0bed6c1e05d 248
mazgch 31:a0bed6c1e05d 249 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 250 // USSD Unstructured Supplementary Service Data
mazgch 31:a0bed6c1e05d 251 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 252
mazgch 31:a0bed6c1e05d 253 /** Read a Message from a storage position
mazgch 31:a0bed6c1e05d 254 \param cmd the ussd command to send e.g "*#06#"
mazgch 31:a0bed6c1e05d 255 \param buf a buffer where to save the reply
mazgch 31:a0bed6c1e05d 256 \return true if successful, false otherwise
mazgch 31:a0bed6c1e05d 257 */
mazgch 31:a0bed6c1e05d 258 bool ussdCommand(const char* cmd, char* buf);
mazgch 31:a0bed6c1e05d 259
mazgch 38:e6cab4632d84 260 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 261 // Parseing
mazgch 31:a0bed6c1e05d 262 // ----------------------------------------------------------------
mazgch 31:a0bed6c1e05d 263
mazgch 51:e7b81c31baec 264 enum {
mazgch 51:e7b81c31baec 265 // waitFinalResp Responses
mazgch 52:8071747a7cb3 266 NOT_FOUND = 0,
mazgch 52:8071747a7cb3 267 WAIT = -1, // TIMEOUT
mazgch 52:8071747a7cb3 268 RESP_OK = -2,
mazgch 52:8071747a7cb3 269 RESP_ERROR = -3,
mazgch 52:8071747a7cb3 270 RESP_PROMPT = -4,
mazgch 31:a0bed6c1e05d 271
mazgch 51:e7b81c31baec 272 // getLine Responses
mazgch 51:e7b81c31baec 273 #define LENGTH(x) (x & 0x00FFFF) //!< extract/mask the length
mazgch 51:e7b81c31baec 274 #define TYPE(x) (x & 0xFF0000) //!< extract/mask the type
mazgch 51:e7b81c31baec 275
mazgch 51:e7b81c31baec 276 TYPE_UNKNOWN = 0x000000,
mazgch 51:e7b81c31baec 277 TYPE_OK = 0x110000,
mazgch 51:e7b81c31baec 278 TYPE_ERROR = 0x120000,
mazgch 51:e7b81c31baec 279 TYPE_RING = 0x210000,
mazgch 51:e7b81c31baec 280 TYPE_CONNECT = 0x220000,
mazgch 51:e7b81c31baec 281 TYPE_NOCARRIER = 0x230000,
mazgch 51:e7b81c31baec 282 TYPE_NODIALTONE = 0x240000,
mazgch 51:e7b81c31baec 283 TYPE_BUSY = 0x250000,
mazgch 51:e7b81c31baec 284 TYPE_NOANSWER = 0x260000,
mazgch 51:e7b81c31baec 285 TYPE_PROMPT = 0x300000,
mazgch 51:e7b81c31baec 286 TYPE_PLUS = 0x400000,
mazgch 51:e7b81c31baec 287 TYPE_TEXT = 0x500000
mazgch 51:e7b81c31baec 288 };
mazgch 31:a0bed6c1e05d 289
mazgch 31:a0bed6c1e05d 290 /** Get a line from the physical interface. This function need
mazgch 31:a0bed6c1e05d 291 to be implemented in a inherited class. Usually just calls
mazgch 31:a0bed6c1e05d 292 #_getLine on the rx buffer pipe.
mazgch 31:a0bed6c1e05d 293
mazgch 31:a0bed6c1e05d 294 \param buf the buffer to store it
mazgch 31:a0bed6c1e05d 295 \param buf size of the buffer
mazgch 31:a0bed6c1e05d 296 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 297 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 298 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 299 */
mazgch 31:a0bed6c1e05d 300 virtual int getLine(char* buf, int len) = 0;
mazgch 28:4d9509e3b1cf 301
mazgch 31:a0bed6c1e05d 302 /** Write data to the device
mazgch 31:a0bed6c1e05d 303 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 304 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 305 \return bytes written
mazgch 31:a0bed6c1e05d 306 */
mazgch 31:a0bed6c1e05d 307 virtual int send(const char* buf, int len);
mazgch 21:c4d64830bf02 308
mazgch 31:a0bed6c1e05d 309 /** Write formated date to the physical interface (printf style)
mazgch 31:a0bed6c1e05d 310 \param fmt the format string
mazgch 31:a0bed6c1e05d 311 \param .. variable arguments to be formated
mazgch 31:a0bed6c1e05d 312 \return bytes written
mazgch 31:a0bed6c1e05d 313 */
mazgch 21:c4d64830bf02 314 int sendFormated(const char* format, ...);
mazgch 26:07be5faf8925 315
mazgch 31:a0bed6c1e05d 316 /** callback function for #waitFinalResp with void* as argument
mazgch 31:a0bed6c1e05d 317 \param type the #getLine response
mazgch 31:a0bed6c1e05d 318 \param buf the parsed line
mazgch 31:a0bed6c1e05d 319 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 320 \param param the optional argument passed to #waitFinalResp
mazgch 31:a0bed6c1e05d 321 \return WAIT if processing should continue,
mazgch 31:a0bed6c1e05d 322 any other value aborts #waitFinalResp and this retunr value retuned
mazgch 31:a0bed6c1e05d 323 */
mazgch 26:07be5faf8925 324 typedef int (*_CALLBACKPTR)(int type, const char* buf, int len, void* param);
mazgch 31:a0bed6c1e05d 325
mazgch 31:a0bed6c1e05d 326 /** Wait for a final respons
mazgch 31:a0bed6c1e05d 327 \param cb the optional callback function
mazgch 31:a0bed6c1e05d 328 \param param the optional callback function parameter
mazgch 31:a0bed6c1e05d 329 \param timeout_ms the timeout to wait
mazgch 31:a0bed6c1e05d 330 */
mazgch 31:a0bed6c1e05d 331 int waitFinalResp(_CALLBACKPTR cb = NULL,
mazgch 26:07be5faf8925 332 void* param = NULL,
mazgch 26:07be5faf8925 333 int timeout_ms = 5000);
mazgch 31:a0bed6c1e05d 334
mazgch 31:a0bed6c1e05d 335 /** template version of #waitFinalResp when using callbacks,
mazgch 31:a0bed6c1e05d 336 This template will allow the compiler to do type cheking but
mazgch 31:a0bed6c1e05d 337 internally symply casts the arguments and call the (void*)
mazgch 31:a0bed6c1e05d 338 version of #waitFinalResp.
mazgch 31:a0bed6c1e05d 339 \sa waitFinalResp
mazgch 31:a0bed6c1e05d 340 */
mazgch 26:07be5faf8925 341 template<class T>
mazgch 26:07be5faf8925 342 int waitFinalResp(int (*cb)(int type, const char* buf, int len,
mazgch 26:07be5faf8925 343 T* param),
mazgch 26:07be5faf8925 344 T* param, int timeout_ms = 5000)
mazgch 26:07be5faf8925 345 {
mazgch 26:07be5faf8925 346 return waitFinalResp((_CALLBACKPTR)cb, (void*)param, timeout_ms);
mazgch 26:07be5faf8925 347 }
mazgch 31:a0bed6c1e05d 348
mazgch 18:e5697801df29 349 protected:
mazgch 31:a0bed6c1e05d 350 /** Write bytes to the physical interface. This function should be
mazgch 31:a0bed6c1e05d 351 implemented in a inherited class.
mazgch 31:a0bed6c1e05d 352 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 353 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 354 \return bytes written
mazgch 31:a0bed6c1e05d 355 */
mazgch 18:e5697801df29 356 virtual int _send(const void* buf, int len) = 0;
mazgch 31:a0bed6c1e05d 357
mazgch 31:a0bed6c1e05d 358 /** Helper: Parse a line from the receiving buffered pipe
mazgch 31:a0bed6c1e05d 359 \param pipe the receiving buffer pipe
mazgch 31:a0bed6c1e05d 360 \param buf the parsed line
mazgch 31:a0bed6c1e05d 361 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 362 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 363 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 364 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 365 */
mazgch 31:a0bed6c1e05d 366 static int _getLine(Pipe<char>* pipe, char* buffer, int length);
mazgch 31:a0bed6c1e05d 367
mazgch 31:a0bed6c1e05d 368 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 369 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 370 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 371 \param sta the starting string, NULL if none
mazgch 31:a0bed6c1e05d 372 \param end the terminating string, NULL if none
mazgch 31:a0bed6c1e05d 373 \return size of parsed match
mazgch 31:a0bed6c1e05d 374 */
mazgch 31:a0bed6c1e05d 375 static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end);
mazgch 31:a0bed6c1e05d 376
mazgch 31:a0bed6c1e05d 377 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 378 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 379 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 380 \param fmt the formating string (%d any number, %c any char of last %d len)
mazgch 31:a0bed6c1e05d 381 \return size of parsed match
mazgch 31:a0bed6c1e05d 382 */
mazgch 31:a0bed6c1e05d 383 static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt);
mazgch 31:a0bed6c1e05d 384
mazgch 35:9275215a3a5b 385 protected:
mazgch 31:a0bed6c1e05d 386 // parsing callbacks for different AT commands and their parameter arguments
mazgch 31:a0bed6c1e05d 387 static int _cbString(int type, const char* buf, int len, char* str);
mazgch 31:a0bed6c1e05d 388 static int _cbInt(int type, const char* buf, int len, int* val);
mazgch 31:a0bed6c1e05d 389 // device
mazgch 32:8f12ac182bbb 390 static int _cbATI(int type, const char* buf, int len, Dev* dev);
mazgch 31:a0bed6c1e05d 391 static int _cbCPIN(int type, const char* buf, int len, Sim* sim);
mazgch 31:a0bed6c1e05d 392 static int _cbCCID(int type, const char* buf, int len, char* ccid);
mazgch 31:a0bed6c1e05d 393 // network
mazgch 31:a0bed6c1e05d 394 static int _cbCSQ(int type, const char* buf, int len, int* rssi);
mazgch 31:a0bed6c1e05d 395 static int _cbCOPS(int type, const char* buf, int len, NetStatus* status);
mazgch 31:a0bed6c1e05d 396 static int _cbCNUM(int type, const char* buf, int len, char* num);
mazgch 31:a0bed6c1e05d 397 static int _cbCGATT(int type, const char* buf, int len, int* state);
mazgch 31:a0bed6c1e05d 398 // sockets
mazgch 32:8f12ac182bbb 399 static int _cbCMIP(int type, const char* buf, int len, IP* ip);
mazgch 31:a0bed6c1e05d 400 static int _cbUPSND(int type, const char* buf, int len, int* act);
mazgch 31:a0bed6c1e05d 401 static int _cbUPSND(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 402 static int _cbUDNSRN(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 403 static int _cbUSOCR(int type, const char* buf, int len, int* socket);
mazgch 21:c4d64830bf02 404 static int _cbUSORD(int type, const char* buf, int len, char* out);
mazgch 21:c4d64830bf02 405 typedef struct { char* buf; IP ip; int port; } USORFparam;
mazgch 21:c4d64830bf02 406 static int _cbUSORF(int type, const char* buf, int len, USORFparam* param);
mazgch 21:c4d64830bf02 407 typedef struct { char* buf; char* num; } CMGRparam;
mazgch 21:c4d64830bf02 408 static int _cbCUSD(int type, const char* buf, int len, char* buf);
mazgch 31:a0bed6c1e05d 409 // sms
mazgch 31:a0bed6c1e05d 410 typedef struct { int* ix; int num; } CMGLparam;
mazgch 31:a0bed6c1e05d 411 static int _cbCMGL(int type, const char* buf, int len, CMGLparam* param);
mazgch 21:c4d64830bf02 412 static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param);
mazgch 38:e6cab4632d84 413 // variables
mazgch 31:a0bed6c1e05d 414 DevStatus _dev; //!< collected device information
mazgch 31:a0bed6c1e05d 415 NetStatus _net; //!< collected network information
mazgch 31:a0bed6c1e05d 416 IP _ip; //!< assigned ip address
mazgch 31:a0bed6c1e05d 417 // management struture for sockets
mazgch 21:c4d64830bf02 418 typedef enum { SOCK_FREE, SOCK_CREATED, SOCK_CONNECTED } SockState;
mazgch 44:9d12223b78ff 419 typedef struct { SockState state; int pending; unsigned int timeout_ms; } SockCtrl;
mazgch 35:9275215a3a5b 420 SockCtrl _sockets[16];
mazgch 44:9d12223b78ff 421 static MDMParser* inst;
mazgch 18:e5697801df29 422 };
mazgch 18:e5697801df29 423
mazgch 18:e5697801df29 424 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 425
mazgch 38:e6cab4632d84 426 /** modem class which uses a serial port
mazgch 38:e6cab4632d84 427 as physical interface.
mazgch 38:e6cab4632d84 428 */
mazgch 18:e5697801df29 429 class MDMSerial : public SerialPipe, public MDMParser
mazgch 17:296d94a006b4 430 {
mazgch 17:296d94a006b4 431 public:
mazgch 38:e6cab4632d84 432 /** Constructor
mazgch 38:e6cab4632d84 433
mazgch 38:e6cab4632d84 434 \param tx is the serial ports transmit pin (modem to CPU)
mazgch 38:e6cab4632d84 435 \param rx is the serial ports receive pin (CPU to modem)
mazgch 38:e6cab4632d84 436 \param baudrate the baudrate of the modem use 115200
mazgch 38:e6cab4632d84 437 \param rts is the serial ports ready to send pin (CPU to modem)
mazgch 38:e6cab4632d84 438 this pin is optional
mazgch 38:e6cab4632d84 439 \param cts is the serial ports clear to send pin (modem to CPU)
mazgch 38:e6cab4632d84 440 this pin is optional, but required for power saving to be enabled
mazgch 38:e6cab4632d84 441 \param rxSize the size of the serial rx buffer
mazgch 38:e6cab4632d84 442 \param txSize the size of the serial tx buffer
mazgch 38:e6cab4632d84 443 */
mazgch 19:2b5d097ca15d 444 MDMSerial(PinName tx _C027DEFAULT(MDMTXD),
mazgch 19:2b5d097ca15d 445 PinName rx _C027DEFAULT(MDMRXD),
mazgch 19:2b5d097ca15d 446 int baudrate _C027DEFAULT(MDMBAUD),
mazgch 35:9275215a3a5b 447 #if DEVICE_SERIAL_FC
mazgch 19:2b5d097ca15d 448 PinName rts _C027DEFAULT(MDMRTS),
mazgch 19:2b5d097ca15d 449 PinName cts _C027DEFAULT(MDMCTS),
mazgch 35:9275215a3a5b 450 #endif
mazgch 19:2b5d097ca15d 451 int rxSize = 256 ,
mazgch 21:c4d64830bf02 452 int txSize = 128 );
mazgch 38:e6cab4632d84 453 /** Get a line from the physical interface.
mazgch 38:e6cab4632d84 454 \param buf the buffer to store it
mazgch 38:e6cab4632d84 455 \param buf size of the buffer
mazgch 38:e6cab4632d84 456 \return type and length if something was found,
mazgch 38:e6cab4632d84 457 WAIT if not enough data is available
mazgch 38:e6cab4632d84 458 NOT_FOUND if nothing was found
mazgch 38:e6cab4632d84 459 */
mazgch 18:e5697801df29 460 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 461 protected:
mazgch 38:e6cab4632d84 462 /** Write bytes to the physical interface.
mazgch 38:e6cab4632d84 463 \param buf the buffer to write
mazgch 38:e6cab4632d84 464 \param buf size of the buffer to write
mazgch 38:e6cab4632d84 465 \return bytes written
mazgch 38:e6cab4632d84 466 */
mazgch 18:e5697801df29 467 virtual int _send(const void* buf, int len);
mazgch 17:296d94a006b4 468 };
mazgch 18:e5697801df29 469
mazgch 18:e5697801df29 470 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 471
mazgch 38:e6cab4632d84 472 //#define HAVE_MDMUSB
mazgch 18:e5697801df29 473 #ifdef HAVE_MDMUSB
mazgch 18:e5697801df29 474 class MDMUsb : /*public UsbSerial,*/ public MDMParser
mazgch 18:e5697801df29 475 {
mazgch 18:e5697801df29 476 public:
mazgch 18:e5697801df29 477 MDMUsb(void);
mazgch 18:e5697801df29 478 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 479 protected:
mazgch 18:e5697801df29 480 virtual int _send(const void* buf, int len);
mazgch 18:e5697801df29 481 };
mazgch 18:e5697801df29 482 #endif
mazgch 18:e5697801df29 483
mazgch 18:e5697801df29 484