altos: Report continuity in telebt
[fw/altos] / src / core / ao_log_telem.c
index af0e8e6b62717db326515ca942cb415b45a67c23..193c11f300826ba99bda40e8c232a7efda83d111 100644 (file)
 
 __code uint8_t ao_log_format = AO_LOG_FORMAT_TELEMETRY;
 
-static __data uint8_t  ao_log_monitor_pos;
+static __data uint8_t                  ao_log_monitor_pos;
+__pdata enum ao_flight_state           ao_flight_state;
+__pdata int16_t                                ao_max_height;  /* max of ao_height */
+__pdata int16_t                                sense_d, sense_m;
+
+static void
+ao_log_telem_track() {
+       if (ao_monitoring == sizeof (union ao_telemetry_all)) {
+               switch (ao_log_single_write_data.telemetry.generic.type) {
+               case AO_TELEMETRY_SENSOR_TELEMETRUM:
+               case AO_TELEMETRY_SENSOR_TELEMINI:
+                       sense_d = ao_log_single_write_data.telemetry.sensor.sense_d;
+                       sense_m = ao_log_single_write_data.telemetry.sensor.sense_m;
+                       /* fall through ... */
+               case AO_TELEMETRY_SENSOR_TELENANO:
+                       if (ao_log_single_write_data.telemetry.sensor.height > ao_max_height) {
+                               ao_max_height = ao_log_single_write_data.telemetry.sensor.height;
+                       }
+                       if (ao_log_single_write_data.telemetry.sensor.state != ao_flight_state) {
+                               ao_flight_state = ao_log_single_write_data.telemetry.sensor.state;
+                               if (ao_flight_state == ao_flight_pad)
+                                       ao_max_height = 0;
+                               ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
+                       }
+               }
+       }
+}
+
+enum ao_igniter_status
+ao_igniter_status(enum ao_igniter igniter)
+{
+       int16_t value;
+
+       switch (igniter) {
+       case ao_igniter_drogue:
+               value = sense_d;
+               break;
+       case ao_igniter_main:
+               value = sense_m;
+               break;
+       default:
+               value = 0;
+               break;
+       }
+       if (value < AO_IGNITER_OPEN)
+               return ao_igniter_open;
+       else if (value > AO_IGNITER_CLOSED)
+               return ao_igniter_ready;
+       else
+               return ao_igniter_unknown;
+}
 
 void
 ao_log_single(void)
@@ -33,6 +83,7 @@ ao_log_single(void)
 
        ao_log_running = 1;
        ao_log_single_restart();
+       ao_flight_state = ao_flight_startup;
        for (;;) {
                while (!ao_log_running)
                        ao_sleep(&ao_log_running);
@@ -46,6 +97,7 @@ ao_log_single(void)
                                       AO_LOG_SINGLE_SIZE);
                                ao_log_single_write();
                                ao_log_monitor_pos = ao_monitor_ring_next(ao_log_monitor_pos);
+                               ao_log_telem_track();
                        }
                        /* Wait for more telemetry data to arrive */
                        ao_sleep(DATA_TO_XDATA(&ao_monitor_head));