Merged in janlmulder/ostc4/fix-version (pull request #27)
bugfix: correct packed main version number in dive header
line source
///////////////////////////////////////////////////////////////////////////////
/// -*- 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 ---------------------------------------------------------*/
static GFX_DrawCfgScreen tLOGscreen;
static GFX_DrawCfgScreen tLOGbackground;
static void print_gas_name(char* output,uint8_t lengh,uint8_t oxygen,uint8_t helium);
static int16_t get_colour(int16_t color);
/* Overview */
static void show_logbook_logbook_show_log_page1(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
/* Temperature */
static void show_logbook_logbook_show_log_page2(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
/* Gas List */
static void show_logbook_logbook_show_log_page3(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
/* ppO2 */
static void show_logbook_logbook_show_log_page4(GFX_DrawCfgScreen *hgfx, uint8_t StepBackwards);
static inline uint32_t MaxU32LOG(uint32_t a, uint32_t b)
{
return((a>b)?a:b);
}
/**
******************************************************************************
* @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
*/
static 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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,CLUT_GasSensor1,"min");
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);
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,CLUT_GasSensor1,msg);
}
winsmal.left = wintemp.left;// - 9;
winsmal.top = wintemp.top - 40;
winsmal.right = winsmal.left + 60;
//--- 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, 0, colortemp);
}
else
GFX_graph_print(hgfx,&wintemp,saveTop,1,0,datamax, decostopdata,dataLength, CLUT_NiceGreen, NULL);
}
if(settingsGetPointer()->FlipDisplay)
{
winsmal.right = 800 - wintemp.left;
winsmal.left = 800 - wintemp.right;
winsmal.bottom = wintemp.bottom;
winsmal.top = wintemp.top;
}
else
{
winsmal.right = wintemp.right;
winsmal.left = wintemp.left;
winsmal.bottom = wintemp.bottom;
winsmal.top = wintemp.top;
}
switch(mode)
{
case 0:
GFX_graph_print(hgfx,&winsmal,0,1,0,datamax, depthdata,dataLength,CLUT_GasSensor1, NULL);
break;
case 1:
GFX_graph_print(hgfx,&winsmal,saveBottom,1,0,datamax, depthdata,dataLength,CLUT_GasSensor0,colordata);
break;
case 2:
if(*colordata)
GFX_graph_print(hgfx,&winsmal,0,1,0,datamax, depthdata,dataLength,CLUT_GasSensor0,colordata);
else
GFX_graph_print(hgfx,&winsmal,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)
*/
static 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
*/
static 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
*/
static 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, 250,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;
if(maxdepth < 10)
{
winsmal.left = 137;
}
else if(maxdepth < 100)
{
winsmal.left = 151;
}
else
{
winsmal.left = 147;
}
winsmal.right = winsmal.left + 50;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,top, &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;
/* put avg behind previous string */
if(avrdepth < 10)
{
winsmal.left = 137 ;
}
else if(avrdepth < 100)
{
winsmal.left = 151;
}
else
{
winsmal.left = 147;
}
winsmal.right = winsmal.left + 50;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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,440, &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 hPa\017",logbookHeader.surfacePressure_mbar);
Gfx_write_label_var(hgfx,320,600,440, &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);
}
static 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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
}
static 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);
}
static 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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
*/
}
static 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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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)
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002PP O2");
else
if(logbookHeader.CCRmode != CCRMODE_Sensors)
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &FontT24,color,"\002SETPOINT");
else
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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;
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
Gfx_write_label_var(hgfx, winsmal.left, winsmal.right,winsmal.top, &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);
}
static 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);
}
}
static int16_t get_colour(int16_t color)
{
return CLUT_GasSensor1 + color;
}