annotate Discovery/Src/buehlmann.c @ 218:ff59d1d07f9c Improve_IPC_Sync

Splitted 120 seconds UART timeout into chunks of 500ms The UART connection via Bluetooth was realized using a receive call with 120 seconds timeout. By cancellation it seemed for the user as if the connection would have been aborted. In reality the received function keeped executing the wait for RX data till timeout occure. To avaoid this the timeout has been splitted into several calls with 500ms timeout => If the user disconnects by pressing "back" the COMM function is now ended.
author ideenmodellierer
date Sun, 31 Mar 2019 15:44:12 +0200
parents b7689d9e888a
children ceecabfddb57
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
3 das heisst:
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
4 oc == bailout in cc mode
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
5 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
6
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
7 /* Konvention:
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
8 float extExample_variable_can_be_used_with_extern;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
9 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
10
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
11 #include <string.h>
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
12 //#include "arm_math.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
13 #include <math.h>
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
14 #include <stdbool.h>
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
15 #include "buehlmann.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
16 #include "decom.h"
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
17
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
18
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
19 extern const float helium_time_constant[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
20 extern const float nitrogen_time_constant[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
21
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
22 extern const float buehlmann_N2_a[];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
23 extern const float buehlmann_N2_b[];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
24 extern const float buehlmann_He_a[];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
25 extern const float buehlmann_He_b[];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
26
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
27
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
28 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
29 typedef struct
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
30 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
31 float *pointer_array_tissue_nitrogen_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
32 float *pointer_array_tissue_helium_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
33 char gf_value;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
34
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
35 float output_ceiling_ambient_bar_or_input;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
36 _Bool output_ceiling_tolerated_if_ceiling_used_as_input;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
37 } tissue_test_tolerance_struct;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
38 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
39 typedef struct
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
40 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
41 float depth;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
42 int id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
43 } SStop;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
44
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
45 #define DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS 59940 // 999 minuten; before: 18000 // 5(h) * 60(min) * 60 sec = 18000 sec
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
46 #define DECO_STOPS_MAX_TTS_FOR_EVERY_SECOND_CALC_IN_SECONDS 7200
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
47 #define NINETY_NINE_MINUTES_IN_SECONDS 59940
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
48
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
49 # define PRESSURE_TEN_METER 1.0f
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
50 # define PRESSURE_THREE_METER 0.333334f
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
51 # define PRESSURE_150_CM 0.15f
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
52 # define PRESSURE_HALF_METER 0.05f
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
53 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
54 # define PRESSURE_150_CM_MBAR 150
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
55 # define PRESSURE_TWO_M_MBAR 200
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
56 # define PRESSURE_FIVE_M_MBAR 500
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
57 # define PRESSURE_TEN_M_MBAR 1000
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
58 # define PRESSURE_120_METER 12.0
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
59 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
60 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
61 _____________________________________________________________
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
62 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
63
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
64
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
65 void buehlmann_backup_and_restore(_Bool backup_restore_otherwise);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
66 float tissue_tolerance(void);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
67 void ambient_bar_to_deco_stop_depth_bar(float ceiling);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
68 int ascend_with_all_gaschanges(float pressure_decrease);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
69 float next_stop_depth_input_is_actual_stop_id(int actual_id);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
70 float get_gf_at_pressure(float pressure);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
71 void buehlmann_calc_ndl(void);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
72 _Bool dive1_check_deco(void);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
73 uint8_t buehlmann_tissue_test_tolerance(float depth_in_bar_absolute);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
74
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
75 /*
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
76 _____________________________________________________________
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
77 */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
78
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
79 SDecoinfo gDecotable;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
80 float gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
81 float gPressure;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
82 int gGas_id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
83 float gTTS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
84 float gTissue_nitrogen_bar[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
85 float gTissue_helium_bar[16];
130
b7689d9e888a Minor changes to improved code quality and to eliminate warnings
Ideenmodellierer
parents: 51
diff changeset
86 float gGF_value;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
87 float gCNS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
88 //float gMax_ceiling_bar = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
89 int gNDL;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
90
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
91
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
92 //SLifeData *pLifeData;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
93 SDiveSettings *pBuDiveSettings;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
94 SDecoinfo* pDecolistBuehlmann;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
95 //signed char gGaschange_decreasing_depth_gas_id[BUEHLMANN_STRUCT_MAX_GASES];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
96 float gGF_low_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
97 SStop gStop;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
98
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
99 void buehlmann_init(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
100 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
101 //gMax_ceiling_bar = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
102 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
103
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
104 void buehlmann_backup_and_restore(_Bool backup_restore_otherwise)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
105 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
106 static float pressure;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
107 static float gas_id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
108 static float tts;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
109 static float tissue_nitrogen_bar[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
110 static float tissue_helium_bar[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
111 static float gf_value;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
112 static int ndl;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
113 static float cns;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
114
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
115 if(backup_restore_otherwise)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
116 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
117 pressure = gPressure;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
118 gas_id = gGas_id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
119 tts = gTTS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
120 gf_value = gGF_value;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
121 ndl = gNDL;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
122 cns = gCNS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
123 memcpy(tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
124 memcpy(tissue_helium_bar, gTissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
125 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
126 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
127 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
128 gPressure = pressure;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
129 gGas_id = gas_id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
130 gTTS = tts;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
131 gGF_value = gf_value;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
132 gNDL = ndl;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
133 gCNS = cns;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
134 memcpy(gTissue_nitrogen_bar, tissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
135 memcpy(gTissue_helium_bar, tissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
136 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
137
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
138 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
139 /*void buehlmann__test__saturate_tissues(SBuehlmann *pInput, int seconds)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
140 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
141 pBuehlmann = pInput;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
142 pInput->dive_time_seconds += seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
143 // internal copying
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
144 gSurface_pressure_bar = pBuehlmann->pressure_surface_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
145
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
146 gPressure = pBuehlmann->pressure_ambient_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
147 gGas_id = pBuehlmann->actual_gas_id;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
148 memcpy(gTissue_nitrogen_bar, pBuehlmann->tissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
149 memcpy(gTissue_helium_bar, pBuehlmann->tissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
150
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
151 tissues_exposure_at_gPressure_seconds(seconds);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
152
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
153 memcpy(pBuehlmann->tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
154 memcpy(pBuehlmann->tissue_helium_bar, gTissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
155 }*/
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
156
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
157 float buehlmann_get_gCNS(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
158 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
159 return gCNS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
160 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
161
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
162 void buehlmann_calc_deco(SLifeData* pLifeData, SDiveSettings * pDiveSettings, SDecoinfo * pDecoInfo)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
163 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
164 float ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
165 int ascend_time;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
166 int tts_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
167 float pressure_delta;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
168 float next_depth;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
169 _Bool deco_reached = false;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
170 // tissue_test_tolerance_struct tolerance_data;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
171 unsigned short *stoplist;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
172 int i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
173
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
174 // decom_CreateGasChangeList(pDiveSettings, pLifeData);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
175
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
176 gCNS = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
177 pDecoInfo->output_time_to_surface_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
178 pDecoInfo->output_ndl_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
179 for(int i=0;i<DECOINFO_STRUCT_MAX_STOPS;i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
180 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
181 pDecoInfo->output_stop_length_seconds[i] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
182 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
183 /* make input available global*/
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
184 pBuDiveSettings = pDiveSettings;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
185
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
186 pDecolistBuehlmann = pDecoInfo;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
187 /* internal copying */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
188 gSurface_pressure_bar = pLifeData->pressure_surface_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
189
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
190 gPressure = pLifeData->pressure_ambient_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
191 gGas_id = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
192 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
193 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
194 gGF_value = ((float)pBuDiveSettings->gf_low) / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
195
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
196 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
197 memcpy(&gDecotable, pDecolistBuehlmann, sizeof(SDecoinfo));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
198 stoplist = gDecotable.output_stop_length_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
199
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
200
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
201 if(pLifeData->dive_time_seconds < 60)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
202 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
203 /* coupling */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
204
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
205 /* functions */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
206
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
207 // clean stop list
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
208 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
209 stoplist[i] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
210 gTTS = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
211 gNDL = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
212
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
213 if(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero >= (gPressure - PRESSURE_150_CM))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
214 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
215 deco_reached = true;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
216 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
217
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
218
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
219 //ascend_with_all_gaschanges(gPressure - gSurface_pressure_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
220 gGF_value = ((float)pBuDiveSettings->gf_high) / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
221 //iling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
222 // includes backup for gGF_value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
223 // NDL
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
224 buehlmann_backup_and_restore(true); // includes backup for gGF_value
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
225 if(!dive1_check_deco() )
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
226 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
227 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
228 // no deco
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
229 pDecolistBuehlmann->output_time_to_surface_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
230 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
231 pDecolistBuehlmann->output_stop_length_seconds[i] = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
232 // calc NDL
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
233 buehlmann_calc_ndl();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
234 pDecolistBuehlmann->output_ndl_seconds = gNDL;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
235 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
236 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
237 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
238 pDecolistBuehlmann->output_ndl_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
239
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
240 gGF_value = get_gf_at_pressure(gPressure);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
241 //current ceiling at actual position
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
242 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
243 //if(ceiling < pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
244 //ambient_bar_to_deco_stop_depth_bar(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
245 //else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
246 ambient_bar_to_deco_stop_depth_bar(ceiling);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
247
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
248 // set the base for all upcoming parameters
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
249 ceiling = gStop.depth + gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
250 tts_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
251
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
252 // modify parameters if there is ascend or parameter fine adjustment
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
253 if(ceiling < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
254 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
255 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr.
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
256 if(ceiling < (gPressure - PRESSURE_TEN_METER) )
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
257 { do {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
258 ascend_time = ascend_with_all_gaschanges(PRESSURE_TEN_METER);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
259 tts_seconds += ascend_time;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
260 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
261 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
262 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
263 /* pInput == pBuehlmann */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
264 pDecolistBuehlmann->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
265 return;// NINETY_NINE_MINUTES_IN_SECONDS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
266 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
267 } while ((ascend_time > 0 ) && ((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER)));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
268 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
269 do {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
270 buehlmann_backup_and_restore(true);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
271 ascend_time = ascend_with_all_gaschanges(PRESSURE_THREE_METER);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
272 tts_seconds += ascend_time;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
273 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
274 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
275 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
276 /* pInput == pBuehlmann */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
277 pDecolistBuehlmann->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
278 return;// NINETY_NINE_MINUTES_IN_SECONDS;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
279 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
280 ambient_bar_to_deco_stop_depth_bar(ceiling);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
281 } while ((ascend_time > 0 ) && ((gStop.depth + gSurface_pressure_bar) < gPressure));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
282
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
283 if(gStop.depth + gSurface_pressure_bar > gPressure)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
284 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
285 gPressure += PRESSURE_THREE_METER;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
286 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
287 tts_seconds -= ascend_time;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
288 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
289 // calculate first stop based on tissue saturation within 10 meters of stop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
290 //ambient_bar_to_deco_stop_depth_bar(ceiling);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
291 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
292 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
293 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
294 // initial values, upper code might not be executed (is within 150 cm)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
295 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
296
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
297
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
298
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
299
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
300 if(ceiling > gSurface_pressure_bar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
301 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
302
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
303 ceiling = gStop.depth + gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
304 // ascend the last meters to first stop (especially consider any gas changes around)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
305 pressure_delta = gPressure - ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
306 ascend_time = (int)ceil(pressure_delta * 50.0f);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
307 tts_seconds += ascend_with_all_gaschanges(pressure_delta);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
308 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
309 // NDL check
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
310 if(ceiling <= gSurface_pressure_bar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
311 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
312 /* pInput == pBuehlmann same pointer*/
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
313 // NDL with GF_low
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
314 pDecolistBuehlmann->output_time_to_surface_seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
315 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
316 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
317 if(ceiling >pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
318 pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
319
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
320 // calc gf loop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
321 if(deco_reached)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
322 gGF_low_depth_bar = pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero - gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
323 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
324 gGF_low_depth_bar = ceiling - gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
325
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
326 while(gStop.depth > 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
327 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
328 do
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
329 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
330 next_depth = next_stop_depth_input_is_actual_stop_id(gStop.id);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
331 gGF_value = get_gf_at_pressure(next_depth + gSurface_pressure_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
332 buehlmann_backup_and_restore(true);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
333 ascend_time = ascend_with_all_gaschanges(gStop.depth - next_depth);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
334 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
335 /* pre check actual limit */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
336 if(gDecotable.output_stop_length_seconds[gStop.id] >= 999*60)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
337 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
338 tts_seconds -= 999*60 - gDecotable.output_stop_length_seconds[gStop.id];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
339 gDecotable.output_stop_length_seconds[gStop.id] = 999*60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
340 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
341 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
342 /* more deco on the actual depth */
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
343 if(ceiling > next_depth + gSurface_pressure_bar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
344 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
345 next_depth = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
346 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
347 decom_tissues_exposure2(10, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); // some seconds at least at each stop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
348 decom_oxygen_calculate_cns_exposure(10, &pBuDiveSettings->decogaslist[gGas_id], gPressure, &gCNS);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
349 gDecotable.output_stop_length_seconds[gStop.id] += 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
350 tts_seconds += 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
351 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
352 } while(next_depth == -1);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
353 tts_seconds += ascend_time;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
354 gStop.depth = next_depth;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
355 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
356 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
357 if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
358 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
359 float pressureChange = ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
360 if(gStop.depth <= pressureChange + 0.00001f)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
361 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
362 gGas_id = i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
363 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
364 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
365 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
366 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
367 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
368 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
369 gStop.id--;
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 gDecotable.output_time_to_surface_seconds = tts_seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
373 memcpy(pDecolistBuehlmann, &gDecotable, sizeof(SDecoinfo));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
374 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
375
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
376
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
377 float tissue_tolerance(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
378 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
379 float tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
380 float inertgas_a;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
381 float inertgas_b;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
382 float ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
383 float global_ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
384 int ci;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
385
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
386 global_ceiling = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
387
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
388 for (ci = 0; ci < 16; ci++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
389 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
390 if(gTissue_helium_bar[ci] == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
391 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
392 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
393 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
394 inertgas_a = buehlmann_N2_a[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
395 inertgas_b = buehlmann_N2_b[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
396 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
397 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
398 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
399 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
400 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
401 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
402 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
403 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
404 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
405 ceiling = (inertgas_b * ( tissue_inertgas_saturation - gGF_value * inertgas_a ) ) / (gGF_value - (inertgas_b * gGF_value) + inertgas_b);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
406 if(ceiling > global_ceiling)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
407 global_ceiling = ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
408 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
409 return global_ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
410 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
411
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
412 // hw 161121 for relative gradient
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
413 float tissue_tolerance_without_gf_correction(float *tissue_inertgas_saturation_output)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
414 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
415 float tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
416 float inertgas_a;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
417 float inertgas_b;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
418 float ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
419 float global_ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
420 int ci;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
421
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
422 global_ceiling = -1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
423
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
424 for (ci = 0; ci < 16; ci++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
425 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
426 if(gTissue_helium_bar[ci] == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
427 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
428 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
429 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
430 inertgas_a = buehlmann_N2_a[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
431 inertgas_b = buehlmann_N2_b[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
432 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
433 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
434 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
435 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
436 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
437 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
438 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
439 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
440 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
441 ceiling = inertgas_b * ( tissue_inertgas_saturation - inertgas_a );
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
442 if(ceiling > global_ceiling)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
443 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
444 global_ceiling = ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
445 if(tissue_inertgas_saturation_output)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
446 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
447 *tissue_inertgas_saturation_output = tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
448 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
449 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
450 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
451 return global_ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
452 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
453
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
454
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
455 uint8_t buehlmann_tissue_test_tolerance(float depth_in_bar_absolute)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
456 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
457 float tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
458 float inertgas_a;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
459 float inertgas_b;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
460 float inertgas_tolerance;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
461 float gf_minus_1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
462
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
463 gf_minus_1 = gGF_value - 1.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
464
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
465 for (int ci = 0; ci < 16; ci++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
466 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
467 if(gTissue_helium_bar[ci] == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
468 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
469 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
470 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
471 inertgas_a = buehlmann_N2_a[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
472 inertgas_b = buehlmann_N2_b[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
473 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
474 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
475 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
476 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
477 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
478 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
479 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
480 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
481 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
482 inertgas_tolerance = ( (gGF_value / inertgas_b - gf_minus_1) * depth_in_bar_absolute ) + ( gGF_value * inertgas_a );
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
483 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
484 if(inertgas_tolerance < tissue_inertgas_saturation)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
485 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
486 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
487 return 1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
488 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
489
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
490
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
491 void ambient_bar_to_deco_stop_depth_bar(float ceiling)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
492 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
493 int i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
494
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
495 ceiling -= gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
496
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
497 if(ceiling <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
498 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
499 gStop.depth = pBuDiveSettings->last_stop_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
500 gStop.id = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
501 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
502 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
503
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
504
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
505 //for(int i = 1; i < 10; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
506
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
507 if((ceiling - pBuDiveSettings->last_stop_depth_bar) <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
508 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
509 gStop.depth = pBuDiveSettings->last_stop_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
510 gStop.id = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
511 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
512 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
513
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
514 gStop.depth = pBuDiveSettings->input_second_to_last_stop_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
515 gStop.id = 1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
516 ceiling -= pBuDiveSettings->input_second_to_last_stop_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
517
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
518 if(ceiling <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
519 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
520
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
521 for(i = 1; i < (DECOINFO_STRUCT_MAX_STOPS - 2); i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
522 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
523 ceiling -= pBuDiveSettings->input_next_stop_increment_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
524 if(ceiling <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
525 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
526 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
527 gStop.depth += i * pBuDiveSettings->input_next_stop_increment_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
528 gStop.id += i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
529 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
530 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
531
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
532 float next_stop_depth_input_is_actual_stop_id(int actual_id)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
533 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
534 if(actual_id == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
535 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
536
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
537 if(actual_id == 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
538 return pBuDiveSettings->last_stop_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
539
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
540 actual_id -= 2;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
541 return pBuDiveSettings->input_second_to_last_stop_depth_bar + (actual_id * pBuDiveSettings->input_next_stop_increment_depth_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
542 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
543
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
544 int ascend_with_all_gaschanges(float pressure_decrease)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
545 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
546 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
547 int time_for_ascend = 0;
38
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
548 int seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
549 int i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
550
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
551 ascendrate_in_seconds_for_one_bar = 60 * 10 / pBuDiveSettings->ascentRate_meterperminute;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
552
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
553 if(fabsf(gPressure - gSurface_pressure_bar) < PRESSURE_HALF_METER)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
554 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
555 gPressure = gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
556 return 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
557 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
558
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
559 pressureTop = gPressure - pressure_decrease;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
560 if( gSurface_pressure_bar > pressureTop)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
561 pressureTop = gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
562 pressureBottom = gPressure;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
563 seconds = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
564 do{
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
565 pressureTop_tmp = pressureTop;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
566 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
567 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
568 if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
569 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
570 pressureChange = gSurface_pressure_bar + ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
571 if(pressureBottom <= pressureChange)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
572 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
573 gGas_id = i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
574 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
575 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
576 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
577 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
578 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
579
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
580 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
581 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
582 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
583 if(pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
584 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
585 pressureChange = gSurface_pressure_bar + ((float)pBuDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero)/ 10;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
586 if((pressureChange < pressureBottom) && (pressureChange > pressureTop))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
587 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
588 pressureTop_tmp = pressureChange;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
589 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
590 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
591 pressure_difference = pressureBottom - pressureTop_tmp;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
592 if(pressure_difference > 0.0001f)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
593 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
594 time_for_ascend = (int)ceilf(pressure_difference * ascendrate_in_seconds_for_one_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
595 decom_tissues_exposure_stage_schreiner(time_for_ascend, &pBuDiveSettings->decogaslist[gGas_id],
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
596 pressureBottom, pressureTop_tmp, gTissue_nitrogen_bar, gTissue_helium_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
597 decom_oxygen_calculate_cns_stage_SchreinerStyle(time_for_ascend,&pBuDiveSettings->decogaslist[gGas_id],
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
598 pressureBottom, pressureTop_tmp, &gCNS);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
599 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
600 pressureBottom = pressureTop_tmp;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
601 seconds += time_for_ascend;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
602 }while(pressureTop_tmp > pressureTop);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
603 gPressure = pressureTop;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
604 return seconds;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
605 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
606
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
607
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
608 float get_gf_at_pressure(float pressure)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
609 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
610 float gfSteigung = 0.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
611
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
612 if(gGF_low_depth_bar < 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
613 gGF_low_depth_bar = PRESSURE_THREE_METER; // just to prevent erratic behaviour if variable is not set
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
614
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
615 gfSteigung = ((float)(pBuDiveSettings->gf_high - pBuDiveSettings->gf_low))/ gGF_low_depth_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
616
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
617
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
618 if((pressure - gSurface_pressure_bar) <= PRESSURE_HALF_METER)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
619 return ((float)pBuDiveSettings->gf_high) / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
620
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
621 if(pressure >= gSurface_pressure_bar + gGF_low_depth_bar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
622 return ((float)pBuDiveSettings->gf_low) / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
623
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
624 return (pBuDiveSettings->gf_high - gfSteigung * (pressure - gSurface_pressure_bar) )/ 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
625 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
626
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
627
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
628 void buehlmann_calc_ndl(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
629 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
630 float local_tissue_nitrogen_bar[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
631 float local_tissue_helium_bar[16];
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
632 int i;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
633
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
634 gNDL = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
635 //Check ndl always use gHigh
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
636 gGF_value = ((float)pBuDiveSettings->gf_high) / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
637 //10 minutes steps
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
638 while(gNDL < (300 * 60))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
639 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
640 memcpy(local_tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
641 memcpy(local_tissue_helium_bar, gTissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
642 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
643 gNDL += 600;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
644 decom_tissues_exposure2(600, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
645 decom_oxygen_calculate_cns_exposure(600,&pBuDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
646 //tissues_exposure_at_gPressure_seconds(600);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
647 buehlmann_backup_and_restore(true);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
648 if(dive1_check_deco() == true)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
649 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
650 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
651 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
652 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
653 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
654 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
655
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
656 if(gNDL < (300 * 60))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
657 gNDL -= 600;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
658
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
659 if(gNDL > (150 * 60))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
660 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
661
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
662 // refine
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
663 memcpy(gTissue_nitrogen_bar, local_tissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
664 memcpy(gTissue_helium_bar, local_tissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
665
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
666 //One minutes step
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
667 for(i = 0; i < 20; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
668 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
669 gNDL += 60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
670 //tissues_exposure_at_gPressure_seconds(60);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
671 decom_tissues_exposure2(60, &pBuDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
672 decom_oxygen_calculate_cns_exposure(60,&pBuDiveSettings->decogaslist[gGas_id],gPressure,&gCNS);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
673 buehlmann_backup_and_restore(true);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
674 if(dive1_check_deco() == true)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
675 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
676 buehlmann_backup_and_restore(false);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
677 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
678 //gNDL -= 60;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
679 return;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
680 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
681
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
682
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
683 // ===============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
684 // dive1_check_deco
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
685 /// @brief for NDL calculations
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
686 /// 160614 using ceilingOther and not ceiling
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
687 // ===============================================================================
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
688 _Bool dive1_check_deco(void)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
689 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
690 // gGF_value is set in call routine;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
691 // internes Backup!
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
692
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
693 // calc like in deco
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
694 float ceiling;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
695 float ceilingOther; // new hw 160614
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
696
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
697 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
698 ambient_bar_to_deco_stop_depth_bar(ceiling); // this will set gStop.depth :-) (and gStop.id)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
699
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
700 // set the base for all upcoming parameters
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
701 ceilingOther = gStop.depth + gSurface_pressure_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
702
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
703 // modify parameters if there is ascend or parameter fine adjustment
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
704 if(ceilingOther < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
705 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
706 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr.
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
707 while(((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER)))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
708 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
709 ascend_with_all_gaschanges(PRESSURE_TEN_METER);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
710 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
711 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
712 while(((gPressure - PRESSURE_THREE_METER )> gSurface_pressure_bar) && (ceiling < gPressure))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
713 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
714 ascend_with_all_gaschanges(PRESSURE_THREE_METER);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
715 ceiling = tissue_tolerance();
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
716 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
717 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
718 if(ceiling <= gSurface_pressure_bar)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
719 return false;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
720 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
721 return true;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
722 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
723
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
724
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
725 void buehlmann_ceiling_calculator(SLifeData* pLifeData, SDiveSettings * pDiveSettings, SDecoinfo * pDecoInfo)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
726 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
727 float gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
728 float gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
729 float gf_delta;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
730 int dv_gf_low_stop_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
731 _Bool test_result;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
732 float next_gf_value;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
733 float next_pressure_absolute;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
734 int depth_in_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
735
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
736 gf_low = pDiveSettings->gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
737 gf_high = pDiveSettings->gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
738
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
739 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
740 dv_gf_low_stop_meter = (int)((pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero - pLifeData->pressure_surface_bar) * 10);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
741 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
742 if(dv_gf_low_stop_meter < 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
743 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
744 next_gf_value = gf_high; // fix hw 161024
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
745 gf_delta = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
746 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
747 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
748 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
749 next_gf_value = gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
750 gf_delta = gf_high - gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
751 gf_delta /= dv_gf_low_stop_meter; // gf_delta is delta for each meter now!!
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
752 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
753 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
754 depth_in_meter = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
755 next_pressure_absolute = pLifeData->pressure_surface_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
756
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
757 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
758 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16));
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
759 gGF_value = next_gf_value / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
760 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
761 test_result = buehlmann_tissue_test_tolerance(next_pressure_absolute);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
762 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
763 while(!test_result && depth_in_meter < 200)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
764 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
765 depth_in_meter += 1;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
766 next_gf_value = fmaxf(gf_low, next_gf_value - gf_delta);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
767 gGF_value = next_gf_value / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
768 next_pressure_absolute += 0.1f; // 1 meter down
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
769 test_result = buehlmann_tissue_test_tolerance(next_pressure_absolute);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
770 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
771 //
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
772 if(test_result)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
773 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
774 // old direct paste
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
775 pDecoInfo->output_ceiling_meter = depth_in_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
776 // new sub-meter hw 160331
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
777 if(depth_in_meter >= 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
778 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
779 for(int i = 0; i < 10; i++)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
780 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
781 next_gf_value += gf_delta/10.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
782 gGF_value = next_gf_value / 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
783 next_pressure_absolute -= 0.01f; // 0.1 meter up
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
784 if(!buehlmann_tissue_test_tolerance(next_pressure_absolute))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
785 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
786 pDecoInfo->output_ceiling_meter -= ((float)i)/10.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
787 break;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
788 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
789 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
790 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
791 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
792 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
793 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
794 pDecoInfo->output_ceiling_meter = 999;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
795 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
796 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
797
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
798
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
799 void buehlmann_relative_gradient_calculator(SLifeData* pLifeData, SDiveSettings * pDiveSettings, SDecoinfo * pDecoInfo)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
800 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
801 float gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
802 float gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
803 float gf_delta;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
804 int dv_gf_low_stop_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
805
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
806 float rgf; // relative gradient factor by hwOS p2_deco.c
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
807 float temp_tissue;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
808 float limit;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
809 float pres_respiration;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
810 float gf;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
811
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
812 gf_low = pDiveSettings->gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
813 gf_high = pDiveSettings->gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
814
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
815 dv_gf_low_stop_meter = (int)((pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero - pLifeData->pressure_surface_bar) * 10);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
816
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
817 if(dv_gf_low_stop_meter < 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
818 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
819 gf_delta = 0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
820 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
821 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
822 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
823 gf_delta = gf_high - gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
824 gf_delta /= dv_gf_low_stop_meter; // gf_delta is delta for each meter now!!
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
825 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
826
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
827
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
828 limit = tissue_tolerance_without_gf_correction(&temp_tissue);
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
829 pres_respiration = pLifeData->pressure_ambient_bar;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
830
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
831 if( temp_tissue <= pres_respiration )
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
832 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
833 gf = 0.0;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
834 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
835 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
836 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
837 gf = (temp_tissue - pres_respiration)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
838 / (temp_tissue - limit)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
839 * 100.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
840 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
841
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
842 if(dv_gf_low_stop_meter < 1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
843 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
844 rgf = gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
845 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
846 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
847 {
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
848 float temp1 = dv_gf_low_stop_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
849 float temp2 = pLifeData->depth_meter;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
850
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
851 if (temp2 <= 0)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
852 rgf = gf_high;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
853 else if (temp2 >= temp1)
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
854 rgf = gf_low;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
855 else
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
856 rgf = gf_low + (temp1 - temp2)*gf_delta;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
857 }
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
858
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
859 rgf = gf / rgf;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
860
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
861 // avoid discussions about values > 100 below next deco stop
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
862 if((rgf > 1.0f) && (pLifeData->depth_meter >= pDecoInfo->output_ceiling_meter))
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
863 rgf = 1.0f;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
864
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
865 pDecoInfo->output_relative_gradient = rgf;
5f11787b4f42 include in ostc4 repository
heinrichsweikamp
parents:
diff changeset
866 }