view Discovery/Src/tMenuEdit.c @ 845:17d9d6eddd8d Evo_2_23

Added new PreDiveCheck info page: In case a DiveO2 sensor is connected to the OSTC than the values of the DiveO2 internal pressure and temperature sensors may be used for predive checks. The pressure sensors is used for over / under pressure test and the values are visualized using a graph to make it easier to check if the pressure keeps stable. The temperature measurement gives an indication if the scrubber is getting active. This view is highly dependend on the surface temperature but may be useful e.g. for diving in european area. In addition the values ofthe connected sensors are shown.
author Ideenmodellierer
date Sun, 21 Jan 2024 22:24:36 +0100
parents 4abfb8a2a435
children de6023cc0580
line wrap: on
line source

///////////////////////////////////////////////////////////////////////////////
/// -*- coding: UTF-8 -*-
///
/// \file   Discovery/Src/tMenuEdit.c
/// \brief  Main Template file for Menu Setting Modifications
/// \author heinrichs weikamp gmbh
/// \date   04-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 <stdlib.h>

#include "tMenuEdit.h"

#include "externLogbookFlash.h"
#include "gfx_fonts.h"
#include "tHome.h"
#include "tInfoCompass.h"
#include "tInfoSensor.h"
#include "tInfoPreDive.h"
#include "tMenuEditHardware.h"
#include "tMenuEditPlanner.h"
#include "tMenuEditSystem.h"
#include "tMenuEditXtra.h"
#include "tMenuEditCustom.h"

/* Private types -------------------------------------------------------------*/
#define TEXTSIZE 16

typedef struct
{
    uint32_t pEventFunction;
    uint32_t callerID;
} SEventHandler;

typedef struct
{
    uint32_t pEventFunction;
    uint8_t functionParameter;
    uint8_t line;
} SBackMenuHandler;

typedef struct
{
    char orgText[32];
    char newText[32];
    uint32_t input[4];
    uint16_t coord[3];
    int8_t begin[4], size[4];
    tFont *fontUsed;
    uint32_t callerID;
    uint8_t maintype;
    uint8_t subtype;
} SEditIdent;

    typedef enum
{
  FIELD_NUMBERS = 0,
    FIELD_BUTTON,
    FIELD_SELECT,
    FIELD_SYMBOL,
    FIELD_TOGGLE,
    FIELD_ON_OFF,
    FIELD_UDIGIT,
    FIELD_2DIGIT,
    FIELD_3DIGIT,
    FIELD_SDIGIT,
    FIELD_FLOAT,
    FIELD_END
} SField;

/* Private variables ---------------------------------------------------------*/
GFX_DrawCfgScreen	tMEscreen;
GFX_DrawCfgScreen	tMEcursor;
GFX_DrawCfgScreen	tMEcursorNew;

static uint32_t menuID;
static uint8_t menuColor;

static int8_t id = 0;
static int8_t idLast = -1;
static SEditIdent ident[10];
static int8_t tME_stop = 0;

static int8_t evid = 0;
static int8_t evidLast = -1;
static SEventHandler event[10];

static SBackMenuHandler backmenu;

static int8_t block = 0;
static int8_t subBlockPosition = 0;

static _Bool EnterPressedBeforeButtonAction = 0;
static _Bool EnterPressed = 0;

static _Bool WriteSettings = 0;

/* Private function prototypes -----------------------------------------------*/
void draw_tMEdesign(void);
void set_cursorNew(uint8_t forThisIdentID);
void startMenuEditFieldSelect(void);
void create_newText_for_actual_Id(void);
void write_content_of_actual_Id(void);
void clean_content_of_actual_Id(void);
void write_content_without_Id(void);

void nextMenuEditFieldDigit(void);
void upMenuEditFieldDigit(void);
void downMenuEditFieldDigit(void);

void draw_tMEcursorNewDesign(void);

uint8_t split_Content_to_Digit_helper(uint8_t inContentAscii, uint8_t *outDigit100, uint8_t *outDigit10, uint8_t *outDigit1);

/* Exported functions --------------------------------------------------------*/

void tMenuEdit_init(void)
{
    tMEcursor.FBStartAdress = getFrame(7);
    tMEcursor.ImageHeight = 480;
    tMEcursor.ImageWidth = 800;
    tMEcursor.LayerIndex = 0;

    GFX_fill_buffer(tMEcursor.FBStartAdress, 0xFF, CLUT_MenuEditCursor);

    tMEcursorNew.FBStartAdress = getFrame(8);
    tMEcursorNew.ImageHeight = 390;
    tMEcursorNew.ImageWidth = 800;
    tMEcursorNew.LayerIndex = 0;

    draw_tMEcursorNewDesign();
}

void stop_cursor_fields(void)
{
    tME_stop = 1;
}

void resetMenuEdit(uint8_t color)
{
    id = 0;
    idLast = -1;
    evid = 0;
    evidLast = -1;
    tME_stop = 0;
    EnterPressed = 0;
    EnterPressedBeforeButtonAction = 0;

    setBackMenu(0,0,0);

    releaseFrame(9,tMEscreen.FBStartAdress);

    tMEscreen.FBStartAdress = getFrame(9);
    tMEscreen.ImageHeight = 480;
    tMEscreen.ImageWidth = 800;
    tMEscreen.LayerIndex = 1;

/*
    write_content_simple(&tMEscreen, 		   0,  38,      0, &Awe48,"x",CLUT_ButtonSymbols);
    write_content_simple(&tMEscreen,	800-46, 800,      0, &Awe48,"u",CLUT_ButtonSymbols);
    write_content_simple(&tMEscreen,			 0,  45, 480-45, &Awe48,"d",CLUT_ButtonSymbols);
    write_content_simple(&tMEscreen,	800-48, 800, 480-45, &Awe48,"e",CLUT_ButtonSymbols);
*/
    menuID = get_globalState();

    menuColor = color;

//	draw_tMEdesign();
//	GFX_SetFramesTopBottom(tMEscreen.FBStartAdress, tMEcursor.FBStartAdress,480);
    uint8_t line = 1;
//	GFX_SetFramesTopBottom(tMEscreen.FBStartAdress, (tMEcursorNew.FBStartAdress) + 65*2*(line - 1),390);
    GFX_SetFrameTop(tMEscreen.FBStartAdress);
    if(!settingsGetPointer()->FlipDisplay)
    {
    	GFX_SetFrameBottom((tMEcursorNew.FBStartAdress) + 65*2*(line - 1), 0, 25, 800, 390);
    }
    else
    {
    	GFX_SetFrameBottom((tMEcursorNew.FBStartAdress)+ (390 - 65 *(line)) *2, 0, 480-390-25, 800, 390);
    }
}


void tMenuEdit_refresh_live_content(void)
{
	uint32_t globState = get_globalState();
	void (*refreshFct)() = NULL;


	 switch(globState)
	 {
	 	 case (StMHARD3_O2_Sensor1):
	 	 case (StMHARD3_O2_Sensor1 & MaskFieldDigit):
	 	 case (StMHARD3_O2_Calibrate):
	 	 case (StMHARD3_Sensor_Detect):
	 	 case (StMHARD3_Sensor_Info):							refreshFct = refresh_O2Sensors;
	 	 	 break;
		 case (StMHARD2_Compass_SetCourse & MaskFieldDigit):
             refreshFct = refresh_CompassEdit;
			 break;
		 case (StMXTRA_CompassHeading & MaskFieldDigit):
             refreshFct = refresh_CompassHeading;
			 break;
	 	 case (StMSYS4_Info & MaskFieldDigit): refreshFct = &refresh_InformationPage;
	 	 	 break;
	 	 case (StMPLAN5_ExitResult & MaskFieldDigit): refreshFct = refresh_PlanResult;
	 		 break;
	 	 case (StMHARD5_Button1 & MaskFieldDigit): // will not be executed in EditFieldMode as global state is different
						refreshFct = refresh_ButtonValuesFromPIC;
	 	 	 break;
	 	 case (StMSYS3_Units & MaskFieldDigit): refreshFct = refresh_Design;
	 	 	 break;
	 	 case (StMCustom1_CViewTimeout & MaskFieldDigit):refreshFct = refresh_Customviews;
	 	 	 break;
	 	 case (StMCustom4_CViewSelection1 & MaskFieldDigit):
	 	 case (StMCustom3_CViewSelection1 & MaskFieldDigit):
	 	 case StMCustom3_CViewSelection2:
	 	 case StMCustom3_CViewSelection3:
	 	 case StMCustom3_CViewSelection4:
	 	 case StMCustom3_CViewSelection5:
	 	 case StMCustom3_CViewSelection6: refreshFct = CustomviewDivemode_refresh;
	 	 	 break;
	 	 case (StMCustom5_CViewPortCalib & MaskFieldDigit):
	 	 case StMCustom5_CViewPortLayout:
	 	 case StMCustom5_CViewPortAmbient: refreshFct = refresh_ViewPort;
	 		 break;
	 	 default:	 /* no menu has been updated */
	 		 break;
	 }

	 if(refreshFct != NULL)
	 {
			uint32_t rememberPage = tMEscreen.FBStartAdress;
			tMEscreen.FBStartAdress = getFrame(9);

			refreshFct();

	        GFX_SetFrameTop(tMEscreen.FBStartAdress);
	        releaseFrame(9,rememberPage);
	 }
}

void tMenuEdit_writeSettingsToFlash(void)
{
    if(WriteSettings)
    {
    	reset_SettingWarning();
        GFX_logoAutoOff();
        ext_flash_write_settings(0);
        WriteSettings = 0;
    }
}

void helperLeaveMenuEditField(uint8_t idID)
{
    if(ident[idID].maintype == FIELD_NUMBERS)
    {
        change_CLUT_entry((CLUT_MenuEditField0 + idID), CLUT_MenuEditFieldRegular);
    }
}


void helperGotoMenuEditField(uint8_t idID)
{
/*
    if(ident[idID].maintype == FIELD_NUMBERS)
    {
        change_CLUT_entry((CLUT_MenuEditField0 + idID), CLUT_MenuEditFieldSelected);
    }
*/
    set_cursorNew(idID);
//	set_cursor(idID);
}


void exitMenuEdit_to_BackMenu(void)
{
    _Bool EnterPressedBackup = EnterPressed;

    if(backmenu.pEventFunction)
    {
        ((void (*)(uint8_t))(backmenu.pEventFunction))(backmenu.functionParameter);

        EnterPressed = EnterPressedBackup;
//		if(backmenu.line > 1)
//			helperGotoMenuEditField(backmenu.line);
    }
}


void exitMenuEdit_to_Menu_with_Menu_Update(void)
{
    EnterPressed = 1;
    exitMenuEdit(1);
}


void exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only(void)
{
    EnterPressed = 1;
    exitMenuEdit(0);
}


void exitMenuEdit_to_Home_with_Menu_Update(void)
{
    EnterPressed = 1;
    exitMenuEdit(1);
    set_globalState_tHome();
}


void exitMenuEdit_to_InfoCompassCalibration(void)
{
    exitMenuEdit(1);
    openInfo_Compass();
}

void exitMenuEdit_to_InfoSensor(void)
{
	uint32_t globState = get_globalState();

    exitMenuEdit(1);
	switch(globState)
	{
	 	 case (StMHARD3_O2_Sensor3): openInfo_Sensor(2);
			break;
	 	 case (StMHARD3_O2_Sensor2): openInfo_Sensor(1);
	 	 	 break;
	 	 default:
	 	 case (StMHARD3_O2_Sensor1): openInfo_Sensor(0);
	 	 	 break;
	}
}


void exitMenuEdit_to_Home(void)
{
    exitMenuEdit(1);
    set_globalState_tHome();
}


void exitMenuEdit(uint8_t writeSettingsIfEnterPressed)
{
    openMenu(0);
    if(EnterPressed)
    {
        updateMenu();
        if((stateUsed->mode == MODE_SURFACE) && writeSettingsIfEnterPressed)
            WriteSettings = 1;
    }
    releaseFrame(9,tMEscreen.FBStartAdress);
}


void exitMenuEditBackMenuOption(void)
{
    if(backmenu.pEventFunction == 0)
        exitMenuEdit(1);
    else
        exitMenuEdit_to_BackMenu();
}


void startMenuEditFieldSelect(void)
{
    id = 0;
    helperGotoMenuEditField(id);
}


void nextMenuEditField(void)
{
    helperLeaveMenuEditField(id);

    if(id < idLast)
        id++;
    else
        id = 0;
    helperGotoMenuEditField(id);
}

/*
void previousMenuEditField(void)
{
    helperLeaveMenuEditField(id);
    if(id > 0)
        id--;
    else
        id = idLast;
    helperGotoMenuEditField(id);
}
*/

_Bool inc_subBlock_or_block_of_actual_id(void)
{
    if(event[evid].callerID != ident[id].callerID)
        return 0;

    if((ident[id].subtype != FIELD_3DIGIT) && (ident[id].subtype != FIELD_2DIGIT) && ((subBlockPosition + 1) < ident[id].size[block]))
    {
        subBlockPosition++;
        return 1;
    }

    if(((block + 1) < 4) && (ident[id].size[block+1] > 0))
    {
        block++;
        subBlockPosition = 0;
        return 1;
    }

    return 0;
}


uint8_t get_newContent_of_actual_id_block_and_subBlock(uint8_t action)
{
    uint8_t (*onActionFunc)(uint32_t, uint8_t, uint8_t, uint8_t, uint8_t);
    uint8_t content;

    if(event[evid].callerID != ident[id].callerID)
        return 0;

    onActionFunc = (uint8_t (*)(uint32_t, uint8_t, uint8_t, uint8_t, uint8_t))(event[evid].pEventFunction);

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_3DIGIT))
    {
        content  = 100 * (	ident[id].newText[ident[id].begin[block] + 0] - '0');
        content +=  10 * (	ident[id].newText[ident[id].begin[block] + 1] - '0');
        content += 				ident[id].newText[ident[id].begin[block] + 2];
    }
    else
    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT))
    {
        content = 10 * (ident[id].newText[ident[id].begin[block] + 0] - '0');
        content += ident[id].newText[ident[id].begin[block] + 1];
    }
    else
    if(ident[id].maintype == FIELD_NUMBERS)
        content = ident[id].newText[ident[id].begin[block] + subBlockPosition];
    else
    if((ident[id].maintype == FIELD_ON_OFF) || (ident[id].maintype == FIELD_TOGGLE))
        content = ident[id].input[block];
    else
        content = 0; /* just a default for protection */

    return onActionFunc(ident[id].callerID, block, subBlockPosition, content, action);
}

void mark_digit_of_actual_id_with_this_block_and_subBlock(int8_t oldblock, int8_t oldsubblockpos)
{
    char oneCharText[2];
    uint16_t positionOffset;

    if(event[evid].callerID != ident[id].callerID)
        return;

    if(ident[id].maintype == FIELD_NUMBERS)
    {
        oneCharText[0] = ident[id].newText[ident[id].begin[oldblock] + oldsubblockpos];
        oneCharText[1] = 0;
        positionOffset = GFX_return_offset(ident[id].fontUsed, ident[id].newText, ident[id].begin[oldblock] + oldsubblockpos);
        write_content( ident[id].coord[0] + positionOffset, ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, oneCharText, CLUT_MenuEditFieldSelected);
    }
}


void mark_new_2digit_of_actual_id_block(void)
{
    char oneCharText[3];
    uint16_t positionOffset;

    if(event[evid].callerID != ident[id].callerID)
        return;

    if(ident[id].maintype == FIELD_NUMBERS)
    {
        oneCharText[0] = ident[id].newText[ident[id].begin[block] + 0];
        oneCharText[1] = ident[id].newText[ident[id].begin[block] + 1];
        oneCharText[2] = 0;
        positionOffset = GFX_return_offset(ident[id].fontUsed, ident[id].newText, ident[id].begin[block] + 0);
        write_content( ident[id].coord[0] + positionOffset, ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, oneCharText, CLUT_MenuEditDigit);
    }
}


void mark_new_3digit_of_actual_id_block(void)
{
    char oneCharText[4];
    uint16_t positionOffset;

    if(event[evid].callerID != ident[id].callerID)
        return;

    if(ident[id].maintype == FIELD_NUMBERS)
    {
        oneCharText[0] = ident[id].newText[ident[id].begin[block] + 0];
        oneCharText[1] = ident[id].newText[ident[id].begin[block] + 1];
        oneCharText[2] = ident[id].newText[ident[id].begin[block] + 2];
        oneCharText[3] = 0;
        positionOffset = GFX_return_offset(ident[id].fontUsed, ident[id].newText, ident[id].begin[block] + 0);
        write_content( ident[id].coord[0] + positionOffset, ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, oneCharText, CLUT_MenuEditDigit);
    }
}


void mark_new_digit_of_actual_id_block_and_subBlock(void)
{
    char oneCharText[2];
    uint16_t positionOffset;

    if(event[evid].callerID != ident[id].callerID)
        return;

    if(ident[id].maintype == FIELD_NUMBERS)
    {
        oneCharText[0] = ident[id].newText[ident[id].begin[block] + subBlockPosition];
        oneCharText[1] = 0;
        positionOffset = GFX_return_offset(ident[id].fontUsed, ident[id].newText, ident[id].begin[block] + subBlockPosition);
        write_content( ident[id].coord[0] + positionOffset, ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, oneCharText, CLUT_MenuEditDigit);
    }
}


void enterMenuEditField(void)
{
    uint8_t newContent;
    uint8_t digit100;
    uint8_t digit10;
    uint8_t digit1;

    evid = 0;
    while((evid < evidLast) && (event[evid].callerID != ident[id].callerID))
    {
        evid++;
    }

    if(event[evid].callerID != ident[id].callerID)
        return;

    set_globalState(event[evid].callerID);
    block = 0;
    subBlockPosition = 0;

    if(ident[id].maintype == FIELD_NUMBERS)
    {
        change_CLUT_entry(CLUT_MenuEditLineSelected, CLUT_MenuEditCursor);
        // old stuff? hw 150916, reactivated 150923, this shows which digit will be changed now as it marks the other grey/black
        // now fixed for button settings with newContent <= '0'+99 condition
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldSelected);
    }
    if(ident[id].maintype == FIELD_TOGGLE)
    {
        change_CLUT_entry(CLUT_MenuEditLineSelected, CLUT_MenuEditCursor);
    }


    newContent = get_newContent_of_actual_id_block_and_subBlock(ACTION_BUTTON_ENTER);

    if (((newContent == UPDATE_DIVESETTINGS) || (newContent == UPDATE_AND_EXIT_TO_HOME) || (newContent == UPDATE_AND_EXIT_TO_MENU)) && (actual_menu_content == MENU_SURFACE))
        createDiveSettings();

    if(newContent == EXIT_TO_MENU_WITH_LOGO)
    {
        GFX_logoAutoOff();
    }

    if((newContent == EXIT_TO_MENU) || (newContent == UPDATE_AND_EXIT_TO_MENU) || (newContent == EXIT_TO_MENU_WITH_LOGO))
    {
        if(backmenu.pEventFunction == 0)
            exitMenuEdit(1);
        else
            exitMenuEdit_to_BackMenu();
        return;
    }

    if((newContent == EXIT_TO_HOME) || (newContent == UPDATE_AND_EXIT_TO_HOME))
    {
        exitMenuEdit_to_Home();
        return;
    }

    if(newContent == EXIT_TO_INFO_COMPASS)
    {
        exitMenuEdit_to_InfoCompassCalibration();
        return;
    }

    if(newContent == EXIT_TO_INFO_SENSOR)
    {
        exitMenuEdit_to_InfoSensor();
        return;
    }

    switch(ident[id].maintype)
    {
    case FIELD_NUMBERS:
        write_buttonTextline(TXT2BYTE_ButtonMinus,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonPlus);

        switch (ident[id].subtype) {
        case FIELD_UDIGIT:
            if((newContent >= '0') && (newContent <= '9'))
                ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;

            mark_new_digit_of_actual_id_block_and_subBlock();

            break;
        case FIELD_3DIGIT:
            if((newContent >= '0') && (newContent <= '0'+200))
            {
                split_Content_to_Digit_helper( newContent, &digit100, &digit10, &digit1);
                ident[id].newText[ident[id].begin[block] + 0] = '0' + digit100;
                ident[id].newText[ident[id].begin[block] + 1] = '0' + digit10;
                ident[id].newText[ident[id].begin[block] + 2] = '0' + digit1;
                mark_new_3digit_of_actual_id_block();
            }

            break;
        case FIELD_2DIGIT:
            if((newContent >= '0') && (newContent <= '0'+99))
            {
                ident[id].newText[ident[id].begin[block]] = '0' + (newContent - '0')/10;
                ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10)));
                mark_new_2digit_of_actual_id_block();
            }

            break;
        case FIELD_SDIGIT:
            if ((subBlockPosition == 0 && (newContent == '+' || newContent == '-')) || (subBlockPosition > 0 && newContent >= '0' && newContent <= '9')) {
                ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;
            }

            mark_new_digit_of_actual_id_block_and_subBlock();

            break;
        }
        break;
    case FIELD_BUTTON:
    case FIELD_ON_OFF:
        set_globalState(menuID);

        break;
    case FIELD_SYMBOL:
        ident[id].input[0] += 1;
        if(ident[id].input[0] >= ident[id].input[1])
            ident[id].input[0] = 0;
        ident[id].newText[0] = ident[id].orgText[ident[id].input[0]];
        write_content_of_actual_Id();
        set_globalState(menuID);
        break;
    case FIELD_SELECT:
        write_buttonTextline(TXT2BYTE_ButtonMinus, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonPlus);

        break;
    }
}


void exitMenuEditField(void)
{
    uint8_t newContent;

    set_globalState(menuID);

    if(event[evid].callerID != ident[id].callerID)
        return;

    newContent = get_newContent_of_actual_id_block_and_subBlock(ACTION_TIMEOUT);

/*
    uint8_t (*onActionFunc)(uint32_t, uint8_t, uint8_t, uint8_t, uint8_t);
    uint8_t newContent;

    onActionFunc = (uint8_t (*)(uint32_t, uint8_t, uint8_t, uint8_t, uint8_t))(event[evid].pEventFunction);

    newContent = onActionFunc(ident[id].callerID, 0, 0, 255, ACTION_BUTTON_BACK);
*/

    /* destroy changes of editing in newText */
    change_CLUT_entry(CLUT_MenuEditLineSelected, CLUT_MenuLineSelected);
    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);

    create_newText_for_actual_Id();
    write_content_of_actual_Id();

    if((newContent == EXIT_TO_MENU) || (newContent == UPDATE_AND_EXIT_TO_MENU))
    {
        exitMenuEdit(1);
        return;
    }

    if((newContent == EXIT_TO_HOME) || (newContent == UPDATE_AND_EXIT_TO_HOME))
    {
        exitMenuEdit_to_Home();
        return;
    }

}


static void startNextEdit(void)
{
    EnterPressed = 1;
    nextMenuEditField();
    enterMenuEditField();
}


void nextMenuEditFieldDigit(void)
{
    uint8_t action;
    uint8_t newContent;
    int8_t blockOld = 0;
    int8_t subBlockPositionOld = 0;

    if(event[evid].callerID != ident[id].callerID)
        return;

    blockOld = block;
    subBlockPositionOld = subBlockPosition;

    if(inc_subBlock_or_block_of_actual_id())
        action = ACTION_BUTTON_ENTER;
    else
        action = ACTION_BUTTON_ENTER_FINAL;

    newContent = get_newContent_of_actual_id_block_and_subBlock(action);

    if(action == ACTION_BUTTON_ENTER_FINAL)
    {
        write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);

        change_CLUT_entry(CLUT_MenuEditLineSelected, CLUT_MenuLineSelected);
        for(int i = 0;i<=9;i++)
            change_CLUT_entry((CLUT_MenuEditField0 + i), CLUT_MenuEditFieldRegular);

        if(((newContent == UPDATE_DIVESETTINGS) || (newContent == UPDATE_AND_EXIT_TO_HOME) || (newContent == UPDATE_AND_EXIT_TO_MENU)) && (actual_menu_content == MENU_SURFACE))
        createDiveSettings();

        if((newContent == EXIT_TO_MENU) || (newContent == UPDATE_AND_EXIT_TO_MENU))
        {
            exitMenuEdit(1);
            return;
        }

        if((newContent == EXIT_TO_HOME) || (newContent == UPDATE_AND_EXIT_TO_HOME))
        {
            exitMenuEdit_to_Home();
            return;
        }

        if (newContent == EXIT_TO_NEXT_MENU) {
            startNextEdit();

            return;
        }
    }

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_3DIGIT) && (action == ACTION_BUTTON_ENTER) &&(newContent >= '0') && (newContent <= '0' + 99))
    {
        ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/100;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + (newContent - '0')/10;
        ident[id].newText[ident[id].begin[block] + 2] = '0' + ((newContent - '0') - (10*((newContent - '0')/10)));
    }
    else
    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT) && (action == ACTION_BUTTON_ENTER) &&(newContent >= '0') && (newContent <= '0' + 99))
    {
        ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/10;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10)));
    } else if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT && action == ACTION_BUTTON_ENTER && subBlockPosition == 0) {
        if (newContent == '+' || newContent == '-') {
            ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;
        }
    }
    else
    if((ident[id].maintype == FIELD_NUMBERS) && (action == ACTION_BUTTON_ENTER) && (newContent >= '0') && (newContent <= '9'))
        ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;

    if(action == ACTION_BUTTON_ENTER)
    {
        if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_3DIGIT))
        {
            mark_new_3digit_of_actual_id_block();
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,0);
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,1);
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,2);
        }
        else
        if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT))
        {
            mark_new_2digit_of_actual_id_block();
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,0);
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,1);
        }
        else
        {
            mark_new_digit_of_actual_id_block_and_subBlock();
            mark_digit_of_actual_id_with_this_block_and_subBlock(blockOld,subBlockPositionOld);
        }
    }
    else /* action == ACTION_BUTTON_ENTER_FINAL */
        set_globalState(menuID);
}

uint8_t split_Content_to_Digit_helper(uint8_t inContentAscii, uint8_t *outDigit100, uint8_t *outDigit10, uint8_t *outDigit1)
{
    uint8_t newContent, tempDigit, CopyContent;

    newContent = inContentAscii - '0';
    CopyContent = newContent;

    tempDigit = newContent / 100;
    newContent -= tempDigit * 100;
    if(outDigit100)
        *outDigit100 = tempDigit;

    tempDigit = newContent / 10;
    newContent -= tempDigit * 10;
    if(outDigit10)
        *outDigit10 = tempDigit;

    tempDigit = newContent;
    if(outDigit1)
        *outDigit1 = tempDigit;

    return CopyContent;
}


static void checkUpdateSDigit(uint8_t newContent)
{
    if ((subBlockPosition == 0 && (newContent == '+' || newContent == '-')) || (subBlockPosition > 0 && newContent >= '0' && newContent <= '9')) {
        ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;
    }
}


void upMenuEditFieldDigit(void)
{
    uint8_t newContent;
    uint8_t digit100;
    uint8_t digit10;
    uint8_t digit1;

    if(event[evid].callerID != ident[id].callerID)
        return;

    newContent = get_newContent_of_actual_id_block_and_subBlock(ACTION_BUTTON_NEXT);

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_3DIGIT) &&(newContent >= '0') && (newContent <= '0' + 200))
    {
        split_Content_to_Digit_helper( newContent, &digit100, &digit10, &digit1);
        ident[id].newText[ident[id].begin[block] + 0] = '0' + digit100;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + digit10;
        ident[id].newText[ident[id].begin[block] + 2] = '0' + digit1;
        mark_new_3digit_of_actual_id_block();
        return;
    }

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT) &&(newContent >= '0') && (newContent <= '0' + 99))
    {
        ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/10;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10)));
        mark_new_2digit_of_actual_id_block();
        return;
    }

    if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT) {
        checkUpdateSDigit(newContent);
    } else if (ident[id].maintype == FIELD_NUMBERS && newContent >= '0' && newContent <= '9') {
        ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;
    }

    mark_new_digit_of_actual_id_block_and_subBlock();
}


void downMenuEditFieldDigit(void)
{
    uint8_t newContent;
    uint8_t digit100;
    uint8_t digit10;
    uint8_t digit1;

    if(event[evid].callerID != ident[id].callerID)
        return;

    newContent = get_newContent_of_actual_id_block_and_subBlock(ACTION_BUTTON_BACK);

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_3DIGIT) &&(newContent >= '0') && (newContent <= '0' + 200))
    {
        split_Content_to_Digit_helper( newContent, &digit100, &digit10, &digit1);
        ident[id].newText[ident[id].begin[block] + 0] = '0' + digit100;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + digit10;
        ident[id].newText[ident[id].begin[block] + 2] = '0' + digit1;
        mark_new_3digit_of_actual_id_block();
        return;
    }

    if((ident[id].maintype == FIELD_NUMBERS) && (ident[id].subtype == FIELD_2DIGIT) &&(newContent >= '0') && (newContent <= '0' + 99))
    {
        ident[id].newText[ident[id].begin[block] + 0] = '0' + (newContent - '0')/10;
        ident[id].newText[ident[id].begin[block] + 1] = '0' + ((newContent - '0') - (10*((newContent - '0')/10)));
        mark_new_2digit_of_actual_id_block();
        return;
    }

    if (ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT) {
        checkUpdateSDigit(newContent);
    } else if (ident[id].maintype == FIELD_NUMBERS && newContent >= '0' && newContent <= '9') {
        ident[id].newText[ident[id].begin[block] + subBlockPosition] = newContent;
    }

    mark_new_digit_of_actual_id_block_and_subBlock();
}


void evaluateNewString(uint32_t editID, uint32_t *pNewValue1, uint32_t *pNewValue2, uint32_t *pNewValue3, uint32_t *pNewValue4)
{
    if(editID != ident[id].callerID)
        return;

    bool isSigned = ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT;

    uint8_t i, digitCount, digit;
    uint32_t sum[4], multiplier;

    for(i=0;i<4;i++)
        sum[i] = 0;

    i = 0;
    while( ident[id].size[i] && (i < 4))
    {
        multiplier = 1;
        for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++)
            multiplier *= 10;

        bool isNegative = false;
        for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++)
        {
            digit = ident[id].newText[ident[id].begin[i] + digitCount];

            if (isSigned && digitCount == 0) {
                if (digit == '-') {
                    isNegative = true;
                }
            } else {
                if(digit > '0')
                    digit -= '0';
                else
                    digit = 0;

                if(digit > 9)
                    digit = 9;

                sum[i] += digit * multiplier;
            }

            if(multiplier >= 10)
                multiplier /= 10;
            else
                multiplier = 0;
        }

        if (isSigned) {
            int32_t value = sum[i];
            if (isNegative) {
                value = -value;
            }
            sum[i] = ((input_u)value).uint32;
        }

        i++;
    }

    *pNewValue1 = sum[0];
    *pNewValue2 = sum[1];
    *pNewValue3 = sum[2];
    *pNewValue4 = sum[3];
}


uint8_t get_id_of(uint32_t editID)
{
    uint8_t temp_id;

    if(editID == ident[id].callerID)
        return id;
    else
    {
        temp_id = 0;
        while((temp_id < 9) && (editID != ident[temp_id].callerID))
            temp_id++;
        if(editID != ident[temp_id].callerID)
            temp_id = 255;
        return temp_id;
    }
}


void tMenuEdit_newButtonText(uint32_t editID, char *text)
{
    uint8_t backup_id, temp_id;

    temp_id = get_id_of(editID);
    if(temp_id == 255)
        return;

    backup_id = id;
    id = temp_id;

    strncpy(ident[id].newText, text, 32);
    ident[id].newText[31] = 0;

    clean_content_of_actual_Id();
    write_content_of_actual_Id();

    id = backup_id;
}


void tMenuEdit_set_on_off(uint32_t editID, uint32_t int1)
{
    uint8_t backup_id, temp_id;

    temp_id = get_id_of(editID);
    if(temp_id == 255)
        return;

    backup_id = id;
    id = temp_id;

    ident[id].input[0] = int1;

    if(int1)
        ident[id].newText[0] = '\005';
    else
        ident[id].newText[0] = '\006';

    clean_content_of_actual_Id();
    write_content_of_actual_Id();

    id = backup_id;
}

void tMenuEdit_select(uint32_t editID)
{
	uint8_t id_local = 0;
	id_local = get_id_of(editID);

	if(id_local <= idLast)
	{
		id = id_local;
		set_cursorNew(id);
	}
}

#if OLD_SELECTION
void tMenuEdit_select(uint32_t editID, uint32_t int1, uint32_t int2, uint32_t int3, uint32_t int4)
{
    if(int1 > 4)
        return;

    uint8_t backup_id, temp_id;

    temp_id = get_id_of(editID);
    if(temp_id == 255)
        return;

    backup_id = id;
    id = temp_id;

    ident[id].input[0] = int1;
    ident[id].input[1] = int1;
    ident[id].input[2] = int1;
    ident[id].input[3] = int1;

    create_newText_for_actual_Id();
    clean_content_of_actual_Id();
    write_content_of_actual_Id();

    id = backup_id;
}
#endif


void tMenuEdit_newInput(uint32_t editID, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
{
    uint8_t backup_id, temp_id;

    temp_id = get_id_of(editID);
    if(temp_id == 255)
        return;

    backup_id = id;
    id = temp_id;

    if(editID != ident[id].callerID)
    {
        temp_id = 0;
        while((temp_id < 9) && (editID != ident[temp_id].callerID))
            temp_id++;
        if(editID != ident[temp_id].callerID)
            return;
        id = temp_id;
    }
    ident[id].input[0] = int1;
    ident[id].input[1] = int2;
    ident[id].input[2] = int3;
    ident[id].input[3] = int4;

    create_newText_for_actual_Id();
    if(id <= idLast)
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);
    write_content_of_actual_Id();

    id = backup_id;
}


void resetEnterPressedToStateBeforeButtonAction(void)
{
    EnterPressed = EnterPressedBeforeButtonAction;
}


void sendActionToMenuEdit(uint8_t sendAction)
{
    if(get_globalState() == menuID)
    {
        switch(sendAction)
        {
        case ACTION_BUTTON_ENTER:
            EnterPressedBeforeButtonAction = EnterPressed;
            EnterPressed = 1;
            enterMenuEditField();
            break;
        case ACTION_BUTTON_NEXT:
            nextMenuEditField();
//				previousMenuEditField();
            break;
        case ACTION_BUTTON_BACK:
            exitMenuEditBackMenuOption();
            break;
        case ACTION_TIMEOUT:
        case ACTION_MODE_CHANGE:
            exitMenuEdit(1);
            break;
        case ACTION_IDLE_TICK:
        case ACTION_IDLE_SECOND:
        default:
            break;

        }
    }
    else
    if(get_globalState() == event[evid].callerID)
    {
        switch(sendAction)
        {
        case ACTION_BUTTON_ENTER:
            nextMenuEditFieldDigit();
            break;
        case ACTION_BUTTON_NEXT:
            upMenuEditFieldDigit();
            break;
        case ACTION_BUTTON_BACK:
            downMenuEditFieldDigit();
            break;
        case ACTION_TIMEOUT:
        case ACTION_MODE_CHANGE:
            exitMenuEditField();
            break;
        case ACTION_IDLE_TICK:
        case ACTION_IDLE_SECOND:
            break;
        default:
            break;
        }
    }
    else
    {
        switch(sendAction)
        {
        case ACTION_BUTTON_ENTER:
            break;
        case ACTION_BUTTON_NEXT:
            break;
        case ACTION_BUTTON_BACK:
            break;
        case ACTION_TIMEOUT:
        case ACTION_MODE_CHANGE:
            exitMenuEdit(1);
            break;
        case ACTION_IDLE_TICK:
        case ACTION_IDLE_SECOND:
            break;
        default:
            break;
        }
    }
}


void create_newText_for_actual_Id_and_field_select(void)
{
    uint8_t i;

    i = 0;
    while( ident[id].size[i] && (i < 4))
    {
        if(ident[id].input[i])
            ident[id].newText[ident[id].begin[i]] = '\005';
        else
            ident[id].newText[ident[id].begin[i]] = '\006';
        i++;
    }
}


void create_newText_for_actual_Id(void)
{
    if(	ident[id].maintype == FIELD_SELECT)
    {
        create_newText_for_actual_Id_and_field_select();
        return;
    }

    bool isSigned = ident[id].maintype == FIELD_NUMBERS && ident[id].subtype == FIELD_SDIGIT;

    uint8_t i, digitCount;
    uint32_t remainder, digit, divider;

    i = 0;
    while( ident[id].size[i] && (i < 4))
    {
        bool isNegative = false;
        if (isSigned) {
            int32_t value = ((input_u)ident[id].input[i]).int32;
            if (value < 0) {
                isNegative = true;
            }
            remainder = abs(value);
        } else {
            remainder = ident[id].input[i];
        }
        divider = 1;

        for(digitCount = 1; digitCount < ident[id].size[i]; digitCount++)
            divider *= 10;

        for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++)
        {
            if (isSigned && digitCount == 0) {
                ident[id].newText[ident[id].begin[i] + digitCount] = isNegative ? '-' : '+';
            } else {
                digit = remainder	/ divider;
                remainder -= digit * divider;
                if(digit < 10)
                    ident[id].newText[ident[id].begin[i] + digitCount] = digit + '0';
                else
                    ident[id].newText[ident[id].begin[i] + digitCount] = 'x';
            }

            divider /= 10;
        }
        i++;
    }
}


void write_content_without_Id(void)
{
    write_content( ident[id].coord[0], ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, ident[id].newText, CLUT_MenuEditFieldRegular);
}


void write_content_of_actual_Id(void)
{
    write_content( ident[id].coord[0], ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed, ident[id].newText, (CLUT_MenuEditField0 + id));
}


void clean_content_of_actual_Id(void)
{
    clean_content( ident[id].coord[0], ident[id].coord[1], ident[id].coord[2], ident[id].fontUsed);
}


void write_field_udigit_and_2digit(uint8_t subtype, uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
{
    if(id >= 9)
        return;

    ident[id].maintype = FIELD_NUMBERS;
    ident[id].subtype  = subtype;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    strncpy(ident[id].orgText, text, 32);
    strncpy(ident[id].newText, text, 32);
    ident[id].orgText[31] = 0;
    ident[id].newText[31] = 0;

    /* uint32_t has max 10 digits */

    int8_t beginTmp, sizeTmp;
    uint8_t i;

    ident[id].input[0] = int1;
    ident[id].input[1] = int2;
    ident[id].input[2] = int3;
    ident[id].input[3] = int4;

    for(i=0;i<4;i++)
        ident[id].size[i] = 0;

    beginTmp = 0;
    for(i=0;i<4;i++)
    {
        while((ident[id].orgText[beginTmp] != '#')&& ident[id].orgText[beginTmp])
            beginTmp++;

        if(ident[id].orgText[beginTmp] == '#')
        {
            sizeTmp = 1;
            while(ident[id].orgText[beginTmp + sizeTmp] == '#')
                sizeTmp++;

            ident[id].begin[i] = beginTmp;
            ident[id].size[i] = sizeTmp;
            beginTmp = ident[id].begin[i] + ident[id].size[i];
        }
        else
            break;
    }

    if(!tME_stop)
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);
    else
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditInfo);

    create_newText_for_actual_Id();

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}

void write_field_udigit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
{
    write_field_udigit_and_2digit(FIELD_UDIGIT, editID,XleftGimpStyle,XrightGimpStyle,YtopGimpStyle,Font,text,int1,int2,int3,int4);
}

void write_field_2digit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
{
    write_field_udigit_and_2digit(FIELD_2DIGIT, editID,XleftGimpStyle,XrightGimpStyle,YtopGimpStyle,Font,text,int1,int2,int3,int4);
}

void write_field_3digit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint32_t int1,  uint32_t int2,  uint32_t int3,  uint32_t int4)
{
    write_field_udigit_and_2digit(FIELD_3DIGIT, editID,XleftGimpStyle,XrightGimpStyle,YtopGimpStyle,Font,text,int1,int2,int3,int4);
}


void write_field_sdigit(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, int32_t int1, int32_t int2, int32_t int3, int32_t int4)
{
    write_field_udigit_and_2digit(FIELD_SDIGIT, editID, XleftGimpStyle, XrightGimpStyle, YtopGimpStyle, Font, text, ((input_u)int1).uint32, ((input_u)int2).uint32, ((input_u)int3).uint32, ((input_u)int4).uint32);
}


void write_field_select(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1,  uint8_t int2,  uint8_t int3,  uint8_t int4)
{
    if(id >= 9)
        return;

    int8_t beginTmp;

    ident[id].maintype = FIELD_SELECT;
    ident[id].subtype  = FIELD_SELECT;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    strncpy(ident[id].orgText, text, 32);
    strncpy(ident[id].newText, text, 32);
    ident[id].orgText[31] = 0;
    ident[id].newText[31] = 0;

    ident[id].input[0] = int1;
    ident[id].input[1] = int2;
    ident[id].input[2] = int3;
    ident[id].input[3] = int4;

    for(int i=0;i<4;i++)
        ident[id].size[i] = 0;

    beginTmp = 0;
    for(int i=0;i<4;i++)
    {
        while((ident[id].orgText[beginTmp] != '#')&& ident[id].orgText[beginTmp])
            beginTmp++;

        if(ident[id].orgText[beginTmp] == '#')
        {

            ident[id].begin[i] = beginTmp;
            ident[id].size[i] = 1;
            beginTmp = ident[id].begin[i] + ident[id].size[i];
        }
        else
            break;
    }

    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);

    create_newText_for_actual_Id();

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}

void write_field_button(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text)
{
    if(id >= 9)
        return;

    ident[id].maintype = FIELD_BUTTON;
    ident[id].subtype  = FIELD_BUTTON;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    strncpy(ident[id].orgText, text, 32);
    strncpy(ident[id].newText, text, 32);
    ident[id].orgText[31] = 0;
    ident[id].newText[31] = 0;

    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditButtonColor1);

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}


void write_field_symbol(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1)
{
    if(id >= 9)
        return;

    ident[id].maintype = FIELD_SYMBOL;
    ident[id].subtype  = FIELD_SYMBOL;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    strncpy(ident[id].orgText, text, 32);
    strncpy(ident[id].newText, text, 32);
    ident[id].orgText[31] = 0;

    ident[id].newText[0] = text[0];
    ident[id].newText[1] = 0;

    ident[id].input[0] = int1;
    ident[id].input[1] = strlen(ident[id].orgText);

    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditButtonColor1);

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}
void write_field_toggle(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1,  uint8_t int2)
{
    if(id >= 9) return;
    ident[id].maintype = FIELD_TOGGLE;
	ident[id].subtype  = FIELD_TOGGLE;
	ident[id].coord[0] = XleftGimpStyle;
	ident[id].coord[1] = XrightGimpStyle;
	ident[id].coord[2] = YtopGimpStyle;
	ident[id].fontUsed = (tFont *)Font;
	ident[id].callerID = editID;
	strncpy(ident[id].orgText, text, 32);
	strncpy(ident[id].newText, text, 32);
	ident[id].orgText[31] = 0;
	ident[id].newText[31] = 0;

	change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditButtonColor1);

	if(editID == 0) write_content_without_Id();
	  else
	{
	      write_content_of_actual_Id();
	      if(!tME_stop) idLast = id;
	        id++;
	}
}



/* was build for field_on_off
 * to be tested for other purposes first
 */
void tMenuEdit_refresh_field(uint32_t editID)
{
    uint8_t temp_id;

    temp_id = get_id_of(editID);
    if(temp_id == 255)
        return;

    clean_content( ident[temp_id].coord[0], ident[temp_id].coord[1], ident[temp_id].coord[2], ident[temp_id].fontUsed);
    write_content( ident[temp_id].coord[0], ident[temp_id].coord[1], ident[temp_id].coord[2], ident[temp_id].fontUsed, ident[temp_id].newText, (CLUT_MenuEditField0 + temp_id));
}


void write_field_on_off(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, uint8_t int1)
{
    if(id >= 9)
        return;

    ident[id].maintype = FIELD_ON_OFF;
    ident[id].subtype  = FIELD_ON_OFF;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    if(int1)
        ident[id].orgText[0] = '\005';
    else
        ident[id].orgText[0] = '\006';

    ident[id].orgText[1] = ' ';

    strncpy(&ident[id].orgText[2], text, 30);
    strncpy(ident[id].newText, ident[id].orgText, 32);
    ident[id].orgText[31] = 0;
    ident[id].newText[31] = 0;

    if(!tME_stop)
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);
    else
        change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditInfo);

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}


void write_field_fpoint(uint32_t editID, uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle, const tFont *Font, const char *text, float input)
{
    if(id >= 9)
        return;

    ident[id].maintype = FIELD_NUMBERS;
    ident[id].subtype  = FIELD_FLOAT;

    ident[id].coord[0] = XleftGimpStyle;
    ident[id].coord[1] = XrightGimpStyle;
    ident[id].coord[2] = YtopGimpStyle;
    ident[id].fontUsed = (tFont *)Font;
    ident[id].callerID = editID;

    strncpy(ident[id].orgText, text, 32);
    strncpy(ident[id].newText, text, 32);
    ident[id].orgText[31] = 0;
    ident[id].newText[31] = 0;

    change_CLUT_entry((CLUT_MenuEditField0 + id), CLUT_MenuEditFieldRegular);

    if(editID == 0)
        write_content_without_Id();
    else
    {
        write_content_of_actual_Id();
        if(!tME_stop)
            idLast = id;
        id++;
    }
}


void setBackMenu(uint32_t inputFunctionCall, uint8_t functionCallParameter, uint8_t gotoMenuEditField)
{
    backmenu.pEventFunction = inputFunctionCall;
    backmenu.functionParameter = functionCallParameter;
    backmenu.line = gotoMenuEditField;
}


void setEvent(uint32_t inputEventID, uint32_t inputFunctionCall)
{
    if(evidLast >= 9)
        return;

    /* set cursor to first field */
    if(evidLast < 0)
    {
        startMenuEditFieldSelect();
    }

    event[evid].callerID = inputEventID;
    event[evid].pEventFunction = inputFunctionCall;

    evidLast = evid;
    evid++;
}

void startEdit(void)
{
    EnterPressed = 1;
    helperGotoMenuEditField(0);
    enterMenuEditField();
}


void exitEditWithUpdate(void)
{
    createDiveSettings();
    EnterPressed = 1;
    exitMenuEdit(1);
}

/*
void set_cursor(uint8_t forThisIdentID)
{
    int16_t x0, x1, y0, y1;

    uint32_t xtra_left_right = 10;
    uint32_t xtra_top_bottom = 10;

    // y geht von 0 bis 799
    // x geht von 0 bis 479

    x0 = (int16_t)ident[forThisIdentID].coord[0];
    x1 = (int16_t)ident[forThisIdentID].coord[1];
    y0 = (int16_t)ident[forThisIdentID].coord[2];
    y1 = y0 + (int16_t)ident[forThisIdentID].fontUsed->height;

    if(((int16_t)ident[forThisIdentID].fontUsed->height) > 70)
    {
         xtra_left_right = 10;
         xtra_top_bottom = 10;
    }
    else
    {
         xtra_left_right = 10;
         xtra_top_bottom = 0;
    }

    x0 -= xtra_left_right;
    x1 += xtra_left_right;
    y0 -= xtra_top_bottom;
    y1 += xtra_top_bottom;

    GFX_SetWindowLayer0(tMEcursor.FBStartAdress, x0, x1, y0, y1);
}
*/

void set_cursorNew(uint8_t forThisIdentID)
{
    int16_t y0;
    uint8_t lineMinusOne;

   if(!settingsGetPointer()->FlipDisplay)
   {
	   y0 = (int16_t)ident[forThisIdentID].coord[2];
	   y0 -= ME_Y_LINE1;
	}
	else
	{
    	y0 = 390 + 25 - (int16_t)ident[forThisIdentID].coord[2];
	}

    y0 /= ME_Y_LINE_STEP;
    if((y0 >= 0) && (y0 <=6)) 
        lineMinusOne = y0;
    else
        lineMinusOne = 0;

    if(!settingsGetPointer()->FlipDisplay)
    {
    	GFX_SetFrameBottom((tMEcursorNew.FBStartAdress) + 65*2*(lineMinusOne), 0, 25, 800, 390);
    }
    else
    {
    	GFX_SetFrameBottom((tMEcursorNew.FBStartAdress)+ (390 - 65 *(6-lineMinusOne)) *2, 0, 480-390-25, 800, 390);
    }
}


void write_topline( char *text)
{
    GFX_DrawCfgWindow	hgfx;
    const tFont *Font = &FontT48;

    hgfx.Image = &tMEscreen;
    hgfx.WindowNumberOfTextLines = 1;
    hgfx.WindowLineSpacing = 0;
    hgfx.WindowTab = 0;
    hgfx.WindowX0 = 20;
    hgfx.WindowX1 = 779;
    if(!settingsGetPointer()->FlipDisplay)
    {
		hgfx.WindowY1 = 479;
		hgfx.WindowY0 = hgfx.WindowY1 - Font->height;
    }
	else
	{
		hgfx.WindowY0 = 0;
		hgfx.WindowY1 = hgfx.WindowY0 + Font->height;
	}
    GFX_write_label(Font, &hgfx, text, menuColor);
}


void write_buttonTextline( uint8_t left2ByteCode, char middle2ByteCode, char right2ByteCode)
{

	SSettings* pSettings;
	pSettings = settingsGetPointer();

	if(!pSettings->FlipDisplay)
	{
		GFX_clean_area(&tMEscreen, 0, 800, 479-24,480);
	}
	else
	{
		GFX_clean_area(&tMEscreen, 0, 800, 0, 24);
	}

    char localtext[32];

    if(left2ByteCode)
    {
        localtext[0] = TXT_2BYTE;
        localtext[1] = left2ByteCode;
        localtext[2] = 0;

        write_content_simple(&tMEscreen, 0, 800, 479-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen);
    }

    if(middle2ByteCode)
    {
        localtext[0] = '\001';
        localtext[1] = TXT_2BYTE;
        localtext[2] = middle2ByteCode;
        localtext[3] = 0;

       	write_content_simple(&tMEscreen, 0, 800, 479-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen);
    }

    if(right2ByteCode)
    {
        localtext[0] = '\002';
        localtext[1] = TXT_2BYTE;
        localtext[2] = right2ByteCode;
        localtext[3] = 0;

        write_content_simple(&tMEscreen, 0, 800, 479-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen);
    }
}



void write_label_var(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font, const char *text)
{
    GFX_DrawCfgWindow	hgfx;

    if(XrightGimpStyle > 799)
        XrightGimpStyle = 799;
    if(XleftGimpStyle >= XrightGimpStyle)
        XleftGimpStyle = 0;
    if(YtopGimpStyle > 479)
        YtopGimpStyle = 479;
    hgfx.Image = &tMEscreen;
    hgfx.WindowNumberOfTextLines = 1;
    hgfx.WindowLineSpacing = 0;
    hgfx.WindowTab = 0;
    if(!settingsGetPointer()->FlipDisplay)
    {
		hgfx.WindowX0 = XleftGimpStyle;
		hgfx.WindowX1 = XrightGimpStyle;
		hgfx.WindowY1 = 479 - YtopGimpStyle;
		if(hgfx.WindowY1 < Font->height)
			hgfx.WindowY0 = 0;
		else
			hgfx.WindowY0 = hgfx.WindowY1 - Font->height;
    }
    else
    {
		hgfx.WindowX0 = 800 - XrightGimpStyle;
		hgfx.WindowX1 = 800 - XleftGimpStyle;
		hgfx.WindowY0 = YtopGimpStyle;
		if(hgfx.WindowY0 < Font->height)
			hgfx.WindowY1 = 0;
		else
			hgfx.WindowY1 = hgfx.WindowY0 + Font->height;
    }
    GFX_write_label(Font, &hgfx, text, 0);/*menuColor);*/
}


void write_content(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font, const char *text, uint8_t color)
{
    GFX_DrawCfgWindow	hgfx;

    if(XrightGimpStyle > 799)
        XrightGimpStyle = 799;
    if(XleftGimpStyle >= XrightGimpStyle)
        XleftGimpStyle = 0;
    if(YtopGimpStyle > 479)
        YtopGimpStyle = 479;
    hgfx.Image = &tMEscreen;
    hgfx.WindowNumberOfTextLines = 1;
    hgfx.WindowLineSpacing = 0;
    hgfx.WindowTab = 0;

    if(!settingsGetPointer()->FlipDisplay)
    {
		hgfx.WindowX0 = XleftGimpStyle;
		hgfx.WindowX1 = XrightGimpStyle;
		hgfx.WindowY1 = 479 - YtopGimpStyle;
		if(hgfx.WindowY1 < Font->height)
			hgfx.WindowY0 = 0;
		else
			hgfx.WindowY0 = hgfx.WindowY1 - Font->height;
    }
    else
    {
		hgfx.WindowX0 = 800 - XrightGimpStyle;
		hgfx.WindowX1 = 800 - XleftGimpStyle;
		hgfx.WindowY0 = YtopGimpStyle;
		if(hgfx.WindowY0 < Font->height)
			hgfx.WindowY1 = 0;
		else
			hgfx.WindowY1 = hgfx.WindowY0 + Font->height;
    }
    GFX_write_label(Font, &hgfx, text, color);
}


void write_label_fix(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font, const char textId)
{
    char text[2];

    text[0] = textId;
    text[1] = 0;

    write_label_var(XleftGimpStyle, XrightGimpStyle, YtopGimpStyle, Font, text);
}


void clean_content(uint16_t XleftGimpStyle, uint16_t XrightGimpStyle, uint16_t YtopGimpStyle,  const tFont *Font)
{
    GFX_DrawCfgWindow	hgfx;

    if(XrightGimpStyle > 799)
        XrightGimpStyle = 799;
    if(XleftGimpStyle >= XrightGimpStyle)
        XleftGimpStyle = 0;
    if(YtopGimpStyle > 479)
        YtopGimpStyle = 479;
    hgfx.Image = &tMEscreen;
    if(!settingsGetPointer()->FlipDisplay)
    {
    hgfx.WindowX0 = XleftGimpStyle;
    hgfx.WindowX1 = XrightGimpStyle;
    hgfx.WindowY1 = 479 - YtopGimpStyle;
    if(hgfx.WindowY1 < Font->height)
        hgfx.WindowY0 = 0;
    else
        hgfx.WindowY0 = hgfx.WindowY1 - Font->height;
    }
    else
    {
		hgfx.WindowX0 = 800 - XrightGimpStyle;
		hgfx.WindowX1 = 800 - XleftGimpStyle;
		hgfx.WindowY0 = YtopGimpStyle;
		if(hgfx.WindowY0 < Font->height)
			hgfx.WindowY1 = 0;
		else
			hgfx.WindowY1 = hgfx.WindowY0 + Font->height;
    }
    GFX_clear_window_immediately(&hgfx);
}


/* Private functions ---------------------------------------------------------*/

void draw_tMEdesign(void)
{
    GFX_draw_header(&tMEscreen,menuColor);
}

void draw_tMEdesignSubUnselected(uint32_t *ppDestination)
{
    union al88_u
    {
        uint8_t al8[2];
        uint16_t al88;
    };

    union al88_u color_seperator;
    union al88_u color_unselected;
    int i;

    color_seperator.al8[0] = CLUT_MenuLineUnselectedSeperator;
    color_unselected.al8[0] = CLUT_MenuLineUnselected;

    color_seperator.al8[1] = 0xFF;
    color_unselected.al8[1] = 0xFF;

    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;

    for(i = 61; i > 0; i--)
    {
        *(__IO uint16_t*)*ppDestination = color_unselected.al88;
        *ppDestination += 2;
    }

    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
}


void draw_tMEdesignSubSelected(uint32_t *ppDestination)
{
    union al88_u
    {
        uint8_t al8[2];
        uint16_t al88;
    };

    union al88_u color_selected;
    union al88_u color_seperator;
    int i;

    color_selected.al8[0] = CLUT_MenuEditLineSelected;
    color_selected.al8[1] = 0xFF;

    color_seperator.al8[0] = CLUT_MenuLineSelectedSeperator;
    color_seperator.al8[1] = 0xFF;

    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;

    for(i = 61; i > 0; i--)
    {
        *(__IO uint16_t*)*ppDestination = color_selected.al88;
        *ppDestination += 2;
    }

    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
    *(__IO uint16_t*)*ppDestination = color_seperator.al88;
        *ppDestination += 2;
}


void draw_tMEdesignSubSelectedBorder(uint32_t *ppDestination)
{
    union al88_u
    {
        uint8_t al8[2];
        uint16_t al88;
    };

    union al88_u color_selected_sides;

    int i;

    color_selected_sides.al8[0] = CLUT_MenuLineSelectedSides;
    color_selected_sides.al8[1] = 0xFF;

    for(i = 65; i > 0; i--)
    {
    *(__IO uint16_t*)*ppDestination = color_selected_sides.al88;
        *ppDestination += 2;
    }
}


void draw_tMEcursorNewDesign(void)
{
    int i,j;
    uint32_t pDestination;

    pDestination = tMEcursorNew.FBStartAdress;

    for(j = 801; j > 0; j--)
    {
        for(i = 5; i > 0; i--)
        {
            draw_tMEdesignSubUnselected(&pDestination);
        }
        if((j > 787) || (j < 17))
            draw_tMEdesignSubSelectedBorder(&pDestination);
        else
            draw_tMEdesignSubSelected(&pDestination);
    }
}

GFX_DrawCfgScreen* getMenuEditScreen()
{
	return &tMEscreen;
}