comparison Discovery/Src/data_exchange_main.c @ 177:458f16cda15c

Merged in janlmulder/ostc4/max-depth (pull request #3) Bugfix: make max depth move with current depth Approved-by: heinrichsweikamp <bitbucket@heinrichsweikamp.com>
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Tue, 12 Mar 2019 15:04:19 +0000
parents 05c770dc2911
children 8b8074080d7b
comparison
equal deleted inserted replaced
172:c659fda83e44 177:458f16cda15c
71 #include "timer.h" 71 #include "timer.h"
72 #include "buehlmann.h" 72 #include "buehlmann.h"
73 #include "externLogbookFlash.h" 73 #include "externLogbookFlash.h"
74 74
75 75
76 /* Expoted variables --------------------------------------------------------*/ 76 /* Exported variables --------------------------------------------------------*/
77 uint8_t wasPowerOn = 0; 77 uint8_t wasPowerOn = 0;
78 confirmbit8_Type requestNecessary = { .uw = 0 }; 78 confirmbit8_Type requestNecessary = { .uw = 0 };
79 uint8_t wasUpdateNotPowerOn = 0; 79 uint8_t wasUpdateNotPowerOn = 0;
80 80
81 /* Private variables with external access ------------------------------------*/ 81 /* Private variables with external access ------------------------------------*/
747 data_old__lost_connection_to_slave_counter_total += 1; 747 data_old__lost_connection_to_slave_counter_total += 1;
748 } 748 }
749 } 749 }
750 } 750 }
751 751
752 #define AVERAGE_COUNT 4
753 static float getSampleDepth(SDataExchangeSlaveToMaster *d, SDiveState *ds)
754 {
755 static uint8_t c = 0;
756 static float ambient[AVERAGE_COUNT] = {0};
757 static float surface[AVERAGE_COUNT]= {0};
758 static float depth[AVERAGE_COUNT]= {0};
759
760 ambient[c] = d->data[d->boolPressureData].pressure_mbar / 1000.0f;
761 surface[c] = d->data[d->boolPressureData].surface_mbar / 1000.0f;
762 float density = ((float)( 100 + settingsGetPointer()->salinity)) / 100.0f;
763
764 ds->lifeData.pressure_ambient_bar = (ambient[0] + ambient[1] + ambient[2] + ambient[3])/4.0f;
765 ds->lifeData.pressure_surface_bar = (surface[0] + surface[1] + surface[2] + surface[3])/4.0f;
766 depth[c] = (ambient[c] - surface[c]) / (0.09807f * density);
767
768 c++;
769 if (c == AVERAGE_COUNT) c = 0;
770
771 return (depth[0] + depth[1] + depth[2] + depth[3])/4.0f;
772 }
752 773
753 void DataEX_copy_to_LifeData(_Bool *modeChangeFlag) 774 void DataEX_copy_to_LifeData(_Bool *modeChangeFlag)
754 { 775 {
755 SDiveState * pStateReal = stateRealGetPointerWrite(); 776 SDiveState *pStateReal = stateRealGetPointerWrite();
756 static uint16_t getDeviceDataAfterStartOfMainCPU = 20; 777 static uint16_t getDeviceDataAfterStartOfMainCPU = 20;
757 778
758 /* internal sensor: HUD data 779 /* internal sensor: HUD data
759 */ 780 */
760 for(int i=0;i<3;i++) 781 for(int i=0;i<3;i++)
778 else 799 else
779 pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] += 100; 800 pStateReal->lifeData.bottle_bar_age_MilliSeconds[i] += 100;
780 } 801 }
781 } 802 }
782 803
783 /* Why? hw 8.6.2015
784 if(DataEX_check_header_and_footer_ok() && dataIn.power_on_reset)
785 {
786 return;
787 }
788 */
789 if(!DataEX_check_header_and_footer_ok()) 804 if(!DataEX_check_header_and_footer_ok())
790 { 805 {
791 if(DataEX_check_header_and_footer_devicedata()) 806 if(DataEX_check_header_and_footer_devicedata())
792 { 807 {
793 DataEX_copy_to_DeviceData(); 808 DataEX_copy_to_DeviceData();
836 851
837 if(requestNecessary.ub.button == 1) 852 if(requestNecessary.ub.button == 1)
838 { 853 {
839 setButtonResponsiveness(settingsGetPointer()->ButtonResponsiveness); 854 setButtonResponsiveness(settingsGetPointer()->ButtonResponsiveness);
840 } 855 }
841 /*
842 }
843 if((dataIn.confirmRequest.ub.clearDeco != 1) && (requestNecessary.ub.clearDeco == 1))
844 {
845 clearDeco(); // is dataOut.clearDecoNow = 1;
846 }
847 */
848 } 856 }
849 requestNecessary.uw = 0; // clear all 857 requestNecessary.uw = 0; // clear all
850 858
851 float ambient, surface, density, meter; 859 float meter = 0;
852 SSettings *pSettings; 860 SSettings *pSettings;
853
854 ambient = 0;
855 surface = 0;
856 meter = 0;
857 861
858 /* uint8_t IAmStolenPleaseKillMe; 862 /* uint8_t IAmStolenPleaseKillMe;
859 */ 863 */
860 pSettings = settingsGetPointer(); 864 pSettings = settingsGetPointer();
861 865
867 dataIn.mode = MODE_DIVE; 871 dataIn.mode = MODE_DIVE;
868 } 872 }
869 873
870 if(pStateReal->data_old__lost_connection_to_slave == 0) 874 if(pStateReal->data_old__lost_connection_to_slave == 0)
871 { 875 {
872 ambient = dataIn.data[dataIn.boolPressureData].pressure_mbar / 1000.0f; 876 meter = getSampleDepth(&dataIn, pStateReal);
873 surface = dataIn.data[dataIn.boolPressureData].surface_mbar / 1000.0f;
874
875 density = ((float)( 100 + pSettings->salinity)) / 100.0f;
876 meter = (ambient - surface);
877 meter /= (0.09807f * density);
878
879 877
880 pStateReal->pressure_uTick_old = pStateReal->pressure_uTick_new; 878 pStateReal->pressure_uTick_old = pStateReal->pressure_uTick_new;
881 pStateReal->pressure_uTick_new = dataIn.data[dataIn.boolPressureData].pressure_uTick; 879 pStateReal->pressure_uTick_new = dataIn.data[dataIn.boolPressureData].pressure_uTick;
882 pStateReal->pressure_uTick_local_new = HAL_GetTick(); 880 pStateReal->pressure_uTick_local_new = HAL_GetTick();
883
884 /* what was the code behind this if statement ? */
885 /* if(ambient < (surface + 0.04f)) */
886 881
887 pStateReal->lifeData.dateBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_dr; 882 pStateReal->lifeData.dateBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_dr;
888 pStateReal->lifeData.timeBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_tr; 883 pStateReal->lifeData.timeBinaryFormat = dataIn.data[dataIn.boolTimeData].localtime_rtc_tr;
889 } 884 }
890 dataOut.setAccidentFlag = 0; 885 dataOut.setAccidentFlag = 0;
931 dataOut.setAccidentFlag += ACCIDENT_DECOSTOP; 926 dataOut.setAccidentFlag += ACCIDENT_DECOSTOP;
932 } 927 }
933 pStateReal->mode = dataIn.mode; 928 pStateReal->mode = dataIn.mode;
934 pStateReal->chargeStatus = dataIn.chargeStatus; 929 pStateReal->chargeStatus = dataIn.chargeStatus;
935 930
936 pStateReal->lifeData.pressure_ambient_bar = ambient;
937 pStateReal->lifeData.pressure_surface_bar = surface;
938 if(is_ambient_pressure_close_to_surface(&pStateReal->lifeData)) 931 if(is_ambient_pressure_close_to_surface(&pStateReal->lifeData))
939 { 932 {
940 pStateReal->lifeData.depth_meter = 0; 933 pStateReal->lifeData.depth_meter = 0;
941 } 934 }
942 else 935 else
969 if(settingsGetPointer()->FlipDisplay) /* consider that diver is targeting into the opposite direction */ 962 if(settingsGetPointer()->FlipDisplay) /* consider that diver is targeting into the opposite direction */
970 { 963 {
971 pStateReal->lifeData.compass_heading -= 180.0; 964 pStateReal->lifeData.compass_heading -= 180.0;
972 if (pStateReal->lifeData.compass_heading < 0) pStateReal->lifeData.compass_heading +=360.0; 965 if (pStateReal->lifeData.compass_heading < 0) pStateReal->lifeData.compass_heading +=360.0;
973 } 966 }
974
975 967
976 pStateReal->lifeData.compass_roll = dataIn.data[dataIn.boolCompassData].compass_roll; 968 pStateReal->lifeData.compass_roll = dataIn.data[dataIn.boolCompassData].compass_roll;
977 pStateReal->lifeData.compass_pitch = dataIn.data[dataIn.boolCompassData].compass_pitch; 969 pStateReal->lifeData.compass_pitch = dataIn.data[dataIn.boolCompassData].compass_pitch;
978 970
979 pStateReal->lifeData.compass_DX_f = dataIn.data[dataIn.boolCompassData].compass_DX_f; 971 pStateReal->lifeData.compass_DX_f = dataIn.data[dataIn.boolCompassData].compass_DX_f;
1054 { 1046 {
1055 if(pStateReal->lifeData.max_depth_meter > 1.5f) 1047 if(pStateReal->lifeData.max_depth_meter > 1.5f)
1056 { 1048 {
1057 pStateReal->lifeData.apnea_last_max_depth_meter = pStateReal->lifeData.max_depth_meter; 1049 pStateReal->lifeData.apnea_last_max_depth_meter = pStateReal->lifeData.max_depth_meter;
1058 } 1050 }
1059 // eset max_depth_meter, average_depth_meter and internal values 1051 // reset max_depth_meter, average_depth_meter and internal values
1060 pStateReal->lifeData.max_depth_meter = 0; 1052 pStateReal->lifeData.max_depth_meter = 0;
1061 pStateReal->lifeData.boolResetAverageDepth = 1; 1053 pStateReal->lifeData.boolResetAverageDepth = 1;
1062 pStateReal->lifeData.boolResetStopwatch = 1; 1054 pStateReal->lifeData.boolResetStopwatch = 1;
1063 } 1055 }
1064 } 1056 }