projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos: Don't wait while idle if trying to minimize interrupt latency
[fw/altos]
/
src
/
kernel
/
ao_telemetry.c
diff --git
a/src/kernel/ao_telemetry.c
b/src/kernel/ao_telemetry.c
index e2197f7a24cb1f9ad735ed49ea0d3c7c99cfb3c3..fa8178240e45b97f60c71717eb77d76fd3e3e69c 100644
(file)
--- a/
src/kernel/ao_telemetry.c
+++ b/
src/kernel/ao_telemetry.c
@@
-3,7
+3,8
@@
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
@@
-75,6
+76,13
@@
static __pdata uint16_t ao_aprs_time;
static __xdata union ao_telemetry_all telemetry;
static __xdata union ao_telemetry_all telemetry;
+static void
+ao_telemetry_send(void)
+{
+ ao_radio_send(&telemetry, sizeof (telemetry));
+ ao_delay(1);
+}
+
#if defined AO_TELEMETRY_SENSOR
/* Send sensor packet */
static void
#if defined AO_TELEMETRY_SENSOR
/* Send sensor packet */
static void
@@
-117,7
+125,7
@@
ao_send_sensor(void)
telemetry.sensor.accel_minus_g = 0;
#endif
telemetry.sensor.accel_minus_g = 0;
#endif
- ao_
radio_send(&telemetry, sizeof (telemetry)
);
+ ao_
telemetry_send(
);
}
#endif
}
#endif
@@
-156,7
+164,7
@@
ao_send_mega_sensor(void)
telemetry.mega_sensor.mag_z = packet->hmc5883.z;
#endif
telemetry.mega_sensor.mag_z = packet->hmc5883.z;
#endif
- ao_
radio_send(&telemetry, sizeof (telemetry)
);
+ ao_
telemetry_send(
);
}
static __pdata int8_t ao_telemetry_mega_data_max;
}
static __pdata int8_t ao_telemetry_mega_data_max;
@@
-190,8
+198,8
@@
ao_send_mega_data(void)
telemetry.mega_data.speed = ao_speed;
telemetry.mega_data.height = ao_height;
telemetry.mega_data.speed = ao_speed;
telemetry.mega_data.height = ao_height;
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_mega_data_cur = ao_telemetry_mega_data_max;
ao_telemetry_mega_data_cur = ao_telemetry_mega_data_max;
+ ao_telemetry_send();
}
}
#endif /* AO_SEND_MEGA */
}
}
#endif /* AO_SEND_MEGA */
@@
-221,7
+229,7
@@
ao_send_metrum_sensor(void)
telemetry.metrum_sensor.sense_a = packet->adc.sense_a;
telemetry.metrum_sensor.sense_m = packet->adc.sense_m;
telemetry.metrum_sensor.sense_a = packet->adc.sense_a;
telemetry.metrum_sensor.sense_m = packet->adc.sense_m;
- ao_
radio_send(&telemetry, sizeof (telemetry)
);
+ ao_
telemetry_send(
);
}
static __pdata int8_t ao_telemetry_metrum_data_max;
}
static __pdata int8_t ao_telemetry_metrum_data_max;
@@
-248,8
+256,8
@@
ao_send_metrum_data(void)
telemetry.metrum_data.accel_minus_g = 2;
#endif
telemetry.metrum_data.accel_minus_g = 2;
#endif
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max;
ao_telemetry_metrum_data_cur = ao_telemetry_metrum_data_max;
+ ao_telemetry_send();
}
}
#endif /* AO_SEND_METRUM */
}
}
#endif /* AO_SEND_METRUM */
@@
-262,7
+270,7
@@
ao_send_mini(void)
__xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
telemetry.generic.tick = packet->tick;
__xdata struct ao_data *packet = (__xdata struct ao_data *) &ao_data_ring[ao_data_ring_prev(ao_sample_data)];
telemetry.generic.tick = packet->tick;
- telemetry.generic.type = AO_
TELEMETRY
_MINI;
+ telemetry.generic.type = AO_
SEND
_MINI;
telemetry.mini.state = ao_flight_state;
telemetry.mini.state = ao_flight_state;
@@
-279,13
+287,14
@@
ao_send_mini(void)
telemetry.mini.ground_pres = ao_ground_pres;
telemetry.mini.ground_pres = ao_ground_pres;
- ao_
radio_send(&telemetry, sizeof (telemetry)
);
+ ao_
telemetry_send(
);
}
#endif /* AO_SEND_MINI */
static __pdata int8_t ao_telemetry_config_max;
static __pdata int8_t ao_telemetry_config_cur;
}
#endif /* AO_SEND_MINI */
static __pdata int8_t ao_telemetry_config_max;
static __pdata int8_t ao_telemetry_config_cur;
+static __pdata uint16_t ao_telemetry_flight_number;
static void
ao_send_configuration(void)
static void
ao_send_configuration(void)
@@
-294,11
+303,7
@@
ao_send_configuration(void)
{
telemetry.generic.type = AO_TELEMETRY_CONFIGURATION;
telemetry.configuration.device = AO_idProduct_NUMBER;
{
telemetry.generic.type = AO_TELEMETRY_CONFIGURATION;
telemetry.configuration.device = AO_idProduct_NUMBER;
-#if HAS_LOG
- telemetry.configuration.flight = ao_log_full() ? 0 : ao_flight_number;
-#else
- telemetry.configuration.flight = ao_flight_number;
-#endif
+ telemetry.configuration.flight = ao_telemetry_flight_number;
telemetry.configuration.config_major = AO_CONFIG_MAJOR;
telemetry.configuration.config_minor = AO_CONFIG_MINOR;
#if AO_idProduct_NUMBER == 0x25 && HAS_ADC
telemetry.configuration.config_major = AO_CONFIG_MAJOR;
telemetry.configuration.config_minor = AO_CONFIG_MINOR;
#if AO_idProduct_NUMBER == 0x25 && HAS_ADC
@@
-316,8
+321,8
@@
ao_send_configuration(void)
ao_xmemcpy (telemetry.configuration.version,
CODE_TO_XDATA(ao_version),
AO_MAX_VERSION);
ao_xmemcpy (telemetry.configuration.version,
CODE_TO_XDATA(ao_version),
AO_MAX_VERSION);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_config_cur = ao_telemetry_config_max;
ao_telemetry_config_cur = ao_telemetry_config_max;
+ ao_telemetry_send();
}
}
}
}
@@
-339,8
+344,8
@@
ao_send_location(void)
27);
telemetry.location.tick = ao_gps_tick;
ao_mutex_put(&ao_gps_mutex);
27);
telemetry.location.tick = ao_gps_tick;
ao_mutex_put(&ao_gps_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_loc_cur = ao_telemetry_gps_max;
ao_telemetry_loc_cur = ao_telemetry_gps_max;
+ ao_telemetry_send();
}
}
}
}
@@
-356,8
+361,8
@@
ao_send_satellite(void)
&ao_gps_tracking_data.sats,
AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info));
ao_mutex_put(&ao_gps_mutex);
&ao_gps_tracking_data.sats,
AO_MAX_GPS_TRACKING * sizeof (struct ao_telemetry_satellite_info));
ao_mutex_put(&ao_gps_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_sat_cur = ao_telemetry_gps_max;
ao_telemetry_sat_cur = ao_telemetry_gps_max;
+ ao_telemetry_send();
}
}
#endif
}
}
#endif
@@
-380,8
+385,8
@@
ao_send_companion(void)
ao_companion_data,
ao_companion_setup.channels * 2);
ao_mutex_put(&ao_companion_mutex);
ao_companion_data,
ao_companion_setup.channels * 2);
ao_mutex_put(&ao_companion_mutex);
- ao_radio_send(&telemetry, sizeof (telemetry));
ao_telemetry_companion_cur = ao_telemetry_companion_max;
ao_telemetry_companion_cur = ao_telemetry_companion_max;
+ ao_telemetry_send();
}
}
#endif
}
}
#endif
@@
-398,6
+403,11
@@
ao_telemetry(void)
while (!ao_flight_number)
ao_sleep(&ao_flight_number);
while (!ao_flight_number)
ao_sleep(&ao_flight_number);
+ ao_telemetry_flight_number = ao_flight_number;
+#if HAS_LOG
+ if (ao_log_full())
+ ao_telemetry_flight_number = 0;
+#endif
telemetry.generic.serial = ao_serial_number;
for (;;) {
while (ao_telemetry_interval == 0)
telemetry.generic.serial = ao_serial_number;
for (;;) {
while (ao_telemetry_interval == 0)
@@
-486,9
+496,7
@@
ao_telemetry(void)
#endif /* HAS_APRS */
delay = time - ao_time();
if (delay > 0) {
#endif /* HAS_APRS */
delay = time - ao_time();
if (delay > 0) {
- ao_alarm(delay);
- ao_sleep(&telemetry);
- ao_clear_alarm();
+ ao_sleep_for(&telemetry, delay);
}
}
}
}
}
}