Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rbeb95e3e8f85740707704d7089db8b3ec8574bbd -r0599bd5494eb64416999de0487a9882c557b6044 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision beb95e3e8f85740707704d7089db8b3ec8574bbd) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 0599bd5494eb64416999de0487a9882c557b6044) @@ -237,7 +237,6 @@ static void updateRecordPadding( NVM_RECORD_TYPE_T recType ); - /*********************************************************************//** * @brief * The initNVRecordsDD function initializes the NV records data management @@ -254,19 +253,6 @@ nvmSelfTestState = NVM_SELF_TEST_STATE_READ_RECORDS; nvmSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; usageWriteTries = 0; - -// initDDSystemRecord(); -// initDDServiceRecord(); -// initDDInstitutionalRecord(); -// initDDCalibrationRecord(); -// initDDUsageRecord(); -// -// int i; -// for( i = 0; i < NUM_OF_NVM_RECORD_TYPES; i++ ) -// { -// updateRecordPadding( (NVM_RECORD_TYPE_T)i ); -// updateRecordCRC( ( NVM_RECORD_TYPE_T )i); -// } } /*********************************************************************//** @@ -363,25 +349,21 @@ BOOL hasSystemRecordPassed = TRUE; BOOL hasServiceRecordPassed = TRUE; BOOL haveCalGroupsPassed = TRUE; + BOOL hasInstitutionalRecordPassed = TRUE; BOOL hasUsageRecordPassed = TRUE; updateRecordReadStatus( NVM_RECORDS_CRC_CHECKED ); - // Check all the calibration groups - haveCalGroupsPassed = isDDCalibrationRecordValid(); - hasServiceRecordPassed = isDDServiceRecordValid(); - hasUsageRecordPassed = isDDUsageRecordValid(); - // If any of the records did not pass, they should be filled // with benign values. After that, schedule a write to sector // to re-write the records with the benign values // Validate system record - hasSystemRecordPassed = isDDSystemRecordValid(); + hasSystemRecordPassed = isDDSystemRecordValid(); if ( FALSE == hasSystemRecordPassed ) { enqueueEraseAndWriteSector ( NVM_SYSTEM_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SYSTEM_RECORD ].nvEvent, 0, 0 ); + sendNVEvent( NVM_SYSTEM_RECORD, 0, 0 ); } // Validate service and calibration records @@ -390,22 +372,34 @@ if ( ( FALSE == hasServiceRecordPassed ) || ( FALSE == haveCalGroupsPassed ) ) { enqueueEraseAndWriteSector ( NVM_SERVICE_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SERVICE_RECORD ].nvEvent, 0, 0 ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_CALIBRATION_RECORD ].nvEvent, 0, 0 ); + sendNVEvent( NVM_SERVICE_RECORD, 0, 0 ); + sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); + + startNewCalRecordAvailableTimer(); + setNewCalibrationRecordAvailable( TRUE ); } + + // Validate institutional record + hasInstitutionalRecordPassed = isDDInstitutionalRecordValid(); + if ( FALSE == hasInstitutionalRecordPassed ) + { + enqueueEraseAndWriteSector ( NVM_INSTITUTIONAL_RECORD ); + sendNVEvent( NVM_INSTITUTIONAL_RECORD, 0, 0 ); + } + // Validate usage info record + hasUsageRecordPassed = isDDUsageRecordValid(); if ( FALSE == hasUsageRecordPassed ) { enqueueEraseAndWriteSector ( NVM_USAGE_INFO_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); + sendNVEvent( NVM_USAGE_INFO_RECORD, 0, 0 ); } // Check if the records' entire CRCs as well as the individual CRCs passed if ( ( TRUE == hasSystemRecordPassed ) && ( TRUE == hasServiceRecordPassed ) && - ( TRUE == haveCalGroupsPassed ) && ( TRUE == hasUsageRecordPassed ) ) + ( TRUE == haveCalGroupsPassed ) && ( TRUE == hasInstitutionalRecordPassed ) && + ( TRUE == hasUsageRecordPassed ) ) { - startNewCalRecordAvailableTimer(); - setNewCalibrationRecordAvailable( TRUE ); nvmSelfTestResult = SELF_TEST_STATUS_PASSED; } else @@ -877,7 +871,15 @@ return status; } - +/*********************************************************************//** + * @brief + * The initDDSystemRecord function initializes the DD system record + * with default values. It resets configuration fields and fills + * string fields with default characters. + * @details \b Inputs: none + * @details \b Outputs: ddSystemGroup.ddSystemRecord + * @return none + *************************************************************************/ static void initDDSystemRecord( void ) { ddSystemGroup.ddSystemRecord.isROFeatured = FALSE; @@ -888,6 +890,15 @@ ddSystemGroup.ddSystemRecord.mfgDate = 0; } +/*********************************************************************//** + * @brief + * The initDDServiceRecord function initializes the DD service record + * with default values. It resets service related information and + * timestamps. + * @details \b Inputs: none + * @details \b Outputs: ddServiceGroup.ddServiceRecord + * @return none + *************************************************************************/ static void initDDServiceRecord( void ) { ddServiceGroup.ddServiceRecord.isHDFOnlineFluid = FALSE; @@ -898,6 +909,15 @@ // ddServiceGroup.ddServiceRecord.lastResetTimeEpoch = getRTCTimestamp(); } +/*********************************************************************//** + * @brief + * The initDDInstitutionalRecord function initializes the DD + * institutional record with default values. It sets configuration + * limits, alarm thresholds, and treatment options to default values. + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord + * @return none + *************************************************************************/ static void initDDInstitutionalRecord( void ) { ddInstitutionalGroup.ddInstitutionalRecord.minDialysateFlowMLPM = DEFAULT_MIN_DIALYSATE_FLOW_MLPM; @@ -925,6 +945,15 @@ // ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime = getRTCTimestamp(); } +/*********************************************************************//** + * @brief + * The initDDUsageRecord function initializes the DD usage record with + * default values. It resets usage information, counters, and + * maintenance timestamps. + * @details \b Inputs: none + * @details \b Outputs: ddUsageInfoGroup.ddUsageInfoRecord + * @return none + *************************************************************************/ static void initDDUsageRecord( void ) { ddUsageInfoGroup.ddUsageInfoRecord.roWaterGenTotalL = 0.0F; @@ -936,6 +965,14 @@ // ddUsageInfoGroup.ddUsageInfoRecord.lastResetTimeEpoch = getRTCTimestamp(); } +/*********************************************************************//** + * @brief + * The initDDCalibrationRecord function initializes the DD calibration record with + * default values. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord + * @return none + *************************************************************************/ //static void initDDCalibrationRecord( void ) //{ // U32 i; @@ -1004,11 +1041,23 @@ // ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord.crc = crc16 ( (U08*)record, sizeof( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T ) - sizeof( U16 ) ); //} +/*********************************************************************//** + * @brief + * The updateRecordPadding function updates the padding bytes of the + * specified NV record. It clears all padding bytes to ensure + * consistent CRC calculation and record storage. + * @details \b Inputs: none + * @details \b Outputs: ddSystemGroup.padding, + * ddServiceGroup.padding, ddCalibrationGroup.padding, + * ddInstitutionalGroup.padding, ddUsageInfoGroup.padding + * @param recType Record type whose padding needs to be updated + * @return none + *************************************************************************/ static void updateRecordPadding( NVM_RECORD_TYPE_T recType ) { U32 i = 0; - switch( recType ) + switch ( recType ) { case NVM_SYSTEM_RECORD: { @@ -1058,10 +1107,25 @@ } } - +/*********************************************************************//** + * @brief + * The updateRecordCRC function updates the CRC values of the specified + * NV record and its associated group. It recalculates CRCs based on + * the current record contents. + * @details \b Inputs: none + * @details \b Outputs: ddSystemGroup.ddSystemRecord.crc, + * ddSystemGroup.crc, ddServiceGroup.ddServiceRecord.crc, + * ddServiceGroup.crc, ddCalibrationGroup.crc, + * ddInstitutionalGroup.ddInstitutionalRecord.crc, + * ddInstitutionalGroup.crc, + * ddUsageInfoGroup.ddUsageInfoRecord.crc, + * ddUsageInfoGroup.crc + * @param recType Record type whose CRC needs to be updated + * @return none + *************************************************************************/ void updateRecordCRC( NVM_RECORD_TYPE_T recType ) { - switch( recType ) + switch ( recType ) { case NVM_SYSTEM_RECORD: { @@ -1081,26 +1145,26 @@ break; case NVM_CALIBRATION_RECORD: { - ddCalibrationGroup.crc = crc16 ( (U08*)&ddCalibrationGroup, - sizeof( DD_CALIBRATION_GROUP_T ) - sizeof( U16 ) ); + ddCalibrationGroup.crc = crc16 ( (U08*)&ddCalibrationGroup, + sizeof( DD_CALIBRATION_GROUP_T ) - sizeof( U16 ) ); } break; case NVM_INSTITUTIONAL_RECORD: { ddInstitutionalGroup.ddInstitutionalRecord.crc = crc16 ( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, - sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); - ddInstitutionalGroup.crc = crc16 ( (U08*)&ddInstitutionalGroup, - sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); + sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); + ddInstitutionalGroup.crc = crc16 ( (U08*)&ddInstitutionalGroup, + sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); } break; case NVM_USAGE_INFO_RECORD: { ddUsageInfoGroup.ddUsageInfoRecord.crc = crc16 ( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord, - sizeof( DD_SERVICE_RECORD_T ) - sizeof( U16 ) ); - ddUsageInfoGroup.crc = crc16 ( (U08*)&ddUsageInfoGroup, - sizeof( DD_SERVICE_GROUP_T ) - sizeof( U16 ) ); + sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); + ddUsageInfoGroup.crc = crc16 ( (U08*)&ddUsageInfoGroup, + sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); } break; @@ -1156,7 +1220,7 @@ status = TRUE; enqueueEraseAndWriteSector( NVM_USAGE_INFO_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); + sendNVEvent( NVM_USAGE_INFO_RECORD, 0, 0 ); } else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) { @@ -1199,8 +1263,8 @@ enqueueEraseAndWriteSector( NVM_SERVICE_RECORD ); enqueueEraseAndWriteSector( NVM_USAGE_INFO_RECORD ); // Both the usage and service records have been updated - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SERVICE_RECORD ].nvEvent, 0, 0 ); + sendNVEvent( NVM_USAGE_INFO_RECORD, 0, 0 ); + sendNVEvent( NVM_SERVICE_RECORD, 0, 0 ); status = TRUE; } @@ -1237,60 +1301,175 @@ return ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM; } -POLYNOMIAL_CAL_PAYLOAD_T getPressureSensorCalRecord( U08 snsrIdx) +/*********************************************************************//** + * @brief + * The getPressureSensorCalRecord function gets the calibration record + * of the specified pressure sensor. + * @details \b Inputs: ddCalibrationGroup.ddCalibrationRecord + * @details \b Outputs: none + * @param snsrIdx Pressure sensor index + * @return record corresponding pressure sensor calibration record + *************************************************************************/ +POLYNOMIAL_CAL_PAYLOAD_T getPressureSensorCalRecord( U08 snsrIdx ) { + POLYNOMIAL_CAL_PAYLOAD_T record; + benignPolynomialCalRecord( &record ); + if ( snsrIdx < NUM_OF_PRESSURE_SENSORS ) { - return ( ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ snsrIdx ] ); + record = ( ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ snsrIdx ] ); } + + return record; } -POLYNOMIAL_CAL_PAYLOAD_T getTemperatureSensorCalRecord( U08 snsrIdx) +/*********************************************************************//** + * @brief + * The getTemperatureSensorCalRecord function gets the calibration + * record of the specified temperature sensor. + * @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 ) { + POLYNOMIAL_CAL_PAYLOAD_T record; + benignPolynomialCalRecord( &record ); + if ( snsrIdx < NUM_OF_TEMPERATURE_SENSORS ) { - return ( ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord.tempSensors[ snsrIdx ] ); + record = ( ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord.tempSensors[ snsrIdx ] ); } + + return record; } -POLYNOMIAL_CAL_PAYLOAD_T getConcPumpCalRecord( U08 pumpIdx) +/*********************************************************************//** + * @brief + * The getConcPumpCalRecord function gets the calibration record of the + * specified concentrate pump. + * @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 ) { + POLYNOMIAL_CAL_PAYLOAD_T record; + benignPolynomialCalRecord( &record ); + if ( pumpIdx < NUM_OF_CONCENTRATE_PUMPS ) { - return ( ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord.concentratePumps[ pumpIdx ] ); + record = ( ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord.concentratePumps[ pumpIdx ] ); } + + return record; } +/*********************************************************************//** + * @brief + * The getD12PumpCalRecord function gets the calibration record of the + * D12 dialysate pump. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord + * @details \b Outputs: none + * @return ddCalibrationGroup.ddCalibrationRecord. + * d12DialysatePumpRecord + *************************************************************************/ DD_D12_DIALYSATE_PUMP_RECORD_T getD12PumpCalRecord( void ) { return ( ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord ); } + +/*********************************************************************//** + * @brief + * The getD48PumpCalRecord function gets the calibration record of the + * D48 dialysate pump. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord + * @details \b Outputs: none + * @return ddCalibrationGroup.ddCalibrationRecord. + * d48DialysatePumpRecord + *************************************************************************/ DD_D48_DIALYSATE_PUMP_RECORD_T getD48PumpCalRecord( void ) { return ( ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord ); } -DD_ACID_CONCENTRATE_T getAcidConcentrateCalRecord( U08 acidIdx) +/*********************************************************************//** + * @brief + * The getAcidConcentrateCalRecord function gets the calibration record + * of the specified acid concentrate. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord + * @details \b Outputs: none + * @param acidIdx Acid concentrate index + * @return record corresponding acid concentrate calibration record + *************************************************************************/ +DD_ACID_CONCENTRATE_T getAcidConcentrateCalRecord( U08 acidIdx ) { + DD_ACID_CONCENTRATE_T record = { 0 }; + if ( acidIdx < NUM_OF_ACID_TYPE ) { - return ( ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord.acidConcentrate[ acidIdx ] ); + record = ( ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord.acidConcentrate[ acidIdx ] ); } + + return record; } -DD_BICARB_CONCENTRATE_T getBicarbConcentrateCalRecord( U08 bicarbIdx) +/*********************************************************************//** + * @brief + * The getBicarbConcentrateCalRecord function gets the calibration + * record of the specified bicarb concentrate. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord + * @details \b Outputs: none + * @param bicarbIdx Bicarb concentrate index + * @return record corresponding bicarb concentrate calibration record + *************************************************************************/ +DD_BICARB_CONCENTRATE_T getBicarbConcentrateCalRecord( U08 bicarbIdx ) { + DD_BICARB_CONCENTRATE_T record = { 0 }; + if ( bicarbIdx < NUM_OF_BICARB_TYPE ) { - return ( ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ bicarbIdx ] ); + record = ( ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ bicarbIdx ] ); } + + return record; } +/*********************************************************************//** + * @brief + * The getAccelSensorCalRecord function gets the calibration record of + * the accelerometer sensor. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord. + * accelerometerSensorCalRecord + * @details \b Outputs: none + * @return ddCalibrationGroup.ddCalibrationRecord. + * accelerometerSensorCalRecord + *************************************************************************/ DD_ACCEL_SENSOR_CAL_RECORD_T getAccelSensorCalRecord( void ) { return ( ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord ); } +/*********************************************************************//** + * @brief + * The getBloodLeakSensorCalRecord function gets the calibration record + * of the blood leak sensor. + * @details \b Inputs: + * ddCalibrationGroup.ddCalibrationRecord. + * bloodLeakSensorCalRecord + * @details \b Outputs: none + * @return ddCalibrationGroup.ddCalibrationRecord. + * bloodLeakSensorCalRecord + *************************************************************************/ DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T getBloodLeakSensorCalRecord( void ) { return ( ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord ); @@ -1327,59 +1506,59 @@ case GET_CAL_PRESSURE_SENOSRS: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord ); -// for ( i = 0; i < numOfSnsrs2Check; i++ ) -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ i ].calibrationTime ? TRUE : FALSE ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ i ].calibrationTime ? TRUE : FALSE ); break; case GET_CAL_TEMP_SENSORS: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord ); -// for ( i = 0; i < numOfSnsrs2Check; i++ ) -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord.tempSensors[ i ].calibrationTime ? TRUE : FALSE ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord.tempSensors[ i ].calibrationTime ? TRUE : FALSE ); break; case GET_CAL_CONCENTRATE_PUMPS_RECORD: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord ); -// for ( i = 0; i < numOfSnsrs2Check; i++ ) -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord.concentratePumps[ i ].calibrationTime ? TRUE : FALSE ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord.concentratePumps[ i ].calibrationTime ? TRUE : FALSE ); break; case GET_CAL_D12_PUMP_RECORD: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord ); -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord.calibrationTime ? TRUE : FALSE ); + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.d12DialysatePumpRecord.calibrationTime ? TRUE : FALSE ); break; case GET_CAL_D48_PUMP_RECORD: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord ); -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord.d48DialysatePump.calibrationTime ? TRUE : FALSE ); + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord.d48DialysatePump.calibrationTime ? TRUE : FALSE ); break; case GET_CAL_ACID_CONCENTREATES: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord ); -// for ( i = 0; i < numOfSnsrs2Check; i++ ) -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord.acidConcentrate[ i ].calibrationTime ? TRUE : FALSE ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord.acidConcentrate[ i ].calibrationTime ? TRUE : FALSE ); break; case GET_CAL_BICARB_CONCENTRATES: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord ); -// for ( i = 0; i < numOfSnsrs2Check; i++ ) -// isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ i ].calibrationTime ? TRUE : FALSE ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ i ].calibrationTime ? TRUE : FALSE ); break; case GET_CAL_ACCEL_SENSORS: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord; -// isNVDataInvalid = ( 0 == ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord.calibrationTime ? TRUE : FALSE ); + isNVDataInvalid = ( 0 == ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord.calibrationTime ? TRUE : FALSE ); break; case GET_CAL_BLOOD_LEAK_SENSOR: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord; nvDataLength = sizeof( ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord ); -// isNVDataInvalid = ( 0 == ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord.calibrationTime ? TRUE : FALSE ); + isNVDataInvalid = ( 0 == ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord.calibrationTime ? TRUE : FALSE ); break; case GET_SYSTEM_RECORD: @@ -1433,13 +1612,28 @@ return ( FALSE == isNVDataInvalid ? TRUE : FALSE ); } +/*********************************************************************//** + * @brief + * The setNVMRecord function updates the specified NV record with the + * provided data buffer. It copies the record data and updates the + * corresponding CRC values. + * @details \b Inputs: none + * @details \b Outputs: ddSystemGroup.ddSystemRecord, + * ddServiceGroup.ddServiceRecord, + * ddUsageInfoGroup.ddUsageInfoRecord, + * ddSystemGroup.crc, ddServiceGroup.crc, + * ddUsageInfoGroup.crc + * @param recType Record type to update + * @param bufferAddress Pointer to the source data buffer + * @return TRUE if the record was updated successfully otherwise FALSE + *************************************************************************/ BOOL setNVMRecord( NVM_RECORD_TYPE_T recType, U08* bufferAddress ) { BOOL result = FALSE; U08* destPtr = NULL; U16 dataSize = 0; - switch( recType ) + switch ( recType ) { case NVM_SYSTEM_RECORD: destPtr = (U08*)&ddSystemGroup.ddSystemRecord; @@ -1460,25 +1654,39 @@ break; } - if ( (destPtr != NULL ) && ( bufferAddress != NULL ) && ( dataSize > 0 ) ) + if ( ( destPtr != NULL ) && ( bufferAddress != NULL ) && ( dataSize > 0 ) ) { memcpy( destPtr, bufferAddress, dataSize ); - updateRecordCRC(recType); + updateRecordCRC( recType ); result = TRUE; } return result; } +/*********************************************************************//** + * @brief + * The setNVMCalRecord function updates the specified calibration + * record with the provided data buffer. It copies the calibration + * data and updates the calibration record CRC. + * @details \b Inputs: none + * @details \b Outputs: ddCalibrationGroup.ddCalibrationRecord, + * ddCalibrationGroup.crc + * @param calRecType Calibration record type to update + * @param bufferAddress Pointer to the source data buffer + * @param idx Calibration record index + * @return TRUE if the calibration record was updated successfully + * otherwise FALSE + *************************************************************************/ BOOL setNVMCalRecord( DD_CAL_REC_TYPE calRecType, U08* bufferAddress, U08 idx ) { BOOL result = FALSE; U08* destPtr = NULL; U16 dataSize = 0; - switch (calRecType) + switch ( calRecType ) { case DD_CAL_RECORD_PRESSURE_SENSOR: destPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.presSensorsCalRecord.pressureSensors[ idx ]; @@ -1529,7 +1737,7 @@ break; } - if ( (destPtr != NULL ) && ( bufferAddress != NULL ) && ( dataSize > 0 ) ) + if ( ( destPtr != NULL ) && ( bufferAddress != NULL ) && ( dataSize > 0 ) ) { memcpy( destPtr, bufferAddress, dataSize ); updateRecordCRC( NVM_CALIBRATION_RECORD ); @@ -1539,11 +1747,30 @@ 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 ) { return institRecDataTypeTable[ institRecType ]; } +/*********************************************************************//** + * @brief + * The getNVMInstitRecord function gets the value of the specified + * institutional record item. + * @details \b Inputs: ddInstitutionalGroup.ddInstitutionalRecord + * @details \b Outputs: none + * @param institRecType Institutional record item to retrieve + * @param valuePtr Pointer to the buffer where the value will be copied + * @return TRUE if the value was retrieved successfully otherwise FALSE + *************************************************************************/ BOOL getNVMInstitRecord( DD_INSTIT_REC_TYPE institRecType, U08 *valuePtr ) { BOOL result = FALSE; @@ -1686,137 +1913,146 @@ return result; } - +/*********************************************************************//** + * @brief + * The setNVMInstitRecord function updates the specified institutional + * record item with the provided value. It updates the institutional + * record CRC after the value is written. + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord, + * ddInstitutionalGroup.crc + * @param institRecType Institutional record item to update + * @param valuePtr Pointer to the value to be written + * @return TRUE if the value was updated successfully otherwise FALSE + *************************************************************************/ BOOL setNVMInstitRecord( DD_INSTIT_REC_TYPE institRecType, U08 *valuePtr ) { - BOOL result = FALSE; - + BOOL result = FALSE; U08 *destPtr = NULL; U16 dataSize = 0; switch (institRecType) { case DD_INSTIT_MIN_DIALYSATE_FLOW_MLPM: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minDialysateFlowMLPM; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minDialysateFlowMLPM; dataSize = sizeof(U32); break; case DD_INSTIT_MAX_DIALYSATE_FLOW_MLPM: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateFlowMLPM; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateFlowMLPM; dataSize = sizeof(U32); break; case DD_INSTIT_MIN_DIALYSATE_TEMP_C: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minDialysateTempC; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minDialysateTempC; dataSize = sizeof(F32); break; case DD_INSTIT_MAX_DIALYSATE_TEMP_C: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateTempC; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateTempC; dataSize = sizeof(F32); break; case DD_INSTIT_MIN_ACID_CONCENTRATE: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minAcidConcentrate; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minAcidConcentrate; dataSize = sizeof(U32); break; case DD_INSTIT_MAX_ACID_CONCENTRATE: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxAcidConcentrate; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxAcidConcentrate; dataSize = sizeof(U32); break; case DD_INSTIT_MIN_BICARB_CARTRIDGE_SIZE_G: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbCartridgeSizeG; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbCartridgeSizeG; dataSize = sizeof(U32); break; case DD_INSTIT_MAX_BICARB_CARTRIDGE_SIZE_G: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbCartridgeSizeG; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbCartridgeSizeG; dataSize = sizeof(U32); break; case DD_INSTIT_MIN_SODIUM_MEQL: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minSodiumMEQL; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minSodiumMEQL; dataSize = sizeof(U32); break; case DD_INSTIT_MAX_SODIUM_MEQL: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxSodiumMEQL; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxSodiumMEQL; dataSize = sizeof(U32); break; case DD_INSTIT_MIN_BICARBONATE_MEQL: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbonateMEQL; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbonateMEQL; dataSize = sizeof(U32); break; case DD_INSTIT_MAX_BICARBONATE_MEQL: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbonateMEQL; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbonateMEQL; dataSize = sizeof(U32); break; case DD_INSTIT_MIN_RO_REJECTION_RATIO_PCT: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minRORejectionRatioPCT; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minRORejectionRatioPCT; dataSize = sizeof(U32); break; case DD_INSTIT_DISINFECTION_FREQUENCY: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.disinfectionFrequency; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.disinfectionFrequency; dataSize = sizeof(U32); break; case DD_INSTIT_DISINFECTION_CYCLE_TIME: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.disinfectionCycleTime; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.disinfectionCycleTime; dataSize = sizeof(F32); break; case DD_INSTIT_MIN_INLET_WATER_COND_ALARM_LIMIT_USPCM: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM; dataSize = sizeof(F32); break; case DD_INSTIT_MAX_INLET_WATER_COND_ALARM_LIMIT_USPCM: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxInletWaterCondAlarmLimitUSPCM; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.maxInletWaterCondAlarmLimitUSPCM; dataSize = sizeof(F32); break; case DD_INSTIT_ACID_CONCENTRATE_JUG_SIZE_L: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.acidConcentrateJugSizeL; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.acidConcentrateJugSizeL; dataSize = sizeof(F32); break; case DD_INSTIT_MIN_ACID_ALARM_LIMIT_PCT: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minAcidAlarmLimitPCT; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minAcidAlarmLimitPCT; dataSize = sizeof(F32); break; case DD_INSTIT_MIN_BICARB_ALARM_LIMIT_PCT: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbAlarmLimitPCT; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.minBicarbAlarmLimitPCT; dataSize = sizeof(F32); break; case DD_INSTIT_POST_TREAT_DRAIN_OPTION: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.postTreatDrainOption; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.postTreatDrainOption; dataSize = sizeof(U32); break; case DD_INSTIT_POST_TREAT_DRY_BICARB_OPTION: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.postTreatDryBicarbOption; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.postTreatDryBicarbOption; dataSize = sizeof(U32); break; case DD_INSTIT_CALIBRATION_TIME: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime; dataSize = sizeof(U32); break; case DD_INSTIT_CRC: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.crc; + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.crc; dataSize = sizeof(U16); break; - default: break; } @@ -1834,10 +2070,20 @@ return result; } -void sendNVEvent( NVM_RECORD_TYPE_T recType, U32 d1, U32 d2 ) +/*********************************************************************//** + * @brief + * The sendNVEvent function sends the event associated with the + * specified NV record type. + * @details \b Inputs: RECORDS_SPECS + * @details \b Outputs: none + * @param recType NV record type whose event will be sent + * @param d1 First event data + * @param d2 Second event data + * @return none + *************************************************************************/ +void sendNVEvent( NVM_RECORD_TYPE_T recType, U32 d1, U32 d2 ) { - - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[recType].nvEvent, d1, d2 ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ recType ].nvEvent, d1, d2 ); } /*********************************************************************//** @@ -1883,7 +2129,6 @@ } - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/