Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d -rc0160362dc799802ec589d5b6cf4c2bd1face77e --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision c0160362dc799802ec589d5b6cf4c2bd1face77e) @@ -83,12 +83,14 @@ // ********** private data ********** -static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. +static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. /// Concentrate pump data publish interval. static OVERRIDE_U32_T concentratePumpDataPublishInterval = { CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, 0, 0 }; -static CONCENTRATE_PUMP_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Array of concentrate pumps' data structure. +static CONCENTRATE_PUMP_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Array of concentrate pumps' data structure. +static DG_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. +static DG_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. // ********** private function prototypes ********** @@ -101,6 +103,7 @@ static U32 getPublishConcentratePumpDataInterval( void ); static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ); static F32 getMeasuredPumpSpeed( CONCENTRATE_PUMPS_T pumpId ); +static BOOL processCalibrationData( void ); /*********************************************************************//** * @brief @@ -145,6 +148,13 @@ *************************************************************************/ void execConcentratePumpMonitor( void ) { + // Check if a new calibration is available + if ( TRUE == isNewCalibrationRecordAvailable() ) + { + // Get the new calibration data and check its validity + processCalibrationData(); + } + if ( ++concentratePumpMonitorTimerCounter >= getPublishConcentratePumpDataInterval() ) { CONCENTRATE_PUMP_DATA_T data; @@ -203,6 +213,32 @@ /*********************************************************************//** * @brief + * The execConcenratePumpsSelfTest function executes the concentrate pumps + * self-test. + * @details Inputs: none + * @details Outputs: none + * @return PressuresSelfTestResult (SELF_TEST_STATUS_T) + *************************************************************************/ +SELF_TEST_STATUS_T execConcenratePumpsSelfTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + + BOOL calStatus = processCalibrationData(); + + if ( TRUE == calStatus ) + { + result = SELF_TEST_STATUS_PASSED; + } + else + { + result = SELF_TEST_STATUS_FAILED; + } + + return result; +} + +/*********************************************************************//** + * @brief * The requestConcentratePumpsOn function requests the module to turn on * the concentrate pumps. * @details Inputs: none @@ -285,10 +321,37 @@ /*********************************************************************//** * @brief - * The stopConcentratePump function sets the concentrate pump step speed to zero - * and turns off concentrate pumps. + * The getAcidConcentrateCalRecord function returns the acid concentrate + * calibration record. * @details Inputs: none - * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn concentrate pumps off + * @details Outputs: acidConcentrateCalRecord + * @return acid concentrate calibration record + *************************************************************************/ +DG_ACID_CONCENTRATES_RECORD_T getAcidConcentrateCalRecord( void ) +{ + return acidConcentrateCalRecord; +} + +/*********************************************************************//** + * @brief + * The getBicarbConcentrateCalRecord function returns the bicarb + * concentrate calibration record. + * @details Inputs: none + * @details Outputs: bicarbConcentrateCalRecord + * @return bicarb concentrate calibration record + *************************************************************************/ +DG_BICARB_CONCENTRATES_RECORD_T getBicarbConcentrateCalRecord( void ) +{ + return bicarbConcentrateCalRecord; +} + +/*********************************************************************//** + * @brief + * The stopConcentratePump function sets the concentrate pump step speed + * to zero and turns off concentrate pumps. + * @details Inputs: none + * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn + * concentrate pumps off * @param pumpId concentrate pump id * @return none *************************************************************************/ @@ -472,7 +535,63 @@ return result; } +/*********************************************************************//** + * @brief + * The processCalibrationData function gets the calibration data and makes + * sure it is valid by checking the calibration date. The calibration date + * should not be 0. + * @details Inputs: none + * @details Outputs: acidConcentrateCalRecord, bicarbConcentrateCalRecord + * @return TRUE if the calibration record is valid, otherwise FALSE + *************************************************************************/ +static BOOL processCalibrationData( void ) +{ + BOOL status = TRUE; + // Get the calibration record from NVDataMgmt + DG_ACID_CONCENTRATES_RECORD_T acidCalRecord = getDGAcidConcentratesRecord(); + DG_BICARB_CONCENTRATES_RECORD_T bicarbCalRecord = getDGBicarbConcentratesRecord(); + + // Check if the calibration data that was received from NVDataMgmt is legitimate + // The calibration date item should not be zero. If the calibration date is 0, + // then the data is not stored in the NV memory or it was corrupted. + if ( 0 == acidCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].calibrationTime ) + { + activateAlarmNoData( ALARM_ID_DG_ACID_CONCENTRATE_INVALID_CAL_RECORD ); + status = FALSE; + } + + // NOTE: Right now only acid concentrate 1 is used, therefore there is no for loop + acidConcentrateCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].startVolume = + acidCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].startVolume; + + acidConcentrateCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio = + acidCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + + acidConcentrateCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].reserverdSpace = + acidCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].reserverdSpace; + + // Check the validity of the bicarb concentrate values + if ( 0 == bicarbCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].calibrationTime ) + { + activateAlarmNoData( ALARM_ID_DG_BICARB_CONCENTRATE_INVALID_CAL_RECORD ); + status = FALSE; + } + + // NOTE: Right now only bicarb concentrate 1 is used, therefore there is no for loop + bicarbConcentrateCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].startVolume = + bicarbCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].startVolume; + + bicarbConcentrateCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio = + bicarbCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; + + bicarbConcentrateCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].reservedSpace = + bicarbCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].reservedSpace; + + return status; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/