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