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:
Fri Apr 11 16:30:54 2014 +0000
Revision:
38:e6cab4632d84
Parent:
35:9275215a3a5b
Child:
44:9d12223b78ff
more docu

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