view Discovery/Src/tMenuEdit.c @ 843:2cab242c9a4a Evo_2_23

Update version number and set beta state
author Ideenmodellierer
date Sat, 20 Jan 2024 19:38:52 +0100
parents 4abfb8a2a435
children 17d9d6eddd8d
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 "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 (StMXTRA_PSCR_O2_Drop & MaskFieldDigit):
            if (settingsGetPointer()->dive_mode != DIVEMODE_PSCR) { /* workaround because PSCR mode is set dynamic */
                refreshFct = refresh_CO2Data;
            }

			break;
	 	 case (StMXTRA_CO2_Sensor & MaskFieldDigit):  refreshFct = refresh_CO2Data;
	 	 	 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;
}