Convert GPS to SiRF binary protocol.
[fw/altos] / src / ao_gps_print.c
index 4dced8f10474edf8087c99da6dd000b948984827..bef87aeadaf2c83c62ea14d2a285e945181e6fd3 100644 (file)
 
 #include "ao.h"
 
+struct ao_gps_split {
+       uint8_t positive;
+       uint8_t degrees;
+       uint8_t minutes;
+       uint16_t minutes_fraction;
+};
+
+static void
+ao_gps_split(int32_t v, __xdata struct ao_gps_split *split) __reentrant
+{
+       uint32_t minutes_e7;
+
+       split->positive = 1;
+       if (v < 0) {
+               v = -v;
+               split->positive = 0;
+       }
+       split->degrees = v / 10000000;
+       minutes_e7 = (v % 10000000) * 60;
+       split->minutes = minutes_e7 / 10000000;
+       split->minutes_fraction = (minutes_e7 % 10000000) / 1000;
+}
+
 void
 ao_gps_print(__xdata struct ao_gps_data *gps_data) __reentrant
 {
        printf("GPS %2d sat",
               (gps_data->flags & AO_GPS_NUM_SAT_MASK) >> AO_GPS_NUM_SAT_SHIFT);;
        if (gps_data->flags & AO_GPS_VALID) {
+               static __xdata struct ao_gps_split      lat, lon;
+               ao_gps_split(gps_data->latitude, &lat);
+               ao_gps_split(gps_data->longitude, &lon);
                printf(" %2d:%02d:%02d %2d°%02d.%04d'%c %2d°%02d.%04d'%c %5dm\n",
                       gps_data->hour,
                       gps_data->minute,
                       gps_data->second,
-                      gps_data->latitude.degrees,
-                      gps_data->latitude.minutes,
-                      gps_data->latitude.minutes_fraction,
-                      (gps_data->flags & AO_GPS_LATITUDE_MASK) == AO_GPS_LATITUDE_NORTH ?
-                      'N' : 'S',
-                      gps_data->longitude.degrees,
-                      gps_data->longitude.minutes,
-                      gps_data->longitude.minutes_fraction,
-                      (gps_data->flags & AO_GPS_LONGITUDE_MASK) == AO_GPS_LONGITUDE_WEST ?
-                      'W' : 'E',
+                      lat.degrees,
+                      lat.minutes,
+                      lat.minutes_fraction,
+                      lat.positive ? 'N' : 'S',
+                      lon.degrees,
+                      lon.minutes,
+                      lon.minutes_fraction,
+                      lon.positive ? 'E' : 'W',
                       gps_data->altitude,
                       (gps_data->flags & AO_GPS_NUM_SAT_MASK) >> AO_GPS_NUM_SAT_SHIFT);
        } else {