Mercurial > public > ostc4
view Discovery/Src/tMenuEdit.c @ 471:73da921869d9 fix-bat-2
bugfix: implement battery charge percentage in dive header
This commit is (much) less trivial than the related 919e5cb51c92.
First, rename the CCRmode attribute (corresponding to byte Ox59) of
the SLogbookHeaderOSTC3. This byte (according to the hwOS interface
document) does not contain any CCR related value, but it contains
"battery information". Already since 2017, this byte is used from
libdivecomputer to interface the charge percentage. So, its
renamed from CCRmode to batteryCharge, to reflect its true purpose.
Now, simply add a batteryCharge attribute to the SLogbookHeader
(and see below why that is possible, without breaking things).
The remaining changes are trivial to implement battery charge
percentage in dive header.
Caveat: do not get confused by the exact role of the individual
logbook header types. SLogbookHeaderOSTC3 is the formal type of
the logbook format that the OSTC4 produces. This format is
supposed to identical to the format, as is used in hwOS for the
series of small OSTCs. Only some values of attributes are different.
For example, the OSTC4 supports VPM, so byte 0x79 (deco model used
for this dive) also has a value for VPM. But the SLogbookHeader
type, despite its name and structure, is *not* a true logbook
header, as it includes attributes that are not available in the
SLogbookHeaderOSTC3 formal header type.
Signed-off-by: Jan Mulder <jan@jlmulder.nl>
author | Jan Mulder <jlmulder@xs4all.nl> |
---|---|
date | Wed, 22 Apr 2020 13:08:57 +0200 |
parents | b1091e183d52 |
children | 21bf40bb8151 |
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 "tMenuEdit.h" #include "externLogbookFlash.h" #include "gfx_fonts.h" #include "tHome.h" #include "tInfoCompass.h" #include "tMenuEditHardware.h" #include "tMenuEditPlanner.h" #include "tMenuEditSystem.h" #include "tMenuEditXtra.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]; uint16_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_FLOAT, FIELD_END } SField; /* Private variables ---------------------------------------------------------*/ GFX_DrawCfgScreen tMEscreen; GFX_DrawCfgScreen tMEcursor; GFX_DrawCfgScreen tMEcursorNew; uint32_t menuID; uint8_t menuColor; int8_t id = 0; int8_t idLast = -1; SEditIdent ident[10]; int8_t tME_stop = 0; int8_t evid = 0; int8_t evidLast = -1; SEventHandler event[10]; SBackMenuHandler backmenu; int8_t block = 0; int8_t subBlockPosition = 0; _Bool EnterPressedBeforeButtonAction = 0; _Bool EnterPressed = 0; _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); void exitMenuEdit(uint8_t writeSettingsIfEnterPressed); 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) { if(get_globalState() == (StMHARD3_O2_Sensor1 & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); // draw_tMEdesign(); refresh_O2Sensors(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMHARD2_Compass_SetCourse & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_CompassEdit(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMXTRA_CompassHeading & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); // draw_tMEdesign(); refresh_CompassHeading(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMSYS5_Info & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_InformationPage(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMPLAN5_ExitResult & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_PlanResult(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMHARD5_Button1 & MaskFieldDigit)) // will not be executed in EditFieldMode as global state is different { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_ButtonValuesFromPIC(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMSYS3_Units & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_Design(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } else if(get_globalState() == (StMSYS4_CViewTimeout & MaskFieldDigit)) { uint32_t rememberPage = tMEscreen.FBStartAdress; tMEscreen.FBStartAdress = getFrame(9); refresh_Customviews(); GFX_SetFrameTop(tMEscreen.FBStartAdress); releaseFrame(9,rememberPage); } } void tMenuEdit_writeSettingsToFlash(void) { if(WriteSettings) { 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_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) 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); } 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; } switch(ident[id].maintype) { case FIELD_NUMBERS: write_buttonTextline(TXT2BYTE_ButtonMinus,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonPlus); if(ident[id].subtype == 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(); } else if(ident[id].subtype == 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(); } } else // 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_BUTTON: set_globalState(menuID); break; 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; } } 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; } } 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((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) && (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; } 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) && (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) && (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; 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; for(digitCount = 0; digitCount < ident[id].size[i]; digitCount++) { digit = ident[id].newText[ident[id].begin[i] + digitCount]; 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; } 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, 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; } 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; } uint8_t i, digitCount; uint32_t remainder, digit, divider; i = 0; while( ident[id].size[i] && (i < 4)) { 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++) { digit = remainder / divider; remainder -= digit * divider; divider /= 10; if(digit < 10) ident[id].newText[ident[id].begin[i] + digitCount] = digit + '0'; else ident[id].newText[ident[id].begin[i] + digitCount] = 'x'; } 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) { } */ 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++; } } /* 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); } }