X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_tracker.c;h=9febc7f090cb6ac33197b40cc054b9ee216e8a39;hb=657d455a2fad36193e6b3a7037d9ba7f09ae1168;hp=f022923027edfcc17bfe42e44f75ed182cc2b1ee;hpb=7e911c2afff78db2e385c6346c90bfcd72a8f3fb;p=fw%2Faltos diff --git a/src/kernel/ao_tracker.c b/src/kernel/ao_tracker.c index f0229230..9febc7f0 100644 --- a/src/kernel/ao_tracker.c +++ b/src/kernel/ao_tracker.c @@ -35,9 +35,22 @@ ao_usb_connected(void) #define ao_usb_connected() 1 #endif -static int32_t last_log_latitude, last_log_longitude; -static int16_t last_log_altitude; -static uint8_t unmoving; +struct gps_position { + int32_t latitude; + int32_t longitude; + int16_t altitude; +}; + +#define GPS_RING 16 + +struct gps_position gps_position[GPS_RING]; + +#define ao_gps_ring_next(n) (((n) + 1) & (GPS_RING - 1)) +#define ao_gps_ring_prev(n) (((n) - 1) & (GPS_RING - 1)) + +static uint8_t gps_head; + +static uint8_t tracker_mutex; static uint8_t log_started; static struct ao_telemetry_location gps_data; static uint8_t tracker_running; @@ -60,7 +73,6 @@ ao_tracker(void) ao_tracker_force_telem = 1; #endif ao_log_scan(); - ao_log_start(); ao_rdf_set(1); @@ -89,58 +101,91 @@ ao_tracker(void) tracker_running = 0; } - if (new_tracker_running && !tracker_running) { + if (new_tracker_running && !tracker_running) ao_telemetry_set_interval(AO_SEC_TO_TICKS(tracker_interval)); - ao_log_start(); - } else if (!new_tracker_running && tracker_running) { + else if (!new_tracker_running && tracker_running) ao_telemetry_set_interval(0); - ao_log_stop(); - } tracker_running = new_tracker_running; - if (!tracker_running) + if (new_tracker_running && !ao_log_running) + ao_log_start(); + else if (!new_tracker_running && ao_log_running) + ao_log_stop(); + + if (!ao_log_running) continue; if (new & AO_GPS_NEW_DATA) { if ((gps_data.flags & (AO_GPS_VALID|AO_GPS_COURSE_VALID)) == (AO_GPS_VALID|AO_GPS_COURSE_VALID)) { - if (log_started) { + uint8_t ring; + uint8_t moving = 0; + + for (ring = ao_gps_ring_next(gps_head); ring != gps_head; ring = ao_gps_ring_next(ring)) { ground_distance = ao_distance(gps_data.latitude, gps_data.longitude, - last_log_latitude, last_log_longitude); - height = last_log_altitude - gps_data.altitude; + gps_position[ring].latitude, + gps_position[ring].longitude); + height = gps_position[ring].altitude - gps_data.altitude; if (height < 0) height = -height; - if (ground_distance <= ao_config.tracker_motion && - height <= ao_config.tracker_motion) + + if (ao_tracker_force_telem) + printf("head %d ring %d ground_distance %d height %d\n", gps_head, ring, ground_distance, height); + if (ground_distance > ao_config.tracker_motion || + height > (ao_config.tracker_motion << 1)) { - if (unmoving < AO_TRACKER_MOTION_COUNT) - unmoving++; - } else - unmoving = 0; + moving = 1; + break; + } } - } else { - if (!log_started) - continue; - if (unmoving < AO_TRACKER_MOTION_COUNT) - unmoving++; - } - - if (unmoving < AO_TRACKER_MOTION_COUNT) { - if (!log_started) { - ao_log_gps_flight(); - log_started = 1; + if (ao_tracker_force_telem) { + printf ("moving %d started %d\n", moving, log_started); + flush(); + } + if (moving) { + ao_mutex_get(&tracker_mutex); + if (!log_started) { + ao_log_gps_flight(); + log_started = 1; + } + ao_log_gps_data(gps_tick, &gps_data); + gps_position[gps_head].latitude = gps_data.latitude; + gps_position[gps_head].longitude = gps_data.longitude; + gps_position[gps_head].altitude = gps_data.altitude; + gps_head = ao_gps_ring_next(gps_head); + ao_mutex_put(&tracker_mutex); } - ao_log_gps_data(gps_tick, &gps_data); - last_log_latitude = gps_data.latitude; - last_log_longitude = gps_data.longitude; - last_log_altitude = gps_data.altitude; } } } } +static uint8_t erasing_current; + +void +ao_tracker_erase_start(uint16_t flight) +{ + erasing_current = flight == ao_flight_number; + if (erasing_current) { + ao_mutex_get(&tracker_mutex); + ao_log_stop(); + if (++ao_flight_number == 0) + ao_flight_number = 1; + } +} + +void +ao_tracker_erase_end(void) +{ + if (erasing_current) { + ao_log_scan(); + log_started = 0; + ao_mutex_put(&tracker_mutex); + } +} + static struct ao_task ao_tracker_task; static void @@ -154,8 +199,8 @@ ao_tracker_set_telem(void) ao_cmd_status = ao_cmd_success; printf ("flight: %d\n", ao_flight_number); printf ("force_telem: %d\n", ao_tracker_force_telem); + printf ("tracker_running: %d\n", tracker_running); printf ("log_started: %d\n", log_started); - printf ("unmoving: %d\n", unmoving); printf ("latitude: %ld\n", (long) gps_data.latitude); printf ("longitude: %ld\n", (long) gps_data.longitude); printf ("altitude: %d\n", gps_data.altitude);