Mercurial > public > ostc4
comparison Discovery/Src/t6_apnea.c @ 189:8b8074080d7b avg-temp
Bugfix: average temperature on arrival from RTE instead of display time
This commit is heavily inspired by commits 05c770dc2911 and ecb71521d004.
Reading the code, it was clear that a display time averaging process
for measured temperature was implemented as was fixed for current
depth display in the two mentioned commits. The bug for the late
averaging of the temperature is, obviously, not as prominent as the
current depth fault. The bug fixed here was nothing more than a
visual glitch when first selecting the temperature display in the
lower left corner (by default at the start of the dive, or by manually
selecting it during the dive using the left button).
So, to summarize. A small visual glitch fix, but more important,
more consistent data handling and code.
Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Fri, 15 Mar 2019 15:04:57 +0100 |
parents | 9da7dd50e2ec |
children | 2bb1db22b5f5 |
comparison
equal
deleted
inserted
replaced
188:ddc21166d25b | 189:8b8074080d7b |
---|---|
72 /* Private function prototypes -----------------------------------------------*/ | 72 /* Private function prototypes -----------------------------------------------*/ |
73 void t6_refresh_divemode(void); | 73 void t6_refresh_divemode(void); |
74 void t6_refresh_customview(float depth); | 74 void t6_refresh_customview(float depth); |
75 | 75 |
76 uint8_t t6_test_customview_warnings(void); | 76 uint8_t t6_test_customview_warnings(void); |
77 void t6_show_customview_warnings(void); | |
78 void t6_compass(uint16_t ActualHeading, uint16_t UserSetHeading); | |
79 | 77 |
80 /* Exported functions --------------------------------------------------------*/ | 78 /* Exported functions --------------------------------------------------------*/ |
81 | 79 |
82 // for tHomeDiveMenuControl() in tHome.c and t6_refresh_customview | 80 // for tHomeDiveMenuControl() in tHome.c and t6_refresh_customview |
83 uint8_t t6_getCustomView(void) | 81 uint8_t t6_getCustomView(void) |
329 uint8_t count = 0; | 327 uint8_t count = 0; |
330 | 328 |
331 count = 0; | 329 count = 0; |
332 return count; | 330 return count; |
333 } | 331 } |
334 | |
335 /* | |
336 | |
337 char text[512]; | |
338 uint16_t textpointer = 0; | |
339 | |
340 | |
341 // CVIEW_T3_Temperature | |
342 float temperatureThisCall; | |
343 float temperature; | |
344 | |
345 | |
346 // CVIEW_T3_StopWatch | |
347 SDivetime Stopwatch = {0,0,0,0}; | |
348 float fAverageDepth, fAverageDepthAbsolute; | |
349 uint16_t tempWinX0; | |
350 uint16_t tempWinY0; | |
351 | |
352 switch(t6_selection_customview) | |
353 { | |
354 case CVIEW_T3_ApnoeTimes: | |
355 break; | |
356 | |
357 case CVIEW_T3_StopWatch: | |
358 Stopwatch.Total = timer_Stopwatch_GetTime(); | |
359 Stopwatch.Minutes = Stopwatch.Total / 60; | |
360 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
361 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
362 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
363 | |
364 snprintf(text,TEXTSIZE,"\032\f%c",TXT_AvgDepth); | |
365 GFX_write_string(&FontT42,&t6c1,text,0); | |
366 snprintf(text,TEXTSIZE,"\030\003\016%01.1f",fAverageDepthAbsolute); | |
367 GFX_write_string(&FontT105,&t6c1,text,0); | |
368 | |
369 tempWinX0 = t6c1.WindowX0; | |
370 tempWinY0 = t6c1.WindowY0; | |
371 t6c1.WindowX0 = 480; | |
372 // snprintf(text,TEXTSIZE,"\032\f%c%c - %c",TXT_2BYTE, TXT2BYTE_Clock, TXT_AvgDepth); | |
373 snprintf(text,TEXTSIZE,"\032\f%c", TXT_Stopwatch); | |
374 GFX_write_string(&FontT42,&t6c1,text,0); | |
375 snprintf(text,TEXTSIZE,"\030\016%01.1f",fAverageDepth); | |
376 GFX_write_string(&FontT105,&t6c1,text,0); | |
377 t6c1.WindowY0 = 100; | |
378 snprintf(text,TEXTSIZE,"\030%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); | |
379 GFX_write_string(&FontT105,&t6c1,text,0); | |
380 t6c1.WindowX0 = tempWinX0; | |
381 t6c1.WindowY0 = tempWinY0; | |
382 break; | |
383 | |
384 case CVIEW_T3_Temperature: | |
385 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
386 GFX_write_string(&FontT42,&t6c1,text,0); | |
387 // mean value | |
388 temperatureThisCall = unit_temperature_float(stateUsed->lifeData.temperature_celsius); | |
389 temperature = (temperatureThisCall + temperatureLastCall[0] + temperatureLastCall[1] + temperatureLastCall[2]) / 4.0f; | |
390 idTemperatureLastCall++; | |
391 if(idTemperatureLastCall >= 3) | |
392 idTemperatureLastCall = 0; | |
393 temperatureLastCall[idTemperatureLastCall] = temperatureThisCall; | |
394 textpointer = snprintf(text,TEXTSIZE,"\030\003\016%01.1f \140",temperature); // "\016\016%01.1f `" + C or F | |
395 if(settingsGetPointer()->nonMetricalSystem == 0) | |
396 text[textpointer++] = 'C'; | |
397 else | |
398 text[textpointer++] = 'F'; | |
399 text[textpointer++] = 0; | |
400 GFX_write_string(&FontT105,&t6c1,text,0); | |
401 break; | |
402 | |
403 case CVIEW_Compass: | |
404 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); | |
405 GFX_write_string(&FontT42,&t6c1,text,0); | |
406 snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); | |
407 GFX_write_string(&FontT105,&t6c1,text,0); | |
408 t6_compass((uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); | |
409 break; | |
410 | |
411 case CVIEW_T3_MaxDepth: | |
412 default: | |
413 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
414 GFX_write_string(&FontT42,&t6c1,text,0); | |
415 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); | |
416 t3_basics_colorscheme_mod(text); | |
417 GFX_write_string(&FontT105,&t6c1,text,1); | |
418 break; | |
419 } | |
420 } | |
421 | |
422 | |
423 void t6_show_customview_warnings(void) | |
424 { | |
425 char text[256], textMain[256]; | |
426 uint8_t textpointer, textpointerMain, lineFree, more; | |
427 | |
428 snprintf(text,TEXTSIZE,"\025\f%c",TXT_Warning); | |
429 GFX_write_string(&FontT42,&t6c1,text,0); | |
430 | |
431 lineFree = 1; | |
432 more = 0; | |
433 | |
434 textpointerMain = 0; | |
435 textMain[textpointerMain++] = '\025'; | |
436 textMain[textpointerMain++] = '\003'; | |
437 | |
438 textpointer = 0; | |
439 | |
440 text[textpointer++] = '\021'; | |
441 text[textpointer++] = TXT_2BYTE; | |
442 text[textpointer++] = TXT2BYTE_WarnDecoMissed; | |
443 if(stateUsed->warnings.decoMissed) | |
444 { | |
445 text[textpointer - 3] = '\025'; | |
446 if(lineFree) | |
447 { | |
448 textMain[textpointerMain++] = TXT_2BYTE; | |
449 textMain[textpointerMain++] = text[textpointer - 1]; | |
450 textMain[textpointerMain] = 0; | |
451 lineFree--; | |
452 } | |
453 else | |
454 { | |
455 more++; | |
456 } | |
457 } | |
458 | |
459 text[textpointer++] = '\t'; | |
460 text[textpointer++] = '\021'; | |
461 text[textpointer++] = TXT_2BYTE; | |
462 text[textpointer++] = TXT2BYTE_WarnPPO2Low; | |
463 if(stateUsed->warnings.ppO2Low) | |
464 { | |
465 text[textpointer - 3] = '\025'; | |
466 if(lineFree) | |
467 { | |
468 textMain[textpointerMain++] = TXT_2BYTE; | |
469 textMain[textpointerMain++] = text[textpointer - 1]; | |
470 textMain[textpointerMain] = 0; | |
471 lineFree--; | |
472 } | |
473 else | |
474 { | |
475 more++; | |
476 } | |
477 } | |
478 | |
479 text[textpointer++] = '\n'; | |
480 text[textpointer++] = '\r'; | |
481 text[textpointer++] = '\021'; | |
482 text[textpointer++] = TXT_2BYTE; | |
483 text[textpointer++] = TXT2BYTE_WarnPPO2High; | |
484 if(stateUsed->warnings.ppO2High) | |
485 { | |
486 text[textpointer - 3] = '\025'; | |
487 if(lineFree) | |
488 { | |
489 textMain[textpointerMain++] = TXT_2BYTE; | |
490 textMain[textpointerMain++] = text[textpointer - 1]; | |
491 textMain[textpointerMain] = 0; | |
492 lineFree--; | |
493 } | |
494 else | |
495 { | |
496 more++; | |
497 } | |
498 } | |
499 | |
500 text[textpointer++] = '\t'; | |
501 text[textpointer++] = '\021'; | |
502 text[textpointer++] = TXT_2BYTE; | |
503 text[textpointer++] = TXT2BYTE_WarnFallback; | |
504 if(stateUsed->warnings.fallback) | |
505 { | |
506 text[textpointer - 3] = '\025'; | |
507 if(lineFree) | |
508 { | |
509 textMain[textpointerMain++] = TXT_2BYTE; | |
510 textMain[textpointerMain++] = text[textpointer - 1]; | |
511 textMain[textpointerMain] = 0; | |
512 lineFree--; | |
513 } | |
514 else | |
515 { | |
516 more++; | |
517 } | |
518 } | |
519 | |
520 text[textpointer++] = '\n'; | |
521 text[textpointer++] = '\r'; | |
522 text[textpointer++] = '\021'; | |
523 text[textpointer++] = TXT_2BYTE; | |
524 text[textpointer++] = TXT2BYTE_WarnSensorLinkLost; | |
525 if(stateUsed->warnings.sensorLinkLost) | |
526 { | |
527 text[textpointer - 3] = '\025'; | |
528 if(lineFree) | |
529 { | |
530 textMain[textpointerMain++] = TXT_2BYTE; | |
531 textMain[textpointerMain++] = text[textpointer - 1]; | |
532 textMain[textpointerMain] = 0; | |
533 lineFree--; | |
534 } | |
535 else | |
536 { | |
537 more++; | |
538 } | |
539 } | |
540 | |
541 text[textpointer] = 0; | |
542 GFX_write_string(&FontT48,&t6c1,textMain,1); | |
543 if(more) | |
544 { | |
545 GFX_write_string(&FontT48,&t6c2,text,1); | |
546 } | |
547 } | |
548 | |
549 | |
550 void t6_change_customview(void) | |
551 { | |
552 const uint8_t *pViews; | |
553 pViews = t6_customviews; | |
554 | |
555 while((*pViews != CVIEW_T3_END) && (*pViews != t6_selection_customview)) | |
556 {pViews++;} | |
557 | |
558 if(*pViews < CVIEW_T3_END) | |
559 pViews++; | |
560 | |
561 if(*pViews == CVIEW_T3_END) | |
562 { | |
563 t6_selection_customview = t6_customviews[0]; | |
564 } | |
565 else | |
566 t6_selection_customview = *pViews; | |
567 } | |
568 | |
569 | |
570 void t3_basics_colorscheme_mod(char *text) | |
571 { | |
572 if((text[0] == '\020') && !GFX_is_colorschemeDiveStandard()) | |
573 { | |
574 text[0] = '\027'; | |
575 } | |
576 } | |
577 | |
578 point_t t6_compass_circle(uint8_t id, uint16_t degree) | |
579 { | |
580 float fCos, fSin; | |
581 const float piMult = ((2 * 3.14159) / 360); | |
582 // const int radius[4] = {95,105,115,60}; | |
583 const int radius[4] = {85,95,105,90}; | |
584 const point_t offset = {.x = 600, .y = 116}; | |
585 | |
586 static point_t r[4][360] = { 0 }; | |
587 | |
588 if(r[0][0].y == 0) | |
589 { | |
590 for(int i=0;i<360;i++) | |
591 { | |
592 fCos = cos(i * piMult); | |
593 fSin = sin(i * piMult); | |
594 for(int j=0;j<4;j++) | |
595 { | |
596 r[j][i].x = offset.x + (int)(fSin * radius[j]); | |
597 r[j][i].y = offset.y + (int)(fCos * radius[j]); | |
598 } | |
599 } | |
600 } | |
601 if(id > 3) id = 0; | |
602 if(degree > 359) degree = 0; | |
603 return r[id][degree]; | |
604 } | |
605 | |
606 | |
607 void t6_compass(uint16_t ActualHeading, uint16_t UserSetHeading) | |
608 { | |
609 uint16_t LineHeading; | |
610 point_t center; | |
611 static int32_t LastHeading = 0; | |
612 int32_t newHeading = 0; | |
613 int32_t diff = 0; | |
614 int32_t diff2 = 0; | |
615 | |
616 int32_t diffAbs = 0; | |
617 int32_t diffAbs2 = 0; | |
618 | |
619 newHeading = ActualHeading; | |
620 | |
621 diff = newHeading - LastHeading; | |
622 | |
623 if(newHeading < LastHeading) | |
624 diff2 = newHeading + 360 - LastHeading; | |
625 else | |
626 diff2 = newHeading - 360 - LastHeading; | |
627 | |
628 diffAbs = diff; | |
629 if(diffAbs < 0) | |
630 diffAbs *= -1; | |
631 | |
632 diffAbs2 = diff2; | |
633 if(diffAbs2 < 0) | |
634 diffAbs2 *= -1; | |
635 | |
636 | |
637 if(diffAbs <= diffAbs2) | |
638 newHeading = LastHeading + (diff / 2); | |
639 else | |
640 newHeading = LastHeading + (diff2 / 2); | |
641 | |
642 if(newHeading < 0) | |
643 newHeading += 360; | |
644 else | |
645 if(newHeading >= 360) | |
646 newHeading -= 360; | |
647 | |
648 LastHeading = newHeading; | |
649 ActualHeading = newHeading; | |
650 | |
651 if (ActualHeading < 90) | |
652 ActualHeading += 360; | |
653 | |
654 while(ActualHeading > 359) ActualHeading -= 360; | |
655 | |
656 LineHeading = 360 - ActualHeading; | |
657 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(0,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font030); // North | |
658 LineHeading += 90; | |
659 if(LineHeading > 359) LineHeading -= 360; | |
660 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Maintick | |
661 LineHeading += 90; | |
662 if(LineHeading > 359) LineHeading -= 360; | |
663 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
664 LineHeading += 90; | |
665 if(LineHeading > 359) LineHeading -= 360; | |
666 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
667 | |
668 LineHeading = 360 - ActualHeading; | |
669 LineHeading += 45; | |
670 if(LineHeading > 359) LineHeading -= 360; | |
671 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
672 LineHeading += 90; | |
673 if(LineHeading > 359) LineHeading -= 360; | |
674 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
675 LineHeading += 90; | |
676 if(LineHeading > 359) LineHeading -= 360; | |
677 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
678 LineHeading += 90; | |
679 if(LineHeading > 359) LineHeading -= 360; | |
680 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
681 | |
682 LineHeading = 360 - ActualHeading; | |
683 LineHeading += 22; | |
684 if(LineHeading > 359) LineHeading -= 360; | |
685 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
686 LineHeading += 45; | |
687 if(LineHeading > 359) LineHeading -= 360; | |
688 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
689 LineHeading += 45; | |
690 if(LineHeading > 359) LineHeading -= 360; | |
691 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
692 LineHeading += 45; | |
693 if(LineHeading > 359) LineHeading -= 360; | |
694 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
695 LineHeading += 45; | |
696 if(LineHeading > 359) LineHeading -= 360; | |
697 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
698 LineHeading += 45; | |
699 if(LineHeading > 359) LineHeading -= 360; | |
700 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
701 LineHeading += 45; | |
702 if(LineHeading > 359) LineHeading -= 360; | |
703 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
704 LineHeading += 45; | |
705 if(LineHeading > 359) LineHeading -= 360; | |
706 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
707 | |
708 if(UserSetHeading) | |
709 { | |
710 LineHeading = UserSetHeading + 360 - ActualHeading; | |
711 if(LineHeading > 359) LineHeading -= 360; | |
712 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(3,LineHeading), t6_compass_circle(2,LineHeading), CLUT_CompassUserHeadingTick); | |
713 | |
714 // R�ckpeilung, User Back Heading | |
715 LineHeading = UserSetHeading + 360 + 180 - ActualHeading; | |
716 if(LineHeading > 359) LineHeading -= 360; | |
717 if(LineHeading > 359) LineHeading -= 360; | |
718 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(3,LineHeading), t6_compass_circle(2,LineHeading), CLUT_CompassUserBackHeadingTick); | |
719 } | |
720 | |
721 center.x = 600; | |
722 center.y = 116; | |
723 GFX_draw_circle(&t6screen, center, 106, CLUT_Font030); | |
724 GFX_draw_circle(&t6screen, center, 107, CLUT_Font030); | |
725 GFX_draw_circle(&t6screen, center, 108, CLUT_Font030); | |
726 } | |
727 */ | |
728 |