Calculates azimuth and elevation of a satellite dish based on its longitude, latitude and selected satellite.
Dependencies: PinDetect TextLCD mbed MODGPS
main.cpp@0:fe8decc6a938, 2012-03-29 (annotated)
- Committer:
- BartJanssens
- Date:
- Thu Mar 29 09:26:14 2012 +0000
- Revision:
- 0:fe8decc6a938
Who changed what in which revision?
User | Revision | Line number | New 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 '�' |
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 '�' |
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 '�' |
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 | } |