Mercurial > public > ostc4
comparison Discovery/Src/t7.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 | 6d8ae8fbccf5 |
children | c6b858f2e025 |
comparison
equal
deleted
inserted
replaced
944:44599695df41 | 945:aad1a6b9aaec |
---|---|
124 }; | 124 }; |
125 | 125 |
126 | 126 |
127 /* Private types -------------------------------------------------------------*/ | 127 /* Private types -------------------------------------------------------------*/ |
128 | 128 |
129 typedef enum | |
130 { | |
131 SE_INIT = 0, | |
132 SE_REINIT, | |
133 SE_ACTIVE, | |
134 SE_END | |
135 } SSlowExitState; | |
136 | 129 |
137 const uint8_t customviewsSurfaceStandard[] = | 130 const uint8_t customviewsSurfaceStandard[] = |
138 { | 131 { |
139 // CVIEW_CompassDebug, | 132 // CVIEW_CompassDebug, |
140 CVIEW_Hello, | 133 CVIEW_Hello, |
2880 if(nextstopDepthMeter) | 2873 if(nextstopDepthMeter) |
2881 { | 2874 { |
2882 snprintf(TextR2,TEXTSIZE,"\032\f\002%c",TXT_Decostop); | 2875 snprintf(TextR2,TEXTSIZE,"\032\f\002%c",TXT_Decostop); |
2883 GFX_write_string(&FontT42,&t7r2,TextR2,0); | 2876 GFX_write_string(&FontT42,&t7r2,TextR2,0); |
2884 | 2877 |
2885 if((pSettings->VPM_conservatism.ub.alternative) && (fabs(stateUsed->lifeData.depth_meter - nextstopDepthMeter)) < 1.5) | 2878 if((stateUsed->diveSettings.deco_type.ub.standard == VPM_MODE) && (pSettings->VPM_conservatism.ub.alternative) |
2879 && (fabs(stateUsed->lifeData.depth_meter - nextstopDepthMeter)) < 1.5) | |
2886 { | 2880 { |
2887 TextR2[0] = '\026'; | 2881 TextR2[0] = '\026'; |
2888 textlength = 1; | 2882 textlength = 1; |
2889 } | 2883 } |
2890 else | 2884 else |
4818 #define ASCENT_GRAPH_YPIXEL 110 | 4812 #define ASCENT_GRAPH_YPIXEL 110 |
4819 | 4813 |
4820 | 4814 |
4821 uint8_t t7_drawSlowExitGraph() /* this function is only called if diver is below last last stop depth */ | 4815 uint8_t t7_drawSlowExitGraph() /* this function is only called if diver is below last last stop depth */ |
4822 { | 4816 { |
4823 static SSlowExitState slowExitState = SE_END; | |
4824 static uint16_t countDownSec = 0; | 4817 static uint16_t countDownSec = 0; |
4825 static uint8_t drawingMeterStep; | 4818 uint8_t drawingMeterStep; |
4826 static float exitDepthMeter = 0.0; | 4819 static float exitDepthMeter = 0.0; |
4827 static uint32_t exitSecTick = 0; | |
4828 static uint32_t lastSecTick = 0; | |
4829 | 4820 |
4830 uint8_t index = 0; | 4821 uint8_t index = 0; |
4831 static uint8_t color = 0; | 4822 uint8_t color = 0; |
4832 point_t start, stop; | 4823 point_t start, stop; |
4833 | 4824 |
4834 SSettings* pSettings; | 4825 SSettings* pSettings; |
4835 pSettings = settingsGetPointer(); | 4826 pSettings = settingsGetPointer(); |
4836 | 4827 |
4837 if((stateUsed->lifeData.max_depth_meter < pSettings->last_stop_depth_meter) /* start of dive => reinit timer */ | 4828 |
4838 || (slowExitState == SE_REINIT)) | 4829 if(calculateSlowExit(&countDownSec, &exitDepthMeter, &color)) /* graph to be drawn? */ |
4839 { | 4830 { |
4840 if(slowExitState != SE_INIT) | 4831 if(!pSettings->FlipDisplay) |
4841 { | 4832 { |
4842 countDownSec = pSettings->slowExitTime * 60; | 4833 start.y = t7l1.WindowY0 - 1; |
4843 drawingMeterStep = ASCENT_GRAPH_YPIXEL / pSettings->last_stop_depth_meter; /* based on 120 / 4 = 30 of standard ascent graph */ | |
4844 slowExitState = SE_INIT; | |
4845 exitDepthMeter = pSettings->last_stop_depth_meter; | |
4846 color = 0; | |
4847 } | 4834 } |
4848 } | 4835 else |
4849 else | |
4850 { | |
4851 if(slowExitState != SE_END) | |
4852 { | 4836 { |
4853 if((slowExitState == SE_INIT) && (stateUsed->lifeData.dive_time_seconds > 900)) /* min 15min divetime */ | 4837 start.y = t7l3.WindowY0 - 25; |
4854 { | |
4855 slowExitState = SE_ACTIVE; | |
4856 exitSecTick = HAL_GetTick(); | |
4857 lastSecTick = exitSecTick; | |
4858 } | |
4859 else if(slowExitState == SE_ACTIVE) | |
4860 { | |
4861 if(time_elapsed_ms(lastSecTick, HAL_GetTick()) > 60000) /* restart timer if diver go below exit zone */ | |
4862 { | |
4863 slowExitState = SE_REINIT; | |
4864 } | |
4865 else if(time_elapsed_ms(exitSecTick, HAL_GetTick()) > 1000) | |
4866 { | |
4867 exitSecTick = HAL_GetTick(); | |
4868 lastSecTick = exitSecTick; | |
4869 /* select depth digit color */ | |
4870 if(fabsf(stateUsed->lifeData.depth_meter - exitDepthMeter) < 0.5 ) | |
4871 { | |
4872 color = CLUT_NiceGreen; | |
4873 } | |
4874 else if(fabsf(stateUsed->lifeData.depth_meter - exitDepthMeter) <= 1.5) | |
4875 { | |
4876 color = CLUT_WarningYellow; | |
4877 } | |
4878 else if(stateUsed->lifeData.depth_meter - exitDepthMeter < -1.5 ) | |
4879 { | |
4880 color = CLUT_WarningRed; | |
4881 } | |
4882 else | |
4883 { | |
4884 color = 0; | |
4885 } | |
4886 | |
4887 if((fabsf(stateUsed->lifeData.depth_meter - exitDepthMeter) <= 1.6 ) /* only decrease counter if diver is close to target depth */ | |
4888 || (color == CLUT_WarningRed)) /* or if diver is far ahead */ | |
4889 { | |
4890 countDownSec--; | |
4891 if(countDownSec == 0) | |
4892 { | |
4893 slowExitState = SE_END; | |
4894 color = 0; | |
4895 exitDepthMeter = 0; | |
4896 } | |
4897 else | |
4898 { | |
4899 exitDepthMeter -= (pSettings->last_stop_depth_meter / (float)(pSettings->slowExitTime * 60)); | |
4900 } | |
4901 } | |
4902 } | |
4903 if(!pSettings->FlipDisplay) | |
4904 { | |
4905 start.y = t7l1.WindowY0 - 1; | |
4906 } | |
4907 else | |
4908 { | |
4909 start.y = t7l3.WindowY0 - 25; | |
4910 } | |
4911 | |
4912 for(index = 0; index < pSettings->last_stop_depth_meter; index++) /* draw meter indicators */ | |
4913 { | |
4914 start.y += drawingMeterStep; | |
4915 stop.y = start.y; | |
4916 start.x = CUSTOMBOX_LINE_LEFT - 1; | |
4917 stop.x = start.x - 38; | |
4918 GFX_draw_line(&t7screen, start, stop, 0); | |
4919 } | |
4920 | |
4921 start.x = CUSTOMBOX_LINE_LEFT - CUSTOMBOX_OUTSIDE_OFFSET - 20; | |
4922 stop.x = start.x; | |
4923 if(!pSettings->FlipDisplay) | |
4924 { | |
4925 start.y = t7l1.WindowY0 + ASCENT_GRAPH_YPIXEL + 5; | |
4926 } | |
4927 else | |
4928 { | |
4929 start.y = t7l3.WindowY0 - 25 + ASCENT_GRAPH_YPIXEL + 5; | |
4930 } | |
4931 stop.y = start.y - countDownSec * (ASCENT_GRAPH_YPIXEL / (float)(pSettings->slowExitTime * 60.0)); | |
4932 if(stop.y >= 470) | |
4933 stop.y = 470; | |
4934 | |
4935 if(!pSettings->FlipDisplay) | |
4936 { | |
4937 stop.y += 5; | |
4938 } | |
4939 GFX_draw_thick_line(15,&t7screen, start, stop, 3); | |
4940 /* mark diver depth */ | |
4941 start.x = CUSTOMBOX_LINE_LEFT - CUSTOMBOX_OUTSIDE_OFFSET - 30; | |
4942 stop.x = start.x + 24; | |
4943 | |
4944 start.y = start.y - (stateUsed->lifeData.depth_meter * (ASCENT_GRAPH_YPIXEL) / pSettings->last_stop_depth_meter); | |
4945 stop.y = start.y; | |
4946 GFX_draw_thick_line(10,&t7screen, start, stop, 9); | |
4947 } | |
4948 } | 4838 } |
4839 drawingMeterStep = ASCENT_GRAPH_YPIXEL / pSettings->last_stop_depth_meter; /* based on 120 / 4 = 30 of standard ascent graph */ | |
4840 for(index = 0; index < pSettings->last_stop_depth_meter; index++) /* draw meter indicators */ | |
4841 { | |
4842 start.y += drawingMeterStep; | |
4843 stop.y = start.y; | |
4844 start.x = CUSTOMBOX_LINE_LEFT - 1; | |
4845 stop.x = start.x - 38; | |
4846 GFX_draw_line(&t7screen, start, stop, 0); | |
4847 } | |
4848 | |
4849 start.x = CUSTOMBOX_LINE_LEFT - CUSTOMBOX_OUTSIDE_OFFSET - 20; | |
4850 stop.x = start.x; | |
4851 if(!pSettings->FlipDisplay) | |
4852 { | |
4853 start.y = t7l1.WindowY0 + ASCENT_GRAPH_YPIXEL + 5; | |
4854 } | |
4855 else | |
4856 { | |
4857 start.y = t7l3.WindowY0 - 25 + ASCENT_GRAPH_YPIXEL + 5; | |
4858 } | |
4859 stop.y = start.y - countDownSec * (ASCENT_GRAPH_YPIXEL / (float)(pSettings->slowExitTime * 60.0)); | |
4860 if(stop.y >= 470) stop.y = 470; | |
4861 if(!pSettings->FlipDisplay) | |
4862 { | |
4863 stop.y += 5; | |
4864 } | |
4865 GFX_draw_thick_line(15,&t7screen, start, stop, 3); | |
4866 /* mark diver depth */ | |
4867 start.x = CUSTOMBOX_LINE_LEFT - CUSTOMBOX_OUTSIDE_OFFSET - 30; | |
4868 stop.x = start.x + 24; | |
4869 | |
4870 start.y = start.y - (stateUsed->lifeData.depth_meter * (ASCENT_GRAPH_YPIXEL) / pSettings->last_stop_depth_meter); | |
4871 stop.y = start.y; | |
4872 GFX_draw_thick_line(10,&t7screen, start, stop, 9); | |
4949 } | 4873 } |
4950 return color; | 4874 return color; |
4951 } | 4875 } |
4952 void t7_tick(void) | 4876 void t7_tick(void) |
4953 { | 4877 { |