Update GPS With Thread---> Receiving data from GPS and parsing latitude and longitude to decimal. Using Ublox-Neo 6M.

Dependencies:   MODSERIAL mbed-rtos mbed-src

Fork of UbloxGPSWithThread by Say Pulung

Committer:
saypulung
Date:
Sun Apr 26 19:05:38 2015 +0000
Revision:
3:dd2e91231e3c
Parent:
2:13ef79e40e45
ReadGPS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 0:ea14ad6794af 1 /*
edodm85 0:ea14ad6794af 2 * Author: Edoardo De Marchi
saypulung 3:dd2e91231e3c 3 * Editor : Say Pulung
saypulung 3:dd2e91231e3c 4 * Country : Indonesia (Lampung)
saypulung 3:dd2e91231e3c 5 * Date: 26-04-15
edodm85 0:ea14ad6794af 6 * Notes: Firmware for GPS U-Blox NEO-6M
edodm85 0:ea14ad6794af 7 */
edodm85 0:ea14ad6794af 8
edodm85 0:ea14ad6794af 9 #include "main.h"
saypulung 2:13ef79e40e45 10 #include "string.h"
saypulung 2:13ef79e40e45 11 #include "rtos.h"
saypulung 3:dd2e91231e3c 12 #include "mbed.h"
saypulung 3:dd2e91231e3c 13 #include <stdint.h>
saypulung 3:dd2e91231e3c 14 #include <math.h>
saypulung 3:dd2e91231e3c 15 #include <ctype.h>
saypulung 3:dd2e91231e3c 16 uint8_t hour, minute, seconds, year, month, day;
saypulung 3:dd2e91231e3c 17 uint16_t milliseconds;
saypulung 3:dd2e91231e3c 18 float latitude, longitude, geoidheight, altitude;
saypulung 3:dd2e91231e3c 19 float speed, angle, magvariation, HDOP;
saypulung 3:dd2e91231e3c 20 char lat, lon, mag;
saypulung 3:dd2e91231e3c 21 bool fix;
saypulung 3:dd2e91231e3c 22 float trunc(float v) {
saypulung 3:dd2e91231e3c 23 if(v < 0.0) {
saypulung 3:dd2e91231e3c 24 v*= -1.0;
saypulung 3:dd2e91231e3c 25 v = floor(v);
saypulung 3:dd2e91231e3c 26 v*=-1.0;
saypulung 3:dd2e91231e3c 27 } else {
saypulung 3:dd2e91231e3c 28 v = floor(v);
saypulung 3:dd2e91231e3c 29 }
saypulung 3:dd2e91231e3c 30 return v;
saypulung 3:dd2e91231e3c 31 }
saypulung 3:dd2e91231e3c 32 void parseRMC(char* buffer)
saypulung 3:dd2e91231e3c 33 {
saypulung 3:dd2e91231e3c 34 char *p = buffer;
saypulung 3:dd2e91231e3c 35
saypulung 3:dd2e91231e3c 36 // get time
saypulung 3:dd2e91231e3c 37 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 38 float timef = atof(p);
saypulung 3:dd2e91231e3c 39 uint32_t time = timef;
saypulung 3:dd2e91231e3c 40 hour = time / 10000;
saypulung 3:dd2e91231e3c 41 minute = (time % 10000) / 100;
saypulung 3:dd2e91231e3c 42 seconds = (time % 100);
saypulung 3:dd2e91231e3c 43
saypulung 3:dd2e91231e3c 44 milliseconds = fmod((double) timef, 1.0) * 1000;
saypulung 3:dd2e91231e3c 45
saypulung 3:dd2e91231e3c 46 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 47 // Serial.println(p);
saypulung 3:dd2e91231e3c 48 if (p[0] == 'A')
saypulung 3:dd2e91231e3c 49 fix = true;
saypulung 3:dd2e91231e3c 50 else if (p[0] == 'V')
saypulung 3:dd2e91231e3c 51 fix = false;
saypulung 3:dd2e91231e3c 52 else
saypulung 3:dd2e91231e3c 53 fix= false;
saypulung 3:dd2e91231e3c 54
saypulung 3:dd2e91231e3c 55 // parse out latitude
saypulung 3:dd2e91231e3c 56 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 57 latitude = atof(p);
saypulung 3:dd2e91231e3c 58
saypulung 3:dd2e91231e3c 59 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 60 if (p[0] == 'N') lat = 'N';
saypulung 3:dd2e91231e3c 61 else if (p[0] == 'S') lat = 'S';
saypulung 3:dd2e91231e3c 62 else if (p[0] == ',') lat = 0;
saypulung 3:dd2e91231e3c 63 else lat=0;
saypulung 3:dd2e91231e3c 64
saypulung 3:dd2e91231e3c 65 // parse out longitude
saypulung 3:dd2e91231e3c 66 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 67 longitude = atof(p);
saypulung 3:dd2e91231e3c 68
saypulung 3:dd2e91231e3c 69 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 70 if (p[0] == 'W') lon = 'W';
saypulung 3:dd2e91231e3c 71 else if (p[0] == 'E') lon = 'E';
saypulung 3:dd2e91231e3c 72 else if (p[0] == ',') lon = 0;
saypulung 3:dd2e91231e3c 73 else lon=0;
saypulung 3:dd2e91231e3c 74 if(lat == 'S') { latitude *= -1; }
saypulung 3:dd2e91231e3c 75 if(lon == 'W') { longitude *= -1; }
saypulung 3:dd2e91231e3c 76 float degrees = trunc(latitude / 100.0f);
saypulung 3:dd2e91231e3c 77 float minutes = latitude - (degrees * 100.0f);
saypulung 3:dd2e91231e3c 78 latitude = degrees + minutes / 60.0f;
saypulung 3:dd2e91231e3c 79
saypulung 3:dd2e91231e3c 80 degrees = trunc(longitude / 100.0f );
saypulung 3:dd2e91231e3c 81 minutes = longitude - (degrees * 100.0f);
saypulung 3:dd2e91231e3c 82 longitude = degrees + minutes / 60.0f;
saypulung 3:dd2e91231e3c 83 // speed
saypulung 3:dd2e91231e3c 84 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 85 speed = atof(p);
saypulung 3:dd2e91231e3c 86
saypulung 3:dd2e91231e3c 87 // angle
saypulung 3:dd2e91231e3c 88 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 89 angle = atof(p);
saypulung 3:dd2e91231e3c 90
saypulung 3:dd2e91231e3c 91 p = strchr(p, ',')+1;
saypulung 3:dd2e91231e3c 92 uint32_t fulldate = atof(p);
saypulung 3:dd2e91231e3c 93 day = fulldate / 10000;
saypulung 3:dd2e91231e3c 94 month = (fulldate % 10000) / 100;
saypulung 3:dd2e91231e3c 95 year = (fulldate % 100);
saypulung 3:dd2e91231e3c 96
saypulung 3:dd2e91231e3c 97 }
edodm85 0:ea14ad6794af 98 void Init()
edodm85 0:ea14ad6794af 99 {
edodm85 0:ea14ad6794af 100 gps.baud(9600);
saypulung 2:13ef79e40e45 101 pc.baud(9600);
edodm85 0:ea14ad6794af 102
edodm85 0:ea14ad6794af 103 pc.printf("Init OK\n");
edodm85 0:ea14ad6794af 104 }
edodm85 0:ea14ad6794af 105
saypulung 2:13ef79e40e45 106 void readGPSThread(void const *args)
saypulung 2:13ef79e40e45 107 {
edodm85 0:ea14ad6794af 108 char c;
edodm85 0:ea14ad6794af 109 while(true)
edodm85 0:ea14ad6794af 110 {
edodm85 0:ea14ad6794af 111 if(gps.readable())
edodm85 0:ea14ad6794af 112 {
edodm85 0:ea14ad6794af 113 if(gps.getc() == '$'); // wait a $
edodm85 0:ea14ad6794af 114 {
edodm85 0:ea14ad6794af 115 for(int i=0; i<sizeof(cDataBuffer); i++)
edodm85 0:ea14ad6794af 116 {
edodm85 0:ea14ad6794af 117 c = gps.getc();
edodm85 0:ea14ad6794af 118 if( c == '\r' )
edodm85 0:ea14ad6794af 119 {
saypulung 2:13ef79e40e45 120
saypulung 3:dd2e91231e3c 121
saypulung 2:13ef79e40e45 122 if(strncmp(cDataBuffer,"$GPRMC",6)==0)
saypulung 2:13ef79e40e45 123 {
saypulung 3:dd2e91231e3c 124 parseRMC(cDataBuffer);
saypulung 2:13ef79e40e45 125 }
saypulung 3:dd2e91231e3c 126 //pc.printf("Longitude = %f, Latitude = %f, Speed = %f,Angle = %f, Day = %d, Month = %d, Year = %d,H = %d, M = %d, S = %d\n",longitude,latitude,speed,angle,day,month,year,hour,minute,seconds);
edodm85 0:ea14ad6794af 127 i = sizeof(cDataBuffer);
edodm85 0:ea14ad6794af 128 }
edodm85 0:ea14ad6794af 129 else
edodm85 0:ea14ad6794af 130 {
edodm85 0:ea14ad6794af 131 cDataBuffer[i] = c;
edodm85 0:ea14ad6794af 132 }
edodm85 0:ea14ad6794af 133 }
edodm85 0:ea14ad6794af 134 }
saypulung 3:dd2e91231e3c 135
edodm85 0:ea14ad6794af 136 }
edodm85 0:ea14ad6794af 137 }
edodm85 0:ea14ad6794af 138 }
edodm85 0:ea14ad6794af 139
saypulung 2:13ef79e40e45 140 int main()
saypulung 2:13ef79e40e45 141 {
saypulung 2:13ef79e40e45 142 Init();
saypulung 2:13ef79e40e45 143 DigitalOut l1(LED1);
saypulung 2:13ef79e40e45 144 Thread gpsReader(readGPSThread);
saypulung 2:13ef79e40e45 145
saypulung 2:13ef79e40e45 146 while(1){
saypulung 2:13ef79e40e45 147 l1 = 1;
saypulung 2:13ef79e40e45 148 wait(0.5);
saypulung 2:13ef79e40e45 149 l1=0;
saypulung 2:13ef79e40e45 150 wait(0.5);
saypulung 3:dd2e91231e3c 151 pc.printf("Longitude = %f, Latitude = %f, Speed = %f,Angle = %f, Day = %d, Month = %d, Year = %d,H = %d, M = %d, S = %d\n",longitude,latitude,speed,angle,day,month,year,hour,minute,seconds);
saypulung 2:13ef79e40e45 152 }
saypulung 2:13ef79e40e45 153
saypulung 2:13ef79e40e45 154 }
saypulung 2:13ef79e40e45 155
edodm85 0:ea14ad6794af 156
edodm85 0:ea14ad6794af 157
edodm85 0:ea14ad6794af 158
edodm85 0:ea14ad6794af 159