Rev 958 Rev 984
Line 1... Line 1...
1 /**** GPS skrysohledac ****/ 1 /**** GPS skrysohledac ****/
2 #define ID "$Id: gps.c 958 2008-01-06 12:42:53Z kakl $" 2 #define ID "$Id: gps.c 984 2008-01-06 23:41:31Z kakl $"
3   3  
4 #include "gps.h" 4 #include "gps.h"
5   5  
6 #include <math.h> 6 #include <math.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
Line 23... Line 23...
23 #define MIN_LEN 7 23 #define MIN_LEN 7
24 #define AZIMUTH 46 24 #define AZIMUTH 46
25 #define NMEA_LINESIZE 60 25 #define NMEA_LINESIZE 60
26   26  
27 #define MAXGC 4 27 #define MAXGC 4
28   -  
29 struct geocache 28 struct geocache
30 { 29 {
31 float lat; 30 float lat;
32 float lon; 31 float lon;
33 char name[8]; 32 char name[8];
34 }; 33 };
35   34  
36 struct geocache const gc[MAXGC] = 35 struct geocache const gc[MAXGC] =
37 { 36 {
38 {49*60+15.5740,14*60+42.3310,"GCCISTI"}, // Testovaci souradnice: cisticka 37 {49*60+15.5740,14*60+42.3310,"DOMA"}, // Testovaci souradnice: cisticka
39 {49*60+12.4452,14*60+18.9079,"GCKOMET"}, // Testovaci souradnice: kometa 38 {48*60+57.966,14*60+28.655,"GC16JMH"},
40 {49*60+12.4452,14*60+18.9079,"GCXXX3"}, 39 {48*60+57.837,14*60+28.599,"GC16F8Y"},
41 {49*60+12.4452,14*60+18.9079,"GCXXX4"} 40 {49*60+9.542,14*60+56.417,"GC-----"}
42 }; 41 };
43   42  
44 float lat,lon; // Latitude, Longitude, Azimuth 43 float lat,lon; // Latitude, Longitude, Azimuth
45 int16 az; 44 int16 az;
46 int8 gcnum; // Selection of the GC point 45 int8 gcnum; // Selection of the GC point
Line 105... Line 104...
105 setup_comparator(NC_NC_NC_NC); 104 setup_comparator(NC_NC_NC_NC);
106 setup_vref(VREF_LOW|-2); 105 setup_vref(VREF_LOW|-2);
107 lcd_init(); 106 lcd_init();
108   107  
109 gcnum++; // Next GC 108 gcnum++; // Next GC
110 if (gcnum>(MAXGC-1)) gcnum=0; 109 if (gcnum>(MAXGC-1)) gcnum=0;
111   110  
112 delay_ms(200); 111 delay_ms(200);
113 lcd_gotoxy(1,2); 112 lcd_gotoxy(1,2);
114 printf(lcd_putc,"%s",gc[gcnum].name); // Print GC name 113 printf(lcd_putc,"%s",gc[gcnum].name); // Print GC name
115   114  
Line 119... Line 118...
119   118  
120 lon=(gc[gcnum].lon-lon)*1214; // Kakona's projection :) 119 lon=(gc[gcnum].lon-lon)*1214; // Kakona's projection :)
121 lat=(gc[gcnum].lat-lat)*1854; 120 lat=(gc[gcnum].lat-lat)*1854;
122   121  
123 lcd_gotoxy(1,4); 122 lcd_gotoxy(1,4);
124 printf(lcd_putc,"%.0g* ",sqrt((lon*lon) + (lat*lat))); // Distance 123 printf(lcd_putc,"%.0gm ",sqrt((lon*lon) + (lat*lat))); // Distance
125 lcd_gotoxy(1,1); 124 lcd_gotoxy(1,1);
126 if (lon==0) lon=0.001; // Divided by zero cure 125 if (lon==0) lon=0.001; // Divided by zero cure
127 lon=3-(6/PI*atan2(lat,lon)); // Bearing 126 lon=3-(6/PI*atan2(lat,lon)); // Bearing
128 if (lon<0) lon+=12; // overflow cure 127 if (lon<0) lon+=12; // overflow cure
129 if (lon>12) lon-=12; 128 if (lon>12) lon-=12;
130 printf(lcd_putc,"BE%2.0g*",lon); 129 printf(lcd_putc,"BE%2.0gh*",lon);
131 lat=12.0/360*az; // Azimuth of the movement 130 lat=12.0/360*az; // Azimuth of the movement
132 lon=lon-lat; // Heading 131 lon=lon-lat; // Heading
133 if (lon<0) lon+=12; // overflow cure 132 if (lon<0) lon+=12; // overflow cure
134 if (lon>12) lon-=12; 133 if (lon>12) lon-=12;
135 printf(lcd_putc,"HE%2.0g*AZ%2.0g* ",lon,lat); 134 printf(lcd_putc,"HE%2.0gh*AZ%2.0gh*",lon,lat);
136 } 135 }
137 } 136 }
138 137