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