Mercurial > public > ostc4
diff Discovery/Src/tMenuEditCustom.c @ 506:998529b3e142
Added new top level menu for customization of views
In the previous versions all menus were occupied by menu option. To indroduce the selection views for data visualization a new tab had to be added.
The menu "Customize views" has been moded to the new tab but not yet removed from the previous one. In addition a view for selection of big font options has been added (including multilanguage strings and other infrastructure)
author | Ideenmodellierer |
---|---|
date | Sun, 30 Aug 2020 17:19:23 +0200 |
parents | |
children | 218ac999e96b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tMenuEditCustom.c Sun Aug 30 17:19:23 2020 +0200 @@ -0,0 +1,721 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tMenuEditXtra.c +/// \brief Menu Edit Xtra - Specials in Divemode like Reset Stopwatch +/// \author heinrichs weikamp gmbh +/// \date 02-Mar-2015 +/// +/// \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 "tMenuEditCustom.h" + +#include "gfx_fonts.h" +#include "simulation.h" +#include "timer.h" +#include "tMenuEdit.h" +#include "tHome.h" // for enum CUSTOMVIEWS and init_t7_compass() +#include "t3.h" +#include "t7.h" +#include "data_exchange_main.h" +#include "motion.h" + +#define CV_PER_PAGE (5u) /* number of cv selections shown at one page */ + +static uint8_t customviewsSubpage = 0; +static uint8_t customviewsSubpageMax = 0; /* number of pages needed to display all selectable views */ +static const uint8_t* pcv_curchangelist; +/* Private function prototypes -----------------------------------------------*/ +void openEdit_Customview2(void); +void refresh_Customviews2(void); +/* Announced function prototypes -----------------------------------------------*/ +uint8_t OnAction_CViewTimeout (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_CViewStandard (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_CornerTimeout (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_CornerStandard(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + + +/* Exported functions --------------------------------------------------------*/ + + + + +void refresh_Customviews2(void) +{ + char text[32]; + uint8_t textpointer = 0; + + // header + text[0] = '\001'; + text[1] = TXT_2BYTE; + text[2] = TXT2BYTE_Customviews; + text[3] = 0; + write_topline(text); + + // custom view center return + textpointer = 0; + text[textpointer++] = TXT_2BYTE; + text[textpointer++] = TXT2BYTE_CViewTimeout; + textpointer += snprintf(&text[textpointer],11," %02u\016\016 %c\017",settingsGetPointer()->tX_customViewTimeout,TXT_Seconds); + write_label_var( 30, 700, ME_Y_LINE1, &FontT48, text); + + // custom view center primary + text[0] = TXT_2BYTE; + text[1] = TXT2BYTE_CViewStandard; + text[2] = ' '; + text[3] = ' '; + switch(settingsGetPointer()->tX_customViewPrimary) + { + case CVIEW_sensors: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_O2monitor; + break; + case CVIEW_sensors_mV: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_O2voltage; + break; + case CVIEW_Compass: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Compass; + break; + case CVIEW_Decolist: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Decolist; + break; + case CVIEW_Tissues: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Tissues; + break; + case CVIEW_Profile: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Profile; + break; + case CVIEW_Gaslist: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Gaslist; + break; + case CVIEW_EADTime: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Info; + break; + case CVIEW_SummaryOfLeftCorner: + text[4] = TXT_2BYTE; + text[5] = TXT2BYTE_Summary; + break; + case CVIEW_noneOrDebug: + text[4] = ' '; + text[5] = '-'; + break; + default: + snprintf(&text[4],3,"%02u",settingsGetPointer()->tX_customViewPrimary); + break; + } + text[6] = 0; + write_label_var( 30, 700, ME_Y_LINE2, &FontT48, text); + + + // field corner return + textpointer = 0; + text[textpointer++] = TXT_2BYTE; + text[textpointer++] = TXT2BYTE_CornerTimeout; + textpointer += snprintf(&text[textpointer],11," %02u\016\016 %c\017",settingsGetPointer()->tX_userselectedLeftLowerCornerTimeout,TXT_Seconds); + write_label_var( 30, 700, ME_Y_LINE3, &FontT48, text); + + // field corner primary + text[0] = TXT_2BYTE; + text[1] = TXT2BYTE_CornerStandard; + text[2] = ' '; + text[3] = ' '; + switch(settingsGetPointer()->tX_userselectedLeftLowerCornerPrimary) + { + /* Temperature */ + case LLC_Temperature: + text[4] = TXT_Temperature; + break; + /* Average Depth */ + case LLC_AverageDepth: + text[4] = TXT_AvgDepth; + break; + /* ppO2 */ + case LLC_ppO2: + text[4] = TXT_ppO2; + break; + /* Stop Uhr */ + case LLC_Stopwatch: + text[4] = TXT_Stopwatch; + break; + /* Ceiling */ + case LLC_Ceiling: + text[4] = TXT_Ceiling; + break; + /* Future TTS */ + case LLC_FutureTTS: + text[4] = TXT_FutureTTS; + break; + /* CNS */ + case LLC_CNS: + text[4] = TXT_CNS; + break; + case LLC_GF: + text[4] = TXT_ActualGradient; + break; +#ifdef ENABLE_BOTTLE_SENSOR + case LCC_BottleBar: + text[4] = TXT_AtemGasVorrat; + break; +#endif + /* none */ + case LLC_Empty: + text[4] = '-'; + break; + default: + snprintf(&text[4],2,"%u",settingsGetPointer()->tX_userselectedLeftLowerCornerPrimary); + break; + } + text[5] = 0; + write_label_var( 30, 700, ME_Y_LINE4, &FontT48, text); + + + // extra display + text[0] = TXT_2BYTE; + text[1] = TXT2BYTE_ExtraDisplay; + text[2] = ' '; + text[3] = ' '; + text[4] = TXT_2BYTE; + switch(settingsGetPointer()->extraDisplay) + { + /* BigFont */ + case EXTRADISPLAY_BIGFONT: + text[5] = TXT2BYTE_ExtraBigFont; + break; + /* DecoGame */ + case EXTRADISPLAY_DECOGAME: + text[5] = TXT2BYTE_ExtraDecoGame; + break; + /* none */ + case EXTRADISPLAY_none: + text[5] = TXT2BYTE_ExtraNone; + break; + + default: + snprintf(&text[4],2,"%u",settingsGetPointer()->extraDisplay); + break; + } + text[6] = 0; + write_label_var( 30, 700, ME_Y_LINE5, &FontT48, text); + + /* MotionCtrl */ + text[0] = TXT_2BYTE; + text[1] = TXT2BYTE_MotionCtrl; + text[2] = ' '; + text[3] = ' '; + text[4] = TXT_2BYTE; + switch(settingsGetPointer()->MotionDetection) + { + case MOTION_DETECT_OFF: + text[5] = TXT2BYTE_MoCtrlNone; + break; + case MOTION_DETECT_MOVE: + text[5] = TXT2BYTE_MoCtrlPitch; + break; + case MOTION_DETECT_SECTOR: + text[5] = TXT2BYTE_MoCtrlSector; + break; + case MOTION_DETECT_SCROLL: + text[5] = TXT2BYTE_MoCtrlScroll; + break; + default: + snprintf(&text[4],2,"%u",settingsGetPointer()->MotionDetection); + break; + } + text[6] = 0; + write_label_var( 30, 700, ME_Y_LINE6, &FontT48, text); + + write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); +} + +void openEdit_Custom(uint8_t line) +{ + set_globalState_Menu_Line(line); + resetMenuEdit(CLUT_MenuPageCustomView); + + switch(line) + { + case 1: + default: + openEdit_Customview2(); + break; + case 2: + openEdit_CustomviewDivemode2(cv_changelist); + break; + case 3: + openEdit_CustomviewDivemode2(cv_changelist_BS); + break; + } +} + +/* Private functions ---------------------------------------------------------*/ +void openEdit_Customview2(void) +{ + refresh_Customviews2(); + + write_field_button(StMCustom1_CViewTimeout, 400, 700, ME_Y_LINE1, &FontT48, ""); + write_field_button(StMCustom1_CViewStandard, 400, 700, ME_Y_LINE2, &FontT48, ""); + + write_field_button(StMCustom1_CornerTimeout, 400, 700, ME_Y_LINE3, &FontT48, ""); + write_field_button(StMCustom1_CornerStandard, 400, 700, ME_Y_LINE4, &FontT48, ""); + +// write_field_button(StMCustom1_ExtraDisplay, 400, 700, ME_Y_LINE5, &FontT48, ""); +// write_field_button(StMCustom1_MotionCtrl, 400, 700, ME_Y_LINE6, &FontT48, ""); + + setEvent(StMCustom1_CViewTimeout, (uint32_t)OnAction_CViewTimeout); + setEvent(StMCustom1_CViewStandard, (uint32_t)OnAction_CViewStandard); + + setEvent(StMCustom1_CornerTimeout, (uint32_t)OnAction_CornerTimeout); + setEvent(StMCustom1_CornerStandard, (uint32_t)OnAction_CornerStandard); + +// setEvent(StMCustom1_ExtraDisplay, (uint32_t)OnAction_ExtraDisplay); +// setEvent(StMCustom1_MotionCtrl, (uint32_t)OnAction_MotionCtrl); +} + +char customview_TXT2BYTE_helper2(uint8_t customViewId) +{ + char text = 0; + + switch(customViewId) + { + case CVIEW_sensors: + text = TXT2BYTE_O2monitor; + break; + case CVIEW_sensors_mV: + text = TXT2BYTE_O2voltage; + break; + case CVIEW_Compass: + text = TXT2BYTE_Compass; + break; + case CVIEW_Decolist: + case CVIEW_T3_Decostop: + text = TXT2BYTE_Decolist; + break; + case CVIEW_Tissues: + text = TXT2BYTE_Tissues; + break; + case CVIEW_Profile: + text = TXT2BYTE_Profile; + break; + case CVIEW_Gaslist: + text = TXT2BYTE_Gaslist; + break; + case CVIEW_EADTime: + text = TXT2BYTE_Info; + break; + case CVIEW_SummaryOfLeftCorner: + text = TXT2BYTE_Summary; + break; + case CVIEW_noneOrDebug: + text = TXT2BYTE_DispNoneDbg; + break; + case CVIEW_T3_MaxDepth: + text = TXT2BYTE_MaxDepth; + break; + case CVIEW_T3_StopWatch: + text = TXT2BYTE_Stopwatch; + break; + case CVIEW_T3_TTS: + text = TXT2BYTE_TTS; + break; + case CVIEW_T3_ppO2andGas: + text = TXT2BYTE_ppoNair; + break; + case CVIEW_T3_Navigation: + text = TXT2BYTE_Navigation; + break; + case CVIEW_T3_DepthData: + text = TXT2BYTE_DepthData; + break; + default: + break; + } + return text; +} + + +uint8_t OnAction_CViewTimeout2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t value; + value = settingsGetPointer()->tX_customViewTimeout; + + if(value < 5) + value = 5; + else if(value < 10) + value = 10; + else if(value < 15) + value = 15; + else if(value < 20) + value = 20; + else if(value < 30) + value = 30; + else if(value < 45) + value = 45; + else if(value < 60) + value = 60; + else + value = 0; + + settingsGetPointer()->tX_customViewTimeout = value; + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_CViewStandard2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t newValue; + switch(settingsGetPointer()->tX_customViewPrimary) + { + case CVIEW_sensors: + newValue = CVIEW_sensors_mV; + break; + case CVIEW_sensors_mV: + newValue = CVIEW_Compass; + break; + case CVIEW_Compass: + newValue = CVIEW_Decolist; + break; + case CVIEW_Decolist: + newValue = CVIEW_Tissues; + break; + case CVIEW_Tissues: + newValue = CVIEW_Profile; + break; + case CVIEW_Profile: + newValue = CVIEW_Gaslist; + break; + case CVIEW_Gaslist: + newValue = CVIEW_EADTime; + break; + case CVIEW_EADTime: + newValue = CVIEW_SummaryOfLeftCorner; + break; + case CVIEW_SummaryOfLeftCorner: + newValue = CVIEW_noneOrDebug; + break; + case CVIEW_noneOrDebug: + default: + newValue = CVIEW_sensors; + break; + } + settingsGetPointer()->tX_customViewPrimary = newValue; + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_CornerTimeout2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t value; + value = settingsGetPointer()->tX_userselectedLeftLowerCornerTimeout; + + if(value < 5) + value = 5; + else if(value < 10) + value = 10; + else if(value < 15) + value = 15; + else if(value < 20) + value = 20; + else if(value < 30) + value = 30; + else if(value < 45) + value = 45; + else if(value < 60) + value = 60; + else + value = 0; + + settingsGetPointer()->tX_userselectedLeftLowerCornerTimeout = value; + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_CornerStandard2(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t value; + value = settingsGetPointer()->tX_userselectedLeftLowerCornerPrimary; + + value += 1; + + if(value >= LLC_END) + value = 0; + + settingsGetPointer()->tX_userselectedLeftLowerCornerPrimary = value; + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_Customview_Toggle(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + + uint8_t line = 0; + SSettings *pSettings = settingsGetPointer(); + + switch(editId) + { + case StMCustom2_CViewSelection1: line = 1; + break; + case StMCustom2_CViewSelection2: line = 2; + break; + case StMCustom2_CViewSelection3: line = 3; + break; + case StMCustom2_CViewSelection4: line = 4; + break; + case StMCustom2_CViewSelection5: line = 5; + break; + + default: + break; + } + if(pcv_curchangelist == cv_changelist) + { + pSettings->cv_configuration ^= 1 << (pcv_curchangelist[customviewsSubpage * 5 + line-1]); + if(t7_GetEnabled_customviews() == 0) + { + pSettings->cv_configuration ^= (1 << CVIEW_noneOrDebug); + } + } + else + { + pSettings->cv_config_BigScreen ^= 1 << (pcv_curchangelist[customviewsSubpage * 5 + line-1]); + if(t3_GetEnabled_customviews() == 0) + { + pSettings->cv_config_BigScreen ^= (1 << CVIEW_noneOrDebug); + } + } + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_Customview_NextPage(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t id_next = 0; + customviewsSubpage++; + if(customviewsSubpage == customviewsSubpageMax) + { + customviewsSubpage = 0; + } + resetMenuEdit(CLUT_MenuPageCustomView); /* rebuild page */ + openEdit_CustomviewDivemode2(pcv_curchangelist); + + tMenuEdit_select(StMCustom2_CViewSelection6); + return UPDATE_DIVESETTINGS; +} + +void openEdit_CustomviewDivemode2(const uint8_t* pcv_changelist) +{ + + SSettings *pSettings = settingsGetPointer(); + char text[MAX_PAGE_TEXTSIZE]; + uint8_t textPointer = 0; + uint32_t id; + + uint8_t i; + + customviewsSubpageMax = (tHome_getNumberOfAvailableCVs(pcv_changelist) / CV_PER_PAGE) + 1; + pcv_curchangelist = pcv_changelist; + + CustomviewDivemode2_refresh(pcv_changelist); + + + text[0] = '\001'; + text[1] = TXT_2BYTE; + text[2] = TXT2BYTE_SelectCustomviews; + text[3] = 0; + write_topline(text); + + for(i=0; i<5;i++) /* fill maximum 5 items and leave last one for sub page selection */ + { + textPointer = 0; + id = pcv_changelist[customviewsSubpage * 5 + i]; + if((id == CVIEW_END) || (id == CVIEW_T3_END)) /* last list item? */ + { + break; + } + else + { + if(pcv_changelist == cv_changelist) + { + text[textPointer++] = '\006' - CHECK_BIT_THOME(pSettings->cv_configuration,id); + } + else + { + text[textPointer++] = '\006' - CHECK_BIT_THOME(pSettings->cv_config_BigScreen,id); + } + text[textPointer++] = ' '; + textPointer += snprintf(&text[textPointer], 60, "%c%c\n\r", TXT_2BYTE, customview_TXT2BYTE_helper2(id)); + + switch(i) + { + case 0: write_field_button(StMCustom2_CViewSelection1, 30, 800, ME_Y_LINE1, &FontT48, ""); + break; + case 1: write_field_button(StMCustom2_CViewSelection2, 30, 800, ME_Y_LINE2, &FontT48, ""); + break; + case 2: write_field_button(StMCustom2_CViewSelection3, 30, 800, ME_Y_LINE3, &FontT48, ""); + break; + case 3: write_field_button(StMCustom2_CViewSelection4, 30, 800, ME_Y_LINE4, &FontT48, ""); + break; + case 4: write_field_button(StMCustom2_CViewSelection5, 30, 800, ME_Y_LINE5, &FontT48, ""); + break; + default: + break; + } + } + } + // setEvent(StMCustom2_CViewSelection1, (uint32_t)OnAction_Customview_Toggle); + + + if(customviewsSubpageMax != 1) + { + textPointer = 0; + text[textPointer++] = TXT_2BYTE; + text[textPointer++] = TXT2BYTE_ButtonNext; + text[textPointer] = 0; + write_field_button(StMCustom2_CViewSelection6, 30, 800, ME_Y_LINE6, &FontT48, text); + } + + /* because of the ID handling inside of the functions, all buttons needs to be assigned before the events may be set => have the same loop twice */ + for(i=0; i<5;i++) /* fill maximum 5 items and leave last one for sub page selection */ + { + id = pcv_changelist[customviewsSubpage * 5 + i]; + if((id == CVIEW_END) || (id == CVIEW_T3_END)) /* last list item? */ + { + break; + } + else + { + switch(i) + { + case 0: setEvent(StMCustom2_CViewSelection1, (uint32_t)OnAction_Customview_Toggle); + break; + case 1: setEvent(StMCustom2_CViewSelection2, (uint32_t)OnAction_Customview_Toggle); + break; + case 2: setEvent(StMCustom2_CViewSelection3, (uint32_t)OnAction_Customview_Toggle); + break; + case 3: setEvent(StMCustom2_CViewSelection4, (uint32_t)OnAction_Customview_Toggle); + break; + case 4: setEvent(StMCustom2_CViewSelection5, (uint32_t)OnAction_Customview_Toggle); + break; + + default: + break; + } + + } + } + if(customviewsSubpageMax != 1) + { + setEvent(StMCustom2_CViewSelection6,(uint32_t)OnAction_Customview_NextPage); + } + for(;i<5;i++) /* clear empty lines in case menu shows less than 5 entries */ + { + switch(i) + { + case 0: write_label_var( 30, 800, ME_Y_LINE1, &FontT48, ""); + break; + case 1: write_label_var( 30, 800, ME_Y_LINE2, &FontT48, ""); + break; + case 2: write_label_var( 30, 800, ME_Y_LINE3, &FontT48, ""); + break; + case 3: write_label_var( 30, 800, ME_Y_LINE4, &FontT48, ""); + break; + case 4: write_label_var( 30, 800, ME_Y_LINE5, &FontT48, ""); + break; + default: + break; + }; + } + + + write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); +} + + +void CustomviewDivemode2_refresh() +{ + SSettings *pSettings = settingsGetPointer(); + char text[MAX_PAGE_TEXTSIZE]; + uint8_t textPointer = 0; + uint32_t id; + + uint8_t i; + + text[0] = '\001'; + text[1] = TXT_2BYTE; + text[2] = TXT2BYTE_SelectCustomviews; + text[3] = 0; + write_topline(text); + + + for(i=0; i<5;i++) /* fill maximum 5 items and leave last one for sub page selection */ + { + textPointer = 0; + id = pcv_curchangelist[customviewsSubpage * 5 + i]; + if((id == CVIEW_END) || (id == CVIEW_T3_END)) /* last list item? */ + { + break; + } + else + { + if(pcv_curchangelist == cv_changelist) + { + text[textPointer++] = '\006' - CHECK_BIT_THOME(pSettings->cv_configuration,id); + } + else + { + text[textPointer++] = '\006' - CHECK_BIT_THOME(pSettings->cv_config_BigScreen,id); + } + text[textPointer++] = ' '; + textPointer += snprintf(&text[textPointer], 60, "%c%c\n\r", TXT_2BYTE, customview_TXT2BYTE_helper2(id)); + + switch(i) + { + case 0: write_label_var( 30, 800, ME_Y_LINE1, &FontT48, text); + break; + case 1: write_label_var( 30, 800, ME_Y_LINE2, &FontT48, text); + break; + case 2: write_label_var( 30, 800, ME_Y_LINE3, &FontT48, text); + break; + case 3: write_label_var( 30, 800, ME_Y_LINE4, &FontT48, text); + break; + case 4: write_label_var( 30, 800, ME_Y_LINE5, &FontT48, text); + break; + default: + break; + } + } + } + if(customviewsSubpageMax != 1) + { + textPointer = 0; + text[textPointer++] = TXT_2BYTE; + text[textPointer++] = TXT2BYTE_ButtonNext; + text[textPointer] = 0; + write_label_var( 30, 800, ME_Y_LINE6, &FontT48, text); + } +}