+#ifndef GPS_SPARSE_LOG
+#define GPS_SPARSE_LOG 0
+#endif
+
+#if GPS_SPARSE_LOG
+static int32_t prev_lat, prev_lon, 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
+
+static uint8_t
+ao_gps_sparse_should_log(int32_t lat, int32_t lon, int16_t alt)
+{
+ uint8_t ret = 1;
+
+ 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;
+}
+#endif
+