Report difference from ground to max altitude at landing
[fw/altos] / ao_report.c
index 0753df47cf30957b2e7712ae666c0ed0f19b0319..e52b29281a3a1d46d614fd8c282b294b6afc22cc 100644 (file)
@@ -3,8 +3,7 @@
  *
  * 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; either version 2 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation; version 2 of the License.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -41,9 +40,9 @@ static const char * __xdata flight_reports[] = {
 static __xdata enum ao_flight_state ao_report_state;
 
 static void
-ao_report_beep(void)
+ao_report_beep(void) __reentrant
 {
-       char *r = flight_reports[ao_report_state];
+       char *r = flight_reports[ao_flight_state];
        char c;
 
        if (!r)
@@ -58,10 +57,44 @@ ao_report_beep(void)
        pause(AO_MS_TO_TICKS(400));
 }
 
-void
-ao_report_notify(void)
+static void
+ao_report_digit(uint8_t digit) __reentrant
+{
+       if (!digit) {
+               signal(AO_MS_TO_TICKS(500));
+               pause(AO_MS_TO_TICKS(200));
+       } else {
+               while (digit--) {
+                       signal(AO_MS_TO_TICKS(200));
+                       pause(AO_MS_TO_TICKS(200));
+               }
+       }
+       pause(AO_MS_TO_TICKS(300));
+}
+
+static void
+ao_report_altitude(void)
 {
-       ao_wakeup(&ao_report_state);
+       __xdata int16_t agl = ao_pres_to_altitude(ao_min_pres) - ao_pres_to_altitude(ao_ground_pres);
+       __xdata uint8_t digits[10];
+       __xdata uint8_t ndigits, i;
+
+       if (agl < 0)
+               agl = 0;
+       ndigits = 0;
+       do {
+               digits[ndigits++] = agl % 10;
+               agl /= 10;
+       } while (agl);
+
+       for (;;) {
+               ao_report_beep();
+               i = ndigits;
+               do
+                       ao_report_digit(digits[--i]);
+               while (i != 0);
+               pause(AO_SEC_TO_TICKS(5));
+       }
 }
 
 void
@@ -69,10 +102,12 @@ ao_report(void)
 {
        ao_report_state = ao_flight_state;
        for(;;) {
+               if (ao_flight_state == ao_flight_landed)
+                       ao_report_altitude();
                ao_report_beep();
                __critical {
                        while (ao_report_state == ao_flight_state)
-                               ao_sleep(&ao_report_state);
+                               ao_sleep(DATA_TO_XDATA(&ao_flight_state));
                        ao_report_state = ao_flight_state;
                }
        }
@@ -83,5 +118,5 @@ static __xdata struct ao_task ao_report_task;
 void
 ao_report_init(void)
 {
-       ao_add_task(&ao_report_task, ao_report);
+       ao_add_task(&ao_report_task, ao_report, "report");
 }