Mercurial > public > ostc4
diff Common/Inc/data_central.h @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | cc9c18075e00 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Common/Inc/data_central.h Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,481 @@ +/////////////////////////////////////////////////////////////////////////////// +/// -*- coding: UTF-8 -*- +/// +/// \file Common/Inc/data_central.h +/// \brief Common Dadatypes Declarations +/// \author Heinrichs Weikamp +/// \date 2018 +/// +/// $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/>. +////////////////////////////////////////////////////////////////////////////// + +#ifndef DATA_CENTRAL_H +#define DATA_CENTRAL_H + +#include <stdint.h> + +#include "settings.h" +#include "stm32f4xx_hal.h" + +#define BUEHLMANN_STRUCT_MAX_GASES 11 +#define BUEHLMANN_STRUCT_MAX_ASCENDRATES 3 +#define DECOINFO_STRUCT_MAX_STOPS 50 + +#define false 0 +#define true 1 + +/* Helper structs ------------------------------------------------------------*/ + +//struct SGas +//contains gasinfos of single gas for deco calculation +typedef struct +{ + uint8_t nitrogen_percentage; + uint8_t helium_percentage; + uint8_t setPoint_cbar; + uint8_t change_during_ascent_depth_meter_otherwise_zero; + uint8_t GasIdInSettings; + uint8_t temp1_for16bitalign; +} SGas; + +typedef struct +{ + float use_from_depth_bar; + float rate_bar_per_minute; +} SAscentrate; + + +typedef struct{ + uint32_t date_rtc_dr; + uint32_t time_rtc_tr; + int32_t value_int32; +} SDeviceLine; + + +typedef struct +{ + uint16_t ageInMilliSeconds; + uint8_t numberOfBytes; + uint8_t status; + uint8_t data[12]; +} SDataWireless; + +/* Main structs -------------------------------------------------------------*/ + + +//struct SDecoinfo +//contains result of deco calculation +typedef struct +{ + unsigned short output_stop_length_seconds[DECOINFO_STRUCT_MAX_STOPS]; + int output_time_to_surface_seconds; + int output_ndl_seconds; + float output_ceiling_meter; + float output_relative_gradient; + uint32_t tickstamp; +} SDecoinfo; + + +typedef struct +{ + //crushing pressure + //in/out + float max_crushing_pressure_he[16]; + float max_crushing_pressure_n2[16]; + // + float run_time_start_of_deco_zone_save; + float depth_start_of_deco_zone_save; + float max_first_stop_depth_save; + short decomode_vpm_plus_conservatism_last_dive; + _Bool deco_zone_reached; + //State variables for repetetive dives + _Bool repetitive_variables_not_valid; + float adjusted_crushing_pressure_he[16]; + float adjusted_crushing_pressure_n2[16]; + float adjusted_critical_radius_he[16]; + float adjusted_critical_radius_n2[16]; + float initial_allowable_gradient_he[16]; + float initial_allowable_gradient_n2[16]; + float max_actual_gradient[16]; +} SVpm; + +typedef struct +{ + _Bool repetitive_variables_not_valid; + _Bool is_data_from_RTE_CPU; + _Bool spare2; + _Bool spare3; + float adjusted_crushing_pressure_he[16]; + float adjusted_crushing_pressure_n2[16]; + float adjusted_critical_radius_he[16]; + float adjusted_critical_radius_n2[16]; + float initial_allowable_gradient_he[16]; + float initial_allowable_gradient_n2[16]; + float max_actual_gradient[16]; +} SVpmRepetitiveData; + +//struct SDevice +//contains information about usage +typedef struct +{ + SDeviceLine batteryChargeCycles; + SDeviceLine batteryChargeCompleteCycles; + SDeviceLine temperatureMinimum; + SDeviceLine temperatureMaximum; + SDeviceLine depthMaximum; + SDeviceLine diveCycles; + SDeviceLine voltageMinimum; + SDeviceLine hoursOfOperation; + SDeviceLine diveAccident; +} SDevice; + +/* +typedef struct +{ + SDevice device; + SVpmRepetitiveData vpm; +} SDeviceState; +*/ + +typedef struct +{ + uint32_t average_depth_meter_Count; + uint32_t average_depth_last_update_dive_time_seconds_without_surface_time; + int32_t stopwatch_start_at_this_dive_time_seconds; +} SHelper; + +/* struct SLifeData + * contains data all actual data (pressure, stuturation, etc. as received from second ship + * and has actualGas to be send to Small CPU (second chip) + * contains data calculated from actual data after receiption from Small CPU + */ +typedef struct +{ + /* from Small CPU */ + int32_t dive_time_seconds; + int32_t dive_time_seconds_without_surface_time; + uint32_t surface_time_seconds; + float pressure_ambient_bar; + float pressure_surface_bar; + float tissue_nitrogen_bar[16]; + float tissue_helium_bar[16]; + float cns; + float otu; + uint16_t desaturation_time_minutes; + uint16_t no_fly_time_minutes; + float temperature_celsius; + float compass_heading; + float compass_roll; + float compass_pitch; + int16_t compass_DX_f; + int16_t compass_DY_f; + int16_t compass_DZ_f; + uint16_t counterSecondsShallowDepth; + float ascent_rate_meter_per_min; + uint32_t timeBinaryFormat; + uint32_t dateBinaryFormat; + float battery_voltage; + float battery_charge; + uint16_t ambient_light_level; + SDataWireless wireless_data[4]; + uint8_t buttonPICdata[4]; + + /* by create DiveSettings() and by setActualGas() + * is send to Small CPU2 for nitrogen calculation + * includes setpoint information + */ + SGas actualGas; + uint8_t lastDiluent_GasIdInSettings; + uint8_t gas_temp2; + + /* calculated by DataEX_copy_to_LifeData() + bottle_bar array size is made like this to have multiples of 32bit + */ + float ppO2; + float depth_meter; + float max_depth_meter; + float average_depth_meter; + float apnea_total_max_depth_meter; + float apnea_last_max_depth_meter; + int32_t apnea_last_dive_time_seconds; + int32_t stopwatch_seconds; + uint16_t bottle_bar[2 * NUM_GASES +1]; + uint16_t bottle_bar_age_MilliSeconds[2 * NUM_GASES + 1]; + uint16_t apnea_total_counter; + + uint8_t scooterSpeed; + uint8_t scooterType; + uint16_t scooterWattstunden; + uint16_t scooterDrehzahl; + uint8_t scooterRestkapazitaet; + uint8_t scooterAmpere; + uint16_t scooterTemperature; + uint16_t scooterAgeInMilliSeconds; + float scooterSpannung; + uint8_t scooterRestkapazitaetWhBased; + uint8_t scooterRestkapazitaetVoltageBased; + + /* control of DataEX_copy_to_LifeData() + */ + uint8_t boolResetAverageDepth; + uint8_t boolResetStopwatch; + uint8_t bool_temp1; + uint8_t bool_temp2; + +/* from local sensor or direct HUD communication */ + //pp O2 Sensor + float ppO2Sensor_bar[3]; + float sensorVoltage_mV[3]; + float HUD_battery_voltage_V; + + /* used by DataEX_copy_to_LifeData() + */ + SHelper internal; +} SLifeData; + + +typedef struct +{ + uint16_t tissue_nitrogen_desaturation_time_minutes[16]; + uint16_t tissue_helium_desaturation_time_minutes[16]; +} SLifeData2; + + +typedef struct +{ + //warnings + int8_t decoMissed; + int8_t aGf; + int8_t ascentRateHigh; + int8_t ppO2Low; + int8_t ppO2High; + int8_t cnsHigh; + int8_t slowWarning; + int8_t lowBattery; + int8_t numWarnings; + int8_t sensorLinkLost; + int8_t sensorOutOfBounds[3]; + int8_t betterGas; + int8_t fallback; + int8_t betterSetpoint; +} SWarnings; + + +typedef struct +{ + //Events logbook only + int16_t manualMarker; + int16_t gasChange; + int16_t info_GasChange; + int16_t setpointChange; + int16_t info_SetpointChange; + int16_t manuelGasSet; + int16_t info_manuelGasSetHe; + int16_t info_manuelGasSetO2; + int16_t bailout; + int16_t info_bailoutHe; + int16_t info_bailoutO2; +} SEvents; + + + +//struct SDiveSettings +//contains settings necessary for deco calculation +typedef struct +{ + float last_stop_depth_bar; + float input_next_stop_increment_depth_bar; + float input_second_to_last_stop_depth_bar; + float ascentRate_meterperminute; + uint8_t diveMode; /* OC, CC, .. */ + uint8_t CCR_Mode; + uint8_t future_TTS_minutes; + + /* If beginning of dive is CCR than ccrOption is set true + * true allows returning from bailout (OC) back to CCR + * true activates CC gas and setpoint pages in dive menu + */ + uint8_t ccrOption; + uint8_t fallbackOption; + uint8_t ppo2sensors_deactivated; + + split2x4_Type deco_type; /* GF or VPM for standard and alternative seperate */ + + /* VPM conservatism, do not change during dive!!! + * do not change in between dives otherwise repetitve dive is not possible + */ + uint8_t vpm_conservatism; + + /* B�hlmann GF + * and a variable that is used by Buehlmann during the dive + * to remember the position of GF low during ascend + */ + uint8_t gf_high; + uint8_t gf_low; + + /* copy of the Settings GasList and SetpintList + * that can be modified during the dive + * especially gases can be actived and deactivated + * gas[0] and setpoint[0] are the special ones configurable during the dive + */ + SGasLine gas[1 + (2*NUM_GASES)]; + SSetpointLine setpoint[1 + NUM_GASES]; + + /* List of GasChanges in the actual order + * this is necessary for VPM and Buehlmann and will be created on start of each calculation + */ + SGas decogaslist[BUEHLMANN_STRUCT_MAX_GASES]; // unused filled with 0xFF + + /* + */ + float internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero; + uint16_t compassHeading; + } SDiveSettings; + +enum CHARGE_STATUS{ + CHARGER_off = 0, + CHARGER_running, + CHARGER_complete, + CHARGER_lostConnection +}; + +typedef struct +{ + SDiveSettings diveSettings; + SLifeData lifeData; + SVpm vpm; + SEvents events; + SWarnings warnings; + SDecoinfo decolistVPM; + SDecoinfo decolistFutureVPM; + SDecoinfo decolistBuehlmann; // + SDecoinfo decolistFutureBuehlmann; + uint8_t mode; /* hw for sleep, surface, dive, .. */ + uint8_t chargeStatus; + uint8_t data_old__lost_connection_to_slave; + + uint32_t pressure_uTick_new; + uint32_t compass_uTick_new; + + uint32_t pressure_uTick_old; + uint32_t compass_uTick_old; + + uint32_t pressure_uTick_local_new; + uint32_t compass_uTick_local_new; + + uint8_t cnsHigh_at_the_end_of_dive; + uint8_t decoMissed_at_the_end_of_dive; + + uint8_t sensorErrorsRTE; + + uint8_t lastKnownBatteryPercentage; +} SDiveState; + + +typedef struct{ +uint8_t bit0:1; +uint8_t bit1:1; +uint8_t bit2:1; +uint8_t bit3:1; +uint8_t bit4:1; +uint8_t bit5:1; +uint8_t bit6:1; +uint8_t bit7:1; +} ubit8_t; + +typedef union{ +ubit8_t ub; +uint8_t uw; +} bit8_Type; + +//extern SDiveState stateReal; only via const SDiveState stateRealGetPointer(void); +extern SDiveState stateSim; +extern SDiveState stateDeco; +extern uint8_t decoLock; +extern const SDiveState * stateUsed; +extern SLifeData2 secondaryInformation; + + +enum DECO_LOCK{ + DECO_CALC_running, + DECO_CALC_ready, + DECO_CALC_FINSHED_Buehlmann, + DECO_CALC_FINSHED_vpm, + DECO_CALC_FINSHED_FutureBuehlmann, + DECO_CALC_FINSHED_Futurevpm, + DECO_CALC_init_as_is_start_of_dive, + DECO_CALC_undefined +}; + +uint32_t time_elapsed_ms(uint32_t ticksstart,uint32_t ticksnow); + +void set_stateUsedToSim(void); +void set_stateUsedToReal(void); + +_Bool is_stateUsedSetToSim(void); + +const SDiveState * stateRealGetPointer(void); +const SDiveState * stateSimGetPointer(void); +SDiveState * stateRealGetPointerWrite(void); +SDiveState * stateSimGetPointerWrite(void); +const SDevice * stateDeviceGetPointer(void); +SDevice * stateDeviceGetPointerWrite(void); +const SVpmRepetitiveData * stateVpmRepetitiveDataGetPointer(void); +SVpmRepetitiveData * stateVpmRepetitiveDataGetPointerWrite(void); + +void UpdateLifeDataTest(SDiveState * diveState); + +void setSimulationValues(int _ascent_rate_meter_per_min, int _descent_rate_meter_per_min, int _max_depth, int _bottom_time ); + +void createDiveSettings(void); +void copyDiveSettingsToSim(void); +void copyVpmRepetetiveDataToSim(void); +//void fallbackToFixedSetpoints(SLifeData *lifeData); +void setActualGasFirst(SLifeData *lifeData); +void setActualGasAir(SLifeData *lifeData); +void setActualGas(SLifeData *lifeData, uint8_t gasId, uint8_t setpoint_cbar); +void setActualGas_ExtraGas(SLifeData *lifeData, uint8_t oxygen, uint8_t helium, uint8_t setpoint_cbar); +void setActualGas_DM(SLifeData *lifeData, uint8_t gasId, uint8_t setpoint_cbar); +void setWeekday(RTC_DateTypeDef *sDate); +void setDate(RTC_DateTypeDef Sdate); +void setTime(RTC_TimeTypeDef Stime); +void setBatteryPercentage(uint8_t newChargePercentage); +void setButtonResponsiveness(uint8_t *ButtonSensitivyList); +void calibrateCompass(void); +void clearDeco(void); +void translateDate(uint32_t datetmpreg, RTC_DateTypeDef *sDate); +void translateTime(uint32_t tmpreg, RTC_TimeTypeDef *sTime); +void updateSetpointStateUsed(void); + +uint8_t calc_MOD(uint8_t gasId); +uint8_t calc_MinOD(uint8_t gasId); +//float calc_ppO2(float input_ambient_pressure_bar, SGas* pGas); +int current_second(void); +_Bool vpm_crush(SDiveState* pDiveState); +_Bool deco_zone_reached(void); +void resetEvents(void); + +uint32_t crc32c_checksum(uint8_t* message, uint16_t length, uint8_t* message2, uint16_t length2); +uint32_t CRC_CalcBlockCRC(uint32_t *buffer, uint32_t words); +uint32_t CRC_CalcBlockCRC_moreThan768000(uint32_t *buffer1, uint32_t *buffer2, uint32_t words); + +_Bool is_ambient_pressure_close_to_surface(SLifeData *lifeData); + +uint8_t stateUsed_scooterRemainingBattCapacity(void); + +#endif // DATA_CENTRAL_H