void
ao_gps_tracking_report(void)
{
    static __xdata struct ao_log_record		gps_log;
    static __xdata struct ao_telemetry_satellite	gps_tracking_data;
    uint8_t	c, n;

    for (;;) {
        ao_sleep(&ao_gps_tracking_data);
        ao_mutex_get(&ao_gps_mutex);
        gps_log.tick = ao_gps_tick;
        memcpy(&gps_tracking_data, &ao_gps_tracking_data, sizeof (ao_gps_tracking_data));
        ao_mutex_put(&ao_gps_mutex);

        if (!(n = gps_tracking_data.channels))
            continue;

        gps_log.type = AO_LOG_GPS_SAT;
        for (c = 0; c < n; c++)
            if ((gps_log.u.gps_sat.svid = gps_tracking_data.sats[c].svid))
            {
                gps_log.u.gps_sat.c_n = gps_tracking_data.sats[c].c_n_1;
                ao_log_data(&gps_log);
            }
    }
}
Exemple #2
0
void
ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset)
{
	ao_mutex_get(&ao_lco_mutex);
	command.tick = ao_time() - tick_offset;
	command.box = box;
	command.cmd = AO_LAUNCH_FIRE;
	command.channels = channels;
	ao_radio_cmac_send(&command, sizeof (command));
	ao_mutex_put(&ao_lco_mutex);
}
Exemple #3
0
int8_t
ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset)
{
	int8_t		r;
	uint16_t	sent_time;

	ao_mutex_get(&ao_lco_mutex);
	command.tick = ao_time() - *tick_offset;
	command.box = box;
	command.cmd = AO_LAUNCH_QUERY;
	command.channels = 0;
	ao_radio_cmac_send(&command, sizeof (command));
	sent_time = ao_time();
	r = ao_radio_cmac_recv(query, sizeof (*query), AO_MS_TO_TICKS(10));
	if (r == AO_RADIO_CMAC_OK)
		*tick_offset = sent_time - query->tick;
	ao_mutex_put(&ao_lco_mutex);
	return r;
}
void
ao_gps_report(void)
{
    static __xdata struct ao_log_record		gps_log;
    static __xdata struct ao_telemetry_location	gps_data;
    uint8_t	date_reported = 0;

    for (;;) {
        ao_sleep(&ao_gps_data);
        ao_mutex_get(&ao_gps_mutex);
        memcpy(&gps_data, &ao_gps_data, sizeof (ao_gps_data));
        ao_mutex_put(&ao_gps_mutex);

        if (!(gps_data.flags & AO_GPS_VALID))
            continue;

        gps_log.tick = ao_gps_tick;
        gps_log.type = AO_LOG_GPS_TIME;
        gps_log.u.gps_time.hour = gps_data.hour;
        gps_log.u.gps_time.minute = gps_data.minute;
        gps_log.u.gps_time.second = gps_data.second;
        gps_log.u.gps_time.flags = gps_data.flags;
        ao_log_data(&gps_log);
        gps_log.type = AO_LOG_GPS_LAT;
        gps_log.u.gps_latitude = gps_data.latitude;
        ao_log_data(&gps_log);
        gps_log.type = AO_LOG_GPS_LON;
        gps_log.u.gps_longitude = gps_data.longitude;
        ao_log_data(&gps_log);
        gps_log.type = AO_LOG_GPS_ALT;
        gps_log.u.gps_altitude.altitude = gps_data.altitude;
        gps_log.u.gps_altitude.unused = 0xffff;
        ao_log_data(&gps_log);
        if (!date_reported && (gps_data.flags & AO_GPS_DATE_VALID)) {
            gps_log.type = AO_LOG_GPS_DATE;
            gps_log.u.gps_date.year = gps_data.year;
            gps_log.u.gps_date.month = gps_data.month;
            gps_log.u.gps_date.day = gps_data.day;
            gps_log.u.gps_date.extra = 0;
            date_reported = ao_log_data(&gps_log);
        }
    }
}
Exemple #5
0
void
ao_spi_put(uint8_t id)
{
	ao_mutex_put(&ao_spi_mutex[id]);
}