Mercurial > public > ostc4
diff Discovery/Src/tInfoPreDive.c @ 981:c6c781a2e85b default
Merge into default
| author | heinrichsweikamp |
|---|---|
| date | Tue, 11 Feb 2025 18:12:00 +0100 |
| parents | fce639612464 |
| children | bad5561c0c59 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/tInfoPreDive.c Tue Feb 11 18:12:00 2025 +0100 @@ -0,0 +1,245 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Discovery/Src/tInfoPredive.c +/// \brief Show information which might be of interest during predive checks +/// \author heinrichs weikamp gmbh +/// \date 23-Feb-2015 +/// +/// \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 "gfx_engine.h" +#include "gfx_fonts.h" +#include "tHome.h" +#include "tInfo.h" +#include "tInfoPreDive.h" +#include "tMenuEdit.h" +#include "data_exchange_main.h" + +#include <string.h> +#include <inttypes.h> + +#define MEASURE_INTERVALL (10u) /* refresh function should be called every 100ms => one second interval */ +#define HISTORY_BUF_SIZE (240u) /* store 240 entries a one second */ +#define INVALID_PRESSURE_VALUE (0xFFFF) +#define DELTA_SHIFT (50) /* the graph printers do not support negative values => shift data into positiv area (assumes pressure range +- 300mBar) */ + +/* Private variables ---------------------------------------------------------*/ +static uint16_t surfacePressureStart = INVALID_PRESSURE_VALUE; +static uint16_t surfaceTemperatureStart = 0; +static uint16_t pressureHistory[HISTORY_BUF_SIZE]; +static uint8_t pressureHistoryIndex = 0; +static uint16_t temperatureHistory[HISTORY_BUF_SIZE]; +static uint8_t temperatureHistoryIndex = 0; +static uint8_t measureCnt = MEASURE_INTERVALL; +static uint8_t referenceSensor = 0xff; + +/* Exported functions --------------------------------------------------------*/ + + + +static void storePressureValue(int16_t deltapressure_mBar) +{ + uint16_t newValue = DELTA_SHIFT - deltapressure_mBar; /* invert value because graph is drawing larger values to bottom direction */ + if(pressureHistoryIndex + 2 < HISTORY_BUF_SIZE) + { + pressureHistoryIndex++; + pressureHistory[pressureHistoryIndex] = newValue; + pressureHistoryIndex++; + pressureHistory[pressureHistoryIndex] = newValue; + } + else + { + memcpy (&pressureHistory[0],&pressureHistory[2],sizeof(pressureHistory) - 2); + pressureHistory[pressureHistoryIndex] = newValue; + } +} + +static void storeTemperatureValue(uint16_t temperature) +{ + uint16_t newValue = temperature; /* todo: consider negativ temperature */ + if(temperatureHistoryIndex + 2 < HISTORY_BUF_SIZE) + { + temperatureHistoryIndex++; + temperatureHistory[temperatureHistoryIndex] = newValue; + temperatureHistoryIndex++; + temperatureHistory[temperatureHistoryIndex] = newValue; + } + else + { + memcpy (&temperatureHistory[0],&temperatureHistory[2],sizeof(temperatureHistory) - 2); + temperatureHistory[temperatureHistoryIndex] = newValue; + } +} + +void openInfo_PreDive() +{ + const SDiveState *pStateReal = stateRealGetPointer(); + uint8_t index = 0; + SSensorDataDiveO2* pDiveO2Data = NULL; + SSettings *pSettings = settingsGetPointer(); + set_globalState(StIPREDIVE); + + surfacePressureStart = 0; + pressureHistoryIndex = 0; + referenceSensor = 0xff; + + for(index = 0; index < EXT_INTERFACE_MUX_OFFSET; index++) + { + if((pSettings->ext_sensor_map[index] == SENSOR_DIGO2M) && pStateReal->lifeData.ppO2Sensor_bar[index] != 0) + { + referenceSensor = index; + pDiveO2Data = (SSensorDataDiveO2*)stateRealGetPointer()->lifeData.extIf_sensor_data[index]; + if(pDiveO2Data->pressure != 0) + { + surfacePressureStart = pDiveO2Data->pressure / 1000; + surfaceTemperatureStart = pDiveO2Data->temperature; + } + break; + } + } + for(index = 0; index < HISTORY_BUF_SIZE; index++) + { + pressureHistory[index] = DELTA_SHIFT; + temperatureHistory[index] = 0; + } +} + +void refreshInfo_PreDive(GFX_DrawCfgScreen s) +{ + const SDiveState *pStateReal = stateRealGetPointer(); + static int16_t deltaPressure = 0; + static uint16_t temperature = 0; + SSettings *pSettings = settingsGetPointer(); + uint8_t index = 0; + char text[31]; + SSensorDataDiveO2* pDiveO2Data = NULL; + point_t start, stop; + + SWindowGimpStyle wintempppO2; + SWindowGimpStyle wintemptemp; + + if(--measureCnt == 0) + { + measureCnt = MEASURE_INTERVALL; + pDiveO2Data = (SSensorDataDiveO2*)stateRealGetPointer()->lifeData.extIf_sensor_data[referenceSensor]; + if(pDiveO2Data->pressure != 0) + { + if(surfacePressureStart == 0) + { + surfacePressureStart = pDiveO2Data->pressure / 1000; + surfaceTemperatureStart = pDiveO2Data->temperature; + } + deltaPressure = (pDiveO2Data->pressure / 1000) - surfacePressureStart; + storePressureValue(deltaPressure); + temperature = pDiveO2Data->temperature; + storeTemperatureValue(temperature); + } + } + + text[0] = '\001'; + text[1] = TXT_PreDive; + text[2] = 0; + tInfo_write_content_simple( 30, 770, ME_Y_LINE_BASE, &FontT48, text, CLUT_MenuPageHardware); + + for(index = 0; index < EXT_INTERFACE_MUX_OFFSET; index++) + { + if((pSettings->ext_sensor_map[index] == SENSOR_DIGO2M) || (pSettings->ext_sensor_map[index] == SENSOR_ANALOG)) + { + snprintf(text,32,"%c%c%d: %01.2f", TXT_2BYTE, TXT2BYTE_Sensor, index, pStateReal->lifeData.ppO2Sensor_bar[index]); + tInfo_write_content_simple( 5, 780, ME_Y_LINE1 + (index * ME_Y_LINE_STEP), &FontT48, text, CLUT_Font020); + } + else if(pSettings->ext_sensor_map[index] == SENSOR_CO2M) + { + snprintf(text,32,"CO2: %4ld", pStateReal->lifeData.CO2_data.CO2_ppm); + tInfo_write_content_simple( 5, 780, ME_Y_LINE5, &FontT48, text, CLUT_Font020); + } + } + + wintempppO2.left = 350; + wintempppO2.right = 590; + + wintemptemp.left = 350; + wintemptemp.right = 590; + + wintempppO2.top = ME_Y_LINE3; + wintempppO2.bottom = wintempppO2.top + DELTA_SHIFT * 2; + wintemptemp.top = ME_Y_LINE5; + wintemptemp.bottom = wintemptemp.top + DELTA_SHIFT * 2; + + start.x = wintempppO2.left - 5; + start.y = 480 - wintemptemp.bottom - 5; + stop.x = wintempppO2.right- start.x + 5; + stop.y = DELTA_SHIFT * 2 + 10; + GFX_draw_box(&s, start, stop,1, CLUT_Font020); + + start.y = 480 - wintempppO2.bottom - 5; + GFX_draw_box(&s, start, stop,1, CLUT_Font020); + + if(pSettings->FlipDisplay) + { + wintempppO2.left = 800 - 590; + wintempppO2.right = 800 - 350; + wintemptemp.left = 800 - 590; + wintemptemp.right = 800 - 350; + } + GFX_graph_print(&s, &wintempppO2, 1,1,0, DELTA_SHIFT * 2, pressureHistory, HISTORY_BUF_SIZE, CLUT_Font030, NULL); + + GFX_graph_print(&s, &wintemptemp, 1,1, surfaceTemperatureStart - 2000, surfaceTemperatureStart + 10000, temperatureHistory, HISTORY_BUF_SIZE, CLUT_Font030, NULL); + +/* Graph labeling */ + snprintf(text,32,"%c%c", TXT_2BYTE, TXT2BYTE_CounterLung); + tInfo_write_content_simple( 350, 795, ME_Y_LINE2, &FontT48, text, CLUT_Font020); + + snprintf(text,32,"\002\016\016%c%c", TXT_2BYTE, TXT2BYTE_Pressure); + tInfo_write_content_simple( 500, 795, ME_Y_LINE3, &FontT48, text, CLUT_Font020); + snprintf(text,32,"\002%d",deltaPressure); + tInfo_write_content_simple( 500, 795, ME_Y_LINE4, &FontT48, text, CLUT_Font020); + snprintf(text,32,"\002\016\016%c",TXT_Temperature); + tInfo_write_content_simple( 300, 795, ME_Y_LINE5, &FontT48, text, CLUT_Font020); + snprintf(text,32,"\002%2.2f",(temperature / 1000.0)); + tInfo_write_content_simple( 300, 795, ME_Y_LINE6, &FontT48, text, CLUT_Font020); +} + +void sendActionToInfoPreDive(uint8_t sendAction) +{ + switch(sendAction) + { + case ACTION_BUTTON_BACK: + // exitInfo(); + exitMenuEdit_to_Menu_with_Menu_Update(); + break; + + case ACTION_BUTTON_ENTER: + break; + case ACTION_BUTTON_NEXT: + break; + case ACTION_TIMEOUT: + case ACTION_MODE_CHANGE: + case ACTION_IDLE_TICK: + case ACTION_IDLE_SECOND: + default: + break; + } +} +
