Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rbe1ff666dbd2ff03342c22c8e50b21d0f9b988a9 -r6a30402a7d47d1c77c04845a1c880935f00c6551 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision be1ff666dbd2ff03342c22c8e50b21d0f9b988a9) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 6a30402a7d47d1c77c04845a1c880935f00c6551) @@ -43,9 +43,6 @@ #define USAGE_INFO_START_ADDRESS ( BANK7_SECTOR3_START_ADDRESS + USAGE_RECORD_OFFSET ) ///< Start address of usage info record in NV memory #define RECORD_DEFAULT_TIME 0U ///< Record default time (calibration/set). -#define RECORD_FOURTH_ORDER_COEFF 0.0F ///< Record fourth order coefficient. -#define RECORD_THIRD_ORDER_COEFF 0.0F ///< Record third order coefficient. -#define RECORD_SECOND_ORDER_COEFF 0.0F ///< Record second order coefficient. #define RECORD_DEFAULT_GAIN 1.0F ///< Record default gain. #define RECORD_DEFAULT_OFFSET 0.0F ///< Record default offset. #define RECORD_DEFAULT_CONST 0.0F ///< Record default constant. @@ -67,30 +64,6 @@ #define DEFAULT_UF_VOLUME_ML 700 ///< Ultrafilter volume in milliliters. #define DEFAULT_BLOOD_LEAK_SET_POINT 20 ///< Blood leak default set point. -// Default Values for Institutional Records -#define DEFAULT_MIN_DIALYSATE_FLOW_MLPM 50 ///< Default value of min dialysate flow in mL/min -#define DEFAULT_MAX_DIALYSATE_FLOW_MLPM 600 ///< Default value of max dialysate flow in mL/min -#define DEFAULT_MIN_DIALYSATE_TEMP_C 35.0F ///< Default value of min dialysate temp in °C -#define DEFAULT_MAX_DIALYSATE_TEMP_C 38.0F ///< Default value of max dialysate temp in °C -#define DEFAULT_MIN_ACID_CONCENTRATE 0 ///< Default value of min acid concentrate -#define DEFAULT_MAX_ACID_CONCENTRATE 2 ///< Default value of max acid concentrate -#define DEFAULT_MIN_BICARB_CARTRIDGE_SIZE_G 0 ///< Default value of min bicarb cartridge size in grams -#define DEFAULT_MAX_BICARB_CARTRIDGE_SIZE_G 5 ///< Default value of max bicarb cartridge size in grams -#define DEFAULT_MIN_SODIUM_MEQL 130 ///< Default value of min sodium in mEq/L -#define DEFAULT_MAX_SODIUM_MEQL 155 ///< Default value of max sodium in mEq/L -#define DEFAULT_MIN_BICARBONATE_MEQL 20 ///< Default value of min bicarbonate in mEq/L -#define DEFAULT_MAX_BICARBONATE_MEQL 40 ///< Default value of max bicarbonate in mEq/L -#define DEFAULT_MAX_RO_REJECTION_RATIO_PCT 90 ///< Max RO rejection ratio in percent. -#define DEFAULT_NUM_OF_DISINFECTION_FREQUENCY 3 ///< Number of Days between each disinfection cycle -#define DEFAULT_NUM_OF_DISINFECTION_CYCLE_TIME 30 ///< Time period of which disinfection is done -#define DEFAULT_MIN_INLET_WATER_COND_ALARM_US_P_CM 200.0F ///< Min inlet water conductivity alarm limit in uS/cm. -#define DEFAULT_MAX_INLET_WATER_COND_ALARM_US_P_CM 50.0F ///< Max inlet water conductivity alarm limit in uS/cm. -#define DEFAULT_ACID_CONCENTRATE_JUG_SIZE 3.43F ///< Acid Concentrate jug size in litres -#define DEFAULT_MIN_ACID_ALARM_US_P_CM 0 ///< Min acid alarm limit in percent. -#define DEFAULT_MIN_BICARB_ALARM_US_P_CM 0 ///< Min bicarb alarm limit in percent. -#define DEFAULT_POST_TREATMENT_DRAIN_OPTION 0 ///< Default Post Treatment Drain Option -#define DEFAULT_POST_TREATMENT_DRY_BICARB_OPTION 0 ///< Default Post Treatment Dry Bicarb Option - #define MAX_NUM_OF_WRITE_TRIES 3U ///< Max number of write tries. #define RECORD_BYTE_SIZE(r) (sizeof(r) + sizeof(U16)) ///< Record byte size macro. @@ -110,6 +83,33 @@ #define INSTITUTIONAL_RECORD_PADDING_LENGTH ( RECORD_PADDING_LENGTH( DD_INSTITUTIONAL_RECORD_T, MAX_EEPROM_WRITE_BUFFER_BYTES ) ) #define USAGE_INFO_RECORD_PADDING_LENGTH ( RECORD_PADDING_LENGTH( DD_USAGE_INFO_RECORD_T, MAX_EEPROM_WRITE_BUFFER_BYTES ) ) +/// Institutional Basic parameter properties including data type, range limits and default values. +static const INSTIT_PARAMS_PROPERTIES_T INSTIT_BASIC_PROP[ NUM_OF_INSTIT_BASIC ] = +{ + // type min max default + { CRITICAL_DATA_TYPE_U32, { {.uInt=50}, {.uInt=600}, {.uInt=50} } }, ///< INSTIT_PARAM_DIALYSATE_FLOW + { CRITICAL_DATA_TYPE_F32, { {.sFlt=35.0}, {.sFlt=38.0}, {.sFlt=37.0} } }, ///< INSTIT_PARAM_DIALYSATE_TEMPERATURE + { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=2}, {.uInt=0} } }, ///< INSTIT_PARAM_ACID_CONCENTRATE + { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=5}, {.uInt=0} } }, ///< INSTIT_PARAM_DRY_BICARB_CART_SIZE + { CRITICAL_DATA_TYPE_U32, { {.uInt=130}, {.uInt=155}, {.uInt=137} } }, ///< INSTIT_PARAM_SODIUM + { CRITICAL_DATA_TYPE_U32, { {.uInt=20}, {.uInt=40}, {.uInt=33} } }, ///< INSTIT_PARAM_BICARBONATE + { CRITICAL_DATA_TYPE_U32, { {.uInt=1}, {.uInt=99}, {.uInt=90} } }, ///< INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM +}; + +/// Institutional Advanced parameter properties including data type, range limits and default values. +static const INSTIT_PARAMS_PROPERTIES_T INSTIT_ADVANCED_PROP[ NUM_OF_INSTIT_ADVANCED ] = +{ + // type min max default + { CRITICAL_DATA_TYPE_U32, { {.uInt=1}, {.uInt=5}, {.uInt=3} } }, ///< INSTIT_PARAM_DISINFECTION_FREQUENCY + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=60}, {.sFlt=30} } }, ///< INSTIT_PARAM_DISINFECTION_CYCLE_TIME + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=200}, {.sFlt=200} } }, ///< INSTIT_PARAM_INLET_WATER_COND_LOW_ALARM + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=200}, {.sFlt=50} } }, ///< INSTIT_PARAM_INLET_WATER_COND_HIGH_ALARM + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=20}, {.sFlt=3.43} } }, ///< INSTIT_PARAM_ACID_CONCENTRATE_JUG_SIZE + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=50}, {.sFlt=0} } }, ///< INSTIT_PARAM_LOW_ACID_ALARM + { CRITICAL_DATA_TYPE_F32, { {.sFlt=1}, {.sFlt=50}, {.sFlt=0} } }, ///< INSTIT_PARAM_LOW_BICARB_ALARM + { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=1}, {.uInt=0} } }, ///< INSTIT_PARAM_DIALYSATE_POST_TREAT_DRAIN_OPTION + { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=2}, {.uInt=2} } }, ///< INSTIT_PARAM_BICARB_POST_TREAT_DRAIN_OPTION +}; #pragma pack(push, 1) // ********** DD record structures ********** @@ -128,7 +128,7 @@ DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T bloodLeakSensorCalRecord; ///< DD blood leak detector calibration record } DD_CALIBRATION_RECORD_T; -/// DD calibration records structure +/// DD calibration group structure typedef struct { DD_CALIBRATION_RECORD_T ddCalibrationRecord; ///< DD calibration groups. @@ -152,16 +152,23 @@ U16 crc; ///< CRC for the DG service structure. } DD_SERVICE_GROUP_T; - /// DD institutional record structure typedef struct { + DD_INSTIT_BASIC_RECORD_T basicRecord; ///< DD basic institutional record + DD_INSTIT_ADVANCED_RECORD_T advancedRecord; ///< DD advanced institutional record + DD_INSTIT_ADDITIONAL_RECORD_T additionalRecord; ///< DD additional institutional record +} DD_INSTITUTIONAL_RECORD_T; + +/// DD institutional group structure +typedef struct +{ DD_INSTITUTIONAL_RECORD_T ddInstitutionalRecord; ///< DD institutional record. U08 padding[ INSTITUTIONAL_RECORD_PADDING_LENGTH ]; ///< DD institutional group padding. U16 crc; ///< CRC for the HD institutional structure. } DD_INSTITUTIONAL_GROUP_T; -/// DD usage record structure +/// DD usage group structure typedef struct { DD_USAGE_INFO_RECORD_T ddUsageInfoRecord; ///< DD usage info record. @@ -190,35 +197,6 @@ {USAGE_INFO_START_ADDRESS, sizeof(DD_USAGE_INFO_GROUP_T), (U08*)&ddUsageInfoGroup, (U08*)&ddUsageInfoGroup.crc, DD_EVENT_USAGE_INFO_RECORD_UPDATE }, // NVM_USAGE_INFO_RECORD }; -/// Table showing data type of each institutional record component -const CRITICAL_DATA_TYPES_T institRecDataTypeTable[ NUM_OF_DD_INSTIT_RECORD_TYPE ] = -{ - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_DIALYSATE_FLOW_MLPM - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MAX_DIALYSATE_FLOW_MLPM - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MIN_DIALYSATE_TEMP_C - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MAX_DIALYSATE_TEMP_C - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_ACID_CONCENTRATE - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MAX_ACID_CONCENTRATE - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_BICARB_CARTRIDGE_SIZE_G - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MAX_BICARB_CARTRIDGE_SIZE_G - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_SODIUM_MEQL - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MAX_SODIUM_MEQL - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_BICARBONATE_MEQL - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MAX_BICARBONATE_MEQL - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_MIN_RO_REJECTION_RATIO_PCT - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_DISINFECTION_FREQUENCY - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_DISINFECTION_CYCLE_TIME - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MIN_INLET_WATER_COND_ALARM_LIMIT_USPCM - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MAX_INLET_WATER_COND_ALARM_LIMIT_USPCM - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_ACID_CONCENTRATE_JUG_SIZE_L - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MIN_ACID_ALARM_LIMIT_PCT - CRITICAL_DATA_TYPE_F32, // DD_INSTIT_MIN_BICARB_ALARM_LIMIT_PCT - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_POST_TREAT_DRAIN_OPTION - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_POST_TREAT_DRY_BICARB_OPTION - CRITICAL_DATA_TYPE_U32, // DD_INSTIT_CALIBRATION_TIME - CRITICAL_DATA_TYPE_U32 // DD_INSTIT_CRC -}; - static NVM_SELF_TEST_STATE_T nvmSelfTestState; ///< NVM self-test state variable. static SELF_TEST_STATUS_T nvmSelfTestResult; ///< NVM self-test result. static U32 usageWriteTries; ///< Usage write tries. @@ -231,7 +209,7 @@ static NVM_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); // Record check helper functions -static BOOL isPolynomialRecordValid( POLYNOMIAL_CAL_PAYLOAD_T* record ); +static BOOL isLinearRecordValid( LINEAR_CAL_PAYLOAD_T* record ); static BOOL isDDSystemRecordValid( void ); static BOOL isDDServiceRecordValid( void ); static BOOL isDDInstitutionalRecordValid( void ); @@ -423,43 +401,40 @@ /*********************************************************************//** * @brief - * The benignPolynomialCalRecord function fills the provided polynomial + * The benignLinearCalRecord function fills the provided linear * calibration record with benign default values and updates its CRC. * @details \b Inputs: none * @details \b Outputs: none - * @param record Pointer to the polynomial calibration record to update + * @param record Pointer to the linear calibration record to update * @return none *************************************************************************/ -void benignPolynomialCalRecord( POLYNOMIAL_CAL_PAYLOAD_T* record ) +void benignLinearCalRecord( LINEAR_CAL_PAYLOAD_T* record ) { - record->fourthOrderCoeff = RECORD_FOURTH_ORDER_COEFF; - record->thirdOrderCoeff = RECORD_THIRD_ORDER_COEFF; - record->secondOrderCoeff = RECORD_SECOND_ORDER_COEFF; record->gain = RECORD_DEFAULT_GAIN; record->offset = RECORD_DEFAULT_OFFSET; record->calibrationTime = RECORD_DEFAULT_TIME; - record->crc = crc16 ( (U08*)record, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) - sizeof( U16 ) ); + record->crc = crc16 ( (U08*)record, sizeof( LINEAR_CAL_PAYLOAD_T ) - sizeof( U16 ) ); } /*********************************************************************//** * @brief - * The isPolynomialRecordValid function checks if the polynomial record + * The isLinearRecordValid function checks if the linear record * is valid by comparing calculated CRC with stored CRC. If invalid, * it updates the record with benign values. * @details \b Inputs: none * @details \b Outputs: none - * @param record Pointer to the polynomial calibration record to check + * @param record Pointer to the linear calibration record to check * @return TRUE if the records' data is valid otherwise FALSE *************************************************************************/ -static BOOL isPolynomialRecordValid( POLYNOMIAL_CAL_PAYLOAD_T* record ) +static BOOL isLinearRecordValid( LINEAR_CAL_PAYLOAD_T* record ) { BOOL status = TRUE; - U16 calcCRC = crc16 ( (U08*)record, sizeof( POLYNOMIAL_CAL_PAYLOAD_T ) - sizeof( U16 ) ); + U16 calcCRC = crc16 ( (U08*)record, sizeof( LINEAR_CAL_PAYLOAD_T ) - sizeof( U16 ) ); U16 recordCRC = record->crc; if ( calcCRC != recordCRC ) { - benignPolynomialCalRecord( record ); + benignLinearCalRecord( record ); // Set status to FALSE since the record is not valid status = FALSE; @@ -638,25 +613,25 @@ static BOOL isDDCalibrationRecordValid( void ) { U32 i; - POLYNOMIAL_CAL_PAYLOAD_T* record; + LINEAR_CAL_PAYLOAD_T* record; BOOL isHardwareRecordValid = TRUE; BOOL isCalRecordValid = TRUE; U16 recordCRC = crc16 ( (U08*)&ddCalibrationGroup, sizeof( DD_CALIBRATION_GROUP_T ) - sizeof( U16 ) ); // 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; + LINEAR_CAL_PAYLOAD_T tempRecord; - benignPolynomialCalRecord( &tempRecord ); + benignLinearCalRecord( &tempRecord ); // Get the calibration record of the hardware (i.e. pressure sensor) DD_PRES_SENSORS_CAL_RECORD_T* pressure = &ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord; // The ones that are an array, are looped through for ( i = 0; i < NUM_OF_PRESSURE_SENSORS; i++ ) { // Get calibration payload and assign it to a pointer - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&pressure->pressureSensors[ i ]; + record = (LINEAR_CAL_PAYLOAD_T*)&pressure->pressureSensors[ i ]; // Check in the validity of the calibration data // If the variable is already FALSE, let it be FALSE. Even if one record is not // valid, the values should be set to benign values. This variable is used to decide @@ -669,15 +644,15 @@ DD_TEMP_SENSORS_CAL_RECORD_T* temperature = &ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord; for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; + record = (LINEAR_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; } DD_CONC_PUMPS_CAL_RECORD_T* concPump = &ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord; for ( i = 0; i < NUM_OF_CONCENTRATE_PUMPS; i++ ) { - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&concPump->concentratePumps[ i ]; + record = (LINEAR_CAL_PAYLOAD_T*)&concPump->concentratePumps[ i ]; isHardwareRecordValid = isPolynomialRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; } @@ -687,7 +662,7 @@ isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; DD_D48_DIALYSATE_PUMP_RECORD_T* d48Pump = &ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord; - record = (POLYNOMIAL_CAL_PAYLOAD_T*)&d48Pump->d48DialysatePump; + record = (LINEAR_CAL_PAYLOAD_T*)&d48Pump->d48DialysatePump; isHardwareRecordValid = isPolynomialRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; @@ -931,29 +906,24 @@ *************************************************************************/ static void initDDInstitutionalRecord( void ) { - ddInstitutionalGroup.ddInstitutionalRecord.minDialysateFlowMLPM = DEFAULT_MIN_DIALYSATE_FLOW_MLPM; - ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateFlowMLPM = DEFAULT_MAX_DIALYSATE_FLOW_MLPM; - ddInstitutionalGroup.ddInstitutionalRecord.minDialysateTempC = DEFAULT_MIN_DIALYSATE_TEMP_C; - ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateTempC = DEFAULT_MAX_DIALYSATE_TEMP_C; - ddInstitutionalGroup.ddInstitutionalRecord.minAcidConcentrate = DEFAULT_MIN_ACID_CONCENTRATE; - ddInstitutionalGroup.ddInstitutionalRecord.maxAcidConcentrate = DEFAULT_MAX_ACID_CONCENTRATE; - ddInstitutionalGroup.ddInstitutionalRecord.minBicarbCartridgeSizeG = DEFAULT_MIN_BICARB_CARTRIDGE_SIZE_G; - ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbCartridgeSizeG = DEFAULT_MAX_BICARB_CARTRIDGE_SIZE_G; - ddInstitutionalGroup.ddInstitutionalRecord.minSodiumMEQL = DEFAULT_MIN_SODIUM_MEQL; - ddInstitutionalGroup.ddInstitutionalRecord.maxSodiumMEQL = DEFAULT_MAX_SODIUM_MEQL; - ddInstitutionalGroup.ddInstitutionalRecord.minBicarbonateMEQL = DEFAULT_MIN_BICARBONATE_MEQL; - ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbonateMEQL = DEFAULT_MAX_BICARBONATE_MEQL; - ddInstitutionalGroup.ddInstitutionalRecord.minRORejectionRatioPCT = DEFAULT_MAX_RO_REJECTION_RATIO_PCT; - ddInstitutionalGroup.ddInstitutionalRecord.disinfectionFrequency = DEFAULT_NUM_OF_DISINFECTION_FREQUENCY; - ddInstitutionalGroup.ddInstitutionalRecord.disinfectionCycleTime = DEFAULT_NUM_OF_DISINFECTION_CYCLE_TIME; - ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM = DEFAULT_MIN_INLET_WATER_COND_ALARM_US_P_CM; - ddInstitutionalGroup.ddInstitutionalRecord.maxInletWaterCondAlarmLimitUSPCM = DEFAULT_MAX_INLET_WATER_COND_ALARM_US_P_CM; - ddInstitutionalGroup.ddInstitutionalRecord.acidConcentrateJugSizeL = DEFAULT_ACID_CONCENTRATE_JUG_SIZE; - ddInstitutionalGroup.ddInstitutionalRecord.minAcidAlarmLimitPCT = DEFAULT_MIN_ACID_ALARM_US_P_CM; - ddInstitutionalGroup.ddInstitutionalRecord.minBicarbAlarmLimitPCT = DEFAULT_MIN_BICARB_ALARM_US_P_CM; - ddInstitutionalGroup.ddInstitutionalRecord.postTreatDrainOption = DEFAULT_POST_TREATMENT_DRAIN_OPTION; - ddInstitutionalGroup.ddInstitutionalRecord.postTreatDryBicarbOption = DEFAULT_POST_TREATMENT_DRY_BICARB_OPTION; -// ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime = getRTCTimestamp(); + DD_INSTIT_BASIC_ITEMS_T basicIdx; + DD_INSTIT_ADVANCED_ITEMS_T advancedIdx; + + for ( basicIdx = FIRST_INSTIT_BASIC_PARAM; basicIdx < NUM_OF_INSTIT_BASIC; basicIdx++ ) + { + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.param[ basicIdx ].min = INSTIT_BASIC_PROP[ basicIdx ].data.min; + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.param[ basicIdx ].max = INSTIT_BASIC_PROP[ basicIdx ].data.max; + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.param[ basicIdx ].def = INSTIT_BASIC_PROP[ basicIdx ].data.def; + } + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.calibrationTime = RECORD_DEFAULT_TIME + + for ( advancedIdx = FIRST_INSTIT_ADVANCED_PARAM; advancedIdx < NUM_OF_INSTIT_ADVANCED; advancedIdx++ ) + { + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ advancedIdx ].min = INSTIT_ADVANCED_PROP[ advancedIdx ].data.min; + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ advancedIdx ].max = INSTIT_ADVANCED_PROP[ advancedIdx ].data.max; + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ advancedIdx ].def = INSTIT_ADVANCED_PROP[ advancedIdx ].data.def; + } + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.calibrationTime = RECORD_DEFAULT_TIME } /*********************************************************************//** @@ -995,46 +965,36 @@ switch ( recType ) { case NVM_SYSTEM_RECORD: + for ( i = 0; i < SYSTEM_RECORD_PADDING_LENGTH; i++ ) { - for ( i = 0; i < SYSTEM_RECORD_PADDING_LENGTH; i++ ) - { - ddSystemGroup.padding[ i ] = 0; - } + ddSystemGroup.padding[ i ] = 0; } break; case NVM_SERVICE_RECORD: - { for ( i = 0; i < SERVICE_RECORD_PADDING_LENGTH; i++ ) { ddServiceGroup.padding[ i ] = 0; } - } break; case NVM_CALIBRATION_RECORD: - { for ( i = 0; i < CALIBRATION_RECORD_PADDING_LENGTH; i++ ) { ddCalibrationGroup.padding[ i ] = 0; } - } break; case NVM_INSTITUTIONAL_RECORD: - { for ( i = 0; i < INSTITUTIONAL_RECORD_PADDING_LENGTH; i++ ) { ddInstitutionalGroup.padding[ i ] = 0; } - } break; case NVM_USAGE_INFO_RECORD: - { for ( i = 0; i < USAGE_INFO_RECORD_PADDING_LENGTH; i++ ) { ddUsageInfoGroup.padding[ i ] = 0; } - } break; default: @@ -1238,17 +1198,67 @@ /*********************************************************************//** * @brief + * The getSystemRecord function gets the system record + * @details \b Inputs: ddSystemGroup.ddSystemRecord + * @details \b Outputs: none + * @return NVM system Record + *************************************************************************/ +DD_SYSTEM_RECORD_T getSystemRecord( void ) +{ + return ddSystemGroup.ddSystemRecord; +} + +/*********************************************************************//** + * @brief + * The setSystemRecord function sets the system record + * @details \b Inputs: none + * @details \b Outputs: ddSystemGroup.ddSystemRecord + * @param record system record to be saved + * @return none + *************************************************************************/ +void setSystemRecord( DD_SYSTEM_RECORD_T record ) +{ + ddSystemGroup.ddSystemRecord = record; +} + +/*********************************************************************//** + * @brief + * The getServiceRecord function gets the service record + * @details \b Inputs:ddServiceGroup.ddServiceRecord + * @details \b Outputs: none + * @return NVM service Record + *************************************************************************/ +DD_SERVICE_RECORD_T getServiceRecord( void ) +{ + return ddServiceGroup.ddServiceRecord; +} + +/*********************************************************************//** + * @brief + * The setServiceRecord function sets the service record + * @details \b Inputs: none + * @details \b Outputs: ddServiceGroup.ddServiceRecord + * @param record service record to be saved + * @return none + *************************************************************************/ +void setServiceRecord( DD_SERVICE_RECORD_T record ) +{ + ddServiceGroup.ddServiceRecord = record; +} + +/*********************************************************************//** + * @brief * The getPressureSensorCalRecord function gets the calibration record * of the specified pressure sensor. - * @details \b Inputs: ddCalibrationGroup.ddCalibrationRecord + * @details \b Inputs: ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord * @details \b Outputs: none * @param snsrIdx Pressure sensor index * @return record corresponding pressure sensor calibration record *************************************************************************/ -POLYNOMIAL_CAL_PAYLOAD_T getPressureSensorCalRecord( U08 snsrIdx ) +LINEAR_CAL_PAYLOAD_T getPressureSensorCalRecord( U08 snsrIdx ) { - POLYNOMIAL_CAL_PAYLOAD_T record; - benignPolynomialCalRecord( &record ); + LINEAR_CAL_PAYLOAD_T record; + benignLinearCalRecord( &record ); if ( snsrIdx < NUM_OF_PRESSURE_SENSORS ) { @@ -1260,18 +1270,35 @@ /*********************************************************************//** * @brief + * The setPressureSensorCalRecord function sets the calibration record + * of the specified pressure sensor. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord + * @param snsrIdx Pressure sensor index + * @record Pressure Sensor calibration record to be saved + * @return none + *************************************************************************/ +void setPressureSensorCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ) +{ + if ( snsrIdx < NUM_OF_PRESSURE_SENSORS ) + { + ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ snsrIdx ] = record; + } +} + +/*********************************************************************//** + * @brief * The getTemperatureSensorCalRecord function gets the calibration * record of the specified temperature sensor. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord * @details \b Outputs: none * @param snsrIdx Temperature sensor index * @return record corresponding temperature sensor calibration record *************************************************************************/ -POLYNOMIAL_CAL_PAYLOAD_T getTemperatureSensorCalRecord( U08 snsrIdx ) +LINEAR_CAL_PAYLOAD_T getTemperatureSensorCalRecord( U08 snsrIdx ) { - POLYNOMIAL_CAL_PAYLOAD_T record; - benignPolynomialCalRecord( &record ); + LINEAR_CAL_PAYLOAD_T record; + benignLinearCalRecord( &record ); if ( snsrIdx < NUM_OF_TEMPERATURE_SENSORS ) { @@ -1283,18 +1310,35 @@ /*********************************************************************//** * @brief + * The getTemperatureSensorCalRecord function sets the calibration record + * of the specified temperature sensor. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord + * @param snsrIdx Temperature sensor index + * @record Temperature Sensor calibration record to be saved + * @return none + *************************************************************************/ +void setTemperatureSensorCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ) +{ + if ( snsrIdx < NUM_OF_TEMPERATURE_SENSORS ) + { + ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord.tempSensors[ snsrIdx ] = record; + } +} + +/*********************************************************************//** + * @brief * The getConcPumpCalRecord function gets the calibration record of the * specified concentrate pump. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord * @details \b Outputs: none * @param pumpIdx Concentrate pump index * @return record corresponding concentrate pump calibration record *************************************************************************/ -POLYNOMIAL_CAL_PAYLOAD_T getConcPumpCalRecord( U08 pumpIdx ) +LINEAR_CAL_PAYLOAD_T getConcPumpCalRecord( U08 pumpIdx ) { - POLYNOMIAL_CAL_PAYLOAD_T record; - benignPolynomialCalRecord( &record ); + LINEAR_CAL_PAYLOAD_T record; + benignLinearCalRecord( &record ); if ( pumpIdx < NUM_OF_CONCENTRATE_PUMPS ) { @@ -1306,13 +1350,29 @@ /*********************************************************************//** * @brief + * The setConcPumpCalRecord function sets the calibration record + * of the specified Concentrate pump . + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord + * @param snsrIdx Concentrate pump index + * @record Concentrate pump calibration record to be saved + * @return none + *************************************************************************/ +void setConcPumpCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ) +{ + if ( snsrIdx < NUM_OF_CONCENTRATE_PUMPS ) + { + ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord.concentratePumps[ snsrIdx ] = record; + } +} + +/*********************************************************************//** + * @brief * The getD12PumpCalRecord function gets the calibration record of the * D12 dialysate pump. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord * @details \b Outputs: none - * @return ddCalibrationGroup.ddCalibrationRecord. - * d12DialysatePumpRecord + * @return D12 dialysate pump calibration record *************************************************************************/ DD_D12_DIALYSATE_PUMP_RECORD_T getD12PumpCalRecord( void ) { @@ -1321,13 +1381,25 @@ /*********************************************************************//** * @brief + * The setD12PumpCalRecord function sets the calibration record + * of the D12 dialysate pump . + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord + * @record D12 dialysate pump calibration record to be saved + * @return none + *************************************************************************/ +void setD12PumpCalRecord( DD_D12_DIALYSATE_PUMP_RECORD_T record ) +{ + ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord = record; +} + +/*********************************************************************//** + * @brief * The getD48PumpCalRecord function gets the calibration record of the * D48 dialysate pump. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord * @details \b Outputs: none - * @return ddCalibrationGroup.ddCalibrationRecord. - * d48DialysatePumpRecord + * @return D48 dialysate pump calibration record *************************************************************************/ DD_D48_DIALYSATE_PUMP_RECORD_T getD48PumpCalRecord( void ) { @@ -1336,10 +1408,23 @@ /*********************************************************************//** * @brief + * The setD48PumpCalRecord function sets the calibration record + * of the D48 dialysate pump . + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord + * @record D48 dialysate pump calibration record to be saved + * @return none + *************************************************************************/ +void setD48PumpCalRecord( DD_D48_DIALYSATE_PUMP_RECORD_T record ) +{ + ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord = record; +} + +/*********************************************************************//** + * @brief * The getAcidConcentrateCalRecord function gets the calibration record * of the specified acid concentrate. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord * @details \b Outputs: none * @param acidIdx Acid concentrate index * @return record corresponding acid concentrate calibration record @@ -1358,10 +1443,27 @@ /*********************************************************************//** * @brief + * The setAcidConcentrateCalRecord function sets the calibration record + * of the specified acid concentrate . + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord + * @param acidIdx acid concentrate index + * @record acid concentrate calibration record to be saved + * @return none + *************************************************************************/ +void setAcidConcentrateCalRecord( U08 acidIdx, DD_ACID_CONCENTRATE_T record ) +{ + if ( snsrIdx < NUM_OF_ACID_TYPE ) + { + ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord.acidConcentrate[ acidIdx ] = record; + } +} + +/*********************************************************************//** + * @brief * The getBicarbConcentrateCalRecord function gets the calibration * record of the specified bicarb concentrate. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord * @details \b Outputs: none * @param bicarbIdx Bicarb concentrate index * @return record corresponding bicarb concentrate calibration record @@ -1380,14 +1482,29 @@ /*********************************************************************//** * @brief + * The setBicarbConcentrateCalRecord function sets the calibration record + * of the specified bicarb concentrate . + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord + * @param bicarbIdx bicarb concentrate index + * @record bicarb concentrate calibration record to be saved + * @return none + *************************************************************************/ +void setBicarbConcentrateCalRecord( U08 bicarbIdx, DD_BICARB_CONCENTRATE_T record ) +{ + if ( snsrIdx < NUM_OF_BICARB_TYPE ) + { + ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ bicarbIdx ] = record; + } +} + +/*********************************************************************//** + * @brief * The getAccelSensorCalRecord function gets the calibration record of * the accelerometer sensor. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord. - * accelerometerSensorCalRecord + * @details \b Inputs:ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord * @details \b Outputs: none - * @return ddCalibrationGroup.ddCalibrationRecord. - * accelerometerSensorCalRecord + * @return accelerometer sensor calibration record *************************************************************************/ DD_ACCEL_SENSOR_CAL_RECORD_T getAccelSensorCalRecord( void ) { @@ -1396,14 +1513,25 @@ /*********************************************************************//** * @brief + * The setAccelSensorCalRecord function sets the calibration record + * of the accelerometer sensor. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord + * @record accelerometer sensor calibration record to be saved + * @return none + *************************************************************************/ +void setAccelSensorCalRecord( DD_ACCEL_SENSOR_CAL_RECORD_T record ) +{ + ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord = record; +} + +/*********************************************************************//** + * @brief * The getBloodLeakSensorCalRecord function gets the calibration record * of the blood leak sensor. - * @details \b Inputs: - * ddCalibrationGroup.ddCalibrationRecord. - * bloodLeakSensorCalRecord + * @details \b Inputs: ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord * @details \b Outputs: none - * @return ddCalibrationGroup.ddCalibrationRecord. - * bloodLeakSensorCalRecord + * @return blood leak sensor calibration record *************************************************************************/ DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T getBloodLeakSensorCalRecord( void ) { @@ -1412,6 +1540,159 @@ /*********************************************************************//** * @brief + * The setBloodLeakSensorCalRecord function sets the calibration record + * of the blood leak sensor. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord + * @record blood leak sensor calibration record to be saved + * @return none + *************************************************************************/ +void setBloodLeakSensorCalRecord( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T record ) +{ + ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord = record; +} + +/*********************************************************************//** + * @brief + * The getConductivitySensorCalRecord function gets the calibration + * record of the specified conductivity sensor. + * @details \b Inputs:none + * @details \b Outputs: none + * @param snsrIdx conductivity sensor index + * @return record corresponding conductivity sensor calibration record + *************************************************************************/ +DD_CONDUCTIVITY_SENSOR_T getConductivitySensorCalRecord( U08 snsrIdx ) +{ + DD_CONDUCTIVITY_SENSOR_T record = { 0 }; + + if ( snsrIdx < NUM_OF_CONDUCTIVITY_SENSORS ) + { + + } + + return record; +} + +/*********************************************************************//** + * @brief + * The setBicarbConcentrateCalRecord function sets the calibration record + * of the specified conductivity sensor . + * @details \b Inputs: none + * @details \b Outputs: none + * @param snsrIdx conductivity sensor index + * @record conductivity sensor calibration record to be saved. + * @return none + *************************************************************************/ +void setConductivitySensorCalRecord( U08 snsrIdx, DD_CONDUCTIVITY_SENSOR_T record ) +{ + if ( snsrIdx < NUM_OF_CONDUCTIVITY_SENSORS ) + { + + } +} + +/*********************************************************************//** + * @brief + * The getInstitBasicRecord function gets the basic institutional record + * @details \b Inputs:ddInstitutionalGroup.ddInstitutionalRecord.basicRecord + * @details \b Outputs: none + * @return NVM basic institutional Record + *************************************************************************/ +DD_INSTIT_BASIC_RECORD_T getInstitBasicRecord( void ) +{ + return ddInstitutionalGroup.ddInstitutionalRecord.basicRecord; +} + +/*********************************************************************//** + * @brief + * The setInstitBasicRecord function sets the basic institutional record + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord.basicRecord + * @param record basic institutional record to be saved + * @return none + *************************************************************************/ +void setInstitBasicRecord( DD_INSTIT_BASIC_RECORD_T record ) +{ + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord = record; +} + +/*********************************************************************//** + * @brief + * The getInstitAdvancedRecord function gets the advanced institutional record + * @details \b Inputs:ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord + * @details \b Outputs: none + * @return NVM advanced institutional Record + *************************************************************************/ +DD_INSTIT_ADVANCED_RECORD_T getInstitAdvancedRecord( void ) +{ + return ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord; +} + +/*********************************************************************//** + * @brief + * The setInstitAdvancedRecord function sets the advanced institutional record + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord + * @param record Advanced institutional record to be saved + * @return none + *************************************************************************/ +void setInstitAdvancedRecord( DD_INSTIT_ADVANCED_RECORD_T record ) +{ + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord = record; +} + +/*********************************************************************//** + * @brief + * The getInstitAdditionalRecord function gets the additional institutional record + * @details \b Inputs:ddInstitutionalGroup.ddInstitutionalRecord.additionalInstitRecord + * @details \b Outputs: none + * @return NVM additional institutional Record + *************************************************************************/ +DD_INSTIT_ADDITIONAL_RECORD_T getInstitAdditionalRecord( void ) +{ + return ddInstitutionalGroup.ddInstitutionalRecord.additionalInstitRecord; +} + +/*********************************************************************//** + * @brief + * The setInstitAdditionalRecord function sets the additional institutional record + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord.additionalInstitRecord + * @param record Additional institutional record to be saved + * @return none + *************************************************************************/ +void setInstitAdditionalRecord( DD_INSTIT_ADDITIONAL_RECORD_T record ) +{ + ddInstitutionalGroup.ddInstitutionalRecord.additionalInstitRecord = record; +} + +/*********************************************************************//** + * @brief + * The getUsageInfoRecord function gets the usage info record + * @details \b Inputs:ddUsageInfoGroup.ddUsageInfoRecord + * @details \b Outputs: none + * @return NVM Usage Informationl Record + *************************************************************************/ +DD_USAGE_INFO_RECORD_T getUsageInfoRecord( void ) +{ + return ddUsageInfoGroup.ddUsageInfoRecord +} + +/*********************************************************************//** + * @brief + * The setUsageInfoRecord function sets the usage info record + * @details \b Inputs: none + * @details \b Outputs: ddUsageInfoGroup.ddUsageInfoRecord + * @param record Usage Information record to be saved + * @return none + *************************************************************************/ +void setUsageInfoRecord( DD_USAGE_INFO_RECORD_T record ) +{ + ddUsageInfoGroup.ddUsageInfoRecord = record; +} + +/*********************************************************************//** + * @brief * The getNVMRecord function copies the requested non-volatile * data into the provided buffer and checks if the data is valid. It * raises the specified alarm if invalid data is detected. @@ -1662,7 +1943,7 @@ dataSize = sizeof( ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord ); break; - case DD_CAL_RECORD_BLLOD_LEAK_SENSOR: + case DD_CAL_RECORD_BLOOD_LEAK_SENSOR: destPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord; dataSize = sizeof( ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord ); break; @@ -1990,20 +2271,26 @@ return result; } -/*********************************************************************//** - * @brief - * The getInstitRecDataType function gets the data type associated with - * the specified institutional record item. - * @details \b Inputs: institRecDataTypeTable - * @details \b Outputs: none - * @param institRecType Institutional record type - * @return Data type of the institutional record component - *************************************************************************/ -CRITICAL_DATA_TYPES_T getInstitRecDataType( DD_INSTIT_REC_TYPE institRecType ) +DD_INSTIT_BASIC_RECORD_T getNVMInstitBasicRecord( void ) { - return institRecDataTypeTable[ institRecType ]; + return ddInstitutionalGroup.ddInstitutionalRecord.basicRecord; } +void setNVMInstitBasicRecord( DD_INSTIT_BASIC_RECORD_T record ) +{ + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord = record; +} + +DD_INSTIT_ADVANCED_RECORD_T getNVMInstitAdvancedRecord( void ) +{ + return ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord; +} + +void setNVMInstitAdvancedRecord( DD_INSTIT_ADVANCED_RECORD_T record ) +{ + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord = record; +} + /*********************************************************************//** * @brief * The sendNVEvent function sends the event associated with the