Mercurial > public > ostc4
annotate Discovery/Src/t3.c @ 538:b1eee27cd02b
BugFix firmware downgrade to version with less settings:
If a downgrade to a firmware version using less setting parameter were done then the settings had been reset to the default values. Root cause was that only increased number of settings was accepted by the read function. Because the layout of the setting structure is fixed (only bytes attached, no change in the order of data values) a downgrade just discarding the no longer used settings is possible => Updated read function to handle reduction of setting parameters.
author | Ideenmodellierer |
---|---|
date | Sat, 10 Oct 2020 13:51:44 +0200 |
parents | 0e1db77b2aca |
children | d784f281833a |
rev | line source |
---|---|
38 | 1 /////////////////////////////////////////////////////////////////////////////// |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file Discovery/Src/t3.c | |
5 /// \brief Main Template file for dive mode special scree t3 | |
6 /// \author Heinrichs Weikamp gmbh | |
7 /// \date 10-Nov-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 "t3.h" | |
31 | |
32 #include "data_exchange_main.h" | |
33 #include "decom.h" | |
34 #include "gfx_fonts.h" | |
35 #include "math.h" | |
36 #include "tHome.h" | |
37 #include "timer.h" | |
38 #include "unit.h" | |
39 | |
237
ec16fd26e280
Bugfix: do not show NDL in bigscreen mode when zero
Jan Mulder <jlmulder@xs4all.nl>
parents:
214
diff
changeset
|
40 //* Imported function prototypes ---------------------------------------------*/ |
38 | 41 extern uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium); |
42 | |
43 /* Exported variables --------------------------------------------------------*/ | |
44 | |
45 const uint16_t BigFontSeperationLeftRight = 399; | |
46 const uint16_t BigFontSeperationTopBottom = 240; | |
47 | |
48 /* Private variables ---------------------------------------------------------*/ | |
49 GFX_DrawCfgScreen t3screen; | |
50 GFX_DrawCfgWindow t3l1; | |
51 GFX_DrawCfgWindow t3r1; | |
52 GFX_DrawCfgWindow t3c1; | |
53 GFX_DrawCfgWindow t3c2; | |
54 | |
529
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
55 uint8_t t3_selection_customview = CVIEW_noneOrDebug; |
38 | 56 |
57 /* TEM HAS TO MOVE TO GLOBAL--------------------------------------------------*/ | |
58 | |
59 /* Private types -------------------------------------------------------------*/ | |
60 #define TEXTSIZE 16 | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
61 #define NUMBER_OF_VIEWS 7 /* number of views defined in the array below */ |
38 | 62 |
63 const uint8_t t3_customviewsStandard[] = | |
64 { | |
65 CVIEW_T3_Decostop, | |
66 CVIEW_sensors, | |
67 CVIEW_Compass, | |
68 CVIEW_T3_MaxDepth, | |
69 CVIEW_T3_StopWatch, | |
70 CVIEW_T3_TTS, | |
71 CVIEW_T3_ppO2andGas, | |
518 | 72 CVIEW_T3_GasList, |
511 | 73 CVIEW_T3_Navigation, |
74 CVIEW_T3_DepthData, | |
38 | 75 CVIEW_T3_END |
76 }; | |
77 | |
78 /* Private function prototypes -----------------------------------------------*/ | |
79 void t3_refresh_divemode(void); | |
80 | |
81 uint8_t t3_test_customview_warnings(void); | |
82 void t3_refresh_customview(float depth); | |
496 | 83 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading); |
38 | 84 |
85 /* Exported functions --------------------------------------------------------*/ | |
86 | |
87 void t3_init(void) | |
88 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
89 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
90 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
91 |
496 | 92 t3_selection_customview = t3_customviewsStandard[0]; |
38 | 93 |
94 t3screen.FBStartAdress = 0; | |
95 t3screen.ImageHeight = 480; | |
96 t3screen.ImageWidth = 800; | |
97 t3screen.LayerIndex = 1; | |
98 | |
99 t3l1.Image = &t3screen; | |
100 t3l1.WindowNumberOfTextLines = 2; | |
101 t3l1.WindowLineSpacing = 19; // Abstand von Y0 | |
102 t3l1.WindowTab = 100; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
103 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
104 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
105 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
106 t3l1.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
107 t3l1.WindowX1 = BigFontSeperationLeftRight - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
108 t3l1.WindowY0 = BigFontSeperationTopBottom + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
109 t3l1.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
110 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
111 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
112 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
113 t3l1.WindowX0 = 800 - BigFontSeperationLeftRight + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
114 t3l1.WindowX1 = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
115 t3l1.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
116 t3l1.WindowY1 = 479 - BigFontSeperationTopBottom + 5 ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
117 } |
38 | 118 |
119 t3r1.Image = &t3screen; | |
120 t3r1.WindowNumberOfTextLines = t3l1.WindowNumberOfTextLines; | |
121 t3r1.WindowLineSpacing = t3l1.WindowLineSpacing; | |
122 t3r1.WindowTab = t3l1.WindowTab; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
123 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
124 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
125 t3r1.WindowX0 = BigFontSeperationLeftRight + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
126 t3r1.WindowX1 = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
127 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
128 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
129 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
130 t3r1.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
131 t3r1.WindowX1 = BigFontSeperationLeftRight - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
132 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
133 |
38 | 134 t3r1.WindowY0 = t3l1.WindowY0; |
135 t3r1.WindowY1 = t3l1.WindowY1; | |
136 | |
518 | 137 /* t3c1 is across the complete lower part of the display */ |
38 | 138 t3c1.Image = &t3screen; |
139 t3c1.WindowNumberOfTextLines = 2; | |
518 | 140 t3c1.WindowLineSpacing = 84 + 5; /* double font + spacing */ |
38 | 141 t3c1.WindowX0 = 0; |
142 t3c1.WindowX1 = 799; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
143 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
144 { |
511 | 145 t3c1.WindowY0 = 5; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
146 t3c1.WindowY1 = BigFontSeperationTopBottom - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
147 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
148 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
149 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
150 t3c1.WindowY0 = 480 - BigFontSeperationTopBottom + 5; |
511 | 151 t3c1.WindowY1 = 479 - 5; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
152 } |
38 | 153 |
518 | 154 /* t3c2 is just showing the lower right part of the display */ |
38 | 155 t3c2.Image = &t3screen; |
156 t3c2.WindowNumberOfTextLines = 3; | |
511 | 157 t3c2.WindowLineSpacing = t3c1.WindowLineSpacing ; |
38 | 158 t3c2.WindowX0 = 370; |
159 t3c2.WindowX1 = 799; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
160 t3c2.WindowY0 = t3c1.WindowY0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
161 t3c2.WindowY1 = t3c1.WindowY1; |
38 | 162 t3c2.WindowTab = 600; |
163 } | |
164 | |
165 | |
166 void t3_refresh(void) | |
167 { | |
496 | 168 static uint8_t last_mode = MODE_SURFACE; |
169 | |
38 | 170 SStateList status; |
171 get_globalStateList(&status); | |
172 | |
173 if(stateUsed->mode != MODE_DIVE) | |
174 { | |
175 settingsGetPointer()->design = 7; | |
176 return; | |
177 } | |
178 | |
179 if(status.base != BaseHome) | |
180 return; | |
181 | |
496 | 182 if(last_mode != MODE_DIVE) /* Select customview */ |
183 { | |
184 if((settingsGetPointer()->tX_customViewTimeout == 0) && (settingsGetPointer()->showDebugInfo)) | |
185 { | |
186 t3_selection_customview = CVIEW_noneOrDebug; | |
187 } | |
188 else | |
189 { | |
190 t3_selection_customview = settingsGetPointer()->tX_customViewPrimary; | |
191 } | |
192 t3_change_customview(ACTION_END); | |
193 } | |
38 | 194 t3screen.FBStartAdress = getFrame(24); |
195 t3_refresh_divemode(); | |
166
255eedad4155
cleanup: get rid of some compile warnings
Jan Mulder <jlmulder@xs4all.nl>
parents:
138
diff
changeset
|
196 GFX_SetFramesTopBottom(t3screen.FBStartAdress, 0,480); |
38 | 197 releaseAllFramesExcept(24,t3screen.FBStartAdress); |
496 | 198 last_mode = stateUsed->mode; |
38 | 199 } |
200 | |
201 | |
202 /* Private functions ---------------------------------------------------------*/ | |
203 | |
204 float t3_basics_lines_depth_and_divetime(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode) | |
205 { | |
518 | 206 char text[256]; |
207 uint8_t textPointer; | |
38 | 208 uint8_t color; |
209 uint8_t depthChangeRate; | |
210 uint8_t depthChangeAscent; | |
211 point_t start, stop, startZeroLine; | |
518 | 212 SDivetime Divetime = {0,0,0,0}; |
38 | 213 |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
214 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
215 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
216 |
38 | 217 start.x = 0; |
218 stop.x = 799; | |
219 stop.y = start.y = BigFontSeperationTopBottom; | |
220 GFX_draw_line(tXscreen, start, stop, CLUT_Font020); | |
221 | |
222 start.y = BigFontSeperationTopBottom; | |
223 stop.y = 479; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
224 |
38 | 225 stop.x = start.x = BigFontSeperationLeftRight; |
226 GFX_draw_line(tXscreen, start, stop, CLUT_Font020); | |
227 | |
228 /* depth */ | |
174
ecb71521d004
Bugfix: make max depth move with current depth (part 2)
Jan Mulder <jlmulder@xs4all.nl>
parents:
166
diff
changeset
|
229 float depth = unit_depth_float(stateUsed->lifeData.depth_meter); |
38 | 230 |
231 if(depth <= 0.3f) | |
232 depth = 0; | |
233 | |
234 if(settingsGetPointer()->nonMetricalSystem) | |
235 snprintf(text,TEXTSIZE,"\032\f[feet]"); | |
236 else | |
237 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Depth); | |
238 GFX_write_string(&FontT42,tXl1,text,0); | |
239 | |
240 if( ((mode == DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4 ))) | |
241 || ((mode != DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 8) || (stateUsed->lifeData.ascent_rate_meter_per_min < -10))) | |
242 ) | |
243 { | |
244 snprintf(text,TEXTSIZE,"\f\002%.0f %c%c/min " | |
245 , unit_depth_float(stateUsed->lifeData.ascent_rate_meter_per_min) | |
246 , unit_depth_char1() | |
247 , unit_depth_char2() | |
248 ); | |
249 GFX_write_string(&FontT42,tXl1,text,0); | |
250 } | |
251 | |
252 if( depth < 100) | |
253 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",depth); | |
254 else | |
255 snprintf(text,TEXTSIZE,"\020\003\016%01.0f",depth); | |
256 | |
257 t3_basics_colorscheme_mod(text); | |
258 GFX_write_string(&FontT105,tXl1,text,1); | |
259 | |
260 | |
261 /* ascentrate graph */ | |
262 if(mode == DIVEMODE_Apnea) | |
263 { | |
264 /* ascentrate graph - apnea mode */ | |
265 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) | |
266 { | |
267 depthChangeAscent = 1; | |
268 if(stateUsed->lifeData.ascent_rate_meter_per_min < 200) | |
269 depthChangeRate = (uint8_t)stateUsed->lifeData.ascent_rate_meter_per_min; | |
270 else | |
271 depthChangeRate = 200; | |
272 } | |
273 else | |
274 { | |
275 depthChangeAscent = 0; | |
276 if(stateUsed->lifeData.ascent_rate_meter_per_min > -200) | |
277 depthChangeRate = (uint8_t)(0 - stateUsed->lifeData.ascent_rate_meter_per_min); | |
278 else | |
279 depthChangeRate = 200; | |
280 } | |
413 | 281 |
282 if(!pSettings->FlipDisplay) | |
283 { | |
284 start.y = tXl1->WindowY0 - 1; | |
285 } | |
286 else | |
287 { | |
288 start.y = tXl1->WindowY1 + 1; | |
289 } | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
290 startZeroLine.y = start.y; |
38 | 291 for(int i = 0; i<5;i++) |
292 { | |
293 start.y += 40; | |
294 stop.y = start.y; | |
413 | 295 if(!pSettings->FlipDisplay) |
296 { | |
297 start.x = tXl1->WindowX1 - 1; | |
298 } | |
299 else | |
300 { | |
301 start.x = tXr1->WindowX1 - 1; | |
302 } | |
38 | 303 stop.x = start.x - 17; |
304 | |
305 if(depthChangeRate <= 6) | |
306 { | |
307 if(i == 2) | |
308 { | |
309 startZeroLine.y = start.y; | |
310 stop.x = start.x - 34; | |
311 } | |
312 } | |
313 else | |
314 { | |
315 if(((i == 1) && depthChangeAscent) || ((i == 3) && !depthChangeAscent)) | |
316 { | |
317 startZeroLine.y = start.y; | |
318 stop.x = start.x - 34; | |
319 } | |
320 } | |
321 GFX_draw_line(tXscreen, start, stop, 0); | |
322 } | |
323 // new thick bar design Sept. 2015 | |
324 if((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4)) | |
325 { | |
326 start.y = startZeroLine.y; | |
327 if(depthChangeAscent) | |
328 { | |
329 color = CLUT_EverythingOkayGreen; | |
330 start.y += 7; // starte etwas weiter oben | |
331 stop.y = start.y + (uint16_t)(depthChangeRate * 4) - 9; // - x; // wegen der Liniendicke | |
332 if(stop.y > 475) | |
333 stop.y = 475; | |
334 } | |
335 else | |
336 { | |
337 color = CLUT_Font023; | |
338 start.y -= 7; | |
339 stop.y = start.y - (uint16_t)(depthChangeRate * 4) + 9; | |
340 if(stop.y <= tXl1->WindowY0) | |
341 stop.y = tXl1->WindowY0 + 1; | |
342 } | |
413 | 343 if(!pSettings->FlipDisplay) |
344 { | |
345 start.x = tXl1->WindowX1 - 3 - 5; | |
346 } | |
347 else | |
348 { | |
349 start.x = tXr1->WindowX1 - 3 - 5; | |
350 } | |
351 | |
352 stop.x = start.x; | |
38 | 353 GFX_draw_thick_line(12,tXscreen, start, stop, color); |
354 } | |
355 } | |
356 else | |
357 { | |
358 /* ascentrate graph -standard mode */ | |
359 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) | |
360 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
361 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
362 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
363 start.y = tXl1->WindowY0 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
364 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
365 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
366 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
367 start.y = tXl1->WindowY1 + 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
368 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
369 |
38 | 370 for(int i = 0; i<4;i++) |
371 { | |
372 start.y += 5*8; | |
373 stop.y = start.y; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
374 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
375 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
376 start.x = tXl1->WindowX1 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
377 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
378 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
379 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
380 start.x = tXr1->WindowX1 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
381 } |
38 | 382 stop.x = start.x - 17; |
383 GFX_draw_line(tXscreen, start, stop, 0); | |
384 } | |
385 // new thick bar design Sept. 2015 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
386 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
387 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
388 start.x = tXl1->WindowX1 - 3 - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
389 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
390 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
391 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
392 start.x = tXr1->WindowX1 - 3 - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
393 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
394 |
38 | 395 stop.x = start.x; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
396 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
397 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
398 start.y = tXl1->WindowY0 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
399 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
400 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
401 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
402 start.y = tXl1->WindowY1 + 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
403 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
404 |
38 | 405 stop.y = start.y + (uint16_t)(stateUsed->lifeData.ascent_rate_meter_per_min * 8); |
406 stop.y -= 3; // wegen der Liniendicke von 12 anstelle von 9 | |
407 if(stop.y >= 470) | |
408 stop.y = 470; | |
409 start.y += 7; // starte etwas weiter oben | |
410 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 10) | |
411 color = CLUT_EverythingOkayGreen; | |
412 else | |
413 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 15) | |
414 color = CLUT_WarningYellow; | |
415 else | |
416 color = CLUT_WarningRed; | |
417 | |
418 GFX_draw_thick_line(12,tXscreen, start, stop, color); | |
419 } | |
420 } | |
421 | |
422 // divetime | |
423 if(mode == DIVEMODE_Apnea) | |
424 { | |
425 if(stateUsed->lifeData.counterSecondsShallowDepth) | |
426 { | |
427 SDivetime SurfaceBreakTime = {0,0,0,0}; | |
428 | |
429 SurfaceBreakTime.Total = stateUsed->lifeData.counterSecondsShallowDepth; | |
430 SurfaceBreakTime.Minutes = SurfaceBreakTime.Total / 60; | |
431 SurfaceBreakTime.Seconds = SurfaceBreakTime.Total - (SurfaceBreakTime.Minutes * 60); | |
432 | |
433 snprintf(text,TEXTSIZE,"\032\f\002%c%c", TXT_2BYTE,TXT2BYTE_ApneaSurface); | |
434 GFX_write_string(&FontT42,tXr1,text,0); | |
435 | |
436 snprintf(text,TEXTSIZE,"\020\003\016\002%u:%02u",SurfaceBreakTime.Minutes, SurfaceBreakTime.Seconds); | |
437 } | |
438 else | |
439 { | |
440 Divetime.Total = stateUsed->lifeData.dive_time_seconds; | |
441 Divetime.Minutes = Divetime.Total / 60; | |
442 Divetime.Seconds = Divetime.Total - ( Divetime.Minutes * 60 ); | |
443 | |
444 snprintf(text,TEXTSIZE,"\032\f\002%c",TXT_Divetime); | |
445 GFX_write_string(&FontT42,tXr1,text,0); | |
446 | |
447 if(Divetime.Minutes < 100) | |
448 snprintf(text,TEXTSIZE,"\020\003\016\002%u:%02u",Divetime.Minutes, Divetime.Seconds); | |
449 else | |
450 snprintf(text,TEXTSIZE,"\020\003\016\002%u'",Divetime.Minutes); | |
451 } | |
518 | 452 t3_basics_colorscheme_mod(text); |
453 GFX_write_string(&FontT105,tXr1,text,1); | |
38 | 454 } |
455 else | |
456 { | |
518 | 457 switch(get_globalState()) |
458 { | |
459 case StDBEAR: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_DiveBearingQ); | |
460 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
461 break; | |
462 case StDRAVG: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_DiveResetAvgQ); | |
463 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
464 break; | |
38 | 465 |
518 | 466 case StDMGAS: |
467 textPointer = 0; | |
468 text[textPointer++] = '\a'; | |
469 text[textPointer++] = '\001'; | |
470 text[textPointer++] = ' '; | |
471 textPointer += tHome_gas_writer(stateUsed->diveSettings.gas[actualBetterGasId()].oxygen_percentage,stateUsed->diveSettings.gas[actualBetterGasId()].helium_percentage,&text[textPointer]); | |
472 text[textPointer++] = '?'; | |
473 text[textPointer++] = ' '; | |
474 text[textPointer++] = 0; | |
475 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
476 break; | |
477 default: /* show divetime */ | |
38 | 478 |
518 | 479 Divetime.Total = stateUsed->lifeData.dive_time_seconds_without_surface_time; |
480 Divetime.Minutes = Divetime.Total / 60; | |
481 Divetime.Seconds = Divetime.Total - ( Divetime.Minutes * 60 ); | |
482 | |
483 snprintf(text,TEXTSIZE,"\032\f\002%c",TXT_Divetime); | |
484 GFX_write_string(&FontT42,tXr1,text,0); | |
485 | |
486 if(Divetime.Minutes < 100) | |
487 snprintf(text,TEXTSIZE,"\020\003\016\002%u:%02u",Divetime.Minutes, Divetime.Seconds); | |
488 else | |
489 snprintf(text,TEXTSIZE,"\020\003\016\002%u'",Divetime.Minutes); | |
490 | |
491 t3_basics_colorscheme_mod(text); | |
492 GFX_write_string(&FontT105,tXr1,text,1); | |
493 break; | |
494 } | |
38 | 495 } |
496 | |
497 return depth; | |
498 } | |
499 | |
500 | |
501 void t3_refresh_divemode(void) | |
502 { | |
503 uint8_t customview_warnings = 0; | |
504 float depth_meter = 0.0; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
505 |
38 | 506 // everything like lines, depth, ascent graph and divetime |
507 depth_meter = t3_basics_lines_depth_and_divetime(&t3screen, &t3l1, &t3r1, 0); // 0 could be stateUsed->diveSettings.diveMode for CCR specials | |
508 | |
509 // customview | |
510 if(stateUsed->warnings.numWarnings) | |
511 customview_warnings = t3_test_customview_warnings(); | |
512 | |
513 if(customview_warnings && warning_count_high_time) | |
514 t3_basics_show_customview_warnings(&t3c1); | |
515 else | |
516 t3_refresh_customview(depth_meter); | |
517 | |
518 if(stateUsed->warnings.lowBattery) | |
496 | 519 t3_basics_battery_low_customview_extra(&t3r1); //t3c1); |
38 | 520 } |
521 | |
522 | |
523 void t3_basics_battery_low_customview_extra(GFX_DrawCfgWindow* tXc1) | |
524 { | |
525 char TextC1[256]; | |
526 | |
496 | 527 TextC1[0] = ' ';//'\002'; |
38 | 528 TextC1[1] = '\f'; |
529 TextC1[2] = '\025'; | |
530 TextC1[3] = '3'; | |
531 TextC1[4] = '1'; | |
532 TextC1[5] = '1'; | |
533 TextC1[6] = '1'; | |
534 TextC1[7] = '1'; | |
535 TextC1[8] = '1'; | |
536 TextC1[9] = '1'; | |
537 TextC1[10] = '1'; | |
538 TextC1[11] = '1'; | |
539 TextC1[12] = '1'; | |
540 TextC1[13] = '1'; | |
541 TextC1[14] = '0'; | |
542 TextC1[15] = 0; | |
543 | |
544 if(!warning_count_high_time) | |
545 TextC1[4] = '2'; | |
546 | |
547 GFX_write_string(&Batt24,tXc1,TextC1,0); | |
548 } | |
549 | |
550 | |
551 | |
552 void t3_refresh_customview(float depth) | |
553 { | |
272
74a8296a2318
cleanup: simplify stateUsed usage
Jan Mulder <jlmulder@xs4all.nl>
parents:
237
diff
changeset
|
554 t3_basics_refresh_customview(depth, t3_selection_customview, &t3screen, &t3c1, &t3c2, stateUsedWrite->diveSettings.diveMode); |
38 | 555 } |
556 | |
557 | |
558 void t3_basics_refresh_apnoeRight(float depth, uint8_t tX_selection_customview, GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXc1, GFX_DrawCfgWindow* tXc2, uint8_t mode) | |
559 { | |
560 char text[512]; | |
561 uint16_t textpointer = 0; | |
562 | |
563 // CVIEW_T3_Temperature | |
564 float temperature; | |
413 | 565 SSettings* pSettings; |
566 pSettings = settingsGetPointer(); | |
38 | 567 |
568 SDivetime TotalDivetime = {0,0,0,0}; | |
569 SDivetime LastDivetime = {0,0,0,0}; | |
570 | |
571 uint16_t tempWinX0; | |
413 | 572 uint16_t tempWinX1; |
38 | 573 uint16_t tempWinY0; |
413 | 574 uint16_t tempWinY1; |
38 | 575 |
576 tempWinX0 = tXc1->WindowX0; | |
413 | 577 tempWinX1 = tXc1->WindowX1; |
38 | 578 tempWinY0 = tXc1->WindowY0; |
413 | 579 tempWinY1 = tXc1->WindowY1; |
38 | 580 |
581 tXc1->WindowX0 = 440; // rechte Seite | |
582 | |
583 switch(tX_selection_customview) | |
584 { | |
585 case CVIEW_T3_Temperature: | |
586 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
587 GFX_write_string(&FontT42,tXc1,text,0); | |
588 | |
189
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
174
diff
changeset
|
589 temperature = unit_temperature_float(stateUsed->lifeData.temperature_celsius); |
38 | 590 textpointer = snprintf(text,TEXTSIZE,"\020\003\016%01.0f\016\016\140",temperature); // "\016\016%01.1f `" + C or F |
591 if(settingsGetPointer()->nonMetricalSystem == 0) | |
592 text[textpointer++] = 'C'; | |
593 else | |
594 text[textpointer++] = 'F'; | |
595 text[textpointer++] = 0; | |
596 t3_basics_colorscheme_mod(text); | |
597 GFX_write_string(&FontT105,tXc1,text,1); | |
598 break; | |
599 | |
600 case CVIEW_T3_ApnoeSurfaceInfo: | |
601 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Divetime); | |
602 GFX_write_string(&FontT42,tXc1,text,0); | |
603 | |
604 TotalDivetime.Total = stateUsed->lifeData.dive_time_seconds_without_surface_time; | |
605 TotalDivetime.Minutes = TotalDivetime.Total / 60; | |
606 TotalDivetime.Seconds = TotalDivetime.Total - ( TotalDivetime.Minutes * 60 ); | |
607 | |
608 LastDivetime.Total = stateUsed->lifeData.apnea_last_dive_time_seconds; | |
609 LastDivetime.Minutes = LastDivetime.Total / 60; | |
610 LastDivetime.Seconds = LastDivetime.Total - ( LastDivetime.Minutes * 60 ); | |
611 | |
413 | 612 // tXc1->WindowY0 = 100; // obere Zeile |
613 if(!pSettings->FlipDisplay) | |
614 { | |
615 tXc1->WindowY0 = 100; | |
616 } | |
617 else | |
618 { | |
619 tXc1->WindowY1 -= 100; /* jump to upper of two lines */ | |
620 } | |
38 | 621 |
622 snprintf(text,TEXTSIZE,"\020\016%u:%02u",LastDivetime.Minutes, LastDivetime.Seconds); | |
623 t3_basics_colorscheme_mod(text); | |
624 GFX_write_string(&FontT105,tXc1,text,0); | |
625 | |
413 | 626 if(pSettings->FlipDisplay) |
627 { | |
628 tXc1->WindowX0 = 0; | |
629 | |
630 } | |
38 | 631 snprintf(text,TEXTSIZE,"\032\002%c%c",TXT_2BYTE, TXT2BYTE_ApneaLast); |
632 GFX_write_string(&FontT42,tXc1,text,0); | |
633 | |
413 | 634 if(!pSettings->FlipDisplay) |
635 { | |
636 tXc1->WindowY0 = tempWinY0; | |
637 } | |
638 else | |
639 { | |
640 tXc1->WindowX1 = tempWinX1; | |
641 tXc1->WindowY1 = tempWinY1; /* jump to upper of two lines */ | |
642 } | |
38 | 643 |
644 snprintf(text,TEXTSIZE,"\020\016%u:%02u",TotalDivetime.Minutes, TotalDivetime.Seconds); | |
645 t3_basics_colorscheme_mod(text); | |
646 GFX_write_string(&FontT105,tXc1,text,0); | |
647 | |
648 snprintf(text,TEXTSIZE,"\032\002%c%c",TXT_2BYTE, TXT2BYTE_ApneaTotal); | |
413 | 649 if(pSettings->FlipDisplay) |
650 { | |
651 tXc1->WindowX0 = 0; | |
652 | |
653 } | |
38 | 654 GFX_write_string(&FontT42,tXc1,text,0); |
655 break; | |
656 } | |
657 | |
658 tXc1->WindowX0 = tempWinX0; | |
413 | 659 tXc1->WindowX1 = tempWinX1; |
38 | 660 tXc1->WindowY0 = tempWinY0; |
661 | |
662 } | |
663 | |
664 | |
665 void t3_basics_refresh_customview(float depth, uint8_t tX_selection_customview, GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXc1, GFX_DrawCfgWindow* tXc2, uint8_t mode) | |
666 { | |
667 char text[512]; | |
668 uint16_t textpointer = 0; | |
669 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
670 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
671 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
672 |
38 | 673 // CVIEW_T3_Decostop and CVIEW_T3_TTS |
674 const SDecoinfo * pDecoinfo; | |
675 if(stateUsed->diveSettings.deco_type.ub.standard == GF_MODE) | |
676 pDecoinfo = &stateUsed->decolistBuehlmann; | |
677 else | |
678 pDecoinfo = &stateUsed->decolistVPM; | |
679 | |
680 // CVIEW_T3_Decostop | |
681 uint16_t nextstopLengthSeconds = 0; | |
682 uint8_t nextstopDepthMeter = 0; | |
683 SDivetime SafetyStopTime = {0,0,0,0}; | |
684 | |
685 // CVIEW_T3_ppO2andGas | |
686 uint8_t oxygen_percentage = 0; | |
687 | |
688 // CVIEW_T3_Temperature | |
689 float temperature; | |
690 | |
691 // CVIEW_T3_GasList | |
692 float fPpO2limitHigh, fPpO2limitLow, fPpO2ofGasAtThisDepth; | |
693 const SGasLine * pGasLine; | |
694 uint8_t oxygen, helium; | |
695 uint8_t lineNumber; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
696 uint8_t gasPosIdx; |
38 | 697 |
496 | 698 /* compass position */ |
699 point_t center; | |
700 | |
38 | 701 // CVIEW_T3_StopWatch |
702 SDivetime Stopwatch = {0,0,0,0}; | |
703 float fAverageDepth, fAverageDepthAbsolute; | |
704 | |
705 uint16_t tempWinX0; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
706 uint16_t tempWinX1; |
38 | 707 uint16_t tempWinY0; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
708 uint16_t tempWinY1; |
38 | 709 uint16_t tempWinC2X0; |
413 | 710 uint16_t tempWinC2Y0; |
711 uint16_t tempWinC2X1; | |
712 uint16_t tempWinC2Y1; | |
38 | 713 uint16_t tempWinC2Tab; |
714 | |
715 tempWinX0 = tXc1->WindowX0; | |
716 tempWinY0 = tXc1->WindowY0; | |
496 | 717 tempWinX1 = tXc1->WindowX1; |
718 tempWinY1 = tXc1->WindowY1; | |
413 | 719 |
38 | 720 tempWinC2X0 = tXc2->WindowX0; |
413 | 721 tempWinC2Y0 = tXc2->WindowY0; |
722 tempWinC2X1 = tXc2->WindowX1; | |
723 tempWinC2Y1 = tXc2->WindowY1; | |
38 | 724 tempWinC2Tab = tXc2->WindowTab; |
725 | |
726 switch(tX_selection_customview) | |
727 { | |
728 case CVIEW_T3_ApnoeSurfaceInfo: | |
729 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
730 | |
413 | 731 if(!pSettings->FlipDisplay) |
732 { | |
733 GFX_write_string(&FontT42,tXc1,text,0); | |
734 tXc1->WindowY0 = 100; | |
735 } | |
736 else | |
737 { | |
738 GFX_write_string(&FontT42,tXc2,text,0); | |
739 tXc2->WindowY1 -= 100; /* jump to upper of two lines */ | |
740 } | |
38 | 741 |
742 snprintf(text,TEXTSIZE,"\020\016%01.1f",unit_depth_float(stateUsed->lifeData.apnea_last_max_depth_meter)); | |
743 t3_basics_colorscheme_mod(text); | |
413 | 744 |
745 if(!pSettings->FlipDisplay) | |
746 { | |
747 GFX_write_string(&FontT105,tXc1,text,0); | |
748 tXc1->WindowY0 = tempWinY0; | |
749 } | |
750 else | |
751 { | |
752 GFX_write_string(&FontT105,tXc2,text,0); | |
753 tXc2->WindowY1 = tempWinC2Y1; /* jump to upper of two lines */ | |
754 } | |
38 | 755 |
756 | |
757 snprintf(text,TEXTSIZE,"\020\016%01.1f",unit_depth_float(stateUsed->lifeData.apnea_total_max_depth_meter)); | |
758 t3_basics_colorscheme_mod(text); | |
413 | 759 if(!pSettings->FlipDisplay) |
760 { | |
761 GFX_write_string(&FontT105,tXc1,text,0); | |
762 } | |
763 else | |
764 { | |
765 GFX_write_string(&FontT105,tXc2,text,0); | |
766 } | |
38 | 767 break; |
768 | |
769 case CVIEW_T3_StopWatch: | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
770 |
38 | 771 Stopwatch.Total = timer_Stopwatch_GetTime(); |
772 Stopwatch.Minutes = Stopwatch.Total / 60; | |
773 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
774 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
775 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
776 | |
777 snprintf(text,TEXTSIZE,"\032\f%c",TXT_AvgDepth); | |
778 GFX_write_string(&FontT42,tXc1,text,0); | |
779 snprintf(text,TEXTSIZE,"\030\003\016%01.1f",unit_depth_float(fAverageDepthAbsolute)); | |
780 GFX_write_string(&FontT105,tXc1,text,0); | |
781 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
782 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
783 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
784 tXc1->WindowX0 = 480; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
785 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
786 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
787 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
788 tXc1->WindowX1 = 320; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
789 tXc1->WindowY0 = t3c1.WindowY0; /* select customer window */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
790 } |
38 | 791 // snprintf(text,TEXTSIZE,"\032\f%c%c - %c",TXT_2BYTE, TXT2BYTE_Clock, TXT_AvgDepth); |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
792 |
38 | 793 snprintf(text,TEXTSIZE,"\032\f%c", TXT_Stopwatch); |
794 GFX_write_string(&FontT42,tXc1,text,0); | |
795 snprintf(text,TEXTSIZE,"\030\016%01.1f",unit_depth_float(fAverageDepth)); | |
796 GFX_write_string(&FontT105,tXc1,text,0); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
797 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
798 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
799 tXc1->WindowY0 = 100; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
800 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
801 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
802 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
803 tXc1->WindowY1 -= 100; /* jump to upper of two lines */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
804 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
805 |
38 | 806 snprintf(text,TEXTSIZE,"\030%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); |
807 GFX_write_string(&FontT105,tXc1,text,0); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
808 |
496 | 809 break; |
38 | 810 |
811 case CVIEW_T3_GasList: | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
812 gasPosIdx = 0; |
38 | 813 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Gaslist); |
814 GFX_write_string(&FontT42,tXc1,text,0); | |
815 | |
816 textpointer = 0; | |
817 tXc2->WindowX0 = 0; | |
518 | 818 tXc2->WindowTab = 800/3; // /2 |
38 | 819 |
413 | 820 if(pSettings->FlipDisplay) |
821 { | |
822 tXc2->WindowY1 = 0; | |
823 } | |
824 | |
38 | 825 pGasLine = settingsGetPointer()->gas; |
826 if(actualLeftMaxDepth(stateUsed)) | |
827 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_deco) / 100; | |
828 else | |
829 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_std) / 100; | |
830 fPpO2limitLow = (float)(settingsGetPointer()->ppO2_min) / 100; | |
831 for(int gasId=1;gasId<=NUM_GASES;gasId++) | |
832 { | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
833 #ifdef ENABLE_UNUSED_GAS_HIDING |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
834 if(!pGasLine[gasId].note.ub.off) |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
835 { |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
836 #endif |
38 | 837 textpointer = 0; |
518 | 838 text[textpointer++] = '\003'; |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
839 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
840 lineNumber = 1; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
841 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
842 switch(gasPosIdx) |
38 | 843 { |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
844 case 0: lineNumber = 0; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
845 case 1: |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
846 break; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
847 case 4: text[textpointer++] = '\001'; /* display centered */ |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
848 break; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
849 case 2: lineNumber = 0; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
850 case 3: text[textpointer++] = '\002'; /* display right aligned */ |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
851 default: |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
852 break; |
38 | 853 } |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
854 gasPosIdx++; |
518 | 855 |
38 | 856 fPpO2ofGasAtThisDepth = (stateUsed->lifeData.pressure_ambient_bar - WATER_VAPOUR_PRESSURE) * pGasLine[gasId].oxygen_percentage / 100; |
857 if(pGasLine[gasId].note.ub.active == 0) | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
858 strcpy(&text[textpointer++],"\031"); |
518 | 859 else if(stateUsed->lifeData.actualGas.GasIdInSettings == gasId) /* actual selected gas */ |
860 { | |
861 strcpy(&text[textpointer++],"\030"); | |
862 } | |
38 | 863 else if((fPpO2ofGasAtThisDepth > fPpO2limitHigh) || (fPpO2ofGasAtThisDepth < fPpO2limitLow)) |
864 strcpy(&text[textpointer++],"\025"); | |
518 | 865 else if(actualBetterGasId() == gasId) |
866 { | |
867 strcpy(&text[textpointer++],"\026"); /* Highlight better gas */ | |
868 } | |
38 | 869 else |
518 | 870 strcpy(&text[textpointer++],"\023"); /* Blue for travel or deco without special state */ |
38 | 871 |
872 text[textpointer++] = ' '; | |
873 oxygen = pGasLine[gasId].oxygen_percentage; | |
874 helium = pGasLine[gasId].helium_percentage; | |
875 textpointer += write_gas(&text[textpointer], oxygen, helium); | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
876 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
877 if((pGasLine[gasId].depth_meter) && (gasPosIdx < 5)) /* do not show for potential last gas because of formating issues */ |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
878 { |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
879 textpointer += snprintf(&text[textpointer],7,"\016\016%u%c%c",unit_depth_integer(pGasLine[gasId].depth_meter), unit_depth_char1(), unit_depth_char2()); |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
880 } |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
881 text[textpointer++] = 0; |
518 | 882 GFX_write_string(&FontT42, tXc1, text, lineNumber); |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
883 #ifdef ENABLE_UNUSED_GAS_HIDING |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
884 } |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
885 #endif |
38 | 886 } |
887 break; | |
888 | |
889 case CVIEW_T3_Temperature: | |
890 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
891 GFX_write_string(&FontT42,tXc1,text,0); | |
189
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
174
diff
changeset
|
892 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
174
diff
changeset
|
893 temperature = unit_temperature_float(stateUsed->lifeData.temperature_celsius); |
38 | 894 textpointer = snprintf(text,TEXTSIZE,"\030\003\016%01.1f \140",temperature); // "\016\016%01.1f `" + C or F |
895 if(settingsGetPointer()->nonMetricalSystem == 0) | |
896 text[textpointer++] = 'C'; | |
897 else | |
898 text[textpointer++] = 'F'; | |
899 text[textpointer++] = 0; | |
900 GFX_write_string(&FontT105,tXc1,text,0); | |
901 break; | |
902 | |
903 case CVIEW_Compass: | |
496 | 904 center.x = 600; |
905 center.y = 116; | |
38 | 906 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); |
907 GFX_write_string(&FontT42,tXc1,text,0); | |
908 snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); | |
909 GFX_write_string(&FontT105,tXc1,text,0); | |
496 | 910 t3_basics_compass(tXscreen, center, (uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); |
38 | 911 break; |
912 | |
913 case CVIEW_T3_Decostop: | |
914 default: | |
915 // decostop | |
916 if(pDecoinfo->output_time_to_surface_seconds) | |
917 { | |
918 tHome_findNextStop(pDecoinfo->output_stop_length_seconds, &nextstopDepthMeter, &nextstopLengthSeconds); | |
919 } | |
920 else | |
921 { | |
922 nextstopDepthMeter = 0; | |
923 nextstopLengthSeconds = 0; | |
924 } | |
925 | |
926 SafetyStopTime.Total = timer_Safetystop_GetCountDown(); | |
927 SafetyStopTime.Minutes = SafetyStopTime.Total / 60; | |
928 SafetyStopTime.Seconds = SafetyStopTime.Total - (SafetyStopTime.Minutes * 60); | |
929 | |
930 if(nextstopDepthMeter) | |
931 { | |
932 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Decostop); | |
933 GFX_write_string(&FontT42,tXc1,text,0); | |
934 | |
935 textpointer = 0; | |
936 snprintf(&text[textpointer],TEXTSIZE,"\020\003%u%c%c %u'" | |
937 , unit_depth_integer(nextstopDepthMeter) | |
938 , unit_depth_char1_T105() | |
939 , unit_depth_char2_T105() | |
940 , (nextstopLengthSeconds+59)/60); | |
941 // old without feet hw 170703 snprintf(&text[textpointer],TEXTSIZE,"\020\003%um %u'",nextstopDepthMeter,(nextstopLengthSeconds+59)/60); | |
942 t3_basics_colorscheme_mod(text); | |
496 | 943 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 944 } |
945 else if(SafetyStopTime.Total && (depth > timer_Safetystop_GetDepthUpperLimit())) | |
946 { | |
947 textpointer = 0; | |
948 snprintf(&text[textpointer],TEXTSIZE,"\032\f%c%c",TXT_2BYTE,TXT2BYTE_SafetyStop2); | |
949 GFX_write_string(&FontT42,tXc1,text,0); | |
950 | |
951 textpointer = 0; | |
952 snprintf(&text[textpointer],TEXTSIZE,"\020\003\016%u:%02u",SafetyStopTime.Minutes,SafetyStopTime.Seconds); | |
953 t3_basics_colorscheme_mod(text); | |
496 | 954 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 955 } |
237
ec16fd26e280
Bugfix: do not show NDL in bigscreen mode when zero
Jan Mulder <jlmulder@xs4all.nl>
parents:
214
diff
changeset
|
956 else if(pDecoinfo->output_ndl_seconds) // NDL |
38 | 957 { |
958 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Nullzeit); | |
959 GFX_write_string(&FontT42,tXc1,text,0); | |
960 if(pDecoinfo->output_ndl_seconds < 1000 * 60) | |
961 snprintf(text,TEXTSIZE,"\020\003%i'",pDecoinfo->output_ndl_seconds/60); | |
962 else | |
963 snprintf(text,TEXTSIZE,"\020\003%ih",pDecoinfo->output_ndl_seconds/3600); | |
964 t3_basics_colorscheme_mod(text); | |
496 | 965 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 966 } |
967 break; | |
968 | |
969 case CVIEW_sensors: | |
970 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE,TXT2BYTE_O2monitor); | |
971 GFX_write_string(&FontT42,tXc1,text,0); | |
972 | |
973 for(int i=0;i<3;i++) | |
974 { | |
975 textpointer = 0; | |
976 text[textpointer++] = '\030'; | |
977 if(i==1) | |
978 text[textpointer++] = '\001'; | |
979 else if(i==2) | |
980 text[textpointer++] = '\002'; | |
981 if(stateUsed->diveSettings.ppo2sensors_deactivated & (1<<i)) | |
982 { | |
983 text[textpointer++] = '\031'; | |
984 text[textpointer++] = ' '; | |
985 text[textpointer++] = '-'; | |
986 text[textpointer++] = ' '; | |
987 } | |
988 else | |
989 { | |
990 if(stateUsed->warnings.sensorOutOfBounds[i]) | |
991 text[textpointer++] = '\025'; | |
992 textpointer += snprintf(&text[textpointer],TEXTSIZE,"%.1f",stateUsed->lifeData.ppO2Sensor_bar[i]); | |
993 } | |
496 | 994 GFX_write_string(&FontT144,tXc1,text,0); |
38 | 995 } |
996 break; | |
997 | |
998 case CVIEW_T3_MaxDepth: | |
999 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
413 | 1000 if(pSettings->FlipDisplay) |
1001 { | |
1002 if(mode == DIVEMODE_Apnea) | |
1003 { | |
1004 GFX_write_string(&FontT42,tXc2,text,0); | |
1005 } | |
1006 else | |
1007 { | |
1008 GFX_write_string(&FontT42,tXc1,text,0); | |
1009 } | |
1010 } | |
1011 else | |
1012 { | |
1013 GFX_write_string(&FontT42,tXc1,text,0); | |
1014 } | |
38 | 1015 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); |
1016 t3_basics_colorscheme_mod(text); | |
413 | 1017 if(pSettings->FlipDisplay) |
1018 { | |
1019 if(mode == DIVEMODE_Apnea) | |
1020 { | |
1021 GFX_write_string(&FontT105,tXc2,text,0); | |
1022 } | |
1023 else | |
1024 { | |
1025 GFX_write_string(&FontT105,tXc1,text,0); | |
1026 } | |
1027 } | |
1028 else | |
1029 { | |
496 | 1030 GFX_write_string(&FontT105,tXc1,text,0); |
413 | 1031 } |
38 | 1032 break; |
1033 | |
1034 case CVIEW_T3_TTS: | |
1035 snprintf(text,TEXTSIZE,"\032\f%c",TXT_TTS); | |
1036 GFX_write_string(&FontT42,tXc1,text,0); | |
1037 if(pDecoinfo->output_time_to_surface_seconds) | |
1038 { | |
1039 if(pDecoinfo->output_time_to_surface_seconds < 1000 * 60) | |
214
51a3aeffc6b3
Bugfix: handle rounding of TTS and future TTS consistently
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
1040 snprintf(text,TEXTSIZE,"\020\003\002%i'",(pDecoinfo->output_time_to_surface_seconds + 59)/ 60); |
38 | 1041 else |
214
51a3aeffc6b3
Bugfix: handle rounding of TTS and future TTS consistently
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
1042 snprintf(text,TEXTSIZE,"\020\003\002%ih",(pDecoinfo->output_time_to_surface_seconds + 59)/ 3600); |
38 | 1043 t3_basics_colorscheme_mod(text); |
496 | 1044 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1045 } |
1046 break; | |
1047 | |
1048 case CVIEW_T3_ppO2andGas: | |
1049 snprintf(text,TEXTSIZE,"\032\f%c",TXT_ppO2); | |
1050 GFX_write_string(&FontT42,tXc1,text,0); | |
1051 snprintf(text,TEXTSIZE,"\020\003%01.2f",stateUsed->lifeData.ppO2); | |
1052 t3_basics_colorscheme_mod(text); | |
496 | 1053 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1054 |
1055 textpointer = 0; | |
1056 text[textpointer++] = '\020'; | |
1057 text[textpointer++] = '\003'; | |
1058 oxygen_percentage = 100; | |
1059 oxygen_percentage -= stateUsed->lifeData.actualGas.nitrogen_percentage; | |
1060 oxygen_percentage -= stateUsed->lifeData.actualGas.helium_percentage; | |
1061 text[textpointer++] = '\002'; | |
1062 tHome_gas_writer(oxygen_percentage,stateUsed->lifeData.actualGas.helium_percentage,&text[textpointer]); | |
1063 //textpointer = snprintf(&text[textpointer],TEXTSIZE,"\020\002%02u/%02u",oxygen_percentage, stateUsed->lifeData.actualGas.helium_percentage); | |
1064 t3_basics_colorscheme_mod(text); | |
496 | 1065 GFX_write_string(&FontT48,tXc1,text,0); |
38 | 1066 break; |
496 | 1067 |
1068 case CVIEW_T3_Navigation: | |
1069 Stopwatch.Total = timer_Stopwatch_GetTime(); | |
1070 Stopwatch.Minutes = Stopwatch.Total / 60; | |
1071 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
1072 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
1073 | |
1074 if(!pSettings->FlipDisplay) | |
1075 { | |
1076 tXc2->WindowX0 = 550; | |
1077 } | |
1078 else | |
1079 { | |
1080 tXc2->WindowX1 = 800; | |
1081 tXc2->WindowY0 = t3c2.WindowY0; /* select customer window */ | |
1082 } | |
1083 | |
1084 snprintf(text,TEXTSIZE,"\032\002\f%c", TXT_Stopwatch); | |
511 | 1085 GFX_write_string(&FontT42,tXc1,text,0); |
496 | 1086 snprintf(text,TEXTSIZE,"\030\016\002%01.1f",unit_depth_float(fAverageDepth)); |
511 | 1087 GFX_write_string(&FontT105,tXc1,text,0); |
496 | 1088 if(!pSettings->FlipDisplay) |
1089 { | |
1090 tXc2->WindowY0 = 100; | |
1091 } | |
1092 else | |
1093 { | |
1094 tXc2->WindowY1 -= 100; /* jump to upper of two lines */ | |
1095 } | |
1096 | |
1097 snprintf(text,TEXTSIZE,"\030\002%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); | |
511 | 1098 GFX_write_string(&FontT105,tXc1,text,1); |
496 | 1099 |
1100 | |
1101 center.x = 400; | |
1102 center.y = 116; | |
1103 | |
1104 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); | |
1105 GFX_write_string(&FontT42,tXc1,text,0); | |
1106 //snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); | |
1107 snprintf(text,100,"\030%03i`",(uint16_t)stateUsed->lifeData.compass_heading); | |
1108 GFX_write_string(&FontT144,tXc1,text,0); | |
1109 t3_basics_compass(tXscreen, center, (uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); | |
1110 | |
1111 break; | |
1112 | |
1113 case CVIEW_T3_DepthData: | |
1114 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
1115 if(pSettings->FlipDisplay) | |
1116 { | |
1117 if(mode == DIVEMODE_Apnea) | |
1118 { | |
1119 GFX_write_string(&FontT42,tXc2,text,0); | |
1120 } | |
1121 else | |
1122 { | |
1123 GFX_write_string(&FontT42,tXc1,text,0); | |
1124 } | |
1125 } | |
1126 else | |
1127 { | |
1128 GFX_write_string(&FontT42,tXc1,text,0); | |
1129 } | |
1130 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); | |
1131 t3_basics_colorscheme_mod(text); | |
1132 if(pSettings->FlipDisplay) | |
1133 { | |
1134 if(mode == DIVEMODE_Apnea) | |
1135 { | |
1136 GFX_write_string(&FontT105,tXc2,text,0); | |
1137 } | |
1138 else | |
1139 { | |
1140 GFX_write_string(&FontT105,tXc1,text,0); | |
1141 } | |
1142 } | |
1143 else | |
1144 { | |
1145 GFX_write_string(&FontT105,tXc1,text,0); | |
1146 } | |
1147 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
1148 snprintf(text,TEXTSIZE,"\032\002\f%c",TXT_AvgDepth); | |
511 | 1149 GFX_write_string(&FontT42,tXc1,text,0); |
496 | 1150 |
1151 snprintf(text,TEXTSIZE,"\020\003\016\002\%01.1f",unit_depth_float(fAverageDepthAbsolute)); | |
511 | 1152 GFX_write_string(&FontT105,tXc1,text,0); |
496 | 1153 break; |
38 | 1154 } |
496 | 1155 |
1156 | |
1157 | |
38 | 1158 tXc1->WindowX0 = tempWinX0; |
1159 tXc1->WindowY0 = tempWinY0; | |
496 | 1160 tXc1->WindowX1 = tempWinX1; |
1161 tXc1->WindowY1 = tempWinY1; | |
413 | 1162 |
38 | 1163 tXc2->WindowX0 = tempWinC2X0; |
413 | 1164 tXc2->WindowY0 = tempWinC2Y0; |
1165 tXc2->WindowX1 = tempWinC2X1; | |
1166 tXc2->WindowY1 = tempWinC2Y1; | |
38 | 1167 tXc2->WindowTab = tempWinC2Tab; |
1168 } | |
1169 | |
1170 | |
1171 uint8_t t3_test_customview_warnings(void) | |
1172 { | |
1173 uint8_t count = 0; | |
1174 | |
1175 count = 0; | |
1176 count += stateUsed->warnings.decoMissed; | |
1177 count += stateUsed->warnings.ppO2Low; | |
1178 count += stateUsed->warnings.ppO2High; | |
1179 //count += stateUsed->warnings.lowBattery; | |
1180 count += stateUsed->warnings.sensorLinkLost; | |
1181 count += stateUsed->warnings.fallback; | |
1182 | |
1183 return count; | |
1184 } | |
1185 | |
1186 //void t3_show_customview_warnings(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode) | |
1187 void t3_basics_show_customview_warnings(GFX_DrawCfgWindow* tXc1) | |
1188 { | |
1189 char text[256], textMain[256]; | |
1190 uint8_t textpointer, textpointerMain, lineFree, more; | |
1191 | |
1192 snprintf(text,TEXTSIZE,"\025\f%c",TXT_Warning); | |
1193 GFX_write_string(&FontT42,&t3c1,text,0); | |
1194 | |
1195 lineFree = 1; | |
1196 more = 0; | |
1197 | |
1198 textpointerMain = 0; | |
511 | 1199 textMain[textpointerMain++] = '\025'; /* red */ |
1200 textMain[textpointerMain++] = '\003'; /* doublesize */ | |
38 | 1201 |
1202 textpointer = 0; | |
1203 | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1204 text[textpointer++] = '\031'; |
38 | 1205 text[textpointer++] = TXT_2BYTE; |
1206 text[textpointer++] = TXT2BYTE_WarnDecoMissed; | |
1207 if(stateUsed->warnings.decoMissed) | |
1208 { | |
1209 text[textpointer - 3] = '\025'; | |
1210 if(lineFree) | |
1211 { | |
1212 textMain[textpointerMain++] = TXT_2BYTE; | |
1213 textMain[textpointerMain++] = text[textpointer - 1]; | |
1214 textMain[textpointerMain] = 0; | |
1215 lineFree--; | |
1216 } | |
1217 else | |
1218 { | |
1219 more++; | |
1220 } | |
1221 } | |
1222 | |
1223 text[textpointer++] = '\t'; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1224 text[textpointer++] = '\031'; |
38 | 1225 text[textpointer++] = TXT_2BYTE; |
1226 text[textpointer++] = TXT2BYTE_WarnPPO2Low; | |
1227 if(stateUsed->warnings.ppO2Low) | |
1228 { | |
1229 text[textpointer - 3] = '\025'; | |
1230 if(lineFree) | |
1231 { | |
1232 textMain[textpointerMain++] = TXT_2BYTE; | |
1233 textMain[textpointerMain++] = text[textpointer - 1]; | |
1234 textMain[textpointerMain] = 0; | |
1235 lineFree--; | |
1236 } | |
1237 else | |
1238 { | |
1239 more++; | |
1240 } | |
1241 } | |
1242 | |
1243 text[textpointer++] = '\n'; | |
1244 text[textpointer++] = '\r'; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1245 text[textpointer++] = '\031'; |
38 | 1246 text[textpointer++] = TXT_2BYTE; |
1247 text[textpointer++] = TXT2BYTE_WarnPPO2High; | |
1248 if(stateUsed->warnings.ppO2High) | |
1249 { | |
1250 text[textpointer - 3] = '\025'; | |
1251 if(lineFree) | |
1252 { | |
1253 textMain[textpointerMain++] = TXT_2BYTE; | |
1254 textMain[textpointerMain++] = text[textpointer - 1]; | |
1255 textMain[textpointerMain] = 0; | |
1256 lineFree--; | |
1257 } | |
1258 else | |
1259 { | |
1260 more++; | |
1261 } | |
1262 } | |
1263 | |
1264 text[textpointer++] = '\t'; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1265 text[textpointer++] = '\031'; |
38 | 1266 text[textpointer++] = TXT_2BYTE; |
1267 text[textpointer++] = TXT2BYTE_WarnFallback; | |
1268 if(stateUsed->warnings.fallback) | |
1269 { | |
1270 text[textpointer - 3] = '\025'; | |
1271 if(lineFree) | |
1272 { | |
1273 textMain[textpointerMain++] = TXT_2BYTE; | |
1274 textMain[textpointerMain++] = text[textpointer - 1]; | |
1275 textMain[textpointerMain] = 0; | |
1276 lineFree--; | |
1277 } | |
1278 else | |
1279 { | |
1280 more++; | |
1281 } | |
1282 } | |
1283 | |
1284 text[textpointer++] = '\n'; | |
1285 text[textpointer++] = '\r'; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1286 text[textpointer++] = '\031'; |
38 | 1287 text[textpointer++] = TXT_2BYTE; |
1288 text[textpointer++] = TXT2BYTE_WarnSensorLinkLost; | |
1289 if(stateUsed->warnings.sensorLinkLost) | |
1290 { | |
1291 text[textpointer - 3] = '\025'; | |
1292 if(lineFree) | |
1293 { | |
1294 textMain[textpointerMain++] = TXT_2BYTE; | |
1295 textMain[textpointerMain++] = text[textpointer - 1]; | |
1296 textMain[textpointerMain] = 0; | |
1297 lineFree--; | |
1298 } | |
1299 else | |
1300 { | |
1301 more++; | |
1302 } | |
1303 } | |
1304 | |
1305 /* | |
1306 text[textpointer++] = '\t'; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1307 text[textpointer++] = '\031'; |
38 | 1308 text[textpointer++] = TXT_2BYTE; |
1309 text[textpointer++] = TXT2BYTE_WarnBatteryLow; | |
1310 if(stateUsed->warnings.lowBattery) | |
1311 { | |
1312 text[textpointer - 3] = '\025'; | |
1313 if(lineFree) | |
1314 { | |
1315 textMain[textpointerMain++] = TXT_2BYTE; | |
1316 textMain[textpointerMain++] = text[textpointer - 1]; | |
1317 textMain[textpointerMain] = 0; | |
1318 lineFree--; | |
1319 } | |
1320 else | |
1321 { | |
1322 more++; | |
1323 } | |
1324 } | |
1325 */ | |
1326 text[textpointer] = 0; | |
1327 /* | |
1328 if(more) | |
1329 { | |
1330 text[textpointer++] = '\002'; | |
1331 text[textpointer++] = '+'; | |
1332 if(more < 10) | |
1333 text[textpointer++] = '0' + more; | |
1334 else | |
1335 text[textpointer++] = 'X'; | |
1336 text[textpointer] = 0; | |
1337 } | |
1338 */ | |
511 | 1339 GFX_write_string(&FontT48,&t3c1,textMain,0); |
38 | 1340 if(more) |
1341 { | |
511 | 1342 GFX_write_string(&FontT48,&t3c2,text,0); |
38 | 1343 } |
1344 } | |
1345 | |
496 | 1346 uint8_t t3_customview_disabled(uint8_t view) |
1347 { | |
1348 uint8_t i = 0; | |
1349 uint8_t cv_disabled = 0; | |
1350 const uint8_t *pcv_changelist; | |
1351 uint32_t cv_config = settingsGetPointer()->cv_config_BigScreen; | |
1352 | |
511 | 1353 pcv_changelist = cv_changelist_BS; |
496 | 1354 |
1355 while(pcv_changelist[i] != CVIEW_T3_END) | |
1356 { | |
1357 if((view == pcv_changelist[i]) && !CHECK_BIT_THOME(cv_config, pcv_changelist[i])) | |
1358 { | |
1359 cv_disabled = 1; | |
1360 break; | |
1361 } | |
1362 i++; | |
1363 } | |
1364 | |
1365 if (((view == CVIEW_sensors) || (view == CVIEW_sensors_mV)) && | |
1366 ((stateUsed->diveSettings.ppo2sensors_deactivated) || (stateUsed->diveSettings.ccrOption == 0))) | |
1367 { | |
1368 cv_disabled = 1; | |
1369 } | |
1370 | |
1371 return cv_disabled; | |
1372 } | |
38 | 1373 |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1374 void t3_change_customview(uint8_t action) |
38 | 1375 { |
511 | 1376 |
496 | 1377 t3_basics_change_customview(&t3_selection_customview, t3_customviewsStandard, action); |
38 | 1378 } |
1379 | |
1380 | |
511 | 1381 void t3_basics_change_customview(uint8_t *tX_selection_customview,const uint8_t *tX_customviews, uint8_t action) |
38 | 1382 { |
1383 const SDecoinfo * pDecoinfo; | |
1384 if(stateUsed->diveSettings.deco_type.ub.standard == GF_MODE) | |
1385 pDecoinfo = &stateUsed->decolistBuehlmann; | |
1386 else | |
1387 pDecoinfo = &stateUsed->decolistVPM; | |
1388 | |
511 | 1389 uint8_t curViewIdx = 0xff; |
1390 uint8_t index = 0; | |
1391 uint8_t lastViewIdx = 0; | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1392 uint8_t iterate = 0; /* set to 1 if a view has to be skipped */ |
38 | 1393 |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1394 /* set pointer to currently selected view and count number of entries */ |
511 | 1395 while((tX_customviews[index] != CVIEW_T3_END)) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1396 { |
511 | 1397 if (tX_customviews[index] == *tX_selection_customview) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1398 { |
511 | 1399 curViewIdx = index; |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1400 } |
511 | 1401 index++; |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1402 } |
511 | 1403 if(curViewIdx == 0xff) /* called with unknown view */ |
496 | 1404 { |
511 | 1405 curViewIdx = 0; |
1406 *tX_selection_customview = tX_customviews[index]; | |
496 | 1407 } |
511 | 1408 lastViewIdx = index; |
1409 index = curViewIdx; | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1410 do |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1411 { |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1412 iterate = 0; |
496 | 1413 switch(action) |
1414 { | |
1415 case ACTION_BUTTON_ENTER: | |
1416 case ACTION_PITCH_POS: | |
1417 | |
511 | 1418 if(tX_customviews[index] != CVIEW_T3_END) |
496 | 1419 { |
511 | 1420 index++; |
1421 } | |
1422 if(tX_customviews[index] == CVIEW_T3_END) | |
1423 { | |
1424 index = 0; | |
496 | 1425 } |
1426 break; | |
1427 case ACTION_PITCH_NEG: | |
511 | 1428 if(index == 0) |
496 | 1429 { |
511 | 1430 index = lastViewIdx - 1; |
496 | 1431 } |
1432 else | |
1433 { | |
511 | 1434 index--; |
496 | 1435 } |
1436 break; | |
1437 default: | |
1438 break; | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1439 } |
496 | 1440 |
511 | 1441 if(t3_customview_disabled(tX_customviews[index])) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1442 { |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1443 iterate = 1; |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1444 } |
529
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
1445 if((tX_customviews[index] == CVIEW_T3_TTS) && !pDecoinfo->output_time_to_surface_seconds) /* Skip TTS if value is 0 */ |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1446 { |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1447 iterate = 1; |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1448 } |
529
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
1449 if((tX_customviews[index] == CVIEW_T3_Decostop) && ((!pDecoinfo->output_ndl_seconds) && (!pDecoinfo->output_time_to_surface_seconds) && (timer_Safetystop_GetCountDown() == 0))) /* Skip Deco if NDL is not set */ |
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
1450 { |
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
1451 iterate = 1; |
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
1452 } |
496 | 1453 if((iterate) && (action == ACTION_END)) |
1454 { | |
1455 action = ACTION_BUTTON_ENTER; | |
1456 } | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1457 }while (iterate == 1); |
38 | 1458 |
511 | 1459 *tX_selection_customview = tX_customviews[index]; |
38 | 1460 } |
1461 | |
1462 | |
1463 void t3_basics_colorscheme_mod(char *text) | |
1464 { | |
1465 if((text[0] == '\020') && !GFX_is_colorschemeDiveStandard()) | |
1466 { | |
1467 text[0] = '\027'; | |
1468 } | |
1469 } | |
1470 | |
1471 | |
496 | 1472 point_t t3_compass_circle(uint8_t id, uint16_t degree, point_t center) |
38 | 1473 { |
1474 float fCos, fSin; | |
1475 const float piMult = ((2 * 3.14159) / 360); | |
1476 // const int radius[4] = {95,105,115,60}; | |
1477 const int radius[4] = {85,95,105,90}; | |
496 | 1478 static point_t forcenter = {.x = 900, .y = 500}; /* used to identify change of circle position */ |
38 | 1479 static point_t r[4][360] = { 0 }; |
1480 | |
496 | 1481 if((r[0][0].y == 0) || (forcenter.x != center.x) || (forcenter.y != center.y)) /* calculate values only once during first call or if center position changed */ |
38 | 1482 { |
1483 for(int i=0;i<360;i++) | |
1484 { | |
1485 fCos = cos(i * piMult); | |
1486 fSin = sin(i * piMult); | |
1487 for(int j=0;j<4;j++) | |
1488 { | |
496 | 1489 r[j][i].x = center.x + (int)(fSin * radius[j]); |
1490 r[j][i].y = center.y + (int)(fCos * radius[j]); | |
38 | 1491 } |
1492 } | |
496 | 1493 forcenter.x = center.x; |
1494 forcenter.y = center.y; | |
38 | 1495 } |
1496 if(id > 3) id = 0; | |
1497 if(degree > 359) degree = 0; | |
1498 return r[id][degree]; | |
1499 } | |
1500 | |
1501 | |
496 | 1502 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading) |
38 | 1503 { |
496 | 1504 uint8_t loop = 0; |
38 | 1505 uint16_t LineHeading; |
496 | 1506 |
38 | 1507 static int32_t LastHeading = 0; |
1508 int32_t newHeading = 0; | |
1509 int32_t diff = 0; | |
1510 int32_t diff2 = 0; | |
1511 | |
1512 int32_t diffAbs = 0; | |
1513 int32_t diffAbs2 = 0; | |
1514 | |
1515 newHeading = ActualHeading; | |
1516 | |
1517 diff = newHeading - LastHeading; | |
1518 | |
1519 if(newHeading < LastHeading) | |
1520 diff2 = newHeading + 360 - LastHeading; | |
1521 else | |
1522 diff2 = newHeading - 360 - LastHeading; | |
1523 | |
1524 diffAbs = diff; | |
1525 if(diffAbs < 0) | |
1526 diffAbs *= -1; | |
1527 | |
1528 diffAbs2 = diff2; | |
1529 if(diffAbs2 < 0) | |
1530 diffAbs2 *= -1; | |
1531 | |
1532 if(diffAbs <= diffAbs2) | |
1533 newHeading = LastHeading + (diff / 2); | |
1534 else | |
1535 newHeading = LastHeading + (diff2 / 2); | |
1536 | |
1537 if(newHeading < 0) | |
1538 newHeading += 360; | |
1539 else | |
1540 if(newHeading >= 360) | |
1541 newHeading -= 360; | |
1542 | |
1543 LastHeading = newHeading; | |
1544 ActualHeading = newHeading; | |
1545 | |
1546 if (ActualHeading < 90) | |
1547 ActualHeading += 360; | |
1548 | |
1549 while(ActualHeading > 359) ActualHeading -= 360; | |
1550 | |
1551 LineHeading = 360 - ActualHeading; | |
496 | 1552 |
1553 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(0,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font030); // North | |
38 | 1554 LineHeading += 90; |
496 | 1555 |
1556 for (loop = 0; loop < 3; loop++) | |
1557 { | |
1558 if(LineHeading > 359) LineHeading -= 360; | |
1559 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(0,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Main Ticks | |
1560 LineHeading += 90; | |
1561 } | |
38 | 1562 |
1563 LineHeading = 360 - ActualHeading; | |
1564 LineHeading += 45; | |
496 | 1565 |
1566 for (loop = 0; loop < 4; loop++) | |
1567 { | |
1568 if(LineHeading > 359) LineHeading -= 360; | |
1569 GFX_draw_thick_line(5,tXscreen, t3_compass_circle(1,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Subtick | |
1570 LineHeading += 90; | |
1571 } | |
38 | 1572 |
1573 LineHeading = 360 - ActualHeading; | |
1574 LineHeading += 22; | |
496 | 1575 for (loop = 0; loop < 8; loop++) |
1576 { | |
1577 if(LineHeading > 359) LineHeading -= 360; | |
1578 GFX_draw_thick_line(3,tXscreen, t3_compass_circle(1,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Subtick | |
1579 LineHeading += 45; | |
1580 } | |
38 | 1581 if(UserSetHeading) |
1582 { | |
1583 LineHeading = UserSetHeading + 360 - ActualHeading; | |
1584 if(LineHeading > 359) LineHeading -= 360; | |
496 | 1585 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(3,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_CompassUserHeadingTick); |
38 | 1586 |
1587 // R�ckpeilung, User Back Heading | |
1588 LineHeading = UserSetHeading + 360 + 180 - ActualHeading; | |
1589 if(LineHeading > 359) LineHeading -= 360; | |
1590 if(LineHeading > 359) LineHeading -= 360; | |
496 | 1591 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(3,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_CompassUserBackHeadingTick); |
38 | 1592 } |
1593 | |
1594 GFX_draw_circle(tXscreen, center, 106, CLUT_Font030); | |
1595 GFX_draw_circle(tXscreen, center, 107, CLUT_Font030); | |
1596 GFX_draw_circle(tXscreen, center, 108, CLUT_Font030); | |
1597 } | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1598 |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1599 uint8_t t3_GetEnabled_customviews() |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1600 { |
496 | 1601 uint8_t *pViews; |
1602 uint8_t increment = 1; | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1603 uint8_t enabledViewCnt = 0; |
496 | 1604 |
511 | 1605 pViews = (uint8_t*)t3_customviewsStandard; |
496 | 1606 while((*pViews != CVIEW_T3_END)) |
1607 { | |
1608 increment = 1; | |
1609 /* check if view is enabled */ | |
1610 if(t3_customview_disabled(*pViews)) | |
1611 { | |
1612 increment = 0; | |
1613 } | |
1614 pViews++; | |
1615 enabledViewCnt += increment; | |
1616 } | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1617 return enabledViewCnt; |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1618 } |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1619 |
518 | 1620 uint8_t t3_getCustomView(void) |
1621 { | |
1622 return t3_selection_customview; | |
1623 } |