comparison Discovery/Src/t3.c @ 945:aad1a6b9aaec Evo_2_23

Added slow exit graph to t3 view: In the first implementation slow exit was only available in T7 view. To enable it in T3 view the common parts have been extracted into a separate function which is shared between T7 and T3. Only the drawing specific parts remain in the T7 / T3 files.
author Ideenmodellierer
date Thu, 19 Dec 2024 22:16:36 +0100
parents 4d98fb2a178e
children e9c37071933b
comparison
equal deleted inserted replaced
944:44599695df41 945:aad1a6b9aaec
83 83
84 uint8_t t3_test_customview_warnings(void); 84 uint8_t t3_test_customview_warnings(void);
85 void t3_refresh_customview(float depth); 85 void t3_refresh_customview(float depth);
86 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading); 86 void t3_basics_compass(GFX_DrawCfgScreen *tXscreen, point_t center, uint16_t ActualHeading, uint16_t UserSetHeading);
87 uint8_t t3_EvaluateAFCondition(uint8_t T3CView); 87 uint8_t t3_EvaluateAFCondition(uint8_t T3CView);
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 */
88 89
89 /* Exported functions --------------------------------------------------------*/ 90 /* Exported functions --------------------------------------------------------*/
90 91
91 void t3_init(void) 92 void t3_init(void)
92 { 93 {
388 389
389 float t3_basics_lines_depth_and_divetime(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode) 390 float t3_basics_lines_depth_and_divetime(GFX_DrawCfgScreen *tXscreen, GFX_DrawCfgWindow* tXl1, GFX_DrawCfgWindow* tXr1, uint8_t mode)
390 { 391 {
391 char text[256]; 392 char text[256];
392 uint8_t textPointer; 393 uint8_t textPointer;
393 uint8_t color; 394 uint8_t color = 0;
394 uint8_t depthChangeRate; 395 uint8_t depthChangeRate;
395 uint8_t depthChangeAscent; 396 uint8_t depthChangeAscent;
396 point_t start, stop, startZeroLine; 397 point_t start, stop, startZeroLine;
397 SDivetime Divetime = {0,0,0,0}; 398 SDivetime Divetime = {0,0,0,0};
399 uint16_t nextstopLengthSeconds = 0;
400 uint8_t nextstopDepthMeter = 0;
398 401
399 SSettings* pSettings; 402 SSettings* pSettings;
400 pSettings = settingsGetPointer(); 403 pSettings = settingsGetPointer();
404
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 }
401 415
402 start.x = 0; 416 start.x = 0;
403 stop.x = 799; 417 stop.x = 799;
404 stop.y = start.y = BigFontSeperationTopBottom; 418 stop.y = start.y = BigFontSeperationTopBottom;
405 if((viewInFocus()) && (!viewDetectionSuspended())) 419 if((viewInFocus()) && (!viewDetectionSuspended()))
421 } 435 }
422 else 436 else
423 { 437 {
424 GFX_draw_line(tXscreen, start, stop, CLUT_Font020); 438 GFX_draw_line(tXscreen, start, stop, CLUT_Font020);
425 } 439 }
426
427 /* depth */
428 color = drawingColor_from_ascentspeed(stateUsed->lifeData.ascent_rate_meter_per_min);
429 float depth = unit_depth_float(stateUsed->lifeData.depth_meter);
430
431 if(depth <= 0.3f)
432 depth = 0;
433
434 if(settingsGetPointer()->nonMetricalSystem)
435 snprintf(text,TEXTSIZE,"\032\f[feet]");
436 else
437 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Depth);
438 GFX_write_string(&FontT42,tXl1,text,0);
439
440 if( ((mode == DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4 )))
441 || ((mode != DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 8) || (stateUsed->lifeData.ascent_rate_meter_per_min < -10)))
442 )
443 {
444 snprintf(text,TEXTSIZE,"\f\002%.0f %c%c/min "
445 , unit_depth_float(stateUsed->lifeData.ascent_rate_meter_per_min)
446 , unit_depth_char1()
447 , unit_depth_char2()
448 );
449 GFX_write_string(&FontT42,tXl1,text,0);
450 }
451
452 if( depth < 100)
453 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",depth);
454 else
455 snprintf(text,TEXTSIZE,"\020\003\016%01.0f",depth);
456
457 Gfx_colorsscheme_mod(text,color);
458 GFX_write_string(&FontT105,tXl1,text,1);
459
460 440
461 /* ascentrate graph */ 441 /* ascentrate graph */
462 if(mode == DIVEMODE_Apnea) 442 if(mode == DIVEMODE_Apnea)
463 { 443 {
464 /* ascentrate graph - apnea mode */ 444 /* ascentrate graph - apnea mode */
553 GFX_draw_thick_line(12,tXscreen, start, stop, color); 533 GFX_draw_thick_line(12,tXscreen, start, stop, color);
554 } 534 }
555 } 535 }
556 else 536 else
557 { 537 {
558 /* ascentrate graph -standard mode */ 538 if((pSettings->slowExitTime != 0) && (nextstopDepthMeter == 0) && (stateUsed->lifeData.depth_meter < pSettings->last_stop_depth_meter))
559 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) 539 {
560 { 540 color = t3_drawSlowExitGraph(tXscreen, tXl1, tXr1);
561 if(!pSettings->FlipDisplay) 541 }
562 { 542 else
563 start.y = tXl1->WindowY0 - 1; 543 {
564 } 544 if(stateUsed->lifeData.ascent_rate_meter_per_min > 0) /* ascentrate graph -standard mode */
565 else 545 {
566 { 546 if(!pSettings->FlipDisplay)
567 start.y = tXl1->WindowY1 + 1; 547 {
568 } 548 start.y = tXl1->WindowY0 - 1;
569 549 }
570 for(int i = 0; i<4;i++) 550 else
571 { 551 {
572 start.y += 5*8; 552 start.y = tXl1->WindowY1 + 1;
573 stop.y = start.y; 553 }
574 if(!pSettings->FlipDisplay) 554
575 { 555 for(int i = 0; i<4;i++)
576 start.x = tXl1->WindowX1 - 1; 556 {
577 } 557 start.y += 5*8;
578 else 558 stop.y = start.y;
579 { 559 if(!pSettings->FlipDisplay)
580 start.x = tXr1->WindowX1 - 1; 560 {
581 } 561 start.x = tXl1->WindowX1 - 1;
582 stop.x = start.x - 17; 562 }
583 GFX_draw_line(tXscreen, start, stop, 0); 563 else
584 } 564 {
585 // new thick bar design Sept. 2015 565 start.x = tXr1->WindowX1 + 3;
586 if(!pSettings->FlipDisplay) 566 }
587 { 567 stop.x = start.x - 17;
588 start.x = tXl1->WindowX1 - 3 - 5; 568 GFX_draw_line(tXscreen, start, stop, 0);
589 } 569 }
590 else 570 // new thick bar design Sept. 2015
591 { 571 if(!pSettings->FlipDisplay)
592 start.x = tXr1->WindowX1 - 3 - 5; 572 {
593 } 573 start.x = tXl1->WindowX1 - 3 - 5;
594 574 }
595 stop.x = start.x; 575 else
596 if(!pSettings->FlipDisplay) 576 {
597 { 577 start.x = tXr1->WindowX1 - 3 - 5;
598 start.y = tXl1->WindowY0 - 1; 578 }
599 } 579
600 else 580 stop.x = start.x;
601 { 581 if(!pSettings->FlipDisplay)
602 start.y = tXl1->WindowY1 + 1; 582 {
603 } 583 start.y = tXl1->WindowY0 - 1;
604 584 }
605 stop.y = start.y + (uint16_t)(stateUsed->lifeData.ascent_rate_meter_per_min * 8); 585 else
606 stop.y -= 3; // wegen der Liniendicke von 12 anstelle von 9 586 {
607 if(stop.y >= 470) 587 start.y = tXl1->WindowY1 + 1;
608 stop.y = 470; 588 }
609 start.y += 7; // starte etwas weiter oben 589
610 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 10) 590 stop.y = start.y + (uint16_t)(stateUsed->lifeData.ascent_rate_meter_per_min * 8);
611 color = CLUT_EverythingOkayGreen; 591 stop.y -= 3; // wegen der Liniendicke von 12 anstelle von 9
612 else 592 if(stop.y >= 470)
613 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 15) 593 stop.y = 470;
614 color = CLUT_WarningYellow; 594 start.y += 7; // starte etwas weiter oben
615 else 595 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 10)
616 color = CLUT_WarningRed; 596 color = CLUT_EverythingOkayGreen;
617 597 else
618 GFX_draw_thick_line(12,tXscreen, start, stop, color); 598 if(stateUsed->lifeData.ascent_rate_meter_per_min <= 15)
619 } 599 color = CLUT_WarningYellow;
620 } 600 else
601 color = CLUT_WarningRed;
602
603 GFX_draw_thick_line(12,tXscreen, start, stop, color);
604 }
605 color = drawingColor_from_ascentspeed(stateUsed->lifeData.ascent_rate_meter_per_min);
606 }
607 }
608 /* depth */
609 float depth = unit_depth_float(stateUsed->lifeData.depth_meter);
610
611 if(depth <= 0.3f)
612 depth = 0;
613
614 if(settingsGetPointer()->nonMetricalSystem)
615 snprintf(text,TEXTSIZE,"\032\f[feet]");
616 else
617 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Depth);
618 GFX_write_string(&FontT42,tXl1,text,0);
619
620 if( ((mode == DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 4) || (stateUsed->lifeData.ascent_rate_meter_per_min < -4 )))
621 || ((mode != DIVEMODE_Apnea) && ((stateUsed->lifeData.ascent_rate_meter_per_min > 8) || (stateUsed->lifeData.ascent_rate_meter_per_min < -10)))
622 )
623 {
624 snprintf(text,TEXTSIZE,"\f\002%.0f %c%c/min "
625 , unit_depth_float(stateUsed->lifeData.ascent_rate_meter_per_min)
626 , unit_depth_char1()
627 , unit_depth_char2()
628 );
629 GFX_write_string(&FontT42,tXl1,text,0);
630 }
631
632 if( depth < 100)
633 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",depth);
634 else
635 snprintf(text,TEXTSIZE,"\020\003\016%01.0f",depth);
636
637 Gfx_colorsscheme_mod(text,color);
638 GFX_write_string(&FontT105,tXl1,text,1);
639
621 640
622 // divetime 641 // divetime
623 if(mode == DIVEMODE_Apnea) 642 if(mode == DIVEMODE_Apnea)
624 { 643 {
625 if(stateUsed->lifeData.counterSecondsShallowDepth) 644 if(stateUsed->lifeData.counterSecondsShallowDepth)
2123 break; 2142 break;
2124 } 2143 }
2125 } 2144 }
2126 } 2145 }
2127 } 2146 }
2147
2148 #define ASCENT_GRAPH_YPIXEL 220
2149 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 */
2150 {
2151 static uint16_t countDownSec = 0;
2152 uint8_t drawingMeterStep;
2153 static float exitDepthMeter = 0.0;
2154
2155
2156 uint8_t index = 0;
2157 uint8_t color = 0;
2158 point_t start, stop;
2159
2160 SSettings* pSettings;
2161 pSettings = settingsGetPointer();
2162
2163
2164 if(calculateSlowExit(&countDownSec, &exitDepthMeter, &color)) /* graph to be drawn? */
2165 {
2166 if(!pSettings->FlipDisplay)
2167 {
2168 start.y = tXl1->WindowY0 - 1;
2169 }
2170 else
2171 {
2172 start.y = tXl1->WindowY1 + 1;
2173 }
2174
2175 drawingMeterStep = ASCENT_GRAPH_YPIXEL / pSettings->last_stop_depth_meter; /* based on 120 / 4 = 30 of standard ascent graph */
2176
2177 for(index = 0; index < pSettings->last_stop_depth_meter; index++) /* draw meter indicators */
2178 {
2179 start.y += drawingMeterStep;
2180 stop.y = start.y;
2181 if(!pSettings->FlipDisplay)
2182 {
2183 start.x = tXl1->WindowX1 - 1;
2184 }
2185 else
2186 {
2187 start.x = tXr1->WindowX1 + 3;
2188 }
2189 stop.x = start.x - 43;
2190 GFX_draw_line(tXscreen, start, stop, 0);
2191 }
2192
2193 /* draw cntdown bar */
2194
2195 if(!pSettings->FlipDisplay)
2196 {
2197 start.x -= 20;
2198 start.y = tXl1->WindowY0 + ASCENT_GRAPH_YPIXEL + 2;
2199 }
2200 else
2201 {
2202 start.x -= 25;
2203 start.y = tXl1->WindowY1 + ASCENT_GRAPH_YPIXEL + 5;
2204 }
2205 stop.x = start.x;
2206 stop.y = start.y - countDownSec * (ASCENT_GRAPH_YPIXEL / (float)(pSettings->slowExitTime * 60.0));
2207 if(stop.y >= 470) stop.y = 470;
2208 if(!pSettings->FlipDisplay)
2209 {
2210 stop.y += 5;
2211 }
2212 GFX_draw_thick_line(15,tXscreen, start, stop, 3);
2213 /* mark diver depth */
2214 if(!pSettings->FlipDisplay)
2215 {
2216 start.x = tXl1->WindowX1 - 32;
2217 stop.x = start.x + 24;
2218 }
2219 else
2220 {
2221 start.x = tXr1->WindowX1 - 33;
2222 stop.x = start.x + 24;
2223 }
2224
2225
2226 start.y = start.y - (stateUsed->lifeData.depth_meter * (ASCENT_GRAPH_YPIXEL) / pSettings->last_stop_depth_meter);
2227 stop.y = start.y;
2228 GFX_draw_thick_line(10,tXscreen, start, stop, 9);
2229 }
2230 return color;
2231 }