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;
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();
}
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();
}
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);
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);
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 == '.')
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);
}
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
* ... 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;
}
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;
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);
}
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 */
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();