Mercurial > public > ostc4
diff Discovery/Src/tMenuEditGasOC.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | e1d66bc78f9a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tMenuEditGasOC.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,1389 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tMenuEditGasOC.c +/// \brief Main Template file for editing Open Circuit Gas Settings +/// \author heinrichs weikamp gmbh +/// \date 09-July-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 "tMenuEditGasOC.h" + +#include "check_warning.h" +#include "gfx_fonts.h" +#include "tMenuEdit.h" +#include "unit.h" + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + uint8_t gasID; + SGasLine * pGasLine; + uint8_t mod; + uint8_t ccr; + uint8_t setpoint; +} SEditGasPage; + +#define MAX_SENDER_AT_ONCE 5 + +/* Private variables ---------------------------------------------------------*/ +SEditGasPage editGasPage; + +uint16_t wirelessSender[MAX_SENDER_AT_ONCE]; + +/* Private function prototypes -----------------------------------------------*/ +void create_text_with_u8(char *text, const char *text1, uint8_t inputU8, const char *text2); + +void openEdit_Gas(uint8_t line, uint8_t ccr); +void openEdit_GasType(void); +void openEdit_Wireless(void); + +void openEdit_DiveGasSelect(uint8_t line, uint8_t ccr); +void openEdit_SpecialDiveGasMenu(uint8_t ccr); +void openEdit_DiveGasSelect_Subroutine(uint8_t line, uint8_t ccr); + + void tMEGas_check_switch_to_bailout(void); + +/* Announced function prototypes -----------------------------------------------*/ +uint8_t OnAction_Mix (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_GasType (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_ChangeDepth (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_SetToMOD (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_BottleSize (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_Wireless (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + +uint8_t OnAction_First (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_Deco (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_Travel (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_Inactive (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + +uint8_t OnAction_WirelessID (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_NoWireless (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + +uint8_t OnAction_DM_Active (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_DM_Mix (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + +/* +uint8_t OnAction_DefaultMix (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_ToggleDepth (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_ToggleDefault (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_DefaultDepth (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +*/ + +/* Exported functions --------------------------------------------------------*/ + +void openEdit_GasCC(uint8_t line) +{ + if(actual_menu_content == MENU_SURFACE) + openEdit_Gas(line , 1); + else + if(line == 6) + openEdit_SpecialDiveGasMenu(1); + else + openEdit_DiveGasSelect(line, 1); +} + + +void openEdit_GasOC(uint8_t line) +{ + if(actual_menu_content == MENU_SURFACE) + openEdit_Gas(line, 0); + else + if(line == 6) + openEdit_SpecialDiveGasMenu(0); + else + openEdit_DiveGasSelect(line, 0); +} + + +/* dive mode */ +void openEdit_DiveSelectBetterGas(void) +{ + uint8_t gasId, ccr; + + gasId = actualBetterGasId(); + ccr = 0; + if(gasId>5) + { + gasId -= 5; + ccr = 1; + } + openEdit_DiveGasSelect_Subroutine(gasId,ccr); + if(ccr) + updateSpecificMenu(StMCG); // is this necessary? openEdit_DiveGasSelect_Subroutine has update. hw 151209 + else + updateSpecificMenu(StMOG); // is this necessary? openEdit_DiveGasSelect_Subroutine has update. hw 151209 +} + + +/* select gas in divemode */ +void openEdit_DiveGasSelect(uint8_t line, uint8_t ccr) +{ + openEdit_DiveGasSelect_Subroutine(line, ccr); + if(!ccr) + tMEGas_check_switch_to_bailout(); + exitMenuEdit_to_Home_with_Menu_Update(); +} + + +void openEdit_DiveGasSelect_Subroutine(uint8_t line, uint8_t ccr) +{ + SDiveState * pState; + uint8_t setpoint; + + if(actual_menu_content == MENU_DIVE_REAL) + { + pState = stateRealGetPointerWrite(); + editGasPage.pGasLine = pState->diveSettings.gas; + } + else + { + pState = stateSimGetPointerWrite(); + editGasPage.pGasLine = pState->diveSettings.gas; + } + + if(ccr) + { + editGasPage.gasID = line + NUM_OFFSET_DILUENT; + setpoint = pState->lifeData.actualGas.setPoint_cbar; + } + else + { + editGasPage.gasID = line; + setpoint = 0; + } + + for(int i=0;i<(1+ (2*NUM_GASES));i++) + editGasPage.pGasLine[i].note.ub.first = 0; + + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.first = 1; + setActualGas_DM(&pState->lifeData,editGasPage.gasID,setpoint); +} + +/* extra gas and gas on/off option */ +void openEdit_SpecialDiveGasMenu(uint8_t ccr) +{ + char text[32]; + uint8_t oxygen, helium, gasOffset, textpointer, lineCount, ptrGas; + SDiveState * pState; + + if(actual_menu_content == MENU_DIVE_REAL) + { + pState = stateRealGetPointerWrite(); + editGasPage.pGasLine = pState->diveSettings.gas; + } + else + { + pState = stateSimGetPointerWrite(); + editGasPage.pGasLine = pState->diveSettings.gas; + } + if(ccr) + { + editGasPage.setpoint = pState->lifeData.actualGas.setPoint_cbar; + } + editGasPage.ccr = ccr; + + set_globalState_Menu_Line(6); + + if(ccr) + resetMenuEdit(CLUT_MenuPageGasCC); + else + resetMenuEdit(CLUT_MenuPageGasOC); + + if(ccr) + gasOffset = NUM_OFFSET_DILUENT; + else + gasOffset = 0; + + + text[0] = '\001'; + text[1] = TXT_2BYTE; + if(ccr) + text[2] = TXT2BYTE_SpecialDiveGasMenuCCR; + else + text[2] = TXT2BYTE_SpecialDiveGasMenu; + text[3] = 0; + write_topline(text); + + lineCount = 1; + + + for(int i=1; i<=5; i++) + { + ptrGas = i + gasOffset; + oxygen = stateUsed->diveSettings.gas[ptrGas].oxygen_percentage; + helium = stateUsed->diveSettings.gas[ptrGas].helium_percentage; + + if(oxygen == 100) + textpointer = snprintf(text,10,"Oxy"); + else + if((oxygen == 21) && (helium == 0)) + textpointer = snprintf(text,10,"Air"); + else + textpointer = snprintf(text,10,"%02i/%02i",oxygen,helium); + + if(editGasPage.pGasLine[ptrGas].note.ub.first) + strcpy(&text[textpointer]," *"); + + write_field_on_off(StMOG_DM_ActiveBase+i, 30, 500, ME_Y_LINE_BASE + (lineCount * ME_Y_LINE_STEP), &FontT48, text, stateUsed->diveSettings.gas[ptrGas].note.ub.active); + lineCount++; + } + + if(!ccr) + { + if(stateUsed->diveSettings.gas[0].note.ub.first) + { + oxygen = stateUsed->diveSettings.gas[0].oxygen_percentage; + helium = stateUsed->diveSettings.gas[0].helium_percentage; + write_field_udigit(StMOG_DM_ExtraMix, 30, 800, ME_Y_LINE6, &FontT48, "##/## Extra Gas *", oxygen, helium, 0, 0); + } + else + { + write_field_udigit(StMOG_DM_ExtraMix, 30, 800, ME_Y_LINE6, &FontT48, "##/## Extra Gas", 0, 0, 0, 0); + } + } + + for(int i=1; i<=5; i++) + { + setEvent(StMOG_DM_ActiveBase + i,(uint32_t)OnAction_DM_Active); + } + + if(!ccr) + setEvent(StMOG_DM_ExtraMix,(uint32_t)OnAction_DM_Mix); +} + + +uint8_t OnAction_DM_Active (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t gasOffset, newActive; + + if(editGasPage.ccr) + gasOffset = NUM_OFFSET_DILUENT; + else + gasOffset = 0; + + editGasPage.gasID = editId + gasOffset - StMOG_DM_ActiveBase; + + if(editGasPage.pGasLine[editGasPage.gasID].note.ub.first) + return UNSPECIFIC_RETURN; + + if(editGasPage.pGasLine[editGasPage.gasID].note.ub.active) + newActive = 0; + else + newActive = 1; + + tMenuEdit_set_on_off(editId, newActive); + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = newActive; + + return UNSPECIFIC_RETURN; +} + +/* only for OC */ +uint8_t OnAction_DM_Mix(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t digitContentNew; + uint32_t newOxygen, newHelium; + + if(action == ACTION_BUTTON_ENTER) + { + return digitContent; + } + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &newOxygen, &newHelium, 0, 0); + + if(newOxygen < 5) + newOxygen = 5; + if(newOxygen == 99) + newOxygen = 100; + if(newHelium > 95) + newHelium = 95; + if((newOxygen + newHelium) > 100) + newOxygen = 100 - newHelium; + + SDiveState * pDiveState = 0; + + for(int i=1;i<=(2*NUM_GASES);i++) + editGasPage.pGasLine[i].note.ub.first = 0; + + if(actual_menu_content == MENU_DIVE_REAL) + pDiveState = stateRealGetPointerWrite(); + else + pDiveState = stateSimGetPointerWrite(); + + setActualGas_ExtraGas(&pDiveState->lifeData, newOxygen, newHelium, 0); + tMEGas_check_switch_to_bailout(); + return EXIT_TO_HOME; + } + if(action == ACTION_BUTTON_NEXT) + { + digitContentNew = digitContent + 1; + if(digitContentNew > '9') + digitContentNew = '0'; + return digitContentNew; + } + if(action == ACTION_BUTTON_BACK) + { + digitContentNew = digitContent - 1; + if(digitContentNew < '0') + digitContentNew = '9'; + return digitContentNew; + } + + return UNSPECIFIC_RETURN; +} + + +void tMEGas_check_switch_to_bailout(void) +{ + SDiveState *pState; + + if(actual_menu_content == MENU_DIVE_REAL) + pState = stateRealGetPointerWrite(); + else + pState = stateSimGetPointerWrite(); + + if(pState->diveSettings.diveMode == DIVEMODE_CCR) + { + pState->diveSettings.diveMode = DIVEMODE_OC; + block_diluent_page(); + } +} + + +/* surface mode */ +void openEdit_Gas(uint8_t line, uint8_t ccr) +{ + uint8_t gasID, oxygen, helium, depthDeco, active, first, depthMOD, deco, travel, inactive;//, bottleSizeLiter;, bottleWirelessStatus; + //uint16_t bottleWirelessId;//, bottleWirelessIdSmall; + + char text[32]; + char textMOD[32]; + uint8_t txtptr; + + if(line) + set_globalState_Menu_Line(line); + else + set_globalState_Menu_Line(NUM_GASES + 1); + + if(ccr) + resetMenuEdit(CLUT_MenuPageGasCC); + else + resetMenuEdit(CLUT_MenuPageGasOC); + + if(ccr) + gasID = line + NUM_OFFSET_DILUENT; + else + gasID = line; + + editGasPage.ccr = ccr; + editGasPage.gasID = gasID; + editGasPage.mod = calc_MOD(gasID); + + SSettings *data = settingsGetPointer(); + editGasPage.pGasLine = data->gas; + + oxygen = editGasPage.pGasLine[gasID].oxygen_percentage; + if(oxygen > 99) + oxygen = 99; + helium = editGasPage.pGasLine[gasID].helium_percentage; + depthDeco = editGasPage.pGasLine[gasID].depth_meter; + //depthTravel = editGasPage.pGasLine[gasID].depth_meter_travel; + active = editGasPage.pGasLine[gasID].note.ub.active; + first = editGasPage.pGasLine[gasID].note.ub.first; + deco = editGasPage.pGasLine[gasID].note.ub.deco; + travel = editGasPage.pGasLine[gasID].note.ub.travel; + + //bottleSizeLiter = editGasPage.pGasLine[gasID].bottle_size_liter; +// bottleWirelessStatus = editGasPage.pGasLine[gasID].bottle_wireless_status; + //bottleWirelessId = editGasPage.pGasLine[gasID].bottle_wireless_id; + //bottleWirelessIdSmall = bottleWirelessId & 0x0F; + + if(active) + inactive = 0; + else + inactive = 1; + + depthMOD = editGasPage.mod; + + int i = 0; + if(gasID >= 10) + { + i = 1; + strcpy(text, "\001" "Gas #10 X"); + } + else + strcpy(text, "\001" "Gas #0 X"); + + if(ccr) + text[8+i] = TXT_Diluent_Gas_Edit; + else + text[8+i] = TXT_OC_Gas_Edit; + + if(gasID >= 10) + text[6+i] += gasID - 10; + else + text[6+i] += gasID; + + write_topline(text); + if(actual_menu_content == MENU_SURFACE) + { + write_label_fix( 20, 800, ME_Y_LINE1, &FontT48, TXT_Mix); + write_field_udigit(StMOG_Mix, 210, 400, ME_Y_LINE1, &FontT48, "##/##", (uint32_t)oxygen, (uint32_t)helium, 0, 0); + + + text[1] = 0; + if(inactive) + text[0] = TXT_Inactive; + else + if(first) + text[0] = TXT_First; + else + if(deco) + text[0] = TXT_Deco; + else + if(travel) + text[0] = TXT_Travel; + else + text[0] = TXT_Inactive; + + write_field_button(StMOG_GasType, 20, 710, ME_Y_LINE2, &FontT48, text); + + + if(deco) + { + text[0] = TXT_ChangeDepth; + text[1] = ' '; + text[2] = TXT_Deco; + text[3] = 0; + write_label_var( 20 ,800, ME_Y_LINE3, &FontT48, text); + + textMOD[0] = '#'; + textMOD[1] = '#'; + textMOD[2] = '#'; + textMOD[3] = unit_depth_char1(); + textMOD[4] = unit_depth_char2(); + textMOD[5] = 0; + write_field_udigit(StMOG_ChangeDepth, 600, 710, ME_Y_LINE3, &FontT48,textMOD, (uint32_t)unit_depth_integer(depthDeco), 0, 0, 0); + + txtptr = 0; + text[txtptr++] = TXT_2BYTE; + text[txtptr++] = TXT2BYTE_SetToMOD; + text[txtptr++] = 0; + write_field_button(StMOG_SetToMOD, 20, 710, ME_Y_LINE4, &FontT48,text); + } + else + { + txtptr = 0; + text[txtptr++] = '\021'; + text[txtptr++] = TXT_ChangeDepth; + text[txtptr++] = ' '; + text[txtptr++] = TXT_Deco; + text[txtptr++] = 0; + write_label_var( 20 ,800, ME_Y_LINE3, &FontT48, text); + + txtptr = 0; + text[txtptr++] = '\021'; + text[txtptr++] = TXT_2BYTE; + text[txtptr++] = TXT2BYTE_SetToMOD; + text[txtptr++] = 0; + write_label_var( 20 ,800, ME_Y_LINE4, &FontT48, text); + } +/* + txtptr = 0; + text[txtptr++] = TXT_2BYTE; + text[txtptr++] = TXT2BYTE_Bottle; + text[txtptr++] = 0; + write_label_var( 20 ,800, ME_Y_LINE5, &FontT48, text); + write_field_2digit(StMOG_Bottle, 600, 710, ME_Y_LINE5, &FontT48,"## ltr", (uint32_t)bottleSizeLiter, 0, 0, 0); + + txtptr = 0; + text[txtptr++] = TXT_2BYTE; + text[txtptr++] = TXT2BYTE_WirelessSender; + text[txtptr++] = ' '; + if(!bottleWirelessId) + text[txtptr++] = '\021'; + txtptr += snprintf(&text[txtptr],20,"%u (%04X)",bottleWirelessIdSmall, bottleWirelessId); + write_field_button(StMOG_Wireless, 20, 710, ME_Y_LINE6, &FontT48, text); +*/ + stop_cursor_fields(); + + textMOD[0] = '#'; + textMOD[1] = '#'; + textMOD[2] = '#'; + textMOD[3] = unit_depth_char1(); + textMOD[4] = unit_depth_char2(); + textMOD[5] = ' '; + textMOD[6] = 'M'; + textMOD[7] = 'O'; + textMOD[8] = 'D'; + textMOD[9] = 0; + + write_field_udigit(StMOG_MOD, 401, 780, ME_Y_LINE1, &FontT48, textMOD, (uint32_t)unit_depth_integer(depthMOD), 0, 0, 0); +// write_field_udigit(StMOG_MOD, 401, 780, ME_Y_LINE1, &FontT48, "###m MOD", (uint32_t)depthMOD, 0, 0, 0); + + setEvent(StMOG_Mix, (uint32_t)OnAction_Mix); + setEvent(StMOG_GasType, (uint32_t)OnAction_GasType); + + if(deco) + { + setEvent(StMOG_ChangeDepth, (uint32_t)OnAction_ChangeDepth); + setEvent(StMOG_SetToMOD, (uint32_t)OnAction_SetToMOD); + } +/* + setEvent(StMOG_Bottle, (uint32_t)OnAction_BottleSize); + setEvent(StMOG_Wireless, (uint32_t)OnAction_Wireless); +*/ + write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); + } +} + +/* surface mode */ +void openEdit_GasType(void) +{ + uint8_t gasID, active, first, deco, travel, inactive; + char text[32]; + + + if(editGasPage.ccr) + { + resetMenuEdit(CLUT_MenuPageGasCC); + setBackMenu((uint32_t)openEdit_GasCC, editGasPage.gasID - NUM_OFFSET_DILUENT, 2); + } + else + { + resetMenuEdit(CLUT_MenuPageGasOC); + setBackMenu((uint32_t)openEdit_GasOC, editGasPage.gasID, 2); + } + + gasID = editGasPage.gasID; + active = editGasPage.pGasLine[gasID].note.ub.active; + first = editGasPage.pGasLine[gasID].note.ub.first; + deco = editGasPage.pGasLine[gasID].note.ub.deco; + travel = editGasPage.pGasLine[gasID].note.ub.travel; + + if(active) + inactive = 0; + else + inactive = 1; + + + /* header */ + int i = 0; + if(gasID >= 10) + { + i = 1; + strcpy(text, "\001" "Gas #10 X"); + } + else + strcpy(text, "\001" "Gas #0 X"); + + if(editGasPage.ccr) + text[8+i] = TXT_Diluent_Gas_Edit; + else + text[8+i] = TXT_OC_Gas_Edit; + + if(gasID >= 10) + text[6+i] += gasID - 10; + else + text[6+i] += gasID; + write_topline(text); + + text[1] = 0; + text[0] = TXT_First; + write_field_on_off(StMOG_First, 30, 400, ME_Y_LINE1, &FontT48, text, first); + + text[0] = TXT_Deco; + write_field_on_off(StMOG_Deco, 30, 400, ME_Y_LINE2, &FontT48, text, deco); + + text[0] = TXT_Travel; + write_field_on_off(StMOG_Travel, 30, 400, ME_Y_LINE3, &FontT48, text, travel); + + text[0] = TXT_Inactive; + write_field_on_off(StMOG_Inactive, 30, 400, ME_Y_LINE4, &FontT48, text, inactive); + + setEvent(StMOG_First, (uint32_t)OnAction_First); + setEvent(StMOG_Deco, (uint32_t)OnAction_Deco); + setEvent(StMOG_Travel, (uint32_t)OnAction_Travel); + setEvent(StMOG_Inactive, (uint32_t)OnAction_Inactive); + + write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); +} + +uint8_t OnAction_GasType(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + openEdit_GasType(); + return UNSPECIFIC_RETURN; +} + +void openEdit_Wireless(void) +{ + uint8_t gasID, wirelessSenderAvailable, isNotMatched, isMatchedWithThis, wirelessSenderActive[MAX_SENDER_AT_ONCE], senderCount, isInList; //, wirelessStatus; + uint16_t wirelessId, wirelessSenderIdSmall, wirelessIdTemp; + char text[32]; + uint8_t txtptr; + + if(editGasPage.ccr) + { + resetMenuEdit(CLUT_MenuPageGasCC); + setBackMenu((uint32_t)openEdit_GasCC, editGasPage.gasID - NUM_OFFSET_DILUENT, 5); + } + else + { + resetMenuEdit(CLUT_MenuPageGasOC); + setBackMenu((uint32_t)openEdit_GasOC, editGasPage.gasID, 5); + } + + gasID = editGasPage.gasID; + wirelessId = editGasPage.pGasLine[gasID].bottle_wireless_id; +// wirelessStatus = editGasPage.pGasLine[gasID].bottle_wireless_status; + + + /* header */ + int i = 0; + if(gasID >= 10) + { + i = 1; + strcpy(text, "\001" "Gas #10 X"); + } + else + strcpy(text, "\001" "Gas #0 X"); + + if(editGasPage.ccr) + text[8+i] = TXT_Diluent_Gas_Edit; + else + text[8+i] = TXT_OC_Gas_Edit; + + if(gasID >= 10) + text[6+i] += gasID - 10; + else + text[6+i] += gasID; + write_topline(text); + + senderCount = 0; + wirelessSenderAvailable = 0; + if(wirelessId) + { + wirelessSender[senderCount] = wirelessId; + wirelessSenderActive[senderCount] = 0; + wirelessSenderAvailable++; + senderCount++; + } + + for(int i=0;i<4;i++) + { + if((stateUsed->lifeData.wireless_data[i].ageInMilliSeconds) && (stateUsed->lifeData.wireless_data[i].ageInMilliSeconds <= 60000) && ((stateUsed->lifeData.wireless_data[i].data[1] & 0x0F) != 0)) + { + wirelessIdTemp = stateUsed->lifeData.wireless_data[i].data[0] * 256; + wirelessIdTemp += stateUsed->lifeData.wireless_data[i].data[1]; + if(wirelessId && (wirelessId == wirelessIdTemp)) + wirelessSenderActive[0] = 1; + else + { + isInList = 0; + for(int j=0;j<wirelessSenderAvailable;j++) + { + if(wirelessSender[j] == wirelessIdTemp) + { + isInList = 1; + break; + } + } + if(!isInList) + { + wirelessSender[senderCount] = wirelessIdTemp; + wirelessSenderActive[senderCount] = 1; + wirelessSenderAvailable++; + senderCount++; + } + } + } + } + + if(wirelessSenderAvailable > MAX_SENDER_AT_ONCE) + wirelessSenderAvailable = MAX_SENDER_AT_ONCE; + + isNotMatched = 1; + + for(int i=0;i<wirelessSenderAvailable;i++) + { + wirelessSenderIdSmall = wirelessSender[i] & 0x0F; + + txtptr = 0; + if(!wirelessSenderActive[i]) + text[txtptr++] = '\021'; + txtptr += snprintf(&text[txtptr],10,"%u (%04X)",wirelessSenderIdSmall, wirelessSender[i]); + + if(wirelessId == wirelessSender[i]) + { + isMatchedWithThis = 1; + isNotMatched = 0; + } + else + { + isMatchedWithThis = 0; + for(int j=1; j <= 2*NUM_GASES; j++) + { + if((gasID != j) && (settingsGetPointer()->gas[j].bottle_wireless_id == wirelessSender[i])) + { + txtptr += snprintf(&text[txtptr],20," used by Gas #%i",i); + break; + } + } + } + write_field_on_off(StMOG_Transmitter1 + i, 30, 710, ME_Y_LINE1 + (i * ME_Y_LINE_STEP), &FontT48, text, isMatchedWithThis); + } + + + txtptr = 0; + text[txtptr++] = TXT_2BYTE; + text[txtptr++] = TXT2BYTE_WirelessDisconnect; + text[txtptr++] = 0; + write_field_on_off(StMOG_NoTransmitter, 30, 400, ME_Y_LINE6, &FontT48, text, isNotMatched); + + // setEvent has to be _after_ all fields are written + for(int i=0;i<wirelessSenderAvailable;i++) + setEvent(StMOG_Transmitter1 + i, (uint32_t)OnAction_WirelessID); + + setEvent(StMOG_NoTransmitter, (uint32_t)OnAction_NoWireless); +} + + +uint8_t OnAction_Wireless(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + openEdit_Wireless(); + return UNSPECIFIC_RETURN; +} + + +uint8_t OnAction_WirelessID (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + if((editId < StMOG_Transmitter1) || (editId > StMOG_Transmitter5)) + return UNSPECIFIC_RETURN; + + uint8_t line, isMatched; + + line = editId - StMOG_Transmitter1; + + + if(editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id == wirelessSender[line]) + isMatched = 1; + else + isMatched = 0; + + editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id = wirelessSender[line]; +// editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_status = 0; + + for(int i=0;i<5;i++) + { + if((StMOG_Transmitter1 + i) != editId) + tMenuEdit_set_on_off(StMOG_Transmitter1 + i, 0); + } + tMenuEdit_set_on_off(editId, 1); + tMenuEdit_set_on_off(StMOG_NoTransmitter, 0); + + if(!isMatched) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_NoWireless (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t isNotMatched; + + if(editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id == 0) + isNotMatched = 1; + else + isNotMatched = 1; + + editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_id = 0; +// editGasPage.pGasLine[editGasPage.gasID].bottle_wireless_status = 0; + + tMenuEdit_set_on_off(StMOG_Transmitter1, 0); + tMenuEdit_set_on_off(StMOG_Transmitter2, 0); + tMenuEdit_set_on_off(StMOG_Transmitter3, 0); + tMenuEdit_set_on_off(StMOG_Transmitter4, 0); + tMenuEdit_set_on_off(StMOG_Transmitter5, 0); + tMenuEdit_set_on_off(StMOG_NoTransmitter, 1); + + if(!isNotMatched) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_Mix(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t digitContentNew; + uint32_t newOxygen, newHelium; + + if(action == ACTION_BUTTON_ENTER) + { + return digitContent; + } + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &newOxygen, &newHelium, 0, 0); + + if(newOxygen < 5) + newOxygen = 5; + if(newOxygen == 99) + newOxygen = 100; + if(newHelium > 95) + newHelium = 95; + if((newOxygen + newHelium) > 100) + newOxygen = 100 - newHelium; + + editGasPage.pGasLine[editGasPage.gasID].oxygen_percentage = newOxygen; + editGasPage.pGasLine[editGasPage.gasID].helium_percentage = newHelium; + editGasPage.mod = calc_MOD(editGasPage.gasID); + + if(newOxygen == 100) + newOxygen = 99; + + tMenuEdit_newInput(editId, newOxygen, newHelium, 0, 0); + tMenuEdit_newInput(StMOG_MOD, (uint32_t)unit_depth_integer(editGasPage.mod), 0, 0, 0); + + return UPDATE_DIVESETTINGS; + } + if(action == ACTION_BUTTON_NEXT) + { + digitContentNew = digitContent + 1; + if(digitContentNew > '9') + digitContentNew = '0'; + return digitContentNew; + } + if(action == ACTION_BUTTON_BACK) + { + digitContentNew = digitContent - 1; + if(digitContentNew < '0') + digitContentNew = '9'; + return digitContentNew; + } + + return UNSPECIFIC_RETURN; +} + +/* +uint8_t OnAction_DefaultMix(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint32_t newOxygen, newHelium; + uint8_t depthDEFAULT; + char text[32]; + + newOxygen = 21; + newHelium = 0; + + editGasPage.pGasLine[editGasPage.gasID].oxygen_percentage = newOxygen; + editGasPage.pGasLine[editGasPage.gasID].helium_percentage = newHelium; + + tMenuEdit_newInput(StMOG_Mix, newOxygen, newHelium, 0, 0); + + depthDEFAULT = calc_MOD(editGasPage.gasID); + create_text_with_u8(text, "", depthDEFAULT, "m MOD"); + tMenuEdit_newButtonText(StMOG_DefaultDepth, text); + + return UPDATE_DIVESETTINGS; +} + +uint8_t OnAction_ToggleDepth(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t depth; + uint32_t newDefaultDepth; + char text[32]; + + if(editGasPage.depth_mode == 0) + { + editGasPage.depth_mode = 1; + depth = editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel; + newDefaultDepth = calc_MinOD(editGasPage.gasID); + create_text_with_u8(text, "", newDefaultDepth, "m Min"); + } + else + { + editGasPage.depth_mode = 0; + depth = editGasPage.pGasLine[editGasPage.gasID].depth_meter; + newDefaultDepth = calc_MOD(editGasPage.gasID); + create_text_with_u8(text, "", newDefaultDepth, "m MOD"); + } + tMenuEdit_newInput(StMOG_Depth, (uint32_t)depth, 0, 0, 0); + tMenuEdit_newButtonText(StMOG_DefaultDepth, text); + + return UNSPECIFIC_RETURN; +} + + +uint8_t OnAction_Depth(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t digitContentNew; + uint32_t newDepth; + + if(action == ACTION_BUTTON_ENTER) + { + return digitContent; + } + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &newDepth, 0, 0, 0); + if(newDepth > 255) + newDepth = 255; + if(editGasPage.depth_mode == 0) + editGasPage.pGasLine[editGasPage.gasID].depth_meter = newDepth; + else + editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel = newDepth; + tMenuEdit_newInput(editId, newDepth, 0, 0, 0); + return UPDATE_DIVESETTINGS; + } + if(action == ACTION_BUTTON_NEXT) + { + digitContentNew = digitContent + 1; + if(digitContentNew > '9') + digitContentNew = '0'; + return digitContentNew; + } + if(action == ACTION_BUTTON_BACK) + { + digitContentNew = digitContent - 1; + if(digitContentNew < '0') + digitContentNew = '9'; + return digitContentNew; + } + + return UNSPECIFIC_RETURN; +} + + +uint8_t OnAction_DefaultDepth(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint32_t newDepth; + + if(editGasPage.depth_mode == 0) + { + newDepth = calc_MOD(editGasPage.gasID); + editGasPage.pGasLine[editGasPage.gasID].depth_meter = newDepth; + } + else + { + newDepth = calc_MinOD(editGasPage.gasID); + editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel = newDepth; + } + + tMenuEdit_newInput(StMOG_Depth, newDepth, 0, 0, 0); + + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_Active(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t active, first; + + first = editGasPage.pGasLine[editGasPage.gasID].note.ub.first; + + if(first) + return UNSPECIFIC_RETURN; + + active = editGasPage.pGasLine[editGasPage.gasID].note.ub.active; + + if(active) + { + active = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 0; + } + else + { + active = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 1; + } + tMenuEdit_set_on_off(editId, active); + + return UPDATE_DIVESETTINGS; +} +*/ + + +uint8_t OnAction_First(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t first, i, gasOne; + + + SDiveState * pStateReal = stateRealGetPointerWrite(); + + if(editGasPage.ccr) + gasOne = 1 + NUM_OFFSET_DILUENT; + else + gasOne = 1; + + first = editGasPage.pGasLine[editGasPage.gasID].note.ub.first; + + if(!first) + { + for(i=gasOne;i<NUM_GASES + gasOne;i++) + { + if(editGasPage.pGasLine[i].note.ub.first) + { + editGasPage.pGasLine[i].note.ub.first = 0; + editGasPage.pGasLine[i].note.ub.active = 0; + } + } + } + + editGasPage.pGasLine[editGasPage.gasID].note.ub.first = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.deco = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.travel = 0; + editGasPage.pGasLine[editGasPage.gasID].depth_meter = 0; + editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel = 0; + + tMenuEdit_set_on_off(StMOG_First, 1); + tMenuEdit_set_on_off(StMOG_Deco, 0); + tMenuEdit_set_on_off(StMOG_Travel, 0); + tMenuEdit_set_on_off(StMOG_Inactive, 0); + + if(!first) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_Deco(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t first, deco, gasOne; + SDiveState * pStateReal = stateRealGetPointerWrite(); + + if(editGasPage.ccr) + gasOne = 1 + NUM_OFFSET_DILUENT; + else + gasOne = 1; + + first = editGasPage.pGasLine[editGasPage.gasID].note.ub.first; + deco = editGasPage.pGasLine[editGasPage.gasID].note.ub.deco; + + if(first) + { + if(editGasPage.gasID == gasOne) + return UNSPECIFIC_RETURN; + else + { + editGasPage.pGasLine[gasOne].note.ub.first = 1; + editGasPage.pGasLine[gasOne].note.ub.active = 1; + editGasPage.pGasLine[gasOne].note.ub.deco = 0; + editGasPage.pGasLine[gasOne].note.ub.travel = 0; + editGasPage.pGasLine[gasOne].depth_meter = 0; + editGasPage.pGasLine[gasOne].depth_meter_travel = 0; + } + } + + editGasPage.pGasLine[editGasPage.gasID].note.ub.first = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.deco = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.travel = 0; + editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel = 0; + editGasPage.mod = calc_MOD(editGasPage.gasID); + editGasPage.pGasLine[editGasPage.gasID].depth_meter = editGasPage.mod; + +/* + if(deco) + { + editGasPage.pGasLine[editGasPage.gasID].depth_meter = editGasPage.mod; + tMenuEdit_newInput(StMOG_ChangeDepth, editGasPage.pGasLine[editGasPage.gasID].depth_meter, 0, 0, 0); + } +*/ + + tMenuEdit_set_on_off(StMOG_First, 0); + tMenuEdit_set_on_off(StMOG_Deco, 1); + tMenuEdit_set_on_off(StMOG_Travel, 0); + tMenuEdit_set_on_off(StMOG_Inactive, 0); + + if(!deco) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_Travel(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t first, travel, gasOne; + SDiveState * pStateReal = stateRealGetPointerWrite(); + + if(editGasPage.ccr) + gasOne = 1 + NUM_OFFSET_DILUENT; + else + gasOne = 1; + + first = editGasPage.pGasLine[editGasPage.gasID].note.ub.first; + travel = editGasPage.pGasLine[editGasPage.gasID].note.ub.travel; + + if(first) + { + if(editGasPage.gasID == gasOne) + return UNSPECIFIC_RETURN; + else + { + editGasPage.pGasLine[gasOne].note.ub.first = 1; + editGasPage.pGasLine[gasOne].note.ub.active = 1; + editGasPage.pGasLine[gasOne].note.ub.deco = 0; + editGasPage.pGasLine[gasOne].note.ub.travel = 0; + editGasPage.pGasLine[gasOne].depth_meter = 0; + editGasPage.pGasLine[gasOne].depth_meter_travel = 0; + } + } + + editGasPage.pGasLine[editGasPage.gasID].note.ub.first = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 1; + editGasPage.pGasLine[editGasPage.gasID].note.ub.deco = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.travel = 1; + editGasPage.pGasLine[editGasPage.gasID].depth_meter = 0; + editGasPage.pGasLine[editGasPage.gasID].depth_meter_travel = 0; + + tMenuEdit_set_on_off(StMOG_First, 0); + tMenuEdit_set_on_off(StMOG_Deco, 0); + tMenuEdit_set_on_off(StMOG_Travel, 1); + tMenuEdit_set_on_off(StMOG_Inactive, 0); + + if(!travel) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_Inactive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t first, inactive, gasOne; + SDiveState * pStateReal = stateRealGetPointerWrite(); + + if(editGasPage.ccr) + gasOne = 1 + NUM_OFFSET_DILUENT; + else + gasOne = 1; + + first = editGasPage.pGasLine[editGasPage.gasID].note.ub.first; + + if(editGasPage.pGasLine[editGasPage.gasID].note.ub.active) + inactive = 0; + else + inactive = 1; + + if(first) + { + if(editGasPage.gasID == gasOne) + return UNSPECIFIC_RETURN; + else + { + editGasPage.pGasLine[gasOne].note.ub.first = 1; + editGasPage.pGasLine[gasOne].note.ub.active = 1; + editGasPage.pGasLine[gasOne].note.ub.deco = 0; + editGasPage.pGasLine[gasOne].note.ub.travel = 0; + editGasPage.pGasLine[gasOne].depth_meter = 0; + editGasPage.pGasLine[gasOne].depth_meter_travel = 0; + } + } + + editGasPage.pGasLine[editGasPage.gasID].note.ub.first = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.active = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.deco = 0; + editGasPage.pGasLine[editGasPage.gasID].note.ub.travel = 0; + + tMenuEdit_set_on_off(StMOG_First, 0); + tMenuEdit_set_on_off(StMOG_Deco, 0); + tMenuEdit_set_on_off(StMOG_Travel, 0); + tMenuEdit_set_on_off(StMOG_Inactive, 1); + + if(!inactive) + return UPDATE_DIVESETTINGS; + else + return UPDATE_AND_EXIT_TO_MENU; +} + + +uint8_t OnAction_SetToMOD (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t newChangeDepth = editGasPage.mod; + + editGasPage.pGasLine[editGasPage.gasID].depth_meter = newChangeDepth; + tMenuEdit_newInput(StMOG_ChangeDepth, unit_depth_integer(newChangeDepth), 0, 0, 0); + + return UPDATE_DIVESETTINGS; +} + + +uint8_t OnAction_ChangeDepth(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t digitContentNew; + uint32_t newDepth; + + if(action == ACTION_BUTTON_ENTER) + { + return digitContent; + } + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &newDepth, 0, 0, 0); + if(settingsGetPointer()->nonMetricalSystem != 0) // new hw 170703 + { + newDepth += 2; // f�r rundung + newDepth = (newDepth * 3) / 10; + } + if(newDepth > 255) + newDepth = 255; + editGasPage.pGasLine[editGasPage.gasID].depth_meter = newDepth; + tMenuEdit_newInput(editId, unit_depth_integer(newDepth), 0, 0, 0); + return UPDATE_DIVESETTINGS; + } + if(action == ACTION_BUTTON_NEXT) + { + digitContentNew = digitContent + 1; + if(digitContentNew > '9') + digitContentNew = '0'; + return digitContentNew; + } + if(action == ACTION_BUTTON_BACK) + { + digitContentNew = digitContent - 1; + if(digitContentNew < '0') + digitContentNew = '9'; + return digitContentNew; + } + + return UNSPECIFIC_RETURN; +} + + +uint8_t OnAction_BottleSize (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + int8_t digitContentNew; + uint32_t newBottleSize; +// const uint8_t validSize = {4,7,8,10,12,15,16,17,20,24,30,40,255}; + const uint8_t validSize[] = {40,30,24,20,17,16,15,12,10,8,7,4,0}; + + if(action == ACTION_BUTTON_ENTER) + { + return digitContent; + } + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &newBottleSize, 0, 0, 0); + + if(newBottleSize > validSize[0]) + newBottleSize = validSize[0]; + + editGasPage.pGasLine[editGasPage.gasID].bottle_size_liter = newBottleSize; + + tMenuEdit_newInput(editId, newBottleSize, 0, 0, 0); + return UPDATE_DIVESETTINGS; + } + if(action == ACTION_BUTTON_NEXT) + { + // new here for ease of comparison + digitContentNew = digitContent - '0'; + + if(digitContentNew > 0) + { + int i = 0; + while(digitContentNew < validSize[i]) + { + i++; + } + if(i == 0) + digitContentNew = 0; // off + else + digitContentNew = validSize[i-1]; + } + else + { + int i = 0; + while(validSize[i] != 0) + i++; + digitContentNew = validSize[i-1]; // smallest tank + } + digitContentNew += '0'; + return digitContentNew; + } + if(action == ACTION_BUTTON_BACK) + { + // new here for ease of comparison + digitContentNew = digitContent - '0'; + if(digitContentNew > 0) + { + int i = 0; + while(digitContentNew < validSize[i]) + { + i++; + } + if(validSize[i] == 0) + digitContentNew = 0; // off + else if(validSize[i+1] == 0) + digitContentNew = 0; // off + else + digitContentNew = validSize[i+1]; + } + else + { + digitContentNew = validSize[0]; + } + digitContentNew += '0'; + + return digitContentNew; + } + return EXIT_TO_MENU; +} + + +/* Private functions ---------------------------------------------------------*/ + + +void create_text_with_u8(char *text, const char *text1, uint8_t inputU8, const char *text2) +{ + uint8_t digit1, digit2, digit3, count; + + count = 0; + + if(*text1) + { + strcpy(&text[count], text1); + count = strlen(text1); + } + + digit1 = inputU8 / 100; + inputU8 -= digit1 * 100; + digit2 = inputU8 / 10; + inputU8 -= digit2 * 10; + digit3 = inputU8; + if(digit1) + text[count++] = '0' + digit1; + if(count || digit2) + text[count++] = '0' + digit2; + text[count++] = '0' + digit3; + + if(*text2) + { + strcpy(&text[count], text2); + } +}