code

Dependencies:   MPU6050_SIM5320_TEST SDFileSystem WakeUp

Fork of Nucleo_L476RG_SDCard_WorkingSample by M J.

Committer:
suads
Date:
Sat Sep 09 14:36:17 2017 +0000
Revision:
1:d5774258d18b
Child:
2:f745f2656606
cassey

Who changed what in which revision?

UserRevisionLine numberNew 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