e3af43079728033740513c6c7dc057c0eb313bec
[fw/altos] / src / core / ao_gps_report_mega.c
1 /*
2  * Copyright © 2009 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #include "ao.h"
19 #include "ao_log.h"
20
21 void
22 ao_gps_report_mega(void)
23 {
24         static __xdata struct ao_log_mega               gps_log;
25         static __xdata struct ao_telemetry_location     gps_data;
26         uint8_t date_reported = 0;
27
28         for (;;) {
29                 ao_sleep(&ao_gps_data);
30                 ao_mutex_get(&ao_gps_mutex);
31                 ao_xmemcpy(&gps_data, &ao_gps_data, sizeof (ao_gps_data));
32                 ao_mutex_put(&ao_gps_mutex);
33
34                 if (!(gps_data.flags & AO_GPS_VALID))
35                         continue;
36
37                 gps_log.tick = ao_gps_tick;
38                 gps_log.type = AO_LOG_GPS_TIME;
39                 gps_log.u.gps.latitude = gps_data.latitude;
40                 gps_log.u.gps.longitude = gps_data.longitude;
41                 gps_log.u.gps.altitude = gps_data.altitude;
42
43                 gps_log.u.gps.hour = gps_data.hour;
44                 gps_log.u.gps.minute = gps_data.minute;
45                 gps_log.u.gps.second = gps_data.second;
46                 gps_log.u.gps.flags = gps_data.flags;
47                 gps_log.u.gps.year = gps_data.year;
48                 gps_log.u.gps.month = gps_data.month;
49                 gps_log.u.gps.day = gps_data.day;
50                 ao_log_mega(&gps_log);
51         }
52 }
53
54 void
55 ao_gps_tracking_report_mega(void)
56 {
57         static __xdata struct ao_log_mega               gps_log;
58         static __xdata struct ao_telemetry_satellite    gps_tracking_data;
59         uint8_t c, n, i;
60
61         for (;;) {
62                 ao_sleep(&ao_gps_tracking_data);
63                 ao_mutex_get(&ao_gps_mutex);
64                 ao_xmemcpy(&gps_tracking_data, &ao_gps_tracking_data, sizeof (ao_gps_tracking_data));
65                 ao_mutex_put(&ao_gps_mutex);
66
67                 if (!(n = gps_tracking_data.channels))
68                         continue;
69
70                 gps_log.type = AO_LOG_GPS_SAT;
71                 gps_log.tick = ao_gps_tick;
72                 i = 0;
73                 for (c = 0; c < n; c++)
74                         if ((gps_log.u.gps_sat.sats[i].svid = gps_tracking_data.sats[c].svid))
75                         {
76                                 gps_log.u.gps_sat.sats[i].c_n = gps_tracking_data.sats[c].c_n_1;
77                                 i++;
78                         }
79                 gps_log.u.gps_sat.channels = i;
80                 ao_log_mega(&gps_log);
81         }
82 }
83
84 __xdata struct ao_task ao_gps_report_mega_task;
85 __xdata struct ao_task ao_gps_tracking_report_mega_task;
86
87 void
88 ao_gps_report_mega_init(void)
89 {
90         ao_add_task(&ao_gps_report_mega_task,
91                     ao_gps_report_mega,
92                     "gps_report");
93         ao_add_task(&ao_gps_tracking_report_mega_task,
94                     ao_gps_tracking_report_mega,
95                     "gps_tracking_report");
96 }