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
main.cpp@3:dd2e91231e3c, 2015-04-26 (annotated)
- Committer:
- saypulung
- Date:
- Sun Apr 26 19:05:38 2015 +0000
- Revision:
- 3:dd2e91231e3c
- Parent:
- 2:13ef79e40e45
ReadGPS
Who changed what in which revision?
User | Revision | Line number | New 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 |