2 * Copyright © 2012 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
19 #if !defined(AO_CONVERT_TEST) && !defined(AO_FLIGHT_TEST)
23 #ifndef AO_CONST_ATTRIB
24 #define AO_CONST_ATTRIB
27 static const alt_t altitude_table[] AO_CONST_ATTRIB = {
28 #if AO_SMALL_ALTITUDE_TABLE
29 #include "altitude-pa-small.h"
31 #include "altitude-pa.h"
36 #define FETCH_ALT(o) altitude_table[o]
39 #define ALT_SCALE (1 << ALT_SHIFT)
40 #define ALT_MASK (ALT_SCALE - 1)
43 ao_pa_to_altitude(pres_t pa)
53 o = (uint16_t) (pa >> ALT_SHIFT);
56 low = (alt_t) FETCH_ALT(o) * (ALT_SCALE - part);
57 high = (alt_t) FETCH_ALT(o+1) * part;
58 return (low + high + (ALT_SCALE >> 1)) >> ALT_SHIFT;
61 #ifdef AO_CONVERT_TEST
63 ao_altitude_to_pa(alt_t alt)
71 while ((h - l) != 1) {
73 if (altitude_table[m] < alt)
78 span = altitude_table[l] - altitude_table[h];
79 sub_span = altitude_table[l] - alt;
80 pa = ((((alt_t) l * (span - sub_span) + (alt_t) h * sub_span) << ALT_SHIFT) + (span >> 1)) / span;