C027 updated to work with latest mBed libraries
Dependents: Cellular_HelloMQTT UBLOXModemDriver UBLOXMQTTDriver
Fork of C027_Support by
MDM.h@25:4045d02e44f1, 2014-04-08 (annotated)
- Committer:
- mazgch
- Date:
- Tue Apr 08 11:59:28 2014 +0000
- Revision:
- 25:4045d02e44f1
- Parent:
- 24:0e287a85ac9e
- Child:
- 26:07be5faf8925
added possibility to get network status struct
Who changed what in which revision?
User | Revision | Line number | New 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 | 18:e5697801df29 | 18 | class MDMParser |
mazgch | 18:e5697801df29 | 19 | { |
mazgch | 18:e5697801df29 | 20 | public: |
mazgch | 21:c4d64830bf02 | 21 | // waitFinalResp Responses |
mazgch | 21:c4d64830bf02 | 22 | #define NOT_FOUND 0 |
mazgch | 21:c4d64830bf02 | 23 | #define WAIT -1 // TIMEOUT |
mazgch | 21:c4d64830bf02 | 24 | #define OK -2 |
mazgch | 21:c4d64830bf02 | 25 | #define ERROR -3 |
mazgch | 21:c4d64830bf02 | 26 | #define PROMPT -4 |
mazgch | 21:c4d64830bf02 | 27 | // getLine Responses |
mazgch | 21:c4d64830bf02 | 28 | #define LENGTH(x) (x & 0x00FFFF) |
mazgch | 21:c4d64830bf02 | 29 | #define TYPE(x) (x & 0xFF0000) |
mazgch | 21:c4d64830bf02 | 30 | #define TYPE_UNKNOWN 0x000000 |
mazgch | 21:c4d64830bf02 | 31 | #define TYPE_OK 0x110000 |
mazgch | 21:c4d64830bf02 | 32 | #define TYPE_ERROR 0x120000 |
mazgch | 21:c4d64830bf02 | 33 | #define TYPE_RING 0x210000 |
mazgch | 21:c4d64830bf02 | 34 | #define TYPE_CONNECT 0x220000 |
mazgch | 21:c4d64830bf02 | 35 | #define TYPE_NOCARRIER 0x230000 |
mazgch | 21:c4d64830bf02 | 36 | #define TYPE_NODIALTONE 0x240000 |
mazgch | 21:c4d64830bf02 | 37 | #define TYPE_BUSY 0x250000 |
mazgch | 21:c4d64830bf02 | 38 | #define TYPE_NOANSWER 0x260000 |
mazgch | 21:c4d64830bf02 | 39 | #define TYPE_PROMPT 0x300000 |
mazgch | 21:c4d64830bf02 | 40 | #define TYPE_PLUS 0x400000 |
mazgch | 21:c4d64830bf02 | 41 | // Socket Return Codes |
mazgch | 21:c4d64830bf02 | 42 | #define SOCKET_ERROR -1 |
mazgch | 21:c4d64830bf02 | 43 | #define SOCKET_OK 0 |
mazgch | 22:29322c22577e | 44 | typedef uint32_t IP; |
mazgch | 25:4045d02e44f1 | 45 | typedef enum { NET_UNKNOWN, NET_DENIED, NET_NONE, NET_HOME, NET_ROAMING } Net; |
mazgch | 25:4045d02e44f1 | 46 | typedef enum { ACT_UNKNOWN, ACT_GSM, ACT_EDGE, ACT_UTRAN, ACT_CDMA } AcT; |
mazgch | 25:4045d02e44f1 | 47 | typedef struct { const char* num; const char* opr; int rssi; Net net; AcT act; } Status; |
mazgch | 21:c4d64830bf02 | 48 | |
mazgch | 21:c4d64830bf02 | 49 | MDMParser(void); |
mazgch | 18:e5697801df29 | 50 | |
mazgch | 21:c4d64830bf02 | 51 | // interaction with AT command interface |
mazgch | 18:e5697801df29 | 52 | virtual int getLine(char* buf, int len) = 0; |
mazgch | 18:e5697801df29 | 53 | virtual int send(const char* buf, int len); |
mazgch | 21:c4d64830bf02 | 54 | int sendFormated(const char* format, ...); |
mazgch | 21:c4d64830bf02 | 55 | typedef int (*_CB)(int type, const char* buf, int len, void* param); |
mazgch | 21:c4d64830bf02 | 56 | int waitFinalResp(_CB cb = NULL, void* param = NULL, int timeout_ms = 5000); |
mazgch | 21:c4d64830bf02 | 57 | |
mazgch | 21:c4d64830bf02 | 58 | // network |
mazgch | 21:c4d64830bf02 | 59 | bool init(const char* pin = NULL); |
mazgch | 25:4045d02e44f1 | 60 | bool checkNetStatus(Status* info = NULL); |
mazgch | 21:c4d64830bf02 | 61 | bool powerOff(void); |
mazgch | 21:c4d64830bf02 | 62 | // internet connection |
mazgch | 21:c4d64830bf02 | 63 | bool join(const char* apn, const char* user = NULL, const char* password = NULL); |
mazgch | 21:c4d64830bf02 | 64 | bool disconnect(void); |
mazgch | 21:c4d64830bf02 | 65 | bool gethostbyname(const char* host, IP* ip); |
mazgch | 23:05a1aeeb5fd9 | 66 | // socket interface |
mazgch | 21:c4d64830bf02 | 67 | typedef enum { IPPROTO_TCP, IPPROTO_UDP } IpProtocol; |
mazgch | 21:c4d64830bf02 | 68 | int socketSocket(IpProtocol ipproto); |
mazgch | 21:c4d64830bf02 | 69 | bool socketConnect(int socket, const char * host, int port); |
mazgch | 21:c4d64830bf02 | 70 | int socketSend(int socket, const char * buf, int len); |
mazgch | 21:c4d64830bf02 | 71 | int socketSendTo(int socket, IP ip, int port, const char * buf, int len); |
mazgch | 21:c4d64830bf02 | 72 | int socketReadable(int socket); |
mazgch | 21:c4d64830bf02 | 73 | int socketRecv(int socket, char* buf, int len); |
mazgch | 21:c4d64830bf02 | 74 | int socketRecvFrom(int socket, char* buf, int len, IP* ip); |
mazgch | 21:c4d64830bf02 | 75 | bool socketClose(int socket); |
mazgch | 21:c4d64830bf02 | 76 | bool socketFree(int socket); |
mazgch | 21:c4d64830bf02 | 77 | // sms |
mazgch | 21:c4d64830bf02 | 78 | bool smsSend(const char* num, const char* buf); |
mazgch | 21:c4d64830bf02 | 79 | bool smsDelete(int ix); |
mazgch | 21:c4d64830bf02 | 80 | bool smsRead(int ix, char* num, char* buf, int len); |
mazgch | 21:c4d64830bf02 | 81 | // ussd |
mazgch | 21:c4d64830bf02 | 82 | int ussdCommand(const char* cmd, char* buf, int len); |
mazgch | 18:e5697801df29 | 83 | protected: |
mazgch | 18:e5697801df29 | 84 | static int _getLine(Pipe<char>* pipe, char* buffer, int length); |
mazgch | 21:c4d64830bf02 | 85 | static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end); |
mazgch | 21:c4d64830bf02 | 86 | static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt); |
mazgch | 18:e5697801df29 | 87 | virtual int _send(const void* buf, int len) = 0; |
mazgch | 21:c4d64830bf02 | 88 | private: |
mazgch | 21:c4d64830bf02 | 89 | typedef enum { MODEL_UNKNOWN, MODEL_SARA_G350, MODEL_LISA_U200, MODEL_LISA_C200 } Model; |
mazgch | 21:c4d64830bf02 | 90 | typedef enum { SIM_UNKNOWN, SIM_PIN, SIM_READY } Sim; |
mazgch | 21:c4d64830bf02 | 91 | static int _cbATI(int type, const char* buf, int len, Model* model); |
mazgch | 21:c4d64830bf02 | 92 | static int _cbUDNSRN(int type, const char* buf, int len, IP* ip); |
mazgch | 21:c4d64830bf02 | 93 | static int _cbUSOCR(int type, const char* buf, int len, int* socket); |
mazgch | 21:c4d64830bf02 | 94 | static int _cbUSORD(int type, const char* buf, int len, char* out); |
mazgch | 21:c4d64830bf02 | 95 | typedef struct { char* buf; IP ip; int port; } USORFparam; |
mazgch | 21:c4d64830bf02 | 96 | static int _cbUSORF(int type, const char* buf, int len, USORFparam* param); |
mazgch | 21:c4d64830bf02 | 97 | typedef struct { char* buf; char* num; } CMGRparam; |
mazgch | 21:c4d64830bf02 | 98 | static int _cbCUSD(int type, const char* buf, int len, char* buf); |
mazgch | 21:c4d64830bf02 | 99 | static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param); |
mazgch | 21:c4d64830bf02 | 100 | static IP strToIp(const char* str); |
mazgch | 21:c4d64830bf02 | 101 | IP _ip; |
mazgch | 21:c4d64830bf02 | 102 | Model _model; |
mazgch | 21:c4d64830bf02 | 103 | Sim _sim; |
mazgch | 21:c4d64830bf02 | 104 | Net _net; |
mazgch | 25:4045d02e44f1 | 105 | AcT _act; |
mazgch | 23:05a1aeeb5fd9 | 106 | char _num[32]; |
mazgch | 25:4045d02e44f1 | 107 | char _opr[32]; |
mazgch | 21:c4d64830bf02 | 108 | int _rssi; |
mazgch | 21:c4d64830bf02 | 109 | private: |
mazgch | 21:c4d64830bf02 | 110 | typedef enum { SOCK_FREE, SOCK_CREATED, SOCK_CONNECTED } SockState; |
mazgch | 21:c4d64830bf02 | 111 | typedef struct { SockState state; int pending; } SockCtrl; |
mazgch | 21:c4d64830bf02 | 112 | SockCtrl _sockets[16]; |
mazgch | 18:e5697801df29 | 113 | }; |
mazgch | 18:e5697801df29 | 114 | |
mazgch | 18:e5697801df29 | 115 | // ----------------------------------------------------------------------- |
mazgch | 18:e5697801df29 | 116 | |
mazgch | 18:e5697801df29 | 117 | class MDMSerial : public SerialPipe, public MDMParser |
mazgch | 17:296d94a006b4 | 118 | { |
mazgch | 17:296d94a006b4 | 119 | public: |
mazgch | 19:2b5d097ca15d | 120 | MDMSerial(PinName tx _C027DEFAULT(MDMTXD), |
mazgch | 19:2b5d097ca15d | 121 | PinName rx _C027DEFAULT(MDMRXD), |
mazgch | 19:2b5d097ca15d | 122 | int baudrate _C027DEFAULT(MDMBAUD), |
mazgch | 19:2b5d097ca15d | 123 | #if DEVICE_SERIAL_FC |
mazgch | 19:2b5d097ca15d | 124 | PinName rts _C027DEFAULT(MDMRTS), |
mazgch | 19:2b5d097ca15d | 125 | PinName cts _C027DEFAULT(MDMCTS), |
mazgch | 19:2b5d097ca15d | 126 | #endif |
mazgch | 19:2b5d097ca15d | 127 | int rxSize = 256 , |
mazgch | 21:c4d64830bf02 | 128 | int txSize = 128 ); |
mazgch | 18:e5697801df29 | 129 | virtual int getLine(char* buffer, int length); |
mazgch | 18:e5697801df29 | 130 | protected: |
mazgch | 18:e5697801df29 | 131 | virtual int _send(const void* buf, int len); |
mazgch | 17:296d94a006b4 | 132 | }; |
mazgch | 18:e5697801df29 | 133 | |
mazgch | 18:e5697801df29 | 134 | // ----------------------------------------------------------------------- |
mazgch | 18:e5697801df29 | 135 | |
mazgch | 18:e5697801df29 | 136 | #define HAVE_MDMUSB |
mazgch | 18:e5697801df29 | 137 | #ifdef HAVE_MDMUSB |
mazgch | 18:e5697801df29 | 138 | class MDMUsb : /*public UsbSerial,*/ public MDMParser |
mazgch | 18:e5697801df29 | 139 | { |
mazgch | 18:e5697801df29 | 140 | public: |
mazgch | 18:e5697801df29 | 141 | MDMUsb(void); |
mazgch | 18:e5697801df29 | 142 | virtual int getLine(char* buffer, int length); |
mazgch | 18:e5697801df29 | 143 | protected: |
mazgch | 18:e5697801df29 | 144 | virtual int _send(const void* buf, int len); |
mazgch | 18:e5697801df29 | 145 | }; |
mazgch | 18:e5697801df29 | 146 | #endif |
mazgch | 18:e5697801df29 | 147 | |
mazgch | 18:e5697801df29 | 148 |