Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r0c1f66a170a3a0a4324fa1a3c3bfb4c7f77139b5 -r97e0100921ccad633b39b509a93a7237e4d80446 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 0c1f66a170a3a0a4324fa1a3c3bfb4c7f77139b5) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 97e0100921ccad633b39b509a93a7237e4d80446) @@ -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 @@ -115,13 +118,13 @@ concentratePumpMonitorTimerCounter = 0; - concentratePumps[ CONCENTRATEPUMPS_CP1 ].control = &setFPGACP1Control; - concentratePumps[ CONCENTRATEPUMPS_CP1 ].setStepSpeed = &setFPGACP1SetStepSpeed; + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].control = &setFPGACP1Control; + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].setStepSpeed = &setFPGACP1SetStepSpeed; - concentratePumps[ CONCENTRATEPUMPS_CP2 ].control = &setFPGACP2Control; - concentratePumps[ CONCENTRATEPUMPS_CP2 ].setStepSpeed = &setFPGACP2SetStepSpeed; + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].control = &setFPGACP2Control; + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].setStepSpeed = &setFPGACP2SetStepSpeed; - for ( pumpId = CONCENTRATEPUMPS_CP1; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) + for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; @@ -145,20 +148,27 @@ *************************************************************************/ 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; - calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1, getFPGACP1HallSensePulseWidth() ); - calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2, getFPGACP2HallSensePulseWidth() ); + calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); + calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); - data.cp1CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed; - data.cp1MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1 ); - data.cp2CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2 ].currentPumpSpeed; - data.cp2MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2 ); + data.cp1CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + data.cp1MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + data.cp2CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; + data.cp2MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); - F32 const cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1 ) - concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed; - F32 const cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2 ) - concentratePumps[ CONCENTRATEPUMPS_CP2 ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP2 ].currentPumpSpeed; + F32 const cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + F32 const cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; #ifndef DISABLE_DIALYSATE_CHECK checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); @@ -181,7 +191,7 @@ { CONCENTRATE_PUMPS_T pumpId; - for ( pumpId = CONCENTRATEPUMPS_CP1; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) + for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) { switch ( concentratePumps[ pumpId ].execState ) { @@ -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,67 @@ 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 ) + { +#ifndef SKIP_CAL_CHECK + activateAlarmNoData( ALARM_ID_DG_ACID_CONCENTRATE_INVALID_CAL_RECORD ); + status = FALSE; +#endif + } + + // 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 ) + { +#ifndef SKIP_CAL_CHECK + activateAlarmNoData( ALARM_ID_DG_BICARB_CONCENTRATE_INVALID_CAL_RECORD ); + status = FALSE; +#endif + } + + // 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 *************************************************************************/