Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -116,6 +116,9 @@ static CONDUCTIVITY_COEFFICIENTS_T conductivitySensorCoefficients[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensor calibration coefficient data. static CONDUCTIVITY_REVISIONS_T conductivitySensorRevisions[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensor revision and serial data. +static CONDUCTIVITY_COEFFICIENTS_T conductivityCalRecord[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity Calibration Data to be written on the sensor +static BOOL isWriteCalibrationRequested[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Request to write Calibration Data on sensor's flash memory + // ********** private function prototypes ********** static CONDUCTIVITY_STATE_T handleConductivityReadCalState( void ); static CONDUCTIVITY_STATE_T handleConductivityReadDataState( void ); @@ -131,6 +134,11 @@ static void calculateTemperature( CONDUCTIVITY_SENSORS_T sensorNum ); static void calculateResistance( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ); +static void readConductivitySensorReadCounts( void ); +static void readConductivitySensorErrorCounts( void ); +static void readConductivitySensorCalData( void ); +static void writeConductivitySensorCalData( CONDUCTIVITY_SENSORS_T sensorId ); + /*********************************************************************//** * @brief * The initConductivitySensors function initializes the ConductivitySensors unit. @@ -201,6 +209,8 @@ conductivitySensorCoefficients[ sensor ].delta = 0.0F; conductivitySensorCoefficients[ sensor ].reserved1 = 0.0F; conductivitySensorCoefficients[ sensor ].reserved2 = 0.0F; + conductivitySensorCoefficients[ sensor ].calibrationTime = 0.0F; + conductivitySensorCoefficients[ sensor ].crc = 0.0F; memset( conductivitySensorRevisions[ sensor ].swRev, 0, sizeof( U08 ) * CONDUCTIVITY_CAL_CHAR_LENGTH ); memset( conductivitySensorRevisions[ sensor ].hwRev, 0, sizeof( U08 ) * CONDUCTIVITY_CAL_CHAR_LENGTH ); @@ -333,6 +343,50 @@ conductivitySensorStatus[ P18_COND ].calMemCount = getFPGAP18CalMemCounter(); } +static void writeConductivitySensorCalData( CONDUCTIVITY_SENSORS_T sensorId ) +{ + // Update cal data and counter for each conductivity sensor + U32 calData = conductivitySensorStatus[ sensorId ].calData; + U08 command; + + switch ( sensorId ) + { + case D17_COND: + setFPGAD17CondCalData( calData ); + break; + + case D27_COND: + setFPGAD27CondCalData( calData ); + break; + + case D29_COND: + setFPGAD29CondCalData( calData ); + break; + + case D43_COND: + setFPGAD43CondCalData( calData ); + break; + + case D74_COND: + setFPGAD74CondCalData( calData ); + break; + + case P9_COND: + setFPGAP9CondCalData( calData ); + break; + + case P18_COND: + setFPGAP18CondCalData( calData ); + break; + + default: + break; + } + + setFPGAConductivitySensorId( (U08)sensorId ); + setFPGAConductivitySensorCommand( (U08) command ); +} + /*********************************************************************//** * @brief * The execConductivitySensors function executes the conductivity sensors driver. @@ -444,6 +498,14 @@ memcpy( &conductivitySensorCoefficients[ sensor ].reserved2, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_12 ] = TRUE; break; + case CAL_DATA_13: + memcpy( &conductivitySensorCoefficients[ sensor ].calibrationTime, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_13 ] = TRUE; + break; + case CAL_DATA_14: + memcpy( &conductivitySensorCoefficients[ sensor ].crc, &conductivitySensorStatus[ sensor ].calData, sizeof(U32)); + conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ CAL_DATA_14 ] = TRUE; + break; case SW_REV_LOWER_WORD: memcpy( conductivitySensorRevisions[ sensor ].swRev, &conductivitySensorStatus[ sensor ].calData, sizeof( U32 ) ); conductivitySensorStatus[ sensor ].hasCalSlotBeenRead[ SW_REV_LOWER_WORD ] = TRUE; @@ -565,7 +627,6 @@ return state; } - /*********************************************************************//** * @brief * The checkCondCounters function handles monitoring read and error counters @@ -921,21 +982,42 @@ return result; } -CONDUCTIVITY_COEFFICIENTS_T* getConductivityCalibrationData( void ) +CONDUCTIVITY_COEFFICIENTS_T getConductivityCalibrationData( CONDUCTIVITY_SENSORS_T sensorIdx ) { - // TODO: Return static variable - CONDUCTIVITY_COEFFICIENTS_T record; - return (&record); + CONDUCTIVITY_COEFFICIENTS_T record = { 0 }; + + if ( sensorIdx < NUM_OF_CONDUCTIVITY_SENSORS ) + { + record = conductivitySensorCoefficients[ sensorIdx ]; + } + else + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, sensorIdx ); + } + + return record; } -void setConductivityCalibrationData( CONDUCTIVITY_COEFFICIENTS_T* record) +BOOL setConductivityCalibrationData( CONDUCTIVITY_SENSORS_T sensorIdx, + CONDUCTIVITY_COEFFICIENTS_T record) { - U32 i; + BOOL status = FALSE; - for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) + if ( sensorIdx < NUM_OF_CONDUCTIVITY_SENSORS ) { - //TODO: Call FPGA update function + conductivityCalRecord[ sensorIdx ] = record; + isWriteCalibrationRequested[ sensorIdx ] = TRUE; + + // TODO: Start a timer + + status = TRUE; } + else + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, sensorIdx ); + } + + return status; } /*********************************************************************//** * @brief Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -55,7 +55,9 @@ CAL_DATA_10, ///< Cal Data 10. Temperature scale factor CAL_DATA_11, ///< Cal Data 11. Reserved. CAL_DATA_12, ///< Cal Data 12. Reserved - LAST_CAL_DATA = CAL_DATA_12, ///< Last index of calibration data + CAL_DATA_13, ///< Cal Data 13. Calibration time + CAL_DATA_14, ///< Cal Data 14. CRC + LAST_CAL_DATA = CAL_DATA_14, ///< Last index of calibration data SW_REV_LOWER_WORD, ///< SW Revision. 3 - 0 bytes FIRST_SW_REV = SW_REV_LOWER_WORD, ///< First index of SW revision SW_REV_MID_WORD, ///< SW Revision. 7 - 4 bytes @@ -124,8 +126,9 @@ F32 getConductivityRawRTD( CONDUCTIVITY_SENSORS_T sensor ); F32 getUncompensatedConductivity( CONDUCTIVITY_SENSORS_T sensor ); -CONDUCTIVITY_COEFFICIENTS_T* getConductivityCalibrationData( void ); -void setConductivityCalibrationData( CONDUCTIVITY_COEFFICIENTS_T* record); +CONDUCTIVITY_COEFFICIENTS_T getConductivityCalibrationData( CONDUCTIVITY_SENSORS_T sensorIdx ); +BOOL setConductivityCalibrationData( CONDUCTIVITY_SENSORS_T sensorIdx, + CONDUCTIVITY_COEFFICIENTS_T record); BOOL testConductivitySensorConductivityReadingsOverride( MESSAGE_T *message ); BOOL testConductivitySensorTemperatureReadingsOverride( MESSAGE_T *message ); Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -rd47b9bcbd4796a8c51d9e87436422c5868292ac6 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision d47b9bcbd4796a8c51d9e87436422c5868292ac6) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -2197,8 +2197,21 @@ { return fpgaSensorReadings.fpgaD17CalMemCounter; } + /*********************************************************************//** * @brief + * The setFPGAD17CondData function sets the D17 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaD17DataCal + * @return none + *************************************************************************/ +void setFPGAD17CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaD17DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD27CondReadCount function gets D27 conductivity sensor read count. * @details \b Inputs: fpgaD27CondReadCnt * @details \b Outputs: none @@ -2295,6 +2308,18 @@ /*********************************************************************//** * @brief + * The setFPGAD27CondData function sets the D27 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaD27DataCal + * @return none + *************************************************************************/ +void setFPGAD27CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaD27DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD29CondReadCount function gets D29 conductivity sensor read count. * @details \b Inputs: fpgaD29CondReadCnt * @details \b Outputs: none @@ -2390,6 +2415,18 @@ /*********************************************************************//** * @brief + * The setFPGAD29CondData function sets the D29 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaD29DataCal + * @return none + *************************************************************************/ +void setFPGAD29CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaD29DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD43CondReadCount function gets D43 conductivity sensor read count. * @details \b Inputs: fpgaD43CondReadCnt * @details \b Outputs: none @@ -2486,6 +2523,18 @@ /*********************************************************************//** * @brief + * The setFPGAD43CondData function sets the D43 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaD43DataCal + * @return none + *************************************************************************/ +void setFPGAD43CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaD43DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD74CondReadCount function gets D74 conductivity sensor read count. * @details \b Inputs: fpgaD74CondReadCnt * @details \b Outputs: none @@ -2581,6 +2630,18 @@ /*********************************************************************//** * @brief + * The setFPGAD74CondData function sets the D74 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaD74DataCal + * @return none + *************************************************************************/ +void setFPGAD74CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaD74DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD63LevelSensor function gets the latest FPGA D63 upper level * sensor reading. * @details \b Inputs: fpgaD63LevelSensor @@ -3913,6 +3974,18 @@ /*********************************************************************//** * @brief + * The setFPGAP9CondData function sets the P9 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaP9DataCal + * @return none + *************************************************************************/ +void setFPGAP9CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaP9DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAP18CondReadCount function gets the P18 conductivity read count. * @details \b Inputs: fpgaSensorReadings.fpgaP18CondReadCount * @details \b Outputs: none @@ -4009,6 +4082,18 @@ /*********************************************************************//** * @brief + * The setFPGAP18CondData function sets the P18 cal data. + * @details \b Inputs: none + * @details \b Outputs: fpgaActuatorSetPoints.fpgaP18DataCal + * @return none + *************************************************************************/ +void setFPGAP18CondCalData( U32 data ) +{ +// fpgaActuatorSetPoints.fpgaP18DataCal = data; +} + +/*********************************************************************//** + * @brief * The getFPGAD92PumpHallSenseCount function gets substitution pump, D92, * hall sensor speed counter. * @details \b Inputs: fpgaD92SpeedCnt Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -rd47b9bcbd4796a8c51d9e87436422c5868292ac6 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision d47b9bcbd4796a8c51d9e87436422c5868292ac6) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -90,6 +90,7 @@ F32 getFPGAD17CondTemp( void ); U32 getFPGAD17CondCalData( void ); U08 getFPGAD17CalMemCounter( void ); +void setFPGAD17CondCalData( U32 data ); U08 getFPGAD27CondReadCount( void ); U08 getFPGAD27CondErrorCount( void ); @@ -99,6 +100,7 @@ F32 getFPGAD27CondTemp( void ); U32 getFPGAD27CondCalData( void ); U08 getFPGAD27CalMemCounter( void ); +void setFPGAD27CondCalData( U32 data ); U08 getFPGAD29CondReadCount( void ); U08 getFPGAD29CondErrorCount( void ); @@ -108,6 +110,7 @@ F32 getFPGAD29CondTemp( void ); U32 getFPGAD29CondCalData( void ); U08 getFPGAD29CalMemCounter( void ); +void setFPGAD29CondCalData( U32 data ); U08 getFPGAD43CondReadCount( void ); U08 getFPGAD43CondErrorCount( void ); @@ -117,6 +120,7 @@ F32 getFPGAD43CondTemp( void ); U32 getFPGAD43CondCalData( void ); U08 getFPGAD43CalMemCounter( void ); +void setFPGAD43CondCalData( U32 data ); U08 getFPGAD74CondReadCount( void ); U08 getFPGAD74CondErrorCount( void ); @@ -126,6 +130,7 @@ F32 getFPGAD74CondTemp( void ); U32 getFPGAD74CondCalData( void ); U08 getFPGAD74CalMemCounter( void ); +void setFPGAD74CondCalData( U32 data ); // Pumps ( Dosing and Gear pumps ) void setFPGAD11PumpSetStepSpeed( U32 stepSpeed ); @@ -313,6 +318,7 @@ F32 getFPGAP9CondTemp( void ); U32 getFPGAP9CondCalData( void ); U08 getFPGAP9CalMemCounter( void ); +void setFPGAP9CondCalData( U32 data ); U08 getFPGAP18CondReadCount( void ); U08 getFPGAP18CondErrorCount( void ); @@ -322,6 +328,7 @@ F32 getFPGAP18CondTemp( void ); U32 getFPGAP18CondCalData( void ); U08 getFPGAP18CalMemCounter( void ); +void setFPGAP18CondCalData( U32 data ); void setFPGAP40PumpEnable( BOOL enable ); void setFPGAP40PumpPWM( U16 pwm ); Index: firmware/App/Services/NVMessagingDD.c =================================================================== diff -u -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 -r83bae6ae5f7f26a3511d1d6965310fd8ac9ad496 --- firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) +++ firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision 83bae6ae5f7f26a3511d1d6965310fd8ac9ad496) @@ -196,7 +196,6 @@ { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - U32 idxRejectReason; ///< Reason to reject sensor index of the calibration record LINEAR_REJECT_REASON_CAL_PAYLOAD_T data; ///< Linear record reject reasons } DD_NVM_SET_LINEAR_CAL_REC_PAYLOAD_T; @@ -247,7 +246,6 @@ { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - U32 idxRejectReason; ///< Reason to reject Acid Conc index U32 acidConcMixRatioRejectReason; ///< Reason to reject Acid Conc calibration record parameter acidConcMixRatio U32 acidFullBottleVolumeMLRejectReason; ///< Reason to reject Acid Conc calibration record parameter acidFullBottleVolumeML U32 acidConductivityUSPerCMRejectReason; ///< Reason to reject Acid Conc calibration record parameter acidConductivityUSPerCM @@ -269,7 +267,6 @@ { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - U08 idxRejectReason; ///< Reason to reject bicarb Conc index U32 bicarbConcMixRatioRejectReason; ///< Reason to reject bicarb Conc calibration record parameter bicarbConcMixRatio U32 bicarbStartVolumeMLRejectReason; ///< Reason to reject bicarb Conc calibration record parameter bicarbStartVolumeML U32 bicarbConductivityUSPerCMRejectReason; ///< Reason to reject bicarb Conc calibration record parameter bicarbConductivityUSPerCM @@ -327,7 +324,6 @@ { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - U32 idxRejectReason; ///< Reason to reject conductivity sensor index U32 K_highRejectReason; ///< Reason to reject conductivity sensor calibration record parameter K_high U32 alpha_higRejectReason; ///< Reason to reject conductivity sensor calibration record parameter alpha_high U32 eta_highRejectReason; ///< Reason to reject conductivity sensor calibration record parameter eta_high @@ -675,7 +671,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_SYSTEM_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_SYSTEM_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_SYSTEM_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -712,7 +708,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_SERVICE_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_SERVICE_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_SERVICE_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -750,7 +746,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -788,7 +784,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_INSTIT_BASIC_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_INSTIT_BASIC_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_INSTIT_BASIC_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -826,7 +822,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_INSTIT_ADVANCED_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_INSTIT_ADVANCED_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_INSTIT_ADVANCED_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -864,7 +860,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_INSTIT_ADDITIONAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_INSTIT_ADDITIONAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_INSTIT_ADDITIONAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateSendRetryCount( sendStatus ); @@ -903,7 +899,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_PRESSURE_SENSOR_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_PRESSURE_SENSORS ); @@ -942,7 +938,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_TEMPERATURE_SENSOR_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_TEMPERATURE_SENSORS ); @@ -981,7 +977,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_CONC_PUMP_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_LINEAR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_CONCENTRATE_PUMPS ); @@ -1018,7 +1014,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_D12_PUMP_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_D12_PUMP_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_D12_PUMP_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); @@ -1055,7 +1051,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_D48_PUMP_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_D48_PUMP_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_D48_PUMP_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); @@ -1094,7 +1090,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_ACID_CONC_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_ACID_CONC_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_ACID_CONC_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_ACID_TYPE ); @@ -1133,7 +1129,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_BICARB_CONC_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_BICARB_CONC_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_BICARB_CONC_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_BICARB_TYPE ); @@ -1170,7 +1166,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_ACCEL_SENSOR_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_ACCEL_SENSOR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_ACCEL_SENSOR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); @@ -1207,7 +1203,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_BLOOD_LEAK_SENSOR_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_BLOOD_LEAK_SENSOR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_BLOOD_LEAK_SENSOR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); @@ -1246,7 +1242,7 @@ sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_CONDUCTIVITY_SENSOR_CAL_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&payload, - sizeof( DD_NVM_GET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T ) ); + ( sizeof( DD_NVM_GET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T ) - sizeof( U16 ) ) ); } state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_CONDUCTIVITY_SENSORS ); @@ -1748,7 +1744,7 @@ } else { - response.idxRejectReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; } } else @@ -1820,7 +1816,7 @@ } else { - response.idxRejectReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; } } else @@ -1892,7 +1888,7 @@ } else { - response.idxRejectReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; } } else @@ -2086,7 +2082,7 @@ } else { - response.idxRejectReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; } } else @@ -2158,7 +2154,7 @@ } else { - response.idxRejectReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; } } else @@ -2325,24 +2321,35 @@ BOOL handleDDSetConductivitySensorCalRecRequest( MESSAGE_T *message ) { - BOOL result = FALSE; - U08* payloadPtr = message->payload; - U08 recordSize = sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ); // Data - CRC + BOOL result = FALSE; + U08* payloadPtr = message->payload; + U08 recordSize = sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ); // Data - CRC + U08 expectedPayloadLen = sizeof( U08 ) + recordSize; // Index + Data - CRC DD_NVM_SET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T response = { 0 }; + U08 idx; CONDUCTIVITY_COEFFICIENTS_T record; // Calibration record can be updated only in service mode if ( DD_MODE_SERV == getCurrentOperationMode() ) { - if ( message->hdr.payloadLen == recordSize ) + if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16( (U08*)&record, recordSize ); - setNVMMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS, (U08*)&record, 0 ); - result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); - sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); - response.accepted = TRUE; + memcpy( &idx, payloadPtr, sizeof(U08)); + payloadPtr += sizeof(U08); + if( idx < NUM_OF_CONDUCTIVITY_SENSORS ) + { + memcpy( &record, payloadPtr, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); + setNVMMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS, (U08*)&record, idx ); + result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); + sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); + response.accepted = TRUE; + } + else + { + response.rejectionReason = REQUEST_REJECT_REASON_INDEX_OUT_OF_RANGE; + } } else { 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: