Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -230,7 +230,7 @@ static BOOL isDDBicarbConcentrateRecordValid( DD_BICARB_CONCENTRATE_T* record ); static BOOL isDDAccelerometerSensorRecordValid( DD_ACCEL_SENSOR_CAL_RECORD_T* record ); static BOOL isDDBloodLeakSensorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); -static BOOL isDDConductivitySensorValid( CONDUCTIVITY_COEFFICIENTS_T* record ); +static BOOL isDDConductivitySensorValid( void ); static BOOL isDDUsageRecordValid( void ); static void initDDSystemRecord( void ); @@ -767,18 +767,11 @@ isHardwareRecordValid = isDDBloodLeakSensorValid( bloodLeak ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; -// CONDUCTIVITY_COEFFICIENTS_T *conductivity = getConductivityCalibrationData(); -// for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) -// { -// isHardwareRecordValid = isDDConductivitySensorValid( &conductivity->condSensors[ i ] ); -// -// if( FALSE == isHardwareRecordValid ) -// { -// setConductivityCalibrationData( &conductivity->condSensors[ i ] ); -// } -// -// activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC ); -// } + // Validate Conductivity Sensor Record + if( FALSE == isDDConductivitySensorValid() ) + { + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC ); + } // If the sub groups failed, they are all updated to their benign values // so the main CRC of the calibration group is calculated again @@ -959,32 +952,49 @@ * @param record Pointer to conductivity sensor calibration record to check * @return TRUE if the record is valid otherwise FALSE *************************************************************************/ -static BOOL isDDConductivitySensorValid( CONDUCTIVITY_COEFFICIENTS_T* record ) +static BOOL isDDConductivitySensorValid( void ) { - BOOL status = TRUE; - U16 calcCRC = crc16 ( (U08*)record, sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); - U16 recordCRC = record->crc; + BOOL status = TRUE; + BOOL isRecordValid = TRUE; + U08 sensorIdx; + U16 calcCRC; + CONDUCTIVITY_COEFFICIENTS_T record; - if ( calcCRC != recordCRC ) + for ( sensorIdx = 0; sensorIdx < NUM_OF_CONDUCTIVITY_SENSORS; sensorIdx++ ) { - record->K_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->alpha_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->eta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->zeta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->K_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->alpha_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->eta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->zeta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->beta = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->delta = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->reserved1 = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->reserved2 = DEFAULT_CONDUCTIVITY_COEFFICIENT; - record->calibrationTime = RECORD_DEFAULT_TIME; - record->crc = crc16 ( (U08*)record, - sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); + // Get the Conductivity Sensor Calibration Data + record = getConductivityCalibrationData( sensorIdx ); - // Set the to FALSE since the record is not valid - status = FALSE; + // Calculate the CRC + calcCRC = crc16( (U08*)&record, sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); + + // Check if calculated CRC matches the stored CRC + if ( calcCRC != record.crc ) + { + // CRC did not match, update the record to benign values. + record.K_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.alpha_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.eta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.zeta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.K_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.alpha_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.eta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.zeta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.beta = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.delta = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.reserved1 = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.reserved2 = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record.calibrationTime = RECORD_DEFAULT_TIME; + record.crc = crc16 ( (U08*)&record, + sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); + + // Write to sensor's flash (not DD's NVM ) + setConductivityCalibrationData( (CONDUCTIVITY_SENSORS_T)sensorIdx, record ); + + // Set flag to FALSE since the record is not valid + isRecordValid = FALSE; + status = ( status == FALSE ) ? FALSE : isRecordValid; + } } return status; @@ -1416,6 +1426,7 @@ U08* nvDataStartPtr = 0; BOOL isNVDataInvalid = FALSE; U32 nvDataLength = 0; + CONDUCTIVITY_COEFFICIENTS_T condCalRecord[ NUM_OF_CONDUCTIVITY_SENSORS ]; switch ( nvData ) { @@ -1488,6 +1499,13 @@ break; case NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS: + nvDataStartPtr = (U08*)&condCalRecord; + nvDataLength = sizeof( condCalRecord ); + for ( i = 0; i < numOfSnsrs2Check; i++ ) + { + condCalRecord[ i ] = getConductivityCalibrationData( i ); + isNVDataInvalid |= ( 0 == condCalRecord[ i ].calibrationTime ? TRUE : FALSE ); + } break; case NV_DD_DATA_INSTIT_BASIC_RECORD: @@ -1562,6 +1580,7 @@ U08* destPtr = NULL; U16 dataSize = 0; NVM_RECORD_TYPE_T recTypeGroup; + CONDUCTIVITY_COEFFICIENTS_T condCalRecord; switch ( recType ) { @@ -1632,6 +1651,11 @@ break; case NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS: + if (bufferAddress != NULL ) + { + memcpy( &condCalRecord, bufferAddress, sizeof( CONDUCTIVITY_COEFFICIENTS_T ) ); + setConductivityCalibrationData( idx, condCalRecord ); + } break; case NV_DD_DATA_INSTIT_BASIC_RECORD: