GPS-library with some changes
Dependents: GPSXbee GPSXbee_1_1 GPSXbee_1_0 GPSXbeeCamera_1_0
Fork of GPS by
GPS.cpp@6:4e2a078995df, 2014-07-04 (annotated)
- Committer:
- Deurklink
- Date:
- Fri Jul 04 09:51:19 2014 +0000
- Revision:
- 6:4e2a078995df
- Parent:
- 4:85068b8c3f50
-
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SamClarke | 1:0a034c2dbea6 | 1 | #include "GPS.h" |
SamClarke | 1:0a034c2dbea6 | 2 | |
Deurklink | 6:4e2a078995df | 3 | GPS::GPS(PinName tx, PinName rx) : |
Deurklink | 6:4e2a078995df | 4 | time(0), |
Deurklink | 6:4e2a078995df | 5 | hours(0), |
Deurklink | 6:4e2a078995df | 6 | minutes(0), |
Deurklink | 6:4e2a078995df | 7 | seconds(0), |
Deurklink | 6:4e2a078995df | 8 | latitude(0), |
Deurklink | 6:4e2a078995df | 9 | longitude(0), |
Deurklink | 6:4e2a078995df | 10 | speed(0), |
Deurklink | 6:4e2a078995df | 11 | heading(0), |
Deurklink | 6:4e2a078995df | 12 | date(0), |
Deurklink | 6:4e2a078995df | 13 | fixtype(0), |
Deurklink | 6:4e2a078995df | 14 | satellites(0), |
Deurklink | 6:4e2a078995df | 15 | altitude(0), |
Deurklink | 6:4e2a078995df | 16 | _UltimateGps(tx, rx) |
SamClarke | 1:0a034c2dbea6 | 17 | { |
SamClarke | 1:0a034c2dbea6 | 18 | _UltimateGps.baud(9600); |
SamClarke | 1:0a034c2dbea6 | 19 | } |
SamClarke | 1:0a034c2dbea6 | 20 | |
SamClarke | 1:0a034c2dbea6 | 21 | int GPS::parseData() |
SamClarke | 1:0a034c2dbea6 | 22 | { |
SamClarke | 1:0a034c2dbea6 | 23 | |
SamClarke | 1:0a034c2dbea6 | 24 | while(1) { |
SamClarke | 1:0a034c2dbea6 | 25 | getData(); |
SamClarke | 1:0a034c2dbea6 | 26 | if(sscanf(NEMA, "GPGGA, %*f, %*f, %*c, %*f, %*c, %d, %d, %*f, %f", &fixtype, &satellites, &altitude) >=1); |
SamClarke | 2:dcc14e81f8be | 27 | if(sscanf(NEMA, "GPRMC, %2d%2d%f, %c, %f, %c, %f, %c, %f, %f, %d", &hours, &minutes, &seconds, &validity, &latitude, &ns, &longitude, &ew, &speed, &heading, &date) >=1) { |
SamClarke | 1:0a034c2dbea6 | 28 | if(fixtype == 0) { |
SamClarke | 1:0a034c2dbea6 | 29 | return 0; |
SamClarke | 1:0a034c2dbea6 | 30 | } |
SamClarke | 1:0a034c2dbea6 | 31 | if(ns =='S') { |
SamClarke | 1:0a034c2dbea6 | 32 | latitude *= -1.0; |
SamClarke | 1:0a034c2dbea6 | 33 | } |
SamClarke | 1:0a034c2dbea6 | 34 | if(ew =='W') { |
SamClarke | 1:0a034c2dbea6 | 35 | longitude *= -1.0; |
SamClarke | 1:0a034c2dbea6 | 36 | } |
SamClarke | 1:0a034c2dbea6 | 37 | float degrees = trunc(latitude / 100.0f); |
SamClarke | 1:0a034c2dbea6 | 38 | float minutes = latitude - (degrees * 100.0f); |
SamClarke | 1:0a034c2dbea6 | 39 | latitude = degrees + minutes / 60.0f; |
SamClarke | 1:0a034c2dbea6 | 40 | degrees = trunc(longitude / 100.0f); |
SamClarke | 1:0a034c2dbea6 | 41 | minutes = longitude - (degrees * 100.0f); |
SamClarke | 1:0a034c2dbea6 | 42 | longitude = degrees + minutes / 60.0f; |
SamClarke | 3:5cb504ce2793 | 43 | kph = speed*1.852; |
SamClarke | 1:0a034c2dbea6 | 44 | return 1; |
SamClarke | 1:0a034c2dbea6 | 45 | } |
SamClarke | 1:0a034c2dbea6 | 46 | } |
SamClarke | 1:0a034c2dbea6 | 47 | } |
SamClarke | 1:0a034c2dbea6 | 48 | |
SamClarke | 1:0a034c2dbea6 | 49 | |
SamClarke | 1:0a034c2dbea6 | 50 | float GPS::trunc(float v) |
SamClarke | 1:0a034c2dbea6 | 51 | { |
SamClarke | 1:0a034c2dbea6 | 52 | if(v < 0.0) { |
SamClarke | 1:0a034c2dbea6 | 53 | v*= -1.0; |
SamClarke | 1:0a034c2dbea6 | 54 | v = floor(v); |
SamClarke | 1:0a034c2dbea6 | 55 | v*=-1.0; |
SamClarke | 1:0a034c2dbea6 | 56 | } else { |
SamClarke | 1:0a034c2dbea6 | 57 | v = floor(v); |
SamClarke | 1:0a034c2dbea6 | 58 | } |
SamClarke | 1:0a034c2dbea6 | 59 | return v; |
SamClarke | 1:0a034c2dbea6 | 60 | } |
SamClarke | 1:0a034c2dbea6 | 61 | |
SamClarke | 1:0a034c2dbea6 | 62 | void GPS::getData() |
SamClarke | 1:0a034c2dbea6 | 63 | { |
SamClarke | 1:0a034c2dbea6 | 64 | while(_UltimateGps.getc() != '$'); |
SamClarke | 1:0a034c2dbea6 | 65 | for(int i=0; i<256; i++) { |
SamClarke | 1:0a034c2dbea6 | 66 | NEMA[i] = _UltimateGps.getc(); |
SamClarke | 1:0a034c2dbea6 | 67 | if(NEMA[i] == '\r') { |
SamClarke | 1:0a034c2dbea6 | 68 | NEMA[i] = 0; |
SamClarke | 1:0a034c2dbea6 | 69 | return; |
SamClarke | 1:0a034c2dbea6 | 70 | } |
SamClarke | 1:0a034c2dbea6 | 71 | } |
SamClarke | 1:0a034c2dbea6 | 72 | error("overflowed message limit"); |
SamClarke | 1:0a034c2dbea6 | 73 | } |
SamClarke | 1:0a034c2dbea6 | 74 | |
SamClarke | 1:0a034c2dbea6 | 75 | void GPS::Init() |
SamClarke | 1:0a034c2dbea6 | 76 | { |
Deurklink | 4:85068b8c3f50 | 77 | _UltimateGps.printf("$PMTK220,1000*1F\r\n"); |
SamClarke | 1:0a034c2dbea6 | 78 | wait(1); |
SamClarke | 1:0a034c2dbea6 | 79 | _UltimateGps.printf("$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"); |
SamClarke | 1:0a034c2dbea6 | 80 | wait(1); |
SamClarke | 1:0a034c2dbea6 | 81 | } |
Deurklink | 6:4e2a078995df | 82 | |
Deurklink | 6:4e2a078995df | 83 | |
Deurklink | 6:4e2a078995df | 84 | bool GPS::readable() |
Deurklink | 6:4e2a078995df | 85 | { |
Deurklink | 6:4e2a078995df | 86 | if (_UltimateGps.readable()) |
Deurklink | 6:4e2a078995df | 87 | return true; |
Deurklink | 6:4e2a078995df | 88 | else |
Deurklink | 6:4e2a078995df | 89 | return false; |
Deurklink | 6:4e2a078995df | 90 | } |
Deurklink | 6:4e2a078995df | 91 |