Mercurial > public > ostc4
diff Discovery/Src/tInfoLog.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | cc8e24374b83 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tInfoLog.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,407 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tInfoLog.c +/// \brief Main Template file for Menu Page Deco +/// \author heinrichs weikamp gmbh +/// \date 31-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 "tInfoLog.h" + +#include "gfx_fonts.h" +#include "logbook.h" +#include "show_logbook.h" +#include "tHome.h" +#include "tInfo.h" +#include "tMenu.h" +#include "unit.h" + +/* Exported variables --------------------------------------------------------*/ + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + uint8_t page; + uint8_t line; + uint8_t linesAvailableForPage; + uint8_t modeFlipPages; + uint8_t maxpages; +} SInfoLogMemory; + +/* Private variables ---------------------------------------------------------*/ +GFX_DrawCfgScreen INFOLOGscreen; +GFX_DrawCfgScreen *pMenuCursor, *pMenuCursorDesignSolo; +GFX_DrawCfgWindow INFOLOGwindow; + +SInfoLogMemory infolog; + +/* Private function prototypes -----------------------------------------------*/ +void nextLineInfoLog(void); +void tInfoLog_BuildAndShowNextPage(void); +void tInfoLog_nextLine(void); +void showLog(void); +void showNextLogPage(void); +void stepBackInfo(void); +void stepForwardInfo(void); +void showLogExit(void); + +/* Exported functions --------------------------------------------------------*/ +void tInfoLog_init(void) +{ + INFOLOGscreen.FBStartAdress = 0; + INFOLOGscreen.ImageHeight = 480; + INFOLOGscreen.ImageWidth = 800; + INFOLOGscreen.LayerIndex = 1; + + INFOLOGwindow.Image = &INFOLOGscreen; + INFOLOGwindow.WindowNumberOfTextLines = 6; + INFOLOGwindow.WindowLineSpacing = 65; + INFOLOGwindow.WindowTab = 400; + INFOLOGwindow.WindowX0 = 20; + INFOLOGwindow.WindowX1 = 779; + INFOLOGwindow.WindowY0 = 4 + 25; + INFOLOGwindow.WindowY1 = 390 + 25; +} + + +void openInfoLogLastDive(void) +{ + infolog.page = 0; + SLogbookHeader logbookHeader; + if(logbook_getHeader(0,&logbookHeader)) + { + set_globalState(StILOGSHOW); // all the rest with zeros + infolog.page = 1; + infolog.line = 1; + show_logbook_test(1, 0); + } + else + openLog(0); +} + + +void openLog(_Bool recallKeepPage) +{ + if(recallKeepPage && infolog.page) + infolog.page--; + else + infolog.page = 0; + + infolog.modeFlipPages = 1; + set_globalState_Log_Page(infolog.page); + infolog.maxpages = (logbook_getNumberOfHeaders() + 5) / 6; + tInfoLog_BuildAndShowNextPage(); + + pMenuCursor = get_PointerMenuCursorScreen(); + pMenuCursorDesignSolo = get_PointerMenuCursorDesignSoloScreen(); + + change_CLUT_entry(CLUT_MenuLineSelectedSides, CLUT_InfoPageLogbook); + change_CLUT_entry(CLUT_MenuLineSelectedSeperator, CLUT_InfoPageLogbook); + + //GFX_ResetLayer(TOP_LAYER); + //GFX_ResetLayer(BACKGRD_LAYER); + + if(infolog.page == 255) + GFX_SetFrameBottom((INFOLOGscreen.FBStartAdress), 0, 0, 800, 480); + else + { +// very old: GFX_SetFrameBottom((pMenuCursor->FBStartAdress), 0, 0, 800, 390); +// no, set cursor to firt line instead with tInfoLog_nextLine() GFX_SetFrameBottom((pMenuCursorDesignSolo->FBStartAdress), 0, 25, 800, 390); + tInfoLog_nextLine(); + } +} + + +void sendActionToInfoLogList(uint8_t sendAction) +{ + switch(sendAction) + { + case ACTION_BUTTON_ENTER: + stepForwardInfo(); + break; + case ACTION_BUTTON_NEXT: + + if(infolog.modeFlipPages) + { + tInfoLog_BuildAndShowNextPage(); +// GFX_SetFrameBottom((pMenuCursor->FBStartAdress), 0, 25, 800, 390); + } + else + tInfoLog_nextLine(); + break; + case ACTION_TIMEOUT: + case ACTION_MODE_CHANGE: + case ACTION_BUTTON_BACK: + stepBackInfo(); + default: + break; + case ACTION_IDLE_TICK: + case ACTION_IDLE_SECOND: + break; + } +} + + +void sendActionToInfoLogShow(uint8_t sendAction) +{ + switch(sendAction) + { + case ACTION_BUTTON_ENTER: + break; + case ACTION_BUTTON_NEXT: + showNextLogPage(); + break; + case ACTION_TIMEOUT: + case ACTION_MODE_CHANGE: + case ACTION_BUTTON_BACK: + if(get_globalState() == StILOGSHOW) // no page nor line + { + openLog(1); + } + else + { + showLogExit(); + } + show_logbook_exit(); + default: + break; + case ACTION_IDLE_TICK: + case ACTION_IDLE_SECOND: + break; + } +} + + +/* Private functions ---------------------------------------------------------*/ + +void exitLog(void) +{ + //set_globalState_tHome(); + exitInfo(); + releaseFrame(15,INFOLOGscreen.FBStartAdress); +} + + +void stepBackInfo(void) +{ + if(infolog.modeFlipPages == 0) + { + infolog.line = 0; + infolog.modeFlipPages = 1; + GFX_SetFrameBottom(pMenuCursorDesignSolo->FBStartAdress, 0, 25, 800, 390); + } + else + exitLog(); +} + + +void stepForwardInfo(void) +{ + if(infolog.modeFlipPages == 1) + { + tInfoLog_nextLine(); + } + else + showLog(); +} + + +void tInfoLog_BuildAndShowNextPage(void) +{ + char text[MAX_PAGE_TEXTSIZE]; + uint16_t textPointer = 0; + SLogbookHeader logbookHeader; +// uint16_t divetime = logbookHeader.diveTimeMinutes; +// uint16_t maxDepth = logbookHeader.maxDepth/100; + int i = 0; + uint8_t date[2], month,day; + + if(INFOLOGscreen.FBStartAdress) + releaseFrame(15,INFOLOGscreen.FBStartAdress); + INFOLOGscreen.FBStartAdress = getFrame(15); + + infolog.page += 1; + infolog.linesAvailableForPage = 0; + + if((infolog.page < 1) || (infolog.page > 43)) /* max with 256 entries */ + infolog.page = 1; + + + text[0] = '\001'; + text[1] = TXT_Logbook; + text[2] = 0; + gfx_write_topline_simple(&INFOLOGscreen, text, CLUT_InfoPageLogbook); + + *text = 0; + if(!logbook_getHeader((infolog.page - 1) * 6,&logbookHeader)) + { + infolog.page = 1; + if(!logbook_getHeader((infolog.page - 1) * 6,&logbookHeader)) + { + infolog.page = 255; + infolog.linesAvailableForPage = 0; + text[0] = TXT_LogbookEmpty; + text[1] = 0; + } + } + + if((*text == 0) && (infolog.maxpages > 1)) + { + snprintf(text,8, "\002" "%u/%u", infolog.page, infolog.maxpages); + gfx_write_topline_simple(&INFOLOGscreen, text, CLUT_InfoPageLogbook); + *text = 0; + } + + if(*text == 0) + { + infolog.line = 0; + textPointer = 0; + if(settingsGetPointer()->date_format == DDMMYY) + { + day = 0; + month = 1; + } + else + { + day = 1; + month = 0; + } + for(i = 0; i < 6; i++) + { + if(i) + { + if(!logbook_getHeader(((infolog.page - 1) * 6) + i, &logbookHeader)) + break; + } + infolog.linesAvailableForPage += 1; + uint16_t divetime = logbookHeader.diveTimeMinutes; + uint16_t maxDepthMeter = logbookHeader.maxDepth/100; + uint16_t maxDepthSubmeter = (logbookHeader.maxDepth - maxDepthMeter * 100)/10; + uint16_t number = ((infolog.page - 1) * 6) + i + 1; + if(settingsGetPointer()->logbookOffset) + { + if(number <= settingsGetPointer()->logbookOffset) + number = settingsGetPointer()->logbookOffset + 1 - number; + } + date[day] = logbookHeader.dateDay; + date[month] = logbookHeader.dateMonth; + + text[textPointer++] = '\034';// monospaced space large size mode + textPointer += snprintf(&text[textPointer], 20,"\021%04u \020", number); +/* if(number < 1000) + textPointer += snprintf(&text[textPointer], 20,"\021%2u \020", number); + else + textPointer += snprintf(&text[textPointer], 20,"\021\016\016%3u \017\020", number); +*/ + textPointer += snprintf(&text[textPointer], 20,"%02d.%02d ",date[0],date[1]); + textPointer += snprintf(&text[textPointer], 20,"%02d:%02d ",logbookHeader.timeHour,logbookHeader.timeMinute); + switch(logbookHeader.decoModel) + { + case 1: + textPointer += snprintf(&text[textPointer],20,"\016\016 GF \017"); + break; + case 2: + textPointer += snprintf(&text[textPointer],20,"\016\016 VPM \017"); + break; + default: + textPointer += snprintf(&text[textPointer],20,"\016\016 * \017"); + break; + } + + if(settingsGetPointer()->nonMetricalSystem) + { + float maxDepthFeet = 0; + maxDepthFeet = unit_depth_float(((float)logbookHeader.maxDepth)/100); + textPointer += snprintf(&text[textPointer], 20,"%3.0f\016\016ft\017 ", maxDepthFeet); + } + else + { + textPointer += snprintf(&text[textPointer], 20,"%3d.%d\016\016m\017 ", maxDepthMeter,maxDepthSubmeter); + } + textPointer += snprintf(&text[textPointer], 20,"%3d'\n\r", divetime); + } + } + GFX_write_string(&FontT48, &INFOLOGwindow, text,1); + + if(infolog.linesAvailableForPage > 1) + tInfo_write_buttonTextline(&INFOLOGscreen, TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); + else if(infolog.page == 255) + tInfo_write_buttonTextline(&INFOLOGscreen, TXT2BYTE_ButtonBack,0,0); + else + tInfo_write_buttonTextline(&INFOLOGscreen, TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,0); + + GFX_SetFrameTop(INFOLOGscreen.FBStartAdress); + set_globalState_Log_Page(infolog.page); +} + + +void tInfoLog_nextLine(void) +{ + if(infolog.linesAvailableForPage == 0) + return; + + infolog.line += 1; + if(infolog.line > infolog.linesAvailableForPage) + infolog.line = 1; + + infolog.modeFlipPages = 0; + + GFX_SetFrameBottom((pMenuCursor->FBStartAdress) + 65*2*(infolog.line - 1), 0, 25, 800, 390); +} + + +void showLogExit(void) +{ + GFX_SetFrameTop(INFOLOGscreen.FBStartAdress); + GFX_SetFrameBottom((pMenuCursor->FBStartAdress) + 65*2*(infolog.line - 1), 0, 25, 800, 390); + set_globalState_Log_Page(infolog.page); +} + + +void showLog(void) +{ + uint8_t stepBack; + + if(infolog.page == 255) + return; + + stepBack = (6 * (infolog.page - 1)) + infolog.line - 1; + //build_logbook_test(); + show_logbook_test(1, stepBack); +} + + +void showNextLogPage(void) +{ + uint8_t stepBack; + + if(infolog.page == 255) + return; + + stepBack = (6 * (infolog.page - 1)) + infolog.line - 1; + //build_logbook_test(); + show_logbook_test(0, stepBack); +} + +