gps code

Dependencies:   4DGL-uLCD-SE mbed

Committer:
ottaviano3
Date:
Mon Apr 20 18:52:03 2015 +0000
Revision:
0:a063a20f5d24
Perfect gps code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ottaviano3 0:a063a20f5d24 1 #include "mbed.h"
ottaviano3 0:a063a20f5d24 2 #include <iostream>
ottaviano3 0:a063a20f5d24 3
ottaviano3 0:a063a20f5d24 4 Serial pc(p9,p10);
ottaviano3 0:a063a20f5d24 5
ottaviano3 0:a063a20f5d24 6 Serial gps(p28, p27);
ottaviano3 0:a063a20f5d24 7
ottaviano3 0:a063a20f5d24 8 DigitalIn button(p21);
ottaviano3 0:a063a20f5d24 9
ottaviano3 0:a063a20f5d24 10 void getline();
ottaviano3 0:a063a20f5d24 11
ottaviano3 0:a063a20f5d24 12 char gpsmsg[256];
ottaviano3 0:a063a20f5d24 13
ottaviano3 0:a063a20f5d24 14 int main()
ottaviano3 0:a063a20f5d24 15 {
ottaviano3 0:a063a20f5d24 16 while(1) {
ottaviano3 0:a063a20f5d24 17
ottaviano3 0:a063a20f5d24 18 // Flush output buffer
ottaviano3 0:a063a20f5d24 19 char char1;
ottaviano3 0:a063a20f5d24 20 while (pc.readable()) {
ottaviano3 0:a063a20f5d24 21 char1 = pc.getc();
ottaviano3 0:a063a20f5d24 22 }
ottaviano3 0:a063a20f5d24 23
ottaviano3 0:a063a20f5d24 24 char nodeid[4] = "190";
ottaviano3 0:a063a20f5d24 25 float altitude;
ottaviano3 0:a063a20f5d24 26
ottaviano3 0:a063a20f5d24 27 char startkey[12] = "SentinelOn";
ottaviano3 0:a063a20f5d24 28 char endkey[13] = "SentinelOff";
ottaviano3 0:a063a20f5d24 29 char buffer[30];
ottaviano3 0:a063a20f5d24 30 char ns, ew;
ottaviano3 0:a063a20f5d24 31 int lock;
ottaviano3 0:a063a20f5d24 32 int satsused;
ottaviano3 0:a063a20f5d24 33 float hdop;
ottaviano3 0:a063a20f5d24 34 float latitude, longitude;
ottaviano3 0:a063a20f5d24 35
ottaviano3 0:a063a20f5d24 36 float time;
ottaviano3 0:a063a20f5d24 37
ottaviano3 0:a063a20f5d24 38 gps.baud(4800);
ottaviano3 0:a063a20f5d24 39
ottaviano3 0:a063a20f5d24 40 do {
ottaviano3 0:a063a20f5d24 41 if (pc.readable() == true) {
ottaviano3 0:a063a20f5d24 42 // Get bytes from computer
ottaviano3 0:a063a20f5d24 43 pc.scanf("%s",buffer);
ottaviano3 0:a063a20f5d24 44 }
ottaviano3 0:a063a20f5d24 45 } while (strcmp( startkey, buffer ) != 0);
ottaviano3 0:a063a20f5d24 46
ottaviano3 0:a063a20f5d24 47 // Flush output buffer
ottaviano3 0:a063a20f5d24 48 while (pc.readable()) {
ottaviano3 0:a063a20f5d24 49 char1 = pc.getc();
ottaviano3 0:a063a20f5d24 50 }
ottaviano3 0:a063a20f5d24 51
ottaviano3 0:a063a20f5d24 52 pc.printf("Sentinel Is On\n");
ottaviano3 0:a063a20f5d24 53
ottaviano3 0:a063a20f5d24 54
ottaviano3 0:a063a20f5d24 55 while(1) {
ottaviano3 0:a063a20f5d24 56 getline();
ottaviano3 0:a063a20f5d24 57 if(sscanf(gpsmsg, "GPGGA,%f,%f,%c,%f,%c,%i,%i,%f,%f", &time, &latitude, &ns, &longitude, &ew, &lock, &satsused, &hdop, &altitude) >= 1) {
ottaviano3 0:a063a20f5d24 58 if((lock != 1) && (lock != 2) && (lock != 6)) {
ottaviano3 0:a063a20f5d24 59 pc.printf("DNLK,%s,NOLOCK\n",nodeid, latitude, longitude, altitude);
ottaviano3 0:a063a20f5d24 60 } else {
ottaviano3 0:a063a20f5d24 61 double degrees;
ottaviano3 0:a063a20f5d24 62 double minutes = modf(latitude/100.0f, &degrees);
ottaviano3 0:a063a20f5d24 63 minutes = (minutes*100.0f)/60.0f;
ottaviano3 0:a063a20f5d24 64 latitude = degrees + minutes;
ottaviano3 0:a063a20f5d24 65
ottaviano3 0:a063a20f5d24 66 minutes = modf(longitude/100.0f, &degrees);
ottaviano3 0:a063a20f5d24 67 minutes = (minutes*100.0f)/60.0f;
ottaviano3 0:a063a20f5d24 68 longitude = degrees + minutes;
ottaviano3 0:a063a20f5d24 69
ottaviano3 0:a063a20f5d24 70 if(ns == 'S') {
ottaviano3 0:a063a20f5d24 71 latitude *= -1.0;
ottaviano3 0:a063a20f5d24 72 }
ottaviano3 0:a063a20f5d24 73 if(ew == 'W') {
ottaviano3 0:a063a20f5d24 74 longitude *= -1.0;
ottaviano3 0:a063a20f5d24 75 }
ottaviano3 0:a063a20f5d24 76 pc.printf("DLIN,%s,%f,%f,%f\n",nodeid, latitude, longitude, altitude);
ottaviano3 0:a063a20f5d24 77 }
ottaviano3 0:a063a20f5d24 78 }
ottaviano3 0:a063a20f5d24 79 if (pc.readable() == true) {
ottaviano3 0:a063a20f5d24 80 pc.scanf("%s",buffer);
ottaviano3 0:a063a20f5d24 81 if (strcmp( endkey, buffer ) != 0) {
ottaviano3 0:a063a20f5d24 82 break;
ottaviano3 0:a063a20f5d24 83 }
ottaviano3 0:a063a20f5d24 84 }
ottaviano3 0:a063a20f5d24 85 }
ottaviano3 0:a063a20f5d24 86 }
ottaviano3 0:a063a20f5d24 87 }
ottaviano3 0:a063a20f5d24 88
ottaviano3 0:a063a20f5d24 89 void getline()
ottaviano3 0:a063a20f5d24 90 {
ottaviano3 0:a063a20f5d24 91 while(gps.getc() != '$'); // wait for the start of a line
ottaviano3 0:a063a20f5d24 92 for(int i=0; i<256; i++) {
ottaviano3 0:a063a20f5d24 93 gpsmsg[i] = gps.getc();
ottaviano3 0:a063a20f5d24 94 if(gpsmsg[i] == '\r') {
ottaviano3 0:a063a20f5d24 95 gpsmsg[i] = 0;
ottaviano3 0:a063a20f5d24 96 return ;
ottaviano3 0:a063a20f5d24 97 }
ottaviano3 0:a063a20f5d24 98 }
ottaviano3 0:a063a20f5d24 99 error("Overflowed message limit");
ottaviano3 0:a063a20f5d24 100 }