Mercurial > public > ostc4
diff Discovery/Src/tHome.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | a6f0881074a4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tHome.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,450 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tHome.c +/// \brief Control for Surface and Dive Templates +/// \author heinrichs weikamp gmbh +/// \date 10-November-2014 +/// +/// \details +/// +/// $Id$ +/////////////////////////////////////////////////////////////////////////////// +/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU General Public License for more details. +/// +/// You should have received a copy of the GNU General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +////////////////////////////////////////////////////////////////////////////// + +/* Includes ------------------------------------------------------------------*/ +#include "tHome.h" + +#include "data_exchange_main.h" // for dataOutGetPointer() +#include "gfx_fonts.h" +#include "t3.h" +#include "t4_tetris.h" +#include "t5_gauge.h" +#include "t6_apnea.h" +#include "t7.h" +#include "t9.h" +#include "tDebug.h" +#include "timer.h" // for timer_Stopwatch_Restart +#include "tMenu.h" +#include "tMenuEditGasOC.h" // for openEdit_DiveSelectBetterGas() +#include "tMenuEditSetpoint.h" // for openEdit_DiveSelectBetterSetpoint() +#include "simulation.h" + +/* Private types -------------------------------------------------------------*/ + +/* Exported variables --------------------------------------------------------*/ +_Bool warning_count_high_time = 0; +_Bool display_count_high_time = 0; + +uint8_t errorsInSettings = 0; +/* Private variables ---------------------------------------------------------*/ +static uint8_t warning_toogle_count; +static uint16_t display_toogle_count; +static uint16_t tHome_tick_count_cview; +static uint16_t tHome_tick_count_field; + +uint32_t cv_configuration = 0xFFFFFFFF; +const uint8_t cv_changelist[6] = {CVIEW_Compass, CVIEW_SummaryOfLeftCorner, CVIEW_Tissues, CVIEW_Profile, CVIEW_EADTime, CVIEW_Gaslist}; + +/* Private function prototypes -----------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +void set_globalState_tHome(void) +{ + if(stateUsed->mode == MODE_DIVE) + set_globalState(StD); + else + set_globalState(StS); +} + + +void switch_to_SimData_tHome(void) +{ + set_stateUsedToSim(); +} + + +void switch_to_RealData_tHome(void) +{ + set_stateUsedToReal(); +} + + +void tHome_init(void) +{ + t7_init(); // standard + surface + t3_init(); // big font + t4_init(); // game + t5_init(); // gauge + t6_init(); // apnea + t9_init(); // bonex +} + + +void tHome_init_compass(void) +{ + init_t7_compass(); + init_t9_compass(); +} + + +void tHome_refresh(void) +{ + SSettings* pSettings = settingsGetPointer(); + + warning_toogle_count++; + if(warning_toogle_count >= 2* pSettings->warning_blink_dsec) + warning_toogle_count = 0; + + if(warning_toogle_count >= pSettings->warning_blink_dsec) + warning_count_high_time = 1; + else + warning_count_high_time = 0; + + + display_toogle_count++; + if(display_toogle_count >= 2* pSettings->display_toogle_desc) + display_toogle_count = 0; + + if(display_toogle_count >= pSettings->display_toogle_desc) + display_count_high_time = 1; + else + display_count_high_time = 0; + + + if(pSettings->design == 6) + t6_refresh(); + else + if(pSettings->design == 5) + t5_refresh(); + else + if(pSettings->design == 4) + t4_refresh(); + else + if(pSettings->design == 3) + t3_refresh(); + else + if(pSettings->design == 7) + t7_refresh(); + else + if(pSettings->design == 9) + t9_refresh(); + else + { + pSettings->design = 7; + t7_refresh(); + } +} + + +void tHome_sleepmode_fun(void) +{ + t7_refresh_sleepmode_fun(); +} + + +void tHomeDiveMenuControl(uint8_t sendAction) +{ + if(sendAction == ACTION_BUTTON_NEXT) + { + if(settingsGetPointer()->design == 4) + return; + + if(settingsGetPointer()->design == 3) + settingsGetPointer()->design = 7; + + switch(get_globalState()) + { + case StD: + if(settingsGetPointer()->design == 6) + { + if(is_stateUsedSetToSim()) + set_globalState(StDSIM1); + else + set_globalState(StDQUIT); + break; + } + + if(settingsGetPointer()->design == 5) + { + if(t5_getCustomView() == CVIEW_Compass) + set_globalState(StDBEAR); + else + set_globalState(StDRAVG); + break; + } + + if(stateUsed->warnings.betterGas) + set_globalState(StDMGAS); + else + if(stateUsed->warnings.betterSetpoint) + set_globalState(StDMSPT); + else + set_globalState(StDMENU); + break; + + case StDMGAS: + if(stateUsed->warnings.betterSetpoint) + set_globalState(StDMSPT); + else + set_globalState(StDMENU); + break; + + case StDMSPT: + set_globalState(StDMENU); + break; + + case StDMENU: + if(is_stateUsedSetToSim()) + set_globalState(StDSIM1); + else + set_globalState(StD); + break; + + case StDSIM1: + set_globalState(StDSIM2); + break; + + case StDSIM2: + set_globalState(StDSIM3); + break; + + case StDSIM3: + set_globalState(StDSIM4); + break; + + case StDSIM4: + set_globalState(StD); + break; + + case StDBEAR: // t5_gauge + set_globalState(StDRAVG); + break; + + case StDRAVG: // t5_gauge + if(is_stateUsedSetToSim()) + set_globalState(StDSIM1); + else + set_globalState(StD); + break; + + case StDQUIT: // t6_apnea + set_globalState(StD); + break; + + default: + set_globalState(StD); + } + } + + if(sendAction == ACTION_BUTTON_ENTER) + { + if(settingsGetPointer()->design == 4) + return; + + if(settingsGetPointer()->design == 3) + settingsGetPointer()->design = 7; + + switch(get_globalState()) + { + case StDMGAS: + openEdit_DiveSelectBetterGas(); + set_globalState(StD); + break; + case StDMSPT: + openEdit_DiveSelectBetterSetpoint(); + set_globalState(StD); + break; + + case StDMENU: + openMenu_first_page_with_OC_gas_update(); + break; + + case StDSIM1: + Sim_Quit(); + break; + + case StDSIM2: + Sim_Ascend(); + break; + + case StDSIM3: + Sim_Descend(); + break; + + case StDSIM4: + Sim_Divetime(); + break; + + case StDBEAR: // t5_gauge + if(is_stateUsedSetToSim()) + stateSimGetPointerWrite()->diveSettings.compassHeading = (uint16_t)stateUsed->lifeData.compass_heading; + else + stateRealGetPointerWrite()->diveSettings.compassHeading = (uint16_t)stateUsed->lifeData.compass_heading; + set_globalState(StD); + break; + + case StDRAVG: // t5_gauge + timer_Stopwatch_Restart(); + set_globalState(StD); + break; + + case StDQUIT: // t6_apnea + set_globalState(StD); // used to end StDQUIT, is called before everything else because changes are made in the next lines + if(is_stateUsedSetToSim()) + Sim_Quit(); + else + dataOutGetPointer()->setEndDive = 1; + break; + + default: + break; + } + } +} + + +void tHome_findNextStop(const uint16_t *list, uint8_t *depthOutMeter, uint16_t *lengthOutSeconds) +{ + uint8_t ptr = DECOINFO_STRUCT_MAX_STOPS - 1; + + while(ptr && !list[ptr]) + ptr--; + + *lengthOutSeconds = list[ptr]; + if(!(*lengthOutSeconds)) + { + *depthOutMeter = 0; + } + else + if(ptr == 0) + { + *depthOutMeter = (uint8_t)((stateUsed->diveSettings.last_stop_depth_bar*10.0f) + 0.1f); + } + else + { + ptr -= 1; + *depthOutMeter = (uint8_t)(((stateUsed->diveSettings.input_second_to_last_stop_depth_bar + (stateUsed->diveSettings.input_next_stop_increment_depth_bar * ptr))*10.0f) + 0.1f); + } +} + + +void tHome_change_field_button_pressed(void) +{ + tHome_tick_count_field = 0; + if(settingsGetPointer()->design == 7) + t7_change_field(); + if(settingsGetPointer()->design == 9) + t9_change_field(); +} + + +void tHome_change_customview_button_pressed(void) +{ + tHome_tick_count_cview = 0; + if(settingsGetPointer()->design == 7) + t7_change_customview(); + else + if(settingsGetPointer()->design == 9) + t9_change_customview(); + else + if(settingsGetPointer()->design == 3) + t3_change_customview(); + else + if(settingsGetPointer()->design == 5) + t5_change_customview(); + else + if(settingsGetPointer()->design == 6) + t6_change_customview(); +} + + +void tHome_tick(void) +{ + uint16_t field = settingsGetPointer()->tX_userselectedLeftLowerCornerTimeout; + uint16_t cview = settingsGetPointer()->tX_customViewTimeout; + + if(field) + { + tHome_tick_count_field++; + if(tHome_tick_count_field > (field * 10)) + { + tHome_tick_count_field = 0; + if(settingsGetPointer()->design == 7) + { + t7_set_field_to_primary(); + } + } + } + + if(cview) + { + tHome_tick_count_cview++; + if(tHome_tick_count_cview > (cview *10)) + { + tHome_tick_count_cview = 0; + if(settingsGetPointer()->design == 7) + { + t7_set_customview_to_primary(); + } + } + } +} + + +uint32_t tHome_DateCode(RTC_DateTypeDef *dateInput) +{ + uint32_t answer = 0; + + answer = 0; + answer += (dateInput->Year & 0x7F)<< 9; + answer += (dateInput->Month & 0x0F)<< 5; + answer += (dateInput->Date & 0x1F); + + return answer; +} + + +uint8_t tHome_gas_writer(uint8_t oxygen_percentage, uint8_t helium_percentage, char *text) +{ + if(oxygen_percentage == 100) + return (uint8_t) snprintf(text,10,"Oxy"); + else if((oxygen_percentage == 21) && (!helium_percentage)) + return (uint8_t) snprintf(text,10,"Air"); + else if(!helium_percentage) + return (uint8_t) snprintf(text,10,"NX%02i",oxygen_percentage); + else if((oxygen_percentage + helium_percentage) == 100) + return (uint8_t) snprintf(text,10,"HX%02i",oxygen_percentage); + else + return (uint8_t) snprintf(text,10,"%02i/%02i",oxygen_percentage,helium_percentage); +} + +uint8_t tHome_show_lost_connection_count(GFX_DrawCfgScreen *ScreenToWriteOn) +{ + return 0; + + if(!DataEX_lost_connection_count()) + return 0; + + char text[10]; + + snprintf(text,10,"\002 %i",DataEX_lost_connection_count()); + Gfx_write_label_var(ScreenToWriteOn, 600,800, 0,&FontT48,CLUT_ButtonSymbols,text); + + return DataEX_lost_connection_count(); +}