| 
					
				 | 
			
			
				@@ -129,19 +129,20 @@ unsigned char gpx_write(struct location_s *loc, FIL *file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (!gpx.paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			strcpy_P(buf, xml_trkseg_end); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			gpx.paused = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 0; /* nothing to store */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return 0; /* nothing to store */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (gpx.paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		strcpy_P(buf, xml_trkseg_start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		f_write(file, buf, strlen(buf), &bw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		gpx.paused = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (gpx.paused) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			strcpy_P(buf, xml_trkseg_start); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			f_write(file, buf, strlen(buf), &bw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			gpx.paused = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		time = get_iso_time(loc->time, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		xsprintf(buf, PSTR("\t\t\t<trkpt lat=\"%.8f\" lon=\"%.8f\">\n\t\t\t\t<time>%s</time>\n"), loc->lat, loc->lon, time); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/* alt */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		strcat_P(buf, PSTR("\t\t\t</trkpt>\n")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	time = get_iso_time(loc->time, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	xsprintf(buf, PSTR("\t\t\t<trkpt lat=\"%.8f\" lon=\"%.8f\">\n\t\t\t\t<time>%s</time>\n"), loc->lat, loc->lon, time); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	/* alt */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	strcat_P(buf, PSTR("\t\t\t</trkpt>\n")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return f_write(file, buf, strlen(buf), &bw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,12 +158,16 @@ unsigned char gpx_close(FIL *file) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void gpx_process_point(struct location_s *loc, FIL *file){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	float lon_est, lon_err, lat_est, lat_err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float lon_est, lon_err, lat_est, lat_err, dist = NAN; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	struct location_s *ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	struct location_s nloc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (get_flag(CONFFLAG_DISABLE_FILTERS)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		xputs_P(PSTR("Write with filters disabled\r\n")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		prev_points_append(loc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(gpx.prev_points.count == PREV_POINTS_LENGTH){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			dist = distance(prev_points_get(2), prev_points_get(3)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		gpx_write(loc, file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		lat_est = kalman_predict(&gpx.kalman[0], loc->lat); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -189,6 +194,7 @@ void gpx_process_point(struct location_s *loc, FIL *file){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ptr = prev_points_get(PREV_POINTS_LENGTH - 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			dist = dist34; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if(gpx.prev_points.count >= PREV_POINTS_LENGTH-2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				ptr = prev_points_get(gpx.prev_points.count - 2); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -220,9 +226,11 @@ void gpx_process_point(struct location_s *loc, FIL *file){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			gpx.avg_store.time = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			gpx.last_saved = nloc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			gpx_write(&nloc, file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (isnan(dist)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	add_distance(dist); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void kalman_init(struct kalman_s *k){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -253,10 +261,23 @@ float kalman_predict(struct kalman_s *k, float data){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return x_est; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define R_EARTH	6371e3 // m 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 float distance(struct location_s *pos1, struct location_s *pos2){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	float lon_delta = fabs(pos1->lon - pos2->lon) * 111139.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	float lat_delta = fabs(pos1->lat - pos2->lat) * 111139.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//	xprintf(PSTR("lat1=%f; lat2=%f; lon1=%f; lon2=%f; lat_delta=%f; lon_delta=%f\r\n"), pos1->lat, pos2->lat, pos1->lon, pos2->lon, lon_delta, lat_delta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return sqrtf(lon_delta * lon_delta + lat_delta * lat_delta); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float lat1 = pos1->lat * M_PI / 180.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float lat2 = pos2->lat * M_PI / 180.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float dlat = (pos2->lat - pos1->lat) * M_PI / 180.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float dlon = (pos2->lon - pos1->lon) * M_PI / 180.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float a = sinf(dlat/2.0) * sinf(dlat/2.0) + cosf(lat1) * cosf(lat2) * sinf(dlon/2.0) * sinf(dlon/2.0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float c = 2 * atan2f(sqrtf(a), sqrtf(1-a)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	float ret = R_EARTH * c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.distance += (ret+0.005)*100.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	xprintf(PSTR("Distance: %f m; sum: %f m\r\n"), ret, System.distance/100.0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void add_distance(float dist) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	System.distance += (dist+0.005)*100.0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	xprintf(PSTR("Distance: %f m; sum: %f m\r\n"), dist, System.distance/100.0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |