Mercurial > public > ostc4
view Discovery/Src/tInfoPreDive.c @ 881:5b675077ccfb Evo_2_23
Added filtering of ascent speed:
In the previous version the ascent speed was simply calculated based of the last measured pressure values. This may lead to unexpected colorchanges of the depth value. To smooth this behavior a filter has been added which evaluates if a movment direction is valid for a certain period of time. If the condition direction is stable then the ascend speed is provided.
author | Ideenmodellierer |
---|---|
date | Sat, 31 Aug 2024 17:28:37 +0200 |
parents | fce639612464 |
children |
line wrap: on
line source
/////////////////////////////////////////////////////////////////////////////// /// -*- 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; } }