altos/test: Adjust CRC error rate after FEC fix
[fw/altos] / src / kernel / ao_convert_pa.c
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
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.
8  *
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.
13  *
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.
17  */
18
19 #if !defined(AO_CONVERT_TEST) && !defined(AO_FLIGHT_TEST)
20 #include "ao.h"
21 #endif
22
23 #ifndef AO_CONST_ATTRIB
24 #define AO_CONST_ATTRIB
25 #endif
26
27 static const alt_t altitude_table[] AO_CONST_ATTRIB = {
28 #if AO_SMALL_ALTITUDE_TABLE
29 #include "altitude-pa-small.h"
30 #else
31 #include "altitude-pa.h"
32 #endif
33 };
34
35 #ifndef FETCH_ALT
36 #define FETCH_ALT(o)    altitude_table[o]
37 #endif
38
39 #define ALT_SCALE       (1 << ALT_SHIFT)
40 #define ALT_MASK        (ALT_SCALE - 1)
41
42 alt_t
43 ao_pa_to_altitude(pres_t pa)
44 {
45         uint16_t o;
46         int16_t part;
47         alt_t low, high;
48
49         if (pa < 0)
50                 pa = 0;
51         if (pa > 120000L)
52                 pa = 120000L;
53         o = (uint16_t) (pa >> ALT_SHIFT);
54         part = pa & ALT_MASK;
55
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;
59 }
60
61 #ifdef AO_CONVERT_TEST
62 pres_t
63 ao_altitude_to_pa(alt_t alt)
64 {
65         alt_t   span, sub_span;
66         uint16_t        l, h, m;
67         int32_t         pa;
68
69         l = 0;
70         h = NALT - 1;
71         while ((h - l) != 1) {
72                 m = (l + h) >> 1;
73                 if (altitude_table[m] < alt)
74                         h = m;
75                 else
76                         l = m;
77         }
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;
81         if (pa > 120000)
82                 pa = 120000;
83         if (pa < 0)
84                 pa = 0;
85         return pa;
86 }
87 #endif