]> mj.ucw.cz Git - home-hw.git/blob - nucleo-test/bmp-conv.c
Auto: Meditation mode turned off
[home-hw.git] / nucleo-test / bmp-conv.c
1 #include <stdio.h>
2 #include <stdint.h>
3
4 typedef unsigned int uint;
5 typedef uint16_t u16;
6 typedef int16_t s16;
7
8 uint UT = 0x6ba7;
9 uint UP = 0xa32c20;
10 uint oss = 3;
11
12 static uint cc[] = {
13         0x1e45,
14         0xfaf6,
15         0xc787,
16         0x86e1,
17         0x61f4,
18         0x4ab5,
19         0x157a,
20         0x0047,
21         0x8000,
22         0xd4bd,
23         0x0980,
24 };
25
26 int main(void)
27 {
28   s16 AC1 = cc[0];
29   s16 AC2 = cc[1];
30   s16 AC3 = cc[2];
31   u16 AC4 = cc[3];
32   u16 AC5 = cc[4];
33   u16 AC6 = cc[5];
34   s16 B1 = cc[6];
35   s16 B2 = cc[7];
36   s16 MB = cc[8];
37   s16 MC = cc[9];
38   s16 MD = cc[10];
39   UP >>= (8-oss);
40
41 #if 0
42   // Test values from spec
43   AC1 = 408;
44   AC2 = -72;
45   AC3 = -14383;
46   AC4 = 32741;
47   AC5 = 32757;
48   AC6 = 23153;
49   B1 = 6190;
50   B2 = 4;
51   MB = -32768;
52   MC = -8711;
53   MD = 2868;
54   UT = 27898;
55   UP = 23843;
56   oss = 0;
57 #endif
58
59   int X1 = (UT-AC6)*AC5 / (1<<15);
60   int X2 = MC*(1<<11) / (X1+MD);
61   int B5 = X1 + X2;
62   int T = (B5+8) / (1<<4);
63   printf("T = %.1f degC\n", T/10.);
64
65   int B6 = B5 - 4000;
66   X1 = (B2*(B6*B6/(1<<12))) / (1<<11);
67   X2 = AC2 * B6 / (1<<11);
68   int X3 = X1 + X2;
69   int B3 = (((AC1*4 + X3) << oss) + 2) / 4;
70   X1 = AC3 * B6 / (1<<13);
71   X2 = (B1*(B6*B6/(1<<12))) / (1<<16);
72   X3 = ((X1+X2) + 2) / (1<<2);
73   uint B4 = (uint)(AC4 * (X3 + 32768)) / (1U<<15);
74   uint B7 = (uint)(UP-B3) * (uint)(50000>>oss);
75   int p;
76   if (B7 < 0x80000000)
77     p = (B7*2) / B4;
78   else
79     p = B7 / B4 * 2;
80   X1 = (p/(1<<8)) * (p/(1<<8));
81   X1 = (X1*3038) / (1<<16);
82   X2 = (-7357*p) / (1<<16);
83   p = p + (X1 + X2 + 3791) / (1<<4);
84   printf("p = %d Pa\n", p);
85
86   return 0;
87 }