uses pushing box to write to google spreadsheets

Dependencies:   GSM_PUSHING_BOX_STATE_MACHINE MBed_Adafruit-GPS-Library SDFileSystem mbed

Fork of DCS by DCS_TEAM

Revision:
19:404594768414
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPRS/GPRS.cpp	Wed Oct 21 19:44:47 2015 +0000
@@ -0,0 +1,421 @@
+/*
+  GPRS.cpp
+  2014 Copyright (c) Seeed Technology Inc.  All right reserved.
+
+  Author:lawliet zou(lawliet.zou@gmail.com)
+  2014-2-24
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include "mbed.h"
+#include "GPRS.h"
+
+GPRS* GPRS::inst;
+char* numbers[100];
+FILE *fpNum;
+int number_index = 0;
+char phone_number[12];
+
+GPRS::GPRS(PinName tx, PinName rx, int baudRate, const char* apn, const char* userName, const char* passWord) : Modem(tx,rx,baudRate)
+{
+    inst = this;
+    _apn = apn;
+    _userName = userName;
+    _passWord = passWord;
+    socketID = -1;
+}
+
+bool GPRS::preInit()
+{
+    //send AT command a couple of times
+    for(int i = 0; i < 2; i++) {
+        sendCmd("AT\r\n");
+    }
+    return checkSIMStatus();
+}
+// added by Noah Milam
+void GPRS::start_server()
+{     
+     sendCmdResp("AT+CGATT?\r\n");
+     
+     sendCmdResp("AT+CIPSERVER=1,1234\r\n");
+     listen_server();
+}
+void GPRS::listen_server()
+{
+    gprs_response();
+}
+    
+void GPRS::send_SMS(char* number, char* data)
+{
+    printf("sending text message to: %s\r\n", number);
+    sendCmdAndWaitForResp("AT+CMGF=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
+    wait(2);
+     //printf("\032\n");
+    char cmd[64];
+    snprintf(cmd,sizeof(cmd),"AT+CMGS=\"+%s\"\r\n",number);
+    printf(">>>>%s",cmd);
+    sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT,CMD);
+    printf("sent at cmgf\n");
+    wait(2);
+    //printf("032");
+    sendCmd(data); // sends the address 
+    sendCmd("\x1a");  // this is like pressing control - z to end the send command
+    wait(10);  // giving the send enough time to do its thing
+    printf("should have been received");
+}
+
+char* GPRS::read_SMS()
+{
+ wait(1);
+    sendCmd("AT+CMGF=1\r\n"); // sms mode
+    wait(2);
+    sendCmd("AT+CMGD=1\r\n"); // delete the frist message so incoming message is spot 1
+    wait(1);
+    wait_for_sms();
+    wait(10);  
+    sendCmd("AT+CMGR=1\r\n");
+    storeResp();
+    return get_server_IP();
+}
+
+// end of what Noah Milam added
+bool GPRS::checkSIMStatus(void)
+{
+    printf("Checking SIM Status...\r\n");
+    char gprsBuffer[32];
+    int count = 0;
+    
+    while(count < 3) {
+        cleanBuffer(gprsBuffer,32);
+        sendCmd("AT+CPIN?\r\n");
+        readBuffer(gprsBuffer,32,DEFAULT_TIMEOUT);
+        if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
+            break;
+        }
+        printf("SIM Not Ready..Try Again\r\n--%s--\r\n", gprsBuffer);
+        count++;
+        wait(1);
+    }
+    if(count == 3) {
+        return false;
+    }
+    printf("SIM Status GOOD!\r\n");
+    return true;
+}
+
+bool GPRS::join()
+{
+    char cmd[64];
+    char ipAddr[32];
+    char resp[96];
+    
+    printf(">>>>AT+CREG\r\n");
+    sendCmd("AT+CREG?\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"+CREG:")) {
+    }
+    else{
+        return false;    
+    }
+    //close any existing connections
+    printf(">>>>AT+CIPSHUT\r\n");
+    sendCmd("AT+CIPSHUT\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"OK")) {
+    }
+    else{
+        return false;    
+    }
+    //Select multi connection (it can be a server or client)
+    printf(">>>>AT+CIPMUX=0\r\n");
+    sendCmd("AT+CIPMUX=0 \r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"CIPMUX")) {
+    }
+    else{
+        return false;    
+    }
+    //get signal strength
+    printf(">>>>AT+CSQ\r\n");
+    sendCmd("AT+CSQ\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"+CSQ:")) {
+    }
+    else{
+        return false;    
+    }
+    //check if device is attached
+    printf(">>>>AT+CGATT?\r\n");
+    sendCmd("AT+CGATT?\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"+CGATT:")) {
+    }
+    else{
+        return false;    
+    }
+    //attach the device
+    printf(">>>>AT+CGATT=1\r\n");
+    sendCmd("AT+CGATT=1\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"OK")) {
+    }
+    else{
+        printf("Response: %s\r\n", resp);
+        return false;    
+    }
+    
+    //set APN
+    snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord);
+    printf(">>>>%s",cmd);
+    //sendCmdAndWaitForRes  p(cmd, "OK", DEFAULT_TIMEOUT,CMD);
+    sendCmd(cmd);
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"OK")) {
+    }
+    else{
+        return false;    
+    }
+    //Brings up wireless connection
+    printf(">>>>AT+CIICR\r\n");
+    sendCmd("AT+CIICR\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"OK")) {
+    }
+    else{
+        return false;    
+    }
+    printf(">>>>AT+CIPHEAD\r\n");
+    sendCmd("AT+CIPHEAD=1\r\n");
+    cleanBuffer(resp,96);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"OK")) {
+    }
+    else{
+        return false;    
+    }
+    //Get local IP address
+    printf(">>>>AT+CIFSR\r\n");
+    sendCmd("AT+CIFSR\r\n");
+    readBuffer(ipAddr,32,2);
+    printf(">>>>AT+CIFSR returns: %s\r\n", ipAddr);
+    if(NULL != strstr(ipAddr,"AT+CIFSR")) {
+        _ip = str_to_ip(ipAddr+12);
+        if(_ip != 0) {
+            //possibly send ip address to server for future TCP connections
+            return true;
+        }
+    }
+    return false;
+}
+
+bool GPRS::setProtocol(int socket, Protocol p)
+{
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return false;
+    }
+    //ToDo: setProtocol
+    return true;
+}
+
+bool GPRS::connect(int socket, Protocol ptl,const char * host, int port, int timeout)
+{
+    char cmd[64];
+    char resp[96];
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return false;
+    }
+    if(ptl == TCP) {
+        sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n", host, port);
+    } else if(ptl == UDP) {
+        sprintf(cmd, "AT+CIPSTART=%d,\"UDP\",\"%s\",%d\r\n",socket, host, port);
+    } else {
+        return false;
+    }
+    
+    sendCmd(cmd);
+    readBuffer(resp,96,DEFAULT_TIMEOUT);
+    if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK
+        printf("Response: %s\r\n", resp);
+        return true;
+    }
+    return false;//ERROR
+}
+
+bool GPRS::gethostbyname(const char* host, uint32_t* ip)
+{
+    uint32_t addr = str_to_ip(host);
+    char buf[17];
+    snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);
+    if (strcmp(buf, host) == 0) {
+        *ip = addr;
+        return true;
+    }
+    return false;
+}
+
+bool GPRS::disconnect()
+{
+    sendCmd("AT+CIPSHUT\r\n");
+    return true;
+}
+
+bool GPRS::is_connected(int socket)
+{
+    
+    char cmd[16];
+    char resp[96];
+    while(1){
+        snprintf(cmd,16,"AT+CIPSTATUS=%d\r\n",socket);
+        sendCmd(cmd);
+        readBuffer(resp,sizeof(resp),DEFAULT_TIMEOUT);
+        if(NULL != strstr(resp,"CONNECTED")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+}
+
+void GPRS::reset()
+{
+}
+
+bool GPRS::close(int socket)
+{
+    char cmd[16];
+    char resp[16];
+
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return false;
+    }
+    // if not connected, return
+    if (is_connected(socket) == false) {
+        return true;
+    }
+    snprintf(cmd, sizeof(cmd),"AT+CIPCLOSE=%d\r\n",socket);
+    snprintf(resp,sizeof(resp),"%d, CLOSE OK",socket);
+    if(0 != sendCmdAndWaitForResp(cmd, resp, DEFAULT_TIMEOUT,CMD)) {
+        return false;
+    }
+    return true;
+}
+
+bool GPRS::readable(void)
+{
+    return readable();
+}
+
+int GPRS::wait_readable(int socket, int wait_time)
+{
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return -1;
+    }
+    char resp[16];
+    snprintf(resp,sizeof(resp),"\r\n\r\n+RECEIVE,%d",socket);//"+RECEIVE:<socketID>,<length>"
+    int len = strlen(resp);
+
+    if(false == respCmp(resp,len,wait_time)) {
+        return -1;
+    }
+    char c = readByte();//','
+    char dataLen[4];
+    int i = 0;
+    c = readByte();
+    while((c >= '0') && (c <= '9')) {
+        dataLen[i++] = c;
+        c = readByte();
+    }
+    c = readByte();//'\n'
+    len = atoi(dataLen);
+    return len;
+}
+
+int GPRS::wait_writeable(int socket, int req_size)
+{
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return -1;
+    }
+    return req_size>256?256:req_size+1;
+}
+
+int GPRS::send(int socket, const char * str, int len)
+{
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return -1;
+    }
+    char cmd[32];
+    wait(1);
+    if(len > 0){
+        printf("Sending data: %s\r\n", str);
+        snprintf(cmd,sizeof(cmd),"AT+CIPSEND\r\n");
+        if(0 != sendCmdAndWaitForResp(cmd,">",2,CMD)) {
+            printf("Couldn't send data!!\r\n");
+            return false;
+        }
+        sendCmd(str);
+        serialModem.putc((char)0x1a);
+    }
+    return len;
+}
+
+int GPRS::recv(int socket, char* buf, int len)
+{
+    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
+        return -1;
+    }
+    cleanBuffer(buf,len);
+    readBuffer(buf,len,DEFAULT_TIMEOUT/2);
+    return len;
+    //return strlen(buf);
+}
+
+int GPRS::new_socket()
+{
+    socketID = 0; //we only support one socket.
+    return socketID; 
+}
+
+uint16_t GPRS::new_port()
+{
+    uint16_t port = rand();
+    port |= 49152;
+    return port;
+}
+
+uint32_t GPRS::str_to_ip(const char* str)
+{
+    uint32_t ip = 0;
+    char* p = (char*)str;
+    for(int i = 0; i < 4; i++) {
+        ip |= atoi(p);
+        p = strchr(p, '.');
+        if (p == NULL) {
+            break;
+        }
+        ip <<= 8;
+        p++;
+    }
+    return ip;
+}
\ No newline at end of file