Calculates azimuth and elevation of a satellite dish based on its longitude, latitude and selected satellite.

Dependencies:   PinDetect TextLCD mbed MODGPS

Committer:
BartJanssens
Date:
Thu Mar 29 09:26:14 2012 +0000
Revision:
0:fe8decc6a938

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:fe8decc6a938 1 /* Satelitte Positioner
BartJanssens 0:fe8decc6a938 2 *
BartJanssens 0:fe8decc6a938 3 * Calculates azimuth and elevation of a satellite dish based on its longitude, latitude
BartJanssens 0:fe8decc6a938 4 * and selected satellite.
BartJanssens 0:fe8decc6a938 5 * see: http://www.alcyone.com/max/writing/essays/geostationary-orbits.html
BartJanssens 0:fe8decc6a938 6 * http://www.spaceacademy.net.au/watch/track/locgsat.htm
BartJanssens 0:fe8decc6a938 7 * http://www.dishpointer.com/
BartJanssens 0:fe8decc6a938 8 *
BartJanssens 0:fe8decc6a938 9 * Copyright (c) 2012 Bart Janssens
BartJanssens 0:fe8decc6a938 10 *
BartJanssens 0:fe8decc6a938 11 * Permission is hereby granted, free of charge, to any person obtaining a copy
BartJanssens 0:fe8decc6a938 12 * of this software and associated documentation files (the "Software"), to deal
BartJanssens 0:fe8decc6a938 13 * in the Software without restriction, including without limitation the rights
BartJanssens 0:fe8decc6a938 14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
BartJanssens 0:fe8decc6a938 15 * copies of the Software, and to permit persons to whom the Software is
BartJanssens 0:fe8decc6a938 16 * furnished to do so, subject to the following conditions:
BartJanssens 0:fe8decc6a938 17 *
BartJanssens 0:fe8decc6a938 18 * The above copyright notice and this permission notice shall be included in
BartJanssens 0:fe8decc6a938 19 * all copies or substantial portions of the Software.
BartJanssens 0:fe8decc6a938 20 *
BartJanssens 0:fe8decc6a938 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
BartJanssens 0:fe8decc6a938 22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
BartJanssens 0:fe8decc6a938 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
BartJanssens 0:fe8decc6a938 24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
BartJanssens 0:fe8decc6a938 25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
BartJanssens 0:fe8decc6a938 26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
BartJanssens 0:fe8decc6a938 27 * THE SOFTWARE.
BartJanssens 0:fe8decc6a938 28 */
BartJanssens 0:fe8decc6a938 29 #include "mbed.h"
BartJanssens 0:fe8decc6a938 30
BartJanssens 0:fe8decc6a938 31 #include "TextLCD.h"
BartJanssens 0:fe8decc6a938 32 #include "PinDetect.h"
BartJanssens 0:fe8decc6a938 33 #include "GPS.h"
BartJanssens 0:fe8decc6a938 34
BartJanssens 0:fe8decc6a938 35 #include "SatGps.h"
BartJanssens 0:fe8decc6a938 36 #include "SatelliteList.h"
BartJanssens 0:fe8decc6a938 37
BartJanssens 0:fe8decc6a938 38
BartJanssens 0:fe8decc6a938 39 #define GPSRX p10
BartJanssens 0:fe8decc6a938 40 #define GPSBAUD 4800
BartJanssens 0:fe8decc6a938 41
BartJanssens 0:fe8decc6a938 42 #define MAXGPRMC 3
BartJanssens 0:fe8decc6a938 43 #define MAXGPRMCA 4
BartJanssens 0:fe8decc6a938 44
BartJanssens 0:fe8decc6a938 45 #define PI 3.14159265
BartJanssens 0:fe8decc6a938 46
BartJanssens 0:fe8decc6a938 47 TextLCD lcd(p24, p26, p27, p28, p29, p30, TextLCD::LCD16x2 ); // rs, e, d0, d1, d2, d3, LCD16x2
BartJanssens 0:fe8decc6a938 48 LocalFileSystem local("local");
BartJanssens 0:fe8decc6a938 49 GPS gps(NC, GPSRX);
BartJanssens 0:fe8decc6a938 50 AnalogIn ain(p20); //temperature from LM35
BartJanssens 0:fe8decc6a938 51 PinDetect modeButton(p13);
BartJanssens 0:fe8decc6a938 52 PinDetect plusButton(p14);
BartJanssens 0:fe8decc6a938 53 PinDetect minButton(p15);
BartJanssens 0:fe8decc6a938 54
BartJanssens 0:fe8decc6a938 55 // heartbeat
BartJanssens 0:fe8decc6a938 56 DigitalOut led1(LED1);
BartJanssens 0:fe8decc6a938 57 // 0.05 second flash of LED2
BartJanssens 0:fe8decc6a938 58 DigitalOut led2(LED2);
BartJanssens 0:fe8decc6a938 59 Timeout t2;
BartJanssens 0:fe8decc6a938 60
BartJanssens 0:fe8decc6a938 61 // 0.05 second flash of LED3
BartJanssens 0:fe8decc6a938 62 DigitalOut led3(LED3);
BartJanssens 0:fe8decc6a938 63 Timeout t3;
BartJanssens 0:fe8decc6a938 64
BartJanssens 0:fe8decc6a938 65 // 0.05 second flash of LED4
BartJanssens 0:fe8decc6a938 66 DigitalOut led4(LED4);
BartJanssens 0:fe8decc6a938 67 Timeout t4;
BartJanssens 0:fe8decc6a938 68
BartJanssens 0:fe8decc6a938 69 int gprmc_c = 0;
BartJanssens 0:fe8decc6a938 70
BartJanssens 0:fe8decc6a938 71
BartJanssens 0:fe8decc6a938 72 int mode = modeAzimuth;
BartJanssens 0:fe8decc6a938 73
BartJanssens 0:fe8decc6a938 74 SatelliteList slist("/local/SAT.TXT",';');
BartJanssens 0:fe8decc6a938 75 Satellite *s;
BartJanssens 0:fe8decc6a938 76 pos_t pos;
BartJanssens 0:fe8decc6a938 77
BartJanssens 0:fe8decc6a938 78 const float G = 6.67421e-11; // ( m�/kg/s�)
BartJanssens 0:fe8decc6a938 79 const float Mr = 5.9736e24; // Mass of Earth (Kg)
BartJanssens 0:fe8decc6a938 80 const float Rr = 6.378137e6; // Radius of Earth (m)
BartJanssens 0:fe8decc6a938 81 const float T = 23.934192*60*60; // the period of Earth rotation (s)
BartJanssens 0:fe8decc6a938 82
BartJanssens 0:fe8decc6a938 83 const float degreesPerRadian = 180/PI;
BartJanssens 0:fe8decc6a938 84 const float dr = PI/180;
BartJanssens 0:fe8decc6a938 85
BartJanssens 0:fe8decc6a938 86 const float r1 = ((G*Mr*T*T)/(4*PI*PI)); // the radius of the path of the geostatic satellite
BartJanssens 0:fe8decc6a938 87 const float r = pow(r1, float(1.0 / 3.0));
BartJanssens 0:fe8decc6a938 88 const float h = r - Rr; // the height of the satelite
BartJanssens 0:fe8decc6a938 89 const float b = Rr/r; // the geostationary orbit constant
BartJanssens 0:fe8decc6a938 90
BartJanssens 0:fe8decc6a938 91 void switch_mode(buttons);
BartJanssens 0:fe8decc6a938 92 void display_satellite();
BartJanssens 0:fe8decc6a938 93 void display_position();
BartJanssens 0:fe8decc6a938 94 void display_time();
BartJanssens 0:fe8decc6a938 95 void display_temperature();
BartJanssens 0:fe8decc6a938 96 void display_welcome();
BartJanssens 0:fe8decc6a938 97 void calculate_satellite();
BartJanssens 0:fe8decc6a938 98
BartJanssens 0:fe8decc6a938 99 void t2out(void) { led2 = 0; }
BartJanssens 0:fe8decc6a938 100 void blip2(void) { led2 = 1; t2.attach(&t2out, 0.05); }
BartJanssens 0:fe8decc6a938 101
BartJanssens 0:fe8decc6a938 102 void t3out(void) { led3 = 0; }
BartJanssens 0:fe8decc6a938 103 void blip3(void) { gprmc_c = 0;led3 = 1; t3.attach(&t3out, 0.05); }
BartJanssens 0:fe8decc6a938 104
BartJanssens 0:fe8decc6a938 105 void t4out(void) { led4 = 0; }
BartJanssens 0:fe8decc6a938 106 void blip4(void) { led4 = 1; t4.attach(&t4out, 0.05); }
BartJanssens 0:fe8decc6a938 107
BartJanssens 0:fe8decc6a938 108 void buttonModePressed( void ) {
BartJanssens 0:fe8decc6a938 109 //led4 = !led4;
BartJanssens 0:fe8decc6a938 110 mode = (((mode + 1) % 4));
BartJanssens 0:fe8decc6a938 111 //printf("Mode button pressed %d \r\n", mode);
BartJanssens 0:fe8decc6a938 112 switch_mode(buttonNone);
BartJanssens 0:fe8decc6a938 113 }
BartJanssens 0:fe8decc6a938 114
BartJanssens 0:fe8decc6a938 115 void buttonPlusPressed( void ) {
BartJanssens 0:fe8decc6a938 116 //led4 = !led4;
BartJanssens 0:fe8decc6a938 117 switch_mode(buttonPlus);
BartJanssens 0:fe8decc6a938 118 }
BartJanssens 0:fe8decc6a938 119
BartJanssens 0:fe8decc6a938 120 void buttonMinPressed( void ) {
BartJanssens 0:fe8decc6a938 121 //led4 = !led4;
BartJanssens 0:fe8decc6a938 122 switch_mode(buttonMin);
BartJanssens 0:fe8decc6a938 123 }
BartJanssens 0:fe8decc6a938 124
BartJanssens 0:fe8decc6a938 125 void switch_mode(buttons button)
BartJanssens 0:fe8decc6a938 126 {
BartJanssens 0:fe8decc6a938 127 switch(mode)
BartJanssens 0:fe8decc6a938 128 {
BartJanssens 0:fe8decc6a938 129 case modeAzimuth:
BartJanssens 0:fe8decc6a938 130 //printf("Azimuth mode \r\n");
BartJanssens 0:fe8decc6a938 131 switch(button)
BartJanssens 0:fe8decc6a938 132 {
BartJanssens 0:fe8decc6a938 133 case buttonPlus:
BartJanssens 0:fe8decc6a938 134 s = slist.getNext();
BartJanssens 0:fe8decc6a938 135 break;
BartJanssens 0:fe8decc6a938 136 case buttonMin:
BartJanssens 0:fe8decc6a938 137 s = slist.getPrev();
BartJanssens 0:fe8decc6a938 138 break;
BartJanssens 0:fe8decc6a938 139 default:
BartJanssens 0:fe8decc6a938 140 break;
BartJanssens 0:fe8decc6a938 141 }
BartJanssens 0:fe8decc6a938 142 calculate_satellite();
BartJanssens 0:fe8decc6a938 143 display_satellite();
BartJanssens 0:fe8decc6a938 144 break;
BartJanssens 0:fe8decc6a938 145 case modePosition:
BartJanssens 0:fe8decc6a938 146 //printf("Position mode \r\n");
BartJanssens 0:fe8decc6a938 147 display_position();
BartJanssens 0:fe8decc6a938 148 break;
BartJanssens 0:fe8decc6a938 149 case modeTime:
BartJanssens 0:fe8decc6a938 150 //printf("Time mode \r\n");
BartJanssens 0:fe8decc6a938 151 display_time();
BartJanssens 0:fe8decc6a938 152 break;
BartJanssens 0:fe8decc6a938 153 case modeTemperature:
BartJanssens 0:fe8decc6a938 154 display_temperature();
BartJanssens 0:fe8decc6a938 155 //printf("Temperature mode \r\n");
BartJanssens 0:fe8decc6a938 156 break;
BartJanssens 0:fe8decc6a938 157 default:
BartJanssens 0:fe8decc6a938 158 //printf("Invalid mode \r\n");
BartJanssens 0:fe8decc6a938 159 break;
BartJanssens 0:fe8decc6a938 160 }
BartJanssens 0:fe8decc6a938 161 }
BartJanssens 0:fe8decc6a938 162
BartJanssens 0:fe8decc6a938 163 void calculate_satellite(){
BartJanssens 0:fe8decc6a938 164 float denominator, B, Gc;
BartJanssens 0:fe8decc6a938 165 float la,lo,ob,az,el;
BartJanssens 0:fe8decc6a938 166
BartJanssens 0:fe8decc6a938 167 lo = pos.lo;
BartJanssens 0:fe8decc6a938 168 la = pos.la;
BartJanssens 0:fe8decc6a938 169 ob = s->getOrbit();
BartJanssens 0:fe8decc6a938 170 pos.ob = ob;
BartJanssens 0:fe8decc6a938 171
BartJanssens 0:fe8decc6a938 172 la = la * dr; //convert latitude observer from deg to rad
BartJanssens 0:fe8decc6a938 173 B = (lo - ob) * dr; //longitude diff between satellite and observer
BartJanssens 0:fe8decc6a938 174 Gc = cos(B) * cos(la); //Gc is the great circle angle between observer and satellite
BartJanssens 0:fe8decc6a938 175 Gc = atan(sqrt(1 - Gc * Gc) / Gc);
BartJanssens 0:fe8decc6a938 176 if (Gc < 1.419) { //if greater than 81.3deg skip
BartJanssens 0:fe8decc6a938 177 denominator = sin(la);
BartJanssens 0:fe8decc6a938 178 if (denominator != 0.0) {
BartJanssens 0:fe8decc6a938 179 az = atan(tan(B) / denominator); //compute azimuth angle
BartJanssens 0:fe8decc6a938 180 if (la >= 0) az = az + PI; //adjust for northern hemisphere
BartJanssens 0:fe8decc6a938 181 } else az = 0.0;
BartJanssens 0:fe8decc6a938 182 el = (( (1.0 / b) * cos(la) * cos(B)) - 1);
BartJanssens 0:fe8decc6a938 183 denominator = ( (1.0 /b) * sqrt(1-(pow(cos(la),2) * pow(cos(B),2))) );
BartJanssens 0:fe8decc6a938 184 if (denominator!=0)
BartJanssens 0:fe8decc6a938 185 {
BartJanssens 0:fe8decc6a938 186 el/=denominator;
BartJanssens 0:fe8decc6a938 187 el = atan(el);
BartJanssens 0:fe8decc6a938 188 }
BartJanssens 0:fe8decc6a938 189 else el = PI/2;
BartJanssens 0:fe8decc6a938 190 } else {
BartJanssens 0:fe8decc6a938 191 az = 0.0;
BartJanssens 0:fe8decc6a938 192 el = PI/2;
BartJanssens 0:fe8decc6a938 193 }
BartJanssens 0:fe8decc6a938 194
BartJanssens 0:fe8decc6a938 195 // convert from rad to deg
BartJanssens 0:fe8decc6a938 196 az = az/dr;
BartJanssens 0:fe8decc6a938 197 el = el/dr;
BartJanssens 0:fe8decc6a938 198 pos.az = az;
BartJanssens 0:fe8decc6a938 199 pos.el = el;
BartJanssens 0:fe8decc6a938 200
BartJanssens 0:fe8decc6a938 201 //printf("Azimuth observer = %.2f \r\n", az);
BartJanssens 0:fe8decc6a938 202 //printf("Elevation observer = %.2f \r\n", el);
BartJanssens 0:fe8decc6a938 203
BartJanssens 0:fe8decc6a938 204 }
BartJanssens 0:fe8decc6a938 205
BartJanssens 0:fe8decc6a938 206 void display_satellite(){
BartJanssens 0:fe8decc6a938 207
BartJanssens 0:fe8decc6a938 208 string sname;
BartJanssens 0:fe8decc6a938 209
BartJanssens 0:fe8decc6a938 210 sname = s->getCname();
BartJanssens 0:fe8decc6a938 211
BartJanssens 0:fe8decc6a938 212 lcd.cls();
BartJanssens 0:fe8decc6a938 213 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 214 lcd.printf("%.1f\xDF %s",pos.ob,sname.c_str()); //DF is the grade sign '&#65533;'
BartJanssens 0:fe8decc6a938 215 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 216 lcd.printf("A:%.1f\xDF",pos.az);
BartJanssens 0:fe8decc6a938 217 lcd.printf(" E:%.1f\xDF",pos.el);
BartJanssens 0:fe8decc6a938 218 //printf("Sat: %.2f LAT: %.2f LON: %.2f AZ: %.2f EL: %.2f tem: %.1f \r\n",pos.ob, pos.la, pos.lo, pos.az, pos.el, pos.tm);
BartJanssens 0:fe8decc6a938 219 }
BartJanssens 0:fe8decc6a938 220
BartJanssens 0:fe8decc6a938 221 void display_position(){
BartJanssens 0:fe8decc6a938 222
BartJanssens 0:fe8decc6a938 223 lcd.cls();
BartJanssens 0:fe8decc6a938 224 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 225 lcd.printf("LAT: %.4f\xDF",pos.la); //DF is the grade sign '&#65533;'
BartJanssens 0:fe8decc6a938 226 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 227 lcd.printf("LON: %.4f\xDF",pos.lo);
BartJanssens 0:fe8decc6a938 228 }
BartJanssens 0:fe8decc6a938 229
BartJanssens 0:fe8decc6a938 230 void display_temperature(){
BartJanssens 0:fe8decc6a938 231
BartJanssens 0:fe8decc6a938 232 lcd.cls();
BartJanssens 0:fe8decc6a938 233 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 234 lcd.printf("Temp: %.1f\xDF",pos.tm); //DF is the grade sign '&#65533;'
BartJanssens 0:fe8decc6a938 235 }
BartJanssens 0:fe8decc6a938 236
BartJanssens 0:fe8decc6a938 237 void display_time(){
BartJanssens 0:fe8decc6a938 238
BartJanssens 0:fe8decc6a938 239 GPS_Time now;
BartJanssens 0:fe8decc6a938 240 gps.timeNow(&now);
BartJanssens 0:fe8decc6a938 241 //printf("Time: %d-%d-%d %d:%d:%d UTC\r\n", now.day, now.month, now.year, now.hour, now.minute, now.second);
BartJanssens 0:fe8decc6a938 242
BartJanssens 0:fe8decc6a938 243 lcd.cls();
BartJanssens 0:fe8decc6a938 244 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 245 lcd.printf("Date: %d-%d-%d", now.day, now.month, now.year);
BartJanssens 0:fe8decc6a938 246 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 247 lcd.printf("Time: %d:%d:%d",now.hour, now.minute, now.second);
BartJanssens 0:fe8decc6a938 248 }
BartJanssens 0:fe8decc6a938 249
BartJanssens 0:fe8decc6a938 250 void display_welcome(){
BartJanssens 0:fe8decc6a938 251 lcd.cls();
BartJanssens 0:fe8decc6a938 252 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 253 lcd.printf("SatGPS v1.0");
BartJanssens 0:fe8decc6a938 254 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 255 lcd.printf("4 PVDV");
BartJanssens 0:fe8decc6a938 256 }
BartJanssens 0:fe8decc6a938 257
BartJanssens 0:fe8decc6a938 258
BartJanssens 0:fe8decc6a938 259 int main() {
BartJanssens 0:fe8decc6a938 260
BartJanssens 0:fe8decc6a938 261
BartJanssens 0:fe8decc6a938 262
BartJanssens 0:fe8decc6a938 263 GPS_Time q1;
BartJanssens 0:fe8decc6a938 264 GPS_VTG v1;
BartJanssens 0:fe8decc6a938 265 int gprmca_c; //Counter for the GPRMC 'Valid A' field
BartJanssens 0:fe8decc6a938 266
BartJanssens 0:fe8decc6a938 267 pos.az = 0.0;
BartJanssens 0:fe8decc6a938 268 pos.el = 0.0;
BartJanssens 0:fe8decc6a938 269 pos.tm = 0.0;
BartJanssens 0:fe8decc6a938 270
BartJanssens 0:fe8decc6a938 271 display_welcome();
BartJanssens 0:fe8decc6a938 272 wait(2);
BartJanssens 0:fe8decc6a938 273
BartJanssens 0:fe8decc6a938 274
BartJanssens 0:fe8decc6a938 275 //slist.display();
BartJanssens 0:fe8decc6a938 276 s = slist.getCurrent();
BartJanssens 0:fe8decc6a938 277
BartJanssens 0:fe8decc6a938 278
BartJanssens 0:fe8decc6a938 279 gps.baud(GPSBAUD);
BartJanssens 0:fe8decc6a938 280 gps.format(8, GPS::None, 1);
BartJanssens 0:fe8decc6a938 281 gps.attach_gga(&blip2);
BartJanssens 0:fe8decc6a938 282 // Sample of a callback to a function when a NMEA RMC message is recieved.
BartJanssens 0:fe8decc6a938 283 gps.attach_rmc(&blip3);
BartJanssens 0:fe8decc6a938 284
BartJanssens 0:fe8decc6a938 285 //printf("Wait for the GPS NMEA data to become valid. \r\n");
BartJanssens 0:fe8decc6a938 286 lcd.cls();
BartJanssens 0:fe8decc6a938 287 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 288 lcd.printf("Waiting for");
BartJanssens 0:fe8decc6a938 289 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 290 lcd.printf("valid GPS signal");
BartJanssens 0:fe8decc6a938 291 while (!gps.isTimeValid()) {
BartJanssens 0:fe8decc6a938 292 //printf("%s \r\n",gps.buffer);
BartJanssens 0:fe8decc6a938 293 led1 = !led1;
BartJanssens 0:fe8decc6a938 294 wait(1);
BartJanssens 0:fe8decc6a938 295 }
BartJanssens 0:fe8decc6a938 296
BartJanssens 0:fe8decc6a938 297 modeButton.mode( PullDown );
BartJanssens 0:fe8decc6a938 298 modeButton.attach_asserted( &buttonModePressed );
BartJanssens 0:fe8decc6a938 299 minButton.mode( PullDown );
BartJanssens 0:fe8decc6a938 300 minButton.attach_asserted( &buttonMinPressed );
BartJanssens 0:fe8decc6a938 301 plusButton.mode( PullDown );
BartJanssens 0:fe8decc6a938 302 plusButton.attach_asserted( &buttonPlusPressed );
BartJanssens 0:fe8decc6a938 303 modeButton.setSampleFrequency();
BartJanssens 0:fe8decc6a938 304 minButton.setSampleFrequency();
BartJanssens 0:fe8decc6a938 305 plusButton.setSampleFrequency();
BartJanssens 0:fe8decc6a938 306 led4 = 0;
BartJanssens 0:fe8decc6a938 307
BartJanssens 0:fe8decc6a938 308
BartJanssens 0:fe8decc6a938 309
BartJanssens 0:fe8decc6a938 310
BartJanssens 0:fe8decc6a938 311
BartJanssens 0:fe8decc6a938 312 while(1) {
BartJanssens 0:fe8decc6a938 313
BartJanssens 0:fe8decc6a938 314 wait(2);
BartJanssens 0:fe8decc6a938 315 led1 = 1;
BartJanssens 0:fe8decc6a938 316 //printf("%s \r\n",gps.buffer);
BartJanssens 0:fe8decc6a938 317
BartJanssens 0:fe8decc6a938 318
BartJanssens 0:fe8decc6a938 319 if (gprmc_c > MAXGPRMC){
BartJanssens 0:fe8decc6a938 320 lcd.cls();
BartJanssens 0:fe8decc6a938 321 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 322 lcd.printf("Lost connection");
BartJanssens 0:fe8decc6a938 323 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 324 lcd.printf("with GPS module");
BartJanssens 0:fe8decc6a938 325 }
BartJanssens 0:fe8decc6a938 326 else {
BartJanssens 0:fe8decc6a938 327 if (!gps.isTimeValid()){
BartJanssens 0:fe8decc6a938 328 gprmca_c++;
BartJanssens 0:fe8decc6a938 329 if (gprmca_c > MAXGPRMCA) {
BartJanssens 0:fe8decc6a938 330 lcd.cls();
BartJanssens 0:fe8decc6a938 331 lcd.locate(0,0);
BartJanssens 0:fe8decc6a938 332 lcd.printf("Waiting for");
BartJanssens 0:fe8decc6a938 333 lcd.locate(0,1);
BartJanssens 0:fe8decc6a938 334 lcd.printf("valid GPS signal");
BartJanssens 0:fe8decc6a938 335 }
BartJanssens 0:fe8decc6a938 336
BartJanssens 0:fe8decc6a938 337 } else {
BartJanssens 0:fe8decc6a938 338
BartJanssens 0:fe8decc6a938 339 gprmca_c = 0; //Resets the bad GPRMC counter
BartJanssens 0:fe8decc6a938 340 // Grab a snapshot of the current time.
BartJanssens 0:fe8decc6a938 341 gps.timeNow(&q1);
BartJanssens 0:fe8decc6a938 342
BartJanssens 0:fe8decc6a938 343 // Grab velicity
BartJanssens 0:fe8decc6a938 344 gps.vtg(&v1);
BartJanssens 0:fe8decc6a938 345
BartJanssens 0:fe8decc6a938 346 // Grab longitude, latitude and height
BartJanssens 0:fe8decc6a938 347 pos.lo = gps.longitude();
BartJanssens 0:fe8decc6a938 348 pos.la = gps.latitude();;
BartJanssens 0:fe8decc6a938 349 pos.tm = ain.read() *330;
BartJanssens 0:fe8decc6a938 350
BartJanssens 0:fe8decc6a938 351 switch_mode(buttonNone);
BartJanssens 0:fe8decc6a938 352 }
BartJanssens 0:fe8decc6a938 353 }
BartJanssens 0:fe8decc6a938 354
BartJanssens 0:fe8decc6a938 355 gprmc_c++;
BartJanssens 0:fe8decc6a938 356 led1 = 0;
BartJanssens 0:fe8decc6a938 357
BartJanssens 0:fe8decc6a938 358
BartJanssens 0:fe8decc6a938 359 }
BartJanssens 0:fe8decc6a938 360
BartJanssens 0:fe8decc6a938 361
BartJanssens 0:fe8decc6a938 362 }