Index: firmware/App/Services/NVMessagingDD.c =================================================================== diff -u -r2078ddd685487111457759eca96387b2008d6717 -r1e742ba641458eaf36c8d953275a3e1c32b943d4 --- firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision 2078ddd685487111457759eca96387b2008d6717) +++ firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision 1e742ba641458eaf36c8d953275a3e1c32b943d4) @@ -2336,9 +2336,9 @@ if ( idx < NUM_OF_BICARB_TYPE ) { newRequest.requestType = NVM_MSG_GET_RECORD_REQUEST; - newRequest.recordType = NV_DD_DATA_CAL_BICARB_CONCENTRATES; - newRequest.idx = idx; - result = enqueueNVMsgRequest( newRequest ); + newRequest.recordType = NV_DD_DATA_CAL_BICARB_CONCENTRATES; + newRequest.idx = idx; + result = enqueueNVMsgRequest( newRequest ); if ( FALSE == result ) { Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -r2078ddd685487111457759eca96387b2008d6717 -r1e742ba641458eaf36c8d953275a3e1c32b943d4 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 2078ddd685487111457759eca96387b2008d6717) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 1e742ba641458eaf36c8d953275a3e1c32b943d4) @@ -122,20 +122,6 @@ // ********** DD record structures ********** -/// DD calibration groups structure -typedef struct -{ - DD_PRES_SENSORS_CAL_RECORD_T presSensorsCalRecord; ///< DD pressure sensors calibration record - DD_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DD temperature sensors calibration record - DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsRecord; ///< DD concentrate pumps calibration record - DD_D12_DIALYSATE_PUMP_RECORD_T d12DialysatePumpRecord; ///< DD dialysate pump d12 calibration data. - DD_D48_DIALYSATE_PUMP_RECORD_T d48DialysatePumpRecord; ///< DD dialysate pumps calibration record - DD_ACID_CONCENTRATES_RECORD_T acidConcentratesRecord; ///< DD acid concentrates calibration record - DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentratesRecord; ///< DD bicarb concentrates calibration record - DD_ACCEL_SENSOR_CAL_RECORD_T accelerometerSensorCalRecord; ///< DD accelerometer sensor. - DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T bloodLeakSensorCalRecord; ///< DD blood leak detector calibration record -} DD_CALIBRATION_RECORD_T; - /// DD calibration group structure typedef struct { @@ -152,22 +138,14 @@ U16 crc; ///< CRC for the DG system group structure. } DD_SYSTEM_GROUP_T; -/// DD service record structure +/// DD service group structure typedef struct { DD_SERVICE_RECORD_T ddServiceRecord; ///< DD service record. U08 padding[ SERVICE_RECORD_PADDING_LENGTH ]; ///< DD service group padding. 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 { @@ -179,7 +157,7 @@ /// DD usage group structure typedef struct { - DD_USAGE_INFO_RECORD_T ddUsageInfoRecord; ///< DD usage info record. + DD_USAGE_INFO_RECORD_T ddUsageInfoRecord; ///< DD usage info record. U08 padding[ USAGE_INFO_RECORD_PADDING_LENGTH ]; ///< DD scheduled run group padding. U16 crc; ///< CRC for the DG usage info structure. } DD_USAGE_INFO_GROUP_T; @@ -220,6 +198,7 @@ static BOOL isLinearRecordValid( LINEAR_CAL_PAYLOAD_T* record ); static BOOL isDDSerialNumberValid( void ); static BOOL isDDSystemRecordValid( void ); +static BOOL isFPServiceRecordValid( void ); static BOOL isDDServiceRecordValid( void ); static BOOL isDDInstitutionalRecordValid( void ); static BOOL isDDInstitBasicRecordValid( void ); @@ -232,13 +211,16 @@ static BOOL isDDAccelerometerSensorRecordValid( DD_ACCEL_SENSOR_CAL_RECORD_T* record ); static BOOL isDDBloodLeakSensorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); static BOOL isDDConductivitySensorValid( void ); +static BOOL isFPUsageRecordValid( void ); static BOOL isDDUsageRecordValid( void ); static void initDDSystemRecord( void ); +static void initFPServiceRecord( void ); static void initDDServiceRecord( void ); static void initDDInstitBasicRecord( void ); static void initDDInstitAdvancedRecord( void ); static void initDDInstitAdditionalRecord( void ); +static void initFPUsageRecord( void ); static void initDDUsageRecord( void ); static void updateRecordPadding( NVM_RECORD_TYPE_T recType ); @@ -360,13 +342,15 @@ NVM_SELF_TEST_STATE_T state = NVM_SELF_TEST_STATE_COMPLETE; BOOL hasSerialNumberPassed = TRUE; BOOL hasSystemRecordPassed = TRUE; + BOOL hasFPServiceRecordPassed = TRUE; BOOL hasServiceRecordPassed = TRUE; BOOL hasCalRecordPassed = TRUE; BOOL hasConductivityCalRecordPassed = TRUE; BOOL hasInstitBasicPassed = TRUE; BOOL hasInstitAdvancedPassed = TRUE; BOOL hasInstitAdditionalPassed = TRUE; BOOL hasInstitutionalRecordPassed = TRUE; + BOOL hasFPUsageRecordPassed = TRUE; BOOL hasUsageRecordPassed = TRUE; updateRecordReadStatus( NVM_RECORDS_CRC_CHECKED ); @@ -378,13 +362,19 @@ // Validate the Records hasSerialNumberPassed = isDDSerialNumberValid(); hasSystemRecordPassed = isDDSystemRecordValid(); + + hasFPServiceRecordPassed = isFPServiceRecordValid(); hasServiceRecordPassed = isDDServiceRecordValid(); + hasConductivityCalRecordPassed = isDDConductivitySensorValid(); hasCalRecordPassed = isDDCalibrationRecordValid(); + hasInstitBasicPassed = isDDInstitBasicRecordValid(); hasInstitAdvancedPassed = isDDInstitAdvancedRecordValid(); hasInstitAdditionalPassed = isDDInstitAdditionalRecordValid(); hasInstitutionalRecordPassed = isDDInstitutionalRecordValid(); + + hasFPUsageRecordPassed = isFPUsageRecordValid(); hasUsageRecordPassed = isDDUsageRecordValid(); // Activate alarm for the records that have failed @@ -398,6 +388,11 @@ activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SYSTEM_RECORD_CRC ); } + if ( FALSE == hasFPServiceRecordPassed ) + { + activateAlarmNoData( ALARM_ID_FP_NVM_INVALID_SERVICE_RECORD_CRC ); + } + if ( FALSE == hasServiceRecordPassed ) { activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SERVICE_RECORD_CRC ); @@ -429,6 +424,16 @@ activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ); } + if ( FALSE == hasFPServiceRecordPassed ) + { + activateAlarmNoData( ALARM_ID_FP_NVM_INVALID_SERVICE_RECORD_CRC ); + } + + if ( FALSE == hasFPUsageRecordPassed ) + { + activateAlarmNoData( ALARM_ID_FP_NVM_INVALID_USAGE_RECORD_CRC ); + } + if ( FALSE == hasUsageRecordPassed ) { activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC ); @@ -520,7 +525,7 @@ * system record. It verifies CRC and updates the record with default * values if invalid. * @details \b Inputs: ddSystemGroup.ddSystemRecord - * @details \b Outputs: ddSystemGroup.ddSystemRecord, ddSystemGroup.crc + * @details \b Outputs: None * @return TRUE if the DD system record is valid otherwise FALSE *************************************************************************/ static BOOL isDDSystemRecordValid( void ) @@ -554,25 +559,83 @@ /*********************************************************************//** * @brief - * The isDDServiceRecordValid function checks the validity of the DD + * The isFPServiceRecordValid function checks the validity of the FP * service record. It verifies CRC and updates the record with default * values if invalid. + * @details \b Inputs: ddServiceGroup.ddServiceRecord.fpRecord + * @details \b Outputs: None + * @return TRUE if the FP service record is valid otherwise FALSE + *************************************************************************/ +static BOOL isFPServiceRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddServiceGroup.ddServiceRecord.fpRecord, + sizeof( SERVICE_RECORD_FP_T ) - sizeof( U16 ) ); + U16 recordCRC = ddServiceGroup.ddServiceRecord.fpRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + initFPServiceRecord(); + + // Recalculate the CRC with the default values + updateRecordCRC( NVM_SERVICE_RECORD ); + + // Write the record to flash + enqueueEraseAndWriteSector( NVM_SERVICE_RECORD ); + + // Indicate that the record was updated + sendNVEvent( NVM_SERVICE_RECORD, 0, 0 ); + + status = FALSE; + } + + return status; +} + +/*********************************************************************//** + * @brief + * The isDDServiceRecordValid function checks the validity of the DD + * service record. It verifies CRC and updates the record + * with default values if invalid. * @details \b Inputs: ddServiceGroup.ddServiceRecord - * @details \b Outputs: ddServiceGroup.ddServiceRecord, - * ddServiceGroup.crc + * @details \b Outputs: None * @return TRUE if the DD service record is valid otherwise FALSE *************************************************************************/ static BOOL isDDServiceRecordValid( void ) { - BOOL status = TRUE; - U16 calcCRC = crc16( (U08*)&ddServiceGroup.ddServiceRecord, sizeof( DD_SERVICE_RECORD_T ) - sizeof( U16 ) ); - U16 recordCRC = ddServiceGroup.ddServiceRecord.crc; + BOOL status = TRUE; + BOOL hasRecordCRCPassed = TRUE; + BOOL hasGroupCRCPassed = TRUE; + U16 calcCRC = crc16( (U08*)&ddServiceGroup.ddServiceRecord.ddRecord, + sizeof( SERVICE_RECORD_DD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddServiceGroup.ddServiceRecord.ddRecord.crc; + + U16 calcGroupCRC = crc16( (U08*)&ddServiceGroup, + sizeof( DD_SERVICE_GROUP_T ) - sizeof( U16 ) ); + U16 groupCRC = ddServiceGroup.crc; + + //Check if the record crc is valid if ( calcCRC != recordCRC ) { // CRC did not pass so set all values to default initDDServiceRecord(); + hasRecordCRCPassed = FALSE; + } + //Check if the group crc is valid + if ( calcGroupCRC != groupCRC ) + { + // CRC did not pass so set all values to default + initFPServiceRecord(); + initDDServiceRecord(); + hasGroupCRCPassed = FALSE; + } + + if ( ( FALSE == hasRecordCRCPassed ) || + ( FALSE == hasGroupCRCPassed ) ) + { // Initialize the padding updateRecordPadding( NVM_SERVICE_RECORD ); @@ -597,7 +660,7 @@ * institutional record. It verifies CRC and updates the record * with default values if invalid. * @details \b Inputs: ddInstitutionalGroup - * @details \b Outputs: ddInstitutionalGroup + * @details \b Outputs: None * @return TRUE if the DD Institutional record is valid otherwise FALSE *************************************************************************/ static BOOL isDDInstitutionalRecordValid( void ) @@ -610,6 +673,11 @@ //Check if the group crc is valid if ( calcCRC != recordCRC ) { + // CRC did not pass so set all values to default + initDDInstitBasicRecord(); + initDDInstitAdvancedRecord(); + initDDInstitAdditionalRecord(); + // Initialize the padding updateRecordPadding( NVM_INSTITUTIONAL_RECORD ); @@ -633,8 +701,8 @@ * The isDDInstitBasicRecordValid function checks the validity of the DD * basic institutional record. It verifies CRC and updates the record * with default values if invalid. - * @details \b Inputs: ddInstitutionalGroup - * @details \b Outputs: ddInstitutionalGroup + * @details \b Inputs: ddInstitutionalGroup.ddInstitutionalRecord.basicRecord + * @details \b Outputs: None * @return TRUE if the DD Basic Institutional record is valid otherwise FALSE *************************************************************************/ static BOOL isDDInstitBasicRecordValid( void ) @@ -669,8 +737,8 @@ * The isDDInstitAdvancedRecordValid function checks the validity of the DD * advanced institutional record. It verifies CRC and updates the record * with default values if invalid. - * @details \b Inputs: ddInstitutionalGroup - * @details \b Outputs: ddInstitutionalGroup + * @details \b Inputs: ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord + * @details \b Outputs: None * @return TRUE if the DD Advanced Institutional record is valid otherwise FALSE *************************************************************************/ static BOOL isDDInstitAdvancedRecordValid( void ) @@ -705,8 +773,8 @@ * The isDDInstitAdditionalRecordValid function checks the validity of the DD * addtional institutional record. It verifies CRC and updates the record * with default values if invalid. - * @details \b Inputs: ddInstitutionalGroup - * @details \b Outputs: ddInstitutionalGroup + * @details \b Inputs: ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord + * @details \b Outputs: None * @return TRUE if the DD Addtional Institutional record is valid otherwise FALSE *************************************************************************/ static BOOL isDDInstitAdditionalRecordValid( void ) @@ -1021,7 +1089,7 @@ for ( sensorIdx = 0; sensorIdx < NUM_OF_CONDUCTIVITY_SENSORS; sensorIdx++ ) { // Get the Conductivity Sensor Calibration Data - record = getConductivityCalibrationData( sensorIdx ); + record = getConductivityCalibrationData( (CONDUCTIVITY_SENSORS_T)sensorIdx ); // Calculate the CRC calcCRC = crc16( (U08*)&record, sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); @@ -1060,24 +1128,84 @@ /*********************************************************************//** * @brief + * The isFPUsageRecordValid function checks the validity of the FP + * usage information record. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Inputs: ddUsageInfoGroup.ddUsageInfoRecord.fpRecord. + * @details \b Outputs: None + * @return TRUE if the DD usage record is valid otherwise FALSE + *************************************************************************/ +static BOOL isFPUsageRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord.fpRecord, + sizeof( USAGE_RECORD_DD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + initFPUsageRecord(); + + // Initialize the padding + updateRecordPadding( NVM_USAGE_INFO_RECORD ); + + // Recalculate the CRC with the default values + updateRecordCRC( NVM_USAGE_INFO_RECORD ); + + // Write the record to flash + enqueueEraseAndWriteSector ( NVM_USAGE_INFO_RECORD ); + + // Indicate that the record was updated + sendNVEvent( NVM_USAGE_INFO_RECORD, 0, 0 ); + + status = FALSE; + } + + return status; +} + +/*********************************************************************//** + * @brief * The isDDUsageRecordValid function checks the validity of the DD * usage information record. It verifies CRC and updates the record * with default values if invalid. * @details \b Inputs: ddUsageInfoGroup - * @details \b Outputs: ddUsageInfoGroup + * @details \b Outputs: None * @return TRUE if the DD usage record is valid otherwise FALSE *************************************************************************/ static BOOL isDDUsageRecordValid( void ) { - BOOL status = TRUE; - U16 calcCRC = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord, sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); - U16 recordCRC = ddUsageInfoGroup.ddUsageInfoRecord.crc; + BOOL status = TRUE; + BOOL hasRecordCRCPassed = TRUE; + BOOL hasGroupCRCPassed = TRUE; + U16 calcCRC = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord.ddRecord, + sizeof( USAGE_RECORD_DD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.crc; + + U16 calcGroupCRC = crc16( (U08*)&ddUsageInfoGroup, + sizeof( DD_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); + U16 groupCRC = ddUsageInfoGroup.crc; + if ( calcCRC != recordCRC ) { // CRC did not pass so set all values to default initDDUsageRecord(); + hasRecordCRCPassed = FALSE; + } + if ( calcGroupCRC != groupCRC ) + { + // CRC did not pass so set all values to default + initFPUsageRecord(); + initDDUsageRecord(); + hasGroupCRCPassed = FALSE; + } + + if ( ( FALSE == hasRecordCRCPassed ) || + ( FALSE == hasGroupCRCPassed ) ) + { // Initialize the padding updateRecordPadding( NVM_USAGE_INFO_RECORD ); @@ -1117,6 +1245,32 @@ /*********************************************************************//** * @brief + * The initFPServiceRecord function initializes the FP service record + * with default values. It resets service related information and + * timestamps. + * @details \b Inputs: none + * @details \b Outputs: ddServiceGroup.ddServiceRecord.fpRecord + * @return none + *************************************************************************/ +static void initFPServiceRecord( void ) +{ + ddServiceGroup.ddServiceRecord.fpRecord.waterRecovery = 0; + ddServiceGroup.ddServiceRecord.fpRecord.primaryFilterReplacementDate = 0; + ddServiceGroup.ddServiceRecord.fpRecord.secondaryFilterReplacementDate = 0; + ddServiceGroup.ddServiceRecord.fpRecord.ROMembraneReplacementDate = 0; + ddServiceGroup.ddServiceRecord.fpRecord.serviceLoc = 0; + ddServiceGroup.ddServiceRecord.fpRecord.lastServiceEpochDate = 0; + ddServiceGroup.ddServiceRecord.fpRecord.serviceIntervalSeconds = 0; + + // TODO: Update lastUpdatedTime to current timestamp published by UI. + ddServiceGroup.ddServiceRecord.fpRecord.lastResetTimeEpoch = RECORD_DEFAULT_TIME; + + ddServiceGroup.ddServiceRecord.fpRecord.crc = crc16( (U08*)&ddServiceGroup.fpServiceRecord, + sizeof( SERVICE_RECORD_FP_T ) - sizeof( U16 ) ); +} + +/*********************************************************************//** + * @brief * The initDDServiceRecord function initializes the DD service record * with default values. It resets service related information and * timestamps. @@ -1126,12 +1280,20 @@ *************************************************************************/ static void initDDServiceRecord( void ) { - ddServiceGroup.ddServiceRecord.isHDFOnlineFluidAvailable = FALSE; - ddServiceGroup.ddServiceRecord.waterRecovery = 0; - ddServiceGroup.ddServiceRecord.serviceLoc = 0; - ddServiceGroup.ddServiceRecord.lastServiceEpochDate = 0; - ddServiceGroup.ddServiceRecord.serviceIntervalSeconds = 0; -// ddServiceGroup.ddServiceRecord.lastResetTimeEpoch = getRTCTimestamp(); + ddServiceGroup.ddServiceRecord.ddRecord.isHDFOnlineFluidAvailable = 0; + ddServiceGroup.ddServiceRecord.ddRecord.UltraFilter1ReplacementDate = 0; + ddServiceGroup.ddServiceRecord.ddRecord.UltraFilter2ReplacementDate = 0; + ddServiceGroup.ddServiceRecord.ddRecord.UFPumpTubingReplacementDate = 0; + ddServiceGroup.ddServiceRecord.ddRecord.serviceLoc = 0; + ddServiceGroup.ddServiceRecord.ddRecord.lastServiceEpochDate = 0; + ddServiceGroup.ddServiceRecord.ddRecord.serviceIntervalSeconds = 0; + ddServiceGroup.ddServiceRecord.ddRecord.lastResetTimeEpoch = 0; + + // TODO: Update lastUpdatedTime to current timestamp published by UI. + ddServiceGroup.ddServiceRecord.ddRecord.lastResetTimeEpoch = RECORD_DEFAULT_TIME; + + ddServiceGroup.ddServiceRecord.ddRecord.crc = crc16( (U08*)&ddServiceGroup.ddServiceRecord, + sizeof( SERVICE_RECORD_DD_T ) - sizeof( U16 ) ); } /*********************************************************************//** @@ -1205,6 +1367,31 @@ /*********************************************************************//** * @brief + * The initFPUsageRecord function initializes the FP usage record with + * default values. It resets usage information, counters, and + * maintenance timestamps. + * @details \b Inputs: none + * @details \b Outputs: ddUsageInfoGroup.fpUsageInfoRecord + * @return none + *************************************************************************/ +static void initFPUsageRecord( void ) +{ + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.primaryFilterTreatmentNum; = 0; + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.primaryFilterDisinfectionNum; = 0; + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.secondaryFilterTreatmentNum; = 0; + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.secondaryFilterDisinfectionNum; = 0; + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.ROMembraneTreatmentNum; = 0; + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.ROMembraneDisinfectionNum; = 0; + + // TODO: Update lastUpdatedTime to current timestamp published by UI. + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.lastResetTimeEpoch = RECORD_DEFAULT_TIME; + + ddUsageInfoGroup.ddUsageInfoRecord.fpRecord.crc = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord.fpRecord, + sizeof( USAGE_RECORD_FP_T ) - sizeof( U16 ) ); +} + +/*********************************************************************//** + * @brief * The initDDUsageRecord function initializes the DD usage record with * default values. It resets usage information, counters, and * maintenance timestamps. @@ -1214,13 +1401,24 @@ *************************************************************************/ static void initDDUsageRecord( void ) { - ddUsageInfoGroup.ddUsageInfoRecord.roWaterGenTotalL = 0.0F; - ddUsageInfoGroup.ddUsageInfoRecord.roWaterGenSinceLastServiceL = 0.0F; - ddUsageInfoGroup.ddUsageInfoRecord.lastBasicFlushCompleteDateEpoch = 0; - ddUsageInfoGroup.ddUsageInfoRecord.lastHeatDisCompleteDateEpoch = 0; - ddUsageInfoGroup.ddUsageInfoRecord.lastHeatActiveCoolCompleteDateEpoch = 0; - ddUsageInfoGroup.ddUsageInfoRecord.lastFilterFlushCompleteDateEpoch = 0; -// ddUsageInfoGroup.ddUsageInfoRecord.lastResetTimeEpoch = getRTCTimestamp(); + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.roWaterGenTotalL = 0.0F; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.roWaterGenSinceLastServiceL = 0.0F; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UltraFilter1TreatmentNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UltraFilter1DisinfectionNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UltraFilter2TreatmentNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UltraFilter2DisinfectionNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UFPumpTubingTreatmentNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.UFPumpTubingDisinfectionNum = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.lastBasicFlushCompleteDateEpoch = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.lastHeatDisCompleteDateEpoch = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.lastHeatActiveCoolCompleteDateEpoch = 0; + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.lastFilterFlushCompleteDateEpoch = 0; + + // TODO: Update lastUpdatedTime to current timestamp published by UI. + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.lastResetTimeEpoch = RECORD_DEFAULT_TIME; + + ddUsageInfoGroup.ddUsageInfoRecord.ddRecord.crc = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord.ddRecord, + sizeof( USAGE_RECORD_DD_T ) - sizeof( U16 ) ); } /*********************************************************************//** Index: firmware/App/Services/NVRecordsDD.h =================================================================== diff -u -r6d135d17d73d70a909f346bff2a9b14fec7d2478 -r1e742ba641458eaf36c8d953275a3e1c32b943d4 --- firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision 6d135d17d73d70a909f346bff2a9b14fec7d2478) +++ firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision 1e742ba641458eaf36c8d953275a3e1c32b943d4) @@ -127,7 +127,7 @@ /// DD Institutional advanced items typedef enum DD_instit_advanced_items { - INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM = 0, ///< RO Rejection Ratio Alarm Threshold + INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM = 0, ///< RO Rejection Ratio Alarm Threshold FIRST_INSTIT_ADVANCED_PARAM = INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM, ///< First Institutional advanced parameter INSTIT_PARAM_DISINFECTION_FREQUENCY, ///< Disinfection Frequency INSTIT_PARAM_DISINFECTION_CYCLE_TIME, ///< Disinfection Parameters, Cycle Time @@ -163,19 +163,19 @@ /// Pressure sensors calibration record typedef struct { - LINEAR_CAL_PAYLOAD_T pressureSensors[ NUM_OF_PRESSURE_SENSORS ]; ///< Pressure sensors to calibrate. + LINEAR_CAL_PAYLOAD_T pressureSensors[ NUM_OF_PRESSURE_SENSORS ]; ///< Pressure sensors to calibrate. } DD_PRES_SENSORS_CAL_RECORD_T; /// Temperature sensors calibration record typedef struct { - LINEAR_CAL_PAYLOAD_T tempSensors[ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors to calibrate. + LINEAR_CAL_PAYLOAD_T tempSensors[ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors to calibrate. } DD_TEMP_SENSORS_CAL_RECORD_T; /// DD concentrate pumps calibration record typedef struct { - LINEAR_CAL_PAYLOAD_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< DD concentrate pumps calibration data. + LINEAR_CAL_PAYLOAD_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< DD concentrate pumps calibration data. } DD_CONC_PUMPS_CAL_RECORD_T; /// DD D12 dialysate pump calibration record @@ -247,31 +247,68 @@ /// DD conductivity sensor calibration record. typedef struct { - CONDUCTIVITY_COEFFICIENTS_T condSensors[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< DD Conductivity Sensors + CONDUCTIVITY_COEFFICIENTS_T condSensors[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< DD Conductivity Sensors } DD_CONDUCTIVITY_SENSOR_CAL_RECORD_T; +/// DD calibration groups structure +typedef struct +{ + DD_PRES_SENSORS_CAL_RECORD_T presSensorsCalRecord; ///< DD pressure sensors calibration record + DD_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DD temperature sensors calibration record + DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsRecord; ///< DD concentrate pumps calibration record + DD_D12_DIALYSATE_PUMP_RECORD_T d12DialysatePumpRecord; ///< DD dialysate pump d12 calibration data. + DD_D48_DIALYSATE_PUMP_RECORD_T d48DialysatePumpRecord; ///< DD dialysate pumps calibration record + DD_ACID_CONCENTRATES_RECORD_T acidConcentratesRecord; ///< DD acid concentrates calibration record + DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentratesRecord; ///< DD bicarb concentrates calibration record + DD_ACCEL_SENSOR_CAL_RECORD_T accelerometerSensorCalRecord; ///< DD accelerometer sensor. + DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T bloodLeakSensorCalRecord; ///< DD blood leak detector calibration record +} DD_CALIBRATION_RECORD_T; + /// DD systems record structure typedef struct { BOOL isROFeatured; ///< True : RO featured. False : RO de-featured. BOOL isROFeaturedBoostPump; ///< True : RO featured with boost pump. False : RO featured without the boost pump. char topLevelPN[ MAX_TOP_LEVEL_PN_CHARS ]; ///< DD top level part number. char topLevelSN[ MAX_TOP_LEVEL_SN_CHARS ]; ///< DD top level serial number. - U08 mfgLocation; ///< DD manufacturing location. + U32 mfgLocation; ///< DD manufacturing location. U32 mfgDate; ///< DD manufacturing date. U16 crc; ///< CRC for the DD system record structure. } DD_SYSTEM_RECORD_T; +/// FP service record structure +typedef struct +{ + U32 waterRecovery; ///< Low : 0, Medium : 1, High : 2. + U32 primaryFilterReplacementDate; ///< Last replacement date of primary carbon filter + U32 secondaryFilterReplacementDate; ///< Last replacement date of secondary carbon filter + U32 ROMembraneReplacementDate; ///< Last replacement date of RO Membrane + U32 serviceLoc; ///< DD service location. + U32 lastServiceEpochDate; ///< DD last service date in epoch. + U32 serviceIntervalSeconds; ///< DD service interval in seconds. + U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. + U16 crc; ///< CRC for the DD service record structure. +} SERVICE_RECORD_FP_T; + /// DD service record structure typedef struct { BOOL isHDFOnlineFluidAvailable; ///< True : HDF Online Fluid feature is available, False if not. - U32 waterRecovery; ///< Low : 0, Medium : 1, High : 2. - U08 serviceLoc; ///< DD service location. + U32 UltraFilter1ReplacementDate; ///< Last replacement date of Ultrafilter 1 + U32 UltraFilter2ReplacementDate; ///< Last replacement date of Ultrafilter 2 + U32 UFPumpTubingReplacementDate; ///< Last replacement date of UP Pump Tubing + U32 serviceLoc; ///< DD service location. U32 lastServiceEpochDate; ///< DD last service date in epoch. U32 serviceIntervalSeconds; ///< DD service interval in seconds. U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. U16 crc; ///< CRC for the DD service record structure. +} SERVICE_RECORD_DD_T; + +/// DD service record structure +typedef struct +{ + SERVICE_RECORD_FP_T fpRecord; ///< FP service record + SERVICE_RECORD_DD_T ddRecord; ///< DD service record. } DD_SERVICE_RECORD_T; /// Institutional data structure. @@ -310,17 +347,51 @@ U16 crc; ///< CRC of the institutional record. } DD_INSTIT_ADDITIONAL_RECORD_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; + +/// FP usage info structure. +typedef struct +{ + U32 primaryFilterTreatmentNum; ///< Number of treatments performed on ultrafilter 1 since last replaced + U32 primaryFilterDisinfectionNum; ///< Number of disinfections performed on ultrafilter 1 since last replaced + U32 secondaryFilterTreatmentNum; ///< Number of treatments performed on ultrafilter 2 since last replaced + U32 secondaryFilterDisinfectionNum; ///< Number of disinfections performed on ultrafilter 2 since last replaced + U32 ROMembraneTreatmentNum; ///< Number of treatments performed on UF Pump Tubing since last replaced + U32 ROMembraneDisinfectionNum; ///< Number of disinfections performed on UF Pump Tubing since last replaced + U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. + U16 crc; ///< CRC for the DD usage info structure. +} USAGE_RECORD_FP_T; + /// DD usage info structure. typedef struct { F32 roWaterGenTotalL; ///< Total RO water generated in liters. (Cannot be reset) F32 roWaterGenSinceLastServiceL; ///< RO water generated since last treatment in liters. + U32 UltraFilter1TreatmentNum; ///< Number of treatments performed on ultrafilter 1 since last replaced + U32 UltraFilter1DisinfectionNum; ///< Number of disinfections performed on ultrafilter 1 since last replaced + U32 UltraFilter2TreatmentNum; ///< Number of treatments performed on ultrafilter 2 since last replaced + U32 UltraFilter2DisinfectionNum; ///< Number of disinfections performed on ultrafilter 2 since last replaced + U32 UFPumpTubingTreatmentNum; ///< Number of treatments performed on UF Pump Tubing since last replaced + U32 UFPumpTubingDisinfectionNum; ///< Number of disinfections performed on UF Pump Tubing since last replaced U32 lastBasicFlushCompleteDateEpoch; ///< Last basic flush complete date in epoch. U32 lastHeatDisCompleteDateEpoch; ///< Last heat disinfect complete date in epoch. U32 lastHeatActiveCoolCompleteDateEpoch; ///< Last heat disinfect active cool complete date in epoch. U32 lastFilterFlushCompleteDateEpoch; ///< Last filter flush complete date in epoch. U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. U16 crc; ///< CRC for the DD usage info structure. +} USAGE_RECORD_DD_T; + +/// DD usage info record structure +typedef struct +{ + USAGE_RECORD_FP_T fpRecord; ///< FP usage info record. + USAGE_RECORD_DD_T ddRecord; ///< DD usage info record. } DD_USAGE_INFO_RECORD_T; #pragma pack(pop)