nothing
Dependents: mbed-os-example-mbed5-wifi
Revision 0:81d4b52c0083, committed 2021-01-15
- Comitter:
- ctlee
- Date:
- Fri Jan 15 13:21:24 2021 +0000
- Commit message:
- nothing
Changed in this revision
stm32l475e_iot01_gps.cpp | Show annotated file Show diff for this revision Revisions of this file |
stm32l475e_iot01_gps.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stm32l475e_iot01_gps.cpp Fri Jan 15 13:21:24 2021 +0000 @@ -0,0 +1,171 @@ + +#include "stm32l475e_iot01_gps.h" +#include <stdio.h> +#include <string.h> + +Serial pc1(USBTX, USBRX); + +GPS::GPS(PinName tx, PinName rx) : _gps(tx, rx) { + _gps.baud(9600); + + longitude = 0.0; + latitude = 0.0; + ns = 'N'; + ew = 'E'; + alt = 0.0; + +} + +int GPS::sample() { + float time, knots, angle, mag, mag_angle; + int date, checksum; + + char lock; + + while(1) { + getline(); + // Check if it is a GPGGA msg (matches both locked and non-locked msg) + //pc1.printf(msg); + pc1.printf("\n"); + wait(5); + pc1.printf("display msg\r\n"); + pc1.printf(msg); + pc1.printf("\n"); + if(sscanf(msg, "GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,%f,%f*%d", &time, &lock, &latitude, &ns, &longitude, &ew, &knots, &angle, &date, &mag, &mag_angle, &checksum) >= 1) { + if(lock=='V') { + pc1.printf("not valid!!!!!!!\n"); + longitude = 0.0; + latitude = 0.0; + ns = 'Z'; + ew = 'Z'; + date =0; + return 0; + } else { + //if(ns == 'S') { latitude *= -1.0; } +// if(ew == 'W') { longitude *= -1.0; } +// float degrees = trunc(latitude / 100.0f); +// float minutes = latitude - (degrees * 100.0f); +// latitude = degrees + minutes / 60.0f; +// degrees = trunc(longitude / 100.0f * 0.01f); +// minutes = longitude - (degrees * 100.0f); +// longitude = degrees + minutes / 60.0f; +// pc1.printf(msg); + pc1.printf("\n\rlongitude is %f\n\r", longitude); + pc1.printf("\n\rtime is %f\n\r", time); + pc1.printf("ns is %c\n\r", ns); + pc1.printf("ew is %c\n\r", ew); + pc1.printf("alt is %d\n\r", date); + + latitude /= 100; + longitude /= 100; + + return 1; + } + + } + return 0; + } +} + +float GPS::trunc(float v) { + if(v < 0.0) { + v*= -1.0; + v = floor(v); + v*=-1.0; + } else { + v = floor(v); + } + return v; +} + +void GPS::getline() { + int i; + char a; + int n; + while(1) { + memset(msg, '\0', sizeof(msg)); + pc1.printf("\r\n\n New Message: "); + pc1.printf(msg); + pc1.printf("\r\n\n"); + i = 0; + pc1.printf("waiting...\n"); + a = _gps.getc(); + msg[i] = a; + if (a == '$') { + pc1.printf("%c",a); + msg[i]=a; + a = _gps.getc(); + while(a!='$'){ + msg[i] = a; + i++; + printf("%c",a); + a = _gps.getc(); + } + return; +// msg[i] = a; +// i++; +// if (a == 'G') { +// pc1.printf("%c",a); +// a = _gps.getc(); +// msg[i] = a; +// i++; +// if (a == 'P') { +// pc1.printf("%c",a); +// a = _gps.getc(); +// msg[i] = a; +// i++; +// if (a == 'R') { +// pc1.printf("%c",a); +// a = _gps.getc(); +// msg[i] = a; +// i++; +// if (a == 'M') { +// pc1.printf("%c",a); +// a = _gps.getc(); +// msg[i] = a; +// i++; +// if (a == 'C') { +// pc1.printf("%c",a); +// a = _gps.getc(); +// msg[i] = a; +// pc1.printf(msg); +// pc1.printf("\r\n"); +// +// for (n = 5; n < 456; n++) { +// msg[n] = _gps.getc(); +// pc1.printf("%c", msg[n]); +// if(msg[n] == '\r') { +// msg[n] = '0'; +// return; +// } +// } +// } +// } +// } +// } +// } + } +// while(_gps.getc() != '$') { +// //char a = _gps.getc(); +// for(i = 0; i < 256; i++) { +// msg[i] = _gps.getc(); +// pc1.printf("%c", msg[i]); +// if(msg[i] == '\r') { +// msg[i] = 0; +// return; +// } +// } +// +// +// } +// while(_gps.getc() != '$'); // wait for the start of a line +// for(int i=0; i<256; i++) { +// msg[i] = _gps.getc(); +// if(msg[i] == '\r') { +// msg[i] = 0; +// return; +// } +// } +// error("Overflowed message limit"); +} +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stm32l475e_iot01_gps.h Fri Jan 15 13:21:24 2021 +0000 @@ -0,0 +1,43 @@ + +#include "mbed.h" + +#ifndef __STM32L475E_IOT01_GPS_H +#define __STM32L475E_IOT01_GPS_H + +/** A GPS interface for reading from a Globalsat EM-406 GPS Module */ +class GPS { +public: + + /** Create the GPS interface, connected to the specified serial port + */ + GPS(PinName tx, PinName rx); + + /** Sample the incoming GPS data, returning whether there is a lock + * + * @return 1 if there was a lock when the sample was taken (and therefore .longitude and .latitude are valid), else 0 + */ + int sample(); + + /** The longitude (call sample() to set) */ + float longitude; + + /** The latitude (call sample() to set) */ + float latitude; + + int num_sat; + float hori_dilute; + float alt; + float geoid, time; + char ns, ew; + char gu, hu; + +private: + float trunc(float v); + void getline(); + + Serial _gps; + char msg[256]; + +}; + +#endif \ No newline at end of file