Mercurial > public > ostc4
diff Discovery/Src/tMenuEditSetpoint.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | b7689d9e888a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tMenuEditSetpoint.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,513 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tMenuEditSetpoint.c +/// \brief +/// \author heinrichs weikamp gmbh +/// \date 19-Dec-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 "tMenuEditSetpoint.h" + +#include "check_warning.h" +#include "gfx_fonts.h" +#include "tMenuEdit.h" +#include "unit.h" + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + uint8_t spID; + SSetpointLine * pSetpointLine; +} SEditSetpointPage; + + +/* Private variables ---------------------------------------------------------*/ +SEditSetpointPage editSetpointPage; + +/* Private function prototypes -----------------------------------------------*/ + +void openEdit_DiveSetpointSelect(uint8_t line); +void openEdit_DiveSetpointSelect_Subroutine(uint8_t line); + +/* Announced function prototypes -----------------------------------------------*/ +uint8_t OnAction_SP_Setpoint (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_SP_Depth (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t On (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +//uint8_t OnAction_SP_First (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +//uint8_t OnAction_SP_Active (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +//uint8_t OnAction_SP_DM_Select (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_SP_DM_Sensor1 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_SP_DM_Sensor2 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_SP_DM_Sensor3 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); + +/* Exported functions --------------------------------------------------------*/ + +void openEdit_Setpoint(uint8_t line) +{ + uint8_t useSensorSubMenu = 0; + + /* dive mode */ + if(actual_menu_content != MENU_SURFACE) + { + uint8_t setpointCbar, actualGasID; + SDiveState *pState; + + if(actual_menu_content == MENU_DIVE_REAL) + pState = stateRealGetPointerWrite(); + else + pState = stateSimGetPointerWrite(); + + // actualGasID + if(pState->diveSettings.diveMode != DIVEMODE_CCR) + { + actualGasID = pState->lifeData.lastDiluent_GasIdInSettings; + if((actualGasID <= NUM_OFFSET_DILUENT) || (actualGasID > NUM_GASES + NUM_OFFSET_DILUENT)) + actualGasID = NUM_OFFSET_DILUENT + 1; + } + else + actualGasID = pState->lifeData.actualGas.GasIdInSettings; + + // setpointCbar, CCR_Mode and sensor menu + if(line < 6) + { + setpointCbar = pState->diveSettings.setpoint[line].setpoint_cbar; + pState->diveSettings.CCR_Mode = CCRMODE_FixedSetpoint; + + // BetterSetpoint warning only once + if(actualBetterSetpointId() == line) + { + uint8_t depth; + depth = pState->diveSettings.setpoint[line].depth_meter; + // BetterSetpoint warning only once -> clear active + for(int i=0; i<=NUM_GASES; i++) + { + pState->diveSettings.setpoint[i].note.ub.first = 0; + if(pState->diveSettings.setpoint[i].depth_meter <= depth) + pState->diveSettings.setpoint[i].note.ub.active = 0; + } + pState->diveSettings.setpoint[line].note.ub.first = 1; + } + } + else + { + if(pState->diveSettings.CCR_Mode != CCRMODE_Sensors) + { + /* setpoint_cbar will be written by updateSetpointStateUsed() in main.c loop */ + setpointCbar = 255; + pState->diveSettings.CCR_Mode = CCRMODE_Sensors; + } + else + { + useSensorSubMenu = 1; + } + } + + setActualGas_DM(&pState->lifeData,actualGasID,setpointCbar); + + if(pState->diveSettings.diveMode != DIVEMODE_CCR) + { + pState->diveSettings.diveMode = DIVEMODE_CCR; + unblock_diluent_page(); + } + + clear_warning_fallback(); + + if(!useSensorSubMenu) + { + exitMenuEdit_to_Home(); + } + else // entire sub menu during dive to select sensors active + { + set_globalState_Menu_Line(line); + resetMenuEdit(CLUT_MenuPageGasSP); + + char text[3]; + uint8_t sensorActive[3]; + + text[0] = '\001'; + text[1] = TXT_o2Sensors; + text[2] = 0; + write_topline(text); + + write_label_var( 96, 340, ME_Y_LINE1, &FontT48, "Sensor 1"); + write_label_var( 96, 340, ME_Y_LINE2, &FontT48, "Sensor 2"); + write_label_var( 96, 340, ME_Y_LINE3, &FontT48, "Sensor 3"); + + sensorActive[0] = 1; + sensorActive[1] = 1; + sensorActive[2] = 1; + if(pState->diveSettings.ppo2sensors_deactivated & 1) + sensorActive[0] = 0; + if(pState->diveSettings.ppo2sensors_deactivated & 2) + sensorActive[1] = 0; + if(pState->diveSettings.ppo2sensors_deactivated & 4) + sensorActive[2] = 0; + + write_field_on_off(StMSP_Sensor1, 30, 95, ME_Y_LINE1, &FontT48, "", sensorActive[0]); + write_field_on_off(StMSP_Sensor2, 30, 95, ME_Y_LINE2, &FontT48, "", sensorActive[1]); + write_field_on_off(StMSP_Sensor3, 30, 95, ME_Y_LINE3, &FontT48, "", sensorActive[2]); + + setEvent(StMSP_Sensor1, (uint32_t)OnAction_SP_DM_Sensor1); + setEvent(StMSP_Sensor2, (uint32_t)OnAction_SP_DM_Sensor2); + setEvent(StMSP_Sensor3, (uint32_t)OnAction_SP_DM_Sensor3); + } + return; + } + else + { + /* surface mode */ + uint8_t spId, setpoint_cbar, sp_high, depthDeco, first; + // uint8_t active, + char text[70], textPointer; + uint16_t y_line; + + set_globalState_Menu_Line(line); + + resetMenuEdit(CLUT_MenuPageGasSP); + + spId = line; + editSetpointPage.spID = spId; + SSettings *data = settingsGetPointer(); + editSetpointPage.pSetpointLine = data->setpoint; + + setpoint_cbar = editSetpointPage.pSetpointLine[spId].setpoint_cbar; + depthDeco = editSetpointPage.pSetpointLine[spId].depth_meter; + //active = editSetpointPage.pSetpointLine[spId].note.ub.active; + first = editSetpointPage.pSetpointLine[spId].note.ub.first; + + sp_high = setpoint_cbar / 100; + + strcpy(text, "\001" "Setpoint #0 X"); + text[11] += spId; + text[13] = TXT_Setpoint_Edit; + write_topline(text); + + + y_line = ME_Y_LINE_BASE + (line * ME_Y_LINE_STEP); + + textPointer = 0; + text[textPointer++] = 'S'; + text[textPointer++] = 'P'; + text[textPointer++] = '0' + spId; + text[textPointer++] = ' '; + text[textPointer++] = ' '; + + if(first == 0) + strcpy(&text[textPointer++],"\177"); + + textPointer += snprintf(&text[textPointer], 60,\ + "* " + " " + "\016\016" + " bar" + "\017" + "\034" + " " + "\016\016" + " " + "\017" + " " + "\016\016" + "meter" + "\017" + "\035" + "\n\r" + ); + write_label_var( 20, 800, y_line, &FontT48, text); + + write_field_udigit(StMSP_ppo2_setting, 160, 800, y_line, &FontT48, "#.## ###", (uint32_t)sp_high, (uint32_t)(setpoint_cbar - (100 * sp_high)), depthDeco, 0); + setEvent(StMSP_ppo2_setting, (uint32_t)OnAction_SP_Setpoint); + startEdit(); + } +} + +uint8_t OnAction_SP_Setpoint(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + int8_t digitContentNew; + uint32_t new_integer_part, new_fractional_part, new_cbar, newDepth; + + if(action == ACTION_BUTTON_ENTER) + return digitContent; + + if(action == ACTION_BUTTON_ENTER_FINAL) + { + evaluateNewString(editId, &new_integer_part, &new_fractional_part, &newDepth, 0); + + new_cbar = (new_integer_part * 100) + new_fractional_part; + + if(new_cbar < 50) + new_cbar = 50; + + if(new_cbar > 160) + new_cbar = 160; + + new_integer_part = new_cbar / 100; + new_fractional_part = new_cbar - (new_integer_part * 100); + + editSetpointPage.pSetpointLine[editSetpointPage.spID].setpoint_cbar = new_cbar; + + if(newDepth > 255) + newDepth = 255; + + editSetpointPage.pSetpointLine[editSetpointPage.spID].depth_meter = newDepth; + + return UPDATE_AND_EXIT_TO_MENU; + } + + if(action == ACTION_BUTTON_NEXT) + { + digitContentNew = digitContent + 1; + if((blockNumber == 0) && (digitContentNew > '1')) + digitContentNew = '0'; + if(digitContentNew > '9') + digitContentNew = '0'; + return digitContentNew; + } + + if(action == ACTION_BUTTON_BACK) + { + digitContentNew = digitContent - 1; + if((blockNumber == 0) && (digitContentNew > '1')) + digitContentNew = '1'; + if(digitContentNew < '0') + digitContentNew = '9'; + return digitContentNew; + } + + return EXIT_TO_MENU; +} + +uint8_t OnAction_SP_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; + + editSetpointPage.pSetpointLine[editSetpointPage.spID].depth_meter = 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; +} + +void openEdit_DiveSelectBetterSetpoint(void) +{ + uint8_t spId; + SDiveState *pState; + uint8_t depth; + + spId = actualBetterSetpointId(); + + if(actual_menu_content == MENU_DIVE_REAL) + pState = stateRealGetPointerWrite(); + else + pState = stateSimGetPointerWrite(); + + depth = pState->diveSettings.setpoint[spId].depth_meter; + + // BetterSetpoint warning only once -> clear active + for(int i=0; i<=NUM_GASES; i++) + { + pState->diveSettings.setpoint[i].note.ub.first = 0; + if(pState->diveSettings.setpoint[i].depth_meter <= depth) + pState->diveSettings.setpoint[i].note.ub.active = 0; + } + + // new setpoint + pState->diveSettings.setpoint[spId].note.ub.first = 1; + + // change in lifeData + setActualGas_DM(&pState->lifeData, pState->lifeData.actualGas.GasIdInSettings, pState->diveSettings.setpoint[spId].setpoint_cbar); +} + +uint8_t OnAction_SP_DM_Sensor1 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + SDiveState * pDiveState = 0; + + if(actual_menu_content == MENU_DIVE_REAL) + pDiveState = stateRealGetPointerWrite(); + else + pDiveState = stateSimGetPointerWrite(); + + if(pDiveState->diveSettings.ppo2sensors_deactivated & 1) + { + pDiveState->diveSettings.ppo2sensors_deactivated &= 4+2; + tMenuEdit_set_on_off(editId, 1); + } + else + { + pDiveState->diveSettings.ppo2sensors_deactivated |= 1; + tMenuEdit_set_on_off(editId, 0); + } + + return UNSPECIFIC_RETURN; +} + +uint8_t OnAction_SP_DM_Sensor2 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + SDiveState * pDiveState = 0; + + if(actual_menu_content == MENU_DIVE_REAL) + pDiveState = stateRealGetPointerWrite(); + else + pDiveState = stateSimGetPointerWrite(); + + if(pDiveState->diveSettings.ppo2sensors_deactivated & 2) + { + pDiveState->diveSettings.ppo2sensors_deactivated &= 4+1; + tMenuEdit_set_on_off(editId, 1); + } + else + { + pDiveState->diveSettings.ppo2sensors_deactivated |= 2; + tMenuEdit_set_on_off(editId, 0); + } + + return UNSPECIFIC_RETURN; +} + +uint8_t OnAction_SP_DM_Sensor3 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + SDiveState * pDiveState = 0; + + if(actual_menu_content == MENU_DIVE_REAL) + pDiveState = stateRealGetPointerWrite(); + else + pDiveState = stateSimGetPointerWrite(); + + if(pDiveState->diveSettings.ppo2sensors_deactivated & 4) + { + pDiveState->diveSettings.ppo2sensors_deactivated &= 2+1; + tMenuEdit_set_on_off(editId, 1); + } + else + { + pDiveState->diveSettings.ppo2sensors_deactivated |= 4; + tMenuEdit_set_on_off(editId, 0); + } + return UNSPECIFIC_RETURN; +} + +/* Private functions ---------------------------------------------------------*/ + +/* +uint8_t OnAction_SP_Active(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t active, first; + + first = editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.first; + + if(first) + return UNSPECIFIC_RETURN; + + active = editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active; + + if(active) + { + active = 0; + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active = 0; + } + else + { + active = 1; + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active = 1; + } + tMenuEdit_set_on_off(editId, active); + + return UPDATE_DIVESETTINGS; +} + +uint8_t OnAction_SP_First(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t active, first, i; + SDiveState * pStateReal = stateRealGetPointerWrite(); + + first = editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.first; + + if(first) + return UNSPECIFIC_RETURN; + + for(i=0;i<NUM_GASES;i++) + editSetpointPage.pSetpointLine[i].note.ub.first = 0; + + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.first = 1; + + active = editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active; + if(active == 0) + { + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active = 1; + } + + tMenuEdit_set_on_off(editId, 1); + + return UPDATE_DIVESETTINGS; +} + +uint8_t OnAction_SP_DM_Select(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + SDiveState * pDiveState = 0; + + if(editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active == 0) + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.active = 1; + + for(int i=0;i<NUM_GASES;i++) + editSetpointPage.pSetpointLine[i].note.ub.first = 0; + + editSetpointPage.pSetpointLine[editSetpointPage.spID].note.ub.first = 1; + + if(actual_menu_content == MENU_DIVE_REAL) + pDiveState = stateRealGetPointerWrite(); + else + pDiveState = stateSimGetPointerWrite(); + + setActualGas_DM(&pDiveState->lifeData, pDiveState->lifeData.actualGas.GasIdInSettings, editSetpointPage.pSetpointLine[editSetpointPage.spID].setpoint_cbar); + + return EXIT_TO_HOME; +} +*/