diff Discovery/Src/show_logbook.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children 4276d56eb37c cc8e24374b83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Discovery/Src/show_logbook.c	Sat Apr 28 11:52:34 2018 +0200
@@ -0,0 +1,1222 @@
+///////////////////////////////////////////////////////////////////////////////
+/// -*- coding: UTF-8 -*-
+///
+/// \file   Discovery/Src/show_logbook.c
+/// \brief  show_logbook_logbook_show_log_page1 /
+/// \author Heinrichs Weikamp gmbh
+/// \date   07-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/>.
+//////////////////////////////////////////////////////////////////////////////
+
+#include "base.h"
+#include "logbook.h"
+#include "gfx_colors.h"
+#include "gfx_engine.h"
+#include "gfx_fonts.h"
+#include "show_logbook.h"
+#include "unit.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h> // for abs()
+
+/* Private variables ---------------------------------------------------------*/
+
+GFX_DrawCfgScreen	tLOGscreen;
+GFX_DrawCfgScreen	tLOGbackground;
+
+
+void print_gas_name(char* output,uint8_t lengh,uint8_t oxygen,uint8_t helium);
+int16_t get_colour(int16_t color);
+
+/* Overview */
+void show_logbook_logbook_show_log_page1(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
+/* Temperature */
+void show_logbook_logbook_show_log_page2(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
+/* Gas List */
+void show_logbook_logbook_show_log_page3(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
+/* ppO2 */
+void show_logbook_logbook_show_log_page4(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
+
+
+inline uint32_t MinU32LOG(uint32_t a, uint32_t b)
+{
+    return ((a<b)?a:b);
+}
+
+uint32_t MaxU32LOG(uint32_t a, uint32_t b)
+{
+    return((a>b)?a:b);
+}
+
+void write_label_(GFX_DrawCfgScreen *screenInput, SWindowGimpStyle win, const tFont *Font, uint8_t color, const char *text)
+{
+    GFX_DrawCfgWindow	hgfx;
+
+    if( win.right > 799)
+         win.right = 799;
+
+    if(win.top > 479)
+        win.top = 479;
+    hgfx.Image = screenInput;
+    hgfx.WindowNumberOfTextLines = 1;
+    hgfx.WindowLineSpacing = 0;
+    hgfx.WindowTab = 0;
+    hgfx.WindowX0 = win.left;
+    hgfx.WindowX1 = win.right;
+    hgfx.WindowY1 = 479 - win.top;
+    if(hgfx.WindowY1 < Font->height)
+        hgfx.WindowY0 = 0;
+    else
+        hgfx.WindowY0 = hgfx.WindowY1 - Font->height;
+
+    GFX_write_label(Font, &hgfx, text, color);
+}
+
+
+/**
+  ******************************************************************************
+  * @brief   GFX write label. /  print coordinate system & depth graph
+  * @author  Peter Ryser
+  * @version V0.0.1
+  * @date    07-July-2014
+  ******************************************************************************
+    *
+  * @param  hgfx:
+  * @param  window: 			WindowGimpStyle
+  * @param  mode: 			different modes depending witch page uses the function
+  * @param  dataLength:
+  * @param  depthdata:
+  * @param  colordata: 			1
+  * @retval None
+  */
+void show_logbook_draw_depth_graph(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards, SWindowGimpStyle* window, short mode, uint16_t dataLength, uint16_t* depthdata, uint8_t * colordata, uint16_t * decostopdata)
+{
+    SLogbookHeader logbookHeader;
+    SWindowGimpStyle wintemp = *window;
+    SWindowGimpStyle winsmal;
+    logbook_getHeader(StepBackwards, &logbookHeader);
+    int divetime = logbookHeader.diveTimeMinutes;
+    int maxDepth =  logbookHeader.maxDepth/100;
+
+    int16_t saveBottom = wintemp.bottom;
+    int16_t saveTop = 0 - wintemp.top;
+
+    //*** Horisontal (depth) ***************************************************
+
+    //--- calc depth lines and labels --
+    int vscale = 0;
+    int vstep = 0;
+
+    vstep = maxDepth / 5;
+    vscale = vstep * 5;
+    if(vscale < maxDepth)
+    {
+        vstep += 1;
+        vscale += 5;
+    }
+/*
+    if(vscale <
+    for(int i=1; i <= 20; i++)
+    {
+        vscale = i * 25;
+        vstep = i * 5;
+        if( vscale > maxDepth)
+            break;
+    }
+*/
+    //--- print depth labels ---
+    winsmal.left = wintemp.left - 48;
+    winsmal.top	= wintemp.top  - 3;
+    winsmal.right = wintemp.left -1;
+    winsmal.bottom = winsmal.top + 16;
+
+    write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor1,"[m]");
+    winsmal.left = wintemp.left - 48;
+    char msg[3];
+    float deltaline = ((float)(wintemp.bottom - wintemp.top))/5;
+    for(int i = 1; i<=5; i++)
+    {
+
+        winsmal.top	= wintemp.top + deltaline * i - 14;
+        winsmal.bottom = winsmal.top + 16;
+        winsmal.right = wintemp.left - 2;
+        snprintf(msg,5,"%i",i * vstep);
+        write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor1,msg);
+    }
+
+    //vertical (Time) *******************************************************************
+    //--- calc time lines and labels --
+    int timestep = 0;
+    int lines = 0;
+    for(int i=1; i <= 60; i++)
+    {
+        timestep = i * 5;
+        lines = divetime/timestep;
+        if(lines < 7)
+        {
+            break;
+        }
+    }
+    //*** print coordinate system grit ***
+    int winwidth = wintemp.right - wintemp.left;
+    float vdeltaline = ((float)(winwidth * timestep))/divetime;
+    GFX_draw_Grid( &tLOGbackground,wintemp,  0, vdeltaline,  5,0,  CLUT_LogbookGrid);
+
+
+    //--- print time labels ---
+    winsmal.left = wintemp.left;
+    winsmal.top	=  wintemp.top - 40;
+    winsmal.right = winsmal.left + 60;
+    winsmal.bottom = winsmal.top + 16;
+
+
+    for(int i = 1; i<=lines; i++)
+    {
+        winsmal.left= wintemp.left + vdeltaline * i - 15;
+        winsmal.right = winsmal.left + 30;
+        snprintf(msg,5,"%3i",i * timestep);
+        write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor1,msg);
+    }
+    winsmal.left = wintemp.left;// - 9;
+    winsmal.top	=  wintemp.top - 40;
+    winsmal.right = winsmal.left + 60;
+    write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor1,"min");;
+
+    //--- print depth graph ---
+    //adapt window
+    int winhight = wintemp.bottom - wintemp.top;
+    int newhight = (winhight * maxDepth)/vscale;
+    wintemp.bottom = wintemp.top + newhight;
+    //wintemp.fontcolor = LOGBOOK_GRAPH_DEPTH;
+
+    int datamax = 0;
+    for(int i=0;i<dataLength;i++)
+    {
+        if(depthdata[i]>datamax)
+            datamax = depthdata[i];
+    }
+
+    if(decostopdata)
+    {
+        if(dataLength <= 1000)
+        {
+            uint8_t colortemp[1000];
+
+            for(int i = 0; i<dataLength; i++)
+            {
+                if(decostopdata[i] > depthdata[i])
+                {
+                    colortemp[i] = CLUT_WarningRed;
+                }
+                else
+                {
+                    colortemp[i] = CLUT_NiceGreen;
+                }
+            }
+            GFX_graph_print(hgfx,&wintemp,saveTop,1,0,datamax, decostopdata,dataLength, NULL, colortemp);
+        }
+        else
+            GFX_graph_print(hgfx,&wintemp,saveTop,1,0,datamax, decostopdata,dataLength, CLUT_NiceGreen, NULL);
+    }
+
+    switch(mode)
+    {
+    case 0:
+        GFX_graph_print(hgfx,&wintemp,0,1,0,datamax, depthdata,dataLength,CLUT_GasSensor1, NULL);
+        break;
+    case 1:
+        GFX_graph_print(hgfx,&wintemp,saveBottom,1,0,datamax, depthdata,dataLength,CLUT_GasSensor0,colordata);
+        break;
+    case 2:
+        if(*colordata)
+            GFX_graph_print(hgfx,&wintemp,0,1,0,datamax, depthdata,dataLength,CLUT_GasSensor0,colordata);
+        else
+            GFX_graph_print(hgfx,&wintemp,0,1,0,datamax, depthdata,dataLength,CLUT_GasSensor1, NULL);
+    }
+
+}
+
+
+
+/**
+  ******************************************************************************
+  * @brief  scaleAdapt
+  * @author  heinrichs weikamp gmbh
+  * @version V0.0.1
+  * @date    29-Nov-2016
+  ******************************************************************************
+    *
+  * @param  ...
+  * @retval *OutputStepOfScale, *OutputMaxValueOnScale, *OutputTop, *OutputBottom
+
+    * fit to multiples of 1�C (data format is 1/10�C)
+    */
+
+void scaleAdapt(	int InputTop, int InputBottom,
+                                    int16_t *OutputMinValue, int16_t *OutputMaxValue, int *OutputTop, int *OutputBottom,
+                                    uint16_t *OutputStepOfScale, int16_t *OutputMaxValueOnScale)
+{
+//	uint16_t oldScale;
+    uint16_t newScale;
+//	uint16_t diff_newScale;
+
+//	int16_t oldMaxOnScale;
+    int16_t newMaxOnScale;
+//	int16_t diff_newMaxOnScale;
+    _Bool negativeMaxValue = 0;
+
+//	float oldRange;
+    float newRange;
+
+    float	sizeOfScreen;
+//	float InputTopValue;
+//	float InputBottomValue;
+    float screenToRangeRatio;
+    float diffOutMaxToMaxOnScale;
+    float diffOutMinToMaxOnScale;
+    int positonOutputMaxValue;
+    int positonOutputMinValue;
+
+
+// scale
+//	oldScale = *OutputStepOfScale;
+    newScale = *OutputStepOfScale + 9;
+    newScale /= 10;
+    newScale *= 10;
+//	diff_newScale = newScale - *OutputStepOfScale;
+//	oldRange = 5 * oldScale;
+    newRange = 5 * newScale;
+    *OutputStepOfScale = newScale;
+
+    // MaxValueOnScale
+//	oldMaxOnScale = *OutputMaxValueOnScale;
+    if(OutputMaxValueOnScale < 0)
+    {
+        negativeMaxValue = 1;
+        newMaxOnScale = 0 - *OutputMaxValueOnScale;
+    }
+    else
+    {
+        negativeMaxValue = 0;
+        newMaxOnScale = *OutputMaxValueOnScale;
+    }
+    newMaxOnScale += 9;
+    newMaxOnScale /= 10;
+    newMaxOnScale *= 10;
+    if(negativeMaxValue)
+    {
+//		diff_newMaxOnScale = newMaxOnScale + *OutputMaxValueOnScale;
+        *OutputMaxValueOnScale = 0 - newMaxOnScale;
+    }
+    else
+    {
+//		diff_newMaxOnScale = newMaxOnScale - *OutputMaxValueOnScale;
+        *OutputMaxValueOnScale = newMaxOnScale;
+    }
+
+
+    // new coordinates
+    sizeOfScreen = 1 + InputBottom - InputTop;
+//	InputTopValue = *OutputMaxValueOnScale;
+//	InputBottomValue = InputTopValue + (6 * *OutputStepOfScale);
+
+    screenToRangeRatio = sizeOfScreen / newRange;
+    diffOutMaxToMaxOnScale = abs(*OutputMaxValueOnScale) - abs(*OutputMaxValue);
+//	diffOutMinToMax = abs(*OutputMinValue - *OutputMaxValue);
+    diffOutMinToMaxOnScale = abs(*OutputMaxValueOnScale - *OutputMinValue);
+
+    positonOutputMaxValue = (int)(diffOutMaxToMaxOnScale * screenToRangeRatio);
+    positonOutputMaxValue += *OutputTop;
+    positonOutputMinValue = (int)(diffOutMinToMaxOnScale * screenToRangeRatio);
+    positonOutputMinValue += *OutputTop;
+//	positonOutputMinValue = (int)(diffOutMinToMax * screenToRangeRatio);
+//	positonOutputMinValue += positonOutputMaxValue;
+    *OutputTop = positonOutputMaxValue;
+    *OutputBottom = positonOutputMinValue;
+}
+
+
+/**
+  ******************************************************************************
+  * @brief  scaleHelper
+  * @author  heinrichs weikamp gmbh
+  * @version V0.0.1
+  * @date    13-Oct-2016
+  ******************************************************************************
+    *
+  * @param  hgfx:
+  * @retval None
+
+    * pixel  50 oben
+    * pixel 439 unten
+    * pixel 390 gesamt h�he
+
+    * for temperature, input is �C * 10
+    */
+
+void scaleHelper(	uint16_t InputDataLength, int16_t *InputDataArray, int InputTop, int InputBottom,
+                                    int16_t *OutputMinValue, int16_t *OutputMaxValue, int *OutputTop, int *OutputBottom,
+                                    uint16_t *OutputStepOfScale, int16_t *OutputMaxValueOnScale)
+{
+    int32_t 	datamin = INT16_MAX; // 32 bit for delta calculation ( delta is unsigned -> value can be 2x INT16_MAX)
+    int32_t 	datamax = INT16_MIN;
+    uint16_t	deltaMinMax = 1;
+//	uint16_t	deltaMinMaxUsed = 1;
+//	uint16_t 	digits = 1;
+//	uint16_t 	scaler = 1;
+    uint32_t	step = 1;
+    const int	sizeOfScreen = InputBottom - InputTop;
+    float pixel2range = 1.0;
+
+    // min, max, deltaMinMax, OutputMinValue, OutputMaxValue
+    for(uint16_t i = 0; i < InputDataLength; i++)
+    {
+        if(InputDataArray[i] > datamax)
+            datamax = InputDataArray[i];
+
+        if(InputDataArray[i] < datamin)
+            datamin = InputDataArray[i];
+    }
+
+    deltaMinMax = (uint16_t)(datamax - datamin);
+
+    *OutputMinValue = (int16_t)datamin;
+    *OutputMaxValue = (int16_t)datamax;
+
+    // step
+    step = deltaMinMax / 5;
+    while(deltaMinMax > (step * 5))
+    {
+        step += 1;
+    }
+    pixel2range = ((float)sizeOfScreen) / (step * 5);
+
+    *OutputStepOfScale = (uint16_t)step;
+    *OutputMaxValueOnScale = *OutputMaxValue;
+    *OutputTop = InputTop;
+    *OutputBottom = ((int)(pixel2range * deltaMinMax)) + *OutputTop;
+}
+
+/**
+  ******************************************************************************
+  * @brief  show_logbook_logbook_show_log_page1 /
+  * @author  Peter Ryser
+  * @version V0.0.1
+  * @date    07-July-2014
+  ******************************************************************************
+    *
+  * @param  hgfx:
+  * @retval None
+  */
+void show_logbook_logbook_show_log_page1(GFX_DrawCfgScreen *hgfx,uint8_t StepBackwards)
+{
+    SWindowGimpStyle wintemp;
+    SWindowGimpStyle winsmal;
+    wintemp.left = 50;
+    wintemp.right = 799 - wintemp.left;
+    wintemp.top = 50;
+    wintemp.bottom = 479 - 40;
+
+    SLogbookHeader logbookHeader;
+    logbook_getHeader(StepBackwards ,&logbookHeader);
+
+    uint16_t depthdata[1000] = { 0 };
+    uint8_t  gasdata[1000] = { 0 };
+    int16_t tempdata[1000] = { 0 };
+
+    uint16_t dataLength = 0;
+    dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, tempdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+    //Print Date
+    uint8_t year = logbookHeader.dateYear;
+    uint8_t month = logbookHeader.dateMonth;
+    uint8_t day =  logbookHeader.dateDay;
+    char text[40];
+    snprintf(text, 20, "20%02i-%02i-%02i", year, month, day);
+    Gfx_write_label_var(hgfx, 30, 150,10, &FontT42,CLUT_GasSensor1,text);
+
+    // Print logbook number with offset
+    if(settingsGetPointer()->logbookOffset)
+    {
+        int32_t logNumber;
+        logNumber = settingsGetPointer()->logbookOffset - StepBackwards;
+        if(logNumber < 0)
+            logNumber = 0;
+        else
+        if(logNumber > 9999)
+            logNumber = 9999;
+
+        snprintf(text,20,"#%i",logNumber);
+        Gfx_write_label_var(hgfx, 300, 590,10, &FontT42,CLUT_GasSensor1,text);
+    }
+
+    //Print time
+    uint8_t hour = logbookHeader.timeHour;
+    uint8_t minute = logbookHeader.timeMinute;
+    snprintf(text,20,"%02i:%02i",hour,minute);
+    Gfx_write_label_var(hgfx, 600, 749,10, &FontT42,CLUT_GasSensor1,text);
+
+    //Print Dive Mode (OC/CCR/...)
+    switch(logbookHeader.diveMode)
+    {
+    case DIVEMODE_OC:
+            snprintf(text,20,"open circuit");
+            break;
+    case DIVEMODE_CCR:
+            snprintf(text,20,"closed circuit");
+            break;
+    case DIVEMODE_Gauge:
+            snprintf(text,20,"Gauge");
+            break;
+    case DIVEMODE_Apnea:
+            snprintf(text,20,"Apnea");
+            break;
+    }
+    Gfx_write_label_var(hgfx, 30, 250,60, &FontT42,CLUT_GasSensor4,text);
+
+    // Decomodel
+    if(logbookHeader.diveMode <= DIVEMODE_CCR)
+    {
+        switch(logbookHeader.decoModel)
+        {
+        case GF_MODE:
+                snprintf(text,20,"\002GF%u/%u",logbookHeader.gfLow_or_Vpm_conservatism,logbookHeader.gfHigh);
+                break;
+        case VPM_MODE:
+                snprintf(text,20,"\002VPM +%u",logbookHeader.gfLow_or_Vpm_conservatism);
+                break;
+        }
+        Gfx_write_label_var(hgfx, 600, 729,60, &FontT42,CLUT_GasSensor1,text);
+    }
+
+    //Write Dive Time
+    int minutes = logbookHeader.diveTimeMinutes;
+    int seconds = logbookHeader.diveTimeSeconds;
+    int hours = minutes/60;
+    minutes -= hours * 60;
+    snprintf(text,20,"%02i:%02i:%02i",hours,minutes,seconds);
+    Gfx_write_label_var(hgfx, 30, 250,360, &FontT42,CLUT_GasSensor1,text);
+    Gfx_write_label_var(hgfx, 200, 250,360, &FontT42,CLUT_GasSensor4,"s");
+
+    // Max Depth
+    int maxdepth =logbookHeader.maxDepth/100;
+    int maxdepth_dcm = logbookHeader.maxDepth/10 - maxdepth * 10;
+    int top = 150;
+    if(settingsGetPointer()->nonMetricalSystem)
+    {
+        float maxDepthFeet = 0;
+        maxDepthFeet = unit_depth_float(((float)logbookHeader.maxDepth)/100);
+        snprintf(text,20,"%.0f",maxDepthFeet);
+    }
+    else
+    {
+        snprintf(text,20,"%i.%i",maxdepth,maxdepth_dcm);
+    }
+    Gfx_write_label_var(hgfx, 30, 250,top, &FontT42,CLUT_GasSensor1,text);
+    winsmal.left = 30;
+    winsmal.top = top -3;
+    winsmal.bottom = winsmal.top + FontT42.height;
+    winsmal.right = winsmal.left + 50;
+    if(maxdepth < 10)
+    {
+        winsmal.left  = 137;
+    }
+    else if(maxdepth < 100)
+    {
+        winsmal.left  = 151;
+    }
+    else
+    {
+        winsmal.left  = 147;
+    }
+    write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor4,"max");
+    snprintf(text,3,"%c%c"
+        , unit_depth_char1()
+        , unit_depth_char2()
+    );
+    Gfx_write_label_var(hgfx, winsmal.left - 37, 250,top, &FontT42,CLUT_GasSensor4,text);
+
+    // Average Depth
+    int avrdepth =logbookHeader.averageDepth_mbar/100;
+    int avrdepth_dcm = logbookHeader.averageDepth_mbar/10 - avrdepth * 10;
+    top = 200;
+    if(settingsGetPointer()->nonMetricalSystem)
+    {
+        float avgDepthFeet = 0;
+        avgDepthFeet = unit_depth_float(((float)logbookHeader.averageDepth_mbar)/100);
+        snprintf(text,20,"%.0f",avgDepthFeet);
+    }
+    else
+    {
+        snprintf(text,20,"%i.%i",avrdepth,avrdepth_dcm);
+    }
+    Gfx_write_label_var(hgfx, 30, 250,top, &FontT42,CLUT_GasSensor1,text);
+    winsmal.left = 30;
+    winsmal.top = top -3;
+    winsmal.bottom = winsmal.top + FontT42.height;
+    winsmal.right = winsmal.left + 50;
+    if(avrdepth < 10)
+    {
+        winsmal.left  = 137                               ;
+    }
+    else if(avrdepth < 100)
+    {
+        winsmal.left  = 151;
+    }
+    else
+    {
+        winsmal.left  = 147;
+    }
+    write_label_(hgfx, winsmal,&FontT24,CLUT_GasSensor4,"avg");
+    snprintf(text,3,"%c%c"
+        , unit_depth_char1()
+        , unit_depth_char2()
+    );
+    Gfx_write_label_var(hgfx, winsmal.left - 37, 250,top, &FontT42,CLUT_GasSensor4,text);
+    // Temperature
+    top+= 50;
+    float temp_Temperature;
+    uint16_t start;
+    temp_Temperature = ((float)logbookHeader.minTemp)/10;
+    snprintf(text,20,"%.1f",unit_temperature_float(temp_Temperature));
+    Gfx_write_label_var(hgfx, 30, 250,top, &FontT42,CLUT_GasSensor1,text);
+
+    if(settingsGetPointer()->nonMetricalSystem)
+        start = 121;
+    else if((logbookHeader.minTemp >= 0) && (logbookHeader.minTemp < 10))
+        start = 100;
+    else if((logbookHeader.minTemp >= -10) && (logbookHeader.minTemp < 100))
+        start = 114;
+    else
+        start = 121;
+
+    text[0] = '\140';
+    if(settingsGetPointer()->nonMetricalSystem)
+        text[1] = 'F';
+    else
+        text[1] = 'C';
+    text[2] = 0;
+
+    Gfx_write_label_var(hgfx, start, 300,top, &FontT42,CLUT_GasSensor4,text);
+
+    // CNS
+    snprintf(text,20,"CNS: %i %%",logbookHeader.maxCNS);
+    Gfx_write_label_var(hgfx, 30, 250,750, &FontT42,CLUT_GasSensor1,text);
+
+// Surface Pressure
+//		snprintf(text,20,"\001%i\016\016 mbar",logbookHeader.surfacePressure_mbar);
+//		Gfx_write_label_var(hgfx,300,500,750, &FontT42,CLUT_GasSensor1,text);
+//		snprintf(text,40,"%i\016\016 mbar\017  (%i\016\016 m\017)",logbookHeader.surfacePressure_mbar, unit_SeaLevelRelation_integer(logbookHeader.surfacePressure_mbar));
+    snprintf(text,40,"%i\016\016 mbar\017",logbookHeader.surfacePressure_mbar);
+    Gfx_write_label_var(hgfx,320,600,750, &FontT42,CLUT_GasSensor1,text);
+
+
+    //--- print coordinate system & depth graph with gaschanges ---
+    wintemp.left 	= 330;
+    wintemp.top	=  160;
+    wintemp.bottom -= 40;
+    show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 1, dataLength, depthdata, gasdata, NULL);
+}
+
+
+void show_logbook_logbook_show_log_page2(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards)
+{
+    //*** Page2: Depth and Temperature ****
+
+    SWindowGimpStyle wintemp;
+    SWindowGimpStyle winsmal;
+    wintemp.left = 50;
+    wintemp.right = 799 - wintemp.left;
+    wintemp.top = 50;
+    wintemp.bottom = 479 - 40;
+
+    SLogbookHeader logbookHeader;
+
+    logbook_getHeader(StepBackwards,&logbookHeader);
+    uint16_t dataLength = 0;
+    uint16_t depthdata[1000];
+    uint8_t  gasdata[1000];
+    int16_t  tempdata[1000];
+    uint16_t decoDepthdata[1000];
+    uint16_t *pDecoDepthData = 0;
+
+    dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, tempdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, decoDepthdata);
+
+        for(int i = 0; i<dataLength; i++)
+        {
+            if(decoDepthdata[i] >= 300)
+            {
+                pDecoDepthData = decoDepthdata;
+                break;
+            }
+        }
+    //--- print coordinate system & depth graph ---
+    show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 0, dataLength, depthdata, gasdata, pDecoDepthData);
+
+    //*** Temperature *************************************************
+
+    //--- print temperature labels ---
+    // input maxtmpline, tmpstep, deltaline
+
+    winsmal.left = wintemp.right +6;
+    winsmal.top	= wintemp.top - 3;
+    winsmal.right =  wintemp.right + 30;
+    winsmal.bottom = winsmal.top + 16;
+
+    write_label_(hgfx, winsmal,&FontT24,CLUT_LogbookTemperature,"[C]");
+
+
+    int16_t minVal = 0;
+    int16_t maxVal = 0;
+    int newTop = 0;
+    int newBottom = 0;
+    uint16_t step = 0;
+    int16_t maxValTop = 0;
+
+    scaleHelper(dataLength, tempdata, wintemp.top, wintemp.bottom,
+                            &minVal, &maxVal, &newTop, &newBottom,
+                            &step, &maxValTop); // newTop is wintemp.top
+
+    scaleAdapt(	wintemp.top, wintemp.bottom,
+                            &minVal, &maxVal, &newTop, &newBottom,
+                            &step, &maxValTop);
+
+    // temperature in 1/10 �C
+    int deltaline = (1 + wintemp.bottom - wintemp.top)/5;
+    char msg[3];
+    int tmp = maxValTop;
+    for(int i = 1; i<=5; i++)
+    {
+        tmp -= 	step;
+        //if(tmp < 0)
+            //break;
+        winsmal.top	= wintemp.top + deltaline * i - 14;
+        winsmal.bottom = winsmal.top + 16;
+        if((tmp >= 0) && (tmp < 100))
+            snprintf(msg,2,"%1i",tmp);
+        else
+            snprintf(msg,3,"%2i",tmp);
+        write_label_(hgfx, winsmal,&FontT24,CLUT_LogbookTemperature,msg);
+    }
+
+
+    //--- print temperature graph ---
+    // input tempdata[i], maxtmpline, mintmpline, maxTmp, minTmp, deltaline, wintemp.top, dataLength, datamax,
+
+    //adapt window
+    wintemp.bottom = newBottom;
+    wintemp.top = newTop;
+    GFX_graph_print(hgfx,&wintemp,0,1,maxVal,minVal, (uint16_t *)tempdata,dataLength,CLUT_LogbookTemperature, NULL);
+}
+
+
+void show_logbook_logbook_show_log_page2_original(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards)
+{
+    //*** Page2: Depth and Temperature ****
+
+    SWindowGimpStyle wintemp;
+    SWindowGimpStyle winsmal;
+    wintemp.left = 50;
+    wintemp.right = 799 - wintemp.left;
+    wintemp.top = 50;
+    wintemp.bottom = 479 - 40;
+
+    SLogbookHeader logbookHeader;
+
+    logbook_getHeader(StepBackwards,&logbookHeader);
+    uint16_t dataLength = 0;
+    uint16_t depthdata[1000];
+    uint8_t  gasdata[1000];
+    int16_t  tempdata[1000];
+    uint16_t decoDepthdata[1000];
+    uint16_t *pDecoDepthData = 0;
+
+    dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, tempdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, decoDepthdata);
+
+/* test
+    for(int i = 0; i<dataLength/2; i++)
+        decoDepthdata[i] = 300;
+
+    for(int i = dataLength/2; i<dataLength; i++)
+        decoDepthdata[i] = 1200;
+*/
+    for(int i = 0; i<dataLength; i++)
+    {
+        if(decoDepthdata[i] >= 300)
+        {
+            pDecoDepthData = decoDepthdata;
+            break;
+        }
+    }
+    //--- print coordinate system & depth graph ---
+    show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 0, dataLength, depthdata, gasdata, pDecoDepthData);
+
+    //*** Temperature *************************************************
+
+
+    int16_t datamax = -1000; // �C * 10
+    int16_t datamin = +1000;
+    for(int i = 0; i < dataLength;i++)
+    {
+        if(tempdata[i]>datamax)
+            datamax = tempdata[i];
+        if(tempdata[i]< datamin)
+            datamin = tempdata[i];
+    }
+    float maxTmp = ((float)datamax) /10.f;
+    float minTmp = ((float)datamin) /10.f;
+    int deltaTmp = maxTmp - minTmp;
+    int tmpstep = 2;
+
+    // 5 different scales: 1�C, 2�C, 4�C, 5�C, 10�C
+    // with 6 lines == 5 steps
+    if((deltaTmp) <=5)
+    {
+        tmpstep = 1;
+    }
+    else
+    if(deltaTmp <= (5*2))
+    {
+        tmpstep = 2;
+    }
+    else
+    if(deltaTmp <= (5 * 4))
+    {
+        tmpstep = 4;
+    }
+    else
+    if(deltaTmp <= (5 * 5))
+    {
+        tmpstep = 5;
+    }
+    else
+    {
+        tmpstep = 10;
+    }
+//	int steps = deltaTmp/tmpstep;
+
+
+//	int steps = deltaTmp/5;
+//	int tmpstep = 5;
+//	if(steps > 4)
+//		tmpstep = 10;
+
+    int maxtmpline = 0;
+    int mintmpline = 0;
+    if(minTmp < 0)
+    {
+        if(minTmp >= -5)
+        {
+            mintmpline = -5;
+
+        }
+        else if(minTmp >= -10)
+        {
+            mintmpline = -10;
+        }
+        else
+            mintmpline = -15;
+    }
+
+    if(maxTmp > 0)
+    {
+        while(maxtmpline < maxTmp)
+            maxtmpline += tmpstep;
+    }
+
+    if(tmpstep < 5)
+        maxtmpline = MaxU32LOG(maxtmpline, 10);
+    else if(tmpstep == 5)
+        maxtmpline = MaxU32LOG(maxtmpline, 25);
+    else
+        maxtmpline = 50;
+
+    maxtmpline += mintmpline;
+
+    //--- print temperature labels ---
+    // input maxtmpline, tmpstep, deltaline
+
+    winsmal.left = wintemp.right +6;
+    winsmal.top	= wintemp.top - 3;
+    winsmal.right =  wintemp.right + 30;
+    winsmal.bottom = winsmal.top + 16;
+
+    write_label_(hgfx, winsmal,&FontT24,CLUT_LogbookTemperature,"[C]");
+
+    int deltaline = (wintemp.bottom - wintemp.top)/5;
+    char msg[3];
+    int tmp = maxtmpline;
+    for(int i = 1; i<=5; i++)
+    {
+        tmp -= 	tmpstep;
+        //if(tmp < 0)
+            //break;
+        winsmal.top	= wintemp.top + deltaline * i - 14;
+        winsmal.bottom = winsmal.top + 16;
+        snprintf(msg,3,"%2i",tmp);
+        write_label_(hgfx, winsmal,&FontT24,CLUT_LogbookTemperature,msg);
+    }
+
+
+    //--- print temperature graph ---
+    // input tempdata[i], maxtmpline, mintmpline, maxTmp, minTmp, deltaline, wintemp.top, dataLength, datamax,
+
+    //adapt window
+    float ftmp =((maxtmpline - minTmp) * deltaline) /tmpstep +  wintemp.top;
+    wintemp.bottom = ftmp;
+    if((ftmp - (int)ftmp) >= 0.5f)
+        wintemp.bottom++;
+
+    ftmp = ((maxtmpline - maxTmp) * deltaline) /tmpstep + wintemp.top;
+    wintemp.top = ftmp;
+    if((ftmp - (int)ftmp) >= 0.5f)
+        wintemp.top++;
+
+    if(wintemp.top <= wintemp.bottom)
+    {
+        for(int i = 0; i < dataLength;i++)
+        {
+            tempdata[i] -= mintmpline;
+        }
+        datamax -= mintmpline;
+        // hw 160518
+        // es wird nur das Fenster (wintemp.top, wintemp.bottom) verwendet in dem Daten sind
+        // daher muss datamin angegeben werden
+        // der Gesamtbereich ist uninteressant
+        // Bsp Temperatur von 8�C bis 5�C
+        // Y-Achse ist 10�C (oben) bis 0�C (unten)
+        // aber wintemp.top ist 127
+        // und wintemp.bottom ist 243
+        GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, (uint16_t *)tempdata,dataLength,CLUT_LogbookTemperature, NULL);
+    }
+}
+
+
+void build_logbook_test(uint8_t page, uint8_t StepBackwards)
+{
+    uint32_t lastScreen,lastBackground;
+
+    lastScreen = tLOGscreen.FBStartAdress;
+    lastBackground = tLOGbackground.FBStartAdress;
+
+    tLOGscreen.FBStartAdress = getFrame(16);
+    tLOGscreen.ImageHeight = 480;
+    tLOGscreen.ImageWidth = 800;
+    tLOGscreen.LayerIndex = 1;
+
+    tLOGbackground.FBStartAdress = getFrame(17);
+    tLOGbackground.ImageHeight = 480;
+    tLOGbackground.ImageWidth = 800;
+    tLOGbackground.LayerIndex = 0;
+    switch(page)
+    {
+    case 1:
+        show_logbook_logbook_show_log_page1(&tLOGscreen,StepBackwards);
+        break;
+    case 2:
+        show_logbook_logbook_show_log_page2(&tLOGscreen,StepBackwards);
+        break;
+    case 3:
+        show_logbook_logbook_show_log_page3(&tLOGscreen,StepBackwards);
+        break;
+    case 4:
+        show_logbook_logbook_show_log_page4(&tLOGscreen,StepBackwards);
+        break;
+    }
+
+    releaseFrame(16,lastScreen);
+    releaseFrame(17,lastBackground);
+}
+
+
+void show_logbook_test(_Bool firstPage, uint8_t StepBackwards)
+{
+    static uint8_t page = 1;
+    if(firstPage)
+    {
+            page = 1;
+    }
+    else
+    {
+            page++;
+            if(page > 4)
+                    page = 1;
+    }
+
+    build_logbook_test(page,StepBackwards);
+//	GFX_ResetLayer(TOP_LAYER);
+//	GFX_ResetLayer(BACKGRD_LAYER);
+
+    set_globalState(StILOGSHOW);
+    GFX_SetFramesTopBottom(tLOGscreen.FBStartAdress, tLOGbackground.FBStartAdress,480);
+}
+
+
+void show_logbook_exit(void)
+{
+    releaseFrame(16,tLOGscreen.FBStartAdress);
+    releaseFrame(17,tLOGbackground.FBStartAdress);
+}
+
+
+void show_logbook_logbook_show_log_page3(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards)
+{
+    SWindowGimpStyle wintemp;
+    SWindowGimpStyle winsmal;
+    wintemp.left = 50;
+    wintemp.right = 799 - wintemp.left;
+    wintemp.top = 50;
+    wintemp.bottom = 479 - 40;
+
+    SLogbookHeader logbookHeader;
+
+    logbook_getHeader(StepBackwards, &logbookHeader);
+    uint16_t dataLength = 0;
+    uint16_t depthdata[1000];
+    uint8_t  gasdata[1000];
+    dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+    //--- print coordinate system & depth graph with gaschanges ---
+    show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 1, dataLength, depthdata, gasdata, NULL);
+
+    //--- print gas list ---
+    winsmal.left = wintemp.right - 190;
+    winsmal.right =  winsmal.left + 150;
+
+    char msg[15];
+    char gas_name[15];
+    int j = 0;
+    for(int i = 4;i >= 0;i--)
+    {
+        if(logbookHeader.gasordil[i].note.ub.active > 0)
+        {
+            j++;
+            winsmal.top	= wintemp.bottom - 5 - j * 26 ;
+            winsmal.bottom = winsmal.top + 21  ;
+            uint8_t color = get_colour(i);
+
+            print_gas_name(gas_name,15,logbookHeader.gasordil[i].oxygen_percentage,logbookHeader.gasordil[i].helium_percentage);
+            snprintf(msg,15,"G%i: %s",i + 1, gas_name);
+            //msg[10] = 0;
+            write_label_(hgfx, winsmal,&FontT24,color,msg);
+        }
+    }
+
+    //--- define buttons ---
+    /*if(*ghost_char_logfile_oxydata)
+        button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page4, surf1_menu_logbook_show_log_next);
+    else
+        button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page1, surf1_menu_logbook_show_log_next);
+        */
+}
+
+void show_logbook_logbook_show_log_page4(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards)
+{ SWindowGimpStyle wintemp;
+    SWindowGimpStyle winsmal;
+    wintemp.left = 50;
+    wintemp.right = 799 - wintemp.left;
+    wintemp.top = 50;
+    wintemp.bottom = 479 - 40;
+    uint8_t color = 0;
+    SLogbookHeader logbookHeader;
+
+    logbook_getHeader(StepBackwards, &logbookHeader);
+    uint16_t dataLength = 0;
+    uint16_t depthdata[1000];
+    uint8_t  gasdata[1000];
+    uint16_t ppO2data[1000];
+    uint16_t sensor2[1000];
+    uint16_t sensor3[1000];
+        uint16_t *setpoint = ppO2data;
+        uint16_t *sensor1 = ppO2data;
+
+
+        if(logbookHeader.diveMode != DIVEMODE_CCR)
+            dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata,gasdata, NULL, ppO2data, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+        else
+        {
+            if(logbookHeader.CCRmode == CCRMODE_FixedSetpoint)
+                dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, setpoint, NULL, NULL, NULL, NULL, NULL, NULL);
+            else
+                dataLength = logbook_readSampleData(StepBackwards, 1000, depthdata, gasdata, NULL, NULL, NULL, sensor1, sensor2, sensor3, NULL, NULL, NULL);
+        }
+
+
+    //--- print coordinate system & depth graph with bailout---
+    show_logbook_draw_depth_graph(hgfx, StepBackwards, &wintemp, 0, dataLength, depthdata, gasdata, NULL);
+
+
+
+    //*** Desciption at bottom of page ***************************
+    winsmal.top	= wintemp.bottom +2 ;
+    winsmal.bottom = winsmal.top + 16;
+
+
+    /*if(strcmp( (char*)ghost_char_logfile_text_oc_ccr,"ccr/bailout") == 0)
+    {
+        winsmal.left = wintemp.left + 2;
+        winsmal.right =  winsmal.left + 55;
+
+        oled_write(OVERLAY, &winsmal,"CCR -",false,true);
+
+        winsmal.left = winsmal.right;
+        winsmal.right =  winsmal.left + 90;
+        //winsmal.fontcolor = oled_get_colour(15);
+        oled_write(OVERLAY, &winsmal,"bailout",false,true);
+    }
+    else*/
+    {
+        winsmal.left = wintemp.left + 2;
+        winsmal.right =  winsmal.left + 55;
+         color = CLUT_GasSensor1;//LOGBOOK_GRAPH_DEPTH;
+
+        write_label_(hgfx, winsmal,&FontT24,color,"depth");
+
+    }
+    winsmal.left = 799 - 67;//wintemp.right -67;
+    winsmal.right = winsmal.left;// + 45;
+
+    color = CLUT_LogbookTemperature;//LOGBOOK_GRAPH_DEPTH;
+    if(logbookHeader.diveMode != DIVEMODE_CCR)
+        write_label_(hgfx, winsmal,&FontT24,color,"\002PP O2");
+    else
+    if(logbookHeader.CCRmode != CCRMODE_Sensors)
+        write_label_(hgfx, winsmal,&FontT24,color,"\002SETPOINT");
+    else
+        write_label_(hgfx, winsmal,&FontT24,color,"\002SENSORS");
+
+    //*** PP O2 ****************************************************
+    //calc lines and labels
+    int datamax = 0;
+    int datamin = 10000;
+    for(int i=1;i<dataLength;i++)
+    {
+        if(ppO2data[i]>datamax)
+            datamax = ppO2data[i];
+        if(ppO2data[i]<datamin)
+            datamin = ppO2data[i];
+    }
+    if((logbookHeader.diveMode == DIVEMODE_CCR) && (logbookHeader.CCRmode == CCRMODE_Sensors))
+    {
+        for(int i=1;i<dataLength;i++)
+        {
+            if(sensor2[i]>datamax)
+                datamax = sensor2[i];
+            if(sensor2[i]<datamin)
+                datamin = sensor2[i];
+            if(sensor3[i]>datamax)
+                datamax = sensor3[i];
+            if(sensor3[i]<datamin)
+                datamin = sensor3[i];
+        }
+    }
+    float maxoxy = ((float)datamax)/100;
+    float minoxy =  ((float)datamin)/100;
+    float oxystep = 0.5;
+    float maxoxyline = 2.5;
+
+    //--- print PP O2 labels ----
+    winsmal.left = wintemp.right + 2;
+    winsmal.top	= wintemp.top ;
+    winsmal.right =  wintemp.right + 30;
+    winsmal.bottom = winsmal.top + 16;
+    //winsmal.font = ft_tiny + ft_SLIM;
+    color = CLUT_LogbookTemperature;// = LOGBOOK_GRAPH_TEMP;
+
+    write_label_(hgfx, winsmal,&FontT24,color,"bar");
+
+    int deltaline = (wintemp.bottom - wintemp.top)/5;
+    char msg[4];
+    float oxy = maxoxyline;
+    for(int i = 1; i<=5; i++)
+    {
+        oxy -= 	oxystep;
+        if(oxy < 0)
+            break;
+        winsmal.top	= wintemp.top + deltaline * i - 8;
+        winsmal.bottom = winsmal.top + 16;
+        snprintf(msg,4,"%1.1f",oxy);
+        write_label_(hgfx, winsmal,&FontT24,color,msg);
+        //oled_write(OVERLAY, &winsmal,msg,false,true);
+    }
+
+    //--- print PP O2 graph ---
+    //Adapt window
+    float ftmp = ((maxoxyline - minoxy) * deltaline) /oxystep + wintemp.top;
+    wintemp.bottom = ftmp;
+    if((ftmp - (int)ftmp) >= 0.5f)
+        wintemp.bottom++;
+
+    ftmp = wintemp.top + ((maxoxyline - maxoxy) * deltaline) /oxystep;
+    wintemp.top = ftmp;
+    if((ftmp - (int)ftmp) >= 0.5f)
+        wintemp.top++;
+    wintemp.top = MaxU32LOG(wintemp.top ,0);
+    if(wintemp.top < wintemp.bottom)
+    {
+        if((logbookHeader.diveMode == DIVEMODE_CCR) && (logbookHeader.CCRmode == CCRMODE_Sensors))
+        {
+            GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_LogbookTemperature, NULL);
+            GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor2,dataLength,CLUT_LogbookTemperature, NULL);
+            GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, sensor3,dataLength,CLUT_LogbookTemperature, NULL);
+        }
+        else
+            GFX_graph_print(hgfx,&wintemp,0,1,datamax,datamin, ppO2data,dataLength,CLUT_LogbookTemperature, NULL);
+    }
+    else
+    {
+        point_t startPoint, stopPoint;
+        startPoint.x = wintemp.left;
+        stopPoint.x = wintemp.right;
+        stopPoint.y = startPoint.y = 479 - wintemp.top;
+        GFX_draw_colorline(hgfx, startPoint, stopPoint, CLUT_LogbookTemperature);
+    }
+
+    //--- define buttons ---
+    //button_start_single_action(surf1_menu_logbook_current_page, surf1_menu_logbook_show_log_page1, surf1_menu_logbook_show_log_next);
+}
+
+void print_gas_name(char* output,uint8_t length,uint8_t oxygen,uint8_t helium)
+{
+    if(helium == 0)
+    {
+        if(oxygen == 21)
+            snprintf(output, length, "Air");
+        else if(oxygen == 100)
+            snprintf(output, length, "Oxy");
+        else
+            snprintf(output, length, "NX%i",oxygen);
+    }
+    else
+        {
+                if((oxygen + helium) == 100)
+            snprintf(output, length, "HX%i",oxygen);
+                else
+                        snprintf(output, length, "TMX%i/%i", oxygen, helium);
+        }
+
+}
+
+int16_t get_colour(int16_t color)
+{
+     return CLUT_GasSensor1 + color;
+}