code
Dependencies: MPU6050_SIM5320_TEST SDFileSystem WakeUp
Fork of Nucleo_L476RG_SDCard_WorkingSample by
SIM5320.cpp@1:d5774258d18b, 2017-09-09 (annotated)
- Committer:
- suads
- Date:
- Sat Sep 09 14:36:17 2017 +0000
- Revision:
- 1:d5774258d18b
- Child:
- 2:f745f2656606
cassey
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
suads | 1:d5774258d18b | 1 | #include "SIM5320.h" |
suads | 1:d5774258d18b | 2 | #include <string> |
suads | 1:d5774258d18b | 3 | |
suads | 1:d5774258d18b | 4 | SIM5320::SIM5320() : SIM5320Serial(PA_9, PA_10), debugSerial(USBTX, USBRX) |
suads | 1:d5774258d18b | 5 | { |
suads | 1:d5774258d18b | 6 | SIM5320Serial.baud(115200); |
suads | 1:d5774258d18b | 7 | debugSerial.baud(115200); |
suads | 1:d5774258d18b | 8 | SIM5320Serial.attach(callback(this,&SIM5320::rxInterrupt),Serial::RxIrq); |
suads | 1:d5774258d18b | 9 | flushBuffer(); |
suads | 1:d5774258d18b | 10 | rx_in=0; |
suads | 1:d5774258d18b | 11 | } |
suads | 1:d5774258d18b | 12 | |
suads | 1:d5774258d18b | 13 | SIM5320::SIM5320(PinName tx, PinName rx, bool debug) : SIM5320Serial(tx, rx), debugSerial(USBTX, USBRX) |
suads | 1:d5774258d18b | 14 | { |
suads | 1:d5774258d18b | 15 | SIM5320Serial.baud(115200); |
suads | 1:d5774258d18b | 16 | debugSerial.baud(115200); |
suads | 1:d5774258d18b | 17 | SIM5320Serial.attach(callback(this,&SIM5320::rxInterrupt),Serial::RxIrq); |
suads | 1:d5774258d18b | 18 | flushBuffer(); |
suads | 1:d5774258d18b | 19 | rx_in=0; |
suads | 1:d5774258d18b | 20 | } |
suads | 1:d5774258d18b | 21 | |
suads | 1:d5774258d18b | 22 | string SIM5320::sendCommand(const char *command, uint8_t timeout) |
suads | 1:d5774258d18b | 23 | { |
suads | 1:d5774258d18b | 24 | //printDebug(command); |
suads | 1:d5774258d18b | 25 | SIM5320Serial.printf("%s\r\n", command); |
suads | 1:d5774258d18b | 26 | wait(timeout); |
suads | 1:d5774258d18b | 27 | string ret = readBuffer(); |
suads | 1:d5774258d18b | 28 | rx_response=ret; |
suads | 1:d5774258d18b | 29 | const char* debugResponse = rx_buffer; |
suads | 1:d5774258d18b | 30 | printDebug(debugResponse); |
suads | 1:d5774258d18b | 31 | flushBuffer(); |
suads | 1:d5774258d18b | 32 | return ret; |
suads | 1:d5774258d18b | 33 | |
suads | 1:d5774258d18b | 34 | |
suads | 1:d5774258d18b | 35 | } |
suads | 1:d5774258d18b | 36 | |
suads | 1:d5774258d18b | 37 | uint8_t SIM5320::sendCommandAndCheck(const char *command, const char *response, uint8_t timeout) |
suads | 1:d5774258d18b | 38 | { |
suads | 1:d5774258d18b | 39 | string answer = sendCommand(command, timeout); |
suads | 1:d5774258d18b | 40 | |
suads | 1:d5774258d18b | 41 | string resp(response); |
suads | 1:d5774258d18b | 42 | if (answer.find(resp) != string::npos) { |
suads | 1:d5774258d18b | 43 | return 1; |
suads | 1:d5774258d18b | 44 | } |
suads | 1:d5774258d18b | 45 | return 0; |
suads | 1:d5774258d18b | 46 | } |
suads | 1:d5774258d18b | 47 | void SIM5320::printDebug(const char *line) |
suads | 1:d5774258d18b | 48 | { |
suads | 1:d5774258d18b | 49 | debugSerial.printf("%s\n",line); |
suads | 1:d5774258d18b | 50 | } |
suads | 1:d5774258d18b | 51 | bool SIM5320::connect(const char *apn, const char *userName, const char *passPhrase) |
suads | 1:d5774258d18b | 52 | { |
suads | 1:d5774258d18b | 53 | sendCommand("AT",2); |
suads | 1:d5774258d18b | 54 | sendCommand("AT+CSQ",2); |
suads | 1:d5774258d18b | 55 | sendCommand("AT+CREG?",2); |
suads | 1:d5774258d18b | 56 | sendCommand("AT+CPSI?",2); |
suads | 1:d5774258d18b | 57 | sendCommand("AT+CGREG?",2); |
suads | 1:d5774258d18b | 58 | sendCommand(concatChars("AT+CGSOCKCONT=1,\"IP\",\"",apn,"\""),3); |
suads | 1:d5774258d18b | 59 | sendCommand("AT+CSOCKSETPN=1",2); |
suads | 1:d5774258d18b | 60 | sendCommand("AT+CIPMODE=0",2); |
suads | 1:d5774258d18b | 61 | sendCommand("AT+NETOPEN",10); |
suads | 1:d5774258d18b | 62 | return sendCommandAndCheck("AT+IPADDR","IPADDR",3); |
suads | 1:d5774258d18b | 63 | } |
suads | 1:d5774258d18b | 64 | bool SIM5320::disconnect() |
suads | 1:d5774258d18b | 65 | { |
suads | 1:d5774258d18b | 66 | sendCommand("AT+NETCLOSE",2); |
suads | 1:d5774258d18b | 67 | return sendCommandAndCheck("AT+IPADDR","IP ERROR",2); |
suads | 1:d5774258d18b | 68 | } |
suads | 1:d5774258d18b | 69 | bool SIM5320::enableGPS(bool isEnabled) |
suads | 1:d5774258d18b | 70 | { |
suads | 1:d5774258d18b | 71 | char x='0'; |
suads | 1:d5774258d18b | 72 | if(isEnabled) { |
suads | 1:d5774258d18b | 73 | x='1'; |
suads | 1:d5774258d18b | 74 | } else { |
suads | 1:d5774258d18b | 75 | x='0'; |
suads | 1:d5774258d18b | 76 | } |
suads | 1:d5774258d18b | 77 | return sendCommandAndCheck("AT+CGPS=1","OK",3); |
suads | 1:d5774258d18b | 78 | } |
suads | 1:d5774258d18b | 79 | void SIM5320::rxInterrupt() |
suads | 1:d5774258d18b | 80 | { |
suads | 1:d5774258d18b | 81 | while(SIM5320Serial.readable()) { |
suads | 1:d5774258d18b | 82 | char c = SIM5320Serial.getc(); |
suads | 1:d5774258d18b | 83 | rx_buffer[rx_in] = c; |
suads | 1:d5774258d18b | 84 | rx_in++; |
suads | 1:d5774258d18b | 85 | if(rx_in==BUFFER_SIZE) |
suads | 1:d5774258d18b | 86 | rx_in=0; |
suads | 1:d5774258d18b | 87 | } |
suads | 1:d5774258d18b | 88 | return; |
suads | 1:d5774258d18b | 89 | } |
suads | 1:d5774258d18b | 90 | |
suads | 1:d5774258d18b | 91 | string SIM5320::readBuffer() |
suads | 1:d5774258d18b | 92 | { |
suads | 1:d5774258d18b | 93 | |
suads | 1:d5774258d18b | 94 | return string(rx_buffer); |
suads | 1:d5774258d18b | 95 | } |
suads | 1:d5774258d18b | 96 | |
suads | 1:d5774258d18b | 97 | void SIM5320::flushBuffer() |
suads | 1:d5774258d18b | 98 | { |
suads | 1:d5774258d18b | 99 | for(int i=0; i<BUFFER_SIZE; i++) |
suads | 1:d5774258d18b | 100 | rx_buffer[i]=0; |
suads | 1:d5774258d18b | 101 | rx_in=0; |
suads | 1:d5774258d18b | 102 | } |
suads | 1:d5774258d18b | 103 | |
suads | 1:d5774258d18b | 104 | char* SIM5320::concatChars(const char* in1, const char* in2, const char* in3) |
suads | 1:d5774258d18b | 105 | { |
suads | 1:d5774258d18b | 106 | char* out1 = (char *) malloc(1+strlen(in1)+strlen(in2)); |
suads | 1:d5774258d18b | 107 | char* out2 = (char *) malloc(1+strlen(out1)+strlen(in3)); |
suads | 1:d5774258d18b | 108 | strcpy(out1, in1); |
suads | 1:d5774258d18b | 109 | strcat(out1, in2); |
suads | 1:d5774258d18b | 110 | |
suads | 1:d5774258d18b | 111 | strcpy(out2, out1); |
suads | 1:d5774258d18b | 112 | strcat(out2, in3); |
suads | 1:d5774258d18b | 113 | |
suads | 1:d5774258d18b | 114 | return out2; |
suads | 1:d5774258d18b | 115 | |
suads | 1:d5774258d18b | 116 | } |
suads | 1:d5774258d18b | 117 | |
suads | 1:d5774258d18b | 118 | bool SIM5320::getGPS(){ |
suads | 1:d5774258d18b | 119 | enableGPS(true); |
suads | 1:d5774258d18b | 120 | wait(30); |
suads | 1:d5774258d18b | 121 | if ((sendCommandAndCheck("AT+CGPSINFO","N",2))){ |
suads | 1:d5774258d18b | 122 | enableGPS(false); |
suads | 1:d5774258d18b | 123 | return 1; |
suads | 1:d5774258d18b | 124 | } |
suads | 1:d5774258d18b | 125 | else { |
suads | 1:d5774258d18b | 126 | enableGPS(false); |
suads | 1:d5774258d18b | 127 | return 0; |
suads | 1:d5774258d18b | 128 | } |
suads | 1:d5774258d18b | 129 | } |
suads | 1:d5774258d18b | 130 | |
suads | 1:d5774258d18b | 131 |