AltosTelemetryReader: actually open serial port
[fw/altos] / src / ao_gps_skytraq.c
index 0dd45c0c7f9a57659f88cf488393b4582545e1f7..2d3d464c881fa79342cfc1b3b79e5da203ce9386 100644 (file)
@@ -28,9 +28,11 @@ static __xdata char ao_gps_char;
 static __xdata uint8_t ao_gps_cksum;
 static __xdata 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;
 
+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;
@@ -248,6 +250,7 @@ ao_gps(void) __reentrant
                         *         *66          checksum
                         */
 
+                       ao_gps_next_tick = ao_time();
                        ao_gps_next.flags = AO_GPS_RUNNING | ao_gps_date_flags;
                        ao_gps_next.hour = ao_gps_decimal(2);
                        ao_gps_next.minute = ao_gps_decimal(2);
@@ -297,6 +300,7 @@ ao_gps(void) __reentrant
                                ao_gps_error = 1;
                        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));
                                ao_mutex_put(&ao_gps_mutex);
                                ao_wakeup(&ao_gps_data);
@@ -329,14 +333,19 @@ ao_gps(void) __reentrant
                        ao_gps_skip_field();    /* sats in view */
                        while (ao_gps_char != '*' && ao_gps_char != '\n' && ao_gps_char != '\r') {
                                i = ao_gps_tracking_next.channels;
-                               ao_gps_tracking_next.sats[i].svid = ao_gps_decimal(2);  /* SVID */
+                               c = ao_gps_decimal(2);  /* SVID */
+                               if (i < AO_MAX_GPS_TRACKING)
+                                       ao_gps_tracking_next.sats[i].svid = c;
                                ao_gps_lexchar();
                                ao_gps_skip_field();    /* elevation */
                                ao_gps_lexchar();
                                ao_gps_skip_field();    /* azimuth */
-                               if (!(ao_gps_tracking_next.sats[i].c_n_1 = ao_gps_decimal(2)))  /* C/N0 */
-                                       ao_gps_tracking_next.sats[i].svid = 0;
-                               ao_gps_tracking_next.channels = i + 1;
+                               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_char == '*') {
                                uint8_t cksum = ao_gps_cksum ^ '*';
@@ -418,6 +427,7 @@ gps_dump(void) __reentrant
        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);
        ao_mutex_put(&ao_gps_mutex);
 }