d1bcfa8b717b57246be89966e551a2411a454f38
[olsrd.git] / lib / pud / nmealib / samples / math / main.c
1 /*\r
2  * This file is part of nmealib.\r
3  *\r
4  * Copyright (c) 2008 Timur Sinitsyn\r
5  * Copyright (c) 2011 Ferry Huberts\r
6  *\r
7  * This library is free software; you can redistribute it and/or\r
8  * modify it under the terms of the GNU Lesser General Public\r
9  * License as published by the Free Software Foundation; either\r
10  * version 2.1 of the License, or (at your option) any later version.\r
11  *\r
12  * This library is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
15  * Lesser General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
19  */\r
20 \r
21 #include <nmea/nmea.h>\r
22 \r
23 #include <stdio.h>\r
24 #include <string.h>\r
25 \r
26 #define NUM_POINTS 4\r
27 \r
28 int main()\r
29 {\r
30     const char *buff[] = {\r
31         "$GPRMC,213916.199,A,4221.0377,N,07102.9778,W,0.00,,010207,,,A*6A\r\n",\r
32         "$GPRMC,213917.199,A,4221.0510,N,07102.9549,W,0.23,175.43,010207,,,A*77\r\n",\r
33         "$GPRMC,213925.000,A,4221.1129,N,07102.9146,W,0.00,,010207,,,A*68\r\n",\r
34         "$GPRMC,111609.14,A,5001.27,N,3613.06,E,11.2,0.0,261206,0.0,E*50\r\n"\r
35     };\r
36 \r
37     nmeaPOS pos[NUM_POINTS], pos_moved[NUM_POINTS][2];\r
38     double dist[NUM_POINTS][2]; \r
39     double azimuth[NUM_POINTS][2], azimuth_moved[NUM_POINTS];\r
40     int result[2];\r
41     int it = 0;\r
42 \r
43     nmeaPARSER parser;\r
44     nmea_parser_init(&parser);\r
45 \r
46     for(it = 0; it < NUM_POINTS; ++it)\r
47     {\r
48         nmeaINFO info;\r
49         nmea_zero_INFO(&info);\r
50         (void)nmea_parse(&parser, buff[it], (int)strlen(buff[it]), &info);\r
51         nmea_info2pos(&info, &pos[it]);\r
52     }\r
53 \r
54     nmea_parser_destroy(&parser);\r
55 \r
56     for(it = 0; it < NUM_POINTS; ++it)\r
57     {\r
58         dist[it][0] = nmea_distance(&pos[0], &pos[it]);\r
59         dist[it][1] = nmea_distance_ellipsoid(\r
60             &pos[0], &pos[it], &azimuth[it][0], &azimuth[it][1]\r
61             );\r
62     }\r
63 \r
64     for(it = 0; it < NUM_POINTS; ++it)\r
65     {\r
66         result[0] = nmea_move_horz(&pos[0], &pos_moved[it][0], azimuth[it][0], dist[it][0]);\r
67         result[1] = nmea_move_horz_ellipsoid(\r
68             &pos[0], &pos_moved[it][1], azimuth[it][0], dist[it][0], &azimuth_moved[it]\r
69             );\r
70 \r
71     }\r
72 \r
73     /* Output of results */\r
74     printf("Coordinate points:\n");\r
75     for(it = 0; it < NUM_POINTS; ++it)\r
76     {\r
77         printf(\r
78             "P%d in radians: lat:%9.6lf lon:%9.6lf  \tin degree: lat:%+010.6lf° lon:%+011.6lf°\n",\r
79             it, pos[it].lat, pos[it].lon, nmea_radian2degree(pos[it].lat), nmea_radian2degree(pos[it].lon)\r
80             );\r
81     }\r
82 \r
83     printf("\nCalculation results:\n");\r
84     for(it = 0; it < NUM_POINTS; ++it)\r
85     {\r
86         printf("\n");\r
87         printf("Distance P0 to P%d\ton spheroid:  %14.3lf m\n", it, dist[it][0]);\r
88         printf("Distance P0 to P%d\ton ellipsoid: %14.3lf m\n", it, dist[it][1]);\r
89         printf("Azimuth  P0 to P%d\tat start: %8.3lf°\tat end: %8.3lf°\n", it, nmea_radian2degree(azimuth[it][0]), nmea_radian2degree(azimuth[it][1]));\r
90         printf("Move     P0 to P%d\t         \tAzimuth at end: %8.3lf°\n", it, nmea_radian2degree(azimuth_moved[it]));\r
91         printf("Move     P0 to P%d\ton spheroid:  %3s lat:%+010.6lf° lon:%+011.6lf°\n", it, result[0] == 1 ? "OK" : "nOK", nmea_radian2degree(pos_moved[it][0].lat), nmea_radian2degree(pos_moved[it][0].lon));\r
92         printf("Move     P0 to P%d\ton ellipsoid: %3s lat:%+010.6lf° lon:%+011.6lf°\n", it, result[0] == 1 ? "OK" : "nOK", nmea_radian2degree(pos_moved[it][1].lat), nmea_radian2degree(pos_moved[it][1].lon));\r
93         printf("Move     P0 to P%d\toriginal:         lat:%+010.6lf° lon:%+011.6lf°\n", it, nmea_radian2degree(pos[it].lat), nmea_radian2degree(pos[it].lon));\r
94     }\r
95 \r
96     return 0;\r
97 }\r