Nicolás Villegas Echavarría / GPSGSM

Fork of GPS7 by Gustavo Ramirez

Committer:
NicolasV
Date:
Fri Jun 09 19:37:02 2017 +0000
Revision:
3:8ad6d84b1b60
Parent:
2:8d7c7165ffe2
Tarea 6: Procesadores;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:15611c7938a3 1 #include "GPS.h"
simon 0:15611c7938a3 2
simon 0:15611c7938a3 3 GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) {
tony63 1:df8295aa2b2b 4 _gps.baud(9600);
simon 0:15611c7938a3 5 longitude = 0.0;
simon 0:15611c7938a3 6 latitude = 0.0;
simon 0:15611c7938a3 7 }
simon 0:15611c7938a3 8
simon 0:15611c7938a3 9 int GPS::sample() {
simon 0:15611c7938a3 10 float time;
NicolasV 3:8ad6d84b1b60 11 float deg_lat, deg_lon, min_lat, min_lon;
simon 0:15611c7938a3 12 char ns, ew;
simon 0:15611c7938a3 13 int lock;
simon 0:15611c7938a3 14
NicolasV 3:8ad6d84b1b60 15 while(true) {
simon 0:15611c7938a3 16 getline();
simon 0:15611c7938a3 17 if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) {
NicolasV 3:8ad6d84b1b60 18 if(!lock) {
simon 0:15611c7938a3 19 longitude = 0.0;
simon 0:15611c7938a3 20 latitude = 0.0;
simon 0:15611c7938a3 21 return 0;
tony63 2:8d7c7165ffe2 22 }
NicolasV 3:8ad6d84b1b60 23 else {
NicolasV 3:8ad6d84b1b60 24 if(ns == 'S') { latitude *= -1.0; }
NicolasV 3:8ad6d84b1b60 25 if(ew == 'W') { longitude *= -1.0; }
NicolasV 3:8ad6d84b1b60 26 latitude = (latitude / 100.0f);
tony63 2:8d7c7165ffe2 27 longitude = (longitude / 100.0f);
NicolasV 3:8ad6d84b1b60 28 deg_lat = trunc(latitude);
NicolasV 3:8ad6d84b1b60 29 deg_lon = trunc(longitude);
NicolasV 3:8ad6d84b1b60 30 min_lat = (latitude - deg_lat);
NicolasV 3:8ad6d84b1b60 31 min_lon = (longitude - deg_lon);
NicolasV 3:8ad6d84b1b60 32 latitude = deg_lat + min_lat / 60.0f * 100.0f;
NicolasV 3:8ad6d84b1b60 33 longitude = deg_lon + min_lon / 60.0f * 100.0f;
simon 0:15611c7938a3 34 return 1;
simon 0:15611c7938a3 35 }
simon 0:15611c7938a3 36 }
simon 0:15611c7938a3 37 }
simon 0:15611c7938a3 38 }
simon 0:15611c7938a3 39
simon 0:15611c7938a3 40 float GPS::trunc(float v) {
simon 0:15611c7938a3 41 if(v < 0.0) {
simon 0:15611c7938a3 42 v*= -1.0;
simon 0:15611c7938a3 43 v = floor(v);
simon 0:15611c7938a3 44 v*=-1.0;
NicolasV 3:8ad6d84b1b60 45 }
NicolasV 3:8ad6d84b1b60 46 else {
simon 0:15611c7938a3 47 v = floor(v);
simon 0:15611c7938a3 48 }
simon 0:15611c7938a3 49 return v;
simon 0:15611c7938a3 50 }
NicolasV 3:8ad6d84b1b60 51
simon 0:15611c7938a3 52 void GPS::getline() {
NicolasV 3:8ad6d84b1b60 53 while(_gps.getc() != '$');
NicolasV 3:8ad6d84b1b60 54 for(int i = 0; i < 256; i++) {
simon 0:15611c7938a3 55 msg[i] = _gps.getc();
simon 0:15611c7938a3 56 if(msg[i] == '\r') {
simon 0:15611c7938a3 57 msg[i] = 0;
simon 0:15611c7938a3 58 return;
simon 0:15611c7938a3 59 }
simon 0:15611c7938a3 60 }
simon 0:15611c7938a3 61 error("Overflowed message limit");
simon 0:15611c7938a3 62 }