Mercurial > public > ostc4
annotate Discovery/Src/buehlmann.c @ 976:0b81ac558e89 Evo_2_23
Devbugfix UART buffer cleaning:
In the previous version a buffer cleaning function was used which resets the ringbuffer read index. As result the processing of data was stopped until the DMA write comes to the index 0. When reaching it the complete buffer was proceeded including possibly invalid data.
The usage of the cleanbuffer function was replaced by the flush buffer function (meaning the data is discarded but the data index is maintained). There was already a function for this. Because the function was 99% the same as the read function, it was integrated into the ReadData function. Calling the function with parameter flush = 1 will result in a buffer flush.
The workaround of the previous revision was updated to only be applied in case a DiveO2 sensor is operated in stand alone mode.
author | Ideenmodellierer |
---|---|
date | Wed, 29 Jan 2025 17:21:20 +0100 (3 months ago) |
parents | 79b522fbabe6 |
children | 7891160acde3 |
rev | line source |
---|---|
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
1 /* getrennte Gase f�r die verschiedenen Modi |
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
2 um Gaswechsel Eintr�ge zu vereinfachen |
38 | 3 das heisst: |
4 oc == bailout in cc mode | |
5 */ | |
6 | |
7 /* Konvention: | |
8 float extExample_variable_can_be_used_with_extern; | |
9 */ | |
10 | |
11 #include <string.h> | |
12 #include <math.h> | |
13 #include <stdbool.h> | |
14 #include "buehlmann.h" | |
15 #include "decom.h" | |
16 | |
17 extern const float buehlmann_N2_a[]; | |
18 extern const float buehlmann_N2_b[]; | |
19 extern const float buehlmann_He_a[]; | |
20 extern const float buehlmann_He_b[]; | |
21 | |
22 typedef struct | |
23 { | |
24 float depth; | |
25 int id; | |
26 } SStop; | |
27 | |
28 #define DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS 59940 // 999 minuten; before: 18000 // 5(h) * 60(min) * 60 sec = 18000 sec | |
29 #define DECO_STOPS_MAX_TTS_FOR_EVERY_SECOND_CALC_IN_SECONDS 7200 | |
30 #define NINETY_NINE_MINUTES_IN_SECONDS 59940 | |
31 | |
32 # define PRESSURE_TEN_METER 1.0f | |
33 # define PRESSURE_THREE_METER 0.333334f | |
34 # define PRESSURE_150_CM 0.15f | |
35 # define PRESSURE_HALF_METER 0.05f | |
36 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
37 static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise); |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
38 static float tissue_tolerance(void); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
39 static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
40 static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
41 static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
42 static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure); |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
43 static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
44 static _Bool dive1_check_deco(SDiveSettings *pDiveSettings); |
38 | 45 |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
46 static float gSurface_pressure_bar; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
47 static float gPressure; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
48 static int gGas_id; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
49 static float gTissue_nitrogen_bar[16]; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
50 static float gTissue_helium_bar[16]; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
51 static float gGF_value; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
52 static float gCNS; |
38 | 53 |
54 float gGF_low_depth_bar; | |
55 SStop gStop; | |
56 | |
57 void buehlmann_init(void) | |
58 { | |
59 } | |
60 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
61 static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise) |
38 | 62 { |
63 static float pressure; | |
64 static float gas_id; | |
65 static float tissue_nitrogen_bar[16]; | |
66 static float tissue_helium_bar[16]; | |
67 static float gf_value; | |
68 static float cns; | |
69 | |
70 if(backup_restore_otherwise) | |
71 { | |
72 pressure = gPressure; | |
73 gas_id = gGas_id; | |
74 gf_value = gGF_value; | |
75 cns = gCNS; | |
76 memcpy(tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16)); | |
77 memcpy(tissue_helium_bar, gTissue_helium_bar, (4*16)); | |
78 } | |
79 else | |
80 { | |
81 gPressure = pressure; | |
82 gGas_id = gas_id; | |
83 gGF_value = gf_value; | |
84 gCNS = cns; | |
85 memcpy(gTissue_nitrogen_bar, tissue_nitrogen_bar, (4*16)); | |
86 memcpy(gTissue_helium_bar, tissue_helium_bar, (4*16)); | |
87 } | |
88 | |
89 } | |
90 | |
91 float buehlmann_get_gCNS(void) | |
92 { | |
93 return gCNS; | |
94 } | |
95 | |
96 void buehlmann_calc_deco(SLifeData* pLifeData, SDiveSettings * pDiveSettings, SDecoinfo * pDecoInfo) | |
97 { | |
98 float ceiling; | |
99 int ascend_time; | |
100 int tts_seconds; | |
101 float pressure_delta; | |
102 float next_depth; | |
103 _Bool deco_reached = false; | |
104 unsigned short *stoplist; | |
105 int i; | |
106 | |
107 gCNS = 0; | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
108 pDecoInfo->output_time_to_surface_seconds = 0; |
38 | 109 pDecoInfo->output_ndl_seconds = 0; |
110 for(int i=0;i<DECOINFO_STRUCT_MAX_STOPS;i++) | |
111 { | |
112 pDecoInfo->output_stop_length_seconds[i] = 0; | |
113 } | |
114 | |
115 /* internal copying */ | |
116 gSurface_pressure_bar = pLifeData->pressure_surface_bar; | |
117 | |
118 gPressure = pLifeData->pressure_ambient_bar; | |
119 gGas_id = 0; | |
120 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16)); | |
121 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16)); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
122 gGF_value = ((float)pDiveSettings->gf_low) / 100.0f; |
38 | 123 |
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
124 stoplist = pDecoInfo->output_stop_length_seconds; |
38 | 125 |
305
305f251cc981
bugfix, consistency: show deco/NDL really after 1 minute divetime
Jan Mulder <jlmulder@xs4all.nl>
parents:
291
diff
changeset
|
126 if(pLifeData->dive_time_seconds_without_surface_time < 60) |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
127 return; |
38 | 128 |
129 // clean stop list | |
130 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++) | |
131 stoplist[i] = 0; | |
132 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
133 if(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero >= (gPressure - PRESSURE_150_CM)) |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
134 { |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
135 deco_reached = true; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
136 } |
38 | 137 |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
138 gGF_value = ((float)pDiveSettings->gf_high) / 100.0f; |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
139 buehlmann_backup_and_restore(true); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
140 if(!dive1_check_deco(pDiveSettings) ) |
38 | 141 { |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
142 buehlmann_backup_and_restore(false); |
38 | 143 // no deco |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
144 pDecoInfo->output_time_to_surface_seconds = 0; |
38 | 145 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++) |
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
146 pDecoInfo->output_stop_length_seconds[i] = 0; |
38 | 147 // calc NDL |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
148 pDecoInfo->output_ndl_seconds = buehlmann_calc_ndl(pDiveSettings);; |
38 | 149 return; |
150 } | |
151 buehlmann_backup_and_restore(false); | |
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
152 pDecoInfo->output_ndl_seconds = 0; |
38 | 153 |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
154 gGF_value = get_gf_at_pressure(pDiveSettings, gPressure); |
38 | 155 //current ceiling at actual position |
156 ceiling = tissue_tolerance(); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
157 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); |
38 | 158 |
159 // set the base for all upcoming parameters | |
160 ceiling = gStop.depth + gSurface_pressure_bar; | |
161 tts_seconds = 0; | |
162 | |
163 // modify parameters if there is ascend or parameter fine adjustment | |
164 if(ceiling < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling | |
165 { | |
166 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr. | |
167 if(ceiling < (gPressure - PRESSURE_TEN_METER) ) | |
168 { do { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
169 ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER); |
38 | 170 tts_seconds += ascend_time; |
171 ceiling = tissue_tolerance(); | |
172 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS) | |
173 { | |
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
174 pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS; |
38 | 175 return;// NINETY_NINE_MINUTES_IN_SECONDS; |
176 } | |
177 } while ((ascend_time > 0 ) && ((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER))); | |
178 } | |
179 do { | |
180 buehlmann_backup_and_restore(true); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
181 ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER); |
38 | 182 tts_seconds += ascend_time; |
183 ceiling = tissue_tolerance(); | |
184 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS) | |
185 { | |
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
186 pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS; |
38 | 187 return;// NINETY_NINE_MINUTES_IN_SECONDS; |
188 } | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
189 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); |
38 | 190 } while ((ascend_time > 0 ) && ((gStop.depth + gSurface_pressure_bar) < gPressure)); |
191 | |
192 if(gStop.depth + gSurface_pressure_bar > gPressure) | |
193 { | |
194 gPressure += PRESSURE_THREE_METER; | |
195 buehlmann_backup_and_restore(false); | |
196 tts_seconds -= ascend_time; | |
197 } | |
198 // calculate first stop based on tissue saturation within 10 meters of stop | |
199 //ambient_bar_to_deco_stop_depth_bar(ceiling); | |
200 } | |
201 else | |
202 { | |
203 // initial values, upper code might not be executed (is within 150 cm) | |
204 } | |
205 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
206 if (ceiling > gSurface_pressure_bar) |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
207 { |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
208 ceiling = gStop.depth + gSurface_pressure_bar; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
209 // ascend the last meters to first stop (especially consider any gas changes around) |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
210 pressure_delta = gPressure - ceiling; |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
211 ascend_time = (int) ceil(pressure_delta * 50.0f); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
212 tts_seconds += ascend_with_all_gaschanges(pDiveSettings, pressure_delta); |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
213 } |
38 | 214 // NDL check |
215 if(ceiling <= gSurface_pressure_bar) | |
216 { | |
217 // NDL with GF_low | |
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
218 pDecoInfo->output_time_to_surface_seconds = 0; |
38 | 219 return; |
220 } | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
221 if (ceiling > pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero) |
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
222 pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = ceiling; |
38 | 223 |
224 // calc gf loop | |
225 if(deco_reached) | |
226 gGF_low_depth_bar = pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero - gSurface_pressure_bar; | |
227 else | |
228 gGF_low_depth_bar = ceiling - gSurface_pressure_bar; | |
229 | |
230 while(gStop.depth > 0) | |
231 { | |
232 do | |
233 { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
234 next_depth = next_stop_depth_input_is_actual_stop_id(pDiveSettings, gStop.id); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
235 gGF_value = get_gf_at_pressure(pDiveSettings, next_depth + gSurface_pressure_bar); |
38 | 236 buehlmann_backup_and_restore(true); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
237 ascend_time = ascend_with_all_gaschanges(pDiveSettings, gStop.depth - next_depth); |
38 | 238 ceiling = tissue_tolerance(); |
239 /* pre check actual limit */ | |
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
240 if(pDecoInfo->output_stop_length_seconds[gStop.id] >= 999*60) |
38 | 241 { |
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
242 tts_seconds -= 999*60 - pDecoInfo->output_stop_length_seconds[gStop.id]; |
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
243 pDecoInfo->output_stop_length_seconds[gStop.id] = 999*60; |
38 | 244 } |
245 else | |
246 /* more deco on the actual depth */ | |
247 if(ceiling > next_depth + gSurface_pressure_bar) | |
248 { | |
249 next_depth = -1; | |
250 buehlmann_backup_and_restore(false); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
251 decom_tissues_exposure2(10, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); // some seconds at least at each stop |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
252 decom_oxygen_calculate_cns_exposure(10, &pDiveSettings->decogaslist[gGas_id], gPressure, &gCNS); |
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
253 pDecoInfo->output_stop_length_seconds[gStop.id] += 10; |
38 | 254 tts_seconds += 10; |
255 } | |
256 } while(next_depth == -1); | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
257 tts_seconds += ascend_time; |
38 | 258 gStop.depth = next_depth; |
259 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
260 { | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
261 if((pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
973 | 262 #ifdef ENABLE_DECOCALC_OPTION |
263 || (pDiveSettings->gas[pDiveSettings->decogaslist[i].GasIdInSettings].note.ub.decocalc == 0) | |
264 #endif | |
265 ) | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
266 { |
38 | 267 break; |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
268 } |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
269 float pressureChange = ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10; |
38 | 270 if(gStop.depth <= pressureChange + 0.00001f) |
271 { | |
272 gGas_id = i; | |
273 } | |
274 else | |
275 { | |
276 break; | |
277 } | |
278 } | |
279 gStop.id--; | |
280 } | |
281 | |
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
282 pDecoInfo->output_time_to_surface_seconds = tts_seconds; |
38 | 283 } |
284 | |
285 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
286 static float tissue_tolerance(void) |
38 | 287 { |
288 float tissue_inertgas_saturation; | |
289 float inertgas_a; | |
290 float inertgas_b; | |
291 float ceiling; | |
292 float global_ceiling; | |
293 int ci; | |
294 | |
295 global_ceiling = -1; | |
296 | |
297 for (ci = 0; ci < 16; ci++) | |
298 { | |
299 if(gTissue_helium_bar[ci] == 0) | |
300 { | |
301 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
302 // | |
303 inertgas_a = buehlmann_N2_a[ci]; | |
304 inertgas_b = buehlmann_N2_b[ci]; | |
305 } | |
306 else | |
307 { | |
308 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
309 // | |
310 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
311 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
312 } | |
313 // | |
314 ceiling = (inertgas_b * ( tissue_inertgas_saturation - gGF_value * inertgas_a ) ) / (gGF_value - (inertgas_b * gGF_value) + inertgas_b); | |
315 if(ceiling > global_ceiling) | |
316 global_ceiling = ceiling; | |
317 } | |
318 return global_ceiling; | |
319 } | |
320 | |
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
321 void buehlmann_super_saturation_calculator(SLifeData* pLifeData, SDecoinfo * pDecoInfo) |
38 | 322 { |
323 float tissue_inertgas_saturation; | |
324 float inertgas_a; | |
325 float inertgas_b; | |
326 float ceiling; | |
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
327 float super_saturation; |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
328 float pres_respiration = pLifeData->pressure_ambient_bar; |
38 | 329 int ci; |
330 | |
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
331 pDecoInfo->super_saturation = 0; |
38 | 332 |
333 for (ci = 0; ci < 16; ci++) | |
334 { | |
335 if(gTissue_helium_bar[ci] == 0) | |
336 { | |
337 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
338 inertgas_a = buehlmann_N2_a[ci]; | |
339 inertgas_b = buehlmann_N2_b[ci]; | |
340 } | |
341 else | |
342 { | |
343 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
344 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
345 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
346 } | |
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
347 |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
348 ceiling = pres_respiration / inertgas_b + inertgas_a; |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
349 if(tissue_inertgas_saturation > pres_respiration) |
38 | 350 { |
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
351 super_saturation = |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
352 (tissue_inertgas_saturation - pres_respiration) / (ceiling - pres_respiration); |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
353 |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
354 if (super_saturation > pDecoInfo->super_saturation) |
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
355 pDecoInfo->super_saturation = super_saturation; |
38 | 356 } |
357 } | |
358 } | |
359 | |
360 | |
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
361 static float buehlmann_tissue_test_tolerance(float depth_in_bar_absolute) |
38 | 362 { |
363 float tissue_inertgas_saturation; | |
364 float inertgas_a; | |
365 float inertgas_b; | |
366 float inertgas_tolerance; | |
367 float gf_minus_1; | |
368 | |
369 gf_minus_1 = gGF_value - 1.0f; | |
370 | |
371 for (int ci = 0; ci < 16; ci++) | |
372 { | |
373 if(gTissue_helium_bar[ci] == 0) | |
374 { | |
375 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
376 inertgas_a = buehlmann_N2_a[ci]; | |
377 inertgas_b = buehlmann_N2_b[ci]; | |
378 } | |
379 else | |
380 { | |
381 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
382 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
383 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
384 } | |
385 inertgas_tolerance = ( (gGF_value / inertgas_b - gf_minus_1) * depth_in_bar_absolute ) + ( gGF_value * inertgas_a ); | |
386 if(inertgas_tolerance < tissue_inertgas_saturation) | |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
387 return tissue_inertgas_saturation - inertgas_tolerance; // positive |
38 | 388 } |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
389 return tissue_inertgas_saturation - inertgas_tolerance; // negative |
38 | 390 } |
391 | |
392 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
393 static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling) |
38 | 394 { |
395 int i; | |
396 | |
397 ceiling -= gSurface_pressure_bar; | |
398 | |
399 if(ceiling <= 0) | |
400 { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
401 gStop.depth = pDiveSettings->last_stop_depth_bar; |
38 | 402 gStop.id = 0; |
403 return; | |
404 } | |
405 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
406 if((ceiling - pDiveSettings->last_stop_depth_bar) <= 0) |
38 | 407 { |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
408 gStop.depth = pDiveSettings->last_stop_depth_bar; |
38 | 409 gStop.id = 0; |
410 return; | |
411 } | |
412 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
413 gStop.depth = pDiveSettings->input_second_to_last_stop_depth_bar; |
38 | 414 gStop.id = 1; |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
415 ceiling -= pDiveSettings->input_second_to_last_stop_depth_bar; |
38 | 416 |
417 if(ceiling <= 0) | |
418 return; | |
419 | |
420 for(i = 1; i < (DECOINFO_STRUCT_MAX_STOPS - 2); i++) | |
421 { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
422 ceiling -= pDiveSettings->input_next_stop_increment_depth_bar; |
38 | 423 if(ceiling <= 0) |
424 break; | |
425 } | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
426 gStop.depth += i * pDiveSettings->input_next_stop_increment_depth_bar; |
38 | 427 gStop.id += i; |
428 return; | |
429 } | |
430 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
431 static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id) |
38 | 432 { |
433 if(actual_id == 0) | |
434 return 0; | |
435 | |
436 if(actual_id == 1) | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
437 return pDiveSettings->last_stop_depth_bar; |
38 | 438 |
439 actual_id -= 2; | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
440 return pDiveSettings->input_second_to_last_stop_depth_bar + (actual_id * pDiveSettings->input_next_stop_increment_depth_bar); |
38 | 441 } |
442 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
443 static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease) |
38 | 444 { |
445 float pressureTop, pressureTop_tmp, pressureBottom, pressureChange, ascendrate_in_seconds_for_one_bar, pressure_difference; | |
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
446 int time_for_ascend = 0; |
38 | 447 int seconds; |
448 int i; | |
449 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
450 ascendrate_in_seconds_for_one_bar = 60 * 10 / pDiveSettings->ascentRate_meterperminute; |
38 | 451 |
452 if(fabsf(gPressure - gSurface_pressure_bar) < PRESSURE_HALF_METER) | |
453 { | |
454 gPressure = gSurface_pressure_bar; | |
455 return 0; | |
456 } | |
457 | |
458 pressureTop = gPressure - pressure_decrease; | |
459 if( gSurface_pressure_bar > pressureTop) | |
460 pressureTop = gSurface_pressure_bar; | |
461 pressureBottom = gPressure; | |
462 seconds = 0; | |
463 do{ | |
464 pressureTop_tmp = pressureTop; | |
465 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
466 { | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
467 if((pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
973 | 468 #ifdef ENABLE_DECOCALC_OPTION |
469 || (pDiveSettings->gas[pDiveSettings->decogaslist[i].GasIdInSettings].note.ub.decocalc == 0) | |
470 #endif | |
471 ) | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
472 { |
38 | 473 break; |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
474 } |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
475 pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10; |
38 | 476 if(pressureBottom <= pressureChange) |
477 { | |
478 gGas_id = i; | |
479 } | |
480 else | |
481 { | |
482 break; | |
483 } | |
484 | |
485 } | |
486 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
487 { | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
488 if((pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
973 | 489 #ifdef ENABLE_DECOCALC_OPTION |
490 || (pDiveSettings->gas[pDiveSettings->decogaslist[i].GasIdInSettings].note.ub.decocalc == 0) | |
491 #endif | |
492 ) | |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
493 { |
38 | 494 break; |
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
495 } |
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
496 |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
497 pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero)/ 10; |
38 | 498 if((pressureChange < pressureBottom) && (pressureChange > pressureTop)) |
499 { | |
500 pressureTop_tmp = pressureChange; | |
501 } | |
502 } | |
503 pressure_difference = pressureBottom - pressureTop_tmp; | |
504 if(pressure_difference > 0.0001f) | |
505 { | |
506 time_for_ascend = (int)ceilf(pressure_difference * ascendrate_in_seconds_for_one_bar); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
507 decom_tissues_exposure_stage_schreiner(time_for_ascend, &pDiveSettings->decogaslist[gGas_id], |
38 | 508 pressureBottom, pressureTop_tmp, gTissue_nitrogen_bar, gTissue_helium_bar); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
509 decom_oxygen_calculate_cns_stage_SchreinerStyle(time_for_ascend,&pDiveSettings->decogaslist[gGas_id], |
38 | 510 pressureBottom, pressureTop_tmp, &gCNS); |
511 } | |
512 pressureBottom = pressureTop_tmp; | |
513 seconds += time_for_ascend; | |
514 }while(pressureTop_tmp > pressureTop); | |
515 gPressure = pressureTop; | |
516 return seconds; | |
517 } | |
518 | |
519 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
520 static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure) |
38 | 521 { |
522 float gfSteigung = 0.0f; | |
523 | |
524 if(gGF_low_depth_bar < 0) | |
525 gGF_low_depth_bar = PRESSURE_THREE_METER; // just to prevent erratic behaviour if variable is not set | |
526 | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
527 gfSteigung = ((float)(pDiveSettings->gf_high - pDiveSettings->gf_low))/ gGF_low_depth_bar; |
38 | 528 |
529 | |
530 if((pressure - gSurface_pressure_bar) <= PRESSURE_HALF_METER) | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
531 return ((float)pDiveSettings->gf_high) / 100.0f; |
38 | 532 |
533 if(pressure >= gSurface_pressure_bar + gGF_low_depth_bar) | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
534 return ((float)pDiveSettings->gf_low) / 100.0f; |
38 | 535 |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
536 return (pDiveSettings->gf_high - gfSteigung * (pressure - gSurface_pressure_bar) )/ 100.0f; |
38 | 537 } |
538 | |
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
539 #define MAX_NDL 240 |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
540 static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings) |
38 | 541 { |
542 float local_tissue_nitrogen_bar[16]; | |
543 float local_tissue_helium_bar[16]; | |
544 int i; | |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
545 int ndl = 0; |
38 | 546 |
547 //Check ndl always use gHigh | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
548 gGF_value = ((float)pDiveSettings->gf_high) / 100.0f; |
38 | 549 //10 minutes steps |
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
550 while(ndl < (MAX_NDL * 60)) |
38 | 551 { |
552 memcpy(local_tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16)); | |
553 memcpy(local_tissue_helium_bar, gTissue_helium_bar, (4*16)); | |
554 // | |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
555 ndl += 600; |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
556 decom_tissues_exposure2(600, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
557 decom_oxygen_calculate_cns_exposure(600,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS); |
38 | 558 buehlmann_backup_and_restore(true); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
559 if(dive1_check_deco(pDiveSettings)) |
38 | 560 { |
561 buehlmann_backup_and_restore(false); | |
562 break; | |
563 } | |
564 buehlmann_backup_and_restore(false); | |
565 } | |
566 | |
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
567 if(ndl < (MAX_NDL * 60)) |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
568 ndl -= 600; |
38 | 569 |
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
570 if(ndl > (MAX_NDL/2 * 60)) |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
571 return ndl; |
38 | 572 |
573 // refine | |
574 memcpy(gTissue_nitrogen_bar, local_tissue_nitrogen_bar, (4*16)); | |
575 memcpy(gTissue_helium_bar, local_tissue_helium_bar, (4*16)); | |
576 | |
577 //One minutes step | |
256
d10f53e39374
Buehlmann: trivial performance improvement (NDL)
Jan Mulder <jlmulder@xs4all.nl>
parents:
255
diff
changeset
|
578 for(i = 0; i < 10; i++) |
38 | 579 { |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
580 ndl += 60; |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
581 decom_tissues_exposure2(60, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); |
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
582 decom_oxygen_calculate_cns_exposure(60,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS); |
38 | 583 buehlmann_backup_and_restore(true); |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
584 if(dive1_check_deco(pDiveSettings)) |
38 | 585 break; |
586 buehlmann_backup_and_restore(false); | |
587 } | |
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
588 return ndl; |
38 | 589 } |
590 | |
591 | |
592 // =============================================================================== | |
593 // dive1_check_deco | |
594 /// @brief for NDL calculations | |
595 /// 160614 using ceilingOther and not ceiling | |
596 // =============================================================================== | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
597 static _Bool dive1_check_deco(SDiveSettings *pDiveSettings) |
38 | 598 { |
599 // gGF_value is set in call routine; | |
600 // internes Backup! | |
601 | |
602 // calc like in deco | |
603 float ceiling; | |
604 float ceilingOther; // new hw 160614 | |
605 | |
606 ceiling = tissue_tolerance(); | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
607 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); // this will set gStop.depth :-) (and gStop.id) |
38 | 608 |
609 // set the base for all upcoming parameters | |
610 ceilingOther = gStop.depth + gSurface_pressure_bar; | |
611 | |
612 // modify parameters if there is ascend or parameter fine adjustment | |
613 if(ceilingOther < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling | |
614 { | |
615 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr. | |
616 while(((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER))) | |
617 { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
618 ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER); |
38 | 619 ceiling = tissue_tolerance(); |
620 } | |
621 while(((gPressure - PRESSURE_THREE_METER )> gSurface_pressure_bar) && (ceiling < gPressure)) | |
622 { | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
623 ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER); |
38 | 624 ceiling = tissue_tolerance(); |
625 } | |
626 } | |
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
627 return ceiling > gSurface_pressure_bar; |
38 | 628 } |
629 | |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
630 // compute ceiling recursively, with a resolution of 10cm. Notice |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
631 // that the initial call shall guarantee that the found ceiling |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
632 // is between low and high parameters. |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
633 static float compute_ceiling(float low, float high) |
38 | 634 { |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
635 if ((high - low) < 0.01) |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
636 return low; |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
637 else { |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
638 float next_pressure_absolute = (low + high)/2; |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
639 float test_result = buehlmann_tissue_test_tolerance(next_pressure_absolute); |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
640 if (test_result < 0) |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
641 return compute_ceiling(low, next_pressure_absolute); |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
642 else |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
643 return compute_ceiling(next_pressure_absolute, high); |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
644 } |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
645 } |
38 | 646 |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
647 void buehlmann_ceiling_calculator(SLifeData *pLifeData, SDecoinfo *pDecoInfo) |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
648 { |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
649 float ceiling; |
224
ceecabfddb57
Bugfix, deco: fix 2 (small) problems with calculated ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
130
diff
changeset
|
650 |
261
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
651 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16)); |
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
652 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16)); |
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
653 |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
654 // this is just performance optimizing. The code below runs just fine |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
655 // without this. There is never a ceiling in NDL deco state |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
656 if (!pDecoInfo->output_time_to_surface_seconds) { |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
657 pDecoInfo->output_ceiling_meter = 0; |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
658 return; |
38 | 659 } |
660 | |
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
661 ceiling = compute_ceiling(pLifeData->pressure_surface_bar, 1.0f + pLifeData->max_depth_meter/10.0f); |
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
662 pDecoInfo->output_ceiling_meter = (ceiling - pLifeData->pressure_surface_bar) * 10.0f; |
38 | 663 } |