Mercurial > public > ostc4
changeset 998:5a690195b6b7 GasConsumption
Added dual operation of scrubber timers:
In the previous version only one scrubber timer could be selected for operation. In the new version the activation of both timers is possible. In that case both timers will be displayed as well. To enable this a new activation item has been added to the scrubber menu.
author | Ideenmodellierer |
---|---|
date | Wed, 23 Apr 2025 14:52:03 +0200 (4 months ago) |
parents | 2f7531a8e922 |
children | ac25c35a3c97 |
files | Discovery/Inc/tStructure.h Discovery/Src/base.c Discovery/Src/simulation.c Discovery/Src/t3.c Discovery/Src/t7.c Discovery/Src/tCCR.c Discovery/Src/tMenuEditXtra.c |
diffstat | 7 files changed, 163 insertions(+), 62 deletions(-) [+] |
line wrap: on
line diff
--- a/Discovery/Inc/tStructure.h Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Inc/tStructure.h Wed Apr 23 14:52:03 2025 +0200 @@ -214,9 +214,10 @@ #define StMXTRA_CCRmode _MB(2,4,1,1,0) #define StMXTRA_O2_Fallback _MB(2,4,2,1,0) #define StMXTRA_ScrubTimer _MB(2,4,3,1,0) -#define StMXTRA_ScrubTimer_Max _MB(2,4,3,2,0) -#define StMXTRA_ScrubTimer_Reset _MB(2,4,3,3,0) -#define StMXTRA_ScrubTimer_OP_Mode _MB(2,4,3,5,0) +#define StMXTRA_ScrubTimer_Active _MB(2,4,3,2,0) +#define StMXTRA_ScrubTimer_Max _MB(2,4,3,3,0) +#define StMXTRA_ScrubTimer_Reset _MB(2,4,3,4,0) +#define StMXTRA_ScrubTimer_OP_Mode _MB(2,4,3,6,0) #define StMXTRA_PSCR_O2_Drop _MB(2,4,4,1,0) #define StMXTRA_PSCR_LUNG_RATIO _MB(2,4,4,2,0) #define StMXTRA_Predive_Check _MB(2,4,5,1,0)
--- a/Discovery/Src/base.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/base.c Wed Apr 23 14:52:03 2025 +0200 @@ -384,7 +384,7 @@ HAL_Delay( 100 ); stateRealGetPointerWrite()->lastKnownBatteryPercentage = 0; // damit das nicht in settings kopiert wird. - set_settings_to_Standard(); + set_settings_to_Standard(); /* initialize setting structure with default value => will be overwritten by flash read operation */ mod_settings_for_first_start_with_empty_ext_flash(); ext_flash_read_settings(); if( newFirmwareVersionCheckViaSettings() ) // test for old firmware version in loaded settings @@ -392,8 +392,7 @@ wasFirmwareUpdateCheckBattery = 1; set_settings_button_to_factory_with_individual_buttonBalance(); // will adapt individual values } - //settingsGetPointer()->bluetoothActive = 0; /* MX_Bluetooth_PowerOff(); unnecessary as part of MX_GPIO_Init() */ - //settingsGetPointer()->compassBearing = 0; + set_new_settings_missing_in_ext_flash(); // includes update of firmware version 161121 GFX_init( &pLayerInvisible );
--- a/Discovery/Src/simulation.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/simulation.c Wed Apr 23 14:52:03 2025 +0200 @@ -151,6 +151,7 @@ SDiveState * pDiveState = &stateSim; const SDiveState * pRealState = stateRealGetPointer(); SSettings *pSettings; + uint8_t timerId = 0; static int last_second = -1; static _Bool two_second = 0; @@ -250,11 +251,17 @@ if(simScrubberTimeoutCount >= 60) /* resolution is minutes */ { simScrubberTimeoutCount = 0; - if(pDiveState->scrubberDataDive[pSettings->scubberActiveId].TimerCur > MIN_SCRUBBER_TIME) + for(timerId = 0; timerId < 2; timerId++) { - pDiveState->scrubberDataDive[pSettings->scubberActiveId].TimerCur--; + if(pSettings->scubberActiveId & (1 << timerId)) + { + if(pDiveState->scrubberDataDive[timerId].TimerCur > MIN_SCRUBBER_TIME) + { + pDiveState->scrubberDataDive[timerId].TimerCur--; + } + translateDate(stateUsed->lifeData.dateBinaryFormat, &pDiveState->scrubberDataDive[timerId].lastDive); + } } - translateDate(stateUsed->lifeData.dateBinaryFormat, &pDiveState->scrubberDataDive[pSettings->scubberActiveId].lastDive); } }
--- a/Discovery/Src/t3.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/t3.c Wed Apr 23 14:52:03 2025 +0200 @@ -1998,19 +1998,40 @@ int printScrubberText(char *text, size_t size, const SScrubberData *scrubberData, SSettings *settings) { - int16_t currentTimerMinutes = scrubberData[settings->scubberActiveId].TimerCur; - char colour = '\020'; - if (currentTimerMinutes <= 0) { - colour = '\025'; - } else if (currentTimerMinutes <= 30) { - colour = '\024'; - } + uint8_t timerId = 0; + int16_t currentTimerMinutes = 0; + char colour = 0; + uint8_t textIndex = 0; - if (settings->scrubTimerMode == SCRUB_TIMER_MINUTES || currentTimerMinutes < 0) { - return snprintf(text, size, "%c%3i'", colour, currentTimerMinutes); - } else { - return snprintf(text, size, "%c%u\016\016%%\017", colour, currentTimerMinutes * 100 / settingsGetPointer()->scrubberData[settings->scubberActiveId].TimerMax); - } + for(timerId = 0; timerId < 2; timerId++) + { + if(settings->scubberActiveId & (1 << timerId)) + { + currentTimerMinutes = scrubberData[timerId].TimerCur; + colour = '\020'; + if (currentTimerMinutes <= 0) + { + colour = '\025'; + } + else if (currentTimerMinutes <= 30) + { + colour = '\024'; + } + if (settings->scrubTimerMode == SCRUB_TIMER_MINUTES || currentTimerMinutes < 0) + { + textIndex += snprintf(&text[textIndex], size, "%c%3i'", colour, currentTimerMinutes); + } + else + { + textIndex += snprintf(&text[textIndex], size, "%c%u\016\016%%\017", colour, currentTimerMinutes * 100 / settingsGetPointer()->scrubberData[timerId].TimerMax); + } + if((settings->scubberActiveId == 3) && (timerId == 0)) /* both timers are active => print separator */ + { + textIndex += snprintf(&text[textIndex], size, " | "); + } + } + } + return textIndex; } void t3_AF_updateBorderConditions()
--- a/Discovery/Src/t7.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/t7.c Wed Apr 23 14:52:03 2025 +0200 @@ -3286,7 +3286,9 @@ char headerText[10]; char text[TEXTSIZE]; + char tmpString[TEXTSIZE]; uint8_t textpointer = 0; + uint8_t index = 0; _Bool tinyHeaderFont = 0; uint8_t line = 0; #ifdef ENABLE_BOTTLE_SENSOR @@ -3402,7 +3404,26 @@ tinyHeaderFont = 1; headerText[2] = TXT_ScrubTime; - printScrubberText(text, TEXTSIZE, stateUsed->scrubberDataDive, pSettings); + textpointer = printScrubberText(text, TEXTSIZE, stateUsed->scrubberDataDive, pSettings); + if (pSettings->scubberActiveId == 3) /* both timer active */ + { + snprintf(tmpString,TEXTSIZE,"\016\016%s",text); + for(index = 0; index < textpointer; index++) + { + if(tmpString[index] == '\017') /* remove switch to normal font */ + { + tmpString[index] = ' '; + } + if(tmpString[index] == '|') /* replace separator with new line */ + { + tmpString[index] = '\n'; + tmpString[index+1] = '\r'; + break; + } + } + line = 1; + strcpy(text,tmpString); + } break; #ifdef ENABLE_PSCR_MODE @@ -3537,7 +3558,7 @@ } else { - GFX_write_string(&FontT48,&t7l3,text,line); + GFX_write_string(&FontT48,&t7l3,text,line); } #else GFX_write_string(&FontT105,&t7l3,text,line);
--- a/Discovery/Src/tCCR.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/tCCR.c Wed Apr 23 14:52:03 2025 +0200 @@ -322,6 +322,7 @@ void tCCR_tick(void) { SSettings* pSettings = settingsGetPointer(); + uint8_t timerId = 0; if(pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_OPTIC) { @@ -346,11 +347,17 @@ if(ScrubberTimeoutCount >= 600) /* resolution is minutes */ { ScrubberTimeoutCount = 0; - if(stateUsed->scrubberDataDive[pSettings->scubberActiveId].TimerCur > MIN_SCRUBBER_TIME) + for(timerId = 0; timerId < 2; timerId++) { - stateUsedWrite->scrubberDataDive[pSettings->scubberActiveId].TimerCur--; + if(pSettings->scubberActiveId & (1 << timerId)) + { + if(stateUsed->scrubberDataDive[timerId].TimerCur > MIN_SCRUBBER_TIME) + { + stateUsedWrite->scrubberDataDive[timerId].TimerCur--; + } + translateDate(stateUsed->lifeData.dateBinaryFormat, &stateUsedWrite->scrubberDataDive[timerId].lastDive); + } } - translateDate(stateUsed->lifeData.dateBinaryFormat, &stateUsedWrite->scrubberDataDive[pSettings->scubberActiveId].lastDive); } } }
--- a/Discovery/Src/tMenuEditXtra.c Wed Apr 23 14:47:42 2025 +0200 +++ b/Discovery/Src/tMenuEditXtra.c Wed Apr 23 14:52:03 2025 +0200 @@ -62,6 +62,7 @@ static uint8_t OnAction_ScrubberTimerMax(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); static uint8_t OnAction_ScrubberReset(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); static uint8_t OnAction_ScrubberMode(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +static uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); #ifdef ENABLE_PSCR_MODE static uint8_t OnAction_PSCRO2Drop(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); static uint8_t OnAction_PSCRLungRation(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); @@ -69,6 +70,7 @@ /* Exported functions --------------------------------------------------------*/ +static uint8_t scrubberMenuId = 0; void openEdit_Xtra(uint8_t line) { @@ -194,9 +196,9 @@ } -static void printScrubberResetText(char *text, SSettings *settings) +static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId) { - int16_t currentTimerMinutes = settings->scrubberData[settings->scubberActiveId].TimerCur; + int16_t currentTimerMinutes = settings->scrubberData[scrubberId].TimerCur; char colour = '\020'; if (currentTimerMinutes <= 0) { colour = '\025'; @@ -215,7 +217,7 @@ SSettings *pSettings = settingsGetPointer(); - localScrubTimer = pSettings->scrubberData[pSettings->scubberActiveId].TimerMax; + localScrubTimer = pSettings->scrubberData[scrubberMenuId].TimerMax; resetMenuEdit(CLUT_MenuPageXtra); @@ -224,34 +226,44 @@ write_topline(text); - snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,pSettings->scubberActiveId); + snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId); write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1, &FontT48, text); + if(pSettings->scubberActiveId & (1 << scrubberMenuId)) + { + snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active); + } + else + { + snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active); + } + write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2, &FontT48, text); + snprintf(&text[textIndex], 32,\ "%c" "\016\016(%c)\017" ,TXT_ScrubTime ,TXT_Maximum); - write_label_var( 20, 340, ME_Y_LINE2, &FontT48, text); + write_label_var( 20, 340, ME_Y_LINE3, &FontT48, text); snprintf(&text[textIndex], 32, "\002###\016\016 %c\017",TXT_Minutes); - write_field_udigit(StMXTRA_ScrubTimer_Max, 610, 780, ME_Y_LINE2, &FontT48, text,localScrubTimer, 0, 0, 0); + write_field_udigit(StMXTRA_ScrubTimer_Max, 610, 780, ME_Y_LINE3, &FontT48, text,localScrubTimer, 0, 0, 0); - printScrubberResetText(text, pSettings); - write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE3, &FontT48, text); + printScrubberResetText(text, pSettings, scrubberMenuId); + write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4, &FontT48, text); - if(pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay != 0) + if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0) { - snprintf(&text[0], 32,"%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Date, - pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Month, - pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Year); + snprintf(&text[0], 32,"%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[scrubberMenuId].lastDive.Date, + pSettings->scrubberData[scrubberMenuId].lastDive.Month, + pSettings->scrubberData[scrubberMenuId].lastDive.Year); } else { snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime); } - write_label_var( 20, 780, ME_Y_LINE4, &FontT48, text); + write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text); switch(pSettings->scrubTimerMode) { @@ -263,13 +275,15 @@ case SCRUB_TIMER_PERCENT: snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Percent ); break; } - write_field_button(StMXTRA_ScrubTimer_OP_Mode, 20, 780, ME_Y_LINE5, &FontT48, text); + write_field_button(StMXTRA_ScrubTimer_OP_Mode, 20, 780, ME_Y_LINE6, &FontT48, text); setEvent(StMXTRA_ScrubTimer, (uint32_t)OnAction_ScrubberTimerId); + setEvent(StMXTRA_ScrubTimer_Active, (uint32_t)OnAction_ScrubberActive); setEvent(StMXTRA_ScrubTimer_Max, (uint32_t)OnAction_ScrubberTimerMax); setEvent(StMXTRA_ScrubTimer_Reset, (uint32_t)OnAction_ScrubberReset); setEvent(StMXTRA_ScrubTimer_OP_Mode, (uint32_t)OnAction_ScrubberMode); + write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); } @@ -464,36 +478,46 @@ SSettings *pSettings; pSettings = settingsGetPointer(); - if(pSettings->scubberActiveId == 0) + + if(scrubberMenuId == 0) { - pSettings->scubberActiveId = 1; + scrubberMenuId = 1; } else { - pSettings->scubberActiveId = 0; + scrubberMenuId = 0; } - - snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,pSettings->scubberActiveId); + snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId); tMenuEdit_newButtonText(StMXTRA_ScrubTimer, text); - printScrubberResetText(text, pSettings); + printScrubberResetText(text, pSettings, scrubberMenuId); tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text); - tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[pSettings->scubberActiveId].TimerMax, 0, 0, 0); + tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[scrubberMenuId].TimerMax, 0, 0, 0); - if(pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay != 0) + if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0) { - snprintf(&text[0], 32,"%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Date, - pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Month, - pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Year); + snprintf(&text[0], 32,"%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[scrubberMenuId].lastDive.Date, + pSettings->scrubberData[scrubberMenuId].lastDive.Month, + pSettings->scrubberData[scrubberMenuId].lastDive.Year); } else { snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime); } - clean_content( 20, 780, ME_Y_LINE4, &FontT48); - write_label_var( 20, 780, ME_Y_LINE4, &FontT48, text); + clean_content( 20, 780, ME_Y_LINE5, &FontT48); + write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text); + + if(pSettings->scubberActiveId & (1 << scrubberMenuId)) + { + snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active); + } + else + { + snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active); + } + tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text); return UNSPECIFIC_RETURN; } @@ -516,10 +540,10 @@ newScrubberTime = MAX_SCRUBBER_TIME; pSettings = settingsGetPointer(); - pSettings->scrubberData[pSettings->scubberActiveId].TimerMax = newScrubberTime; - if(pSettings->scrubberData[pSettings->scubberActiveId].TimerCur > newScrubberTime) + pSettings->scrubberData[scrubberMenuId].TimerMax = newScrubberTime; + if(pSettings->scrubberData[scrubberMenuId].TimerCur > newScrubberTime) { - pSettings->scrubberData[pSettings->scubberActiveId].TimerCur = newScrubberTime; + pSettings->scrubberData[scrubberMenuId].TimerCur = newScrubberTime; } tMenuEdit_newInput(editId, newScrubberTime, 0, 0, 0); @@ -545,16 +569,15 @@ char text[32]; SSettings *pSettings; pSettings = settingsGetPointer(); - pSettings->scrubberData[pSettings->scubberActiveId].TimerCur = pSettings->scrubberData[pSettings->scubberActiveId].TimerMax; - pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay = 0; /* invalidate date */ + pSettings->scrubberData[scrubberMenuId].TimerCur = pSettings->scrubberData[scrubberMenuId].TimerMax; + pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay = 0; /* invalidate date */ - printScrubberResetText(text, pSettings); + printScrubberResetText(text, pSettings, scrubberMenuId); tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text); snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime); - clean_content( 20, 780, ME_Y_LINE4, &FontT48); - write_label_var( 20, 780, ME_Y_LINE4, &FontT48, text); - + clean_content( 20, 780, ME_Y_LINE5, &FontT48); + write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text); return UNSPECIFIC_RETURN; } @@ -587,6 +610,28 @@ return UNSPECIFIC_RETURN; } +uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + char text[32]; + SSettings *pSettings; + pSettings = settingsGetPointer(); + + if(pSettings->scubberActiveId & (1 << scrubberMenuId)) + { + pSettings->scubberActiveId &= ~(1 << scrubberMenuId); + snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active); + } + else + { + pSettings->scubberActiveId |= (1 << scrubberMenuId); + snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active); + } + + tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text); + + return UNSPECIFIC_RETURN; +} + #ifdef ENABLE_PSCR_MODE static uint8_t OnAction_PSCRO2Drop(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) {