telegps-v1.0: Provide one log and append to it
[fw/altos] / src / kernel / ao_log_gps.c
index e9e573a52fc5a0c1f6c21483feaa14d48a280b61..7643091cdaa759964cdb5b3e7a214eb8c2df55f5 100644 (file)
 #include <ao_distance.h>
 #include <ao_tracker.h>
 
-static __xdata uint8_t ao_log_mutex;
 static __xdata struct ao_log_gps log;
 
 __code uint8_t ao_log_format = AO_LOG_FORMAT_TELEGPS;
+__code uint8_t ao_log_size = sizeof (struct ao_log_gps);
 
 static uint8_t
 ao_log_csum(__xdata uint8_t *b) __reentrant
@@ -60,57 +60,24 @@ ao_log_gps(__xdata struct ao_log_gps *log) __reentrant
        return wrote;
 }
 
-
-static int32_t prev_lat, prev_lon;
-static int16_t  prev_alt;
-static uint8_t has_prev, unmoving;
-
-#define GPS_SPARSE_UNMOVING_REPORTS    10
-#define GPS_SPARSE_UNMOVING_GROUND     10
-#define GPS_SPARSE_UNMOVING_AIR                10
-
-uint8_t
-ao_log_gps_should_log(int32_t lat, int32_t lon, int16_t alt)
-{
-       if (has_prev && ao_log_running) {
-               uint32_t        h = ao_distance(prev_lat, prev_lon, lat, lon);
-               uint16_t        v = alt > prev_alt ? (alt - prev_alt) : (prev_alt - alt);
-
-               if (h < GPS_SPARSE_UNMOVING_GROUND && v < GPS_SPARSE_UNMOVING_AIR) {
-                       if (unmoving < GPS_SPARSE_UNMOVING_REPORTS)
-                               ++unmoving;
-               } else
-                       unmoving = 0;
-       } else
-               unmoving = 0;
-
-       prev_lat = lat;
-       prev_lon = lon;
-       prev_alt = alt;
-       has_prev = 1;
-       return unmoving >= GPS_SPARSE_UNMOVING_REPORTS;
-}
-
 void
 ao_log_gps_flight(void)
 {
        log.type = AO_LOG_FLIGHT;
        log.tick = ao_time();
        log.u.flight.flight = ao_flight_number;
-       log.u.flight.start_altitude = ao_tracker_start_altitude;
-       log.u.flight.start_latitude = ao_tracker_start_latitude;
-       log.u.flight.start_longitude = ao_tracker_start_longitude;
        ao_log_gps(&log);
 }
 
 void
-ao_log_gps_data(uint16_t tick, uint8_t state, struct ao_telemetry_location *gps_data)
+ao_log_gps_data(uint16_t tick, struct ao_telemetry_location *gps_data)
 {
        log.tick = tick;
        log.type = AO_LOG_GPS_TIME;
        log.u.gps.latitude = gps_data->latitude;
        log.u.gps.longitude = gps_data->longitude;
-       log.u.gps.altitude = gps_data->altitude;
+       log.u.gps.altitude_low = gps_data->altitude_low;
+       log.u.gps.altitude_high = gps_data->altitude_high;
 
        log.u.gps.hour = gps_data->hour;
        log.u.gps.minute = gps_data->minute;
@@ -126,7 +93,6 @@ ao_log_gps_data(uint16_t tick, uint8_t state, struct ao_telemetry_location *gps_
        log.u.gps.hdop = gps_data->hdop;
        log.u.gps.vdop = gps_data->vdop;
        log.u.gps.mode = gps_data->mode;
-       log.u.gps.state = state;
        ao_log_gps(&log);
 }
 
@@ -171,3 +137,16 @@ ao_log_flight(uint8_t slot)
                return log.u.flight.flight;
        return 0;
 }
+
+uint8_t
+ao_log_check(uint32_t pos)
+{
+       if (!ao_storage_read(pos,
+                            &log,
+                            sizeof (struct ao_log_gps)))
+               return 0;
+
+       if (ao_log_dump_check_data())
+               return 1;
+       return 0;
+}