annotate Small_CPU/Src/pressure.c @ 682:8775d3dc6325 Betatest

Bugfix low ppO2 warning in bailout mode: the code has different sources for divesettings (real and simulated). The ppo2 calculation code used the pointer to the real structure. As result in simulation mode an error occured caused by the ppo2 calculation which was not aware that a bailout happened (because the real structure was references instead of the simulator ones). The problem has been fixed by using the "stateUsed" pointer which is refering to the structure currenty in use.
author Ideenmodellierer
date Mon, 25 Apr 2022 21:15:01 +0200
parents 4644891d2f51
children 8c92f7743e14
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
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
49 /* remove comment to use a predefined profile for pressure changes instead of real world data */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
50 /* #define SIMULATE_PRESSURE */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
51
535
666cafac87ab Increased max value for surface pressure:
Ideenmodellierer
parents: 488
diff changeset
52 #define PRESSURE_SURFACE_MAX_MBAR (1060.0f) /* It is unlikely that pressure at surface is greater than this value => clip to it */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
53
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
54 #define PRESSURE_SURFACE_QUE (30u) /* history buffer [minutes] for past pressure measurements */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
55 #define PRESSURE_SURFACE_EVA_WINDOW (15u) /* Number of entries evaluated during instability test. Used to avoid detection while dive enters water */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
56 #define PRESSURE_SURFACE_STABLE_LIMIT (10u) /* Define pressure as stable if delta (mBar) is below this value */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
57 #define PRESSURE_SURFACE_DETECT_STABLE_CNT (5u) /* Event count to detect stable condition */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
58 #define PRESSURE_SURFACE_UNSTABLE_LIMIT (50u) /* Define pressure as not stable if delta (mBar) is larger than this value */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
59 #define PRESSURE_SURFACE_DETECT_UNSTABLE_CNT (3u) /* Event count to detect unstable condition */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
60
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
61
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
62 static uint8_t PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5803; /* Default Address */
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
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);
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
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;
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
77 //static uint8_t n_crc;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
78
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
79 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
80 short C2plus10000 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
81 short C3plus200 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
82 short C4minus250 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
83 short UT1 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
84 short C6plus100 = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
85 */
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
86 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
87 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
88
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
89 static float ambient_temperature = 0;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
90 static float ambient_pressure_mbar = 1000.0;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
91 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
92 static float surface_ring_mbar[PRESSURE_SURFACE_QUE] = { 0 };
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
93
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
94 static uint8_t surface_pressure_writeIndex = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
95 static float surface_pressure_stable_value = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
96 static uint8_t surface_pressure_stable = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
97
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
98 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
99 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
100 static float runningAvg = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
101
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
102 float get_temperature(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
103 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
104 return ambient_temperature;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
105 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
106
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
107 float get_pressure_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
108 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
109 return ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
110 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
111
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
112 float get_surface_mbar(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
113 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
114 return surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
115 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
116
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
117
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
118 void init_surface_ring(uint8_t force)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
119 {
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
120 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
121 {
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
122 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
123 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
124 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
125
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
126 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
127 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
128 surface_pressure_mbar = ambient_pressure_mbar;
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
129 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
130 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
131 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
132
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
133 uint8_t is_surface_pressure_stable(void)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
134 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
135 return surface_pressure_stable;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
136 }
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
137
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
138 float set_last_surface_pressure_stable(void)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
139 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
140 surface_pressure_mbar = surface_pressure_stable_value;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
141 return surface_pressure_stable_value;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
142 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
143
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
144 /* iterate backward through the history memory and evaluate the changes pressure changes during the last 30 minutes */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
145 void evaluate_surface_pressure()
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
146 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
147 uint8_t index;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
148 float lastvalue;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
149 uint8_t stablecnt = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
150 uint8_t unstablecnt = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
151 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 */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
152 uint8_t EvaluatedValues = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
153
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
154 lastvalue = surface_ring_mbar[surface_pressure_writeIndex];
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
155 surface_pressure_stable_value = surface_ring_mbar[surface_pressure_writeIndex]; /* default: if no stable value is found return the oldest value */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
156 index = surface_pressure_writeIndex;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
157 surface_pressure_stable = 1;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
158
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
159 if(index == 0)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
160 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
161 index = PRESSURE_SURFACE_QUE - 1;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
162 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
163 else
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
164 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
165 index = index - 1;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
166 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
167 do
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
168 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
169 if((EvaluatedValues < EvaluationWindow) &&
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
170 (fabs(surface_pressure_stable_value - surface_ring_mbar[index]) > PRESSURE_SURFACE_UNSTABLE_LIMIT)) /* unusual change during last 30 minutes */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
171 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
172 unstablecnt++;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
173 if(unstablecnt > PRESSURE_SURFACE_DETECT_UNSTABLE_CNT)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
174 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
175 surface_pressure_stable = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
176 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
177 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
178 /* search for a value which does not change for several iterations */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
179 if (fabs(lastvalue - surface_ring_mbar[index]) < PRESSURE_SURFACE_STABLE_LIMIT)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
180 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
181 stablecnt++;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
182 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
183 else
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
184 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
185 stablecnt = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
186 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
187 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 */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
188 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
189 surface_pressure_stable_value = surface_ring_mbar[index];
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
190 unstablecnt = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
191 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
192
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
193 lastvalue = surface_ring_mbar[index];
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
194
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
195 if(index == 0)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
196 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
197 index = PRESSURE_SURFACE_QUE - 1;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
198 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
199 else
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
200 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
201 index = index - 1;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
202 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
203 EvaluatedValues++;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
204 } while (index != surface_pressure_writeIndex);
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
205 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
206 void update_surface_pressure(uint8_t call_rhythm_seconds)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
207 {
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
208 if(is_init_pressure_done())
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
209 {
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
210 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
211 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
212 secondCounterSurfaceRing += call_rhythm_seconds;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
213
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
214 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
215 {
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
216 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
217 {
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
218 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
219 }
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
220 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
221 {
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
222 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
223 }
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
224 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
225
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
226 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
227 {
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
228 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
229 }
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
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
231 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
232
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
233 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
234 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
235 }
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
236 evaluate_surface_pressure();
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
237 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
238 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
239
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
240 #ifdef DEMOMODE
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
241 float demo_modify_temperature_helper(float bottom_mbar_diff_to_surface)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
242 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
243 const float temperature_surface = 31.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
244 const float temperature_bottom = 14.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
245
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
246 const float temperature_difference = temperature_bottom - temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
247
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
248 // range 0.0 - 1.0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
249 float position_now = (ambient_pressure_mbar - surface_pressure_mbar) / bottom_mbar_diff_to_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
250
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
251 if(position_now <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
252 return temperature_surface;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
253
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
254 if(position_now >= 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
255 return temperature_bottom;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
256
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
257 return temperature_surface + (temperature_difference * position_now);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
258 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
259
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
260
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
261 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
262 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
263
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
264 const float descent_rate = 4000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
265 const float ascent_rate = 1000/60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
266 const uint32_t seconds_descend = (1 * 60) + 30;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
267 const uint32_t turbo_seconds_at_bottom_start = (0 * 60) + 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
268 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
269 uint32_t time_elapsed_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
270 static float ambient_pressure_mbar_memory = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
271 static uint32_t time_last_call = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
272
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
273 if(divetime_in_seconds <= seconds_descend)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
274 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
275 ambient_pressure_mbar = (divetime_in_seconds * descent_rate) + ((float)(subseconds) * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
276 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
277
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
278 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
279 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
280 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
281 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
282 if(divetime_in_seconds <= seconds_descend + turbo_seconds_at_bottom_start)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
283 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
284 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
285 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
286 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
287 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
288 return turbo_seconds_at_bottom_start;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
289 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
290 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
291 if(divetime_in_seconds <= seconds_descend_and_bottomtime)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
292 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
293 ambient_pressure_mbar = (seconds_descend * descent_rate) + surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
294 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
295 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
296 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
297 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
298 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
299 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
300 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
301 time_elapsed_in_seconds = divetime_in_seconds - time_last_call;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
302 ambient_pressure_mbar = ambient_pressure_mbar_memory - time_elapsed_in_seconds * ascent_rate;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
303
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
304 if(ambient_pressure_mbar < surface_pressure_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
305 ambient_pressure_mbar = surface_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
306 else if(ambient_pressure_mbar < ceiling_mbar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
307 ambient_pressure_mbar = ceiling_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
308
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
309 ambient_temperature = demo_modify_temperature_helper(descent_rate * seconds_descend);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
310 ambient_pressure_mbar_memory = ambient_pressure_mbar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
311 time_last_call = divetime_in_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
312 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
313 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
314 }
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
315 #endif
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
316
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
317 uint8_t is_init_pressure_done(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
318 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
319 return pressureSensorInitSuccess;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
320 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
321
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
322 uint8_t init_pressure(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
323 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
324 uint8_t buffer[1];
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
325 buffer[0] = 0x1E; // Reset Command
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
326 uint8_t retValue = 0xFF;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
327
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
328 pressureSensorInitSuccess = false;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
329
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
330 /* Probe new sensor first */
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
331 retValue = I2C_Master_Transmit( DEVICE_PRESSURE_MS5837, buffer, 1);
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
332 if(retValue != HAL_OK)
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
333 {
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
334 PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5803; // use old sensor
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
335 HAL_Delay(100);
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
336 I2C_DeInit();
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
337 HAL_Delay(100);
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
338 MX_I2C1_Init();
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
339 HAL_Delay(100);
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
340 }
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
341 else
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
342 {
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
343 PRESSURE_ADDRESS = DEVICE_PRESSURE_MS5837; // Success, use new sensor
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
344 }
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
345 HAL_Delay(3); //2.8ms according to datasheet
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
346
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
347 buffer[0] = 0x1E; // Reset Command
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
348 retValue = 0xFF;
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
349
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
350 /* Send reset request to pressure sensor */
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
351 retValue = I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
352 if(retValue != HAL_OK)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
353 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
354 return (HAL_StatusTypeDef)retValue;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
355 }
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
356 HAL_Delay(3); //2.8ms according to datasheet
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
357
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
358 for(uint8_t i=0;i<7;i++)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
359 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
360 C[i] = get_ci_by_coef_num(i);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
361 }
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
362 // n_crc = crc4(C); // no evaluation at the moment hw 151026
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
363
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
364 if(global.I2C_SystemStatus == HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
365 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
366 pressureSensorInitSuccess = 1;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
367 retValue = pressure_update();
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
368 }
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
369 return retValue;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
370 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
371
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
372
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
373 static uint32_t get_adc(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
374 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
375 uint8_t buffer[1];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
376 uint8_t resivebuf[4];
474
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
377 uint32_t answer = 0xFFFFFFFF;
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
378
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
379 buffer[0] = 0x00; // Get ADC
474
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
380 if(I2C_Master_Transmit( PRESSURE_ADDRESS, buffer, 1) == HAL_OK)
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
381 {
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
382 if(I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 4) == HAL_OK)
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
383 {
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
384 resivebuf[3] = 0;
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
385 answer = 256*256 *(uint32_t)resivebuf[0] + 256 * (uint32_t)resivebuf[1] + (uint32_t)resivebuf[2];
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
386 }
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
387 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
388 return answer;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
389 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
390
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
391
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
392 static uint16_t get_ci_by_coef_num(uint8_t coef_num)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
393 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
394 uint8_t resivebuf[2];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
395
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
396 uint8_t cmd = CMD_PROM_RD+coef_num*2;
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
397 I2C_Master_Transmit( PRESSURE_ADDRESS, &cmd, 1);
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
398 I2C_Master_Receive( PRESSURE_ADDRESS, resivebuf, 2);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
399 return (256*(uint16_t)resivebuf[0]) + (uint16_t)resivebuf[1];
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
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
404 uint8_t pressure_update(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
405 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
406 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
407
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
408 statusReturn = pressure_sensor_get_data();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
409 pressure_calculation();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
410 return (uint8_t)statusReturn;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
411 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
412
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
413 /* Switch between pressure and temperature measurement with every successful read operation */
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
414 void pressure_update_alternating(void)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
415 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
416 static uint8_t getTemperature= 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
417
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
418 if(getTemperature)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
419 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
420 if(pressure_sensor_get_temperature_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
421 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
422 getTemperature = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
423 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
424 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
425 else
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
426 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
427 if(pressure_sensor_get_pressure_raw() == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
428 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
429 getTemperature = 1;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
430 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
431 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
432 pressure_calculation();
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
433 return;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
434 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
435
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
436 static uint32_t pressure_sensor_get_one_value(uint8_t cmd, HAL_StatusTypeDef *statusReturn)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
437 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
438 uint8_t command = CMD_ADC_CONV + cmd;
474
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
439 uint32_t adcValue = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
440 HAL_StatusTypeDef statusReturnTemp = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
441
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
442 statusReturnTemp = I2C_Master_Transmit( PRESSURE_ADDRESS, &command, 1);
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
443
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
444 if(statusReturn)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
445 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
446 *statusReturn = statusReturnTemp;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
447 }
479
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
448
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
449 switch (cmd & 0x0f) // wait necessary conversion time
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
450 {
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
451 case CMD_ADC_256 : HAL_Delay(2); break;
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
452 case CMD_ADC_512 : HAL_Delay(4); break;
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
453 case CMD_ADC_1024: HAL_Delay(5); break;
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
454 case CMD_ADC_2048: HAL_Delay(7); break;
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
455 case CMD_ADC_4096: HAL_Delay(11); break;
479
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
456 default:
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
457 break;
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
458 }
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
459 adcValue = get_adc();
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
460 /* if(adcValue == 0xFFFFFFFF)
479
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
461 {
4b9427ae0a65 Bugfix unintended else condition:
ideenmodellierer
parents: 474
diff changeset
462 if(statusReturn)
474
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
463 {
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
464 *statusReturn = HAL_ERROR;
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
465 }
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
466 }*/
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
467
474
4be72d55b09a Added error detection for reading of ADC values in sleep mode:
ideenmodellierer
parents: 403
diff changeset
468 return adcValue;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
469 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
470
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
471
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
472 static HAL_StatusTypeDef pressure_sensor_get_data(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
473 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
474 uint32_t requestedValue = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
475 HAL_StatusTypeDef statusReturn1 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
476 HAL_StatusTypeDef statusReturn2 = HAL_TIMEOUT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
477
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
478
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
479
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
480 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_4096, &statusReturn2);
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
481 if (statusReturn2 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
482 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
483 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
484 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
485
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
486 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_4096, &statusReturn1);
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
487 if (statusReturn1 == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
488 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
489 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
490 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
491 if(statusReturn2 > statusReturn1) // if anything is not HAL_OK (0x00) or worse
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
492 return statusReturn2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
493 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
494 return statusReturn1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
495 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
496
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
497
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
498 HAL_StatusTypeDef pressure_sensor_get_pressure_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
499 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
500 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
501 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
502
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
503 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D1 + CMD_ADC_4096, &statusReturn);
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
504 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
505 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
506 D1 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
507 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
508
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
509 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
510 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
511
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
512
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
513 HAL_StatusTypeDef pressure_sensor_get_temperature_raw(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
514 {
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
515 uint32_t requestedValue = 0;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
516 HAL_StatusTypeDef statusReturn = HAL_TIMEOUT;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
517
488
9eeab3fead8f Added "I2C_DeInit();" in hardware detection routines. It's the recommended way
heinrichsweikamp
parents: 480
diff changeset
518 requestedValue = pressure_sensor_get_one_value(CMD_ADC_D2 + CMD_ADC_4096, &statusReturn);
276
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
519 if (statusReturn == HAL_OK)
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
520 {
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
521 D2 = requestedValue;
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
522 }
8e9c502c0b06 Rework pressure/ temperature data aquisition
ideenmodellierer
parents: 241
diff changeset
523 return statusReturn;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
524 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
525
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
526
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
527 #ifdef SIMULATE_PRESSURE
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
528 void pressure_simulation()
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
529 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
530 static uint32_t tickstart = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
531 static float pressure_sim_mbar = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
532 static uint32_t passedSecond = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
533 static uint32_t secondtick = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
534
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
535 uint32_t lasttick = 0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
536
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
537
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
538
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
539 if( tickstart == 0)
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
540 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
541 tickstart = HAL_GetTick(); /* init time stamp */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
542 secondtick = tickstart;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
543 pressure_sim_mbar = 1000;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
544 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
545
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
546 lasttick = HAL_GetTick();
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
547 if(time_elapsed_ms(secondtick,lasttick) > 1000) /* one second passed since last tick */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
548 {
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
549 secondtick = lasttick;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
550 passedSecond++;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
551
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
552 #ifdef DIVE_AFTER_LANDING
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
553 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
554 else if(passedSecond < 300) pressure_sim_mbar -= 1.0; /* decrease pressure in 5 minutes target 770mbar => delta 330 */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
555 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay stable 10 minutes*/
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
556 else if(passedSecond < 1500) pressure_sim_mbar += 0.5; /* return to 1 bar in 10 Minutes*/
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
557 else if(passedSecond < 1800) pressure_sim_mbar += 0.0; /* 5 minutes break */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
558 else if(passedSecond < 2000) pressure_sim_mbar += 10.0; /* start dive */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
559 else if(passedSecond < 2300) pressure_sim_mbar += 0.0; /* stay on depth */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
560 else if(passedSecond < 2500) pressure_sim_mbar -= 10.0; /* return to surface */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
561 else pressure_sim_mbar = 1000.0; /* final state */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
562 #else /* short dive */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
563 if(passedSecond < 10) pressure_sim_mbar = 1000.0; /* stay stable for 10 seconds */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
564 else if(passedSecond < 180) pressure_sim_mbar += 10.0; /* Start dive */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
565 else if(passedSecond < 300) pressure_sim_mbar += 0.0; /*stay on depth*/
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
566 else if(passedSecond < 460) pressure_sim_mbar -= 10.0; /* return to surface */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
567 else if(passedSecond < 600) pressure_sim_mbar += 0.0; /* stay */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
568 else if(passedSecond < 610) pressure_sim_mbar = 1000.0; /* get ready for second dive */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
569 else if(passedSecond < 780) pressure_sim_mbar += 10.0; /* Start dive */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
570 else if(passedSecond < 900) pressure_sim_mbar += 0.0; /*stay on depth*/
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
571 else if(passedSecond < 1060) pressure_sim_mbar -= 10.0; /* return to surface */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
572 else if(passedSecond < 1200) pressure_sim_mbar += 0.0; /* stay */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
573 else pressure_sim_mbar = 1000.0; /* final state */
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
574 #endif
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
575 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
576
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
577
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
578 ambient_pressure_mbar = pressure_sim_mbar;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
579 ambient_temperature = 25.0;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
580 return;
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
581 }
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
582
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
583 #endif
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
584
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
585 void pressure_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
586 {
241
2b9775f71e30 cleanup: factor out I2C1_Status() and cleanup type
Jan Mulder <jlmulder@xs4all.nl>
parents: 186
diff changeset
587 if(global.I2C_SystemStatus != HAL_OK)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
588 return;
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
589
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
590 #ifdef SIMULATE_PRESSURE
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
591 pressure_simulation();
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
592 #else
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
593 pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015();
352
1f24022345d1 Fix merge problem
Jan Mulder <jlmulder@xs4all.nl>
parents: 351
diff changeset
594 #endif
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
595 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
596
186
f11f0bf6ef2d cleanup: remove obsolete code, make static, etc.
Jan Mulder <jlmulder@xs4all.nl>
parents: 38
diff changeset
597 static void pressure_calculation_AN520_004_mod_MS5803_30BA__09_2015(void)
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
598 {
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
599 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
600 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
601
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
602 uint32_t local_D1; // ADC value of the pressure conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
603 uint32_t local_D2; // ADC value of the temperature conversion
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
604 int32_t local_Px10; // compensated pressure value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
605 int32_t local_Tx100; // compensated temperature value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
606 int64_t local_dT; // int32_t, difference between actual and measured temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
607 int64_t local_OFF; // offset at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
608 int64_t local_SENS; // sensitivity at actual temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
609
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
610 float calc_pressure;
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
611
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
612 int64_t T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
613 int64_t OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
614 int64_t SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
615
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
616 local_D1 = D1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
617 local_D2 = D2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
618
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
619 local_dT = ((int64_t)local_D2) - ((int64_t)C[5]) * 256; //pow(2,8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
620 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
621 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
622
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
623 local_Tx100 = (int32_t)(2000 + (local_dT * ((int64_t)C[6])) / 8388608);// pow(2,23)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
624
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
625
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
626 if(local_Tx100 < 2000) // low temperature
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
627 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
628 T2 = 3 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
629 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
630 T2 /= 8589934592;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
631
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
632 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
633 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
634 OFF2 *= 3;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
635 OFF2 /= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
636
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
637 SENS2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
638 SENS2 *= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
639 SENS2 *= 5;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
640 SENS2 /= 8;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
641
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
642 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
643 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
644 local_SENS -= SENS2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
645 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
646 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
647 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
648 T2 = 7 * local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
649 T2 *= local_dT;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
650 T2 /= 137438953472;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
651
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
652 OFF2 = ((int64_t)local_Tx100) - 2000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
653 OFF2 *= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
654 OFF2 /= 16;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
655
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
656 local_Tx100 -= (int32_t)T2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
657 local_OFF -= OFF2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
658 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
659
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
660 local_Px10 = (int32_t)(
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
661 (((int64_t)((local_D1 * local_SENS) / 2097152)) - local_OFF)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
662 / 8192 );// )) / 10; // pow(2,21), pow(2,13)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
663
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
664 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
665 ambient_temperature += temperature_offset;
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
666
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
667 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
668 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
669
480
3fe9cc747c5c Code cleanup pressure plausibility check:
ideenmodellierer
parents: 479
diff changeset
670 runningAvg = (avgCnt * runningAvg + calc_pressure) / (avgCnt + 1);
3fe9cc747c5c Code cleanup pressure plausibility check:
ideenmodellierer
parents: 479
diff changeset
671 if (avgCnt < 10) /* build an average considering the last measurements to have a weight "1 of 10" */
3fe9cc747c5c Code cleanup pressure plausibility check:
ideenmodellierer
parents: 479
diff changeset
672 { /* Main reason for this is the jitter of up to +-10 HPa in surface mode which is caused */
3fe9cc747c5c Code cleanup pressure plausibility check:
ideenmodellierer
parents: 479
diff changeset
673 avgCnt++; /* by the measurement range of the sensor which is focused on under water pressure measurement */
331
b4c578caaafb Added plausibility check for pressure values
ideenmodellierer
parents: 276
diff changeset
674 }
480
3fe9cc747c5c Code cleanup pressure plausibility check:
ideenmodellierer
parents: 479
diff changeset
675 ambient_pressure_mbar = runningAvg;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
676 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
677
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
678
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
679 /* taken from AN520 by meas-spec.com dated 9. Aug. 2011
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
680 * short and int are both 16bit according to AVR/GCC google results
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
681 */
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
682 /*static uint8_t crc4(uint16_t n_prom[])
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
683 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
684 uint16_t cnt; // simple counter
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
685 uint16_t n_rem; // crc reminder
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
686 uint16_t crc_read; // original value of the crc
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
687 uint8_t n_bit;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
688 n_rem = 0x00;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
689 crc_read=n_prom[7]; //save read CRC
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
690 n_prom[7]=(0xFF00 & (n_prom[7])); //CRC byte is replaced by 0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
691 for (cnt = 0; cnt < 16; cnt++) // operation is performed on bytes
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
692 { // choose LSB or MSB
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
693 if (cnt%2==1) n_rem ^= (uint16_t) ((n_prom[cnt>>1]) & 0x00FF);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
694 else n_rem ^= (uint16_t) (n_prom[cnt>>1]>>8);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
695 for (n_bit = 8; n_bit > 0; n_bit--)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
696 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
697 if (n_rem & (0x8000))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
698 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
699 n_rem = (n_rem << 1) ^ 0x3000;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
700 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
701 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
702 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
703 n_rem = (n_rem << 1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
704 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
705 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
706 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
707 n_rem= (0x000F & (n_rem >> 12)); // // final 4-bit reminder is CRC code
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
708 n_prom[7]=crc_read; // restore the crc_read to its original place
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
709 return (n_rem ^ 0x00);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
710 }
356
cb3870f79e9d Add Support for new end-2019 hardware:
heinrichsweikamp
parents: 352
diff changeset
711
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
712 void test_calculation(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
713 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
714 C1 = 29112;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
715 C2 = 26814;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
716 C3 = 19125;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
717 C4 = 17865;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
718 C5 = 32057;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
719 C6 = 31305;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
720
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
721 C2_x_2p16 = C2 * 65536;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
722 C1_x_2p15 = C1 * 32768;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
723
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
724 D1 = 4944364;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
725 D2 = 8198974;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
726 pressure_calculation() ;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
727 };
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
728 */
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
729 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
730 {
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
731 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
732 {
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
733 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
734 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
735 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
736 }
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
737
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
738 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
739 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
740 }
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
741
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
742