Index: NVDataMgmt.c =================================================================== diff -u -r1d4945e7608e24b685f54368d0791455ef2f48be -r7afc56a34c697e69faedaeffb3910b12d7d0628f --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 1d4945e7608e24b685f54368d0791455ef2f48be) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 7afc56a34c697e69faedaeffb3910b12d7d0628f) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. @@ -115,13 +115,19 @@ // HD specific defines #ifdef _HD_ +#define BLOOD_LEAK_DEFAULT_SET_POINT 20 ///< Blood leak default set point. #endif // DG specific defines #ifdef _DG_ #define FLUSH_LINES_DEFAULT_VOLUME_L 0.01 ///< Water volume to flush when starting re-circulate mode in liters. #define ACID_CONC_DEFAULT_MIXING_RATIO ( 2.35618 / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and acid concentrate mixing ratio. #define BICARB_CONC_DEFAULT_MIXING_RATIO ( 4.06812 / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and bicarbonate concentrate mixing ratio. +#define PRES_SENSORS_RESERVED_SPACE_COUNT 6 ///< Pressure sensors reserved space count. +#define FLOW_SENSROS_RESERVED_SPACE_COUNT 3 ///< Flow sensors reserved space count. +#define TEMP_SENSORS_RESERVED_SPACE_COUNT 5 ///< Temperature sensors reserved space count. +#define COND_SENSORS_RESERVED_SPACE_COUNT 2 ///< Conductivity sensors reserved space count. +#define GENERIC_VOL_RESERVED_SPACE_COUNT 4 ///< Generic volumes reserved space count. #endif /// NVDataMgmt self-test states enumeration. @@ -229,8 +235,8 @@ U32 sizeofJob; ///< Jobs spec size of job. U32 maxWriteBufferSize; ///< Jobs max write allowed processing buffer size. U32 maxReadBufferSize; ///< Jobs max read allowed processing buffer size. - U08* structAddressPtr; - U08* structCRCPtr; + U08* structAddressPtr; ///< Jobs structure address pointer. + U08* structCRCPtr; ///< Jobs structure CRC pointer. } PROCESS_RECORD_SPECS_T; /// Process records job structure @@ -290,7 +296,7 @@ DG_BICARB_CONCENTRATES_RECORD_T bicarbConcentratesRecord; ///< DG bicarb concentrates. DG_FILTERS_CAL_RECORD_T filtersRecord; ///< DG filters. DG_FANS_CAL_RECORD_T fansRecord; ///< DG fans. - DG_ACCELEROMETER_SENSOR_CAL_RECORD_T accelerometerCalRecord; ///< DG accelerometer sensor. + DG_ACCEL_SENSOR_CAL_RECORD_T accelerometerSensorCalRecord; ///< DG accelerometer sensor. } DG_CALIBRATION_GROUPS_T; /// DG calibration records structure @@ -359,7 +365,8 @@ HD_PRESSURE_SENSORS_CAL_RECORD_T pressureSensorsCalRecord; ///< HD pressure sensors. HD_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< HD temperature sensors. HD_HEPARIN_FORCE_SENSOR_CAL_RECORD_T heparinForceSensorCalRecord; ///< HD heparin force sensor. - HD_ACCELEROMETER_SENSOR_CAL_RECORD_T accelerometerCalRecord; ///< HD accelerometer sensor. + HD_ACCELEROMETER_SENSOR_CAL_RECORD_T accelerometerSensorCalRecord; ///< HD accelerometer sensor. + HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T bloodLeakSensorCalRecord; ///< HD blood leak sensor. } HD_CALIBRATION_GROUPS; /// HD calibration records structure @@ -524,9 +531,6 @@ // Record check helper functions static BOOL areRecordsValid( void ); static BOOL isPolynomialRecordValid( POLYNOMIAL_CAL_PAYLOAD_T* record ); -#ifdef _DG -static void setRsrvdCalibrationRecordsToZero( void ); -#endif #ifdef _DG_ static BOOL isDGSystemRecordValid( void ); @@ -543,7 +547,7 @@ static BOOL isDGBicarbConcentrateRecordValid( DG_BICARB_CONCENTRATE_T* record ); static BOOL isDGFilterRecordValid( DG_FILTER_CAL_RECORD_T* record ); static BOOL isDGFanRecordValid( DG_FAN_CAL_RECORD_T* record ); -static BOOL isDGAccelerometerSensorRecordValid( DG_ACCELEROMETER_SENSOR_CAL_RECORD_T* record ); +static BOOL isDGAccelerometerSensorRecordValid( DG_ACCEL_SENSOR_CAL_RECORD_T* record ); #endif #ifdef _HD_ @@ -553,6 +557,7 @@ static BOOL isHDValveRecordValid( HD_VALVE_CAL_PAYLOAD_T* record ); static BOOL isHDPumpRecordValid( HD_PUMP_CAL_PAYLOAD_T* record ); static BOOL isHDAccelerometerSensorValid( HD_ACCELEROMETER_SENSOR_CAL_RECORD_T* record ); +static BOOL isHDBloodLeakSesnorValid( HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); #endif /*********************************************************************//** @@ -1231,65 +1236,139 @@ * new calibration availability. * @details Inputs: none * @details Outputs: none - * @return isNewCalAvailable which is TRUE is cal is available, otherwise - * FALSE + * @return isNewCalAvailable which is TRUE if new calibration is available, + * otherwise FALSE *************************************************************************/ BOOL isNewCalibrationRecordAvailable( void ) { return isNewCalAvailable; } -#ifdef _DG_ /*********************************************************************//** * @brief - * The getDGPressureSensorsCalibrationRecord function returns the DG pressure - * sensors record. - * @details Inputs: none - * @details Outputs: none - * @return DG pressure sensors calibration record + * The getNVRecord2Driver function copies the requested non-volatile + * data into the provided buffer by the caller. The function then checks if + * the non-volatile data is valid. If the data is not valid, it raises the + * provided alarm by the caller. + * @details Inputs: hdCalibrationRecord, dgCalibrationRecord + * @details Outputs: hdCalibrationRecord, dgCalibrationRecord + * @param nvData the non-volatile data to be copied + * @param bufferAddress the address of the provided buffer by the caller + * @param bufferLength the length of the provided buffer by the caller + * @param numOfSnsrs2Check the number of sensors to check in a array of sensors called + * @param nvAlarm the corresponding alarm of the non-volatile data to be raised + * if the data is not valid + * @return TRUE if the non-volatile data is valid otherwise, FALSE *************************************************************************/ -DG_PRES_SENSORS_CAL_RECORD_T getDGPressureSensorsCalibrationRecord( void ) +BOOL getNVRecord2Driver( NV_DATA_T nvData, U08* bufferAddress, U32 bufferLength, U08 numOfSnsrs2Check, ALARM_ID_T nvAlarm ) { - return dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; -} + // TODO NOTE: This function is the replacement to the processCalibrationData functions in the drivers + // Also, remove the get functions in this driver once this function is used instead of get functions in the NVDataMgmt.h + U08 i; + U08* nvDataStartPtr = 0; + BOOL isNVDataValid = FALSE; + U32 nvDataLength = 0; -/*********************************************************************//** - * @brief - * The getDGFlowSensorsCalibrationRecord function returns the DG flow - * sensors record. - * @details Inputs: none - * @details Outputs: none - * @return DG flow sensors calibration record - *************************************************************************/ -DG_FLOW_SENSORS_CAL_RECORD_T getDGFlowSensorsCalibrationRecord( void ) -{ - return dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord; -} + switch ( nvData ) + { +#ifdef _HD_ + case GET_CAL_BLOOD_LEAK_SENSOR: + nvDataStartPtr = (U08*)&hdCalibrationRecord.hdCalibrationGroups.bloodLeakSensorCalRecord; + isNVDataValid = ( 0 == hdCalibrationRecord.hdCalibrationGroups.bloodLeakSensorCalRecord.calibrationTime ? FALSE : TRUE ); + break; -/*********************************************************************//** - * @brief - * The getDGLoadCellsCalibrationRecord function returns the DG load cells - * record. - * @details Inputs: none - * @details Outputs: none - * @return DG load cells calibration record - *************************************************************************/ -DG_LOAD_CELLS_CAL_RECORD_T getDGLoadCellsCalibrationRecord( void ) -{ - return dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord; + case GET_CAL_TEMPERATURE_SESNORS: + nvDataStartPtr = (U08*)&hdCalibrationRecord.hdCalibrationGroups.tempSensorsCalRecord; + // Loop through each sensor's calibration data and make sure it is valid + for ( i = 0; i < NUM_OF_CAL_DATA_HD_TEMP_SENSORS; i++ ) + isNVDataValid |= ( 0 == hdCalibrationRecord.hdCalibrationGroups.tempSensorsCalRecord.hdTemperatureSensors[ i ].calibrationTime ? FALSE : TRUE ); + break; +#endif + +#ifdef _DG_ + case GET_CAL_PRESSURE_SENOSRS: + nvDataStartPtr = (U08*)&dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; + nvDataLength = sizeof( dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataValid |= ( 0 == dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord.pressureSensors[ i ].calibrationTime ? FALSE : TRUE ); + break; + + case GET_CAL_LOAD_CELL_SENSORS: + nvDataStartPtr = (U08*)&dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord; + nvDataLength = sizeof( dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataValid |= ( 0 == dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord.loadCells[ i ].calibrationTime ? FALSE : TRUE ); + break; + + case GET_CAL_FLOW_SENSORS: + nvDataStartPtr = (U08*)&dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord; + nvDataLength = sizeof( dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataValid |= ( 0 == dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord.flowSensors[ i ].calibrationTime ? FALSE : TRUE ); + break; + + case GET_CAL_ACID_CONCENTREATES: + nvDataStartPtr = (U08*)&dgCalibrationRecord.dgCalibrationGroups.acidConcentratesRecord; + nvDataLength = sizeof( dgCalibrationRecord.dgCalibrationGroups.acidConcentratesRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataValid |= ( 0 == dgCalibrationRecord.dgCalibrationGroups.acidConcentratesRecord.acidConcentrate[ i ].calibrationTime ? FALSE : TRUE ); + break; + + case GET_CAL_BICARB_CONCENTRATES: + nvDataStartPtr = (U08*)&dgCalibrationRecord.dgCalibrationGroups.bicarbConcentratesRecord; + nvDataLength = sizeof( dgCalibrationRecord.dgCalibrationGroups.bicarbConcentratesRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataValid |= ( 0 == dgCalibrationRecord.dgCalibrationGroups.bicarbConcentratesRecord.bicarbConcentrate[ i ].calibrationTime ? FALSE : TRUE ); + break; + + case GET_INF_HEATERS_RECORD: + nvDataStartPtr = (U08*)&dgHeatersInfoGroup.dgHeatersInfo; + nvDataLength = sizeof( dgHeatersInfoGroup.dgHeatersInfo ); + break; +#endif + } + + // Make sure the provided buffer length is >= NV Data Length in the NV data management so the memory of the other variables is not + // overridden. + if ( bufferLength >= nvDataLength ) + { + // Copy the data into the provided buffer + memcpy( bufferAddress, nvDataStartPtr, bufferLength ); + } + +#ifndef SKIP_CAL_CHECK + // Check if the non-volatile data is valid and if not raise the alarm + if ( FALSE == isNVDataValid ) + { + // If no alarm has been provided to raise, just set the variable as TRUE + if ( ALARM_ID_NO_ALARM == nvAlarm ) + { + isNVDataValid = TRUE; + } + else + { + activateAlarmNoData( nvAlarm ); + } + } +#else + isNVDataValid = TRUE; +#endif + + return isNVDataValid; } +#ifdef _DG_ /*********************************************************************//** * @brief - * The getDGTemperatureSensorsCalibrationRecord function returns the DG - * temperature sensors calibration record. + * The getDGPressureSensorsCalibrationRecord function returns the DG pressure + * sensors record. * @details Inputs: none * @details Outputs: none - * @return DG temperature sensors calibration record + * @return DG pressure sensors calibration record *************************************************************************/ -DG_TEMP_SENSORS_CAL_RECORD_T getDGTemperatureSensorsCalibrationRecord( void ) +DG_PRES_SENSORS_CAL_RECORD_T getDGPressureSensorsCalibrationRecord( void ) { - return dgCalibrationRecord.dgCalibrationGroups.tempSensorsCalRecord; + return dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; } /*********************************************************************//** @@ -1384,32 +1463,6 @@ /*********************************************************************//** * @brief - * The getDGAcidConcentratesRecord function returns the DG acid concentrates - * record. - * @details Inputs: none - * @details Outputs: none - * @return DG acid concentrates record - *************************************************************************/ -DG_ACID_CONCENTRATES_RECORD_T getDGAcidConcentratesRecord( void ) -{ - return dgCalibrationRecord.dgCalibrationGroups.acidConcentratesRecord; -} - -/*********************************************************************//** - * @brief - * The getDGBicarbConcentratesRecord function returns the DG bicarb concentrates - * record. - * @details Inputs: none - * @details Outputs: none - * @return DG bicarb concentrates record - *************************************************************************/ -DG_BICARB_CONCENTRATES_RECORD_T getDGBicarbConcentratesRecord( void ) -{ - return dgCalibrationRecord.dgCalibrationGroups.bicarbConcentratesRecord; -} - -/*********************************************************************//** - * @brief * The getDGFiltersRecord function returns the DG filters record. * @details Inputs: none * @details Outputs: none @@ -1440,9 +1493,9 @@ * @details Outputs: none * @return DG accelerometer sensor calibration record *************************************************************************/ -DG_ACCELEROMETER_SENSOR_CAL_RECORD_T getDGAccelerometerSensorCalibrationRecord( void ) +DG_ACCEL_SENSOR_CAL_RECORD_T getDGAccelerometerSensorCalibrationRecord( void ) { - return dgCalibrationRecord.dgCalibrationGroups.accelerometerCalRecord; + return dgCalibrationRecord.dgCalibrationGroups.accelerometerSensorCalRecord; } /*********************************************************************//** @@ -1584,7 +1637,7 @@ *************************************************************************/ HD_ACCELEROMETER_SENSOR_CAL_RECORD_T getHDAccelerometerSensorCalibrationRecord( void ) { - return hdCalibrationRecord.hdCalibrationGroups.accelerometerCalRecord; + return hdCalibrationRecord.hdCalibrationGroups.accelerometerSensorCalRecord; } /*********************************************************************//** @@ -1737,18 +1790,6 @@ /*********************************************************************//** * @brief - * The getHeatersInfoReocrd returns the DG heaters info. - * @details Inputs: none - * @details Outputs: none - * @return DG heaters information record - ******************************************************************/ -DG_HEATERS_RECORD_T getHeatersInfoReocrd( void ) -{ - return dgHeatersInfoGroup.dgHeatersInfo; -} - -/*********************************************************************//** - * @brief * The setHeatersInfoRecord sets a queue job to write the DG heaters info * back to the RTC RAM. * @details Inputs: none @@ -3075,10 +3116,12 @@ if ( calcCRC != recordCRC ) { #ifdef _DG_ - alarm = ALARM_ID_DG_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID; + alarm = ALARM_ID_DG_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID; + dgCalibrationRecord.crc = calcCRC; #endif #ifdef _HD_ - alarm = ALARM_ID_HD_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID; + alarm = ALARM_ID_HD_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID; + hdCalibrationRecord.crc = calcCRC; #endif activateAlarmNoData( alarm ); status = FALSE; @@ -3124,54 +3167,7 @@ return status; } -#ifdef _DG_ -/*********************************************************************//** - * @brief - * The setRsrvdCalibrationRecordsToZero function sets the calibration - * records reserved spaces to 0. This is to make sure they are not set - * to NaN. - * @details Inputs: none - * @details Outputs: none - * @return none - *************************************************************************/ -static void setRsrvdCalibrationRecordsToZero( void ) -{ - U32 i; - POLYNOMIAL_CAL_PAYLOAD_T* record; - // NOTE: the size of the reserved spaces in each calibration record do not have #define - // because they are based on assumptions and they may be reduced. - // Get the calibration record of the hardware (i.e. pressure sensor) - DG_PRES_SENSORS_CAL_RECORD_T* pressure = &dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; - for ( i = 0; i < 6; i++ ) - { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&pressure->reservedSpace[ i ]; - memset( record, 0x0, sizeof(POLYNOMIAL_CAL_PAYLOAD_T) ); - } - - DG_FLOW_SENSORS_CAL_RECORD_T* flow = &dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord; - for ( i = 0; i < 3; i++ ) - { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&flow->reservedSpace[ i ]; - memset( record, 0x0, sizeof(POLYNOMIAL_CAL_PAYLOAD_T) ); - } - - DG_TEMP_SENSORS_CAL_RECORD_T* temperature = &dgCalibrationRecord.dgCalibrationGroups.tempSensorsCalRecord; - for ( i = 0; i < 5; i++ ) - { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->reservedSpace[ i ]; - memset( record, 0x0, sizeof(POLYNOMIAL_CAL_PAYLOAD_T) ); - } - - DG_COND_SENSORS_CAL_RECORD_T* conductivity = &dgCalibrationRecord.dgCalibrationGroups.condSensorsCalRecord; - for ( i = 0; i < 2; i++ ) - { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&conductivity->reservedSpace[ i ]; - memset( record, 0x0, sizeof(POLYNOMIAL_CAL_PAYLOAD_T) ); - } -} -#endif - #ifdef _DG_ /*********************************************************************//** * @brief @@ -3251,8 +3247,21 @@ U32 i; POLYNOMIAL_CAL_PAYLOAD_T* record; BOOL isHardwareRecordValid = TRUE; - BOOL isCalRecordValid = TRUE; + BOOL isCalRecordValid = TRUE; + // Create a benign polynomial calibration record. This record is used to + // clear the reserved calibration record. The reserved spaces are not used + // but this will prevent those records to be nan or a random number. + POLYNOMIAL_CAL_PAYLOAD_T tempRecord; + tempRecord.fourthOrderCoeff = RECORD_FOURTH_ORDER_COEFF; + tempRecord.thirdOrderCoeff = RECORD_THIRD_ORDER_COEFF; + tempRecord.secondOrderCoeff = RECORD_SECOND_ORDER_COEFF; + tempRecord.gain = RECORD_DEFAULT_GAIN; + tempRecord.offset = RECORD_DEFAULT_OFFSET; + tempRecord.calibrationTime = RECORD_DEFAULT_TIME; + // Recalculate the CRC with the default values + tempRecord.crc = crc16 ( (U08*)&tempRecord, sizeof(POLYNOMIAL_CAL_PAYLOAD_T) - sizeof(U16) ); + // Get the calibration record of the hardware (i.e. pressure sensor) DG_PRES_SENSORS_CAL_RECORD_T* pressure = &dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; // The ones that are an array, are looped through @@ -3266,128 +3275,144 @@ // whether a write should be scheduled or not so it should not be overwritten with a TRUE // once a record set it to FALSE isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } + for ( i = 0; i < PRES_SENSORS_RESERVED_SPACE_COUNT; i++ ) + // Benign the pressures reserved spaces + memcpy( (POLYNOMIAL_CAL_PAYLOAD_T*)&pressure->reservedSpace[ i ], &tempRecord, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) ); + DG_FLOW_SENSORS_CAL_RECORD_T* flow = &dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord; for ( i = 0; i < NUM_OF_CAL_DATA_FLOW_SENSORS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&flow->flowSensors[ i ]; + record = (POLYNOMIAL_CAL_PAYLOAD_T*)&flow->flowSensors[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } + for ( i = 0; i < FLOW_SENSROS_RESERVED_SPACE_COUNT; i++ ) + // Benign the the flow sensors reserved spaces + memcpy( (POLYNOMIAL_CAL_PAYLOAD_T*)&flow->reservedSpace[ i ], &tempRecord, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) ); + DG_LOAD_CELLS_CAL_RECORD_T* load = &dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord; for ( i = 0; i < NUM_OF_CAL_DATA_LOAD_CELLS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&load->loadCells[ i ]; + record = (POLYNOMIAL_CAL_PAYLOAD_T*)&load->loadCells[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } DG_TEMP_SENSORS_CAL_RECORD_T* temperature = &dgCalibrationRecord.dgCalibrationGroups.tempSensorsCalRecord; for ( i = 0; i < NUM_OF_CAL_DATA_TEMP_SENSORS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; + record = (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } + for ( i = 0; i < TEMP_SENSORS_RESERVED_SPACE_COUNT; i++ ) + // Benign the temperature sensors reserved spaces + memcpy( (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->reservedSpace[ i ], &tempRecord, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) ); + DG_COND_SENSORS_CAL_RECORD_T* cond = &dgCalibrationRecord.dgCalibrationGroups.condSensorsCalRecord; for ( i = 0; i < NUM_OF_CAL_DATA_COND_SENSORS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&cond->condSensors[ i ]; + record = (POLYNOMIAL_CAL_PAYLOAD_T*)&cond->condSensors[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } + for ( i = 0; i < COND_SENSORS_RESERVED_SPACE_COUNT; i++ ) + // Benign the conductivity sensors reserved spaces + memcpy( (POLYNOMIAL_CAL_PAYLOAD_T*)&cond->reservedSpace[ i ], &tempRecord, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) ); + DG_CONC_PUMPS_CAL_RECORD_T* concPump = &dgCalibrationRecord.dgCalibrationGroups.concentratePumpsRecord; for ( i = 0; i < NUM_OF_CAL_DATA_DG_CONC_PUMPS; i++ ) { isHardwareRecordValid = isDGConcPumpRecordValid( &concPump->concentratePumps[ i ] ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } - DG_DRAIN_PUMP_CAL_RECORD_T* drainPump = &dgCalibrationRecord.dgCalibrationGroups.drainPumpRecord; - isCalRecordValid = isDGDrainPumpRecordValid( drainPump ) != TRUE ? FALSE : isCalRecordValid; - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_DRAIN_PUMP_CAL_RECORD_T* drainPump = &dgCalibrationRecord.dgCalibrationGroups.drainPumpRecord; + isHardwareRecordValid = isDGDrainPumpRecordValid( drainPump ) != TRUE ? FALSE : isCalRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_RO_PUMP_CAL_RECORD_T* roPump = &dgCalibrationRecord.dgCalibrationGroups.roPumpRecord; - isHardwareRecordValid = isDGROPumpRecordValid( roPump ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_RO_PUMP_CAL_RECORD_T* roPump = &dgCalibrationRecord.dgCalibrationGroups.roPumpRecord; + isHardwareRecordValid = isDGROPumpRecordValid( roPump ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; DG_PRE_RO_PURGE_VOLUME_T* preROPurgeVolume = &dgCalibrationRecord.dgCalibrationGroups.preROPurgeVolumeRecord; - isHardwareRecordValid = isDGPreROPurgeVolumeRecordValid( preROPurgeVolume ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isHardwareRecordValid = isDGPreROPurgeVolumeRecordValid( preROPurgeVolume ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_DRAIN_LINE_VOLUME_T* drainLineVol = &dgCalibrationRecord.dgCalibrationGroups.drainLineVolumeRecord; - isHardwareRecordValid = isDGDrainLineVolRecordValid( drainLineVol ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_DRAIN_LINE_VOLUME_T* drainLineVol = &dgCalibrationRecord.dgCalibrationGroups.drainLineVolumeRecord; + isHardwareRecordValid = isDGDrainLineVolRecordValid( drainLineVol ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; DG_RESERVOIR_VOLUME_RECORD_T* reservoirVol = &dgCalibrationRecord.dgCalibrationGroups.reservoirVolumesRecord; for ( i = 0; i < NUM_OF_CAL_DATA_RSRVRS; i++ ) { isHardwareRecordValid = isDGReservoirVolRecordValid( &reservoirVol->reservoir[ i ] ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } DG_GENERIC_VOLUME_RECORD_T* genericVol = &dgCalibrationRecord.dgCalibrationGroups.genericVolumeRecord; - for ( i = 0; i < 4; i++ ) + for ( i = 0; i < GENERIC_VOL_RESERVED_SPACE_COUNT; i++ ) { isHardwareRecordValid = isDGGenericVolRecordValid( &genericVol->genericVolume[ i ] ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } DG_ACID_CONCENTRATES_RECORD_T* acidConc = &dgCalibrationRecord.dgCalibrationGroups.acidConcentratesRecord; for ( i = 0; i < NUM_OF_CAL_DATA_ACID_CONCENTRATES; i++ ) { isHardwareRecordValid = isDGAcidConcentrateRecordValid( &acidConc->acidConcentrate[ i ] ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } DG_BICARB_CONCENTRATES_RECORD_T* bicarbConc = &dgCalibrationRecord.dgCalibrationGroups.bicarbConcentratesRecord; for ( i = 0; i < NUM_OF_CAL_DATA_BICARB_CONCENTRATES; i++ ) { isHardwareRecordValid = isDGBicarbConcentrateRecordValid( &bicarbConc->bicarbConcentrate[ i ] ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } - DG_FILTER_CAL_RECORD_T* roFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.roFilter; - isHardwareRecordValid = isDGFilterRecordValid( roFilter ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_FILTER_CAL_RECORD_T* roFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.roFilter; + isHardwareRecordValid = isDGFilterRecordValid( roFilter ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_FILTER_CAL_RECORD_T* ultraFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.ultraFilter; - isHardwareRecordValid = isDGFilterRecordValid( ultraFilter ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_FILTER_CAL_RECORD_T* ultraFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.ultraFilter; + isHardwareRecordValid = isDGFilterRecordValid( ultraFilter ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_FILTER_CAL_RECORD_T* sedimentFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.sedimentFilter; - isHardwareRecordValid = isDGFilterRecordValid( sedimentFilter ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_FILTER_CAL_RECORD_T* sedimentFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.sedimentFilter; + isHardwareRecordValid = isDGFilterRecordValid( sedimentFilter ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_FILTER_CAL_RECORD_T* carbonFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.carbonFilter; - isHardwareRecordValid = isDGFilterRecordValid( carbonFilter ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_FILTER_CAL_RECORD_T* carbonFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.carbonFilter; + isHardwareRecordValid = isDGFilterRecordValid( carbonFilter ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_FILTER_CAL_RECORD_T* carbonPolishFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.carbonPolishFilter; - isHardwareRecordValid = isDGFilterRecordValid( carbonPolishFilter ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_FILTER_CAL_RECORD_T* carbonPolishFilter = &dgCalibrationRecord.dgCalibrationGroups.filtersRecord.carbonPolishFilter; + isHardwareRecordValid = isDGFilterRecordValid( carbonPolishFilter ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_FANS_CAL_RECORD_T* fan = &dgCalibrationRecord.dgCalibrationGroups.fansRecord; - isHardwareRecordValid = isDGFanRecordValid( &fan->fan1 ); + DG_FANS_CAL_RECORD_T* fan = &dgCalibrationRecord.dgCalibrationGroups.fansRecord; + isHardwareRecordValid = isDGFanRecordValid( &fan->fan1 ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - isHardwareRecordValid = isDGFanRecordValid( &fan->fan2 ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + isHardwareRecordValid = isDGFanRecordValid( &fan->fan2 ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DG_ACCELEROMETER_SENSOR_CAL_RECORD_T* accelerometer = &dgCalibrationRecord.dgCalibrationGroups.accelerometerCalRecord; - isHardwareRecordValid = isDGAccelerometerSensorRecordValid( accelerometer ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DG_ACCEL_SENSOR_CAL_RECORD_T* accelerometer = &dgCalibrationRecord.dgCalibrationGroups.accelerometerSensorCalRecord; + isHardwareRecordValid = isDGAccelerometerSensorRecordValid( accelerometer ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; // If the sub groups failed, they are all updated to their benign values // so the main CRC of the calibration group is calculated again if ( FALSE == isCalRecordValid ) { - U16 finalCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(U16) ); + U16 finalCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(U16) ); dgCalibrationRecord.crc = finalCRC; } @@ -3735,10 +3760,10 @@ * @param record: DG_ACCELEROMETER_SENSOR_CAL_RECORD_T pointer * @return TRUE if the record is valid otherwise FALSE *************************************************************************/ -static BOOL isDGAccelerometerSensorRecordValid( DG_ACCELEROMETER_SENSOR_CAL_RECORD_T* record ) +static BOOL isDGAccelerometerSensorRecordValid( DG_ACCEL_SENSOR_CAL_RECORD_T* record ) { BOOL status = TRUE; - U16 calcCRC = crc16 ( (U08*)record, sizeof(DG_ACCELEROMETER_SENSOR_CAL_RECORD_T) - sizeof(U16) ); + U16 calcCRC = crc16 ( (U08*)record, sizeof(DG_ACCEL_SENSOR_CAL_RECORD_T) - sizeof(U16) ); U16 recordCRC = record->crc; if ( calcCRC != recordCRC ) @@ -3748,7 +3773,7 @@ record->accelYOffset = RECORD_DEFAULT_OFFSET; record->accelZOffset = RECORD_DEFAULT_OFFSET; record->calibrationTime = RECORD_DEFAULT_TIME; - record->crc = crc16 ( (U08*)record, sizeof(DG_ACCELEROMETER_SENSOR_CAL_RECORD_T) - sizeof(U16) ); + record->crc = crc16 ( (U08*)record, sizeof(DG_ACCEL_SENSOR_CAL_RECORD_T) - sizeof(U16) ); // Set the to FALSE since the record is not valid status = FALSE; @@ -3822,6 +3847,7 @@ return status; } + /*********************************************************************//** * @brief * The isHDCalibrationRecordValid function checks whether HD calibration @@ -3886,19 +3912,22 @@ { record = (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->hdTemperatureSensors[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE :isHardwareRecordValid; + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } HD_HEPARIN_FORCE_SENSOR_CAL_RECORD_T* heparinForce = &hdCalibrationRecord.hdCalibrationGroups.heparinForceSensorCalRecord; record = (POLYNOMIAL_CAL_PAYLOAD_T*)&heparinForce->hdHeparinForceSensor; isHardwareRecordValid = isPolynomialRecordValid( record ); isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - - HD_ACCELEROMETER_SENSOR_CAL_RECORD_T* accelerometer = &hdCalibrationRecord.hdCalibrationGroups.accelerometerCalRecord; + HD_ACCELEROMETER_SENSOR_CAL_RECORD_T* accelerometer = &hdCalibrationRecord.hdCalibrationGroups.accelerometerSensorCalRecord; isHardwareRecordValid = isHDAccelerometerSensorValid( accelerometer ); isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* bloodLeak = &hdCalibrationRecord.hdCalibrationGroups.bloodLeakSensorCalRecord; + isHardwareRecordValid = isHDBloodLeakSesnorValid( bloodLeak ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + return isCalRecordValid; } @@ -3993,6 +4022,34 @@ return status; } + +/*********************************************************************//** + * @brief + * The isHDBloodLeakSesnorValid function checks whether the calibration record + * of HD blood leak sensor is valid or not. + * @details Inputs: none + * @details Outputs: none + * @param record: HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T pointer + * @return TRUE if the record is valid otherwise FALSE + *************************************************************************/ +static BOOL isHDBloodLeakSesnorValid( HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16 ( (U08*)record, sizeof( HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = record->crc; + + if ( calcCRC != recordCRC ) + { + record->setPoint = BLOOD_LEAK_DEFAULT_SET_POINT; + record->calibrationTime = RECORD_DEFAULT_TIME; + record->crc = crc16 ( (U08*)record, sizeof( HD_BLOOD_LEAK_SENSOR_CAL_RECORD_T ) - sizeof( U16 ) ); + + // Set the to FALSE since the record is not valid + status = FALSE; + } + + return status; +} #endif /*********************************************************************//**