Sam Clarke / Mbed 2 deprecated GPS-GPRS_Tracker

Dependencies:   GPS MODSERIAL mbed-rtos mbed

Committer:
SamClarke
Date:
Tue Oct 09 06:20:57 2012 +0000
Revision:
7:db9226b9b037
Parent:
6:32c25fb48fd2
Child:
8:d4773b6449c5
Returns Tracking information to sender instead of a hard coded number.; Ability to receive a 4 character message (use for software triggers)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SamClarke 0:5b4bcbd69509 1 #include "mbed.h"
SamClarke 0:5b4bcbd69509 2 #include "GPS.h"
SamClarke 0:5b4bcbd69509 3 #include "rtos.h"
SamClarke 0:5b4bcbd69509 4 #include "MODSERIAL.h"
SamClarke 0:5b4bcbd69509 5 #include <string>
SamClarke 0:5b4bcbd69509 6 #include <iostream>
SamClarke 0:5b4bcbd69509 7
SamClarke 0:5b4bcbd69509 8 using namespace std;
SamClarke 0:5b4bcbd69509 9
SamClarke 0:5b4bcbd69509 10 const string GoogleChunk = "https://maps.google.com.au/maps?q=";
SamClarke 0:5b4bcbd69509 11 const string GoogleExtras = "&z=20";
SamClarke 0:5b4bcbd69509 12 char GPRSbuffer[512];
SamClarke 7:db9226b9b037 13 char NUMBER[11];
SamClarke 7:db9226b9b037 14 char MESSAGE[5];
SamClarke 3:a5df4bd224ad 15 string dump;
SamClarke 0:5b4bcbd69509 16 int index;
SamClarke 7:db9226b9b037 17 long int number;
SamClarke 0:5b4bcbd69509 18 int i = 0;
SamClarke 0:5b4bcbd69509 19
SamClarke 0:5b4bcbd69509 20 GPS gps(p9,p10);
SamClarke 0:5b4bcbd69509 21 MODSERIAL GPRS(p13,p14); // MODSERIAL for rxBufferFlush()
SamClarke 0:5b4bcbd69509 22 MODSERIAL pc(USBTX,USBRX);
SamClarke 0:5b4bcbd69509 23
SamClarke 0:5b4bcbd69509 24 DigitalOut myled1(LED1);
SamClarke 0:5b4bcbd69509 25 DigitalOut myled2(LED2);
SamClarke 0:5b4bcbd69509 26 DigitalOut myled3(LED3);
SamClarke 0:5b4bcbd69509 27 DigitalOut myled4(LED4);
SamClarke 0:5b4bcbd69509 28
SamClarke 0:5b4bcbd69509 29 void led_thread(void const *argument) // Some light jazz in a thread
SamClarke 0:5b4bcbd69509 30 {
SamClarke 0:5b4bcbd69509 31 while (true) {
SamClarke 0:5b4bcbd69509 32 DigitalOut leds[4] = {myled1, myled2, myled3, myled4};
SamClarke 0:5b4bcbd69509 33 int pattern[6][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}};
SamClarke 0:5b4bcbd69509 34 int i=0;
SamClarke 0:5b4bcbd69509 35 while(1) {
SamClarke 0:5b4bcbd69509 36 leds[0] = pattern[i][0];
SamClarke 0:5b4bcbd69509 37 leds[1] = pattern[i][1];
SamClarke 0:5b4bcbd69509 38 leds[2] = pattern[i][2];
SamClarke 0:5b4bcbd69509 39 leds[3] = pattern[i][3];
SamClarke 0:5b4bcbd69509 40 wait(0.2);
SamClarke 0:5b4bcbd69509 41 i++;
SamClarke 0:5b4bcbd69509 42 i == 6? i=0:0;
SamClarke 0:5b4bcbd69509 43 }
SamClarke 0:5b4bcbd69509 44 }
SamClarke 0:5b4bcbd69509 45 }
SamClarke 0:5b4bcbd69509 46
SamClarke 0:5b4bcbd69509 47 void sendSms()
SamClarke 0:5b4bcbd69509 48 {
SamClarke 0:5b4bcbd69509 49 // Set message mode to ASCII
SamClarke 0:5b4bcbd69509 50 GPRS.printf("AT+CMGF=1\r\n");
SamClarke 0:5b4bcbd69509 51 wait(1);
SamClarke 0:5b4bcbd69509 52 // Set the phone number
SamClarke 7:db9226b9b037 53 GPRS.printf("AT+CMGS=\"+%s\"\r\n", NUMBER);
SamClarke 0:5b4bcbd69509 54 wait(1);
SamClarke 0:5b4bcbd69509 55 // Write out the GPS data in a message
SamClarke 0:5b4bcbd69509 56 GPRS.printf("Time: %4.2f \nAltitude: %3.2fm\nSpeed: %3.2f Kn\nHeading: %3.2f Deg\nValidity: %c\nFix: %s\nSatellites: %d", gps.time, gps.altitude, gps.speed, gps.heading,gps.validity,gps.fixtype,gps.satellites);
SamClarke 0:5b4bcbd69509 57 wait(1);
SamClarke 0:5b4bcbd69509 58 // Send it...
SamClarke 0:5b4bcbd69509 59 GPRS.putc(0x1A);
SamClarke 0:5b4bcbd69509 60 wait(3);
SamClarke 0:5b4bcbd69509 61 GPRS.printf("AT+CMGF=1\r\n");
SamClarke 0:5b4bcbd69509 62 wait(1);
SamClarke 7:db9226b9b037 63 GPRS.printf("AT+CMGS=\"+%s\"\r\n", NUMBER);
SamClarke 0:5b4bcbd69509 64 wait(1);
SamClarke 0:5b4bcbd69509 65 GPRS.printf("Find me at....\n %s%f,%f%s", GoogleChunk, gps.latitude, gps.longitude, GoogleExtras);
SamClarke 0:5b4bcbd69509 66 wait(1);
SamClarke 0:5b4bcbd69509 67 GPRS.putc(0x1A);
SamClarke 3:a5df4bd224ad 68 wait(1);
SamClarke 0:5b4bcbd69509 69 }
SamClarke 0:5b4bcbd69509 70
SamClarke 0:5b4bcbd69509 71 void parseSms()
SamClarke 0:5b4bcbd69509 72 {
SamClarke 0:5b4bcbd69509 73 // If theres a char waiting in the MODSERIAL buffer
SamClarke 0:5b4bcbd69509 74 while (GPRS.readable()) {
SamClarke 0:5b4bcbd69509 75 // Assign it to 'c'
SamClarke 0:5b4bcbd69509 76 char c = GPRS.getc();
SamClarke 0:5b4bcbd69509 77 // Replace all returns and or line endings with money!
SamClarke 0:5b4bcbd69509 78 if (c == '\r' || c == '\n') c = '$';
SamClarke 0:5b4bcbd69509 79 // Put it in the array
SamClarke 0:5b4bcbd69509 80 GPRSbuffer[i] = c;
SamClarke 0:5b4bcbd69509 81 // Repeat if possible
SamClarke 0:5b4bcbd69509 82 i++;
SamClarke 0:5b4bcbd69509 83 }
SamClarke 0:5b4bcbd69509 84 // Uncomment the following to debug
SamClarke 7:db9226b9b037 85 //pc.printf("\nbuffer = %s", GPRSbuffer);
SamClarke 0:5b4bcbd69509 86
SamClarke 0:5b4bcbd69509 87 // If we get an SMS notification....
SamClarke 0:5b4bcbd69509 88 if (sscanf(GPRSbuffer, "$$+CMTI: \"SM\",%d", &index)>0) {
SamClarke 7:db9226b9b037 89 i=0;
SamClarke 1:00c7dc0c1761 90 pc.printf("\nSMS recieved @ index [%d]", index);
SamClarke 7:db9226b9b037 91 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 92 i = 0;
SamClarke 7:db9226b9b037 93 GPRS.printf("AT+CMGR=%d\r\n", index);
SamClarke 7:db9226b9b037 94 wait(1);
SamClarke 7:db9226b9b037 95 }
SamClarke 7:db9226b9b037 96
SamClarke 7:db9226b9b037 97 if (strncmp(GPRSbuffer, "$$+CMGR",7) == 0 ) {
SamClarke 7:db9226b9b037 98 for (int k = 24; k < 35; k++) {
SamClarke 7:db9226b9b037 99 NUMBER[k-24] = GPRSbuffer[k];
SamClarke 7:db9226b9b037 100 }
SamClarke 7:db9226b9b037 101 for (int k = 64; k < 68; k++) {
SamClarke 7:db9226b9b037 102 MESSAGE[k-64] = GPRSbuffer[k];
SamClarke 7:db9226b9b037 103 }
SamClarke 0:5b4bcbd69509 104 sendSms();
SamClarke 7:db9226b9b037 105 //wait(4);
SamClarke 0:5b4bcbd69509 106 // Reset the GPRS buffer
SamClarke 0:5b4bcbd69509 107 memset(GPRSbuffer, '0', 512);
SamClarke 0:5b4bcbd69509 108 // Reset the char counter
SamClarke 0:5b4bcbd69509 109 i = 0;
SamClarke 7:db9226b9b037 110 }
SamClarke 7:db9226b9b037 111
SamClarke 7:db9226b9b037 112 if (strncmp(GPRSbuffer, "$$+CMGS",7) == 0) {
SamClarke 7:db9226b9b037 113 // Reset the GPRS buffer
SamClarke 7:db9226b9b037 114 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 115 // Reset the char counter
SamClarke 7:db9226b9b037 116 i = 0;
SamClarke 7:db9226b9b037 117 }
SamClarke 7:db9226b9b037 118
SamClarke 7:db9226b9b037 119 if (strncmp(GPRSbuffer, "$$RING",6) == 0) {
SamClarke 7:db9226b9b037 120 //dump = "fixed";
SamClarke 7:db9226b9b037 121 GPRS.printf("ATH0\r\n");
SamClarke 3:a5df4bd224ad 122 wait(1);
SamClarke 5:3a42b208ac4e 123 // Flush any incoming rings in the MODSERIAL buffer
SamClarke 3:a5df4bd224ad 124 GPRS.rxBufferFlush();
SamClarke 3:a5df4bd224ad 125 pc.printf("\nCall recieved");
SamClarke 3:a5df4bd224ad 126 // Do the send SMS routine...
SamClarke 3:a5df4bd224ad 127 sendSms();
SamClarke 5:3a42b208ac4e 128 // Wait for the cascade of [\r\nOK\r\n][\r\nOK\r\n]'s from the SMS's to finish
SamClarke 7:db9226b9b037 129 //wait(4);
SamClarke 3:a5df4bd224ad 130 // Flush out any left in the serial buffer
SamClarke 4:0e55a4620f5e 131 GPRS.rxBufferFlush();
SamClarke 3:a5df4bd224ad 132 // Reset the GPRS buffer
SamClarke 4:0e55a4620f5e 133 memset(GPRSbuffer, '0', 512);
SamClarke 3:a5df4bd224ad 134 // Reset the char counter
SamClarke 4:0e55a4620f5e 135 i = 0;
SamClarke 1:00c7dc0c1761 136 }
SamClarke 7:db9226b9b037 137
SamClarke 7:db9226b9b037 138 // Reset the GPRS buffer
SamClarke 7:db9226b9b037 139 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 140 // Reset the char counter
SamClarke 7:db9226b9b037 141 i = 0;
SamClarke 7:db9226b9b037 142 pc.printf("\nWaiting for SMS or call...\n");
SamClarke 7:db9226b9b037 143 pc.printf("\nThe last number was :+%s", NUMBER);
SamClarke 7:db9226b9b037 144 pc.printf("\nThe last message was :%s", MESSAGE);
SamClarke 0:5b4bcbd69509 145 }
SamClarke 0:5b4bcbd69509 146
SamClarke 0:5b4bcbd69509 147 int main()
SamClarke 0:5b4bcbd69509 148 {
SamClarke 0:5b4bcbd69509 149 pc.baud(115200);
SamClarke 0:5b4bcbd69509 150 GPRS.baud(19200);
SamClarke 0:5b4bcbd69509 151 Thread thread(led_thread);
SamClarke 5:3a42b208ac4e 152 memset(GPRSbuffer, '0', 512);
SamClarke 0:5b4bcbd69509 153 pc.printf("I'm Alive...\n");
SamClarke 0:5b4bcbd69509 154 // Setup the GPS
SamClarke 0:5b4bcbd69509 155 gps.Init();
SamClarke 0:5b4bcbd69509 156 // Set the GPRS AT echo off
SamClarke 0:5b4bcbd69509 157 GPRS.printf("ATE0\r\n");
SamClarke 0:5b4bcbd69509 158 pc.printf("GPRS Echo OFF\n");
SamClarke 0:5b4bcbd69509 159 wait(1);
SamClarke 0:5b4bcbd69509 160 // Delete all messages on the sim card
SamClarke 0:5b4bcbd69509 161 GPRS.printf("AT+CMGDA=\"DEL ALL\"\r\n");
SamClarke 0:5b4bcbd69509 162 wait(1);
SamClarke 0:5b4bcbd69509 163 pc.printf("Messages Cleared...\n");
SamClarke 0:5b4bcbd69509 164 wait(1);
SamClarke 0:5b4bcbd69509 165 // Flush out any \r\nOK\r\n's
SamClarke 0:5b4bcbd69509 166 GPRS.rxBufferFlush();
SamClarke 0:5b4bcbd69509 167 // Get in a while loop
SamClarke 0:5b4bcbd69509 168 while (1) {
SamClarke 0:5b4bcbd69509 169 // Process any recieved data
SamClarke 0:5b4bcbd69509 170 parseSms();
SamClarke 0:5b4bcbd69509 171 // Process / check GPS data
SamClarke 3:a5df4bd224ad 172 gps.parseData();
SamClarke 0:5b4bcbd69509 173 }
SamClarke 0:5b4bcbd69509 174 }