projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master'
[fw/altos]
/
src
/
kernel
/
ao_report.c
diff --git
a/src/kernel/ao_report.c
b/src/kernel/ao_report.c
index f4253b3db9e42f1427a3cda44ec215c13ce74dcf..977cea854ff1f014e0927a25530b34988e2682a8 100644
(file)
--- a/
src/kernel/ao_report.c
+++ b/
src/kernel/ao_report.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
@@
-39,18
+40,25
@@
static const uint8_t flight_reports[] = {
MORSE4(1,0,0,1), /* invalid 'X' */
};
MORSE4(1,0,0,1), /* invalid 'X' */
};
+static enum ao_flight_state ao_report_state;
+
#if HAS_BEEP
#define low(time) ao_beep_for(AO_BEEP_LOW, time)
#define mid(time) ao_beep_for(AO_BEEP_MID, time)
#define high(time) ao_beep_for(AO_BEEP_HIGH, time)
#else
#if HAS_BEEP
#define low(time) ao_beep_for(AO_BEEP_LOW, time)
#define mid(time) ao_beep_for(AO_BEEP_MID, time)
#define high(time) ao_beep_for(AO_BEEP_HIGH, time)
#else
-#define low(time) ao_led_for(AO_LED_GREEN, time)
-#define mid(time) ao_led_for(AO_LED_RED, time)
-#define high(time) ao_led_for(AO_LED_GREEN|AO_LED_RED, time)
+#ifndef AO_LED_LOW
+#define AO_LED_LOW AO_LED_GREEN
+#endif
+#ifndef AO_LED_MID
+#define AO_LED_MID AO_LED_RED
#endif
#endif
-#define pause(time) ao_delay(time)
-static __pdata enum ao_flight_state ao_report_state;
+#define low(time) ao_led_for(AO_LED_LOW, time)
+#define mid(time) ao_led_for(AO_LED_MID, time)
+#define high(time) ao_led_for(AO_LED_MID|AO_LED_LOW, time)
+#endif
+#define pause(time) ao_delay(time)
/*
* Farnsworth spacing
/*
* Farnsworth spacing
@@
-107,7
+115,7
@@
static __pdata enum ao_flight_state ao_report_state;
*/
static void
*/
static void
-ao_report_
beep(void) __reentrant
+ao_report_
flight_state(void)
{
uint8_t r = flight_reports[ao_flight_state];
uint8_t l = r & 7;
{
uint8_t r = flight_reports[ao_flight_state];
uint8_t l = r & 7;
@@
-126,7
+134,7
@@
ao_report_beep(void) __reentrant
}
static void
}
static void
-ao_report_digit(uint8_t digit)
__reentrant
+ao_report_digit(uint8_t digit)
{
if (!digit) {
mid(AO_MS_TO_TICKS(500));
{
if (!digit) {
mid(AO_MS_TO_TICKS(500));
@@
-141,16
+149,16
@@
ao_report_digit(uint8_t digit) __reentrant
}
static void
}
static void
-ao_report_number(int
16
_t n)
+ao_report_number(int
32
_t n)
{
{
-
__xdata
uint8_t digits[10];
-
__pdata
uint8_t ndigits, i;
+ uint8_t digits[10];
+ uint8_t ndigits, i;
if (n < 0)
n = 0;
ndigits = 0;
do {
if (n < 0)
n = 0;
ndigits = 0;
do {
- digits[ndigits++] =
n % 10
;
+ digits[ndigits++] =
(uint8_t) (n % 10)
;
n /= 10;
} while (n);
n /= 10;
} while (n);
@@
-163,25
+171,33
@@
ao_report_number(int16_t n)
static void
ao_report_altitude(void)
{
static void
ao_report_altitude(void)
{
- ao_report_number(ao_max_height);
+ alt_t max_h = ao_max_height;
+ if (ao_config.report_feet) {
+ max_h = max_h * 39 / 12;
+ /* report a leading zero to distinguish */
+ if (max_h)
+ ao_report_digit(0);
+ }
+ ao_report_number(max_h);
}
#if HAS_BATTERY_REPORT
static void
ao_report_battery(void)
{
}
#if HAS_BATTERY_REPORT
static void
ao_report_battery(void)
{
-
__xdata
struct ao_data packet;
+ struct ao_data packet;
for (;;) {
ao_data_get(&packet);
if (packet.adc.v_batt != 0)
break;
for (;;) {
ao_data_get(&packet);
if (packet.adc.v_batt != 0)
break;
- ao_sleep(
DATA_TO_XDATA(&ao_sample_data)
);
+ ao_sleep(
&ao_sample_data
);
}
ao_report_number(ao_battery_decivolt(packet.adc.v_batt));
}
#endif
#if HAS_IGNITE_REPORT
}
ao_report_number(ao_battery_decivolt(packet.adc.v_batt));
}
#endif
#if HAS_IGNITE_REPORT
+#if HAS_IGNITE
static uint8_t
ao_report_igniter_ready(enum ao_igniter igniter)
{
static uint8_t
ao_report_igniter_ready(enum ao_igniter igniter)
{
@@
-191,19
+207,16
@@
ao_report_igniter_ready(enum ao_igniter igniter)
uint8_t
ao_report_igniter(void)
{
uint8_t
ao_report_igniter(void)
{
- return (ao_report_igniter_ready(ao_igniter_drogue) |
- (ao_report_igniter_ready(ao_igniter_main) << 1));
+ return (
uint8_t) (
ao_report_igniter_ready(ao_igniter_drogue) |
+
(ao_report_igniter_ready(ao_igniter_main) << 1));
}
}
+#endif
static void
static void
-ao_report_continuity(void)
__reentrant
+ao_report_continuity(void)
{
{
- uint8_t c;
-
-#if !HAS_IGNITE
- if (!ao_igniter_present)
- return;
-#endif
+ uint8_t c;
+#if HAS_IGNITE
c = ao_report_igniter();
if (c) {
while (c--) {
c = ao_report_igniter();
if (c) {
while (c--) {
@@
-217,8
+230,11
@@
ao_report_continuity(void) __reentrant
low(AO_MS_TO_TICKS(20));
}
}
low(AO_MS_TO_TICKS(20));
}
}
+#endif
#if AO_PYRO_NUM
#if AO_PYRO_NUM
+#if HAS_IGNITE
pause(AO_MS_TO_TICKS(250));
pause(AO_MS_TO_TICKS(250));
+#endif
for(c = 0; c < AO_PYRO_NUM; c++) {
enum ao_igniter_status status = ao_pyro_status(c);
if (status == ao_igniter_ready)
for(c = 0; c < AO_PYRO_NUM; c++) {
enum ao_igniter_status status = ao_pyro_status(c);
if (status == ao_igniter_ready)
@@
-243,7
+259,7
@@
ao_report_continuity(void) __reentrant
}
#endif
}
#endif
-void
+
static
void
ao_report(void)
{
for(;;) {
ao_report(void)
{
for(;;) {
@@
-253,7
+269,12
@@
ao_report(void)
ao_report_battery();
else
#endif
ao_report_battery();
else
#endif
- ao_report_beep();
+ ao_report_flight_state();
+#if HAS_SENSOR_ERRORS
+ if (ao_report_state == ao_flight_invalid && ao_sensor_errors)
+ ao_report_number(ao_sensor_errors);
+#endif
+
if (ao_report_state == ao_flight_landed) {
ao_report_altitude();
#if HAS_FLIGHT
if (ao_report_state == ao_flight_landed) {
ao_report_altitude();
#if HAS_FLIGHT
@@
-271,13
+292,22
@@
ao_report(void)
while (c-- && ao_flight_state == ao_flight_pad)
pause(AO_MS_TO_TICKS(100));
}
while (c-- && ao_flight_state == ao_flight_pad)
pause(AO_MS_TO_TICKS(100));
}
+#endif
+#if HAS_PAD_REPORT
+ while (ao_flight_state == ao_flight_pad) {
+ uint8_t c;
+ ao_report_flight_state();
+ c = 50;
+ while (c-- && ao_flight_state == ao_flight_pad)
+ pause(AO_MS_TO_TICKS(100));
+ }
#endif
while (ao_report_state == ao_flight_state)
#endif
while (ao_report_state == ao_flight_state)
- ao_sleep(
DATA_TO_XDATA(&ao_flight_state)
);
+ ao_sleep(
&ao_flight_state
);
}
}
}
}
-static
__xdata
struct ao_task ao_report_task;
+static struct ao_task ao_report_task;
void
ao_report_init(void)
void
ao_report_init(void)