Mercurial > public > ostc4
annotate Discovery/Src/t3.c @ 815:ce8f71217f45
Bugfix CustomView selection during dive mode:
The CustomView selection during dive mode was limited to two pages, while meanwhile three are needed to show all options. The problem did not showup in surface mode selection. Rootcause was a static definition instead of the dynamic one used in surface mode. In addition with every page shift a new page was created which might cause display errors after some times. To solve this the pages are now updated instead of rebuilding the pages.
author | Ideenmodellierer |
---|---|
date | Sun, 03 Sep 2023 18:03:49 +0200 |
parents | 4abfb8a2a435 |
children | 107c29934671 |
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 ------------------------------------------------------------------*/ | |
758
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
30 #include <stdbool.h> |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
31 |
38 | 32 #include "t3.h" |
33 | |
34 #include "data_exchange_main.h" | |
35 #include "decom.h" | |
36 #include "gfx_fonts.h" | |
37 #include "math.h" | |
38 #include "tHome.h" | |
39 #include "timer.h" | |
40 #include "unit.h" | |
553 | 41 #include "motion.h" |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
42 #include "logbook_miniLive.h" |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
43 |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
44 |
599 | 45 #define CV_PROFILE_WIDTH (600U) |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
46 |
237
ec16fd26e280
Bugfix: do not show NDL in bigscreen mode when zero
Jan Mulder <jlmulder@xs4all.nl>
parents:
214
diff
changeset
|
47 //* Imported function prototypes ---------------------------------------------*/ |
38 | 48 extern uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium); |
49 | |
50 /* Exported variables --------------------------------------------------------*/ | |
51 | |
52 const uint16_t BigFontSeperationLeftRight = 399; | |
53 const uint16_t BigFontSeperationTopBottom = 240; | |
54 | |
55 /* Private variables ---------------------------------------------------------*/ | |
56 GFX_DrawCfgScreen t3screen; | |
57 GFX_DrawCfgWindow t3l1; | |
58 GFX_DrawCfgWindow t3r1; | |
59 GFX_DrawCfgWindow t3c1; | |
60 GFX_DrawCfgWindow t3c2; | |
61 | |
529
0e1db77b2aca
Added skip condition in custom view selection:
Ideenmodellierer
parents:
527
diff
changeset
|
62 uint8_t t3_selection_customview = CVIEW_noneOrDebug; |
38 | 63 |
64 /* TEM HAS TO MOVE TO GLOBAL--------------------------------------------------*/ | |
65 | |
66 /* Private types -------------------------------------------------------------*/ | |
67 #define TEXTSIZE 16 | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
68 #define NUMBER_OF_VIEWS 7 /* number of views defined in the array below */ |
38 | 69 |
70 const uint8_t t3_customviewsStandard[] = | |
71 { | |
72 CVIEW_T3_Decostop, | |
73 CVIEW_sensors, | |
74 CVIEW_Compass, | |
75 CVIEW_T3_MaxDepth, | |
76 CVIEW_T3_StopWatch, | |
77 CVIEW_T3_TTS, | |
78 CVIEW_T3_ppO2andGas, | |
518 | 79 CVIEW_T3_GasList, |
511 | 80 CVIEW_T3_Navigation, |
81 CVIEW_T3_DepthData, | |
541
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
82 CVIEW_noneOrDebug, |
542
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
83 CVIEW_T3_DecoTTS, |
599 | 84 #ifdef ENABLE_T3_PROFILE_VIEW |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
85 CVIEW_T3_Profile, |
599 | 86 #endif |
38 | 87 CVIEW_T3_END |
88 }; | |
89 | |
90 /* Private function prototypes -----------------------------------------------*/ | |
91 void t3_refresh_divemode(void); | |
92 | |
93 uint8_t t3_test_customview_warnings(void); | |
94 void t3_refresh_customview(float depth); | |
496 | 95 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading); |
38 | 96 |
97 /* Exported functions --------------------------------------------------------*/ | |
98 | |
99 void t3_init(void) | |
100 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
101 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
102 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
103 |
496 | 104 t3_selection_customview = t3_customviewsStandard[0]; |
38 | 105 |
106 t3screen.FBStartAdress = 0; | |
107 t3screen.ImageHeight = 480; | |
108 t3screen.ImageWidth = 800; | |
109 t3screen.LayerIndex = 1; | |
110 | |
111 t3l1.Image = &t3screen; | |
112 t3l1.WindowNumberOfTextLines = 2; | |
113 t3l1.WindowLineSpacing = 19; // Abstand von Y0 | |
114 t3l1.WindowTab = 100; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
115 |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
116 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
117 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
118 t3l1.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
119 t3l1.WindowX1 = BigFontSeperationLeftRight - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
120 t3l1.WindowY0 = BigFontSeperationTopBottom + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
121 t3l1.WindowY1 = 479; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
122 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
123 else |
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 t3l1.WindowX0 = 800 - BigFontSeperationLeftRight + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
126 t3l1.WindowX1 = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
127 t3l1.WindowY0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
128 t3l1.WindowY1 = 479 - BigFontSeperationTopBottom + 5 ; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
129 } |
38 | 130 |
131 t3r1.Image = &t3screen; | |
132 t3r1.WindowNumberOfTextLines = t3l1.WindowNumberOfTextLines; | |
133 t3r1.WindowLineSpacing = t3l1.WindowLineSpacing; | |
134 t3r1.WindowTab = t3l1.WindowTab; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
135 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
136 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
137 t3r1.WindowX0 = BigFontSeperationLeftRight + 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
138 t3r1.WindowX1 = 799; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
139 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
140 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
141 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
142 t3r1.WindowX0 = 0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
143 t3r1.WindowX1 = BigFontSeperationLeftRight - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
144 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
145 |
38 | 146 t3r1.WindowY0 = t3l1.WindowY0; |
147 t3r1.WindowY1 = t3l1.WindowY1; | |
148 | |
518 | 149 /* t3c1 is across the complete lower part of the display */ |
38 | 150 t3c1.Image = &t3screen; |
151 t3c1.WindowNumberOfTextLines = 2; | |
518 | 152 t3c1.WindowLineSpacing = 84 + 5; /* double font + spacing */ |
38 | 153 t3c1.WindowX0 = 0; |
154 t3c1.WindowX1 = 799; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
155 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
156 { |
511 | 157 t3c1.WindowY0 = 5; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
158 t3c1.WindowY1 = BigFontSeperationTopBottom - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
159 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
160 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
161 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
162 t3c1.WindowY0 = 480 - BigFontSeperationTopBottom + 5; |
511 | 163 t3c1.WindowY1 = 479 - 5; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
164 } |
38 | 165 |
518 | 166 /* t3c2 is just showing the lower right part of the display */ |
38 | 167 t3c2.Image = &t3screen; |
168 t3c2.WindowNumberOfTextLines = 3; | |
511 | 169 t3c2.WindowLineSpacing = t3c1.WindowLineSpacing ; |
38 | 170 t3c2.WindowX0 = 370; |
171 t3c2.WindowX1 = 799; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
172 t3c2.WindowY0 = t3c1.WindowY0; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
173 t3c2.WindowY1 = t3c1.WindowY1; |
38 | 174 t3c2.WindowTab = 600; |
175 } | |
176 | |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
177 void t3_select_customview(uint8_t selectedCustomview) |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
178 { |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
179 if(selectedCustomview < CVIEW_T3_END) |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
180 { |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
181 t3_selection_customview = selectedCustomview; |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
182 } |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
183 } |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
184 |
610 | 185 void t3_drawMarker(GFX_DrawCfgScreen *hgfx, const SWindowGimpStyle *window, uint8_t *data, uint16_t datalength, uint8_t color) |
186 { | |
187 uint16_t line = 0; | |
188 uint16_t dataIndex = 0; | |
189 uint16_t lastDataIndex = 0; | |
190 uint16_t windowWidth = 0; | |
191 int16_t factor = 0; | |
192 uint8_t setMarker = 0; | |
193 | |
194 point_t start; | |
195 point_t stop; | |
196 | |
197 | |
198 if( (window->bottom <= 479) | |
199 && (window->top <= 479) | |
200 && (window->right <= 799) | |
201 && (window->left <= 799) | |
202 && (window->right >= 0) | |
203 && (window->left >= 0) | |
204 && (window->bottom > window->top) | |
205 && (window->right > window->left)) | |
206 { | |
207 windowWidth = window->right - window->left; | |
208 | |
624
930f1bbe0ac2
Development bugfix: Marker in standard t3 view drawn in wrong direction
Ideenmodellierer
parents:
622
diff
changeset
|
209 start.y = 479 - BigFontSeperationTopBottom - 5; |
930f1bbe0ac2
Development bugfix: Marker in standard t3 view drawn in wrong direction
Ideenmodellierer
parents:
622
diff
changeset
|
210 stop.y =5; |
930f1bbe0ac2
Development bugfix: Marker in standard t3 view drawn in wrong direction
Ideenmodellierer
parents:
622
diff
changeset
|
211 |
610 | 212 while((line <= windowWidth) && (dataIndex < datalength)) |
213 { | |
214 factor = (10 * line * (long)datalength)/windowWidth; | |
215 dataIndex = factor/10; | |
216 /* check if a marker is set in the intervall which is bypassed because of data reduction */ | |
217 setMarker = 0; | |
218 while(lastDataIndex <= dataIndex) | |
219 { | |
220 lastDataIndex++; | |
221 if(data[lastDataIndex] != 0) | |
222 { | |
223 setMarker = 1; | |
224 break; | |
225 } | |
226 } | |
227 lastDataIndex = dataIndex; | |
228 int rest = factor - dataIndex*10; | |
229 if(rest >= 5) | |
230 dataIndex++; | |
231 | |
232 if((datalength - 1) < dataIndex) | |
233 dataIndex = datalength-1; | |
234 | |
235 if((line > 0) && (setMarker)) /* draw marker line */ | |
236 { | |
237 start.x = line; | |
238 stop.x = line; | |
239 GFX_draw_line(hgfx, start, stop, color); | |
240 } | |
241 line++; | |
242 dataIndex++; | |
243 } | |
244 } | |
245 } | |
246 | |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
247 void t3_miniLiveLogProfile(void) |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
248 { |
641
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
249 static uint8_t wasDecoDive = 0; |
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
250 |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
251 SWindowGimpStyle wintemp; |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
252 uint16_t replayDataLength = 0; |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
253 uint16_t liveDataLength = 0; |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
254 uint16_t drawDataLength = 0; |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
255 uint16_t* pReplayData; |
610 | 256 uint8_t* pReplayMarker; |
599 | 257 uint16_t max_depth = 10; |
258 char text[TEXTSIZE]; | |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
259 point_t start, stop; |
599 | 260 uint16_t diveMinutes = 0; |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
261 |
622 | 262 SSettings* pSettings; |
263 pSettings = settingsGetPointer(); | |
619
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
264 |
622 | 265 wintemp.top = 479 - BigFontSeperationTopBottom + 5; |
599 | 266 wintemp.bottom = 479 - 5; |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
267 |
622 | 268 if(!pSettings->FlipDisplay) |
269 { | |
270 wintemp.left = t3c1.WindowX0; | |
271 wintemp.right = t3c1.WindowX0 + CV_PROFILE_WIDTH; | |
272 } | |
273 else | |
274 { | |
275 wintemp.left = t3c1.WindowX1 - CV_PROFILE_WIDTH;; | |
276 wintemp.right = t3c1.WindowX1; | |
277 } | |
278 | |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
279 start.x = CV_PROFILE_WIDTH + 2; |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
280 stop.x = start.x; |
622 | 281 start.y = 479 - BigFontSeperationTopBottom - 5; |
282 stop.y =5; | |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
283 |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
284 GFX_draw_line(&t3screen, start, stop, CLUT_Font020); |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
285 |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
286 if(getReplayOffset() != 0xFFFF) |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
287 { |
610 | 288 getReplayInfo(&pReplayData, &pReplayMarker, &replayDataLength, &max_depth, &diveMinutes); |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
289 } |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
290 |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
291 if(max_depth < (uint16_t)(stateUsed->lifeData.max_depth_meter * 100)) |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
292 { |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
293 max_depth = (uint16_t)(stateUsed->lifeData.max_depth_meter * 100); |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
294 } |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
295 |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
296 liveDataLength = getMiniLiveReplayLength(); |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
297 |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
298 if(replayDataLength > liveDataLength) |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
299 { |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
300 drawDataLength = replayDataLength; |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
301 } |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
302 else |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
303 { |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
304 drawDataLength = liveDataLength; |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
305 } |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
306 |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
307 if(drawDataLength < CV_PROFILE_WIDTH) |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
308 { |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
309 drawDataLength = CV_PROFILE_WIDTH; |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
310 } |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
311 |
599 | 312 if(diveMinutes != 0) |
313 { | |
314 snprintf(text,TEXTSIZE,"\002%dmin",diveMinutes); | |
315 GFX_write_string(&FontT42,&t3c1,text,1); | |
316 } | |
317 | |
318 snprintf(text,TEXTSIZE,"\002%01.1fm", max_depth / 100.0); | |
319 GFX_write_string(&FontT42,&t3c1,text,0); | |
320 | |
641
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
321 if(getMiniLiveReplayLength() < 10) /* new dive startet => reset the visualization state for deco data */ |
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
322 { |
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
323 wasDecoDive = 0; |
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
324 } |
619
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
325 |
788
4abfb8a2a435
Define explicit setpoints for low / high / deco. Add an option to delay the switch to SPlow until all decompression has been cleared. (mikeller)
heinrichsweikamp
parents:
758
diff
changeset
|
326 const SDecoinfo * pDecoinfo = getDecoInfo(); |
641
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
327 if((pDecoinfo->output_time_to_surface_seconds) || (wasDecoDive)) /* draw deco data first => will be overlayed by all other informations */ |
619
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
328 { |
641
ed5422ac4ffb
Development Bugfix Deco bars not shown after last deco stop passed:
Ideenmodellierer
parents:
633
diff
changeset
|
329 wasDecoDive = 1; |
619
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
330 GFX_graph_print(&t3screen,&wintemp,wintemp.top * -1,1,0,max_depth, getMiniLiveDecoPointerToData(),drawDataLength, CLUT_NiceGreen, NULL); |
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
331 } |
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
332 |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
333 if(replayDataLength != 0) |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
334 { |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
335 GFX_graph_print(&t3screen, &wintemp, 0,1,0, max_depth, pReplayData, drawDataLength, CLUT_Font031, NULL); |
610 | 336 if(pReplayMarker[0] != 0xFF) |
337 { | |
338 t3_drawMarker(&t3screen, &wintemp, pReplayMarker, drawDataLength, CLUT_CompassUserHeadingTick); | |
339 } | |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
340 } |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
341 |
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
342 if(liveDataLength > 3) |
599 | 343 { |
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
601
diff
changeset
|
344 GFX_graph_print(&t3screen, &wintemp, 0,1,0, max_depth, getMiniLiveReplayPointerToData(), drawDataLength, CLUT_Font030, NULL); |
599 | 345 } |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
346 } |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
347 |
38 | 348 |
349 void t3_refresh(void) | |
350 { | |
496 | 351 static uint8_t last_mode = MODE_SURFACE; |
352 | |
38 | 353 SStateList status; |
354 get_globalStateList(&status); | |
355 | |
356 if(stateUsed->mode != MODE_DIVE) | |
357 { | |
358 settingsGetPointer()->design = 7; | |
359 return; | |
360 } | |
361 | |
362 if(status.base != BaseHome) | |
363 return; | |
364 | |
541
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
365 if(last_mode != MODE_DIVE) /* Select custom view */ |
496 | 366 { |
367 if((settingsGetPointer()->tX_customViewTimeout == 0) && (settingsGetPointer()->showDebugInfo)) | |
368 { | |
369 t3_selection_customview = CVIEW_noneOrDebug; | |
370 } | |
371 else | |
372 { | |
541
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
373 t3_selection_customview = settingsGetPointer()->tX_customViewPrimaryBF; |
496 | 374 } |
375 t3_change_customview(ACTION_END); | |
376 } | |
38 | 377 t3screen.FBStartAdress = getFrame(24); |
378 t3_refresh_divemode(); | |
166
255eedad4155
cleanup: get rid of some compile warnings
Jan Mulder <jlmulder@xs4all.nl>
parents:
138
diff
changeset
|
379 GFX_SetFramesTopBottom(t3screen.FBStartAdress, 0,480); |
38 | 380 releaseAllFramesExcept(24,t3screen.FBStartAdress); |
496 | 381 last_mode = stateUsed->mode; |
38 | 382 } |
383 | |
541
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
384 void t3_set_customview_to_primary(void) |
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
385 { |
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
386 if(stateUsed->mode == MODE_DIVE) |
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
387 { |
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
388 t3_selection_customview = settingsGetPointer()->tX_customViewPrimaryBF; |
599 | 389 t3_change_customview(ACTION_END); |
541
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
390 } |
6fbf7cd391cb
Added default view selection and auto return to view to t3 visualization:
Ideenmodellierer
parents:
539
diff
changeset
|
391 } |
38 | 392 |
393 /* Private functions ---------------------------------------------------------*/ | |
394 | |
395 float t3_basics_lines_depth_and_divetime(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode) | |
396 { | |
518 | 397 char text[256]; |
398 uint8_t textPointer; | |
38 | 399 uint8_t color; |
400 uint8_t depthChangeRate; | |
401 uint8_t depthChangeAscent; | |
402 point_t start, stop, startZeroLine; | |
518 | 403 SDivetime Divetime = {0,0,0,0}; |
38 | 404 |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
405 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
406 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
407 |
38 | 408 start.x = 0; |
409 stop.x = 799; | |
410 stop.y = start.y = BigFontSeperationTopBottom; | |
642
c737cf5d9067
Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents:
641
diff
changeset
|
411 if((viewInFocus()) && (!viewDetectionSuspended())) |
553 | 412 { |
413 GFX_draw_line(tXscreen, start, stop, CLUT_Font023); | |
414 } | |
415 else | |
416 { | |
417 GFX_draw_line(tXscreen, start, stop, CLUT_Font020); | |
418 } | |
419 | |
38 | 420 |
421 start.y = BigFontSeperationTopBottom; | |
422 stop.y = 479; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
423 |
38 | 424 stop.x = start.x = BigFontSeperationLeftRight; |
642
c737cf5d9067
Do not show focus indicator in case motion detection is suspended:
Ideenmodellierer
parents:
641
diff
changeset
|
425 if((viewInFocus() && (!viewDetectionSuspended()))) |
553 | 426 { |
427 GFX_draw_line(tXscreen, start, stop, CLUT_Font023); | |
428 } | |
429 else | |
430 { | |
431 GFX_draw_line(tXscreen, start, stop, CLUT_Font020); | |
432 } | |
38 | 433 |
434 /* depth */ | |
174
ecb71521d004
Bugfix: make max depth move with current depth (part 2)
Jan Mulder <jlmulder@xs4all.nl>
parents:
166
diff
changeset
|
435 float depth = unit_depth_float(stateUsed->lifeData.depth_meter); |
38 | 436 |
437 if(depth <= 0.3f) | |
438 depth = 0; | |
439 | |
440 if(settingsGetPointer()->nonMetricalSystem) | |
441 snprintf(text,TEXTSIZE,"\032\f[feet]"); | |
442 else | |
443 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Depth); | |
444 GFX_write_string(&FontT42,tXl1,text,0); | |
445 | |
446 if( ((mode == DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4 ))) | |
447 || ((mode != DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 8) || (stateUsed->lifeData.ascent_rate_meter_per_min < -10))) | |
448 ) | |
449 { | |
450 snprintf(text,TEXTSIZE,"\f\002%.0f %c%c/min " | |
451 , unit_depth_float(stateUsed->lifeData.ascent_rate_meter_per_min) | |
452 , unit_depth_char1() | |
453 , unit_depth_char2() | |
454 ); | |
455 GFX_write_string(&FontT42,tXl1,text,0); | |
456 } | |
457 | |
458 if( depth < 100) | |
459 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",depth); | |
460 else | |
461 snprintf(text,TEXTSIZE,"\020\003\016%01.0f",depth); | |
462 | |
463 t3_basics_colorscheme_mod(text); | |
464 GFX_write_string(&FontT105,tXl1,text,1); | |
465 | |
466 | |
467 /* ascentrate graph */ | |
468 if(mode == DIVEMODE_Apnea) | |
469 { | |
470 /* ascentrate graph - apnea mode */ | |
471 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) | |
472 { | |
473 depthChangeAscent = 1; | |
474 if(stateUsed->lifeData.ascent_rate_meter_per_min < 200) | |
475 depthChangeRate = (uint8_t)stateUsed->lifeData.ascent_rate_meter_per_min; | |
476 else | |
477 depthChangeRate = 200; | |
478 } | |
479 else | |
480 { | |
481 depthChangeAscent = 0; | |
482 if(stateUsed->lifeData.ascent_rate_meter_per_min > -200) | |
483 depthChangeRate = (uint8_t)(0 - stateUsed->lifeData.ascent_rate_meter_per_min); | |
484 else | |
485 depthChangeRate = 200; | |
486 } | |
413 | 487 |
488 if(!pSettings->FlipDisplay) | |
489 { | |
490 start.y = tXl1->WindowY0 - 1; | |
491 } | |
492 else | |
493 { | |
494 start.y = tXl1->WindowY1 + 1; | |
495 } | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
496 startZeroLine.y = start.y; |
38 | 497 for(int i = 0; i<5;i++) |
498 { | |
499 start.y += 40; | |
500 stop.y = start.y; | |
413 | 501 if(!pSettings->FlipDisplay) |
502 { | |
503 start.x = tXl1->WindowX1 - 1; | |
504 } | |
505 else | |
506 { | |
507 start.x = tXr1->WindowX1 - 1; | |
508 } | |
38 | 509 stop.x = start.x - 17; |
510 | |
511 if(depthChangeRate <= 6) | |
512 { | |
513 if(i == 2) | |
514 { | |
515 startZeroLine.y = start.y; | |
516 stop.x = start.x - 34; | |
517 } | |
518 } | |
519 else | |
520 { | |
521 if(((i == 1) && depthChangeAscent) || ((i == 3) && !depthChangeAscent)) | |
522 { | |
523 startZeroLine.y = start.y; | |
524 stop.x = start.x - 34; | |
525 } | |
526 } | |
527 GFX_draw_line(tXscreen, start, stop, 0); | |
528 } | |
529 // new thick bar design Sept. 2015 | |
530 if((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4)) | |
531 { | |
532 start.y = startZeroLine.y; | |
533 if(depthChangeAscent) | |
534 { | |
535 color = CLUT_EverythingOkayGreen; | |
536 start.y += 7; // starte etwas weiter oben | |
537 stop.y = start.y + (uint16_t)(depthChangeRate * 4) - 9; // - x; // wegen der Liniendicke | |
538 if(stop.y > 475) | |
539 stop.y = 475; | |
540 } | |
541 else | |
542 { | |
543 color = CLUT_Font023; | |
544 start.y -= 7; | |
545 stop.y = start.y - (uint16_t)(depthChangeRate * 4) + 9; | |
546 if(stop.y <= tXl1->WindowY0) | |
547 stop.y = tXl1->WindowY0 + 1; | |
548 } | |
413 | 549 if(!pSettings->FlipDisplay) |
550 { | |
551 start.x = tXl1->WindowX1 - 3 - 5; | |
552 } | |
553 else | |
554 { | |
555 start.x = tXr1->WindowX1 - 3 - 5; | |
556 } | |
557 | |
558 stop.x = start.x; | |
38 | 559 GFX_draw_thick_line(12,tXscreen, start, stop, color); |
560 } | |
561 } | |
562 else | |
563 { | |
564 /* ascentrate graph -standard mode */ | |
565 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) | |
566 { | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
567 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
568 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
569 start.y = tXl1->WindowY0 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
570 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
571 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
572 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
573 start.y = tXl1->WindowY1 + 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
574 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
575 |
38 | 576 for(int i = 0; i<4;i++) |
577 { | |
578 start.y += 5*8; | |
579 stop.y = start.y; | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
580 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
581 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
582 start.x = tXl1->WindowX1 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
583 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
584 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
585 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
586 start.x = tXr1->WindowX1 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
587 } |
38 | 588 stop.x = start.x - 17; |
589 GFX_draw_line(tXscreen, start, stop, 0); | |
590 } | |
591 // new thick bar design Sept. 2015 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
592 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
593 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
594 start.x = tXl1->WindowX1 - 3 - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
595 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
596 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
597 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
598 start.x = tXr1->WindowX1 - 3 - 5; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
599 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
600 |
38 | 601 stop.x = start.x; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
602 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
603 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
604 start.y = tXl1->WindowY0 - 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
605 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
606 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
607 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
608 start.y = tXl1->WindowY1 + 1; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
609 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
610 |
38 | 611 stop.y = start.y + (uint16_t)(stateUsed->lifeData.ascent_rate_meter_per_min * 8); |
612 stop.y -= 3; // wegen der Liniendicke von 12 anstelle von 9 | |
613 if(stop.y >= 470) | |
614 stop.y = 470; | |
615 start.y += 7; // starte etwas weiter oben | |
616 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 10) | |
617 color = CLUT_EverythingOkayGreen; | |
618 else | |
619 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 15) | |
620 color = CLUT_WarningYellow; | |
621 else | |
622 color = CLUT_WarningRed; | |
623 | |
624 GFX_draw_thick_line(12,tXscreen, start, stop, color); | |
625 } | |
626 } | |
627 | |
628 // divetime | |
629 if(mode == DIVEMODE_Apnea) | |
630 { | |
631 if(stateUsed->lifeData.counterSecondsShallowDepth) | |
632 { | |
633 SDivetime SurfaceBreakTime = {0,0,0,0}; | |
634 | |
635 SurfaceBreakTime.Total = stateUsed->lifeData.counterSecondsShallowDepth; | |
636 SurfaceBreakTime.Minutes = SurfaceBreakTime.Total / 60; | |
637 SurfaceBreakTime.Seconds = SurfaceBreakTime.Total - (SurfaceBreakTime.Minutes * 60); | |
638 | |
639 snprintf(text,TEXTSIZE,"\032\f\002%c%c", TXT_2BYTE,TXT2BYTE_ApneaSurface); | |
640 GFX_write_string(&FontT42,tXr1,text,0); | |
641 | |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
642 snprintf(text,TEXTSIZE,"\020\003\002\016%u:%02u",SurfaceBreakTime.Minutes, SurfaceBreakTime.Seconds); |
38 | 643 } |
644 else | |
645 { | |
646 Divetime.Total = stateUsed->lifeData.dive_time_seconds; | |
647 Divetime.Minutes = Divetime.Total / 60; | |
648 Divetime.Seconds = Divetime.Total - ( Divetime.Minutes * 60 ); | |
649 | |
650 snprintf(text,TEXTSIZE,"\032\f\002%c",TXT_Divetime); | |
651 GFX_write_string(&FontT42,tXr1,text,0); | |
652 | |
653 if(Divetime.Minutes < 100) | |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
654 snprintf(text,TEXTSIZE,"\020\003\002\016%u:%02u",Divetime.Minutes, Divetime.Seconds); |
38 | 655 else |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
656 snprintf(text,TEXTSIZE,"\020\003\002\016%u'",Divetime.Minutes); |
38 | 657 } |
518 | 658 t3_basics_colorscheme_mod(text); |
659 GFX_write_string(&FontT105,tXr1,text,1); | |
38 | 660 } |
661 else | |
662 { | |
518 | 663 switch(get_globalState()) |
664 { | |
739 | 665 case StDMENU: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_DiveMenuQ); |
666 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
667 break; | |
518 | 668 case StDBEAR: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_DiveBearingQ); |
669 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
670 break; | |
671 case StDRAVG: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_DiveResetAvgQ); | |
672 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
673 break; | |
38 | 674 |
518 | 675 case StDMGAS: |
676 textPointer = 0; | |
677 text[textPointer++] = '\a'; | |
678 text[textPointer++] = '\001'; | |
679 text[textPointer++] = ' '; | |
680 textPointer += tHome_gas_writer(stateUsed->diveSettings.gas[actualBetterGasId()].oxygen_percentage,stateUsed->diveSettings.gas[actualBetterGasId()].helium_percentage,&text[textPointer]); | |
681 text[textPointer++] = '?'; | |
682 text[textPointer++] = ' '; | |
683 text[textPointer++] = 0; | |
684 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
685 break; | |
613 | 686 |
687 case StDMARK: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_SetMarkerShort); | |
688 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); | |
689 break; | |
690 | |
619
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
691 case StDCHECK: snprintf(text,TEXTSIZE,"\a\003\001%c%c", TXT_2BYTE, TXT2BYTE_CheckMarker); |
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
692 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
693 break; |
8fa2de4414a8
Added t3 quick menu for marker synchronisation:
Ideenmodellierer
parents:
613
diff
changeset
|
694 |
633
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
695 #ifdef ENABLE_T3_PPO_SIM |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
696 case StDSIM1: snprintf(text,TEXTSIZE,"\a\003\001PPO S0 +"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
697 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
698 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
699 case StDSIM2: snprintf(text,TEXTSIZE,"\a\003\001PPO S0 -"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
700 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
701 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
702 case StDSIM3: snprintf(text,TEXTSIZE,"\a\003\001PPO S1 +"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
703 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
704 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
705 case StDSIM4: snprintf(text,TEXTSIZE,"\a\003\001PPO S1 -"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
706 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
707 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
708 case StDSIM5: snprintf(text,TEXTSIZE,"\a\003\001PPO S2 +"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
709 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
710 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
711 case StDSIM6: snprintf(text,TEXTSIZE,"\a\003\001PPO S2 -"); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
712 GFX_write_string_color(&FontT42,tXr1,text,1,CLUT_WarningYellow); |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
713 break; |
68d95049f11a
Added menu structure to allow ppo2 modification in simulator mode:
Ideenmodellierer
parents:
624
diff
changeset
|
714 #endif |
518 | 715 default: /* show divetime */ |
38 | 716 |
518 | 717 Divetime.Total = stateUsed->lifeData.dive_time_seconds_without_surface_time; |
718 Divetime.Minutes = Divetime.Total / 60; | |
719 Divetime.Seconds = Divetime.Total - ( Divetime.Minutes * 60 ); | |
720 | |
721 snprintf(text,TEXTSIZE,"\032\f\002%c",TXT_Divetime); | |
722 GFX_write_string(&FontT42,tXr1,text,0); | |
723 | |
724 if(Divetime.Minutes < 100) | |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
725 snprintf(text,TEXTSIZE,"\020\003\002\016%u:%02u",Divetime.Minutes, Divetime.Seconds); |
518 | 726 else |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
727 snprintf(text,TEXTSIZE,"\020\003\002\016%u'",Divetime.Minutes); |
518 | 728 |
729 t3_basics_colorscheme_mod(text); | |
730 GFX_write_string(&FontT105,tXr1,text,1); | |
731 break; | |
732 } | |
38 | 733 } |
734 | |
735 return depth; | |
736 } | |
737 | |
738 | |
739 void t3_refresh_divemode(void) | |
740 { | |
741 uint8_t customview_warnings = 0; | |
742 float depth_meter = 0.0; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
743 |
38 | 744 // everything like lines, depth, ascent graph and divetime |
745 depth_meter = t3_basics_lines_depth_and_divetime(&t3screen, &t3l1, &t3r1, 0); // 0 could be stateUsed->diveSettings.diveMode for CCR specials | |
746 | |
747 // customview | |
748 if(stateUsed->warnings.numWarnings) | |
749 customview_warnings = t3_test_customview_warnings(); | |
750 | |
751 if(customview_warnings && warning_count_high_time) | |
752 t3_basics_show_customview_warnings(&t3c1); | |
753 else | |
754 t3_refresh_customview(depth_meter); | |
755 | |
756 if(stateUsed->warnings.lowBattery) | |
496 | 757 t3_basics_battery_low_customview_extra(&t3r1); //t3c1); |
38 | 758 } |
759 | |
760 | |
761 void t3_basics_battery_low_customview_extra(GFX_DrawCfgWindow* tXc1) | |
762 { | |
763 char TextC1[256]; | |
764 | |
496 | 765 TextC1[0] = ' ';//'\002'; |
38 | 766 TextC1[1] = '\f'; |
767 TextC1[2] = '\025'; | |
768 TextC1[3] = '3'; | |
769 TextC1[4] = '1'; | |
770 TextC1[5] = '1'; | |
771 TextC1[6] = '1'; | |
772 TextC1[7] = '1'; | |
773 TextC1[8] = '1'; | |
774 TextC1[9] = '1'; | |
775 TextC1[10] = '1'; | |
776 TextC1[11] = '1'; | |
777 TextC1[12] = '1'; | |
778 TextC1[13] = '1'; | |
779 TextC1[14] = '0'; | |
780 TextC1[15] = 0; | |
781 | |
782 if(!warning_count_high_time) | |
783 TextC1[4] = '2'; | |
784 | |
785 GFX_write_string(&Batt24,tXc1,TextC1,0); | |
786 } | |
787 | |
788 | |
789 | |
790 void t3_refresh_customview(float depth) | |
791 { | |
272
74a8296a2318
cleanup: simplify stateUsed usage
Jan Mulder <jlmulder@xs4all.nl>
parents:
237
diff
changeset
|
792 t3_basics_refresh_customview(depth, t3_selection_customview, &t3screen, &t3c1, &t3c2, stateUsedWrite->diveSettings.diveMode); |
38 | 793 } |
794 | |
795 | |
796 void t3_basics_refresh_apnoeRight(float depth, uint8_t tX_selection_customview, GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXc1, GFX_DrawCfgWindow* tXc2, uint8_t mode) | |
797 { | |
722 | 798 char text[30]; |
38 | 799 uint16_t textpointer = 0; |
800 | |
801 // CVIEW_T3_Temperature | |
802 float temperature; | |
413 | 803 SSettings* pSettings; |
804 pSettings = settingsGetPointer(); | |
38 | 805 |
806 SDivetime TotalDivetime = {0,0,0,0}; | |
807 SDivetime LastDivetime = {0,0,0,0}; | |
808 | |
809 uint16_t tempWinX0; | |
413 | 810 uint16_t tempWinX1; |
38 | 811 uint16_t tempWinY0; |
413 | 812 uint16_t tempWinY1; |
38 | 813 |
814 tempWinX0 = tXc1->WindowX0; | |
413 | 815 tempWinX1 = tXc1->WindowX1; |
38 | 816 tempWinY0 = tXc1->WindowY0; |
413 | 817 tempWinY1 = tXc1->WindowY1; |
38 | 818 |
819 tXc1->WindowX0 = 440; // rechte Seite | |
820 | |
821 switch(tX_selection_customview) | |
822 { | |
823 case CVIEW_T3_Temperature: | |
824 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
825 GFX_write_string(&FontT42,tXc1,text,0); | |
826 | |
189
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
174
diff
changeset
|
827 temperature = unit_temperature_float(stateUsed->lifeData.temperature_celsius); |
38 | 828 textpointer = snprintf(text,TEXTSIZE,"\020\003\016%01.0f\016\016\140",temperature); // "\016\016%01.1f `" + C or F |
829 if(settingsGetPointer()->nonMetricalSystem == 0) | |
830 text[textpointer++] = 'C'; | |
831 else | |
832 text[textpointer++] = 'F'; | |
833 text[textpointer++] = 0; | |
834 t3_basics_colorscheme_mod(text); | |
835 GFX_write_string(&FontT105,tXc1,text,1); | |
836 break; | |
837 | |
838 case CVIEW_T3_ApnoeSurfaceInfo: | |
839 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Divetime); | |
840 GFX_write_string(&FontT42,tXc1,text,0); | |
841 | |
842 TotalDivetime.Total = stateUsed->lifeData.dive_time_seconds_without_surface_time; | |
843 TotalDivetime.Minutes = TotalDivetime.Total / 60; | |
844 TotalDivetime.Seconds = TotalDivetime.Total - ( TotalDivetime.Minutes * 60 ); | |
845 | |
846 LastDivetime.Total = stateUsed->lifeData.apnea_last_dive_time_seconds; | |
847 LastDivetime.Minutes = LastDivetime.Total / 60; | |
848 LastDivetime.Seconds = LastDivetime.Total - ( LastDivetime.Minutes * 60 ); | |
849 | |
413 | 850 // tXc1->WindowY0 = 100; // obere Zeile |
851 if(!pSettings->FlipDisplay) | |
852 { | |
853 tXc1->WindowY0 = 100; | |
854 } | |
855 else | |
856 { | |
857 tXc1->WindowY1 -= 100; /* jump to upper of two lines */ | |
858 } | |
38 | 859 |
860 snprintf(text,TEXTSIZE,"\020\016%u:%02u",LastDivetime.Minutes, LastDivetime.Seconds); | |
861 t3_basics_colorscheme_mod(text); | |
862 GFX_write_string(&FontT105,tXc1,text,0); | |
863 | |
413 | 864 if(pSettings->FlipDisplay) |
865 { | |
866 tXc1->WindowX0 = 0; | |
867 | |
868 } | |
38 | 869 snprintf(text,TEXTSIZE,"\032\002%c%c",TXT_2BYTE, TXT2BYTE_ApneaLast); |
870 GFX_write_string(&FontT42,tXc1,text,0); | |
871 | |
413 | 872 if(!pSettings->FlipDisplay) |
873 { | |
874 tXc1->WindowY0 = tempWinY0; | |
875 } | |
876 else | |
877 { | |
878 tXc1->WindowX1 = tempWinX1; | |
879 tXc1->WindowY1 = tempWinY1; /* jump to upper of two lines */ | |
880 } | |
38 | 881 |
882 snprintf(text,TEXTSIZE,"\020\016%u:%02u",TotalDivetime.Minutes, TotalDivetime.Seconds); | |
883 t3_basics_colorscheme_mod(text); | |
884 GFX_write_string(&FontT105,tXc1,text,0); | |
885 | |
886 snprintf(text,TEXTSIZE,"\032\002%c%c",TXT_2BYTE, TXT2BYTE_ApneaTotal); | |
413 | 887 if(pSettings->FlipDisplay) |
888 { | |
889 tXc1->WindowX0 = 0; | |
890 | |
891 } | |
38 | 892 GFX_write_string(&FontT42,tXc1,text,0); |
893 break; | |
894 } | |
895 | |
896 tXc1->WindowX0 = tempWinX0; | |
413 | 897 tXc1->WindowX1 = tempWinX1; |
38 | 898 tXc1->WindowY0 = tempWinY0; |
899 | |
900 } | |
901 | |
902 | |
903 void t3_basics_refresh_customview(float depth, uint8_t tX_selection_customview, GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXc1, GFX_DrawCfgWindow* tXc2, uint8_t mode) | |
904 { | |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
905 static uint8_t last_customview = CVIEW_END; |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
906 |
722 | 907 char text[30]; |
38 | 908 uint16_t textpointer = 0; |
909 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
910 SSettings* pSettings; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
911 pSettings = settingsGetPointer(); |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
912 |
38 | 913 // CVIEW_T3_Decostop and CVIEW_T3_TTS |
788
4abfb8a2a435
Define explicit setpoints for low / high / deco. Add an option to delay the switch to SPlow until all decompression has been cleared. (mikeller)
heinrichsweikamp
parents:
758
diff
changeset
|
914 const SDecoinfo * pDecoinfo = getDecoInfo(); |
38 | 915 |
916 // CVIEW_T3_Decostop | |
917 uint16_t nextstopLengthSeconds = 0; | |
918 uint8_t nextstopDepthMeter = 0; | |
919 SDivetime SafetyStopTime = {0,0,0,0}; | |
920 | |
921 // CVIEW_T3_ppO2andGas | |
922 uint8_t oxygen_percentage = 0; | |
923 | |
924 // CVIEW_T3_Temperature | |
925 float temperature; | |
926 | |
927 // CVIEW_T3_GasList | |
928 float fPpO2limitHigh, fPpO2limitLow, fPpO2ofGasAtThisDepth; | |
929 const SGasLine * pGasLine; | |
930 uint8_t oxygen, helium; | |
931 uint8_t lineNumber; | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
932 uint8_t gasPosIdx; |
38 | 933 |
496 | 934 /* compass position */ |
935 point_t center; | |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
936 uint16_t heading; |
496 | 937 |
38 | 938 // CVIEW_T3_StopWatch |
939 SDivetime Stopwatch = {0,0,0,0}; | |
940 float fAverageDepth, fAverageDepthAbsolute; | |
941 | |
662 | 942 #ifdef ENABLE_PSCR_MODE |
943 uint8_t showSimPPO2 = 1; | |
944 #endif | |
38 | 945 uint16_t tempWinX0; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
946 uint16_t tempWinX1; |
38 | 947 uint16_t tempWinY0; |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
948 uint16_t tempWinY1; |
38 | 949 uint16_t tempWinC2X0; |
413 | 950 uint16_t tempWinC2Y0; |
951 uint16_t tempWinC2X1; | |
952 uint16_t tempWinC2Y1; | |
38 | 953 uint16_t tempWinC2Tab; |
954 | |
955 tempWinX0 = tXc1->WindowX0; | |
956 tempWinY0 = tXc1->WindowY0; | |
496 | 957 tempWinX1 = tXc1->WindowX1; |
958 tempWinY1 = tXc1->WindowY1; | |
413 | 959 |
38 | 960 tempWinC2X0 = tXc2->WindowX0; |
413 | 961 tempWinC2Y0 = tXc2->WindowY0; |
962 tempWinC2X1 = tXc2->WindowX1; | |
963 tempWinC2Y1 = tXc2->WindowY1; | |
38 | 964 tempWinC2Tab = tXc2->WindowTab; |
965 | |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
966 if(settingsGetPointer()->compassInertia) |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
967 { |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
968 heading = (uint16_t)compass_getCompensated(); |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
969 } |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
970 else |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
971 { |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
972 heading = (uint16_t)stateUsed->lifeData.compass_heading; |
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
973 } |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
974 if(last_customview != tX_selection_customview) /* check if current selection is disabled and should be skipped */ |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
975 { |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
976 if(t3_customview_disabled(tX_selection_customview)) |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
977 { |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
978 tX_selection_customview = t3_change_customview(ACTION_BUTTON_ENTER); |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
979 } |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
980 last_customview = tX_selection_customview; |
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
981 } |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
982 |
38 | 983 switch(tX_selection_customview) |
984 { | |
985 case CVIEW_T3_ApnoeSurfaceInfo: | |
986 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
987 | |
413 | 988 if(!pSettings->FlipDisplay) |
989 { | |
990 GFX_write_string(&FontT42,tXc1,text,0); | |
991 tXc1->WindowY0 = 100; | |
992 } | |
993 else | |
994 { | |
995 GFX_write_string(&FontT42,tXc2,text,0); | |
996 tXc2->WindowY1 -= 100; /* jump to upper of two lines */ | |
997 } | |
38 | 998 |
999 snprintf(text,TEXTSIZE,"\020\016%01.1f",unit_depth_float(stateUsed->lifeData.apnea_last_max_depth_meter)); | |
1000 t3_basics_colorscheme_mod(text); | |
413 | 1001 |
1002 if(!pSettings->FlipDisplay) | |
1003 { | |
1004 GFX_write_string(&FontT105,tXc1,text,0); | |
1005 tXc1->WindowY0 = tempWinY0; | |
1006 } | |
1007 else | |
1008 { | |
1009 GFX_write_string(&FontT105,tXc2,text,0); | |
1010 tXc2->WindowY1 = tempWinC2Y1; /* jump to upper of two lines */ | |
1011 } | |
38 | 1012 |
1013 | |
1014 snprintf(text,TEXTSIZE,"\020\016%01.1f",unit_depth_float(stateUsed->lifeData.apnea_total_max_depth_meter)); | |
1015 t3_basics_colorscheme_mod(text); | |
413 | 1016 if(!pSettings->FlipDisplay) |
1017 { | |
1018 GFX_write_string(&FontT105,tXc1,text,0); | |
1019 } | |
1020 else | |
1021 { | |
1022 GFX_write_string(&FontT105,tXc2,text,0); | |
1023 } | |
38 | 1024 break; |
1025 | |
1026 case CVIEW_T3_StopWatch: | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1027 |
38 | 1028 Stopwatch.Total = timer_Stopwatch_GetTime(); |
1029 Stopwatch.Minutes = Stopwatch.Total / 60; | |
1030 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
1031 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
1032 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
1033 | |
1034 snprintf(text,TEXTSIZE,"\032\f%c",TXT_AvgDepth); | |
1035 GFX_write_string(&FontT42,tXc1,text,0); | |
1036 snprintf(text,TEXTSIZE,"\030\003\016%01.1f",unit_depth_float(fAverageDepthAbsolute)); | |
1037 GFX_write_string(&FontT105,tXc1,text,0); | |
1038 | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1039 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1040 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1041 tXc1->WindowX0 = 480; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1042 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1043 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1044 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1045 tXc1->WindowX1 = 320; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1046 tXc1->WindowY0 = t3c1.WindowY0; /* select customer window */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1047 } |
38 | 1048 // 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
|
1049 |
38 | 1050 snprintf(text,TEXTSIZE,"\032\f%c", TXT_Stopwatch); |
1051 GFX_write_string(&FontT42,tXc1,text,0); | |
1052 snprintf(text,TEXTSIZE,"\030\016%01.1f",unit_depth_float(fAverageDepth)); | |
1053 GFX_write_string(&FontT105,tXc1,text,0); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1054 if(!pSettings->FlipDisplay) |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1055 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1056 tXc1->WindowY0 = 100; |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1057 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1058 else |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1059 { |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1060 tXc1->WindowY1 -= 100; /* jump to upper of two lines */ |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1061 } |
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1062 |
38 | 1063 snprintf(text,TEXTSIZE,"\030%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); |
1064 GFX_write_string(&FontT105,tXc1,text,0); | |
110
cc8e24374b83
Added option to handled mirrored display to existing functions
Ideenmodellierer
parents:
38
diff
changeset
|
1065 |
496 | 1066 break; |
38 | 1067 |
1068 case CVIEW_T3_GasList: | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1069 gasPosIdx = 0; |
38 | 1070 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Gaslist); |
1071 GFX_write_string(&FontT42,tXc1,text,0); | |
1072 | |
1073 textpointer = 0; | |
1074 tXc2->WindowX0 = 0; | |
518 | 1075 tXc2->WindowTab = 800/3; // /2 |
38 | 1076 |
413 | 1077 if(pSettings->FlipDisplay) |
1078 { | |
1079 tXc2->WindowY1 = 0; | |
1080 } | |
1081 | |
38 | 1082 pGasLine = settingsGetPointer()->gas; |
1083 if(actualLeftMaxDepth(stateUsed)) | |
1084 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_deco) / 100; | |
1085 else | |
1086 fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_std) / 100; | |
1087 fPpO2limitLow = (float)(settingsGetPointer()->ppO2_min) / 100; | |
1088 for(int gasId=1;gasId<=NUM_GASES;gasId++) | |
1089 { | |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1090 #ifdef ENABLE_UNUSED_GAS_HIDING |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1091 if(!pGasLine[gasId].note.ub.off) |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1092 { |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1093 #endif |
38 | 1094 textpointer = 0; |
518 | 1095 text[textpointer++] = '\003'; |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1096 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1097 lineNumber = 1; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1098 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1099 switch(gasPosIdx) |
38 | 1100 { |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1101 case 0: lineNumber = 0; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1102 case 1: |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1103 break; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1104 case 4: text[textpointer++] = '\001'; /* display centered */ |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1105 break; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1106 case 2: lineNumber = 0; |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1107 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
|
1108 default: |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1109 break; |
38 | 1110 } |
527
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1111 gasPosIdx++; |
518 | 1112 |
38 | 1113 fPpO2ofGasAtThisDepth = (stateUsed->lifeData.pressure_ambient_bar - WATER_VAPOUR_PRESSURE) * pGasLine[gasId].oxygen_percentage / 100; |
1114 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
|
1115 strcpy(&text[textpointer++],"\031"); |
518 | 1116 else if(stateUsed->lifeData.actualGas.GasIdInSettings == gasId) /* actual selected gas */ |
1117 { | |
1118 strcpy(&text[textpointer++],"\030"); | |
1119 } | |
38 | 1120 else if((fPpO2ofGasAtThisDepth > fPpO2limitHigh) || (fPpO2ofGasAtThisDepth < fPpO2limitLow)) |
1121 strcpy(&text[textpointer++],"\025"); | |
518 | 1122 else if(actualBetterGasId() == gasId) |
1123 { | |
1124 strcpy(&text[textpointer++],"\026"); /* Highlight better gas */ | |
1125 } | |
38 | 1126 else |
518 | 1127 strcpy(&text[textpointer++],"\023"); /* Blue for travel or deco without special state */ |
38 | 1128 |
1129 text[textpointer++] = ' '; | |
1130 oxygen = pGasLine[gasId].oxygen_percentage; | |
1131 helium = pGasLine[gasId].helium_percentage; | |
1132 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
|
1133 |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1134 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
|
1135 { |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1136 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
|
1137 } |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1138 text[textpointer++] = 0; |
518 | 1139 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
|
1140 #ifdef ENABLE_UNUSED_GAS_HIDING |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1141 } |
962d7b2c18c6
Do not show gases in "Off" state in custom gas list:
Ideenmodellierer
parents:
518
diff
changeset
|
1142 #endif |
38 | 1143 } |
1144 break; | |
1145 | |
1146 case CVIEW_T3_Temperature: | |
1147 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
1148 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
|
1149 |
8b8074080d7b
Bugfix: average temperature on arrival from RTE instead of display time
Jan Mulder <jlmulder@xs4all.nl>
parents:
174
diff
changeset
|
1150 temperature = unit_temperature_float(stateUsed->lifeData.temperature_celsius); |
38 | 1151 textpointer = snprintf(text,TEXTSIZE,"\030\003\016%01.1f \140",temperature); // "\016\016%01.1f `" + C or F |
1152 if(settingsGetPointer()->nonMetricalSystem == 0) | |
1153 text[textpointer++] = 'C'; | |
1154 else | |
1155 text[textpointer++] = 'F'; | |
1156 text[textpointer++] = 0; | |
1157 GFX_write_string(&FontT105,tXc1,text,0); | |
1158 break; | |
1159 | |
1160 case CVIEW_Compass: | |
496 | 1161 center.x = 600; |
1162 center.y = 116; | |
38 | 1163 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); |
1164 GFX_write_string(&FontT42,tXc1,text,0); | |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
1165 snprintf(text,100,"\030\003%03i`",heading); |
38 | 1166 GFX_write_string(&FontT105,tXc1,text,0); |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
1167 t3_basics_compass(tXscreen, center, heading, stateUsed->diveSettings.compassHeading); |
38 | 1168 break; |
601 | 1169 #ifdef ENABLE_T3_PROFILE_VIEW |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
1170 case CVIEW_T3_Profile: |
599 | 1171 snprintf(text,100,"\032\f\002%c%c",TXT_2BYTE,TXT2BYTE_Profile); |
592
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
1172 GFX_write_string(&FontT42,tXc1,text,0); |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
1173 t3_miniLiveLogProfile(); |
f52bc70e380f
MotionCtrl - Sectorview Map sectors directly to custom views:
Ideenmodellierer
parents:
582
diff
changeset
|
1174 break; |
601 | 1175 #endif |
542
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1176 case CVIEW_T3_DecoTTS: |
38 | 1177 case CVIEW_T3_Decostop: |
1178 default: | |
1179 // decostop | |
1180 if(pDecoinfo->output_time_to_surface_seconds) | |
1181 { | |
1182 tHome_findNextStop(pDecoinfo->output_stop_length_seconds, &nextstopDepthMeter, &nextstopLengthSeconds); | |
1183 } | |
1184 else | |
1185 { | |
1186 nextstopDepthMeter = 0; | |
1187 nextstopLengthSeconds = 0; | |
1188 } | |
1189 | |
1190 SafetyStopTime.Total = timer_Safetystop_GetCountDown(); | |
1191 SafetyStopTime.Minutes = SafetyStopTime.Total / 60; | |
1192 SafetyStopTime.Seconds = SafetyStopTime.Total - (SafetyStopTime.Minutes * 60); | |
1193 | |
1194 if(nextstopDepthMeter) | |
1195 { | |
1196 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Decostop); | |
1197 GFX_write_string(&FontT42,tXc1,text,0); | |
1198 | |
1199 textpointer = 0; | |
1200 snprintf(&text[textpointer],TEXTSIZE,"\020\003%u%c%c %u'" | |
542
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1201 , unit_depth_integer(nextstopDepthMeter) |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1202 , unit_depth_char1_T105() |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1203 , unit_depth_char2_T105() |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1204 , (nextstopLengthSeconds+59)/60); |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1205 t3_basics_colorscheme_mod(text); |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1206 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1207 } |
1208 else if(SafetyStopTime.Total && (depth > timer_Safetystop_GetDepthUpperLimit())) | |
1209 { | |
1210 textpointer = 0; | |
1211 snprintf(&text[textpointer],TEXTSIZE,"\032\f%c%c",TXT_2BYTE,TXT2BYTE_SafetyStop2); | |
1212 GFX_write_string(&FontT42,tXc1,text,0); | |
1213 | |
1214 textpointer = 0; | |
1215 snprintf(&text[textpointer],TEXTSIZE,"\020\003\016%u:%02u",SafetyStopTime.Minutes,SafetyStopTime.Seconds); | |
1216 t3_basics_colorscheme_mod(text); | |
496 | 1217 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1218 } |
237
ec16fd26e280
Bugfix: do not show NDL in bigscreen mode when zero
Jan Mulder <jlmulder@xs4all.nl>
parents:
214
diff
changeset
|
1219 else if(pDecoinfo->output_ndl_seconds) // NDL |
38 | 1220 { |
1221 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Nullzeit); | |
1222 GFX_write_string(&FontT42,tXc1,text,0); | |
1223 if(pDecoinfo->output_ndl_seconds < 1000 * 60) | |
1224 snprintf(text,TEXTSIZE,"\020\003%i'",pDecoinfo->output_ndl_seconds/60); | |
1225 else | |
1226 snprintf(text,TEXTSIZE,"\020\003%ih",pDecoinfo->output_ndl_seconds/3600); | |
1227 t3_basics_colorscheme_mod(text); | |
496 | 1228 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1229 } |
542
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1230 |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1231 if(tX_selection_customview == CVIEW_T3_DecoTTS) /* add tts data on right side of screen */ |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1232 { |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1233 if(pDecoinfo->output_time_to_surface_seconds) |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1234 { |
722 | 1235 snprintf(text,TEXTSIZE,"\002\032\f%c",TXT_TTS); |
1236 GFX_write_string(&FontT42,tXc1,text,0); | |
1237 if(pDecoinfo->output_time_to_surface_seconds) | |
1238 { | |
1239 if(pDecoinfo->output_time_to_surface_seconds < 100 * 60) | |
1240 snprintf(text,TEXTSIZE,"\020\003\002%i'",(pDecoinfo->output_time_to_surface_seconds + 59)/ 60); | |
1241 else | |
1242 snprintf(text,TEXTSIZE,"\020\003\002%ih",(pDecoinfo->output_time_to_surface_seconds + 59)/ 3600); | |
1243 t3_basics_colorscheme_mod(text); | |
1244 GFX_write_string(&FontT105,tXc1,text,0); | |
1245 } | |
1246 } | |
1247 else if(pDecoinfo->super_saturation > 0.1) | |
1248 { | |
1249 snprintf(text,TEXTSIZE,"\002\032\f%c",TXT_ActualGradient); | |
1250 GFX_write_string(&FontT42,tXc1,text,0); | |
1251 snprintf(text,TEXTSIZE,"\020\003\002%.0f\016\016%%\017",100 * pDecoinfo->super_saturation); | |
542
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1252 t3_basics_colorscheme_mod(text); |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1253 GFX_write_string(&FontT105,tXc1,text,0); |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1254 } |
6960df7ddb09
Added new t3 view showing first deco stop and tts in parallel:
Ideenmodellierer
parents:
541
diff
changeset
|
1255 } |
38 | 1256 break; |
1257 | |
1258 case CVIEW_sensors: | |
1259 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE,TXT2BYTE_O2monitor); | |
1260 GFX_write_string(&FontT42,tXc1,text,0); | |
1261 | |
1262 for(int i=0;i<3;i++) | |
1263 { | |
1264 textpointer = 0; | |
1265 text[textpointer++] = '\030'; | |
1266 if(i==1) | |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1267 text[textpointer++] = '\001'; /* center */ |
38 | 1268 else if(i==2) |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1269 text[textpointer++] = '\002'; /* right */ |
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1270 |
577
9bb9a52d6ae5
Handle o2 voltage values < 0.5mV as invalid:
Ideenmodellierer
parents:
564
diff
changeset
|
1271 if((stateUsed->diveSettings.ppo2sensors_deactivated & (1<<i)) || (stateUsed->lifeData.ppO2Sensor_bar[i] == 0.0)) |
38 | 1272 { |
662 | 1273 #ifdef ENABLE_PSCR_MODE |
1274 if((stateUsed->diveSettings.diveMode == DIVEMODE_PSCR) && (showSimPPO2) && (stateUsed->mode == MODE_DIVE)) /* display ppo2 sim in blue letters in case a slot is not used in the ppo2 custom view */ | |
1275 { | |
1276 text[textpointer++] = '\023'; | |
1277 textpointer += snprintf(&text[textpointer],TEXTSIZE,"%.2f",stateUsed->lifeData.ppo2Simulated_bar); | |
1278 showSimPPO2 = 0; | |
1279 } | |
1280 else | |
1281 #endif | |
1282 { | |
1283 text[textpointer++] = '\031'; | |
1284 text[textpointer++] = ' '; | |
1285 text[textpointer++] = '-'; | |
1286 text[textpointer++] = ' '; | |
1287 text[textpointer++] = 0; | |
1288 } | |
38 | 1289 } |
1290 else | |
1291 { | |
1292 if(stateUsed->warnings.sensorOutOfBounds[i]) | |
1293 text[textpointer++] = '\025'; | |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1294 textpointer += snprintf(&text[textpointer],TEXTSIZE,"%.2f",stateUsed->lifeData.ppO2Sensor_bar[i]); |
38 | 1295 } |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1296 GFX_write_string(&FontT105,tXc1,text,0); |
656 | 1297 |
1298 | |
662 | 1299 if((pSettings->scrubTimerMode != SCRUB_TIMER_OFF) && isLoopMode(pSettings->dive_mode)) |
656 | 1300 { |
1301 snprintf(text,TEXTSIZE,"\032\002\f%c",TXT_ScrubTime); | |
1302 GFX_write_string(&FontT42,tXc1,text,0); | |
1303 | |
758
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1304 textpointer = 0; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1305 text[textpointer++] = '\002'; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1306 textpointer += printScrubberText(&text[textpointer], 10, pSettings); |
656 | 1307 GFX_write_string(&FontT105,tXc1,text,1); |
1308 } | |
38 | 1309 } |
1310 break; | |
1311 | |
1312 case CVIEW_T3_MaxDepth: | |
1313 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
413 | 1314 if(pSettings->FlipDisplay) |
1315 { | |
1316 if(mode == DIVEMODE_Apnea) | |
1317 { | |
1318 GFX_write_string(&FontT42,tXc2,text,0); | |
1319 } | |
1320 else | |
1321 { | |
1322 GFX_write_string(&FontT42,tXc1,text,0); | |
1323 } | |
1324 } | |
1325 else | |
1326 { | |
1327 GFX_write_string(&FontT42,tXc1,text,0); | |
1328 } | |
38 | 1329 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); |
1330 t3_basics_colorscheme_mod(text); | |
413 | 1331 if(pSettings->FlipDisplay) |
1332 { | |
1333 if(mode == DIVEMODE_Apnea) | |
1334 { | |
1335 GFX_write_string(&FontT105,tXc2,text,0); | |
1336 } | |
1337 else | |
1338 { | |
1339 GFX_write_string(&FontT105,tXc1,text,0); | |
1340 } | |
1341 } | |
1342 else | |
1343 { | |
496 | 1344 GFX_write_string(&FontT105,tXc1,text,0); |
413 | 1345 } |
38 | 1346 break; |
1347 | |
1348 case CVIEW_T3_TTS: | |
1349 snprintf(text,TEXTSIZE,"\032\f%c",TXT_TTS); | |
1350 GFX_write_string(&FontT42,tXc1,text,0); | |
1351 if(pDecoinfo->output_time_to_surface_seconds) | |
1352 { | |
1353 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
|
1354 snprintf(text,TEXTSIZE,"\020\003\002%i'",(pDecoinfo->output_time_to_surface_seconds + 59)/ 60); |
38 | 1355 else |
214
51a3aeffc6b3
Bugfix: handle rounding of TTS and future TTS consistently
Jan Mulder <jlmulder@xs4all.nl>
parents:
189
diff
changeset
|
1356 snprintf(text,TEXTSIZE,"\020\003\002%ih",(pDecoinfo->output_time_to_surface_seconds + 59)/ 3600); |
38 | 1357 t3_basics_colorscheme_mod(text); |
496 | 1358 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1359 } |
1360 break; | |
1361 | |
1362 case CVIEW_T3_ppO2andGas: | |
1363 snprintf(text,TEXTSIZE,"\032\f%c",TXT_ppO2); | |
1364 GFX_write_string(&FontT42,tXc1,text,0); | |
1365 snprintf(text,TEXTSIZE,"\020\003%01.2f",stateUsed->lifeData.ppO2); | |
1366 t3_basics_colorscheme_mod(text); | |
496 | 1367 GFX_write_string(&FontT105,tXc1,text,0); |
38 | 1368 |
1369 textpointer = 0; | |
1370 text[textpointer++] = '\020'; | |
1371 text[textpointer++] = '\003'; | |
1372 oxygen_percentage = 100; | |
1373 oxygen_percentage -= stateUsed->lifeData.actualGas.nitrogen_percentage; | |
1374 oxygen_percentage -= stateUsed->lifeData.actualGas.helium_percentage; | |
1375 text[textpointer++] = '\002'; | |
1376 tHome_gas_writer(oxygen_percentage,stateUsed->lifeData.actualGas.helium_percentage,&text[textpointer]); | |
1377 //textpointer = snprintf(&text[textpointer],TEXTSIZE,"\020\002%02u/%02u",oxygen_percentage, stateUsed->lifeData.actualGas.helium_percentage); | |
1378 t3_basics_colorscheme_mod(text); | |
496 | 1379 GFX_write_string(&FontT48,tXc1,text,0); |
38 | 1380 break; |
496 | 1381 |
1382 case CVIEW_T3_Navigation: | |
1383 Stopwatch.Total = timer_Stopwatch_GetTime(); | |
1384 Stopwatch.Minutes = Stopwatch.Total / 60; | |
1385 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
1386 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
1387 | |
1388 if(!pSettings->FlipDisplay) | |
1389 { | |
1390 tXc2->WindowX0 = 550; | |
1391 } | |
1392 else | |
1393 { | |
1394 tXc2->WindowX1 = 800; | |
1395 tXc2->WindowY0 = t3c2.WindowY0; /* select customer window */ | |
1396 } | |
1397 | |
1398 snprintf(text,TEXTSIZE,"\032\002\f%c", TXT_Stopwatch); | |
511 | 1399 GFX_write_string(&FontT42,tXc1,text,0); |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1400 snprintf(text,TEXTSIZE,"\030\002\016%01.1f",unit_depth_float(fAverageDepth)); |
511 | 1401 GFX_write_string(&FontT105,tXc1,text,0); |
496 | 1402 if(!pSettings->FlipDisplay) |
1403 { | |
1404 tXc2->WindowY0 = 100; | |
1405 } | |
1406 else | |
1407 { | |
1408 tXc2->WindowY1 -= 100; /* jump to upper of two lines */ | |
1409 } | |
1410 | |
1411 snprintf(text,TEXTSIZE,"\030\002%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); | |
511 | 1412 GFX_write_string(&FontT105,tXc1,text,1); |
496 | 1413 |
1414 | |
1415 center.x = 400; | |
1416 center.y = 116; | |
1417 | |
1418 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); | |
1419 GFX_write_string(&FontT42,tXc1,text,0); | |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
1420 snprintf(text,100,"\030%03i`",heading); |
496 | 1421 GFX_write_string(&FontT144,tXc1,text,0); |
539
d784f281833a
Added inertia simulation for compass heading:
Ideenmodellierer
parents:
529
diff
changeset
|
1422 t3_basics_compass(tXscreen, center, heading, stateUsed->diveSettings.compassHeading); |
496 | 1423 |
1424 break; | |
1425 | |
1426 case CVIEW_T3_DepthData: | |
1427 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
1428 if(pSettings->FlipDisplay) | |
1429 { | |
1430 if(mode == DIVEMODE_Apnea) | |
1431 { | |
1432 GFX_write_string(&FontT42,tXc2,text,0); | |
1433 } | |
1434 else | |
1435 { | |
1436 GFX_write_string(&FontT42,tXc1,text,0); | |
1437 } | |
1438 } | |
1439 else | |
1440 { | |
1441 GFX_write_string(&FontT42,tXc1,text,0); | |
1442 } | |
1443 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); | |
1444 t3_basics_colorscheme_mod(text); | |
1445 if(pSettings->FlipDisplay) | |
1446 { | |
1447 if(mode == DIVEMODE_Apnea) | |
1448 { | |
1449 GFX_write_string(&FontT105,tXc2,text,0); | |
1450 } | |
1451 else | |
1452 { | |
1453 GFX_write_string(&FontT105,tXc1,text,0); | |
1454 } | |
1455 } | |
1456 else | |
1457 { | |
1458 GFX_write_string(&FontT105,tXc1,text,0); | |
1459 } | |
1460 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
1461 snprintf(text,TEXTSIZE,"\032\002\f%c",TXT_AvgDepth); | |
511 | 1462 GFX_write_string(&FontT42,tXc1,text,0); |
496 | 1463 |
564
5e0a75e2f00b
Bugfix One or more deactivated sensors hide sensor display:
Ideenmodellierer
parents:
553
diff
changeset
|
1464 snprintf(text,TEXTSIZE,"\020\003\002\016\%01.1f",unit_depth_float(fAverageDepthAbsolute)); |
511 | 1465 GFX_write_string(&FontT105,tXc1,text,0); |
496 | 1466 break; |
38 | 1467 } |
496 | 1468 |
1469 | |
1470 | |
38 | 1471 tXc1->WindowX0 = tempWinX0; |
1472 tXc1->WindowY0 = tempWinY0; | |
496 | 1473 tXc1->WindowX1 = tempWinX1; |
1474 tXc1->WindowY1 = tempWinY1; | |
413 | 1475 |
38 | 1476 tXc2->WindowX0 = tempWinC2X0; |
413 | 1477 tXc2->WindowY0 = tempWinC2Y0; |
1478 tXc2->WindowX1 = tempWinC2X1; | |
1479 tXc2->WindowY1 = tempWinC2Y1; | |
38 | 1480 tXc2->WindowTab = tempWinC2Tab; |
1481 } | |
1482 | |
1483 | |
1484 uint8_t t3_test_customview_warnings(void) | |
1485 { | |
1486 uint8_t count = 0; | |
1487 | |
1488 count = 0; | |
1489 count += stateUsed->warnings.decoMissed; | |
1490 count += stateUsed->warnings.ppO2Low; | |
1491 count += stateUsed->warnings.ppO2High; | |
1492 //count += stateUsed->warnings.lowBattery; | |
1493 count += stateUsed->warnings.sensorLinkLost; | |
1494 count += stateUsed->warnings.fallback; | |
1495 | |
1496 return count; | |
1497 } | |
1498 | |
1499 //void t3_show_customview_warnings(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode) | |
1500 void t3_basics_show_customview_warnings(GFX_DrawCfgWindow* tXc1) | |
1501 { | |
1502 char text[256], textMain[256]; | |
1503 uint8_t textpointer, textpointerMain, lineFree, more; | |
1504 | |
1505 snprintf(text,TEXTSIZE,"\025\f%c",TXT_Warning); | |
1506 GFX_write_string(&FontT42,&t3c1,text,0); | |
1507 | |
1508 lineFree = 1; | |
1509 more = 0; | |
1510 | |
1511 textpointerMain = 0; | |
511 | 1512 textMain[textpointerMain++] = '\025'; /* red */ |
1513 textMain[textpointerMain++] = '\003'; /* doublesize */ | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1514 textMain[textpointerMain++] = TXT_2BYTE; /* There is only one Main warning to be displayed */ |
38 | 1515 |
1516 textpointer = 0; | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1517 text[textpointer++] = '\025'; /* red */ |
38 | 1518 |
1519 if(stateUsed->warnings.decoMissed) | |
1520 { | |
1521 if(lineFree) | |
1522 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1523 textMain[textpointerMain++] = TXT2BYTE_WarnDecoMissed; |
38 | 1524 lineFree--; |
1525 } | |
1526 else | |
1527 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1528 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1529 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1530 text[textpointer++] = TXT2BYTE_WarnDecoMissed; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1531 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1532 text[textpointer++] = '\n'; |
38 | 1533 more++; |
1534 } | |
1535 } | |
1536 | |
1537 if(stateUsed->warnings.ppO2Low) | |
1538 { | |
1539 if(lineFree) | |
1540 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1541 textMain[textpointerMain++] = TXT2BYTE_WarnPPO2Low; |
38 | 1542 lineFree--; |
1543 } | |
1544 else | |
1545 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1546 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1547 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1548 text[textpointer++] = TXT2BYTE_WarnPPO2Low; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1549 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1550 text[textpointer++] = '\n'; |
38 | 1551 more++; |
1552 } | |
1553 } | |
1554 | |
1555 if(stateUsed->warnings.ppO2High) | |
1556 { | |
1557 if(lineFree) | |
1558 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1559 textMain[textpointerMain++] = TXT2BYTE_WarnPPO2High; |
38 | 1560 lineFree--; |
1561 } | |
1562 else | |
1563 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1564 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1565 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1566 text[textpointer++] = TXT2BYTE_WarnPPO2High; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1567 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1568 text[textpointer++] = '\n'; |
38 | 1569 more++; |
1570 } | |
1571 } | |
1572 | |
1573 if(stateUsed->warnings.fallback) | |
1574 { | |
1575 if(lineFree) | |
1576 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1577 textMain[textpointerMain++] = TXT2BYTE_WarnFallback; |
38 | 1578 lineFree--; |
1579 } | |
1580 else | |
1581 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1582 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1583 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1584 text[textpointer++] = TXT2BYTE_WarnFallback; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1585 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1586 text[textpointer++] = '\n'; |
38 | 1587 more++; |
1588 } | |
1589 } | |
1590 | |
1591 if(stateUsed->warnings.sensorLinkLost) | |
1592 { | |
1593 if(lineFree) | |
1594 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1595 textMain[textpointerMain++] = TXT2BYTE_WarnSensorLinkLost; |
38 | 1596 lineFree--; |
1597 } | |
1598 else | |
1599 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1600 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1601 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1602 text[textpointer++] = TXT2BYTE_WarnSensorLinkLost; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1603 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1604 text[textpointer++] = '\n'; |
38 | 1605 more++; |
1606 } | |
1607 } | |
1608 | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1609 if(stateUsed->warnings.co2High) |
38 | 1610 { |
1611 if(lineFree) | |
1612 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1613 textMain[textpointerMain++] = TXT2BYTE_WarnCO2High; |
38 | 1614 } |
1615 else | |
1616 { | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1617 text[textpointer++] = '\002'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1618 text[textpointer++] = TXT_2BYTE; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1619 text[textpointer++] = TXT2BYTE_WarnCO2High; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1620 text[textpointer++] = '\r'; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1621 text[textpointer++] = '\n'; |
38 | 1622 more++; |
1623 } | |
1624 } | |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1625 |
38 | 1626 text[textpointer] = 0; |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1627 textMain[textpointerMain] = 0; |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1628 |
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1629 if(lineFree == 0) |
38 | 1630 { |
755
92bf7bf9fb8a
Cleanup display of multiple warnings in T3 (Big font) view:
Ideenmodellierer
parents:
739
diff
changeset
|
1631 GFX_write_string(&FontT48,&t3c1,textMain,0); |
38 | 1632 } |
1633 if(more) | |
1634 { | |
511 | 1635 GFX_write_string(&FontT48,&t3c2,text,0); |
38 | 1636 } |
1637 } | |
1638 | |
496 | 1639 uint8_t t3_customview_disabled(uint8_t view) |
1640 { | |
1641 uint8_t i = 0; | |
1642 uint8_t cv_disabled = 0; | |
1643 const uint8_t *pcv_changelist; | |
1644 uint32_t cv_config = settingsGetPointer()->cv_config_BigScreen; | |
1645 | |
511 | 1646 pcv_changelist = cv_changelist_BS; |
496 | 1647 |
1648 while(pcv_changelist[i] != CVIEW_T3_END) | |
1649 { | |
1650 if((view == pcv_changelist[i]) && !CHECK_BIT_THOME(cv_config, pcv_changelist[i])) | |
1651 { | |
1652 cv_disabled = 1; | |
1653 break; | |
1654 } | |
1655 i++; | |
1656 } | |
1657 | |
1658 if (((view == CVIEW_sensors) || (view == CVIEW_sensors_mV)) && | |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
1659 ((stateUsed->diveSettings.ppo2sensors_deactivated == 0x07) || (stateUsed->diveSettings.ccrOption == 0) || stateUsed->warnings.fallback)) |
496 | 1660 { |
1661 cv_disabled = 1; | |
1662 } | |
1663 | |
1664 return cv_disabled; | |
1665 } | |
38 | 1666 |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
1667 uint8_t t3_change_customview(uint8_t action) |
38 | 1668 { |
511 | 1669 |
496 | 1670 t3_basics_change_customview(&t3_selection_customview, t3_customviewsStandard, action); |
582
64bf41faab83
Show Fallback if no valid sensor value is available:
Ideenmodellierer
parents:
577
diff
changeset
|
1671 return t3_selection_customview; |
38 | 1672 } |
1673 | |
1674 | |
511 | 1675 void t3_basics_change_customview(uint8_t *tX_selection_customview,const uint8_t *tX_customviews, uint8_t action) |
38 | 1676 { |
511 | 1677 uint8_t curViewIdx = 0xff; |
1678 uint8_t index = 0; | |
599 | 1679 uint8_t indexOverrun = 0; |
511 | 1680 uint8_t lastViewIdx = 0; |
599 | 1681 uint8_t iterate = 0; /* set to 1 if a view has to be skipped */ |
1682 uint8_t useFallback = 0; /* is set if the current view is disabled */ | |
1683 uint8_t fallbackSelection = CVIEW_noneOrDebug; /* show "None" view per default */ | |
38 | 1684 |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1685 /* set pointer to currently selected view and count number of entries */ |
511 | 1686 while((tX_customviews[index] != CVIEW_T3_END)) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1687 { |
511 | 1688 if (tX_customviews[index] == *tX_selection_customview) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1689 { |
511 | 1690 curViewIdx = index; |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1691 } |
511 | 1692 index++; |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1693 } |
511 | 1694 if(curViewIdx == 0xff) /* called with unknown view */ |
496 | 1695 { |
511 | 1696 curViewIdx = 0; |
599 | 1697 *tX_selection_customview = CVIEW_noneOrDebug; /* show "None" view per default */ |
496 | 1698 } |
511 | 1699 lastViewIdx = index; |
1700 index = curViewIdx; | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1701 do |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1702 { |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1703 iterate = 0; |
496 | 1704 switch(action) |
1705 { | |
1706 case ACTION_BUTTON_ENTER: | |
1707 case ACTION_PITCH_POS: | |
1708 | |
511 | 1709 if(tX_customviews[index] != CVIEW_T3_END) |
496 | 1710 { |
511 | 1711 index++; |
1712 } | |
1713 if(tX_customviews[index] == CVIEW_T3_END) | |
1714 { | |
1715 index = 0; | |
599 | 1716 indexOverrun = 1; |
496 | 1717 } |
1718 break; | |
1719 case ACTION_PITCH_NEG: | |
511 | 1720 if(index == 0) |
496 | 1721 { |
511 | 1722 index = lastViewIdx - 1; |
599 | 1723 indexOverrun = 1; |
496 | 1724 } |
1725 else | |
1726 { | |
511 | 1727 index--; |
496 | 1728 } |
1729 break; | |
1730 default: | |
1731 break; | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1732 } |
496 | 1733 |
511 | 1734 if(t3_customview_disabled(tX_customviews[index])) |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1735 { |
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1736 iterate = 1; |
599 | 1737 if(*tX_selection_customview == tX_customviews[index]) |
1738 { | |
1739 useFallback = 1; /* the provided view is disabled => use fallback */ | |
1740 } | |
386
39c147e47c1c
Added key direction awarness to t3, t5 and t6 views:
ideenmodellierer
parents:
384
diff
changeset
|
1741 } |
599 | 1742 else /* special case which are enabled but not to be displayed at the moment */ |
1743 { | |
1744 if(settingsGetPointer()->MotionDetection != MOTION_DETECT_SECTOR) /* no hiding in case of active sector view option (fixed mapping would change during dive) */ | |
1745 { | |
788
4abfb8a2a435
Define explicit setpoints for low / high / deco. Add an option to delay the switch to SPlow until all decompression has been cleared. (mikeller)
heinrichsweikamp
parents:
758
diff
changeset
|
1746 const SDecoinfo * pDecoinfo = getDecoInfo(); |
601 | 1747 /* Skip TTS if value is 0 */ |
1748 if((tX_customviews[index] == CVIEW_T3_TTS) && (!pDecoinfo->output_time_to_surface_seconds)) | |
599 | 1749 { |
601 | 1750 if(*tX_selection_customview == tX_customviews[index]) |
1751 { | |
1752 useFallback = 1; /* the provided view is disabled => use fallback */ | |
1753 } | |
599 | 1754 iterate = 1; |
601 | 1755 if(fallbackSelection == CVIEW_noneOrDebug) |
1756 { | |
1757 fallbackSelection = CVIEW_T3_TTS; | |
1758 } | |
599 | 1759 } |
601 | 1760 /* Skip Deco if NDL is not set */ |
1761 if((tX_customviews[index] == CVIEW_T3_Decostop) && ((!pDecoinfo->output_ndl_seconds) && (!pDecoinfo->output_time_to_surface_seconds) && (timer_Safetystop_GetCountDown() == 0))) | |
599 | 1762 { |
601 | 1763 if(*tX_selection_customview == tX_customviews[index]) |
1764 { | |
1765 useFallback = 1; /* the provided view is disabled => use fallback */ | |
1766 } | |
1767 fallbackSelection = CVIEW_T3_Decostop; | |
599 | 1768 iterate = 1; |
1769 } | |
1770 } | |
1771 } | |
1772 if((iterate) && (action == ACTION_END)) /* ACTION_END is used to check the enable state of the provided view. If it is enable the function will return without change */ | |
496 | 1773 { |
1774 action = ACTION_BUTTON_ENTER; | |
1775 } | |
599 | 1776 }while ((iterate == 1) && (!((indexOverrun == 1) && (*tX_selection_customview == tX_customviews[index])))); /* no other available view found => use fallback */ |
38 | 1777 |
599 | 1778 if(*tX_selection_customview == tX_customviews[index]) |
1779 { | |
1780 if(useFallback) | |
1781 { | |
1782 *tX_selection_customview = fallbackSelection; /* no active view found => keep actual view or change to fallback if actual view is deactivated */ | |
1783 } | |
1784 } | |
1785 else | |
1786 { | |
1787 *tX_selection_customview = tX_customviews[index]; | |
1788 } | |
38 | 1789 } |
1790 | |
1791 | |
1792 void t3_basics_colorscheme_mod(char *text) | |
1793 { | |
1794 if((text[0] == '\020') && !GFX_is_colorschemeDiveStandard()) | |
1795 { | |
1796 text[0] = '\027'; | |
1797 } | |
1798 } | |
1799 | |
1800 | |
496 | 1801 point_t t3_compass_circle(uint8_t id, uint16_t degree, point_t center) |
38 | 1802 { |
1803 float fCos, fSin; | |
1804 const float piMult = ((2 * 3.14159) / 360); | |
1805 // const int radius[4] = {95,105,115,60}; | |
1806 const int radius[4] = {85,95,105,90}; | |
496 | 1807 static point_t forcenter = {.x = 900, .y = 500}; /* used to identify change of circle position */ |
38 | 1808 static point_t r[4][360] = { 0 }; |
1809 | |
496 | 1810 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 | 1811 { |
1812 for(int i=0;i<360;i++) | |
1813 { | |
1814 fCos = cos(i * piMult); | |
1815 fSin = sin(i * piMult); | |
1816 for(int j=0;j<4;j++) | |
1817 { | |
496 | 1818 r[j][i].x = center.x + (int)(fSin * radius[j]); |
1819 r[j][i].y = center.y + (int)(fCos * radius[j]); | |
38 | 1820 } |
1821 } | |
496 | 1822 forcenter.x = center.x; |
1823 forcenter.y = center.y; | |
38 | 1824 } |
1825 if(id > 3) id = 0; | |
1826 if(degree > 359) degree = 0; | |
1827 return r[id][degree]; | |
1828 } | |
1829 | |
1830 | |
496 | 1831 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading) |
38 | 1832 { |
496 | 1833 uint8_t loop = 0; |
38 | 1834 uint16_t LineHeading; |
496 | 1835 |
38 | 1836 static int32_t LastHeading = 0; |
1837 int32_t newHeading = 0; | |
1838 int32_t diff = 0; | |
1839 int32_t diff2 = 0; | |
1840 | |
1841 int32_t diffAbs = 0; | |
1842 int32_t diffAbs2 = 0; | |
1843 | |
1844 newHeading = ActualHeading; | |
1845 | |
1846 diff = newHeading - LastHeading; | |
1847 | |
1848 if(newHeading < LastHeading) | |
1849 diff2 = newHeading + 360 - LastHeading; | |
1850 else | |
1851 diff2 = newHeading - 360 - LastHeading; | |
1852 | |
1853 diffAbs = diff; | |
1854 if(diffAbs < 0) | |
1855 diffAbs *= -1; | |
1856 | |
1857 diffAbs2 = diff2; | |
1858 if(diffAbs2 < 0) | |
1859 diffAbs2 *= -1; | |
1860 | |
1861 if(diffAbs <= diffAbs2) | |
1862 newHeading = LastHeading + (diff / 2); | |
1863 else | |
1864 newHeading = LastHeading + (diff2 / 2); | |
1865 | |
1866 if(newHeading < 0) | |
1867 newHeading += 360; | |
1868 else | |
1869 if(newHeading >= 360) | |
1870 newHeading -= 360; | |
1871 | |
1872 LastHeading = newHeading; | |
1873 ActualHeading = newHeading; | |
1874 | |
1875 if (ActualHeading < 90) | |
1876 ActualHeading += 360; | |
1877 | |
1878 while(ActualHeading > 359) ActualHeading -= 360; | |
1879 | |
1880 LineHeading = 360 - ActualHeading; | |
496 | 1881 |
1882 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(0,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font030); // North | |
38 | 1883 LineHeading += 90; |
496 | 1884 |
1885 for (loop = 0; loop < 3; loop++) | |
1886 { | |
1887 if(LineHeading > 359) LineHeading -= 360; | |
1888 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(0,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Main Ticks | |
1889 LineHeading += 90; | |
1890 } | |
38 | 1891 |
1892 LineHeading = 360 - ActualHeading; | |
1893 LineHeading += 45; | |
496 | 1894 |
1895 for (loop = 0; loop < 4; loop++) | |
1896 { | |
1897 if(LineHeading > 359) LineHeading -= 360; | |
1898 GFX_draw_thick_line(5,tXscreen, t3_compass_circle(1,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Subtick | |
1899 LineHeading += 90; | |
1900 } | |
38 | 1901 |
1902 LineHeading = 360 - ActualHeading; | |
1903 LineHeading += 22; | |
496 | 1904 for (loop = 0; loop < 8; loop++) |
1905 { | |
1906 if(LineHeading > 359) LineHeading -= 360; | |
1907 GFX_draw_thick_line(3,tXscreen, t3_compass_circle(1,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_Font031); // Subtick | |
1908 LineHeading += 45; | |
1909 } | |
38 | 1910 if(UserSetHeading) |
1911 { | |
1912 LineHeading = UserSetHeading + 360 - ActualHeading; | |
1913 if(LineHeading > 359) LineHeading -= 360; | |
496 | 1914 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(3,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_CompassUserHeadingTick); |
38 | 1915 |
1916 // R�ckpeilung, User Back Heading | |
1917 LineHeading = UserSetHeading + 360 + 180 - ActualHeading; | |
1918 if(LineHeading > 359) LineHeading -= 360; | |
1919 if(LineHeading > 359) LineHeading -= 360; | |
496 | 1920 GFX_draw_thick_line(9,tXscreen, t3_compass_circle(3,LineHeading, center), t3_compass_circle(2,LineHeading, center), CLUT_CompassUserBackHeadingTick); |
38 | 1921 } |
1922 | |
1923 GFX_draw_circle(tXscreen, center, 106, CLUT_Font030); | |
1924 GFX_draw_circle(tXscreen, center, 107, CLUT_Font030); | |
1925 GFX_draw_circle(tXscreen, center, 108, CLUT_Font030); | |
1926 } | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1927 |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1928 uint8_t t3_GetEnabled_customviews() |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1929 { |
496 | 1930 uint8_t *pViews; |
1931 uint8_t increment = 1; | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1932 uint8_t enabledViewCnt = 0; |
496 | 1933 |
511 | 1934 pViews = (uint8_t*)t3_customviewsStandard; |
496 | 1935 while((*pViews != CVIEW_T3_END)) |
1936 { | |
1937 increment = 1; | |
1938 /* check if view is enabled */ | |
1939 if(t3_customview_disabled(*pViews)) | |
1940 { | |
1941 increment = 0; | |
1942 } | |
1943 pViews++; | |
1944 enabledViewCnt += increment; | |
1945 } | |
384
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1946 return enabledViewCnt; |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1947 } |
427ae9f8e28e
Consider number of available t3 views in sector handling:
ideenmodellierer
parents:
272
diff
changeset
|
1948 |
518 | 1949 uint8_t t3_getCustomView(void) |
1950 { | |
1951 return t3_selection_customview; | |
1952 } | |
758
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1953 |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1954 int printScrubberText(char *text, size_t size, SSettings *settings) |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1955 { |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1956 int16_t currentTimerMinutes = settings->scrubberData[settings->scubberActiveId].TimerCur; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1957 char colour = '\020'; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1958 if (currentTimerMinutes <= 0) { |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1959 colour = '\025'; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1960 } else if (currentTimerMinutes <= 30) { |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1961 colour = '\024'; |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1962 } |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1963 |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1964 if (settings->scrubTimerMode == SCRUB_TIMER_MINUTES || currentTimerMinutes < 0) { |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1965 return snprintf(text, size, "%c%3i'", colour, currentTimerMinutes); |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1966 } else { |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1967 return snprintf(text, size, "%c%u\016\016%%\017", colour, currentTimerMinutes * 100 / settingsGetPointer()->scrubberData[settings->scubberActiveId].TimerMax); |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1968 } |
b6d8a6fbf4fd
- Colours for scrubber display when time remaining falls below a threshold value
heinrichsweikamp
parents:
755
diff
changeset
|
1969 } |