Mercurial > public > ostc4
comparison Discovery/Src/t6_apnea.c @ 38:5f11787b4f42
include in ostc4 repository
| author | heinrichsweikamp |
|---|---|
| date | Sat, 28 Apr 2018 11:52:34 +0200 |
| parents | |
| children | cc9c18075e00 |
comparison
equal
deleted
inserted
replaced
| 37:ccc45c0e1ea2 | 38:5f11787b4f42 |
|---|---|
| 1 /////////////////////////////////////////////////////////////////////////////// | |
| 2 /// -*- coding: UTF-8 -*- | |
| 3 /// | |
| 4 /// \file Discovery/Src/t6_apnea.c | |
| 5 /// \brief dive screen for Gauge mode | |
| 6 /// \author Heinrichs Weikamp gmbh | |
| 7 /// \date 1-Feb-2017 | |
| 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 ------------------------------------------------------------------*/ | |
| 30 #include "t6_apnea.h" | |
| 31 | |
| 32 #include "data_exchange_main.h" | |
| 33 #include "decom.h" | |
| 34 #include "gfx_fonts.h" | |
| 35 #include "math.h" | |
| 36 #include "tHome.h" | |
| 37 #include "simulation.h" | |
| 38 #include "timer.h" | |
| 39 #include "unit.h" | |
| 40 | |
| 41 /* Private variables ---------------------------------------------------------*/ | |
| 42 GFX_DrawCfgScreen t6screen; | |
| 43 GFX_DrawCfgWindow t6l1; | |
| 44 GFX_DrawCfgWindow t6r1; | |
| 45 GFX_DrawCfgWindow t6c1; | |
| 46 GFX_DrawCfgWindow t6c2; | |
| 47 GFX_DrawCfgWindow t6c3; // for menu text | |
| 48 | |
| 49 extern float depthLastCall[9]; | |
| 50 extern uint8_t idDepthLastCall; | |
| 51 extern float temperatureLastCall[3]; | |
| 52 extern uint8_t idTemperatureLastCall; | |
| 53 | |
| 54 uint8_t t6_selection_customview = 0; | |
| 55 | |
| 56 /* Importend function prototypes ---------------------------------------------*/ | |
| 57 extern uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium); | |
| 58 | |
| 59 /* Private types -------------------------------------------------------------*/ | |
| 60 | |
| 61 #define CUSTOMBOX_LINE_LEFT (250) | |
| 62 #define CUSTOMBOX_LINE_RIGHT (549) | |
| 63 #define CUSTOMBOX_INSIDE_OFFSET (2) | |
| 64 #define CUSTOMBOX_OUTSIDE_OFFSET (2) | |
| 65 | |
| 66 #define TEXTSIZE 16 | |
| 67 | |
| 68 const uint8_t t6_customviewsStandard[] = | |
| 69 { | |
| 70 CVIEW_noneOrDebug, | |
| 71 CVIEW_T3_Temperature, | |
| 72 CVIEW_T3_END | |
| 73 }; | |
| 74 | |
| 75 const uint8_t *t6_customviews = t6_customviewsStandard; | |
| 76 const uint8_t t6_customviewSurfaceMode = CVIEW_T3_ApnoeSurfaceInfo; | |
| 77 | |
| 78 /* Private function prototypes -----------------------------------------------*/ | |
| 79 void t6_refresh_divemode(void); | |
| 80 void t6_refresh_customview(float depth); | |
| 81 | |
| 82 uint8_t t6_test_customview_warnings(void); | |
| 83 void t6_show_customview_warnings(void); | |
| 84 void t6_compass(uint16_t ActualHeading, uint16_t UserSetHeading); | |
| 85 | |
| 86 /* Exported functions --------------------------------------------------------*/ | |
| 87 | |
| 88 // for tHomeDiveMenuControl() in tHome.c and t6_refresh_customview | |
| 89 uint8_t t6_getCustomView(void) | |
| 90 { | |
| 91 if(stateUsed->lifeData.counterSecondsShallowDepth) | |
| 92 return t6_customviewSurfaceMode; | |
| 93 else | |
| 94 return t6_selection_customview; | |
| 95 } | |
| 96 | |
| 97 void t6_init(void) | |
| 98 { | |
| 99 t6_selection_customview = t6_customviewsStandard[0]; | |
| 100 | |
| 101 t6screen.FBStartAdress = 0; | |
| 102 t6screen.ImageHeight = 480; | |
| 103 t6screen.ImageWidth = 800; | |
| 104 t6screen.LayerIndex = 1; | |
| 105 | |
| 106 t6l1.Image = &t6screen; | |
| 107 t6l1.WindowNumberOfTextLines = 2; | |
| 108 t6l1.WindowLineSpacing = 19; // Abstand von Y0 | |
| 109 t6l1.WindowTab = 100; | |
| 110 t6l1.WindowX0 = 0; | |
| 111 t6l1.WindowX1 = BigFontSeperationLeftRight - 5; | |
| 112 t6l1.WindowY0 = BigFontSeperationTopBottom + 5; | |
| 113 t6l1.WindowY1 = 479; | |
| 114 | |
| 115 t6r1.Image = &t6screen; | |
| 116 t6r1.WindowNumberOfTextLines = t6l1.WindowNumberOfTextLines; | |
| 117 t6r1.WindowLineSpacing = t6l1.WindowLineSpacing; | |
| 118 t6r1.WindowTab = t6l1.WindowTab; | |
| 119 t6r1.WindowX0 = BigFontSeperationLeftRight + 5; | |
| 120 t6r1.WindowX1 = 799; | |
| 121 t6r1.WindowY0 = t6l1.WindowY0; | |
| 122 t6r1.WindowY1 = t6l1.WindowY1; | |
| 123 | |
| 124 t6c1.Image = &t6screen; | |
| 125 t6c1.WindowNumberOfTextLines = 2; | |
| 126 t6c1.WindowLineSpacing = t6l1.WindowLineSpacing; | |
| 127 t6c1.WindowX0 = 0; | |
| 128 t6c1.WindowX1 = 799; | |
| 129 t6c1.WindowY0 = 0; | |
| 130 t6c1.WindowY1 = BigFontSeperationTopBottom - 5; | |
| 131 | |
| 132 t6c2.Image = &t6screen; | |
| 133 t6c2.WindowNumberOfTextLines = 3; | |
| 134 t6c2.WindowLineSpacing = 58; | |
| 135 t6c2.WindowX0 = 370; | |
| 136 t6c2.WindowX1 = 799; | |
| 137 t6c2.WindowY0 = 0; | |
| 138 t6c2.WindowY1 = BigFontSeperationTopBottom - 5; | |
| 139 t6c2.WindowTab = 600; | |
| 140 | |
| 141 t6c3.Image = &t6screen; | |
| 142 t6c3.WindowNumberOfTextLines = 1; | |
| 143 t6c3.WindowLineSpacing = 0; // Abstand von Y0 | |
| 144 t6c3.WindowTab = 100; | |
| 145 t6c3.WindowX0 = CUSTOMBOX_LINE_LEFT + CUSTOMBOX_INSIDE_OFFSET; | |
| 146 t6c3.WindowX1 = CUSTOMBOX_LINE_RIGHT - CUSTOMBOX_INSIDE_OFFSET; | |
| 147 t6c3.WindowY0 = 0; | |
| 148 t6c3.WindowY1 = 69; | |
| 149 } | |
| 150 | |
| 151 | |
| 152 void t6_refresh(void) | |
| 153 { | |
| 154 static uint8_t last_mode = MODE_SURFACE; | |
| 155 | |
| 156 SStateList status; | |
| 157 get_globalStateList(&status); | |
| 158 | |
| 159 if(stateUsed->mode != MODE_DIVE) | |
| 160 { | |
| 161 last_mode = MODE_SURFACE; | |
| 162 settingsGetPointer()->design = 7; | |
| 163 if(t6screen.FBStartAdress) | |
| 164 { | |
| 165 releaseFrame(24,t6screen.FBStartAdress); | |
| 166 t6screen.FBStartAdress = 0; | |
| 167 } | |
| 168 return; | |
| 169 } | |
| 170 | |
| 171 if(status.base != BaseHome) | |
| 172 return; | |
| 173 | |
| 174 t6screen.FBStartAdress = getFrame(24); | |
| 175 | |
| 176 if(last_mode != MODE_DIVE) | |
| 177 { | |
| 178 last_mode = MODE_DIVE; | |
| 179 t6_selection_customview = *t6_customviews; | |
| 180 } | |
| 181 | |
| 182 if(status.page == PageSurface) | |
| 183 set_globalState(StD); | |
| 184 | |
| 185 t6_refresh_divemode(); | |
| 186 GFX_SetFramesTopBottom(t6screen.FBStartAdress, NULL,480); | |
| 187 releaseAllFramesExcept(24,t6screen.FBStartAdress); | |
| 188 } | |
| 189 | |
| 190 /* Private functions ---------------------------------------------------------*/ | |
| 191 | |
| 192 void t6_refresh_divemode(void) | |
| 193 { | |
| 194 char text[512]; | |
| 195 uint8_t customview_warnings = 0; | |
| 196 float depth_meter = 0.0; | |
| 197 | |
| 198 // everything like lines, depth, ascent graph and divetime or counterSecondsShallowDepth | |
| 199 depth_meter = t3_basics_lines_depth_and_divetime(&t6screen, &t6l1, &t6r1, DIVEMODE_Apnea); | |
| 200 | |
| 201 | |
| 202 // customview | |
| 203 if(stateUsed->warnings.numWarnings) | |
| 204 customview_warnings = t6_test_customview_warnings(); | |
| 205 | |
| 206 if(customview_warnings && warning_count_high_time) | |
| 207 t3_basics_show_customview_warnings(&t6c1); | |
| 208 else | |
| 209 t6_refresh_customview(depth_meter); | |
| 210 | |
| 211 if(stateUsed->warnings.lowBattery) | |
| 212 t3_basics_battery_low_customview_extra(&t6c1); | |
| 213 | |
| 214 | |
| 215 /* Menu Selection (and gas mix) */ | |
| 216 if(get_globalState() == StDBEAR) | |
| 217 { | |
| 218 snprintf(text,TEXTSIZE,"\a\001%c%c", TXT_2BYTE, TXT2BYTE_DiveBearingQ); | |
| 219 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 220 } | |
| 221 else if(get_globalState() == StDRAVG) | |
| 222 { | |
| 223 snprintf(text,TEXTSIZE,"\a\001%c%c", TXT_2BYTE, TXT2BYTE_DiveResetAvgQ); | |
| 224 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 225 } | |
| 226 else if(get_globalState() == StDQUIT) | |
| 227 { | |
| 228 snprintf(text,TEXTSIZE,"\a\001%c%c", TXT_2BYTE, TXT2BYTE_DiveQuitQ); | |
| 229 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 230 } | |
| 231 else if(get_globalState() == StDSIM1) | |
| 232 { | |
| 233 snprintf(text,TEXTSIZE,"\a\001%c%c", TXT_2BYTE, TXT2BYTE_DiveQuitQ); | |
| 234 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 235 } | |
| 236 else if(get_globalState() == StDSIM2) | |
| 237 { | |
| 238 if(settingsGetPointer()->nonMetricalSystem) | |
| 239 snprintf(text,TEXTSIZE,"\a\001" " Sim:-3.33ft "); | |
| 240 else | |
| 241 snprintf(text,TEXTSIZE,"\a\001" " Sim:-1m "); | |
| 242 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 243 snprintf(text,TEXTSIZE,"\a\f %u %c%c" | |
| 244 , unit_depth_integer(simulation_get_aim_depth()) | |
| 245 , unit_depth_char1() | |
| 246 , unit_depth_char2() | |
| 247 ); | |
| 248 GFX_write_string_color(&FontT42,&t6l1,text,0,CLUT_WarningYellow); | |
| 249 | |
| 250 } | |
| 251 else if(get_globalState() == StDSIM3) | |
| 252 { | |
| 253 if(settingsGetPointer()->nonMetricalSystem) | |
| 254 snprintf(text,TEXTSIZE,"\a\001" " Sim:+3.33ft "); | |
| 255 else | |
| 256 snprintf(text,TEXTSIZE,"\a\001" " Sim:+1m "); | |
| 257 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 258 snprintf(text,TEXTSIZE,"\a\f %u %c%c" | |
| 259 , unit_depth_integer(simulation_get_aim_depth()) | |
| 260 , unit_depth_char1() | |
| 261 , unit_depth_char2() | |
| 262 ); | |
| 263 GFX_write_string_color(&FontT42,&t6l1,text,0,CLUT_WarningYellow); | |
| 264 } | |
| 265 else if(get_globalState() == StDSIM4) | |
| 266 { | |
| 267 snprintf(text,TEXTSIZE,"\a\001" " Sim:+5' "); | |
| 268 GFX_write_string_color(&FontT48,&t6c3,text,0,CLUT_WarningYellow); | |
| 269 snprintf(text,TEXTSIZE,"\a\f %u %c%c" | |
| 270 , unit_depth_integer(simulation_get_aim_depth()) | |
| 271 , unit_depth_char1() | |
| 272 , unit_depth_char2() | |
| 273 ); | |
| 274 GFX_write_string_color(&FontT42,&t6l1,text,0,CLUT_WarningYellow); | |
| 275 } | |
| 276 else | |
| 277 { | |
| 278 // keep empty | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 | |
| 283 void t6_battery_low_customview_extra(void) | |
| 284 { | |
| 285 char TextC1[256]; | |
| 286 | |
| 287 TextC1[0] = '\002'; | |
| 288 TextC1[1] = '\f'; | |
| 289 TextC1[2] = '\025'; | |
| 290 TextC1[3] = '3'; | |
| 291 TextC1[4] = '1'; | |
| 292 TextC1[5] = '1'; | |
| 293 TextC1[6] = '1'; | |
| 294 TextC1[7] = '1'; | |
| 295 TextC1[8] = '1'; | |
| 296 TextC1[9] = '1'; | |
| 297 TextC1[10] = '1'; | |
| 298 TextC1[11] = '1'; | |
| 299 TextC1[12] = '1'; | |
| 300 TextC1[13] = '1'; | |
| 301 TextC1[14] = '0'; | |
| 302 TextC1[15] = 0; | |
| 303 | |
| 304 if(!warning_count_high_time) | |
| 305 TextC1[4] = '2'; | |
| 306 | |
| 307 GFX_write_string(&Batt24,&t6c1,TextC1,0); | |
| 308 } | |
| 309 | |
| 310 | |
| 311 void t6_battery_scooter_customview_extra(void) | |
| 312 { | |
| 313 char TextC1[256]; | |
| 314 | |
| 315 TextC1[0] = '\001'; | |
| 316 TextC1[1] = '\f'; | |
| 317 TextC1[2] = '\032'; | |
| 318 TextC1[3] = '3'; | |
| 319 TextC1[4] = '1'; | |
| 320 TextC1[5] = '1'; | |
| 321 TextC1[6] = '1'; | |
| 322 TextC1[7] = '1'; | |
| 323 TextC1[8] = '1'; | |
| 324 TextC1[9] = '1'; | |
| 325 TextC1[10] = '1'; | |
| 326 TextC1[11] = '1'; | |
| 327 TextC1[12] = '1'; | |
| 328 TextC1[13] = '1'; | |
| 329 TextC1[14] = '0'; | |
| 330 TextC1[15] = 0; | |
| 331 | |
| 332 for(int i=1;i<=10;i++) | |
| 333 { | |
| 334 if( stateUsed_scooterRemainingBattCapacity() > (9 * i)) | |
| 335 TextC1[i+3] += 1; | |
| 336 } | |
| 337 | |
| 338 if(stateUsed_scooterRemainingBattCapacity() < 10) | |
| 339 TextC1[2] = '\025'; | |
| 340 | |
| 341 if(!warning_count_high_time) | |
| 342 TextC1[4] = '2'; | |
| 343 | |
| 344 if(stateUsed->lifeData.scooterAgeInMilliSeconds > 1500) | |
| 345 TextC1[2] = '\031'; | |
| 346 | |
| 347 GFX_write_string(&Batt24,&t6c1,TextC1,0); | |
| 348 } | |
| 349 | |
| 350 | |
| 351 void t6_change_customview(void) | |
| 352 { | |
| 353 t3_basics_change_customview(&t6_selection_customview, t6_customviews); | |
| 354 } | |
| 355 | |
| 356 | |
| 357 void t6_refresh_customview(float depth) | |
| 358 { | |
| 359 uint8_t customViewLeftSide = CVIEW_T3_MaxDepth; | |
| 360 | |
| 361 if((t6_selection_customview == CVIEW_sensors) &&(stateUsed->diveSettings.ccrOption == 0)) | |
| 362 t6_change_customview(); | |
| 363 | |
| 364 if(t6_getCustomView() == CVIEW_T3_ApnoeSurfaceInfo) | |
| 365 customViewLeftSide = CVIEW_T3_ApnoeSurfaceInfo; | |
| 366 | |
| 367 t3_basics_refresh_customview(depth, customViewLeftSide, &t6screen, &t6c1, &t6c2, DIVEMODE_Apnea); | |
| 368 t3_basics_refresh_apnoeRight(depth, t6_getCustomView(), &t6screen, &t6c1, &t6c2, DIVEMODE_Apnea); | |
| 369 } | |
| 370 | |
| 371 | |
| 372 uint8_t t6_test_customview_warnings(void) | |
| 373 { | |
| 374 uint8_t count = 0; | |
| 375 | |
| 376 count = 0; | |
| 377 return count; | |
| 378 } | |
| 379 | |
| 380 /* | |
| 381 | |
| 382 char text[512]; | |
| 383 uint16_t textpointer = 0; | |
| 384 | |
| 385 | |
| 386 // CVIEW_T3_Temperature | |
| 387 float temperatureThisCall; | |
| 388 float temperature; | |
| 389 | |
| 390 | |
| 391 // CVIEW_T3_StopWatch | |
| 392 SDivetime Stopwatch = {0,0,0,0}; | |
| 393 float fAverageDepth, fAverageDepthAbsolute; | |
| 394 uint16_t tempWinX0; | |
| 395 uint16_t tempWinY0; | |
| 396 | |
| 397 switch(t6_selection_customview) | |
| 398 { | |
| 399 case CVIEW_T3_ApnoeTimes: | |
| 400 break; | |
| 401 | |
| 402 case CVIEW_T3_StopWatch: | |
| 403 Stopwatch.Total = timer_Stopwatch_GetTime(); | |
| 404 Stopwatch.Minutes = Stopwatch.Total / 60; | |
| 405 Stopwatch.Seconds = Stopwatch.Total - ( Stopwatch.Minutes * 60 ); | |
| 406 fAverageDepth = timer_Stopwatch_GetAvarageDepth_Meter(); | |
| 407 fAverageDepthAbsolute = stateUsed->lifeData.average_depth_meter; | |
| 408 | |
| 409 snprintf(text,TEXTSIZE,"\032\f%c",TXT_AvgDepth); | |
| 410 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 411 snprintf(text,TEXTSIZE,"\030\003\016%01.1f",fAverageDepthAbsolute); | |
| 412 GFX_write_string(&FontT105,&t6c1,text,0); | |
| 413 | |
| 414 tempWinX0 = t6c1.WindowX0; | |
| 415 tempWinY0 = t6c1.WindowY0; | |
| 416 t6c1.WindowX0 = 480; | |
| 417 // snprintf(text,TEXTSIZE,"\032\f%c%c - %c",TXT_2BYTE, TXT2BYTE_Clock, TXT_AvgDepth); | |
| 418 snprintf(text,TEXTSIZE,"\032\f%c", TXT_Stopwatch); | |
| 419 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 420 snprintf(text,TEXTSIZE,"\030\016%01.1f",fAverageDepth); | |
| 421 GFX_write_string(&FontT105,&t6c1,text,0); | |
| 422 t6c1.WindowY0 = 100; | |
| 423 snprintf(text,TEXTSIZE,"\030%u:\016\016%02u",Stopwatch.Minutes, Stopwatch.Seconds); | |
| 424 GFX_write_string(&FontT105,&t6c1,text,0); | |
| 425 t6c1.WindowX0 = tempWinX0; | |
| 426 t6c1.WindowY0 = tempWinY0; | |
| 427 break; | |
| 428 | |
| 429 case CVIEW_T3_Temperature: | |
| 430 snprintf(text,TEXTSIZE,"\032\f%c",TXT_Temperature); | |
| 431 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 432 // mean value | |
| 433 temperatureThisCall = unit_temperature_float(stateUsed->lifeData.temperature_celsius); | |
| 434 temperature = (temperatureThisCall + temperatureLastCall[0] + temperatureLastCall[1] + temperatureLastCall[2]) / 4.0f; | |
| 435 idTemperatureLastCall++; | |
| 436 if(idTemperatureLastCall >= 3) | |
| 437 idTemperatureLastCall = 0; | |
| 438 temperatureLastCall[idTemperatureLastCall] = temperatureThisCall; | |
| 439 textpointer = snprintf(text,TEXTSIZE,"\030\003\016%01.1f \140",temperature); // "\016\016%01.1f `" + C or F | |
| 440 if(settingsGetPointer()->nonMetricalSystem == 0) | |
| 441 text[textpointer++] = 'C'; | |
| 442 else | |
| 443 text[textpointer++] = 'F'; | |
| 444 text[textpointer++] = 0; | |
| 445 GFX_write_string(&FontT105,&t6c1,text,0); | |
| 446 break; | |
| 447 | |
| 448 case CVIEW_Compass: | |
| 449 snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); | |
| 450 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 451 snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); | |
| 452 GFX_write_string(&FontT105,&t6c1,text,0); | |
| 453 t6_compass((uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); | |
| 454 break; | |
| 455 | |
| 456 case CVIEW_T3_MaxDepth: | |
| 457 default: | |
| 458 snprintf(text,TEXTSIZE,"\032\f%c",TXT_MaxDepth); | |
| 459 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 460 snprintf(text,TEXTSIZE,"\020\003\016%01.1f",unit_depth_float(stateUsed->lifeData.max_depth_meter)); | |
| 461 t3_basics_colorscheme_mod(text); | |
| 462 GFX_write_string(&FontT105,&t6c1,text,1); | |
| 463 break; | |
| 464 } | |
| 465 } | |
| 466 | |
| 467 | |
| 468 void t6_show_customview_warnings(void) | |
| 469 { | |
| 470 char text[256], textMain[256]; | |
| 471 uint8_t textpointer, textpointerMain, lineFree, more; | |
| 472 | |
| 473 snprintf(text,TEXTSIZE,"\025\f%c",TXT_Warning); | |
| 474 GFX_write_string(&FontT42,&t6c1,text,0); | |
| 475 | |
| 476 lineFree = 1; | |
| 477 more = 0; | |
| 478 | |
| 479 textpointerMain = 0; | |
| 480 textMain[textpointerMain++] = '\025'; | |
| 481 textMain[textpointerMain++] = '\003'; | |
| 482 | |
| 483 textpointer = 0; | |
| 484 | |
| 485 text[textpointer++] = '\021'; | |
| 486 text[textpointer++] = TXT_2BYTE; | |
| 487 text[textpointer++] = TXT2BYTE_WarnDecoMissed; | |
| 488 if(stateUsed->warnings.decoMissed) | |
| 489 { | |
| 490 text[textpointer - 3] = '\025'; | |
| 491 if(lineFree) | |
| 492 { | |
| 493 textMain[textpointerMain++] = TXT_2BYTE; | |
| 494 textMain[textpointerMain++] = text[textpointer - 1]; | |
| 495 textMain[textpointerMain] = 0; | |
| 496 lineFree--; | |
| 497 } | |
| 498 else | |
| 499 { | |
| 500 more++; | |
| 501 } | |
| 502 } | |
| 503 | |
| 504 text[textpointer++] = '\t'; | |
| 505 text[textpointer++] = '\021'; | |
| 506 text[textpointer++] = TXT_2BYTE; | |
| 507 text[textpointer++] = TXT2BYTE_WarnPPO2Low; | |
| 508 if(stateUsed->warnings.ppO2Low) | |
| 509 { | |
| 510 text[textpointer - 3] = '\025'; | |
| 511 if(lineFree) | |
| 512 { | |
| 513 textMain[textpointerMain++] = TXT_2BYTE; | |
| 514 textMain[textpointerMain++] = text[textpointer - 1]; | |
| 515 textMain[textpointerMain] = 0; | |
| 516 lineFree--; | |
| 517 } | |
| 518 else | |
| 519 { | |
| 520 more++; | |
| 521 } | |
| 522 } | |
| 523 | |
| 524 text[textpointer++] = '\n'; | |
| 525 text[textpointer++] = '\r'; | |
| 526 text[textpointer++] = '\021'; | |
| 527 text[textpointer++] = TXT_2BYTE; | |
| 528 text[textpointer++] = TXT2BYTE_WarnPPO2High; | |
| 529 if(stateUsed->warnings.ppO2High) | |
| 530 { | |
| 531 text[textpointer - 3] = '\025'; | |
| 532 if(lineFree) | |
| 533 { | |
| 534 textMain[textpointerMain++] = TXT_2BYTE; | |
| 535 textMain[textpointerMain++] = text[textpointer - 1]; | |
| 536 textMain[textpointerMain] = 0; | |
| 537 lineFree--; | |
| 538 } | |
| 539 else | |
| 540 { | |
| 541 more++; | |
| 542 } | |
| 543 } | |
| 544 | |
| 545 text[textpointer++] = '\t'; | |
| 546 text[textpointer++] = '\021'; | |
| 547 text[textpointer++] = TXT_2BYTE; | |
| 548 text[textpointer++] = TXT2BYTE_WarnFallback; | |
| 549 if(stateUsed->warnings.fallback) | |
| 550 { | |
| 551 text[textpointer - 3] = '\025'; | |
| 552 if(lineFree) | |
| 553 { | |
| 554 textMain[textpointerMain++] = TXT_2BYTE; | |
| 555 textMain[textpointerMain++] = text[textpointer - 1]; | |
| 556 textMain[textpointerMain] = 0; | |
| 557 lineFree--; | |
| 558 } | |
| 559 else | |
| 560 { | |
| 561 more++; | |
| 562 } | |
| 563 } | |
| 564 | |
| 565 text[textpointer++] = '\n'; | |
| 566 text[textpointer++] = '\r'; | |
| 567 text[textpointer++] = '\021'; | |
| 568 text[textpointer++] = TXT_2BYTE; | |
| 569 text[textpointer++] = TXT2BYTE_WarnSensorLinkLost; | |
| 570 if(stateUsed->warnings.sensorLinkLost) | |
| 571 { | |
| 572 text[textpointer - 3] = '\025'; | |
| 573 if(lineFree) | |
| 574 { | |
| 575 textMain[textpointerMain++] = TXT_2BYTE; | |
| 576 textMain[textpointerMain++] = text[textpointer - 1]; | |
| 577 textMain[textpointerMain] = 0; | |
| 578 lineFree--; | |
| 579 } | |
| 580 else | |
| 581 { | |
| 582 more++; | |
| 583 } | |
| 584 } | |
| 585 | |
| 586 text[textpointer] = 0; | |
| 587 GFX_write_string(&FontT48,&t6c1,textMain,1); | |
| 588 if(more) | |
| 589 { | |
| 590 GFX_write_string(&FontT48,&t6c2,text,1); | |
| 591 } | |
| 592 } | |
| 593 | |
| 594 | |
| 595 void t6_change_customview(void) | |
| 596 { | |
| 597 const uint8_t *pViews; | |
| 598 pViews = t6_customviews; | |
| 599 | |
| 600 while((*pViews != CVIEW_T3_END) && (*pViews != t6_selection_customview)) | |
| 601 {pViews++;} | |
| 602 | |
| 603 if(*pViews < CVIEW_T3_END) | |
| 604 pViews++; | |
| 605 | |
| 606 if(*pViews == CVIEW_T3_END) | |
| 607 { | |
| 608 t6_selection_customview = t6_customviews[0]; | |
| 609 } | |
| 610 else | |
| 611 t6_selection_customview = *pViews; | |
| 612 } | |
| 613 | |
| 614 | |
| 615 void t3_basics_colorscheme_mod(char *text) | |
| 616 { | |
| 617 if((text[0] == '\020') && !GFX_is_colorschemeDiveStandard()) | |
| 618 { | |
| 619 text[0] = '\027'; | |
| 620 } | |
| 621 } | |
| 622 | |
| 623 point_t t6_compass_circle(uint8_t id, uint16_t degree) | |
| 624 { | |
| 625 float fCos, fSin; | |
| 626 const float piMult = ((2 * 3.14159) / 360); | |
| 627 // const int radius[4] = {95,105,115,60}; | |
| 628 const int radius[4] = {85,95,105,90}; | |
| 629 const point_t offset = {.x = 600, .y = 116}; | |
| 630 | |
| 631 static point_t r[4][360] = { 0 }; | |
| 632 | |
| 633 if(r[0][0].y == 0) | |
| 634 { | |
| 635 for(int i=0;i<360;i++) | |
| 636 { | |
| 637 fCos = cos(i * piMult); | |
| 638 fSin = sin(i * piMult); | |
| 639 for(int j=0;j<4;j++) | |
| 640 { | |
| 641 r[j][i].x = offset.x + (int)(fSin * radius[j]); | |
| 642 r[j][i].y = offset.y + (int)(fCos * radius[j]); | |
| 643 } | |
| 644 } | |
| 645 } | |
| 646 if(id > 3) id = 0; | |
| 647 if(degree > 359) degree = 0; | |
| 648 return r[id][degree]; | |
| 649 } | |
| 650 | |
| 651 | |
| 652 void t6_compass(uint16_t ActualHeading, uint16_t UserSetHeading) | |
| 653 { | |
| 654 uint16_t LineHeading; | |
| 655 point_t center; | |
| 656 static int32_t LastHeading = 0; | |
| 657 int32_t newHeading = 0; | |
| 658 int32_t diff = 0; | |
| 659 int32_t diff2 = 0; | |
| 660 | |
| 661 int32_t diffAbs = 0; | |
| 662 int32_t diffAbs2 = 0; | |
| 663 | |
| 664 newHeading = ActualHeading; | |
| 665 | |
| 666 diff = newHeading - LastHeading; | |
| 667 | |
| 668 if(newHeading < LastHeading) | |
| 669 diff2 = newHeading + 360 - LastHeading; | |
| 670 else | |
| 671 diff2 = newHeading - 360 - LastHeading; | |
| 672 | |
| 673 diffAbs = diff; | |
| 674 if(diffAbs < 0) | |
| 675 diffAbs *= -1; | |
| 676 | |
| 677 diffAbs2 = diff2; | |
| 678 if(diffAbs2 < 0) | |
| 679 diffAbs2 *= -1; | |
| 680 | |
| 681 | |
| 682 if(diffAbs <= diffAbs2) | |
| 683 newHeading = LastHeading + (diff / 2); | |
| 684 else | |
| 685 newHeading = LastHeading + (diff2 / 2); | |
| 686 | |
| 687 if(newHeading < 0) | |
| 688 newHeading += 360; | |
| 689 else | |
| 690 if(newHeading >= 360) | |
| 691 newHeading -= 360; | |
| 692 | |
| 693 LastHeading = newHeading; | |
| 694 ActualHeading = newHeading; | |
| 695 | |
| 696 if (ActualHeading < 90) | |
| 697 ActualHeading += 360; | |
| 698 | |
| 699 while(ActualHeading > 359) ActualHeading -= 360; | |
| 700 | |
| 701 LineHeading = 360 - ActualHeading; | |
| 702 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(0,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font030); // North | |
| 703 LineHeading += 90; | |
| 704 if(LineHeading > 359) LineHeading -= 360; | |
| 705 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Maintick | |
| 706 LineHeading += 90; | |
| 707 if(LineHeading > 359) LineHeading -= 360; | |
| 708 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 709 LineHeading += 90; | |
| 710 if(LineHeading > 359) LineHeading -= 360; | |
| 711 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 712 | |
| 713 LineHeading = 360 - ActualHeading; | |
| 714 LineHeading += 45; | |
| 715 if(LineHeading > 359) LineHeading -= 360; | |
| 716 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
| 717 LineHeading += 90; | |
| 718 if(LineHeading > 359) LineHeading -= 360; | |
| 719 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 720 LineHeading += 90; | |
| 721 if(LineHeading > 359) LineHeading -= 360; | |
| 722 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 723 LineHeading += 90; | |
| 724 if(LineHeading > 359) LineHeading -= 360; | |
| 725 GFX_draw_thick_line(5,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 726 | |
| 727 LineHeading = 360 - ActualHeading; | |
| 728 LineHeading += 22; | |
| 729 if(LineHeading > 359) LineHeading -= 360; | |
| 730 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
| 731 LineHeading += 45; | |
| 732 if(LineHeading > 359) LineHeading -= 360; | |
| 733 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 734 LineHeading += 45; | |
| 735 if(LineHeading > 359) LineHeading -= 360; | |
| 736 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 737 LineHeading += 45; | |
| 738 if(LineHeading > 359) LineHeading -= 360; | |
| 739 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 740 LineHeading += 45; | |
| 741 if(LineHeading > 359) LineHeading -= 360; | |
| 742 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); // Subtick | |
| 743 LineHeading += 45; | |
| 744 if(LineHeading > 359) LineHeading -= 360; | |
| 745 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 746 LineHeading += 45; | |
| 747 if(LineHeading > 359) LineHeading -= 360; | |
| 748 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 749 LineHeading += 45; | |
| 750 if(LineHeading > 359) LineHeading -= 360; | |
| 751 GFX_draw_thick_line(3,&t6screen, t6_compass_circle(1,LineHeading), t6_compass_circle(2,LineHeading), CLUT_Font031); | |
| 752 | |
| 753 if(UserSetHeading) | |
| 754 { | |
| 755 LineHeading = UserSetHeading + 360 - ActualHeading; | |
| 756 if(LineHeading > 359) LineHeading -= 360; | |
| 757 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(3,LineHeading), t6_compass_circle(2,LineHeading), CLUT_CompassUserHeadingTick); | |
| 758 | |
| 759 // R�ckpeilung, User Back Heading | |
| 760 LineHeading = UserSetHeading + 360 + 180 - ActualHeading; | |
| 761 if(LineHeading > 359) LineHeading -= 360; | |
| 762 if(LineHeading > 359) LineHeading -= 360; | |
| 763 GFX_draw_thick_line(9,&t6screen, t6_compass_circle(3,LineHeading), t6_compass_circle(2,LineHeading), CLUT_CompassUserBackHeadingTick); | |
| 764 } | |
| 765 | |
| 766 center.x = 600; | |
| 767 center.y = 116; | |
| 768 GFX_draw_circle(&t6screen, center, 106, CLUT_Font030); | |
| 769 GFX_draw_circle(&t6screen, center, 107, CLUT_Font030); | |
| 770 GFX_draw_circle(&t6screen, center, 108, CLUT_Font030); | |
| 771 } | |
| 772 */ | |
| 773 |
