Mercurial > public > ostc4
annotate Discovery/Src/tMenuGas.c @ 605:1f665e31aca2
change O2_CALIB_FRACTION_O2 to 0.98
It's common sense that calibrating CCR's with O2 asumes a max. O2 content of
98%
author | heinrichsweikamp |
---|---|
date | Thu, 07 Jan 2021 09:53:04 +0100 |
parents | a9c195be907e |
children | 15f6f0b5786c |
rev | line source |
---|---|
38 | 1 /////////////////////////////////////////////////////////////////////////////// |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file Discovery/Src/tMenuGas.c | |
5 /// \brief Main Template file for Menu Page Gas, OC only at the moment | |
6 /// \author heinrichs weikamp gmbh | |
7 /// \date 30-April-2014 | |
8 /// | |
9 /// \details | |
10 /// | |
11 /// $Id$ | |
12 /////////////////////////////////////////////////////////////////////////////// | |
13 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
14 /// | |
15 /// This program is free software: you can redistribute it and/or modify | |
16 /// it under the terms of the GNU General Public License as published by | |
17 /// the Free Software Foundation, either version 3 of the License, or | |
18 /// (at your option) any later version. | |
19 /// | |
20 /// This program is distributed in the hope that it will be useful, | |
21 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
22 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
23 /// GNU General Public License for more details. | |
24 /// | |
25 /// You should have received a copy of the GNU General Public License | |
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
27 ////////////////////////////////////////////////////////////////////////////// | |
28 | |
29 /* Includes ------------------------------------------------------------------*/ | |
30 #include "tMenu.h" | |
31 #include "tMenuGas.h" | |
32 #include "check_warning.h" | |
33 #include "decom.h" | |
34 #include "unit.h" | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
35 #include "configuration.h" |
38 | 36 |
37 #define OCGAS_STANDARD (0) | |
38 #define OCGAS_BAILOUT_INACTIVE (1) | |
39 #define OCGAS_BAILOUT_ACTIVE (2) | |
40 #define CCGAS_STANDARD (0) | |
41 | |
42 /* Private function prototypes -----------------------------------------------*/ | |
43 uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium); | |
44 void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode); | |
45 | |
46 /* Exported functions --------------------------------------------------------*/ | |
47 | |
48 uint32_t tMOG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext) | |
49 { | |
50 uint8_t gas_mode; | |
51 | |
52 if((actual_menu_content == MENU_SURFACE) || (stateUsed->diveSettings.ccrOption == 0)) | |
53 { | |
54 gas_mode = OCGAS_STANDARD; | |
55 } | |
56 else | |
57 { | |
58 if (stateUsed->diveSettings.diveMode == DIVEMODE_CCR) | |
59 gas_mode = OCGAS_BAILOUT_INACTIVE; | |
60 else | |
61 gas_mode = OCGAS_BAILOUT_ACTIVE; | |
62 } | |
63 | |
64 tMG_refresh(line, text, tab, subtext, 0, gas_mode); | |
65 return StMOG; | |
66 } | |
67 | |
68 uint32_t tMCG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext) | |
69 { | |
70 tMG_refresh(line, text, tab, subtext, NUM_OFFSET_DILUENT, CCGAS_STANDARD); | |
71 return StMCG; | |
72 } | |
73 | |
74 void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode) | |
75 { | |
76 const SGasLine * pGasLine; | |
77 | |
344 | 78 uint8_t gasId, oxygen, helium, depthUp, active, first, typeDeco; |
38 | 79 float fPpO2limitHigh = 0; |
80 float fPpO2ofGasAtThisDepth = 0; | |
81 //uint8_t senderCode, depthDown,; | |
82 //uint16_t bar; | |
83 uint16_t textPointer, mod, ltr; | |
84 | |
85 if(actual_menu_content == MENU_SURFACE) | |
86 { | |
87 pGasLine = settingsGetPointer()->gas; | |
88 } | |
89 else | |
90 { | |
91 pGasLine = stateUsed->diveSettings.gas; | |
92 if(actualLeftMaxDepth(stateUsed)) | |
93 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_deco) / 100; | |
94 else | |
95 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_std) / 100; | |
96 } | |
97 textPointer = 0; | |
98 *tab = 158; | |
99 | |
100 /* | |
101 if((line == 0) && (actual_menu_content == MENU_SURFACE)) | |
102 { | |
103 strcpy(subtext, | |
104 "\022" | |
105 // " Travel Deco MOD Bottle" | |
106 " First MOD Deco Bottle" | |
107 ); | |
108 } | |
109 */ | |
110 | |
111 gasId = start; | |
112 for(int count=1;count<=NUM_GASES;count++) | |
113 { | |
114 gasId++; | |
115 if(line && (line != count)) | |
116 { | |
117 first = pGasLine[gasId].note.ub.first; | |
118 if(first == 0) | |
119 { | |
120 strcpy(&text[textPointer], | |
121 "\t" | |
122 "\177" | |
123 "*" | |
124 "\n\r" | |
125 ); | |
126 textPointer += 5; | |
127 } | |
128 else | |
129 { | |
130 strcpy(&text[textPointer],"\n\r"); | |
131 textPointer += 2; | |
132 } | |
133 } | |
134 else | |
135 { | |
136 oxygen = pGasLine[gasId].oxygen_percentage; | |
137 helium = pGasLine[gasId].helium_percentage; | |
138 depthUp = pGasLine[gasId].depth_meter; | |
139 //depthDown = pGasLine[gasId].depth_meter_travel; | |
140 //senderCode = pGasLine[gasId].note.ub.senderCode; | |
141 active = pGasLine[gasId].note.ub.active; | |
142 first = pGasLine[gasId].note.ub.first; | |
143 typeDeco = pGasLine[gasId].note.ub.deco; | |
144 mod = calc_MOD(gasId); | |
145 ltr = pGasLine[gasId].bottle_size_liter; | |
146 //bar = stateUsed->lifeData.bottle_bar[gasId]; | |
147 | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
148 #ifdef ENABLE_UNUSED_GAS_HIDING |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
149 if(pGasLine[gasId].note.ub.off) |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
150 { |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
151 strcpy(&text[textPointer++],"\021"); |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
152 } |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
153 else |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
154 #endif |
38 | 155 if(active) |
156 { | |
157 if(actual_menu_content == MENU_SURFACE) | |
158 strcpy(&text[textPointer++],"\020"); | |
159 else | |
160 { | |
161 fPpO2ofGasAtThisDepth = (stateUsed->lifeData.pressure_ambient_bar - WATER_VAPOUR_PRESSURE) * pGasLine[gasId].oxygen_percentage / 100; | |
162 if(fPpO2ofGasAtThisDepth > fPpO2limitHigh) | |
163 strcpy(&text[textPointer++],"\025"); | |
164 else | |
165 strcpy(&text[textPointer++],"\020"); | |
166 } | |
167 } | |
168 else | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
169 { |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
170 strcpy(&text[textPointer++],"\031"); |
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
171 } |
38 | 172 textPointer += write_gas(&text[textPointer], oxygen, helium); |
173 | |
174 strcpy(&text[textPointer++],"\t"); | |
175 | |
176 if(gasMode == OCGAS_BAILOUT_INACTIVE) | |
177 { | |
178 textPointer += snprintf(&text[textPointer], 59,\ | |
179 "\024" | |
180 " Bailout" | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
181 "\031" |
38 | 182 "\034" |
183 " %3u" | |
184 "\016\016" | |
185 " %c%c" | |
186 "\017" | |
187 "\035" | |
188 "\n\r", | |
189 unit_depth_integer(mod), | |
190 unit_depth_char1(), | |
191 unit_depth_char2() | |
192 ); | |
193 /* | |
194 textPointer += snprintf(&text[textPointer], 57,\ | |
195 "\024" | |
196 " Bailout" | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
197 "\031" |
38 | 198 "\034" |
199 " %3u" | |
200 "\016\016" | |
201 "m" | |
202 "\017" | |
203 " %2u" | |
204 "\016\016" | |
205 "ltr" | |
206 "\017" | |
207 " %3u" | |
208 "\016\016" | |
209 "bar" | |
210 "\017" | |
211 "\035" | |
212 "\n\r", | |
213 mod, ltr, bar | |
214 ); | |
215 */ | |
216 } | |
217 else | |
218 { | |
219 if(first == 0) | |
220 strcpy(&text[textPointer++],"\177"); | |
221 | |
222 /* color active / inactive for gas changes */ | |
528
a9c195be907e
Added new option to gas configuration: "Off":
Ideenmodellierer
parents:
344
diff
changeset
|
223 char color[5] = {'\031','\031','\031','\031','\031'}; |
38 | 224 if(active) |
225 { | |
226 /* mod */ | |
227 color[0] = '\023'; | |
228 /* deco */ | |
229 if(typeDeco && depthUp) | |
230 color[1] = '\020'; | |
231 /* ltr */ | |
232 if(ltr) | |
233 color[2] = '\020'; | |
234 /* bar */ | |
235 | |
236 if(mod < depthUp) | |
237 { | |
238 color[0] = '\025'; | |
239 color[1] = '\025'; | |
240 } | |
241 if(typeDeco && !depthUp) | |
242 { | |
243 color[1] = '\025'; | |
244 } | |
245 } | |
246 | |
247 /* output */ | |
248 /* MOD */ | |
249 textPointer += snprintf(&text[textPointer], 14,\ | |
250 "*" | |
251 " " | |
252 "\034" | |
253 "%c" | |
254 "%3u" | |
255 "\016\016" | |
256 " %c%c" | |
257 "\017", | |
258 color[0], | |
259 unit_depth_integer(mod), | |
260 unit_depth_char1(), | |
261 unit_depth_char2() | |
262 ); | |
263 | |
264 /* deco */ | |
265 if(typeDeco) | |
266 { | |
267 textPointer += snprintf(&text[textPointer], 14,\ | |
268 "%c" | |
269 "%3u" | |
270 "\016\016" | |
271 " %c%c" | |
272 "\017", | |
273 color[1], | |
274 unit_depth_integer(depthUp), | |
275 unit_depth_char1(), | |
276 unit_depth_char2() | |
277 ); | |
278 } | |
279 else | |
280 { | |
281 text[textPointer++] = '\x7F'; | |
282 text[textPointer++] = '\x7F'; | |
283 text[textPointer++] = 3*25 + 20; | |
284 } | |
285 /* liter */ | |
286 /* | |
287 textPointer += snprintf(&text[textPointer], 12,\ | |
288 "%c" | |
289 " %2u" | |
290 "\016\016" | |
291 "ltr" | |
292 "\017" | |
293 , color[2],ltr | |
294 ); | |
295 */ | |
296 /* bar */ | |
297 /* | |
298 textPointer += snprintf(&text[textPointer], 12,\ | |
299 "%c" | |
300 " %3u" | |
301 "\016\016" | |
302 "bar" | |
303 "\017", | |
304 color[3], bar | |
305 ); | |
306 */ | |
307 text[textPointer++] = '\035'; | |
308 text[textPointer++] = '\n'; | |
309 text[textPointer++] = '\r'; | |
310 text[textPointer] = 0; | |
311 } | |
312 } | |
313 } | |
314 | |
315 /* special gas number #6 in dive mode*/ | |
316 if(((line == 0) || (line == 6)) && (actual_menu_content != MENU_SURFACE)) | |
317 { | |
318 text[textPointer++] = '\020'; | |
319 text[textPointer++] = TXT_2BYTE; | |
320 if(start == NUM_OFFSET_DILUENT) | |
321 text[textPointer++] = TXT2BYTE_SpecialDiveGasMenuCCR; | |
322 else | |
323 text[textPointer++] = TXT2BYTE_SpecialDiveGasMenu; | |
324 text[textPointer++] = '\n'; | |
325 text[textPointer++] = '\r'; | |
326 text[textPointer++] = 0; | |
327 } | |
328 } | |
329 | |
330 | |
331 /* Private functions ---------------------------------------------------------*/ | |
332 | |
333 /* write_gas() is used in t7.c | |
334 */ | |
335 uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium) | |
336 { | |
337 uint8_t length; | |
338 | |
339 if((oxygen == 21) && (helium == 0)) | |
340 { | |
341 strcpy(text,"Air"); | |
342 length = 3; | |
343 } | |
344 else if(oxygen == 100) | |
345 { | |
346 strcpy(text,"Oxy"); | |
347 length = 3; | |
348 } | |
349 else if(helium == 0) | |
350 { | |
351 length = snprintf(text, 7,"NX%u",oxygen); | |
352 } | |
353 else if((oxygen + helium) == 100) | |
354 { | |
355 length = snprintf(text, 7,"HX%u",oxygen); | |
356 } | |
357 else | |
358 { | |
359 length = snprintf(text, 7,"%u/%u",oxygen,helium); | |
360 } | |
361 | |
362 if(length > 6) | |
363 { | |
364 strcpy(text,"error"); | |
365 length = 5; | |
366 } | |
367 | |
368 return length; | |
369 } |