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:
Thu Apr 17 20:41:30 2014 +0000
Revision:
44:9d12223b78ff
Parent:
38:e6cab4632d84
Child:
51:e7b81c31baec
adding mbed style (tcp)socket api

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 38:e6cab4632d84 264 // waitFinalResp Responses
mazgch 21:c4d64830bf02 265 #define NOT_FOUND 0
mazgch 21:c4d64830bf02 266 #define WAIT -1 // TIMEOUT
mazgch 21:c4d64830bf02 267 #define OK -2
mazgch 21:c4d64830bf02 268 #define ERROR -3
mazgch 21:c4d64830bf02 269 #define PROMPT -4
mazgch 31:a0bed6c1e05d 270
mazgch 21:c4d64830bf02 271 // getLine Responses
mazgch 21:c4d64830bf02 272 #define LENGTH(x) (x & 0x00FFFF)
mazgch 21:c4d64830bf02 273 #define TYPE(x) (x & 0xFF0000)
mazgch 21:c4d64830bf02 274 #define TYPE_UNKNOWN 0x000000
mazgch 21:c4d64830bf02 275 #define TYPE_OK 0x110000
mazgch 21:c4d64830bf02 276 #define TYPE_ERROR 0x120000
mazgch 21:c4d64830bf02 277 #define TYPE_RING 0x210000
mazgch 21:c4d64830bf02 278 #define TYPE_CONNECT 0x220000
mazgch 21:c4d64830bf02 279 #define TYPE_NOCARRIER 0x230000
mazgch 21:c4d64830bf02 280 #define TYPE_NODIALTONE 0x240000
mazgch 21:c4d64830bf02 281 #define TYPE_BUSY 0x250000
mazgch 21:c4d64830bf02 282 #define TYPE_NOANSWER 0x260000
mazgch 21:c4d64830bf02 283 #define TYPE_PROMPT 0x300000
mazgch 21:c4d64830bf02 284 #define TYPE_PLUS 0x400000
mazgch 35:9275215a3a5b 285 #define TYPE_TEXT 0x500000
mazgch 31:a0bed6c1e05d 286
mazgch 31:a0bed6c1e05d 287 /** Get a line from the physical interface. This function need
mazgch 31:a0bed6c1e05d 288 to be implemented in a inherited class. Usually just calls
mazgch 31:a0bed6c1e05d 289 #_getLine on the rx buffer pipe.
mazgch 31:a0bed6c1e05d 290
mazgch 31:a0bed6c1e05d 291 \param buf the buffer to store it
mazgch 31:a0bed6c1e05d 292 \param buf size of the buffer
mazgch 31:a0bed6c1e05d 293 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 294 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 295 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 296 */
mazgch 31:a0bed6c1e05d 297 virtual int getLine(char* buf, int len) = 0;
mazgch 28:4d9509e3b1cf 298
mazgch 31:a0bed6c1e05d 299 /** Write data to the device
mazgch 31:a0bed6c1e05d 300 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 301 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 302 \return bytes written
mazgch 31:a0bed6c1e05d 303 */
mazgch 31:a0bed6c1e05d 304 virtual int send(const char* buf, int len);
mazgch 21:c4d64830bf02 305
mazgch 31:a0bed6c1e05d 306 /** Write formated date to the physical interface (printf style)
mazgch 31:a0bed6c1e05d 307 \param fmt the format string
mazgch 31:a0bed6c1e05d 308 \param .. variable arguments to be formated
mazgch 31:a0bed6c1e05d 309 \return bytes written
mazgch 31:a0bed6c1e05d 310 */
mazgch 21:c4d64830bf02 311 int sendFormated(const char* format, ...);
mazgch 26:07be5faf8925 312
mazgch 31:a0bed6c1e05d 313 /** callback function for #waitFinalResp with void* as argument
mazgch 31:a0bed6c1e05d 314 \param type the #getLine response
mazgch 31:a0bed6c1e05d 315 \param buf the parsed line
mazgch 31:a0bed6c1e05d 316 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 317 \param param the optional argument passed to #waitFinalResp
mazgch 31:a0bed6c1e05d 318 \return WAIT if processing should continue,
mazgch 31:a0bed6c1e05d 319 any other value aborts #waitFinalResp and this retunr value retuned
mazgch 31:a0bed6c1e05d 320 */
mazgch 26:07be5faf8925 321 typedef int (*_CALLBACKPTR)(int type, const char* buf, int len, void* param);
mazgch 31:a0bed6c1e05d 322
mazgch 31:a0bed6c1e05d 323 /** Wait for a final respons
mazgch 31:a0bed6c1e05d 324 \param cb the optional callback function
mazgch 31:a0bed6c1e05d 325 \param param the optional callback function parameter
mazgch 31:a0bed6c1e05d 326 \param timeout_ms the timeout to wait
mazgch 31:a0bed6c1e05d 327 */
mazgch 31:a0bed6c1e05d 328 int waitFinalResp(_CALLBACKPTR cb = NULL,
mazgch 26:07be5faf8925 329 void* param = NULL,
mazgch 26:07be5faf8925 330 int timeout_ms = 5000);
mazgch 31:a0bed6c1e05d 331
mazgch 31:a0bed6c1e05d 332 /** template version of #waitFinalResp when using callbacks,
mazgch 31:a0bed6c1e05d 333 This template will allow the compiler to do type cheking but
mazgch 31:a0bed6c1e05d 334 internally symply casts the arguments and call the (void*)
mazgch 31:a0bed6c1e05d 335 version of #waitFinalResp.
mazgch 31:a0bed6c1e05d 336 \sa waitFinalResp
mazgch 31:a0bed6c1e05d 337 */
mazgch 26:07be5faf8925 338 template<class T>
mazgch 26:07be5faf8925 339 int waitFinalResp(int (*cb)(int type, const char* buf, int len,
mazgch 26:07be5faf8925 340 T* param),
mazgch 26:07be5faf8925 341 T* param, int timeout_ms = 5000)
mazgch 26:07be5faf8925 342 {
mazgch 26:07be5faf8925 343 return waitFinalResp((_CALLBACKPTR)cb, (void*)param, timeout_ms);
mazgch 26:07be5faf8925 344 }
mazgch 31:a0bed6c1e05d 345
mazgch 18:e5697801df29 346 protected:
mazgch 31:a0bed6c1e05d 347 /** Write bytes to the physical interface. This function should be
mazgch 31:a0bed6c1e05d 348 implemented in a inherited class.
mazgch 31:a0bed6c1e05d 349 \param buf the buffer to write
mazgch 31:a0bed6c1e05d 350 \param buf size of the buffer to write
mazgch 31:a0bed6c1e05d 351 \return bytes written
mazgch 31:a0bed6c1e05d 352 */
mazgch 18:e5697801df29 353 virtual int _send(const void* buf, int len) = 0;
mazgch 31:a0bed6c1e05d 354
mazgch 31:a0bed6c1e05d 355 /** Helper: Parse a line from the receiving buffered pipe
mazgch 31:a0bed6c1e05d 356 \param pipe the receiving buffer pipe
mazgch 31:a0bed6c1e05d 357 \param buf the parsed line
mazgch 31:a0bed6c1e05d 358 \param len the size of the parsed line
mazgch 31:a0bed6c1e05d 359 \return type and length if something was found,
mazgch 31:a0bed6c1e05d 360 WAIT if not enough data is available
mazgch 31:a0bed6c1e05d 361 NOT_FOUND if nothing was found
mazgch 31:a0bed6c1e05d 362 */
mazgch 31:a0bed6c1e05d 363 static int _getLine(Pipe<char>* pipe, char* buffer, int length);
mazgch 31:a0bed6c1e05d 364
mazgch 31:a0bed6c1e05d 365 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 366 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 367 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 368 \param sta the starting string, NULL if none
mazgch 31:a0bed6c1e05d 369 \param end the terminating string, NULL if none
mazgch 31:a0bed6c1e05d 370 \return size of parsed match
mazgch 31:a0bed6c1e05d 371 */
mazgch 31:a0bed6c1e05d 372 static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end);
mazgch 31:a0bed6c1e05d 373
mazgch 31:a0bed6c1e05d 374 /** Helper: Parse a match from the pipe
mazgch 31:a0bed6c1e05d 375 \param pipe the buffered pipe
mazgch 31:a0bed6c1e05d 376 \param number of bytes to parse at maximum,
mazgch 31:a0bed6c1e05d 377 \param fmt the formating string (%d any number, %c any char of last %d len)
mazgch 31:a0bed6c1e05d 378 \return size of parsed match
mazgch 31:a0bed6c1e05d 379 */
mazgch 31:a0bed6c1e05d 380 static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt);
mazgch 31:a0bed6c1e05d 381
mazgch 35:9275215a3a5b 382 protected:
mazgch 31:a0bed6c1e05d 383 // parsing callbacks for different AT commands and their parameter arguments
mazgch 31:a0bed6c1e05d 384 static int _cbString(int type, const char* buf, int len, char* str);
mazgch 31:a0bed6c1e05d 385 static int _cbInt(int type, const char* buf, int len, int* val);
mazgch 31:a0bed6c1e05d 386 // device
mazgch 32:8f12ac182bbb 387 static int _cbATI(int type, const char* buf, int len, Dev* dev);
mazgch 31:a0bed6c1e05d 388 static int _cbCPIN(int type, const char* buf, int len, Sim* sim);
mazgch 31:a0bed6c1e05d 389 static int _cbCCID(int type, const char* buf, int len, char* ccid);
mazgch 31:a0bed6c1e05d 390 // network
mazgch 31:a0bed6c1e05d 391 static int _cbCSQ(int type, const char* buf, int len, int* rssi);
mazgch 31:a0bed6c1e05d 392 static int _cbCOPS(int type, const char* buf, int len, NetStatus* status);
mazgch 31:a0bed6c1e05d 393 static int _cbCNUM(int type, const char* buf, int len, char* num);
mazgch 31:a0bed6c1e05d 394 static int _cbCGATT(int type, const char* buf, int len, int* state);
mazgch 31:a0bed6c1e05d 395 // sockets
mazgch 32:8f12ac182bbb 396 static int _cbCMIP(int type, const char* buf, int len, IP* ip);
mazgch 31:a0bed6c1e05d 397 static int _cbUPSND(int type, const char* buf, int len, int* act);
mazgch 31:a0bed6c1e05d 398 static int _cbUPSND(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 399 static int _cbUDNSRN(int type, const char* buf, int len, IP* ip);
mazgch 21:c4d64830bf02 400 static int _cbUSOCR(int type, const char* buf, int len, int* socket);
mazgch 21:c4d64830bf02 401 static int _cbUSORD(int type, const char* buf, int len, char* out);
mazgch 21:c4d64830bf02 402 typedef struct { char* buf; IP ip; int port; } USORFparam;
mazgch 21:c4d64830bf02 403 static int _cbUSORF(int type, const char* buf, int len, USORFparam* param);
mazgch 21:c4d64830bf02 404 typedef struct { char* buf; char* num; } CMGRparam;
mazgch 21:c4d64830bf02 405 static int _cbCUSD(int type, const char* buf, int len, char* buf);
mazgch 31:a0bed6c1e05d 406 // sms
mazgch 31:a0bed6c1e05d 407 typedef struct { int* ix; int num; } CMGLparam;
mazgch 31:a0bed6c1e05d 408 static int _cbCMGL(int type, const char* buf, int len, CMGLparam* param);
mazgch 21:c4d64830bf02 409 static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param);
mazgch 38:e6cab4632d84 410 // variables
mazgch 31:a0bed6c1e05d 411 DevStatus _dev; //!< collected device information
mazgch 31:a0bed6c1e05d 412 NetStatus _net; //!< collected network information
mazgch 31:a0bed6c1e05d 413 IP _ip; //!< assigned ip address
mazgch 31:a0bed6c1e05d 414 // management struture for sockets
mazgch 21:c4d64830bf02 415 typedef enum { SOCK_FREE, SOCK_CREATED, SOCK_CONNECTED } SockState;
mazgch 44:9d12223b78ff 416 typedef struct { SockState state; int pending; unsigned int timeout_ms; } SockCtrl;
mazgch 35:9275215a3a5b 417 SockCtrl _sockets[16];
mazgch 44:9d12223b78ff 418 static MDMParser* inst;
mazgch 18:e5697801df29 419 };
mazgch 18:e5697801df29 420
mazgch 18:e5697801df29 421 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 422
mazgch 38:e6cab4632d84 423 /** modem class which uses a serial port
mazgch 38:e6cab4632d84 424 as physical interface.
mazgch 38:e6cab4632d84 425 */
mazgch 18:e5697801df29 426 class MDMSerial : public SerialPipe, public MDMParser
mazgch 17:296d94a006b4 427 {
mazgch 17:296d94a006b4 428 public:
mazgch 38:e6cab4632d84 429 /** Constructor
mazgch 38:e6cab4632d84 430
mazgch 38:e6cab4632d84 431 \param tx is the serial ports transmit pin (modem to CPU)
mazgch 38:e6cab4632d84 432 \param rx is the serial ports receive pin (CPU to modem)
mazgch 38:e6cab4632d84 433 \param baudrate the baudrate of the modem use 115200
mazgch 38:e6cab4632d84 434 \param rts is the serial ports ready to send pin (CPU to modem)
mazgch 38:e6cab4632d84 435 this pin is optional
mazgch 38:e6cab4632d84 436 \param cts is the serial ports clear to send pin (modem to CPU)
mazgch 38:e6cab4632d84 437 this pin is optional, but required for power saving to be enabled
mazgch 38:e6cab4632d84 438 \param rxSize the size of the serial rx buffer
mazgch 38:e6cab4632d84 439 \param txSize the size of the serial tx buffer
mazgch 38:e6cab4632d84 440 */
mazgch 19:2b5d097ca15d 441 MDMSerial(PinName tx _C027DEFAULT(MDMTXD),
mazgch 19:2b5d097ca15d 442 PinName rx _C027DEFAULT(MDMRXD),
mazgch 19:2b5d097ca15d 443 int baudrate _C027DEFAULT(MDMBAUD),
mazgch 35:9275215a3a5b 444 #if DEVICE_SERIAL_FC
mazgch 19:2b5d097ca15d 445 PinName rts _C027DEFAULT(MDMRTS),
mazgch 19:2b5d097ca15d 446 PinName cts _C027DEFAULT(MDMCTS),
mazgch 35:9275215a3a5b 447 #endif
mazgch 19:2b5d097ca15d 448 int rxSize = 256 ,
mazgch 21:c4d64830bf02 449 int txSize = 128 );
mazgch 38:e6cab4632d84 450 /** Get a line from the physical interface.
mazgch 38:e6cab4632d84 451 \param buf the buffer to store it
mazgch 38:e6cab4632d84 452 \param buf size of the buffer
mazgch 38:e6cab4632d84 453 \return type and length if something was found,
mazgch 38:e6cab4632d84 454 WAIT if not enough data is available
mazgch 38:e6cab4632d84 455 NOT_FOUND if nothing was found
mazgch 38:e6cab4632d84 456 */
mazgch 18:e5697801df29 457 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 458 protected:
mazgch 38:e6cab4632d84 459 /** Write bytes to the physical interface.
mazgch 38:e6cab4632d84 460 \param buf the buffer to write
mazgch 38:e6cab4632d84 461 \param buf size of the buffer to write
mazgch 38:e6cab4632d84 462 \return bytes written
mazgch 38:e6cab4632d84 463 */
mazgch 18:e5697801df29 464 virtual int _send(const void* buf, int len);
mazgch 17:296d94a006b4 465 };
mazgch 18:e5697801df29 466
mazgch 18:e5697801df29 467 // -----------------------------------------------------------------------
mazgch 18:e5697801df29 468
mazgch 38:e6cab4632d84 469 //#define HAVE_MDMUSB
mazgch 18:e5697801df29 470 #ifdef HAVE_MDMUSB
mazgch 18:e5697801df29 471 class MDMUsb : /*public UsbSerial,*/ public MDMParser
mazgch 18:e5697801df29 472 {
mazgch 18:e5697801df29 473 public:
mazgch 18:e5697801df29 474 MDMUsb(void);
mazgch 18:e5697801df29 475 virtual int getLine(char* buffer, int length);
mazgch 18:e5697801df29 476 protected:
mazgch 18:e5697801df29 477 virtual int _send(const void* buf, int len);
mazgch 18:e5697801df29 478 };
mazgch 18:e5697801df29 479 #endif
mazgch 18:e5697801df29 480
mazgch 18:e5697801df29 481