first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / drivers / ao_gps_skytraq.c
index 193f20dc4eb4a6af61651534d1816857a7e8355c..00c6932fc646e954d4f65c5263501632c5f4fd47 100644 (file)
@@ -39,11 +39,12 @@ static char ao_gps_char;
 static uint8_t ao_gps_cksum;
 static uint8_t ao_gps_error;
 
-uint16_t ao_gps_tick;
+AO_TICK_TYPE ao_gps_tick;
+AO_TICK_TYPE ao_gps_utc_tick;
 struct ao_telemetry_location   ao_gps_data;
 struct ao_telemetry_satellite  ao_gps_tracking_data;
 
-static uint16_t                                ao_gps_next_tick;
+static AO_TICK_TYPE                    ao_gps_next_tick;
 static struct ao_telemetry_location    ao_gps_next;
 static uint8_t                         ao_gps_date_flags;
 static struct ao_telemetry_satellite   ao_gps_tracking_next;
@@ -88,7 +89,7 @@ ao_gps_lexchar(void)
        ao_gps_char = c;
 }
 
-void
+static void
 ao_gps_skip_field(void)
 {
        for (;;) {
@@ -99,7 +100,7 @@ ao_gps_skip_field(void)
        }
 }
 
-void
+static void
 ao_gps_skip_sep(void)
 {
        char c = ao_gps_char;
@@ -126,7 +127,7 @@ ao_gps_decimal(uint8_t max_width)
                uint8_t c = ao_gps_char;
                if (c < (uint8_t) '0' || (uint8_t) '9' < c)
                        break;
-               v = v * 10 + (uint8_t) (c - (uint8_t) '0');
+               v = (int16_t) (v * 10 + (uint8_t) (c - (uint8_t) '0'));
                ao_gps_num_width++;
                ao_gps_lexchar();
        }
@@ -145,16 +146,15 @@ ao_gps_hex(void)
        ao_gps_num_width = 0;
        while (ao_gps_num_width < 2) {
                uint8_t c = ao_gps_char;
-               uint8_t d;
                if ((uint8_t) '0' <= c && c <= (uint8_t) '9')
-                       d = - '0';
+                       c -= '0';
                else if ((uint8_t) 'A' <= c && c <= (uint8_t) 'F')
-                       d = - 'A' + 10;
+                       c -= 'A' - 10;
                else if ((uint8_t) 'a' <= c && c <= (uint8_t) 'f')
-                       d = - 'a' + 10;
+                       c -= 'a' - 10;
                else
                        break;
-               v = (v << 4) | (c + d);
+               v = (uint8_t) ((v << 4) | c);
                ao_gps_num_width++;
                ao_gps_lexchar();
        }
@@ -164,9 +164,9 @@ ao_gps_hex(void)
 static int32_t
 ao_gps_parse_pos(uint8_t deg_width) 
 {
-       static uint16_t d;
-       static uint8_t  m;
-       static uint16_t f;
+       int16_t         d;
+       int16_t         m;
+       int16_t         f;
        char c;
 
        d = ao_gps_decimal(deg_width);
@@ -256,9 +256,9 @@ ao_nmea_gga(void)
 
        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);
-       ao_gps_next.second = ao_gps_decimal(2);
+       ao_gps_next.hour = (uint8_t) ao_gps_decimal(2);
+       ao_gps_next.minute = (uint8_t) ao_gps_decimal(2);
+       ao_gps_next.second = (uint8_t) ao_gps_decimal(2);
        ao_gps_skip_field();    /* skip seconds fraction */
 
        ao_gps_next.latitude = ao_gps_parse_pos(2);
@@ -268,17 +268,17 @@ ao_nmea_gga(void)
        if (ao_gps_parse_flag('E', 'W'))
                ao_gps_next.longitude = -ao_gps_next.longitude;
 
-       i = ao_gps_decimal(0xff);
+       i = (uint8_t) ao_gps_decimal(0xff);
        if (i == 1)
                ao_gps_next.flags |= AO_GPS_VALID;
 
-       i = ao_gps_decimal(0xff) << AO_GPS_NUM_SAT_SHIFT;
+       i = (uint8_t) (ao_gps_decimal(0xff) << AO_GPS_NUM_SAT_SHIFT);
        if (i > AO_GPS_NUM_SAT_MASK)
                i = AO_GPS_NUM_SAT_MASK;
        ao_gps_next.flags |= i;
 
        ao_gps_lexchar();
-       i = ao_gps_decimal(0xff);
+       i = (uint8_t) ao_gps_decimal(0xff);
        if (i <= 25) {
                i = (uint8_t) 10 * i;
                if (ao_gps_char == '.')
@@ -297,8 +297,8 @@ ao_nmea_gga(void)
        if (!ao_gps_error) {
                ao_mutex_get(&ao_gps_mutex);
                ao_gps_new |= AO_GPS_NEW_DATA;
-               ao_gps_tick = ao_gps_next_tick;
-               ao_xmemcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data));
+               ao_gps_tick = ao_gps_utc_tick = ao_gps_next_tick;
+               memcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data));
                ao_mutex_put(&ao_gps_mutex);
                ao_wakeup(&ao_gps_new);
        }
@@ -307,7 +307,7 @@ ao_nmea_gga(void)
 static void
 ao_nmea_gsv(void)
 {
-       char    c;
+       uint8_t c;
        uint8_t i;
        uint8_t done;
        /* Now read the data into the GPS tracking data record
@@ -326,8 +326,8 @@ ao_nmea_gsv(void)
         *      ...             other SVIDs
         *      72              checksum
         */
-       c = ao_gps_decimal(1);  /* total messages */
-       i = ao_gps_decimal(1);  /* message sequence */
+       c = (uint8_t) ao_gps_decimal(1);        /* total messages */
+       i = (uint8_t) ao_gps_decimal(1);        /* message sequence */
        if (i == 1) {
                ao_gps_tracking_next.channels = 0;
        }
@@ -336,14 +336,14 @@ ao_nmea_gsv(void)
        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;
-               c = ao_gps_decimal(2);  /* SVID */
+               c = (uint8_t) 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 */
-               c = ao_gps_decimal(2);  /* C/N0 */
+               c = (uint8_t) ao_gps_decimal(2);        /* C/N0 */
                if (i < AO_MAX_GPS_TRACKING) {
                        if ((ao_gps_tracking_next.sats[i].c_n_1 = c) != 0)
                                ao_gps_tracking_next.channels = i + 1;
@@ -357,7 +357,7 @@ ao_nmea_gsv(void)
        else if (done) {
                ao_mutex_get(&ao_gps_mutex);
                ao_gps_new |= AO_GPS_NEW_TRACKING;
-               ao_xmemcpy(&ao_gps_tracking_data, &ao_gps_tracking_next, sizeof(ao_gps_tracking_data));
+               memcpy(&ao_gps_tracking_data, &ao_gps_tracking_next, sizeof(ao_gps_tracking_data));
                ao_mutex_put(&ao_gps_mutex);
                ao_wakeup(&ao_gps_new);
        }
@@ -366,7 +366,7 @@ ao_nmea_gsv(void)
 static void
 ao_nmea_rmc(void)
 {
-       char    a, c;
+       uint8_t a, c;
        uint8_t i;
        /* Parse the RMC record to read out the current date */
 
@@ -397,9 +397,9 @@ ao_nmea_rmc(void)
                ao_gps_lexchar();
                ao_gps_skip_field();
        }
-       a = ao_gps_decimal(2);
-       c = ao_gps_decimal(2);
-       i = ao_gps_decimal(2);
+       a = (uint8_t) ao_gps_decimal(2);
+       c = (uint8_t) ao_gps_decimal(2);
+       i = (uint8_t) ao_gps_decimal(2);
 
        ao_nmea_finish();