annotate Small_CPU/Src/pressure.c @ 345:4093ac18b25c FlightMode_Improvment

Added function to evaluate the state of the surface pressure history memory Activation of the computer during or short after landing caused a switch into divemode which could then not be left. To solve this the history memory is evaluated for significant pressure changes as the would not be expected in "normal" condition. In case of such a event (unstable) the pressure limit to enter dive mode is set to an absolute value (instead of relativ in normal mode)
author ideenmodellierer
date Thu, 03 Oct 2019 21:26:46 +0200
parents 37f45300bc2e
children ba53ab77f059
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
1 /**
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
2 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
3 * @file pressure.c
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
4 * @author heinrichs weikamp gmbh
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
5 * @date 2014
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
6 * @version V0.0.2
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
7 * @since 20-Oct-2016
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
8 * @brief
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
9 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
10 @verbatim
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
11 ==============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
12 ##### How to use #####
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
13 ==============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
14 V0.0.2 18-Oct-2016 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
15
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
16 @endverbatim
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
17 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
18 * @attention
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
19 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
20 * <h2><center>&copy; COPYRIGHT(c) 2016 heinrichs weikamp</center></h2>
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
21 *
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
22 ******************************************************************************
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
23 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
24
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
25
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
26
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
27 /* surface time
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
28 the last 30 minutes will be saved once per minute in a endless loop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
29 at the beginning of a dive the oldest value will be used
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
30 */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
31 #include "math.h"
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
32 #include "scheduler.h"
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
33 #include "pressure.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
34 #include "i2c.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
35 #include "rtc.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
36
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
37 #define CMD_RESET 0x1E // ADC reset command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
38 #define CMD_ADC_READ 0x00 // ADC read command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
39 #define CMD_ADC_CONV 0x40 // ADC conversion command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
40 #define CMD_ADC_D1 0x00 // ADC D1 conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
41 #define CMD_ADC_D2 0x10 // ADC D2 conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
42 #define CMD_ADC_256 0x00 // ADC OSR=256
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
43 #define CMD_ADC_512 0x02 // ADC OSR=512
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
44 #define CMD_ADC_1024 0x04 // ADC OSR=1024
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
45 #define CMD_ADC_2048 0x06 // ADC OSR=2056
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
46 #define CMD_ADC_4096 0x08 // ADC OSR=4096
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
47 #define CMD_PROM_RD 0xA0 // Prom read command
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
48
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
49 /* remove comment to use a predefined profile for pressure changes instead of real world data */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
50 /* #define SIMULATE_PRESSURE */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
51
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
52 #define PRESSURE_SURFACE_MAX_MBAR (1070.0f) /* It is very unlikely that pressure at surface is greater than this value => clip to it */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
53 #define PRESSURE_HISTORY_SIZE (8u)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
54 #define PRESSURE_JUMP_VALID_MBAR (500.0f) /* values are measure several times a second => jumps > 5m very unlikely */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
55
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
56 #define PRESSURE_SURFACE_QUE (30u) /* history buffer [minutes] for past pressure measurements */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
57 #define PRESSURE_SURFACE_EVA_WINDOW (15u) /* Number of entries evaluated during instability test. Used to avoid detection while dive enters water */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
58 #define PRESSURE_SURFACE_STABLE_LIMIT (10u) /* Define pressure as stable if delta (mBar) is below this value */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
59 #define PRESSURE_SURFACE_DETECT_STABLE_CNT (5u) /* Event count to detect stable condition */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
60 #define PRESSURE_SURFACE_UNSTABLE_LIMIT (50u) /* Define pressure as not stable if delta (mBar) is larger than this value */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
61 #define PRESSURE_SURFACE_DETECT_UNSTABLE_CNT (3u) /* Event count to detect unstable condition */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
62
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
63
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
64 static uint16_t get_ci_by_coef_num(uint8_t coef_num);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
65 //void pressure_calculation_new(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
66 //void pressure_calculation_old(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
67 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
68 static uint8_t crc4(uint16_t n_prom[]);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
69
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
70 static HAL_StatusTypeDef pressure_sensor_get_data(void);
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
71 static uint32_t get_adc(void);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
72 uint8_t pressureSensorInitSuccess = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
73
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
74 static uint16_t C[8] = { 1 };
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
75 static uint32_t D1 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
76 static uint32_t D2 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
77 static uint8_t n_crc;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
78
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
79 static int64_t C5_x_2p8 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
80 static int64_t C2_x_2p16 = 1;
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
81 static int64_t C1_x_2p15 = 1;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
82
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
83 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
84 short C2plus10000 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
85 short C3plus200 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
86 short C4minus250 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
87 short UT1 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
88 short C6plus100 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
89 */
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
90 static float pressure_offset = 0.0; /* Offset value which may be specified by the user via PC Software */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
91 static float temperature_offset = 0.0; /* Offset value which may be specified by the user via PC Software */
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
92
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
93 static float ambient_temperature = 0;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
94 static float ambient_pressure_mbar = 1000.0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
95 static float surface_pressure_mbar = 1000.0;
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
96 static float surface_ring_mbar[PRESSURE_SURFACE_QUE] = { 0 };
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
97
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
98 static uint8_t surface_pressure_writeIndex = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
99 static float surface_pressure_stable_value = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
100 static uint8_t surface_pressure_stable = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
101
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
102 static float pressure_history_mbar[PRESSURE_HISTORY_SIZE];
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
103
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
104 static uint8_t secondCounterSurfaceRing = 0;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
105 static uint8_t avgCount = 0;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
106 static float runningAvg = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
107
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
108 float get_temperature(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
109 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
110 return ambient_temperature;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
111 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
112
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
113 float get_pressure_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
114 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
115 return ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
116 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
117
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
118 float get_surface_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
119 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
120 return surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
121 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
122
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
123
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
124 void init_surface_ring(uint8_t force)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
125 {
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
126 if((surface_ring_mbar[0] == 0) || (force)) /* only initialize once. Keep value in place in case of an i2c recovery */
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
127 {
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
128 secondCounterSurfaceRing = 0; /* restart calculation */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
129 avgCount = 0;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
130 runningAvg = 0;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
131
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
132 for(int i=0; i<PRESSURE_SURFACE_QUE; i++)
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
133 surface_ring_mbar[i] = ambient_pressure_mbar;
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
134 surface_pressure_mbar = ambient_pressure_mbar;
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
135 surface_pressure_writeIndex = 0; /* index of the oldest value in the ring buffer */
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
136 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
137 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
138
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
139 void init_pressure_history(void)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
140 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
141 for(int i=0; i<PRESSURE_HISTORY_SIZE; i++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
142 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
143 pressure_history_mbar[i] = 1000.0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
144 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
145 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
146
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
147 uint8_t is_surface_pressure_stable(void)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
148 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
149 return surface_pressure_stable;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
150 }
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
151
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
152 float set_last_surface_pressure_stable(void)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
153 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
154 surface_pressure_mbar = surface_pressure_stable_value;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
155 return surface_pressure_stable_value;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
156 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
157
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
158 /* iterate backward through the history memory and evaluate the changes pressure changes during the last 30 minutes */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
159 void evaluate_surface_pressure()
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
160 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
161 uint8_t index;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
162 float lastvalue;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
163 uint8_t stablecnt = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
164 uint8_t unstablecnt = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
165 uint8_t EvaluationWindow = PRESSURE_SURFACE_QUE - PRESSURE_SURFACE_EVA_WINDOW; /* do not use the latest 15 values to avoid unstable condition due to something like fin handling */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
166 uint8_t EvaluatedValues = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
167
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
168 lastvalue = surface_ring_mbar[surface_pressure_writeIndex];
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
169 surface_pressure_stable_value = surface_ring_mbar[surface_pressure_writeIndex]; /* default: if no stable value is found return the oldest value */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
170 index = surface_pressure_writeIndex;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
171 surface_pressure_stable = 1;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
172
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
173 if(index == 0)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
174 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
175 index = PRESSURE_SURFACE_QUE - 1;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
176 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
177 else
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
178 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
179 index = index - 1;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
180 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
181 do
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
182 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
183 if((EvaluatedValues < EvaluationWindow) &&
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
184 (fabs(surface_pressure_stable_value - surface_ring_mbar[index]) > PRESSURE_SURFACE_UNSTABLE_LIMIT)) /* unusual change during last 30 minutes */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
185 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
186 unstablecnt++;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
187 if(unstablecnt > PRESSURE_SURFACE_DETECT_UNSTABLE_CNT)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
188 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
189 surface_pressure_stable = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
190 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
191 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
192 /* search for a value which does not change for several iterations */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
193 if (fabs(lastvalue - surface_ring_mbar[index]) < PRESSURE_SURFACE_STABLE_LIMIT)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
194 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
195 stablecnt++;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
196 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
197 else
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
198 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
199 stablecnt = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
200 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
201 if ((stablecnt >= PRESSURE_SURFACE_DETECT_STABLE_CNT) && (surface_pressure_stable == 0)&&(surface_pressure_stable_value == surface_ring_mbar[surface_pressure_writeIndex])) /* pressure is unstable => search for new stable value */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
202 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
203 surface_pressure_stable_value = surface_ring_mbar[index];
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
204 unstablecnt = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
205 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
206
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
207 lastvalue = surface_ring_mbar[index];
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
208
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
209 if(index == 0)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
210 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
211 index = PRESSURE_SURFACE_QUE - 1;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
212 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
213 else
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
214 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
215 index = index - 1;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
216 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
217 EvaluatedValues++;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
218 } while (index != surface_pressure_writeIndex);
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
219 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
220 void update_surface_pressure(uint8_t call_rhythm_seconds)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
221 {
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
222
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
223
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
224 if(is_init_pressure_done())
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
225 {
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
226 runningAvg = (runningAvg * avgCount + ambient_pressure_mbar) / (avgCount +1);
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
227 avgCount++;
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
228 secondCounterSurfaceRing += call_rhythm_seconds;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
229
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
230 if(secondCounterSurfaceRing >= 60)
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
231 {
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
232 if(runningAvg < PRESSURE_SURFACE_MAX_MBAR)
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
233 {
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
234 surface_ring_mbar[surface_pressure_writeIndex] = runningAvg;
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
235 }
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
236 else
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
237 {
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
238 surface_ring_mbar[surface_pressure_writeIndex] = PRESSURE_SURFACE_MAX_MBAR;
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
239 }
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
240 surface_pressure_writeIndex++; /* the write index is now pointing to the oldest value in the buffer which will be overwritten next time */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
241
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
242 if(surface_pressure_writeIndex == PRESSURE_SURFACE_QUE)
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
243 {
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
244 surface_pressure_writeIndex = 0;
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
245 }
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
246
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
247 surface_pressure_mbar = surface_ring_mbar[surface_pressure_writeIndex]; /* 30 minutes old measurement */
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
248
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
249 secondCounterSurfaceRing = 0;
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
250 avgCount = 1; /* use the current value as starting point but restart the weight decrement of the measurements */
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
251 }
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
252 evaluate_surface_pressure();
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
253 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
254 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
255
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
256 #ifdef DEMOMODE
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
257 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
258 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
259 const float temperature_surface = 31.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
260 const float temperature_bottom = 14.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
261
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
262 const float temperature_difference = temperature_bottom - temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
263
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
264 // range 0.0 - 1.0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
265 float position_now = (ambient_pressure_mbar - surface_pressure_mbar) / bottom_mbar_diff_to_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
266
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
267 if(position_now <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
268 return temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
269
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
270 if(position_now >= 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
271 return temperature_bottom;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
272
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
273 return temperature_surface + (temperature_difference * position_now);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
274 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
275
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
276
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
277 uint32_t demo_modify_temperature_and_pressure(int32_t divetime_in_seconds, uint8_t subseconds, float ceiling_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
278 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
279
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
280 const float descent_rate = 4000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
281 const float ascent_rate = 1000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
282 const uint32_t seconds_descend = (1 * 60) + 30;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
283 const uint32_t turbo_seconds_at_bottom_start = (0 * 60) + 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
284 const uint32_t seconds_descend_and_bottomtime = seconds_descend + turbo_seconds_at_bottom_start + (2 * 60) + 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
285 uint32_t time_elapsed_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
286 static float ambient_pressure_mbar_memory = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
287 static uint32_t time_last_call = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
288
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
289 if(divetime_in_seconds <= seconds_descend)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
290 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
291 ambient_pressure_mbar = (divetime_in_seconds * descent_rate) + ((float)(subseconds) * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
292 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
293
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
294 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
295 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
296 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
297 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
298 if(divetime_in_seconds <= seconds_descend + turbo_seconds_at_bottom_start)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
299 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
300 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
301 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
302 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
303 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
304 return turbo_seconds_at_bottom_start;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
305 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
306 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
307 if(divetime_in_seconds <= seconds_descend_and_bottomtime)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
308 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
309 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
310 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
311 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
312 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
313 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
314 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
315 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
316 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
317 time_elapsed_in_seconds = divetime_in_seconds - time_last_call;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
318 ambient_pressure_mbar = ambient_pressure_mbar_memory - time_elapsed_in_seconds * ascent_rate;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
319
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
320 if(ambient_pressure_mbar < surface_pressure_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
321 ambient_pressure_mbar = surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
322 else if(ambient_pressure_mbar < ceiling_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
323 ambient_pressure_mbar = ceiling_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
324
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
325 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
326 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
327 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
328 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
329 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
330 }
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
331 #endif
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
332
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
333 uint8_t is_init_pressure_done(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
334 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
335 return pressureSensorInitSuccess;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
336 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
337
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
338 uint8_t init_pressure(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
339 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
340 uint8_t buffer[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
341 buffer[0] = 0x1e;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
342 uint8_t retValue = 0xFF;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
343
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
344 pressureSensorInitSuccess = false;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
345 init_pressure_history();
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
346
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
347 /* Send reset request to pressure sensor */
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
348 retValue = I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
349 if(retValue != HAL_OK)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
350 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
351 return (HAL_StatusTypeDef)retValue;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
352 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
353 HAL_Delay(3);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
354
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
355 for(uint8_t i=0;i<8;i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
356 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
357 C[i] = get_ci_by_coef_num(i);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
358 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
359 n_crc = crc4(C); // no evaluation at the moment hw 151026
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
360
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
361 C5_x_2p8 = C[5] * 256;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
362 C2_x_2p16 = C[2] * 65536;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
363 C1_x_2p15 = C[1] * 32768;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
364
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
365 if(global.I2C_SystemStatus == HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
366 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
367 pressureSensorInitSuccess = 1;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
368 retValue = pressure_update();
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
369
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
370 }
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
371 return retValue;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
372 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
373
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
374
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
375 static uint32_t get_adc(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
376 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
377 uint8_t buffer[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
378 uint8_t resivebuf[4];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
379 uint32_t answer = 0;
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
380
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
381 buffer[0] = 0x00; // Get ADC
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
382 I2C_Master_Transmit( DEVICE_PRESSURE, buffer, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
383 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 4);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
384 resivebuf[3] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
385 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
386
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
387 return answer;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
388 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
389
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
390
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
391 static uint16_t get_ci_by_coef_num(uint8_t coef_num)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
392 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
393 uint8_t resivebuf[2];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
394
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
395 uint8_t cmd = CMD_PROM_RD+coef_num*2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
396 I2C_Master_Transmit( DEVICE_PRESSURE, &cmd, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
397 I2C_Master_Receive( DEVICE_PRESSURE, resivebuf, 2);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
398 return (256*(uint16_t)resivebuf[0]) + (uint16_t)resivebuf[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
399 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
400
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
401
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
402
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
403 uint8_t pressure_update(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
404 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
405 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
406
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
407 statusReturn = pressure_sensor_get_data();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
408 pressure_calculation();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
409 return (uint8_t)statusReturn;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
410 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
411
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
412 /* Switch between pressure and temperature measurement with every successful read operation */
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
413 void pressure_update_alternating(void)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
414 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
415 static uint8_t getTemperature= 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
416
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
417 if(getTemperature)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
418 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
419 if(pressure_sensor_get_temperature_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
420 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
421 getTemperature = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
422 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
423 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
424 else
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
425 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
426 if(pressure_sensor_get_pressure_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
427 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
428 getTemperature = 1;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
429 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
430 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
431 pressure_calculation();
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
432 return;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
433 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
434
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
435 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
436 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
437 uint8_t command = CMD_ADC_CONV + cmd;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
438 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
439
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
440 statusReturnTemp = I2C_Master_Transmit( DEVICE_PRESSURE, &command, 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
441
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
442 if(statusReturn)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
443 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
444 *statusReturn = statusReturnTemp;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
445 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
446
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
447 switch (cmd & 0x0f) // wait necessary conversion time
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
448 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
449 case CMD_ADC_256 : HAL_Delay(1); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
450 case CMD_ADC_512 : HAL_Delay(3); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
451 case CMD_ADC_1024: HAL_Delay(4); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
452 case CMD_ADC_2048: HAL_Delay(6); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
453 case CMD_ADC_4096: HAL_Delay(10); break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
454 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
455 return get_adc();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
456 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
457
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
458
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
459 static HAL_StatusTypeDef pressure_sensor_get_data(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
460 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
461 uint32_t requestedValue = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
462 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
463 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
464
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
465
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
466
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
467 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn2);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
468 if (statusReturn2 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
469 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
470 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
471 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
472
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
473 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn1);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
474 if (statusReturn1 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
475 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
476 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
477 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
478 if(statusReturn2 > statusReturn1) // if anything is not HAL_OK (0x00) or worse
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
479 return statusReturn2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
480 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
481 return statusReturn1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
482 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
483
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
484
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
485 HAL_StatusTypeDef pressure_sensor_get_pressure_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
486 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
487 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
488 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
489
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
490 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_1024, &statusReturn);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
491 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
492 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
493 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
494 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
495
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
496 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
497 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
498
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
499
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
500 HAL_StatusTypeDef pressure_sensor_get_temperature_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
501 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
502 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
503 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
504
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
505 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_1024, &statusReturn);
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
506 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
507 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
508 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
509 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
510 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
511 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
512
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
513
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
514 #ifdef SIMULATE_PRESSURE
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
515 void pressure_simulation()
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
516 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
517 static uint32_t tickstart = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
518 static float pressure_sim_mbar = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
519 static uint32_t passedSecond = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
520 static uint32_t secondtick = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
521
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
522 uint32_t lasttick = 0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
523
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
524
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
525
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
526 if( tickstart == 0)
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
527 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
528 tickstart = HAL_GetTick(); /* init time stamp */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
529 secondtick = tickstart;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
530 pressure_sim_mbar = 1000;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
531 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
532
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
533 lasttick = HAL_GetTick();
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
534 if(time_elapsed_ms(secondtick,lasttick) > 1000) /* one second passed since last tick */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
535 {
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
536 secondtick = lasttick;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
537 passedSecond++;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
538
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
539 #ifdef DIVE_AFTER_LANDING
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
540 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
541 else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
542 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay stable 10 minutes*/
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
543 else if(passedSecond < 1500) pressure_sim_mbar += 0.5; /* return to 1 bar in 10 Minutes*/
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
544 else if(passedSecond < 1800) pressure_sim_mbar += 0.0; /* 5 minutes break */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
545 else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
546 else if(passedSecond < 2300) pressure_sim_mbar += 0.0; /* stay on depth */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
547 else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
548 else pressure_sim_mbar = 1000.0; /* final state */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
549 #else /* short dive */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
550 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
551 else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
552 else if(passedSecond < 300) pressure_sim_mbar += 0.0; /*stay on depth*/
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
553 else if(passedSecond < 460) pressure_sim_mbar -= 10.0; /* return to surface */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
554 else if(passedSecond < 600) pressure_sim_mbar += 0.0; /* stay */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
555 else if(passedSecond < 610) pressure_sim_mbar = 1000.0; /* get ready for second dive */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
556 else if(passedSecond < 780) pressure_sim_mbar += 10.0; /* Start dive */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
557 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay on depth*/
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
558 else if(passedSecond < 1060) pressure_sim_mbar -= 10.0; /* return to surface */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
559 else if(passedSecond < 1200) pressure_sim_mbar += 0.0; /* stay */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
560 else pressure_sim_mbar = 1000.0; /* final state */
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
561 #endif
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
562 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
563
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
564
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
565 ambient_pressure_mbar = pressure_sim_mbar;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
566 ambient_temperature = 25.0;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
567 return;
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
568 }
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
569
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
570 #endif
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
571
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
572 void pressure_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
573 {
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
574 if(global.I2C_SystemStatus != HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
575 return;
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
576
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
577 #ifdef SIMULATE_PRESSURE
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
578 pressure_simulation();
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
579 #else
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
580 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
345
4093ac18b25c Added function to evaluate the state of the surface pressure history memory
ideenmodellierer
parents: 339
diff changeset
581 #endif
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
582 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
583
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
584 static uint8_t pressure_plausible(float pressurevalue)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
585 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
586 static uint8_t pressurewriteindex = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
587 uint8_t retval = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
588 uint8_t index;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
589 float pressure_average = 0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
590
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
591 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
592 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
593 pressure_average += pressure_history_mbar[index];
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
594 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
595 pressure_average /= PRESSURE_HISTORY_SIZE;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
596 if(pressure_average == 1000.0) /* first pressure calculation */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
597 {
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
598 if(fabs(pressurevalue - pressure_average) < 11000.0) /* just in case a reset occur during dive assume value equal < 100m as valid */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
599 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
600 for(index = 0; index < PRESSURE_HISTORY_SIZE; index++)
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
601 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
602 pressure_history_mbar[index] = pressurevalue; /* set history to current value */
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
603 retval = 1;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
604 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
605 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
606 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
607 else
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
608 {
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
609 if(fabs(pressurevalue - pressure_average) < PRESSURE_JUMP_VALID_MBAR)
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
610 {
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
611 pressure_history_mbar[pressurewriteindex++] = pressurevalue;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
612 pressurewriteindex &= 0x7; /* wrap around if necessary */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
613 retval = 1;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
614 }
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
615 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
616
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
617 return retval;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
618 }
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
619
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
620 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
621 {
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
622 static float runningAvg = 0;
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
623 static uint8_t avgCnt = 0;
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
624
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
625 uint32_t local_D1; // ADC value of the pressure conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
626 uint32_t local_D2; // ADC value of the temperature conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
627 int32_t local_Px10; // compensated pressure value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
628 int32_t local_Tx100; // compensated temperature value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
629 int64_t local_dT; // int32_t, difference between actual and measured temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
630 int64_t local_OFF; // offset at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
631 int64_t local_SENS; // sensitivity at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
632
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
633 float calc_pressure;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
634
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
635 int64_t T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
636 int64_t OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
637 int64_t SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
638
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
639 local_D1 = D1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
640 local_D2 = D2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
641
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
642 local_dT = ((int64_t)local_D2) - ((int64_t)C[5]) * 256; //pow(2,8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
643 local_OFF = ((int64_t)C[2]) * 65536 + local_dT * ((int64_t)C[4]) / 128; // pow(2,16), pow(2,7)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
644 local_SENS = ((int64_t)C[1]) * 32768 + local_dT * ((int64_t)C[3]) / 256; // pow(2,15), pow(2,8)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
645
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
646 local_Tx100 = (int32_t)(2000 + (local_dT * ((int64_t)C[6])) / 8388608);// pow(2,23)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
647
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
648
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
649 if(local_Tx100 < 2000) // low temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
650 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
651 T2 = 3 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
652 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
653 T2 /= 8589934592;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
654
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
655 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
656 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
657 OFF2 *= 3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
658 OFF2 /= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
659
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
660 SENS2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
661 SENS2 *= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
662 SENS2 *= 5;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
663 SENS2 /= 8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
664
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
665 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
666 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
667 local_SENS -= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
668 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
669 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
670 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
671 T2 = 7 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
672 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
673 T2 /= 137438953472;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
674
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
675 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
676 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
677 OFF2 /= 16;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
678
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
679 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
680 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
681 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
682
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
683 local_Px10 = (int32_t)(
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
684 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
685 / 8192 );// )) / 10; // pow(2,21), pow(2,13)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
686
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
687 ambient_temperature = ((float)local_Tx100) / 100;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
688 ambient_temperature += temperature_offset;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
689
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
690 calc_pressure = ((float)local_Px10) / 10;
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
691 calc_pressure += pressure_offset;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
692
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
693 if(pressure_plausible(calc_pressure))
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
694 {
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
695 runningAvg = (avgCnt * runningAvg + calc_pressure) / (avgCnt + 1);
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
696 if (avgCnt < 10) /* build an average considering the last measurements to have a weight "1 of 10" */
335
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
697 { /* Main reason for this is the jitter of up to +-10 HPa in surface mode which is caused */
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
698 avgCnt++; /* by the measurement range of the sensor which is focused on under water pressure measurement */
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
699 }
c11ce8c885d3 Use average calculation for pressure: precondition was that pressure values jittered +- 10 HPa from one capture (once a second) to the other. Basically pressure is measured several times a second => using these values in an additional history calculation reduces the jitter down to +-1 per second
ideenmodellierer
parents: 331
diff changeset
700 ambient_pressure_mbar = runningAvg;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
701 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
702 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
703
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
704
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
705 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
706 * short and int are both 16bit according to AVR/GCC google results
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
707 */
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
708 static uint8_t crc4(uint16_t n_prom[])
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
709 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
710 uint16_t cnt; // simple counter
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
711 uint16_t n_rem; // crc reminder
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
712 uint16_t crc_read; // original value of the crc
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
713 uint8_t n_bit;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
714 n_rem = 0x00;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
715 crc_read=n_prom[7]; //save read CRC
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
716 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
717 for (cnt = 0; cnt < 16; cnt++) // operation is performed on bytes
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
718 { // choose LSB or MSB
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
719 if (cnt%2==1) n_rem ^= (uint16_t) ((n_prom[cnt>>1]) & 0x00FF);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
720 else n_rem ^= (uint16_t) (n_prom[cnt>>1]>>8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
721 for (n_bit = 8; n_bit > 0; n_bit--)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
722 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
723 if (n_rem & (0x8000))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
724 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
725 n_rem = (n_rem << 1) ^ 0x3000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
726 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
727 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
728 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
729 n_rem = (n_rem << 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
730 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
731 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
732 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
733 n_rem= (0x000F & (n_rem >> 12)); // // final 4-bit reminder is CRC code
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
734 n_prom[7]=crc_read; // restore the crc_read to its original place
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
735 return (n_rem ^ 0x00);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
736 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
737 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
738 void test_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
739 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
740 C1 = 29112;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
741 C2 = 26814;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
742 C3 = 19125;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
743 C4 = 17865;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
744 C5 = 32057;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
745 C6 = 31305;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
746
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
747 C2_x_2p16 = C2 * 65536;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
748 C1_x_2p15 = C1 * 32768;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
749
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
750 D1 = 4944364;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
751 D2 = 8198974;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
752 pressure_calculation() ;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
753 };
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
754 */
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
755 void pressure_set_offset (float pressureOffset, float temperatureOffset)
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
756 {
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
757 if(pressure_offset != pressureOffset) /* we received a new value => reinit surface que */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
758 {
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
759 ambient_pressure_mbar -= pressure_offset; /* revert old value */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
760 ambient_pressure_mbar += pressureOffset; /* apply new offset */
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
761 init_surface_ring(1);
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
762 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
763
339
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
764 pressure_offset = pressureOffset;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
765 temperature_offset = temperatureOffset;
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
766 }
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
767
37f45300bc2e Apply averaging to pressure measurement: In pre versions calculated pressure value jittered +/-10hPa. Since we measure the pressure several time a second but only use one value a second, calc average including not used values
ideenmodellierer
parents: 335
diff changeset
768