altos: Don't write more than 12 sat infos in ublox driver
[fw/altos] / src / drivers / ao_gps_ublox.c
index a11ca3f731657f7351b3759ac85bdd09d7a4f32b..01169522f2ae49f53852098b8c2e9d797dc25a3f 100644 (file)
 
 #include "ao_gps_ublox.h"
 
-#define AO_UBLOX_DEBUG 1
+#define AO_UBLOX_DEBUG 0
 
 #include <stdarg.h>
 
+__xdata uint8_t ao_gps_new;
 __xdata uint8_t ao_gps_mutex;
 __pdata uint16_t ao_gps_tick;
 __xdata struct ao_telemetry_location   ao_gps_data;
 __xdata struct ao_telemetry_satellite  ao_gps_tracking_data;
 
+#undef AO_SERIAL_SPEED_UBLOX
+
 #ifndef AO_SERIAL_SPEED_UBLOX
-#define AO_SERIAL_SPEED_UBLOX AO_SERIAL_SPEED_57600
+#define AO_SERIAL_SPEED_UBLOX AO_SERIAL_SPEED_9600
 #endif
 
 #if AO_SERIAL_SPEED_UBLOX == AO_SERIAL_SPEED_57600
 #define SERIAL_SPEED_STRING    "57600"
+#define SERIAL_SPEED_CHECKSUM  "2d"
 #endif
 #if AO_SERIAL_SPEED_UBLOX == AO_SERIAL_SPEED_19200
 #define SERIAL_SPEED_STRING    "19200"
+#define SERIAL_SPEED_CHECKSUM  "23"
 #endif
 #if AO_SERIAL_SPEED_UBLOX == AO_SERIAL_SPEED_9600
 #define SERIAL_SPEED_STRING    "9600"
+#define SERIAL_SPEED_CHECKSUM  "16"
 #endif
 
-static const char ao_gps_set_nmea[] = "\r\n$PUBX,41,1,3,1," SERIAL_SPEED_STRING ",0*2d\r\n";
+static const char ao_gps_set_nmea[] =
+       "\r\n$PUBX,41,1,3,1," SERIAL_SPEED_STRING ",0*" SERIAL_SPEED_CHECKSUM "\r\n";
 
 struct ao_ublox_cksum {
        uint8_t a, b;
@@ -696,9 +703,9 @@ ao_gps(void) __reentrant
                        continue;
 
                switch (class) {
-               case 0x01:
+               case UBLOX_NAV:
                        switch (id) {
-                       case 0x21:
+                       case UBLOX_NAV_TIMEUTC:
                                ao_mutex_get(&ao_gps_mutex);
                                ao_gps_tick = ao_time();
 
@@ -739,23 +746,25 @@ ao_gps(void) __reentrant
                                ao_gps_tracking_data.channels = 0;
 
                                struct ao_telemetry_satellite_info *dst = &ao_gps_tracking_data.sats[0];
+                               struct nav_svinfo_sat *src = &nav_svinfo_sat[0];
 
                                for (i = 0; i < nav_svinfo_nsat; i++) {
-                                       struct nav_svinfo_sat *src = &nav_svinfo_sat[i];
-
                                        if (!(src->flags & (1 << NAV_SVINFO_SAT_FLAGS_UNHEALTHY)) &&
                                            src->quality >= NAV_SVINFO_SAT_QUALITY_ACQUIRED)
                                        {
-                                               dst->svid = src->svid;
-                                               dst->c_n_1 = src->cno;
-                                               dst++;
-                                               ao_gps_tracking_data.channels++;
+                                               if (ao_gps_tracking_data.channels < AO_TELEMETRY_SATELLITE_MAX_SAT) {
+                                                       dst->svid = src->svid;
+                                                       dst->c_n_1 = src->cno;
+                                                       dst++;
+                                                       ao_gps_tracking_data.channels++;
+                                               }
                                        }
+                                       src++;
                                }
 
                                ao_mutex_put(&ao_gps_mutex);
-                               ao_wakeup(&ao_gps_data);
-                               ao_wakeup(&ao_gps_tracking_data);
+                               ao_gps_new = AO_GPS_NEW_DATA | AO_GPS_NEW_TRACKING;
+                               ao_wakeup(&ao_gps_new);
                                break;
                        }
                        break;