#define AO_GPS_LEADER 2
-static const char ao_gps_header[] = "GP";
+static __code char ao_gps_header[] = "GP";
__xdata uint8_t ao_gps_mutex;
-static __xdata char ao_gps_char;
-static __xdata uint8_t ao_gps_cksum;
-static __xdata uint8_t ao_gps_error;
+static __pdata char ao_gps_char;
+static __pdata uint8_t ao_gps_cksum;
+static __pdata uint8_t ao_gps_error;
-__xdata uint16_t ao_gps_tick;
-__xdata struct ao_gps_data ao_gps_data;
-__xdata struct ao_gps_tracking_data ao_gps_tracking_data;
+__pdata uint16_t ao_gps_tick;
+__xdata struct ao_telemetry_location ao_gps_data;
+__xdata struct ao_telemetry_satellite ao_gps_tracking_data;
-static __xdata uint16_t ao_gps_next_tick;
-static __xdata struct ao_gps_data ao_gps_next;
-static __xdata uint8_t ao_gps_date_flags;
-static __xdata struct ao_gps_tracking_data ao_gps_tracking_next;
+static __pdata uint16_t ao_gps_next_tick;
+static __xdata struct ao_telemetry_location ao_gps_next;
+static __pdata uint8_t ao_gps_date_flags;
+static __xdata struct ao_telemetry_satellite ao_gps_tracking_next;
#define STQ_S 0xa0, 0xa1
#define STQ_E 0x0d, 0x0a
STQ_S, 0,15, id, a,b,c,d,e,f,g,h,i,j,k,l,m,n, \
(id^a^b^c^d^e^f^g^h^i^j^k^l^m^n), STQ_E
-static const uint8_t ao_gps_config[] = {
+static __code uint8_t ao_gps_config[] = {
SKYTRAQ_MSG_8(0x08, 1, 1, 1, 1, 1, 1, 1, 0), /* configure nmea */
/* gga interval */
/* gsa interval */
ao_gps_lexchar();
}
-__xdata static uint8_t ao_gps_num_width;
+__pdata static uint8_t ao_gps_num_width;
static int16_t
ao_gps_decimal(uint8_t max_width)
{
int16_t v;
- __xdata uint8_t neg = 0;
+ __pdata uint8_t neg = 0;
ao_gps_skip_sep();
if (ao_gps_char == '-') {
if (!ao_gps_error) {
ao_mutex_get(&ao_gps_mutex);
ao_gps_tick = ao_gps_next_tick;
- memcpy(&ao_gps_data, &ao_gps_next, sizeof (struct ao_gps_data));
+ memcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data));
ao_mutex_put(&ao_gps_mutex);
ao_wakeup(&ao_gps_data);
}
ao_gps_skip_field(); /* azimuth */
c = ao_gps_decimal(2); /* C/N0 */
if (i < AO_MAX_GPS_TRACKING) {
- if (!(ao_gps_tracking_next.sats[i].c_n_1 = c))
- ao_gps_tracking_next.sats[i].svid = 0;
- ao_gps_tracking_next.channels = i + 1;
+ if ((ao_gps_tracking_next.sats[i].c_n_1 = c) != 0)
+ ao_gps_tracking_next.channels = i + 1;
}
}
if (ao_gps_char == '*') {
}
}
-#define ao_skytraq_sendstruct(s) ao_skytraq_sendbytes((s), (s)+sizeof(s))
+#define ao_skytraq_sendstruct(s) ao_skytraq_sendbytes((s), sizeof(s))
static void
-ao_skytraq_sendbytes(const uint8_t *b, const uint8_t *e)
+ao_skytraq_sendbytes(__code uint8_t *b, uint8_t l)
{
- while (b != e) {
- if (*b == 0xa0)
+ while (l--) {
+ uint8_t c = *b++;
+ if (c == 0xa0)
ao_delay(AO_MS_TO_TICKS(500));
- ao_serial_putchar(*b++);
+ ao_serial_putchar(c);
}
}
static void
gps_dump(void) __reentrant
{
+ uint8_t i;
ao_mutex_get(&ao_gps_mutex);
printf ("Date: %02d/%02d/%02d\n", ao_gps_data.year, ao_gps_data.month, ao_gps_data.day);
printf ("Time: %02d:%02d:%02d\n", ao_gps_data.hour, ao_gps_data.minute, ao_gps_data.second);
printf ("Lat/Lon: %ld %ld\n", ao_gps_data.latitude, ao_gps_data.longitude);
printf ("Alt: %d\n", ao_gps_data.altitude);
printf ("Flags: 0x%x\n", ao_gps_data.flags);
+ printf ("Sats: %d", ao_gps_tracking_data.channels);
+ for (i = 0; i < ao_gps_tracking_data.channels; i++)
+ printf (" %d %d",
+ ao_gps_tracking_data.sats[i].svid,
+ ao_gps_tracking_data.sats[i].c_n_1);
+ printf ("\ndone\n");
ao_mutex_put(&ao_gps_mutex);
}
__code struct ao_cmds ao_gps_cmds[] = {
- { gps_dump, "g\0Display current GPS values" },
+ { gps_dump, "g\0Display GPS" },
{ 0, NULL },
};