Penn Electric Racing / Venus838-GPS-Library
Committer:
dhawkes
Date:
Sat Oct 17 23:12:26 2015 +0000
Revision:
1:868c31bace68
Parent:
0:8d2eedbb4c6f
See previous message - I just took some leftover begun code out.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dhawkes 0:8d2eedbb4c6f 1 #include "GPS.h"
dhawkes 0:8d2eedbb4c6f 2
dhawkes 0:8d2eedbb4c6f 3 MODSERIAL pc(P0_2, P0_3); // tx, rx
dhawkes 0:8d2eedbb4c6f 4 MODSERIAL gps(P4_28, P4_29); // tx, rx
dhawkes 0:8d2eedbb4c6f 5
dhawkes 0:8d2eedbb4c6f 6 bool first = true;
dhawkes 0:8d2eedbb4c6f 7 bool firstTime = true;
dhawkes 0:8d2eedbb4c6f 8 bool filling = false;
dhawkes 0:8d2eedbb4c6f 9
dhawkes 0:8d2eedbb4c6f 10 double iniTime;
dhawkes 0:8d2eedbb4c6f 11
dhawkes 0:8d2eedbb4c6f 12 int32_t data[7];
dhawkes 0:8d2eedbb4c6f 13 int16_t miliseconds;
dhawkes 0:8d2eedbb4c6f 14 int32_t currentTime;
dhawkes 0:8d2eedbb4c6f 15
dhawkes 0:8d2eedbb4c6f 16 int fillIndex = 0;
dhawkes 0:8d2eedbb4c6f 17
dhawkes 0:8d2eedbb4c6f 18 const int MAX = 82;
dhawkes 0:8d2eedbb4c6f 19 char buffer[MAX];
dhawkes 0:8d2eedbb4c6f 20
dhawkes 0:8d2eedbb4c6f 21 int index = 0;
dhawkes 0:8d2eedbb4c6f 22
dhawkes 0:8d2eedbb4c6f 23 /* Relevant Data being Gathered
dhawkes 0:8d2eedbb4c6f 24 *
dhawkes 0:8d2eedbb4c6f 25 * INDEX NAME FORMAT NMEA STRING
dhawkes 0:8d2eedbb4c6f 26 * 0 Latitude ddmm.mmmm GGA
dhawkes 0:8d2eedbb4c6f 27 * 1 Longitude dddmm.mmmm GGA
dhawkes 0:8d2eedbb4c6f 28 * 2 GPS Quality x GGA
dhawkes 0:8d2eedbb4c6f 29 * 3 Satellites Used xx GGA
dhawkes 0:8d2eedbb4c6f 30 * 4 Altitude x.x GGA
dhawkes 0:8d2eedbb4c6f 31 * 5 Course x.x VTG
dhawkes 0:8d2eedbb4c6f 32 * 6 Speed in km/h x.x VTG
dhawkes 0:8d2eedbb4c6f 33 */
dhawkes 0:8d2eedbb4c6f 34
dhawkes 0:8d2eedbb4c6f 35 void move(char* source, char* destination, char delim)
dhawkes 0:8d2eedbb4c6f 36 {
dhawkes 0:8d2eedbb4c6f 37 int k = 0;
dhawkes 0:8d2eedbb4c6f 38 for(;index < 10000; index++)
dhawkes 0:8d2eedbb4c6f 39 {
dhawkes 0:8d2eedbb4c6f 40 if(source[index] == delim)
dhawkes 0:8d2eedbb4c6f 41 {
dhawkes 0:8d2eedbb4c6f 42 break;
dhawkes 0:8d2eedbb4c6f 43 }
dhawkes 0:8d2eedbb4c6f 44 destination[k] = source[index];
dhawkes 0:8d2eedbb4c6f 45 //pc.putc(source[index]);
dhawkes 0:8d2eedbb4c6f 46 k++;
dhawkes 0:8d2eedbb4c6f 47 }
dhawkes 0:8d2eedbb4c6f 48 destination[k] = NULL;
dhawkes 0:8d2eedbb4c6f 49 }
dhawkes 0:8d2eedbb4c6f 50
dhawkes 0:8d2eedbb4c6f 51 void move(char* source, char* destination, int num)
dhawkes 0:8d2eedbb4c6f 52 {
dhawkes 0:8d2eedbb4c6f 53 int k = 0;
dhawkes 0:8d2eedbb4c6f 54 for(;index < index + num; index++)
dhawkes 0:8d2eedbb4c6f 55 {
dhawkes 0:8d2eedbb4c6f 56 destination[k] = source[index];
dhawkes 0:8d2eedbb4c6f 57 k++;
dhawkes 0:8d2eedbb4c6f 58 }
dhawkes 0:8d2eedbb4c6f 59 destination[k] = NULL;
dhawkes 0:8d2eedbb4c6f 60 }
dhawkes 0:8d2eedbb4c6f 61
dhawkes 0:8d2eedbb4c6f 62
dhawkes 0:8d2eedbb4c6f 63
dhawkes 0:8d2eedbb4c6f 64 // Returns the first time value recorded as a double
dhawkes 0:8d2eedbb4c6f 65 double getInitialTime()
dhawkes 0:8d2eedbb4c6f 66 {
dhawkes 0:8d2eedbb4c6f 67 return iniTime;
dhawkes 0:8d2eedbb4c6f 68 }
dhawkes 0:8d2eedbb4c6f 69
dhawkes 0:8d2eedbb4c6f 70 // Return the time (without miliseconds) relative to the initial time
dhawkes 0:8d2eedbb4c6f 71 int32_t getTime()
dhawkes 0:8d2eedbb4c6f 72 {
dhawkes 0:8d2eedbb4c6f 73 return currentTime;
dhawkes 0:8d2eedbb4c6f 74 }
dhawkes 0:8d2eedbb4c6f 75
dhawkes 0:8d2eedbb4c6f 76 // Return just the miliseconds
dhawkes 0:8d2eedbb4c6f 77 int16_t getMiliseconds()
dhawkes 0:8d2eedbb4c6f 78 {
dhawkes 0:8d2eedbb4c6f 79 return miliseconds;
dhawkes 0:8d2eedbb4c6f 80 }
dhawkes 0:8d2eedbb4c6f 81
dhawkes 0:8d2eedbb4c6f 82 // returns everything except the time
dhawkes 0:8d2eedbb4c6f 83 int32_t* getGPSData()
dhawkes 0:8d2eedbb4c6f 84 {
dhawkes 0:8d2eedbb4c6f 85 int32_t * dataPointer = data;
dhawkes 0:8d2eedbb4c6f 86 return dataPointer;
dhawkes 0:8d2eedbb4c6f 87 }
dhawkes 0:8d2eedbb4c6f 88
dhawkes 0:8d2eedbb4c6f 89 int32_t getLatitude()
dhawkes 0:8d2eedbb4c6f 90 {
dhawkes 0:8d2eedbb4c6f 91 return data[0];
dhawkes 0:8d2eedbb4c6f 92 }
dhawkes 0:8d2eedbb4c6f 93
dhawkes 0:8d2eedbb4c6f 94 int32_t getLongitude()
dhawkes 0:8d2eedbb4c6f 95 {
dhawkes 0:8d2eedbb4c6f 96 return data[1];
dhawkes 0:8d2eedbb4c6f 97 }
dhawkes 0:8d2eedbb4c6f 98
dhawkes 0:8d2eedbb4c6f 99 int32_t getGPSQuality()
dhawkes 0:8d2eedbb4c6f 100 {
dhawkes 0:8d2eedbb4c6f 101 return data[2];
dhawkes 0:8d2eedbb4c6f 102 }
dhawkes 0:8d2eedbb4c6f 103
dhawkes 0:8d2eedbb4c6f 104 int32_t getSatellitesUsed()
dhawkes 0:8d2eedbb4c6f 105 {
dhawkes 0:8d2eedbb4c6f 106 return data[3];
dhawkes 0:8d2eedbb4c6f 107 }
dhawkes 0:8d2eedbb4c6f 108
dhawkes 0:8d2eedbb4c6f 109 int32_t getAltitude()
dhawkes 0:8d2eedbb4c6f 110 {
dhawkes 0:8d2eedbb4c6f 111 return data[4];
dhawkes 0:8d2eedbb4c6f 112 }
dhawkes 0:8d2eedbb4c6f 113
dhawkes 0:8d2eedbb4c6f 114 int32_t getCourse()
dhawkes 0:8d2eedbb4c6f 115 {
dhawkes 0:8d2eedbb4c6f 116 return data[5];
dhawkes 0:8d2eedbb4c6f 117 }
dhawkes 0:8d2eedbb4c6f 118
dhawkes 0:8d2eedbb4c6f 119 int32_t getSpeed()
dhawkes 0:8d2eedbb4c6f 120 {
dhawkes 0:8d2eedbb4c6f 121 return data[6];
dhawkes 0:8d2eedbb4c6f 122 }
dhawkes 0:8d2eedbb4c6f 123
dhawkes 0:8d2eedbb4c6f 124
dhawkes 0:8d2eedbb4c6f 125 void parse()
dhawkes 0:8d2eedbb4c6f 126 {
dhawkes 0:8d2eedbb4c6f 127 double t, t2;
dhawkes 0:8d2eedbb4c6f 128 index = 1;
dhawkes 0:8d2eedbb4c6f 129 char dat[MAX + 1];
dhawkes 0:8d2eedbb4c6f 130 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 131 index++;
dhawkes 0:8d2eedbb4c6f 132 if(strcmp(dat, "GPGGA") == 0) // Is it the GGA string?
dhawkes 0:8d2eedbb4c6f 133 {
dhawkes 0:8d2eedbb4c6f 134 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 135 t = strtod(dat, NULL);
dhawkes 0:8d2eedbb4c6f 136 if(firstTime)
dhawkes 0:8d2eedbb4c6f 137 {
dhawkes 0:8d2eedbb4c6f 138 firstTime = false;
dhawkes 0:8d2eedbb4c6f 139 iniTime = t;
dhawkes 0:8d2eedbb4c6f 140 }
dhawkes 0:8d2eedbb4c6f 141
dhawkes 0:8d2eedbb4c6f 142 t = t - iniTime;
dhawkes 0:8d2eedbb4c6f 143 t2 = floor(t);
dhawkes 0:8d2eedbb4c6f 144 currentTime = t2;
dhawkes 0:8d2eedbb4c6f 145 miliseconds = (int16_t)((t - t2) * 1000);
dhawkes 0:8d2eedbb4c6f 146
dhawkes 0:8d2eedbb4c6f 147
dhawkes 0:8d2eedbb4c6f 148 index++;
dhawkes 0:8d2eedbb4c6f 149
dhawkes 0:8d2eedbb4c6f 150 // latitude
dhawkes 0:8d2eedbb4c6f 151 char temp[2];
dhawkes 0:8d2eedbb4c6f 152 temp[0] = buffer[index];
dhawkes 0:8d2eedbb4c6f 153 index++;
dhawkes 0:8d2eedbb4c6f 154 temp[1] = buffer[index];
dhawkes 0:8d2eedbb4c6f 155 index++;
dhawkes 0:8d2eedbb4c6f 156 float total = 0;
dhawkes 0:8d2eedbb4c6f 157 total = 60 * atof(temp);
dhawkes 0:8d2eedbb4c6f 158 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 159 data[1] = (int32_t)((atof(dat)+total) * 10000);
dhawkes 0:8d2eedbb4c6f 160 index += 2;
dhawkes 0:8d2eedbb4c6f 161 if(buffer[index] == 'S')
dhawkes 0:8d2eedbb4c6f 162 {
dhawkes 0:8d2eedbb4c6f 163 data[1] *= -1;
dhawkes 0:8d2eedbb4c6f 164 }
dhawkes 0:8d2eedbb4c6f 165
dhawkes 0:8d2eedbb4c6f 166 index++;
dhawkes 0:8d2eedbb4c6f 167
dhawkes 0:8d2eedbb4c6f 168 // longitude
dhawkes 0:8d2eedbb4c6f 169 char temp2[3];
dhawkes 0:8d2eedbb4c6f 170 temp2[0] = buffer[index];
dhawkes 0:8d2eedbb4c6f 171 index++;
dhawkes 0:8d2eedbb4c6f 172 temp2[1] = buffer[index];
dhawkes 0:8d2eedbb4c6f 173 index++;
dhawkes 0:8d2eedbb4c6f 174 temp2[2] = buffer[index];
dhawkes 0:8d2eedbb4c6f 175 index++;
dhawkes 0:8d2eedbb4c6f 176
dhawkes 0:8d2eedbb4c6f 177 total = 60 * atof(temp2);
dhawkes 0:8d2eedbb4c6f 178 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 179 data[2] = (int32_t)((atof(dat)+total) * 10000);
dhawkes 0:8d2eedbb4c6f 180 index += 2;
dhawkes 0:8d2eedbb4c6f 181 if(buffer[index] == 'W')
dhawkes 0:8d2eedbb4c6f 182 {
dhawkes 0:8d2eedbb4c6f 183 data[1] *= -1;
dhawkes 0:8d2eedbb4c6f 184 }
dhawkes 0:8d2eedbb4c6f 185 index++;
dhawkes 0:8d2eedbb4c6f 186
dhawkes 0:8d2eedbb4c6f 187 // quality
dhawkes 0:8d2eedbb4c6f 188 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 189 data[2] = atoi(dat);
dhawkes 0:8d2eedbb4c6f 190
dhawkes 0:8d2eedbb4c6f 191 index++;
dhawkes 0:8d2eedbb4c6f 192
dhawkes 0:8d2eedbb4c6f 193 // satellites
dhawkes 0:8d2eedbb4c6f 194 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 195 data[3] = atoi(dat);
dhawkes 0:8d2eedbb4c6f 196
dhawkes 0:8d2eedbb4c6f 197 index++;
dhawkes 0:8d2eedbb4c6f 198 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 199
dhawkes 0:8d2eedbb4c6f 200
dhawkes 0:8d2eedbb4c6f 201 // altitude
dhawkes 0:8d2eedbb4c6f 202 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 203 data[4] = (int32_t)(atof(dat) * 10);
dhawkes 0:8d2eedbb4c6f 204 }
dhawkes 0:8d2eedbb4c6f 205 else if(strcmp(dat, "GPVTG") == 0) // Is it VTG?
dhawkes 0:8d2eedbb4c6f 206 {
dhawkes 0:8d2eedbb4c6f 207 // course
dhawkes 0:8d2eedbb4c6f 208 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 209
dhawkes 0:8d2eedbb4c6f 210 data[5] = (int32_t)(atof(dat) * 10);
dhawkes 0:8d2eedbb4c6f 211
dhawkes 0:8d2eedbb4c6f 212 index++;
dhawkes 0:8d2eedbb4c6f 213 for(int i = 0; i < 5; i++)
dhawkes 0:8d2eedbb4c6f 214 {
dhawkes 0:8d2eedbb4c6f 215 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 216 index++;
dhawkes 0:8d2eedbb4c6f 217 }
dhawkes 0:8d2eedbb4c6f 218 // speed (km/h)
dhawkes 0:8d2eedbb4c6f 219 move(buffer, dat, ',');
dhawkes 0:8d2eedbb4c6f 220 data[6] = (int32_t)(atof(dat) * 10);
dhawkes 0:8d2eedbb4c6f 221
dhawkes 0:8d2eedbb4c6f 222 }
dhawkes 0:8d2eedbb4c6f 223 }
dhawkes 0:8d2eedbb4c6f 224
dhawkes 0:8d2eedbb4c6f 225 bool updateValues()
dhawkes 0:8d2eedbb4c6f 226 {
dhawkes 0:8d2eedbb4c6f 227 signed char c = gps.getcNb();
dhawkes 0:8d2eedbb4c6f 228
dhawkes 0:8d2eedbb4c6f 229 while(c != -1)
dhawkes 0:8d2eedbb4c6f 230 {
dhawkes 0:8d2eedbb4c6f 231 if(!filling)
dhawkes 0:8d2eedbb4c6f 232 {
dhawkes 0:8d2eedbb4c6f 233 if(c == '$')
dhawkes 0:8d2eedbb4c6f 234 {
dhawkes 0:8d2eedbb4c6f 235 filling = true;
dhawkes 0:8d2eedbb4c6f 236 buffer[0] = c;
dhawkes 0:8d2eedbb4c6f 237 fillIndex = 1;
dhawkes 0:8d2eedbb4c6f 238 }
dhawkes 0:8d2eedbb4c6f 239 }
dhawkes 0:8d2eedbb4c6f 240 else
dhawkes 0:8d2eedbb4c6f 241 {
dhawkes 0:8d2eedbb4c6f 242 if(c == '\n')
dhawkes 0:8d2eedbb4c6f 243 {
dhawkes 0:8d2eedbb4c6f 244 buffer[fillIndex] = c;
dhawkes 0:8d2eedbb4c6f 245 fillIndex++;
dhawkes 0:8d2eedbb4c6f 246 filling = false;
dhawkes 0:8d2eedbb4c6f 247 parse();
dhawkes 0:8d2eedbb4c6f 248 }
dhawkes 0:8d2eedbb4c6f 249 else
dhawkes 0:8d2eedbb4c6f 250 {
dhawkes 0:8d2eedbb4c6f 251 buffer[fillIndex] = c;
dhawkes 0:8d2eedbb4c6f 252 fillIndex++;
dhawkes 0:8d2eedbb4c6f 253 }
dhawkes 0:8d2eedbb4c6f 254 }
dhawkes 0:8d2eedbb4c6f 255 c = gps.getcNb();
dhawkes 0:8d2eedbb4c6f 256 }
dhawkes 0:8d2eedbb4c6f 257 return true;
dhawkes 0:8d2eedbb4c6f 258 }