gps code
Dependencies: 4DGL-uLCD-SE mbed
main.cpp@0:a063a20f5d24, 2015-04-20 (annotated)
- Committer:
- ottaviano3
- Date:
- Mon Apr 20 18:52:03 2015 +0000
- Revision:
- 0:a063a20f5d24
Perfect gps code
Who changed what in which revision?
User | Revision | Line number | New 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, °rees); |
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, °rees); |
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 | } |