altos: Test APRS altitude encoding
authorKeith Packard <keithp@keithp.com>
Sat, 31 May 2014 00:30:08 +0000 (17:30 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 31 May 2014 00:32:52 +0000 (17:32 -0700)
Verify fixed point version against na├»ve implementation

Signed-off-by: Keith Packard <keithp@keithp.com>
src/test/ao_aprs_test.c

index b1d17d3f32a42e9d72eda827be88a52e0a6d3640..86cf527ae2f4c7219e376135b357aad327a6f14d 100644 (file)
@@ -97,9 +97,36 @@ audio_gap(int secs)
 #endif
 }
 
+#include <math.h>
+
+int
+ao_aprs_encode_altitude_expensive(int meters)
+{
+       double  feet = meters / 0.3048;
+
+       double  encode = log(feet) / log(1.002);
+       return floor(encode + 0.5);
+}
+
 // This is where we go after reset.
 int main(int argc, char **argv)
 {
+       int     e, x;
+       int     a;
+
+       for (a = 1; a < 100000; a++) {
+               e = ao_aprs_encode_altitude(a);
+               x = ao_aprs_encode_altitude_expensive(a);
+
+               if (e != x) {
+                       double  back_feet, back_meters;
+                       back_feet = pow(1.002, e);
+                       back_meters = back_feet * 0.3048;
+                       fprintf (stderr, "APRS altitude encoding failure: altitude %d actual %d expected %d actual meters %f\n",
+                                a, e, x, back_meters);
+               }
+       }
+
     audio_gap(1);
 
     ao_gps_data.latitude = (45.0 + 28.25 / 60.0) * 10000000;