Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -raa8dbad6005f0f63b846673ac1656b003fbf85e3 -r674e18b10904e97f4b2624b826abc21f3220dd32 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision aa8dbad6005f0f63b846673ac1656b003fbf85e3) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 674e18b10904e97f4b2624b826abc21f3220dd32) @@ -267,10 +267,8 @@ { #ifndef DISABLE_RO_RATIO_CHECK F32 cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); - BOOL isRORectionOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ? TRUE : FALSE ); + BOOL isRORectionOutOfRange = ( ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ) || ( cpo >= MAX_CPO_CONDUCTIVITY_ALLOW ) ? TRUE : FALSE ); - //BOOL isRORejRatioOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ) || ( cpo >= MAX_CPO_CONDUCTIVITY_ALLOW ); // TODO why is conductivity checked here again? - // Fault alarm per PRS 483 checkPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, isRORectionOutOfRange, roRejectionRatio, MAX_RO_REJECTION_RATIO_ALLOW ); #endif Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r6f62e99f0beb50422927a666ce79ef517dc19e7e -r674e18b10904e97f4b2624b826abc21f3220dd32 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 6f62e99f0beb50422927a666ce79ef517dc19e7e) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 674e18b10904e97f4b2624b826abc21f3220dd32) @@ -80,6 +80,8 @@ #define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3780.0 ///< Bottle volume of bicarb concentration in mL. #define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0 ///< Concentration bottle low volume in mL. +#define DATA_PUBLISH_COUNTER_START_COUNT 63 ///< Data publish counter start count. + /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. static const F32 FLOW_INTEGRATOR = ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); @@ -170,7 +172,7 @@ { fillState = DG_FILL_MODE_STATE_START; dialysateFillStartTime = 0; - dataPublishCounter = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; reservoirBaseWeight = 0.0; totalROFlowRateMLPM = 0.0; concentrateTestStartTime = 0; @@ -707,14 +709,37 @@ fillStatus.fillFlowRateRunningSum += getMeasuredROFlowRateLPM(); fillStatus.fillTemperatureRunningSum += getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); +#ifndef DISABLE_MIXING + // Detect empty bottles using integrated volumes // TODO: empty bottles detection using conductivity sensors + if ( ( ( ACID_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedAcidVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 437 + { + usedAcidVolumeML.data = 0.0; + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + fillStatus.isThisFirstFill = TRUE; // empty bottles need replaced, set isThisFirstFill to FALSE so that prime, flush, acid & bicarb test are needed + fillStatus.fillEmptyAcidBottleDetected = TRUE; // set this variable to FALSE when user presses OK on the alarm to confirm bottle has been replaced and resume + } + + if ( ( ( BICARB_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedBicarbVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 438 + { + usedBicarbVolumeML.data = 0.0; + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + fillStatus.isThisFirstFill = TRUE; + fillStatus.fillEmptyBicarbBottleDetected = TRUE; + } +#endif + setBadAvgConductivityDetectedFlag( FALSE ); // If we've reached our target fill to volume (by weight), we're done filling - go back to generation idle mode // SRSDG 398 if ( TRUE == hasTargetFillVolumeBeenReached( inactiveReservoir ) ) { F32 filledVolumeML = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); - F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; + F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; #ifndef DISABLE_FLOW_CHECK_IN_FILL Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -rc9368ea4b6e7b4a1ea5428a72cac86f317a9a460 -r674e18b10904e97f4b2624b826abc21f3220dd32 --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision c9368ea4b6e7b4a1ea5428a72cac86f317a9a460) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 674e18b10904e97f4b2624b826abc21f3220dd32) @@ -43,23 +43,22 @@ // ********** private definitions ********** -#define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. -#define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. -#define BAD_FLUSH_FILL_TARGET_VOLUME_ML 1000 ///< Target fill volume in the bad flush fill state. +#define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. +#define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. +#define BAD_FLUSH_FILL_TARGET_VOLUME_ML 1000 ///< Target fill volume in the bad flush fill state. +#define HD_LOST_COMM_TIMEOUT_MS (5 * SEC_PER_MIN * MS_PER_SECOND ) ///< The time of HD lost comm before DG transition back to standby. +#define BAD_FILL_SUBSTATES_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bad fill sub-states is published on the CAN bus. +#define DATA_PUBLISH_COUNTER_START_COUNT 61 ///< Data publish counter start count. -/// The time of HD lost comm before DG transition back to standby. -#define HD_LOST_COMM_TIMEOUT_MS (5 * SEC_PER_MIN * MS_PER_SECOND ) -#define BAD_FILL_SUBSTATES_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the bad fill sub-states is published on the CAN bus. - // ********** private data ********** -static DG_GEN_IDLE_MODE_STATE_T genIdleState; ///< Currently active generation idle state. -static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T badFillState = DG_HANDLE_BAD_FILL_STATE_START; ///< Initialize bad fill sub-state. -static U32 hdLostCommStartTime_ms; ///< Lost communication with HD start time in ms. -static U32 badFillSubstatesPublicationTimerCounter; ///< Used to schedule bad fill sub-states publication to CAN bus. -static U32 targetFillVolumeML; ///< Save the target fill volume before calling startFillCmd(). -static BOOL handleBadFillFlag; ///< Internal signal flag to handle bad fill. -static OVERRIDE_U32_T badFillSubstatesPublishInterval = { BAD_FILL_SUBSTATES_PUB_INTERVAL, ///< Interval (in ms) at which to publish bad fill sub-states to CAN bus. +static DG_GEN_IDLE_MODE_STATE_T genIdleState; ///< Currently active generation idle state. +static DG_GEN_IDLE_MODE_BAD_FILL_STATE_T badFillState = DG_HANDLE_BAD_FILL_STATE_START; ///< Initialize bad fill sub-state. +static U32 hdLostCommStartTime_ms; ///< Lost communication with HD start time in ms. +static U32 genIdlePublicationTimerCounter; ///< Used to schedule bad fill sub-states publication to CAN bus. +static U32 targetFillVolumeML; ///< Save the target fill volume before calling startFillCmd(). +static BOOL handleBadFillFlag; ///< Internal signal flag to handle bad fill. +static OVERRIDE_U32_T badFillSubstatesPublishInterval = { BAD_FILL_SUBSTATES_PUB_INTERVAL, ///< Interval (in ms) at which to publish bad fill sub-states to CAN bus. BAD_FILL_SUBSTATES_PUB_INTERVAL, 0, 0 }; @@ -86,11 +85,11 @@ *************************************************************************/ void initGenIdleMode( void ) { - genIdleState = DG_GEN_IDLE_MODE_STATE_START; - hdLostCommStartTime_ms = 0; - targetFillVolumeML = 0; - badFillSubstatesPublicationTimerCounter = 0; - handleBadFillFlag = FALSE; + genIdleState = DG_GEN_IDLE_MODE_STATE_START; + hdLostCommStartTime_ms = 0; + targetFillVolumeML = 0; + genIdlePublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + handleBadFillFlag = FALSE; } /*********************************************************************//** @@ -423,24 +422,30 @@ * @brief * The publishBadFillSubstates function publishes idle mode bad fill * sub-states at the set interval. - * @details Inputs: badFillSubstatesPublicationTimerCounter - * @details Outputs: badFillSubstatesPublicationTimerCounter + * @details Inputs: genIdlePublicationTimerCounter + * @details Outputs: genIdlePublicationTimerCounter * @return none *************************************************************************/ static void publishBadFillSubstates( void ) { // publish bad fill sub-states on interval - if ( ++badFillSubstatesPublicationTimerCounter >= getU32OverrideValue( &badFillSubstatesPublishInterval ) ) + if ( ++genIdlePublicationTimerCounter >= getU32OverrideValue( &badFillSubstatesPublishInterval ) ) { GEN_IDLE_BAD_FILL_STATE data; data.badFillState = (U32)badFillState; broadcastData( MSG_ID_DG_BAD_FILL_SUB_STATE, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( GEN_IDLE_BAD_FILL_STATE ) ); - badFillSubstatesPublicationTimerCounter = 0; + genIdlePublicationTimerCounter = 0; } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + /*********************************************************************//** * @brief * The testSetBadFillSubstatesPublishIntervalOverride function overrides the Index: firmware/App/Modes/ModeGenIdle.h =================================================================== diff -u -rbd80dccfee1f58fdbc49bf05dd000005b105fe26 -r674e18b10904e97f4b2624b826abc21f3220dd32 --- firmware/App/Modes/ModeGenIdle.h (.../ModeGenIdle.h) (revision bd80dccfee1f58fdbc49bf05dd000005b105fe26) +++ firmware/App/Modes/ModeGenIdle.h (.../ModeGenIdle.h) (revision 674e18b10904e97f4b2624b826abc21f3220dd32) @@ -48,6 +48,9 @@ BOOL requestDGStop( void ); // HD requests DG stop (go back to standby mode) +BOOL testSetBadFillSubstatesPublishIntervalOverride( U32 value ); +BOOL testResetBadFillSubstatesPublishIntervalOverride( void ); + /**@}*/ #endif