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@2:13ef79e40e45, 2015-04-26 (annotated)
- Committer:
- saypulung
- Date:
- Sun Apr 26 11:51:49 2015 +0000
- Revision:
- 2:13ef79e40e45
- Parent:
- 1:acd907fbcbae
- Child:
- 3:dd2e91231e3c
GPS UBlox With Thread RTOS
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 |
edodm85 | 1:acd907fbcbae | 3 | * Date: 22-08-14 |
edodm85 | 0:ea14ad6794af | 4 | * Notes: Firmware for GPS U-Blox NEO-6M |
edodm85 | 0:ea14ad6794af | 5 | */ |
edodm85 | 0:ea14ad6794af | 6 | |
edodm85 | 0:ea14ad6794af | 7 | #include "main.h" |
saypulung | 2:13ef79e40e45 | 8 | #include "string.h" |
saypulung | 2:13ef79e40e45 | 9 | #include "rtos.h" |
saypulung | 2:13ef79e40e45 | 10 | char gpsData[10][500]; |
edodm85 | 0:ea14ad6794af | 11 | void Init() |
edodm85 | 0:ea14ad6794af | 12 | { |
edodm85 | 0:ea14ad6794af | 13 | gps.baud(9600); |
saypulung | 2:13ef79e40e45 | 14 | pc.baud(9600); |
edodm85 | 0:ea14ad6794af | 15 | |
edodm85 | 0:ea14ad6794af | 16 | pc.printf("Init OK\n"); |
edodm85 | 0:ea14ad6794af | 17 | } |
edodm85 | 0:ea14ad6794af | 18 | |
saypulung | 2:13ef79e40e45 | 19 | void readGPSThread(void const *args) |
saypulung | 2:13ef79e40e45 | 20 | { |
edodm85 | 0:ea14ad6794af | 21 | char c; |
edodm85 | 0:ea14ad6794af | 22 | while(true) |
edodm85 | 0:ea14ad6794af | 23 | { |
edodm85 | 0:ea14ad6794af | 24 | if(gps.readable()) |
edodm85 | 0:ea14ad6794af | 25 | { |
edodm85 | 0:ea14ad6794af | 26 | if(gps.getc() == '$'); // wait a $ |
edodm85 | 0:ea14ad6794af | 27 | { |
edodm85 | 0:ea14ad6794af | 28 | for(int i=0; i<sizeof(cDataBuffer); i++) |
edodm85 | 0:ea14ad6794af | 29 | { |
edodm85 | 0:ea14ad6794af | 30 | c = gps.getc(); |
edodm85 | 0:ea14ad6794af | 31 | if( c == '\r' ) |
edodm85 | 0:ea14ad6794af | 32 | { |
saypulung | 2:13ef79e40e45 | 33 | //int a = sizeof(cDataBuffer); |
saypulung | 2:13ef79e40e45 | 34 | //char data[500]; |
saypulung | 2:13ef79e40e45 | 35 | //int ccS = sprintf(data,"%s",cDataBuffer); |
saypulung | 2:13ef79e40e45 | 36 | |
saypulung | 2:13ef79e40e45 | 37 | pc.printf("Message : %s\n", cDataBuffer); |
saypulung | 2:13ef79e40e45 | 38 | if(strncmp(cDataBuffer,"$GPRMC",6)==0) |
saypulung | 2:13ef79e40e45 | 39 | { |
saypulung | 2:13ef79e40e45 | 40 | |
saypulung | 2:13ef79e40e45 | 41 | } |
saypulung | 2:13ef79e40e45 | 42 | //int count = getDataCount(data,","); |
saypulung | 2:13ef79e40e45 | 43 | //pc.printf("Length : %d\n",count); |
saypulung | 2:13ef79e40e45 | 44 | //fflush(stdin); |
saypulung | 2:13ef79e40e45 | 45 | //fflush(stdout); |
saypulung | 2:13ef79e40e45 | 46 | //parse(cDataBuffer, i); |
edodm85 | 0:ea14ad6794af | 47 | i = sizeof(cDataBuffer); |
edodm85 | 0:ea14ad6794af | 48 | } |
edodm85 | 0:ea14ad6794af | 49 | else |
edodm85 | 0:ea14ad6794af | 50 | { |
edodm85 | 0:ea14ad6794af | 51 | cDataBuffer[i] = c; |
edodm85 | 0:ea14ad6794af | 52 | } |
edodm85 | 0:ea14ad6794af | 53 | } |
edodm85 | 0:ea14ad6794af | 54 | } |
edodm85 | 0:ea14ad6794af | 55 | } |
edodm85 | 0:ea14ad6794af | 56 | } |
edodm85 | 0:ea14ad6794af | 57 | } |
edodm85 | 0:ea14ad6794af | 58 | |
saypulung | 2:13ef79e40e45 | 59 | int main() |
saypulung | 2:13ef79e40e45 | 60 | { |
saypulung | 2:13ef79e40e45 | 61 | Init(); |
saypulung | 2:13ef79e40e45 | 62 | DigitalOut l1(LED1); |
saypulung | 2:13ef79e40e45 | 63 | Thread gpsReader(readGPSThread); |
saypulung | 2:13ef79e40e45 | 64 | |
saypulung | 2:13ef79e40e45 | 65 | while(1){ |
saypulung | 2:13ef79e40e45 | 66 | l1 = 1; |
saypulung | 2:13ef79e40e45 | 67 | wait(0.5); |
saypulung | 2:13ef79e40e45 | 68 | l1=0; |
saypulung | 2:13ef79e40e45 | 69 | wait(0.5); |
saypulung | 2:13ef79e40e45 | 70 | } |
saypulung | 2:13ef79e40e45 | 71 | |
saypulung | 2:13ef79e40e45 | 72 | } |
saypulung | 2:13ef79e40e45 | 73 | |
edodm85 | 0:ea14ad6794af | 74 | |
edodm85 | 0:ea14ad6794af | 75 | void parse(char *cmd, int n) |
edodm85 | 0:ea14ad6794af | 76 | { |
edodm85 | 0:ea14ad6794af | 77 | |
edodm85 | 0:ea14ad6794af | 78 | char ns, ew, tf, status; |
edodm85 | 0:ea14ad6794af | 79 | int fq, nst, fix, date; // fix quality, Number of satellites being tracked, 3D fix |
edodm85 | 0:ea14ad6794af | 80 | float latitude, longitude, timefix, speed, altitude; |
edodm85 | 0:ea14ad6794af | 81 | |
saypulung | 2:13ef79e40e45 | 82 | pc.printf("Parser cooyy\n"); |
edodm85 | 0:ea14ad6794af | 83 | // Global Positioning System Fix Data |
edodm85 | 0:ea14ad6794af | 84 | if(strncmp(cmd,"$GPGGA", 6) == 0) |
edodm85 | 0:ea14ad6794af | 85 | { |
edodm85 | 0:ea14ad6794af | 86 | sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude); |
edodm85 | 0:ea14ad6794af | 87 | pc.printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude); |
edodm85 | 0:ea14ad6794af | 88 | } |
edodm85 | 0:ea14ad6794af | 89 | |
edodm85 | 0:ea14ad6794af | 90 | // Satellite status |
edodm85 | 0:ea14ad6794af | 91 | if(strncmp(cmd,"$GPGSA", 6) == 0) |
edodm85 | 0:ea14ad6794af | 92 | { |
edodm85 | 0:ea14ad6794af | 93 | sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst); |
edodm85 | 0:ea14ad6794af | 94 | pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst); |
edodm85 | 0:ea14ad6794af | 95 | } |
edodm85 | 0:ea14ad6794af | 96 | |
edodm85 | 0:ea14ad6794af | 97 | // Geographic position, Latitude and Longitude |
edodm85 | 0:ea14ad6794af | 98 | if(strncmp(cmd,"$GPGLL", 6) == 0) |
edodm85 | 0:ea14ad6794af | 99 | { |
edodm85 | 0:ea14ad6794af | 100 | sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix); |
edodm85 | 0:ea14ad6794af | 101 | pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix); |
edodm85 | 0:ea14ad6794af | 102 | } |
edodm85 | 0:ea14ad6794af | 103 | |
edodm85 | 0:ea14ad6794af | 104 | // Geographic position, Latitude and Longitude |
edodm85 | 0:ea14ad6794af | 105 | if(strncmp(cmd,"$GPRMC", 6) == 0) |
edodm85 | 0:ea14ad6794af | 106 | { |
edodm85 | 0:ea14ad6794af | 107 | sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date); |
edodm85 | 0:ea14ad6794af | 108 | pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date); |
edodm85 | 0:ea14ad6794af | 109 | } |
edodm85 | 0:ea14ad6794af | 110 | } |
edodm85 | 0:ea14ad6794af | 111 | |
saypulung | 2:13ef79e40e45 | 112 | void splitString(char str[],char *delimiter) |
saypulung | 2:13ef79e40e45 | 113 | { |
saypulung | 2:13ef79e40e45 | 114 | int count=0; |
saypulung | 2:13ef79e40e45 | 115 | char *tok = strtok(str,delimiter); |
saypulung | 2:13ef79e40e45 | 116 | int idx=0; |
saypulung | 2:13ef79e40e45 | 117 | while(0!=tok) |
saypulung | 2:13ef79e40e45 | 118 | { |
saypulung | 2:13ef79e40e45 | 119 | int cpy = sprintf(gpsData[idx],"%s",tok); |
saypulung | 2:13ef79e40e45 | 120 | pc.printf("Data %d = %s\n",idx,gpsData[idx]); |
saypulung | 2:13ef79e40e45 | 121 | tok = strtok(NULL,delimiter); |
saypulung | 2:13ef79e40e45 | 122 | idx++; |
saypulung | 2:13ef79e40e45 | 123 | } |
saypulung | 2:13ef79e40e45 | 124 | //return count; |
saypulung | 2:13ef79e40e45 | 125 | } |
edodm85 | 0:ea14ad6794af | 126 | |
edodm85 | 0:ea14ad6794af | 127 | |
edodm85 | 0:ea14ad6794af | 128 |