Mercurial > public > ostc4
changeset 539:d784f281833a
Added inertia simulation for compass heading:
In previous version calculated compass values were directly used for visualization of the compass. This causes a fast changing (jumping) of values. With the inertia introduction the compass behalfs more like an analog compass. The final value is reached slowly and the displayed values are more stable.
For configuration a new menu item has been added to the compass menu allowing to switch inertia off (default), small and large inertia simulation
author | Ideenmodellierer |
---|---|
date | Sat, 10 Oct 2020 16:59:18 +0200 |
parents | b1eee27cd02b |
children | ffd01ead2c80 |
files | Common/Inc/data_central.h Common/Inc/settings.h Discovery/Inc/tStructure.h Discovery/Inc/text_multilanguage.h Discovery/Src/data_central.c Discovery/Src/data_exchange_main.c Discovery/Src/settings.c Discovery/Src/t3.c Discovery/Src/t7.c Discovery/Src/tMenuEditHardware.c Discovery/Src/text_multilanguage.c |
diffstat | 11 files changed, 154 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/Common/Inc/data_central.h Sat Oct 10 13:51:44 2020 +0200 +++ b/Common/Inc/data_central.h Sat Oct 10 16:59:18 2020 +0200 @@ -433,6 +433,8 @@ void setBatteryPercentage(uint8_t newChargePercentage); void setButtonResponsiveness(uint8_t *ButtonSensitivyList); void calibrateCompass(void); +void compass_Inertia(float newHeading); +float compass_getCompensated(); void clearDeco(void); void translateDate(uint32_t datetmpreg, RTC_DateTypeDef *sDate); void translateTime(uint32_t tmpreg, RTC_TimeTypeDef *sTime);
--- a/Common/Inc/settings.h Sat Oct 10 13:51:44 2020 +0200 +++ b/Common/Inc/settings.h Sat Oct 10 16:59:18 2020 +0200 @@ -68,6 +68,8 @@ #define PRESSURE_OFFSET_LIMIT_MBAR 50 +#define MAX_COMPASS_COMP (2u) + /* 2015 Jan 30, hw, deco and travel added for MenuEditGas * can be used for buehlmann, vpm, etc. later but be carefull * with current implemenation */ @@ -223,6 +225,8 @@ uint8_t MotionDetection; /* new in 0xFFFF001B */ uint32_t cv_config_BigScreen; + /* new in 0xFFFF001C */ + uint8_t compassInertia; } SSettings; typedef struct
--- a/Discovery/Inc/tStructure.h Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Inc/tStructure.h Sat Oct 10 16:59:18 2020 +0200 @@ -238,6 +238,7 @@ #define StMHARD2_Compass_SetCourse _MB(2,7,2,2,0) #define StMHARD2_Compass_ResetCourse _MB(2,7,2,3,0) #define StMHARD2_Compass_Calibrate _MB(2,7,2,4,0) +#define StMHARD2_Compass_Inertia _MB(2,7,2,5,0) //#define StMHARD2_Exit _MB(2,7,2,2,0) @@ -251,7 +252,7 @@ #define StMHARD4_BrightnessHigh _MB(2,7,4,3,0) #define StMHARD4_BrightnessMax _MB(2,7,4,4,0) -#define StMHARD5_Button1 _MB(2,7,5,1,0) +#define StMHARD5_Button1 _MB(2,7,5,1,0) #define StMHARD5_ButtonBalance1 _MB(2,7,5,2,0) #define StMHARD5_ButtonBalance2 _MB(2,7,5,3,0) #define StMHARD5_ButtonBalance3 _MB(2,7,5,4,0)
--- a/Discovery/Inc/text_multilanguage.h Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Inc/text_multilanguage.h Sat Oct 10 16:59:18 2020 +0200 @@ -195,6 +195,7 @@ TXT2BYTE_SpecialDiveGasMenu, TXT2BYTE_SpecialDiveGasMenuCCR, TXT2BYTE_CompassCalib, + TXT2BYTE_CompassInertia, TXT2BYTE_UseSensor, /* */ TXT2BYTE_WarnDecoMissed,
--- a/Discovery/Src/data_central.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/data_central.c Sat Oct 10 16:59:18 2020 +0200 @@ -61,6 +61,7 @@ /* Includes ------------------------------------------------------------------*/ #include <string.h> +#include <math.h> #include "data_central.h" #include "calc_crush.h" #include "decom.h" @@ -103,6 +104,11 @@ const SDiveState *stateUsed = &stateReal; SDiveState *stateUsedWrite = &stateReal; + +#define COMPASS_FRACTION (4.0f) /* delay till value changes to new actual */ + +static float compass_compensated = 0; + void set_stateUsedToReal(void) { stateUsed = stateUsedWrite = &stateReal; @@ -770,3 +776,41 @@ else return false; } + +void compass_Inertia(float newHeading) +{ + float newTarget = newHeading; + + if(settingsGetPointer()->compassInertia == 0) + { + compass_compensated = newHeading; + } + else + { + if((compass_compensated > 270.0) && (newHeading < 90.0)) /* transition passing 0 clockwise */ + { + newTarget = newHeading + 360.0; + } + + if((compass_compensated < 90.0) && (newHeading > 270.0)) /* transition passing 0 counter clockwise */ + { + newTarget = newHeading - 360.0; + } + + compass_compensated = compass_compensated + ((newTarget - compass_compensated) / (COMPASS_FRACTION * (settingsGetPointer()->compassInertia))); + if(compass_compensated < 0.0) + { + compass_compensated += 360.0; + } + if(compass_compensated >= 360.0) + { + compass_compensated -= 360.0; + } + } +} + +float compass_getCompensated() +{ + return compass_compensated; +} +
--- a/Discovery/Src/data_exchange_main.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/data_exchange_main.c Sat Oct 10 16:59:18 2020 +0200 @@ -970,6 +970,7 @@ pStateReal->compass_uTick_old = pStateReal->compass_uTick_new; pStateReal->compass_uTick_new = dataIn.data[dataIn.boolCompassData].compass_uTick; pStateReal->compass_uTick_local_new = HAL_GetTick(); + compass_Inertia(pStateReal->lifeData.compass_heading); memcpy(pStateReal->lifeData.tissue_nitrogen_bar, dataIn.data[dataIn.boolTisssueData].tissue_nitrogen_bar,sizeof(pStateReal->lifeData.tissue_nitrogen_bar)); memcpy(pStateReal->lifeData.tissue_helium_bar, dataIn.data[dataIn.boolTisssueData].tissue_helium_bar,sizeof(pStateReal->lifeData.tissue_helium_bar));
--- a/Discovery/Src/settings.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/settings.c Sat Oct 10 16:59:18 2020 +0200 @@ -34,6 +34,7 @@ #include "tHome.h" // for CVIEW_END #include "motion.h" #include "t7.h" +#include "data_central.h" SSettings Settings; @@ -84,7 +85,7 @@ * There might even be entries with fixed values that have no range */ const SSettings SettingsStandard = { - .header = 0xFFFF001B, + .header = 0xFFFF001C, .warning_blink_dsec = 8 * 2, .lastDiveLogId = 0, .logFlashNextSampleStartAddress = 0, @@ -311,6 +312,7 @@ .cv_configuration = 0xFFFFFFFF, .MotionDetection = MOTION_DETECT_OFF, .cv_config_BigScreen = 0xFFFFFFFF, + .compassInertia = 0, }; /* Private function prototypes -----------------------------------------------*/ @@ -464,6 +466,9 @@ pSettings->cv_config_BigScreen &= pSettings->cv_configuration ^= 1 << CVIEW_T3_Navigation; pSettings->cv_config_BigScreen &= pSettings->cv_configuration ^= 1 << CVIEW_T3_DepthData; // no break + case 0xFFFF001B: + pSettings->compassInertia = 0; /* no inertia */ + // no break default: pSettings->header = pStandard->header; break; // no break before!! @@ -1377,6 +1382,12 @@ Settings.MotionDetection = MOTION_DETECT_OFF; #endif + if(Settings.compassInertia > MAX_COMPASS_COMP) + { + Settings.compassInertia = 0; + corrections++; + } + if(corrections > 255) return 255; else
--- a/Discovery/Src/t3.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/t3.c Sat Oct 10 16:59:18 2020 +0200 @@ -697,6 +697,7 @@ /* compass position */ point_t center; + uint16_t heading; // CVIEW_T3_StopWatch SDivetime Stopwatch = {0,0,0,0}; @@ -723,6 +724,15 @@ tempWinC2Y1 = tXc2->WindowY1; tempWinC2Tab = tXc2->WindowTab; + if(settingsGetPointer()->compassInertia) + { + heading = (uint16_t)compass_getCompensated(); + } + else + { + heading = (uint16_t)stateUsed->lifeData.compass_heading; + } + switch(tX_selection_customview) { case CVIEW_T3_ApnoeSurfaceInfo: @@ -905,9 +915,9 @@ center.y = 116; snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); GFX_write_string(&FontT42,tXc1,text,0); - snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); + snprintf(text,100,"\030\003%03i`",heading); GFX_write_string(&FontT105,tXc1,text,0); - t3_basics_compass(tXscreen, center, (uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); + t3_basics_compass(tXscreen, center, heading, stateUsed->diveSettings.compassHeading); break; case CVIEW_T3_Decostop: @@ -1103,10 +1113,9 @@ snprintf(text,TEXTSIZE,"\032\f%c%c",TXT_2BYTE, TXT2BYTE_Compass); GFX_write_string(&FontT42,tXc1,text,0); - //snprintf(text,100,"\030\003%03i`",(uint16_t)stateUsed->lifeData.compass_heading); - snprintf(text,100,"\030%03i`",(uint16_t)stateUsed->lifeData.compass_heading); + snprintf(text,100,"\030%03i`",heading); GFX_write_string(&FontT144,tXc1,text,0); - t3_basics_compass(tXscreen, center, (uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); + t3_basics_compass(tXscreen, center, heading, stateUsed->diveSettings.compassHeading); break;
--- a/Discovery/Src/t7.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/t7.c Sat Oct 10 16:59:18 2020 +0200 @@ -1634,6 +1634,7 @@ char text[256]; uint16_t textpointer = 0; + uint16_t heading = 0; int16_t start; uint8_t lineCountCustomtext = 0; int16_t shiftWindowY0; @@ -1677,15 +1678,6 @@ case CVIEW_CompassDebug: snprintf(text,100,"\032\f\001Compass raw"); GFX_write_string(&FontT42,&t7cH,text,0); -/* - pStateReal->lifeData.compass_heading = dataIn.data[dataIn.boolCompassData].compass_heading; - pStateReal->lifeData.compass_roll = dataIn.data[dataIn.boolCompassData].compass_roll; - pStateReal->lifeData.compass_pitch = dataIn.data[dataIn.boolCompassData].compass_pitch; - - pStateReal->lifeData.compass_DX_f = dataIn.data[dataIn.boolCompassData].compass_DX_f; - pStateReal->lifeData.compass_DY_f = dataIn.data[dataIn.boolCompassData].compass_DY_f; - pStateReal->lifeData.compass_DZ_f = dataIn.data[dataIn.boolCompassData].compass_DZ_f; -*/ snprintf(text,255,"%1.1f\n\r%1.1f\n\r%1.1f\n\r%i\n\r%i\n\r%i" ,stateUsed->lifeData.compass_heading ,stateUsed->lifeData.compass_roll @@ -1978,9 +1970,18 @@ case CVIEW_Compass: default: + + if(pSettings->compassInertia) + { + heading = (uint16_t)compass_getCompensated(); + } + else + { + heading = (uint16_t)stateUsed->lifeData.compass_heading; + } snprintf(text,100,"\032\f\001%c%c",TXT_2BYTE, TXT2BYTE_Compass); GFX_write_string(&FontT42,&t7cH,text,0); - t7_compass((uint16_t)stateUsed->lifeData.compass_heading, stateUsed->diveSettings.compassHeading); + t7_compass(heading, stateUsed->diveSettings.compassHeading); if(!pSettings->FlipDisplay) { @@ -1993,7 +1994,7 @@ t7cY0free.WindowY0 = 0; t7cY0free.WindowY1 = 250; } - snprintf(text,100,"\030\001%03i`",(uint16_t)stateUsed->lifeData.compass_heading); + snprintf(text,100,"\030\001%03i`",heading); GFX_write_string(&FontT54,&t7cY0free,text,0); if(!pSettings->FlipDisplay) { @@ -2747,6 +2748,7 @@ { uint8_t i, j, textptr, lineCount; char nextChar; + uint8_t alignmentChanged = 0; textptr = 0; lineCount = 0; @@ -2762,14 +2764,16 @@ do { nextChar = settingsGetPointer()->customtext[i+j]; - if(nextChar == '^') /* center */ + if((nextChar == '^') && (alignmentChanged == 0)) /* center */ { text[textptr++] = '\001'; + alignmentChanged = 1; i++; }else - if(nextChar == 180) /* '´' => Right */ + if((nextChar == 180) && (alignmentChanged == 0)) /* '�' => Right */ { text[textptr++] = '\002'; + alignmentChanged = 1; i++; }else { @@ -2798,6 +2802,7 @@ text[textptr++] = '\n'; text[textptr++] = '\r'; } + alignmentChanged = 0; lineCount++; for(uint8_t k=0;k<2;k++) {
--- a/Discovery/Src/tMenuEditHardware.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/tMenuEditHardware.c Sat Oct 10 16:59:18 2020 +0200 @@ -54,6 +54,7 @@ uint8_t OnAction_Compass (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); uint8_t OnAction_Bearing (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); uint8_t OnAction_BearingClear (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); +uint8_t OnAction_InertiaLevel (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); //uint8_t OnAction_ExitHardw (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); uint8_t OnAction_Sensor1 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); uint8_t OnAction_Sensor2 (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action); @@ -147,6 +148,7 @@ { uint16_t heading; char text[32]; + uint8_t textIndex = 0; text[0] = '\001'; text[1] = TXT_2BYTE; @@ -154,13 +156,27 @@ text[3] = 0; write_topline(text); - heading = (uint16_t)stateUsed->lifeData.compass_heading; + if(settingsGetPointer()->compassInertia) + { + heading = (uint16_t)compass_getCompensated(); + } + else + { + heading = (uint16_t)stateUsed->lifeData.compass_heading; + } snprintf(text,32,"\001%03i`",heading); write_label_var( 0, 800, ME_Y_LINE1, &FontT54, text); tMenuEdit_refresh_field(StMHARD2_Compass_SetCourse); tMenuEdit_refresh_field(StMHARD2_Compass_Calibrate); tMenuEdit_refresh_field(StMHARD2_Compass_ResetCourse); + text[textIndex++] = TXT_2BYTE; + text[textIndex++] = TXT2BYTE_CompassInertia; + text[textIndex++] = ':'; + text[textIndex++] = ' '; + text[textIndex++] = '0' + settingsGetPointer()->compassInertia; + + write_label_var(30, 800, ME_Y_LINE5, &FontT48, text); write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); } @@ -168,12 +184,13 @@ void openEdit_Compass(void) { - char text[4]; + char text[10]; + uint8_t textIndex = 0; - text[0] = '\001'; - text[1] = TXT_2BYTE; - text[2] = TXT2BYTE_Compass; - text[3] = 0; + text[textIndex++] = '\001'; + text[textIndex++] = TXT_2BYTE; + text[textIndex++] = TXT2BYTE_Compass; + text[textIndex++] = 0; write_topline(text); text[0] = TXT_2BYTE; @@ -188,9 +205,18 @@ text[1] = TXT2BYTE_ResetBearing; write_field_button(StMHARD2_Compass_ResetCourse, 30, 800, ME_Y_LINE4, &FontT48, text); + text[1] = TXT2BYTE_CompassInertia; + textIndex = 2; + text[textIndex++] = ':'; + text[textIndex++] = ' '; + text[textIndex++] = '0' + settingsGetPointer()->compassInertia; + + write_field_button(StMHARD2_Compass_Inertia, 30, 800, ME_Y_LINE5, &FontT48, text); + setEvent(StMHARD2_Compass_SetCourse, (uint32_t)OnAction_Bearing); setEvent(StMHARD2_Compass_Calibrate, (uint32_t)OnAction_Compass); setEvent(StMHARD2_Compass_ResetCourse, (uint32_t)OnAction_BearingClear); + setEvent(StMHARD2_Compass_Inertia, (uint32_t)OnAction_InertiaLevel); write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); } @@ -218,6 +244,20 @@ return UPDATE_AND_EXIT_TO_MENU; } + +uint8_t OnAction_InertiaLevel (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) +{ + uint8_t newLevel = 0; + + newLevel = settingsGetPointer()->compassInertia + 1; + if(newLevel > MAX_COMPASS_COMP) + { + newLevel = 0; + } + settingsGetPointer()->compassInertia = newLevel; + return UPDATE_DIVESETTINGS; +} + /* uint8_t OnAction_ExitHardw (uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) {
--- a/Discovery/Src/text_multilanguage.c Sat Oct 10 13:51:44 2020 +0200 +++ b/Discovery/Src/text_multilanguage.c Sat Oct 10 16:59:18 2020 +0200 @@ -177,6 +177,13 @@ static uint8_t text_IT_CompassCalib[] = "Calibrazione bussola"; static uint8_t text_ES_CompassCalib[] = "Calibrar brújula"; +static uint8_t text_EN_CompassInertia[] = "Compass inertia level"; +static uint8_t text_DE_CompassInertia[] = "Kompass Trägheitsfaktor"; +static uint8_t text_FR_CompassInertia[] = ""; +static uint8_t text_IT_CompassInertia[] = ""; +static uint8_t text_ES_CompassInertia[] = ""; + + // Menu SYS1 and Customview header static uint8_t text_EN_Compass[] = "Compass"; static uint8_t text_DE_Compass[] = "Kompass"; @@ -1577,7 +1584,7 @@ static uint8_t text_IT_SelectCustom[] = ""; static uint8_t text_ES_SelectCustom[] = ""; -static uint8_t text_EN_SelectBigFont[] = "Select bigfont data views"; +static uint8_t text_EN_SelectBigFont[] = "Select big font data views"; static uint8_t text_DE_SelectBigFont[] = "Auswahl Grosschrift Daten"; static uint8_t text_FR_SelectBigFont[] = ""; static uint8_t text_IT_SelectBigFont[] = ""; @@ -1724,7 +1731,8 @@ {(uint8_t)TXT2BYTE_SpecialDiveGasMenu,{text_EN_SpecialDiveGasMenu, text_DE_SpecialDiveGasMenu, text_FR_SpecialDiveGasMenu, text_IT_SpecialDiveGasMenu, text_ES_SpecialDiveGasMenu}}, {(uint8_t)TXT2BYTE_SpecialDiveGasMenuCCR,{text_EN_SpecialDiveGasMenuCCR, text_DE_SpecialDiveGasMenuCCR, text_FR_SpecialDiveGasMenuCCR, text_IT_SpecialDiveGasMenuCCR, text_ES_SpecialDiveGasMenuCCR}}, {(uint8_t)TXT2BYTE_CompassCalib, {text_EN_CompassCalib, text_DE_CompassCalib, text_FR_CompassCalib, text_IT_CompassCalib, text_ES_CompassCalib}}, - {(uint8_t)TXT2BYTE_UseSensor, {text_EN_UseSensor, text_DE_UseSensor, text_FR_UseSensor, text_IT_UseSensor, text_ES_UseSensor}}, + {(uint8_t)TXT2BYTE_CompassInertia, {text_EN_CompassInertia, text_DE_CompassInertia, text_FR_CompassInertia, text_IT_CompassInertia, text_ES_CompassInertia}}, + {(uint8_t)TXT2BYTE_UseSensor, {text_EN_UseSensor, text_DE_UseSensor, text_FR_UseSensor, text_IT_UseSensor, text_ES_UseSensor}}, {(uint8_t)TXT2BYTE_WarnDecoMissed, {text_EN_WarnDecoMissed, text_DE_WarnDecoMissed, text_FR_WarnDecoMissed, text_IT_WarnDecoMissed, text_ES_WarnDecoMissed}}, {(uint8_t)TXT2BYTE_WarnPPO2Low, {text_EN_WarnPPO2Low, text_DE_WarnPPO2Low, text_FR_WarnPPO2Low, text_IT_WarnPPO2Low, text_ES_WarnPPO2Low}}, {(uint8_t)TXT2BYTE_WarnPPO2High, {text_EN_WarnPPO2High, text_DE_WarnPPO2High, text_FR_WarnPPO2High, text_IT_WarnPPO2High, text_ES_WarnPPO2High}},