Mercurial > public > ostc4
annotate Discovery/Src/tMenuGas.c @ 599:5a8f9126e4cb
Bugfix T3 skip deactivated views:
I previous version the OSTC hangs if only conditional views (like decoplan which is only displayed in case of deco time) are switched. Rootcause was that the select function could never switch to another view because no visible view was available. To avoid this use case a fallback option has been added. In case no other view is available, the current view will be kept. In case no view at all (even no conditional view) is available then a switch to the "None" view will be done independend if it is enabled or not.
T3_Profile: Added functionalty to show max depth and divetime of a profile provided by the replay block.
author | Ideenmodellierer |
---|---|
date | Mon, 04 Jan 2021 21:48:31 +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 } |