![](/media/cache/group/SAM_2404.JPG.50x50_q85.jpg)
works through pushing box to log data to google spreadsheet
Dependencies: MBed_Adafruit-GPS-Library SDFileSystem mbed
Fork of GPR_Interface by
main.cpp
- Committer:
- DeWayneDennis
- Date:
- 2015-10-21
- Revision:
- 11:045cb766d9a5
File content as of revision 11:045cb766d9a5:
/* Copyright (c) 2010-2011 mbed.org, MIT License * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include "mbed.h" #include "math.h" #include "MBed_Adafruit_GPS.h" #include "SDFileSystem.h" #include "QAM.h" #include "GPRSInterface.h" #include "param.h" #include "stdlib.h" #define NUM_SIZE 250 /** On many platforms USBTX/USBRX overlap with serial on D1/D0 pins and enabling the below will interrupt the communication. * You can use an LCD display to print the values or store them on an SD card etc. */ DigitalOut led_red(LED_RED); Serial pc(USBTX, USBRX); //Serial gsm(D1,D0); /************************************************** ** SD FILE SYSTEM ** **************************************************/ //SDFileSystem sdModem(PTE3, PTE1, PTE2, PTE4, "sd"); //MOSI, MISO, SCLK, SSEL. Tested on K64F, correct pins. FILE *fpData; FILE *fpLog; /************************************************** ** GPS ** **************************************************/ Serial * gps_Serial; /************************************************** ** GPRS ** **************************************************/ /** * D1 - TX pin (RX on the WiFi side) * D0 - RX pin (TX on the WiFi side) * 19200 - Baud rate * "apn" - APN name * "username" - APN username * "password" - APN passowrd */ GPRSInterface eth(D1,D0, 19200, "ndo","",""); /************************************************** ** SENSOR INPUTS ** **************************************************/ AnalogIn An(A0); AnalogIn AnRef(A2); Ticker sample_tick; bool takeSample = false; void tick(){takeSample = true;} /************************************************** ** SIN OUTPUT ** **************************************************/ AnalogOut dac0(DAC0_OUT); int sinRes = (int)1/(CARRIER_FREQ*TIME_CONST); float sinWave[SIN_LENGTH] = {}; int sinIndex = 0; /************************************************** ** QAM ** **************************************************/ float sQ[SAMPLE_LENGTH] = {}; float sI[SAMPLE_LENGTH] = {}; float sRefQ[SAMPLE_LENGTH] = {}; float sRefI[SAMPLE_LENGTH] = {}; float Iarray[SAMPLE_LENGTH] = {}; float Qarray[SAMPLE_LENGTH] = {}; int sampleIndex = 0; float I = 0; float Q = 0; float lon = 0; float lonRef = 0; /*Global Variables */ char c; int s; bool run = 0; bool fil = 0; float filtered = 0; float filteredRef = 0; char gsm_header[250]; //String storing SMS message that will be sent (add 250 length to give leeway) char gsm_msg[250]; char num[NUM_SIZE]; //Temporary string storage to help with concatenation of strings void buildIQ(){ for(int i = 0; i < SAMPLE_LENGTH; i++){ Iarray[i] = cos(2*PI*CARRIER_FREQ*i*TIME_CONST); Qarray[i] = -sin(2*PI*CARRIER_FREQ*i*TIME_CONST); } } void create_sinWave(){ int i = 0; for(i = 0; i < SIN_LENGTH; i++){ sinWave[i] = 0.25 * sin(2.0*PI*i/sinRes) + 0.75; } } void init(Adafruit_GPS myGPS){ //fprintf(fpLog, "%s\r\n", ":)\r\n"); //fprintf(fpLog, "%s\r\n", "Initializing the GPS\r\n"); myGPS.begin(9600); myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); myGPS.sendCommand(PGCMD_ANTENNA); //fprintf(fpLog, "%s\r\n", "GPS Initialized\r\n"); // Initialize filtering structures. buildIQ(); create_sinWave(); //Intialize the dhcp (or die trying) s = eth.init(); if (s != NULL) { printf(">>> Could not initialise. Halting!\n"); exit(0); } //Check the SIM card s= eth.preInit(); if(s == true) { //fprintf(fpLog, "%s\r\n", "SIM Card is good!\r\n"); } else { //fprintf(fpLog, "%s\r\n", "check your baud rate\r\n"); } } void gatherData(Adafruit_GPS myGPS){ //sample if(takeSample){ dac0 = sinWave[sinIndex]; lon = An.read(); lonRef = AnRef.read(); I = Iarray[sampleIndex]; Q = Qarray[sampleIndex]; sI[sampleIndex] = lon*I; sQ[sampleIndex] = lon*Q; sRefI[sampleIndex] = lonRef*I; sRefQ[sampleIndex] = lonRef*Q; takeSample = false; sinIndex++; if((sinIndex+1) > SIN_LENGTH){ sinIndex = 0; } sampleIndex++; if(sampleIndex+1 > SAMPLE_LENGTH){ fil = 1; } } //Filter if(fil==1){ fil = 0; run = 1; sampleIndex = 0; filtered = 15*QAM(sI, sQ); filteredRef = QAM(sRefI, sRefQ); } c = myGPS.read(); if ( myGPS.newNMEAreceived() ) { if ( !myGPS.parse(myGPS.lastNMEA()) ) { //fprintf(fpLog, "%s\r\n", "Couldn't parse the GPS Data\r\n"); } } if(run){ run = 0; printf("Logged Data\r\n"); /*fprintf(fpLog, "15CM: %f, ", filtered); fprintf(fpLog, "15CM Reference: %f\r\n", filteredRef); fprintf(fpLog, "15CM / 15CM Refernce: %f\r\n", (filteredRef ? (filtered/filteredRef) : 0)); fprintf(fpLog, "GPS TIME: %d:%d:%d \r\n", myGPS.hour-6, myGPS.minute, myGPS.seconds);*/ if (myGPS.fix){ printf("Lat: %5.2f%c, Long: %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); //fprintf(fpLog, "Lat: %5.2f%c, Long: %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); } else{ printf("No GPS FIX\r\n"); /*fprintf(fpLog, "%s\r\n", "No GPS fix\r\n"); fprintf(fpLog, "%s\r\n", "--------------------------------\r\n");*/ } /*fpData = fopen("/sd/data.txt", "a"); if (fpData != NULL){ fprintf(fpData, "%f, ", filtered); fprintf(fpData, "%f, ", filteredRef); fprintf(fpData, "%d:%d:%d\r\n", myGPS.hour-6, myGPS.minute, myGPS.seconds); if (myGPS.fix) fprintf(fpData, "%5.2f%c, %5.2f%c\r\n", myGPS.latitude, myGPS.lat, myGPS.longitude, myGPS.lon); else fprintf(fpData, "No_GPS_fix\r\n"); fclose(fpData); }*/ } } int main() { //set the baud rates //gsm.baud(19200); gps_Serial = new Serial(PTC4,PTC3); ////Serial gsm(D1,D0); Adafruit_GPS myGPS(gps_Serial); //Initialize SD Card with log and data /*fpLog = fopen("/sd/log.txt", "a"); if (fpLog != NULL){ fprintf(fpLog, "%s\r\n", "--------------- DCS LOG ------------------"); } fpData = fopen("/sd/data.txt", "a"); if (fpData != NULL){ fprintf(fpData, "%s", "--------------- DCS DATA ------------------"); } //Successful Connection Message fprintf(fpLog, "%s\r\n", "---DPG Connection Successful!---\r\n");*/ //initialize gps, gprs, sd card etc... init(myGPS); //fprintf(fpLog, "%s\r\n", ">>> Get IP address...\r\n"); while (1) { s = eth.connect(); // Connect to network if (s == false || s < 0) { printf(">>> Could not connect to network. Retrying!\r\n"); wait(3); } else { break; } } //fprintf(fpLog, ">>> Got IP address: %s\r\n", eth.getIPAddress()); //fprintf(fpLog, "%s\r\n", ">>> Create a TCP Socket Connection\r\n"); TCPSocketConnection sock; sock.set_blocking(true,5000); sock.connect("api.pushingbox.com",80); //fprintf(fpLog, "%s\r\n", "Gathering Data...\r\n"); while(1){ //take a sample tick(); gatherData(myGPS); //if(!myGPS.fix){ printf("Done Gathering Data\r\n"); //fprintf(fpLog, "%s\r\n", "Begin Sending data...\r\n"); //Concatenate data gsm_msg[0] = NULL; gsm_header[0] = NULL; int contentLength = 0; snprintf(num, NUM_SIZE, "&phone=%s", "3852368101"); contentLength += strlen(num); strcat(gsm_msg, num); snprintf(num, NUM_SIZE, "&data=%f", filtered); contentLength += strlen(num); strcat(gsm_msg, num); snprintf(num, NUM_SIZE, "&dataRef=%f", filteredRef); contentLength += strlen(num); strcat(gsm_msg, num); snprintf(num, NUM_SIZE, "&dataRatio=%f", (filteredRef ? (filtered/filteredRef) : 0)); contentLength += strlen(num); strcat(gsm_msg, num); snprintf(num, NUM_SIZE, "&time=%02d:%02d:%02d", myGPS.hour, myGPS.minute, myGPS.seconds); //If there is no data from GPS, the time will just be "00:00:00" (that is okay) contentLength += strlen(num); strcat(gsm_msg, num); if (myGPS.lat != NULL) //If there is a gps fix (i.e. the gps has data on our location), ns will be set { snprintf(num, NUM_SIZE, "&latitude=%.4f&longitude=%.4f", (myGPS.lat == 'N') ? myGPS.latitude : -myGPS.latitude, (myGPS.lon == 'E') ? myGPS.longitude : -myGPS.longitude); //Use + or - rather than N/S, E/W contentLength += strlen(num); strcat(gsm_msg, num); } else { snprintf(num, NUM_SIZE,"&latitude=0&longitude=0"); strcat(gsm_msg, num); //Otherwise just send 0's for latitude and longitude contentLength += strlen(num); } //header information snprintf(num, NUM_SIZE, "%s", "POST /pushingbox?devid=v941C443DE0C7B14"); strcat(gsm_header, num); strcat(gsm_header, gsm_msg); snprintf(num, NUM_SIZE, "%s\r\n"," HTTP/1.1"); strcat(gsm_header, num); snprintf(num, NUM_SIZE, "%s\r\n","Host: api.pushingbox.com"); strcat(gsm_header, num); snprintf(num, NUM_SIZE, "%s\r\n","Connection: Keep-Alive"); strcat(gsm_header, num); snprintf(num, NUM_SIZE, "%s\r\n","User-Agent: FRDM-KD64"); strcat(gsm_header, num); //must have two blank lines after so the server knows that this is the end of headers snprintf(num, NUM_SIZE, "Content-Length: %d\r\n\r\n\r\n", contentLength); strcat(gsm_header, num); //fprintf(fpLog, "%s\r\n", ">>> Sending data to the server: %s\r\n",gsm_header); int result = sock.send_all(gsm_header, contentLength); //sock.set_blocking(false); if (result > 0) { //fprintf(fpLog, "%s\r\n", ">>> Successfully Sent Data to Server\r\n"); printf("Successfully send data\r\n"); } else { //fprintf(fpLog, "%s\r\n", ">>> Failed to Send Data, Error Code: %d \r\n",result); printf("Data Not Sent!! Content-Length:%d\r\n", contentLength); } //check that we are still connected (if not reconnect) //sock.close(); //printf("end of program\n"); // Disconnect from network eth.disconnect(); //return 0; /*} else{ fprintf(fpLog, "%s\r\n", ">>>No GPS Fix\r\n"); }*/ //wait(4); } }