Add a bunch of APNs
Fork of C027_Support by
MDM.h@26:07be5faf8925, 2014-04-08 (annotated)
- Committer:
- mazgch
- Date:
- Tue Apr 08 13:52:07 2014 +0000
- Revision:
- 26:07be5faf8925
- Parent:
- 25:4045d02e44f1
- Child:
- 28:4d9509e3b1cf
extract more device data from modem, use templates to simplify type checking
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 | 26:07be5faf8925 | 55 | |
mazgch | 26:07be5faf8925 | 56 | typedef int (*_CALLBACKPTR)(int type, const char* buf, int len, void* param); |
mazgch | 26:07be5faf8925 | 57 | int waitFinalResp(_CALLBACKPTR = NULL, |
mazgch | 26:07be5faf8925 | 58 | void* param = NULL, |
mazgch | 26:07be5faf8925 | 59 | int timeout_ms = 5000); |
mazgch | 26:07be5faf8925 | 60 | template<class T> |
mazgch | 26:07be5faf8925 | 61 | int waitFinalResp(int (*cb)(int type, const char* buf, int len, |
mazgch | 26:07be5faf8925 | 62 | T* param), |
mazgch | 26:07be5faf8925 | 63 | T* param, int timeout_ms = 5000) |
mazgch | 26:07be5faf8925 | 64 | { |
mazgch | 26:07be5faf8925 | 65 | return waitFinalResp((_CALLBACKPTR)cb, (void*)param, timeout_ms); |
mazgch | 26:07be5faf8925 | 66 | } |
mazgch | 21:c4d64830bf02 | 67 | // network |
mazgch | 21:c4d64830bf02 | 68 | bool init(const char* pin = NULL); |
mazgch | 25:4045d02e44f1 | 69 | bool checkNetStatus(Status* info = NULL); |
mazgch | 21:c4d64830bf02 | 70 | bool powerOff(void); |
mazgch | 21:c4d64830bf02 | 71 | // internet connection |
mazgch | 21:c4d64830bf02 | 72 | bool join(const char* apn, const char* user = NULL, const char* password = NULL); |
mazgch | 21:c4d64830bf02 | 73 | bool disconnect(void); |
mazgch | 21:c4d64830bf02 | 74 | bool gethostbyname(const char* host, IP* ip); |
mazgch | 23:05a1aeeb5fd9 | 75 | // socket interface |
mazgch | 21:c4d64830bf02 | 76 | typedef enum { IPPROTO_TCP, IPPROTO_UDP } IpProtocol; |
mazgch | 21:c4d64830bf02 | 77 | int socketSocket(IpProtocol ipproto); |
mazgch | 21:c4d64830bf02 | 78 | bool socketConnect(int socket, const char * host, int port); |
mazgch | 21:c4d64830bf02 | 79 | int socketSend(int socket, const char * buf, int len); |
mazgch | 21:c4d64830bf02 | 80 | int socketSendTo(int socket, IP ip, int port, const char * buf, int len); |
mazgch | 21:c4d64830bf02 | 81 | int socketReadable(int socket); |
mazgch | 21:c4d64830bf02 | 82 | int socketRecv(int socket, char* buf, int len); |
mazgch | 21:c4d64830bf02 | 83 | int socketRecvFrom(int socket, char* buf, int len, IP* ip); |
mazgch | 21:c4d64830bf02 | 84 | bool socketClose(int socket); |
mazgch | 21:c4d64830bf02 | 85 | bool socketFree(int socket); |
mazgch | 21:c4d64830bf02 | 86 | // sms |
mazgch | 21:c4d64830bf02 | 87 | bool smsSend(const char* num, const char* buf); |
mazgch | 21:c4d64830bf02 | 88 | bool smsDelete(int ix); |
mazgch | 21:c4d64830bf02 | 89 | bool smsRead(int ix, char* num, char* buf, int len); |
mazgch | 21:c4d64830bf02 | 90 | // ussd |
mazgch | 21:c4d64830bf02 | 91 | int ussdCommand(const char* cmd, char* buf, int len); |
mazgch | 18:e5697801df29 | 92 | protected: |
mazgch | 18:e5697801df29 | 93 | static int _getLine(Pipe<char>* pipe, char* buffer, int length); |
mazgch | 21:c4d64830bf02 | 94 | static int _parseMatch(Pipe<char>* pipe, int len, const char* sta, const char* end); |
mazgch | 21:c4d64830bf02 | 95 | static int _parseFormated(Pipe<char>* pipe, int len, const char* fmt); |
mazgch | 18:e5697801df29 | 96 | virtual int _send(const void* buf, int len) = 0; |
mazgch | 21:c4d64830bf02 | 97 | private: |
mazgch | 21:c4d64830bf02 | 98 | typedef enum { MODEL_UNKNOWN, MODEL_SARA_G350, MODEL_LISA_U200, MODEL_LISA_C200 } Model; |
mazgch | 21:c4d64830bf02 | 99 | typedef enum { SIM_UNKNOWN, SIM_PIN, SIM_READY } Sim; |
mazgch | 21:c4d64830bf02 | 100 | static int _cbATI(int type, const char* buf, int len, Model* model); |
mazgch | 26:07be5faf8925 | 101 | static int _cbCIMI(int type, const char* buf, int len, char* imsi); |
mazgch | 21:c4d64830bf02 | 102 | static int _cbUDNSRN(int type, const char* buf, int len, IP* ip); |
mazgch | 21:c4d64830bf02 | 103 | static int _cbUSOCR(int type, const char* buf, int len, int* socket); |
mazgch | 21:c4d64830bf02 | 104 | static int _cbUSORD(int type, const char* buf, int len, char* out); |
mazgch | 21:c4d64830bf02 | 105 | typedef struct { char* buf; IP ip; int port; } USORFparam; |
mazgch | 21:c4d64830bf02 | 106 | static int _cbUSORF(int type, const char* buf, int len, USORFparam* param); |
mazgch | 21:c4d64830bf02 | 107 | typedef struct { char* buf; char* num; } CMGRparam; |
mazgch | 21:c4d64830bf02 | 108 | static int _cbCUSD(int type, const char* buf, int len, char* buf); |
mazgch | 21:c4d64830bf02 | 109 | static int _cbCMGR(int type, const char* buf, int len, CMGRparam* param); |
mazgch | 26:07be5faf8925 | 110 | static int _cbCGSN(int type, const char* buf, int len, char* imei); |
mazgch | 26:07be5faf8925 | 111 | static int _cbGSN(int type, const char* buf, int len, char* imei); |
mazgch | 26:07be5faf8925 | 112 | static int _cbCCID(int type, const char* buf, int len, char* ccid); |
mazgch | 21:c4d64830bf02 | 113 | static IP strToIp(const char* str); |
mazgch | 21:c4d64830bf02 | 114 | IP _ip; |
mazgch | 21:c4d64830bf02 | 115 | Model _model; |
mazgch | 21:c4d64830bf02 | 116 | Sim _sim; |
mazgch | 21:c4d64830bf02 | 117 | Net _net; |
mazgch | 25:4045d02e44f1 | 118 | AcT _act; |
mazgch | 23:05a1aeeb5fd9 | 119 | char _num[32]; |
mazgch | 25:4045d02e44f1 | 120 | char _opr[32]; |
mazgch | 21:c4d64830bf02 | 121 | int _rssi; |
mazgch | 26:07be5faf8925 | 122 | char _imsi[32]; |
mazgch | 26:07be5faf8925 | 123 | char _imei[32]; |
mazgch | 26:07be5faf8925 | 124 | char _ccid[32]; |
mazgch | 21:c4d64830bf02 | 125 | private: |
mazgch | 21:c4d64830bf02 | 126 | typedef enum { SOCK_FREE, SOCK_CREATED, SOCK_CONNECTED } SockState; |
mazgch | 21:c4d64830bf02 | 127 | typedef struct { SockState state; int pending; } SockCtrl; |
mazgch | 21:c4d64830bf02 | 128 | SockCtrl _sockets[16]; |
mazgch | 18:e5697801df29 | 129 | }; |
mazgch | 18:e5697801df29 | 130 | |
mazgch | 18:e5697801df29 | 131 | // ----------------------------------------------------------------------- |
mazgch | 18:e5697801df29 | 132 | |
mazgch | 18:e5697801df29 | 133 | class MDMSerial : public SerialPipe, public MDMParser |
mazgch | 17:296d94a006b4 | 134 | { |
mazgch | 17:296d94a006b4 | 135 | public: |
mazgch | 19:2b5d097ca15d | 136 | MDMSerial(PinName tx _C027DEFAULT(MDMTXD), |
mazgch | 19:2b5d097ca15d | 137 | PinName rx _C027DEFAULT(MDMRXD), |
mazgch | 19:2b5d097ca15d | 138 | int baudrate _C027DEFAULT(MDMBAUD), |
mazgch | 19:2b5d097ca15d | 139 | #if DEVICE_SERIAL_FC |
mazgch | 19:2b5d097ca15d | 140 | PinName rts _C027DEFAULT(MDMRTS), |
mazgch | 19:2b5d097ca15d | 141 | PinName cts _C027DEFAULT(MDMCTS), |
mazgch | 19:2b5d097ca15d | 142 | #endif |
mazgch | 19:2b5d097ca15d | 143 | int rxSize = 256 , |
mazgch | 21:c4d64830bf02 | 144 | int txSize = 128 ); |
mazgch | 18:e5697801df29 | 145 | virtual int getLine(char* buffer, int length); |
mazgch | 18:e5697801df29 | 146 | protected: |
mazgch | 18:e5697801df29 | 147 | virtual int _send(const void* buf, int len); |
mazgch | 17:296d94a006b4 | 148 | }; |
mazgch | 18:e5697801df29 | 149 | |
mazgch | 18:e5697801df29 | 150 | // ----------------------------------------------------------------------- |
mazgch | 18:e5697801df29 | 151 | |
mazgch | 18:e5697801df29 | 152 | #define HAVE_MDMUSB |
mazgch | 18:e5697801df29 | 153 | #ifdef HAVE_MDMUSB |
mazgch | 18:e5697801df29 | 154 | class MDMUsb : /*public UsbSerial,*/ public MDMParser |
mazgch | 18:e5697801df29 | 155 | { |
mazgch | 18:e5697801df29 | 156 | public: |
mazgch | 18:e5697801df29 | 157 | MDMUsb(void); |
mazgch | 18:e5697801df29 | 158 | virtual int getLine(char* buffer, int length); |
mazgch | 18:e5697801df29 | 159 | protected: |
mazgch | 18:e5697801df29 | 160 | virtual int _send(const void* buf, int len); |
mazgch | 18:e5697801df29 | 161 | }; |
mazgch | 18:e5697801df29 | 162 | #endif |
mazgch | 18:e5697801df29 | 163 | |
mazgch | 18:e5697801df29 | 164 |