programa para leer un GPS desde la FRDMKL25Z
Dependents: pruebagps rastreador_satelital_2 ELJPGTarea_6
Fork of GPS by
GPS.cpp@1:653fe36ca211, 2014-06-06 (annotated)
- Committer:
- tony63
- Date:
- Fri Jun 06 04:04:46 2014 +0000
- Revision:
- 1:653fe36ca211
- Parent:
- 0:15611c7938a3
programa para leer un GPD desde la FRDMKL25Z
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tony63 | 1:653fe36ca211 | 1 | |
simon | 0:15611c7938a3 | 2 | |
simon | 0:15611c7938a3 | 3 | #include "GPS.h" |
simon | 0:15611c7938a3 | 4 | |
simon | 0:15611c7938a3 | 5 | GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) { |
tony63 | 1:653fe36ca211 | 6 | _gps.baud(9600); |
simon | 0:15611c7938a3 | 7 | longitude = 0.0; |
simon | 0:15611c7938a3 | 8 | latitude = 0.0; |
simon | 0:15611c7938a3 | 9 | } |
simon | 0:15611c7938a3 | 10 | |
simon | 0:15611c7938a3 | 11 | int GPS::sample() { |
simon | 0:15611c7938a3 | 12 | float time; |
simon | 0:15611c7938a3 | 13 | char ns, ew; |
simon | 0:15611c7938a3 | 14 | int lock; |
simon | 0:15611c7938a3 | 15 | |
simon | 0:15611c7938a3 | 16 | while(1) { |
simon | 0:15611c7938a3 | 17 | getline(); |
simon | 0:15611c7938a3 | 18 | |
tony63 | 1:653fe36ca211 | 19 | // Chequear si en una trama GPGGA msg |
simon | 0:15611c7938a3 | 20 | if(sscanf(msg, "GPGGA,%f,%f,%c,%f,%c,%d", &time, &latitude, &ns, &longitude, &ew, &lock) >= 1) { |
tony63 | 1:653fe36ca211 | 21 | |
simon | 0:15611c7938a3 | 22 | if(ns == 'S') { latitude *= -1.0; } |
simon | 0:15611c7938a3 | 23 | if(ew == 'W') { longitude *= -1.0; } |
simon | 0:15611c7938a3 | 24 | float degrees = trunc(latitude / 100.0f); |
simon | 0:15611c7938a3 | 25 | float minutes = latitude - (degrees * 100.0f); |
simon | 0:15611c7938a3 | 26 | latitude = degrees + minutes / 60.0f; |
simon | 0:15611c7938a3 | 27 | degrees = trunc(longitude / 100.0f * 0.01f); |
simon | 0:15611c7938a3 | 28 | minutes = longitude - (degrees * 100.0f); |
simon | 0:15611c7938a3 | 29 | longitude = degrees + minutes / 60.0f; |
simon | 0:15611c7938a3 | 30 | return 1; |
tony63 | 1:653fe36ca211 | 31 | |
simon | 0:15611c7938a3 | 32 | } |
simon | 0:15611c7938a3 | 33 | } |
simon | 0:15611c7938a3 | 34 | } |
simon | 0:15611c7938a3 | 35 | |
simon | 0:15611c7938a3 | 36 | float GPS::trunc(float v) { |
simon | 0:15611c7938a3 | 37 | if(v < 0.0) { |
simon | 0:15611c7938a3 | 38 | v*= -1.0; |
tony63 | 1:653fe36ca211 | 39 | v = floor(v); //floor devuelve el entero mas grande no mayor a v |
simon | 0:15611c7938a3 | 40 | v*=-1.0; |
simon | 0:15611c7938a3 | 41 | } else { |
simon | 0:15611c7938a3 | 42 | v = floor(v); |
simon | 0:15611c7938a3 | 43 | } |
simon | 0:15611c7938a3 | 44 | return v; |
simon | 0:15611c7938a3 | 45 | } |
simon | 0:15611c7938a3 | 46 | |
simon | 0:15611c7938a3 | 47 | void GPS::getline() { |
tony63 | 1:653fe36ca211 | 48 | while(_gps.getc() != '$'); // coje todo menos $ |
simon | 0:15611c7938a3 | 49 | for(int i=0; i<256; i++) { |
tony63 | 1:653fe36ca211 | 50 | msg[i] = _gps.getc(); //lo va gravando en la cadena msg[ ] |
tony63 | 1:653fe36ca211 | 51 | if(msg[i] == '\r') { // si se encuentra retorno de carro le pone el null |
simon | 0:15611c7938a3 | 52 | msg[i] = 0; |
tony63 | 1:653fe36ca211 | 53 | return; |
simon | 0:15611c7938a3 | 54 | } |
simon | 0:15611c7938a3 | 55 | } |
simon | 0:15611c7938a3 | 56 | error("Overflowed message limit"); |
simon | 0:15611c7938a3 | 57 | } |