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);
+}
+
+