comparison Discovery/Src/tMenuGas.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children 3f09b283d993
comparison
equal deleted inserted replaced
37:ccc45c0e1ea2 38:5f11787b4f42
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"
35
36 #define OCGAS_STANDARD (0)
37 #define OCGAS_BAILOUT_INACTIVE (1)
38 #define OCGAS_BAILOUT_ACTIVE (2)
39 #define CCGAS_STANDARD (0)
40
41 /* Private function prototypes -----------------------------------------------*/
42 uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium);
43 void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode);
44
45 /* Exported functions --------------------------------------------------------*/
46
47 uint32_t tMOG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext)
48 {
49 uint8_t gas_mode;
50
51 if((actual_menu_content == MENU_SURFACE) || (stateUsed->diveSettings.ccrOption == 0))
52 {
53 gas_mode = OCGAS_STANDARD;
54 }
55 else
56 {
57 if (stateUsed->diveSettings.diveMode == DIVEMODE_CCR)
58 gas_mode = OCGAS_BAILOUT_INACTIVE;
59 else
60 gas_mode = OCGAS_BAILOUT_ACTIVE;
61 }
62
63 tMG_refresh(line, text, tab, subtext, 0, gas_mode);
64 return StMOG;
65 }
66
67 uint32_t tMCG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext)
68 {
69 tMG_refresh(line, text, tab, subtext, NUM_OFFSET_DILUENT, CCGAS_STANDARD);
70 return StMCG;
71 }
72
73 void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode)
74 {
75 const SGasLine * pGasLine;
76
77 uint8_t gasId, oxygen, helium, depthUp, active, first, typeDeco, wirelessId;
78 float fPpO2limitHigh = 0;
79 float fPpO2ofGasAtThisDepth = 0;
80 //uint8_t senderCode, depthDown,;
81 //uint16_t bar;
82 uint16_t textPointer, mod, ltr;
83
84 if(actual_menu_content == MENU_SURFACE)
85 {
86 pGasLine = settingsGetPointer()->gas;
87 }
88 else
89 {
90 pGasLine = stateUsed->diveSettings.gas;
91 if(actualLeftMaxDepth(stateUsed))
92 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_deco) / 100;
93 else
94 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_std) / 100;
95 }
96 textPointer = 0;
97 *tab = 158;
98
99 /*
100 if((line == 0) && (actual_menu_content == MENU_SURFACE))
101 {
102 strcpy(subtext,
103 "\022"
104 // " Travel Deco MOD Bottle"
105 " First MOD Deco Bottle"
106 );
107 }
108 */
109
110 gasId = start;
111 for(int count=1;count<=NUM_GASES;count++)
112 {
113 gasId++;
114 if(line && (line != count))
115 {
116 first = pGasLine[gasId].note.ub.first;
117 if(first == 0)
118 {
119 strcpy(&text[textPointer],
120 "\t"
121 "\177"
122 "*"
123 "\n\r"
124 );
125 textPointer += 5;
126 }
127 else
128 {
129 strcpy(&text[textPointer],"\n\r");
130 textPointer += 2;
131 }
132 }
133 else
134 {
135 oxygen = pGasLine[gasId].oxygen_percentage;
136 helium = pGasLine[gasId].helium_percentage;
137 depthUp = pGasLine[gasId].depth_meter;
138 //depthDown = pGasLine[gasId].depth_meter_travel;
139 //senderCode = pGasLine[gasId].note.ub.senderCode;
140 active = pGasLine[gasId].note.ub.active;
141 first = pGasLine[gasId].note.ub.first;
142 typeDeco = pGasLine[gasId].note.ub.deco;
143 mod = calc_MOD(gasId);
144 ltr = pGasLine[gasId].bottle_size_liter;
145 wirelessId = pGasLine[gasId].bottle_wireless_id;
146 //bar = stateUsed->lifeData.bottle_bar[gasId];
147
148 if(active)
149 {
150 if(actual_menu_content == MENU_SURFACE)
151 strcpy(&text[textPointer++],"\020");
152 else
153 {
154 fPpO2ofGasAtThisDepth = (stateUsed->lifeData.pressure_ambient_bar - WATER_VAPOUR_PRESSURE) * pGasLine[gasId].oxygen_percentage / 100;
155 if(fPpO2ofGasAtThisDepth > fPpO2limitHigh)
156 strcpy(&text[textPointer++],"\025");
157 else
158 strcpy(&text[textPointer++],"\020");
159 }
160 }
161 else
162 strcpy(&text[textPointer++],"\021");
163
164 textPointer += write_gas(&text[textPointer], oxygen, helium);
165
166 strcpy(&text[textPointer++],"\t");
167
168 if(gasMode == OCGAS_BAILOUT_INACTIVE)
169 {
170 textPointer += snprintf(&text[textPointer], 59,\
171 "\024"
172 " Bailout"
173 "\021"
174 "\034"
175 " %3u"
176 "\016\016"
177 " %c%c"
178 "\017"
179 "\035"
180 "\n\r",
181 unit_depth_integer(mod),
182 unit_depth_char1(),
183 unit_depth_char2()
184 );
185 /*
186 textPointer += snprintf(&text[textPointer], 57,\
187 "\024"
188 " Bailout"
189 "\021"
190 "\034"
191 " %3u"
192 "\016\016"
193 "m"
194 "\017"
195 " %2u"
196 "\016\016"
197 "ltr"
198 "\017"
199 " %3u"
200 "\016\016"
201 "bar"
202 "\017"
203 "\035"
204 "\n\r",
205 mod, ltr, bar
206 );
207 */
208 }
209 else
210 {
211 if(first == 0)
212 strcpy(&text[textPointer++],"\177");
213
214 /* color active / inactive for gas changes */
215 char color[5] = {'\021','\021','\021','\021','\021'};
216 if(active)
217 {
218 /* mod */
219 color[0] = '\023';
220 /* deco */
221 if(typeDeco && depthUp)
222 color[1] = '\020';
223 /* ltr */
224 if(ltr)
225 color[2] = '\020';
226 /* bar */
227 if(wirelessId)
228 color[3] = '\020';
229 /* wireless */
230 if(wirelessId)
231 color[4] = '\020';
232 /* ltr, bar */
233
234 if(mod < depthUp)
235 {
236 color[0] = '\025';
237 color[1] = '\025';
238 }
239 if(typeDeco && !depthUp)
240 {
241 color[1] = '\025';
242 }
243 }
244
245 /* output */
246 /* MOD */
247 textPointer += snprintf(&text[textPointer], 14,\
248 "*"
249 " "
250 "\034"
251 "%c"
252 "%3u"
253 "\016\016"
254 " %c%c"
255 "\017",
256 color[0],
257 unit_depth_integer(mod),
258 unit_depth_char1(),
259 unit_depth_char2()
260 );
261
262 /* deco */
263 if(typeDeco)
264 {
265 textPointer += snprintf(&text[textPointer], 14,\
266 "%c"
267 "%3u"
268 "\016\016"
269 " %c%c"
270 "\017",
271 color[1],
272 unit_depth_integer(depthUp),
273 unit_depth_char1(),
274 unit_depth_char2()
275 );
276 }
277 else
278 {
279 text[textPointer++] = '\x7F';
280 text[textPointer++] = '\x7F';
281 text[textPointer++] = 3*25 + 20;
282 }
283 /* liter */
284 /*
285 textPointer += snprintf(&text[textPointer], 12,\
286 "%c"
287 " %2u"
288 "\016\016"
289 "ltr"
290 "\017"
291 , color[2],ltr
292 );
293 */
294 /* bar */
295 /*
296 textPointer += snprintf(&text[textPointer], 12,\
297 "%c"
298 " %3u"
299 "\016\016"
300 "bar"
301 "\017",
302 color[3], bar
303 );
304 */
305 /* wireless */
306 /*
307 if(wirelessId)
308 {
309 textPointer += snprintf(&text[textPointer], 8,\
310 "%c"
311 " *"
312 "%u",
313 color[4], (wirelessId%0x0F)
314 );
315 }
316 */
317 text[textPointer++] = '\035';
318 text[textPointer++] = '\n';
319 text[textPointer++] = '\r';
320 text[textPointer] = 0;
321 }
322 }
323 }
324
325 /* special gas number #6 in dive mode*/
326 if(((line == 0) || (line == 6)) && (actual_menu_content != MENU_SURFACE))
327 {
328 text[textPointer++] = '\020';
329 text[textPointer++] = TXT_2BYTE;
330 if(start == NUM_OFFSET_DILUENT)
331 text[textPointer++] = TXT2BYTE_SpecialDiveGasMenuCCR;
332 else
333 text[textPointer++] = TXT2BYTE_SpecialDiveGasMenu;
334 text[textPointer++] = '\n';
335 text[textPointer++] = '\r';
336 text[textPointer++] = 0;
337 }
338 }
339
340
341 /* Private functions ---------------------------------------------------------*/
342
343 /* write_gas() is used in t7.c
344 */
345 uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium)
346 {
347 uint8_t length;
348
349 if((oxygen == 21) && (helium == 0))
350 {
351 strcpy(text,"Air");
352 length = 3;
353 }
354 else if(oxygen == 100)
355 {
356 strcpy(text,"Oxy");
357 length = 3;
358 }
359 else if(helium == 0)
360 {
361 length = snprintf(text, 7,"NX%u",oxygen);
362 }
363 else if((oxygen + helium) == 100)
364 {
365 length = snprintf(text, 7,"HX%u",oxygen);
366 }
367 else
368 {
369 length = snprintf(text, 7,"%u/%u",oxygen,helium);
370 }
371
372 if(length > 6)
373 {
374 strcpy(text,"error");
375 length = 5;
376 }
377
378 return length;
379 }