Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -31,7 +31,7 @@ // ********** private definitions ********** -#define CONCENTRATE_PUMP_ON_CONTROL 0x1A ///< Configuration to turn on concentrate pump with 8 microsteps. +#define CONCENTRATE_PUMP_ON_CONTROL 0x1A ///< Configuration to turn on concentrate pump with 16 microsteps. #define CONCENTRATE_PUMP_OFF_CONTROL 0x3A ///< Configuration to turn off concentrate pump. #define CONCENTRATE_PUMP_FORWARD_DIR 0x1 ///< Concentrate pump forward direction configuration. @@ -102,13 +102,16 @@ U32 controlTimerCounter; ///< Timer counter to perform control on concentrate pump. CONCENTRATE_PUMP_STATE_T execState; ///< Concentrate pump execute current state. BOOL hasTurnOnPumpsBeenRequested; ///< Flag indicates a request to turn concentrate pumps on. + BOOL hasParkBeenRequested; ///< Flag indicates a request to park the pump. F32 pumpTargetSpeed; ///< Target concentrate pumps' speed (mL/min). F32 currentPumpSpeed; ///< Current controlled concentrate pumps' speed (mL/min). OVERRIDE_F32_T measuredPumpSpeed; ///< Measured concentrate pump speed (mL/min). U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Concentrate pump motor direction. U08 controlSet; ///< Concentrate pump control set. (Used in DVT) F32 pulseWidthUS; ///< Concentrate pump pulse width in microseconds. + OVERRIDE_U32_T parked; ///< Concentrate pump is currently parked (T/F). + OVERRIDE_U32_T parkFaulted; ///< Concentrate pump park command has faulted (T/F). } CONCENTRATE_PUMP_T; // ********** private data ********** @@ -150,7 +153,11 @@ { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; + concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; + concentratePumps[ pumpId ].hasParkBeenRequested = FALSE; + concentratePumps[ pumpId ].parked.data = FALSE; + concentratePumps[ pumpId ].parkFaulted.data = FALSE; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT @@ -185,6 +192,11 @@ calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpParkFault(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpParkFault(); + #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -197,21 +209,22 @@ { CONCENTRATE_PUMP_DATA_T data; U08 fpgaConcentratePumpsFault = getFPGAConcentratePumpsFault(); - - if ( 0 != fpgaConcentratePumpsFault ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); - } - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); F32 cp1TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; + BOOL cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); + BOOL cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); F32 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; + if ( 0 != fpgaConcentratePumpsFault ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); + } + // Use the above values to prepare the broadcast data data.cp1CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1SetSpeed * -1.0 : cp1SetSpeed ); data.cp1MeasuredSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp1Direction ? cp1Speed * -1.0 : cp1Speed ); @@ -223,6 +236,10 @@ data.cp2State = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState; data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; + data.cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); + data.cp2Parked = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); + data.cp1ParkFault = getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ); + data.cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ); concentratePumpMonitorTimerCounter = 0; broadcastData( MSG_ID_DG_CONCENTRATE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( CONCENTRATE_PUMP_DATA_T ) ); @@ -327,13 +344,15 @@ * @details Inputs: none * @details Outputs: set flag isPumpOffRequested to TRUE * @param pumpId concentrate pump id + * @param park TRUE if pump should be parked, FALSE if not * @return none *************************************************************************/ -void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId ) +void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId, BOOL park ) { if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; + concentratePumps[ pumpId ].hasParkBeenRequested = park; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0F; } else @@ -438,8 +457,58 @@ /*********************************************************************//** * @brief + * The getConcPumpIsParked function gets the current parked state for a + * given pump. + * @details Inputs: parked + * @details Outputs: none + * @param pumpId concentrate pump id to get parked state for + * @return the current concentrate pump parked state. + *************************************************************************/ +BOOL getConcPumpIsParked( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parked ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getConcPumpParkIsFaulted function gets the current park command + * fault state for a given pump. + * @details Inputs: parkFaulted + * @details Outputs: none + * @param pumpId concentrate pump id to get park faulted state for + * @return the current concentrate pump park faulted state. + *************************************************************************/ +BOOL getConcPumpParkIsFaulted( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + result = (BOOL)getU32OverrideValue( &concentratePumps[ pumpId ].parkFaulted ); + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The stopConcentratePump function sets the concentrate pump step speed - * to zero and turns off concentrate pumps. + * to zero and turns off concentrate pump. Also parks the pump if requested. * @details Inputs: none * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn * concentrate pumps off @@ -448,10 +517,13 @@ *************************************************************************/ static void stopConcentratePump( CONCENTRATE_PUMPS_T pumpId ) { - concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; + BOOL parkPump = concentratePumps[ pumpId ].hasParkBeenRequested; + concentratePumps[ pumpId ].hasParkBeenRequested = FALSE; // reset park request for next time + concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; // set target rate to zero + #ifndef _RELEASE_ + // Beta units require a stop command in addition to the zero rate if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) { if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) @@ -465,6 +537,7 @@ } #endif + // Send zero rate command to stop the pump if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) { setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); @@ -473,6 +546,43 @@ { setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } + + // Park concentrate pump too if requested +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) != SW_CONFIG_ENABLE_VALUE ) + { + if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) + { + if ( TRUE == parkPump ) + { + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAV3AcidPumpParkCmd(); + } + else + { + setFPGAV3BicarbPumpParkCmd(); + } + } + } + else + { +#endif + if ( TRUE == parkPump ) + { + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) + { + setFPGAAcidPumpParkCmd(); + } + else + { + setFPGABicarbPumpParkCmd(); + } + } +#ifndef _RELEASE_ + } + } +#endif } /*********************************************************************//** @@ -753,7 +863,7 @@ { BOOL result = FALSE; - if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && isTestingActivated() ) + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && ( TRUE == isTestingActivated() ) ) { F32 const absSpeed = fabs( value ); @@ -781,7 +891,7 @@ { BOOL result = FALSE; - if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && isTestingActivated() ) + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) { result = TRUE; concentratePumps[ pumpId ].measuredPumpSpeed.ovData = value; @@ -804,7 +914,7 @@ { BOOL result = FALSE; - if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && isTestingActivated() ) + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) { result = TRUE; concentratePumps[ pumpId ].measuredPumpSpeed.ovData = 0.0; @@ -814,4 +924,132 @@ return result; } +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkedOverride function overrides the parked + * status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parked[] + * @param pumpId concentrate pump id + * @param value override concentrate pump parked status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkedOverride( U32 pumpId, U32 value ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parked.ovData = value; + concentratePumps[ pumpId ].parked.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetConcentratePumpParkedOverride function resets the parked + * status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parked[] + * @param pumpId concentrate pump id + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetConcentratePumpParkedOverride( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parked.ovData = 0.0; + concentratePumps[ pumpId ].parked.override = OVERRIDE_RESET; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkCmdFaultedOverride function overrides the + * park command fault status of given concentrate pump id. + * @details Inputs: none + * @details Outputs: parkFaulted[] + * @param pumpId concentrate pump id + * @param value override concentrate pump park command faulted status + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkCmdFaultedOverride( U32 pumpId, U32 value ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parkFaulted.ovData = value; + concentratePumps[ pumpId ].parkFaulted.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetConcentratePumpParkCmdFaultedOverride function resets the + * park command fault status given concentrate pump id. + * @details Inputs: none + * @details Outputs: parkFaulted[] + * @param pumpId concentrate pump id + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetConcentratePumpParkCmdFaultedOverride( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + concentratePumps[ pumpId ].parkFaulted.ovData = 0.0; + concentratePumps[ pumpId ].parkFaulted.override = OVERRIDE_RESET; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetConcentratePumpParkCommand function commands the given pump + * to park. + * @details Inputs: none + * @details Outputs: measuredPumpSpeed[] + * @param pumpId concentrate pump id + * @param value override concentrate pump measured speed + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpParkCommand( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) && ( TRUE == isTestingActivated() ) ) + { + result = TRUE; + + // If pump is running, stop it w/ park option + if ( TRUE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) + { + requestConcentratePumpOff( pumpId, TRUE ); + } + // If pump is already stopped, just send park command + else + { + concentratePumps[ pumpId ].hasParkBeenRequested = TRUE; + stopConcentratePump( pumpId ); + } + } + + return result; +} + /**@}*/ Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -54,6 +54,10 @@ F32 cp2PulseUS; ///< Concentrate pump CP2 pulse in microseconds F32 cp1TargetSpeed; ///< Concentrate pump CP1 target speed F32 cp2TargetSpeed; ///< Concentrate pump CP2 target speed + BOOL cp1Parked; ///< Concentrate pump CP1 parked status + BOOL cp2Parked; ///< Concentrate pump CP2 parked status + BOOL cp1ParkFault; ///< Concentrate pump CP1 park fault status + BOOL cp2ParkFault; ///< Concentrate pump CP2 park fault status } CONCENTRATE_PUMP_DATA_T; // ********** public function prototypes ********** @@ -65,17 +69,24 @@ SELF_TEST_STATUS_T execConcenratePumpsSelfTest( void ); void requestConcentratePumpOn( CONCENTRATE_PUMPS_T pumpId ); -void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId ); +void requestConcentratePumpOff( CONCENTRATE_PUMPS_T pumpId, BOOL park ); void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min ); F32 getConcentratePumpTargetFlowMLPM( CONCENTRATE_PUMPS_T pumpId ); F32 getMeasuredPumpSpeed( CONCENTRATE_PUMPS_T pumpId ); +BOOL getConcPumpIsParked( CONCENTRATE_PUMPS_T pumpId ); +BOOL getConcPumpParkIsFaulted( CONCENTRATE_PUMPS_T pumpId ); BOOL testSetConcentratePumpDataPublishIntervalOverride( U32 value ); BOOL testResetConcentratePumpDataPublishIntervalOverride( void ); BOOL testSetConcentratePumpTargetSpeedOverride( U32 pumpId, F32 value ); BOOL testSetConcentratePumpMeasuredSpeedOverride( U32 pumpId, F32 value ); BOOL testResetConcentratePumpMeasuredSpeedOverride( U32 pumpId ); +BOOL testSetConcentratePumpParkedOverride( U32 pumpId, U32 value ); +BOOL testResetConcentratePumpParkedOverride( U32 pumpId ); +BOOL testSetConcentratePumpParkCmdFaultedOverride( U32 pumpId, U32 value ); +BOOL testResetConcentratePumpParkCmdFaultedOverride( U32 pumpId ); +BOOL testSetConcentratePumpParkCommand( U32 pumpId ); /**@}*/ Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r1e34d32fcfac88792ed72e55953dee721bacd9d5 -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -734,7 +734,7 @@ rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; // Turn off the concentrate pumps - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); @@ -1030,7 +1030,7 @@ { // Turn off the concentrate pump for now until there is sufficient RO flow to turn it // back for mixing - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Prepare for filling the reservoirs and heating the water setValveState( VPI, VALVE_STATE_OPEN ); @@ -1122,7 +1122,7 @@ setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); // Done with mixing acid - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Set the drain pump to control mode setDrainPumpTargetOutletPressure( CHEM_DISINFECT_TARGET_DRAIN_PRES_PSI ); @@ -1209,7 +1209,7 @@ case CHEM_DISINFECT_COMPLETE: // Turn off the concentrate pumps - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); // Set the valves to transfer hot water from R1 to R2 and fill up R2. setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -346,8 +346,8 @@ if ( ++rinseConcentrateLinesTimerCtr > RINSE_CONCENTRATE_LINES_WAIT ) { rinseConcentrateLinesTimerCtr = 0; - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); requestNewOperationMode( DG_MODE_GENE ); } } Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r0c296cef29037819be204c45a23d4d38a52b2718 -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 0c296cef29037819be204c45a23d4d38a52b2718) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -165,8 +165,8 @@ setValveStateDelayed( VRI, VALVE_STATE_R1_C_TO_NO, DELAY_VALVE_MS ); setValveStateDelayed( VRF, VALVE_STATE_R2_C_TO_NO, DELAY_VALVE_MS ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); signalROPumpHardStop(); signalDrainPumpHardStop(); stopHeater( DG_PRIMARY_HEATER ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r224f096c4d255526eccba9aaa13e36e0e7499f14 -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 224f096c4d255526eccba9aaa13e36e0e7499f14) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -491,8 +491,8 @@ if ( TRUE == didTimeout( concentratePrimingStartTime, PRIME_CONCENTRATE_LINES_TIME_OUT_MS ) ) { - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Set the RO pump flow rate in according to the roPumpFlushBubblesSpeed table to flush bubbles pumpSpeedIndex = 0; @@ -585,7 +585,7 @@ if ( TRUE == isConductivityInRange ) { // Initialization - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); totalBicarbConductivity = 0.0F; totalAcidConductivity = 0.0F; bicarbConductivitySampleCount = 0; @@ -865,8 +865,8 @@ { setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_IN_PAUSE_L, TARGET_RO_PRESSURE_PSI ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); havePauseActuatorsBeenSet = TRUE; } Index: firmware/App/Modes/ModeFlush.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -538,8 +538,8 @@ if ( TRUE == didTimeout( stateTimerStart, FLUSH_CONCENTRATE_STRAWS_TIME_MS ) ) { // Done with flushing the concentrate pumps line - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -r256d5cb05f1ef09e19e2f2733a111f600c73a7ee -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 256d5cb05f1ef09e19e2f2733a111f600c73a7ee) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -115,8 +115,8 @@ setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); signalDrainPumpHardStop(); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // UV reactors on turnOnUVReactor( INLET_UV_REACTOR ); Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -680,8 +680,8 @@ rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; // Done with flushing the concentrate pumps line - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); @@ -1064,8 +1064,8 @@ case HEAT_DISINFECT_COMPLETE: - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Set the valves to transfer hot water from R1 to R2 and fill up R2. setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); setValveState( VRD1, VALVE_STATE_OPEN ); @@ -1191,8 +1191,8 @@ break; case HEAT_DISINFECT_COMPLETE: - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Turn off the heaters stopHeater( DG_PRIMARY_HEATER ); stopHeater( DG_TRIMMER_HEATER ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -89,6 +89,12 @@ #define FPGA_VBF_PWM_PERIOD 16666 ///< FPGA VBf PWM period. #define FPGA_ENABLE_VALVES_PWM 0x0020 ///< FPGA enable valves PWM. #define CONCENTRATE_CAP_SWITCH_MASK 0x10 ///< Concentrate cap switch bit mask. +#define FPGA_CONC_PUMP_FAULT_BITS 0x03 ///< Concentrate pump fault bits mask. +#define FPGA_CP1_PARKED_BIT 0x04 ///< Concentrate pump 1 parked status bit mask. +#define FPGA_CP2_PARKED_BIT 0x10 ///< Concentrate pump 2 parked status bit mask. +#define FPGA_CP1_PARK_FAULT_BIT 0x08 ///< Concentrate pump 1 park fault status bit mask. +#define FPGA_CP2_PARK_FAULT_BIT 0x20 ///< Concentrate pump 2 park fault status bit mask. +#define FPGA_CONC_PUMP_PARK_COMMAND 0x80 ///< Park command bit for the concentrate pumps. #define DIALYSATE_CAP_SWITCH_MASK 0x20 ///< Dialysate cap switch bit mask. #define FPGA_THD_CONTROL_COMMAND 0X01 ///< FPGA THd control command. #define FPGA_POWER_OUT_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< FPGA power out timeout in milliseconds. @@ -776,6 +782,12 @@ fpgaWriteCmdBuffer[ FPGA_WRITE_CMD_HDR_LEN + sizeof( FPGA_ACTUATORS_T ) ] = GET_MSB_OF_WORD( crc ); fpgaWriteCmdBuffer[ FPGA_WRITE_CMD_HDR_LEN + sizeof( FPGA_ACTUATORS_T ) + 1 ] = GET_LSB_OF_WORD( crc ); + // reset one-time sets after actuator set points xmit message created + fpgaActuatorSetPoints.fpgaNewCP1Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; // clear concentrate pump park command bits + fpgaActuatorSetPoints.fgpaNewCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP1Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + fpgaActuatorSetPoints.fpgaCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; + // construct bulk read command to read sensor data registers starting at address 8 fpgaReadCmdBuffer[ 0 ] = FPGA_READ_CMD_CODE; fpgaReadCmdBuffer[ 1 ] = GET_LSB_OF_WORD( FPGA_BULK_READ_START_ADDR ); @@ -1195,7 +1207,8 @@ *************************************************************************/ void setFPGAV3AcidPumpControl( U08 pumpControl ) { - fpgaActuatorSetPoints.fpgaCP1Control = pumpControl; + fpgaActuatorSetPoints.fpgaCP1Control &= 0x80; + fpgaActuatorSetPoints.fpgaCP1Control |= pumpControl; } /*********************************************************************//** @@ -1214,6 +1227,32 @@ /*********************************************************************//** * @brief + * The setFPGABicarbPumpControl function sets the park command bit for the + * concentrate pump CP1. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP1Control + * @return none + *************************************************************************/ +void setFPGAV3AcidPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaCP1Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief + * The setFPGAV3BicarbPumpParkCmd function sets the park command bit for the + * concentrate pump CP2. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP2Control + * @return none + *************************************************************************/ +void setFPGAV3BicarbPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaCP2Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief * The setFPGAAcidPumpSetStepSpeed function sets the step speed period for * concentrate pump CP1. * @details Inputs: none @@ -1244,32 +1283,78 @@ * @brief * The setFPGAAcidPumpControl function sets the DVT concentrate pump 1 * (acid pump) control mode. + * bit 7: Park (set in different function) + * bit 6: nSleep + * bit 5: nReset + * bit 4: nEnable + * bit 3: Direction (1=Fwd, 0=Rev) + * bit 0-2: Microstepping resolution * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP1Control * @param control Concentrate pump control set * @return none *************************************************************************/ void setFPGAAcidPumpControl( U08 control ) { - fpgaActuatorSetPoints.fpgaNewCP1Control = control; + fpgaActuatorSetPoints.fpgaNewCP1Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) + fpgaActuatorSetPoints.fpgaNewCP1Control |= control; } /*********************************************************************//** * @brief * The setFPGABicarbPumpControl function sets the DVT concentrate pump 2 * (bicarb pump) control mode. + * bit 7: Park (set in different function) + * bit 6: nSleep + * bit 5: nReset + * bit 4: nEnable + * bit 3: Direction (1=Fwd, 0=Rev) + * bit 0-2: Microstepping resolution * @details Inputs: none * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control * @param control Concentrate pump control set * @return none *************************************************************************/ void setFPGABicarbPumpControl( U08 control ) { - fpgaActuatorSetPoints.fgpaNewCP2Control = control; + fpgaActuatorSetPoints.fgpaNewCP2Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) + fpgaActuatorSetPoints.fgpaNewCP2Control |= control; } /*********************************************************************//** * @brief + * The setFPGAAcidPumpParkCmd function sets the DVT concentrate pump 1 + * (acid pump) park command bit. + * bit 7: Park command bit + * bit 0-6: Other pump control bits (set in different function) + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP1Control + * @param Park command bit set + * @return none + *************************************************************************/ +void setFPGAAcidPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fpgaNewCP1Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief + * The setFPGABicarbPumpParkCmd function sets the DVT concentrate pump 2 + * (bicarb pump) park command bit. + * bit 7: Park command bit + * bit 0-6: Other pump control bits (set in different function) + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control + * @param Park command bit set + * @return none + *************************************************************************/ +void setFPGABicarbPumpParkCmd( void ) +{ + fpgaActuatorSetPoints.fgpaNewCP2Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details Inputs: fpgaHeader * @details Outputs: none @@ -1799,11 +1884,75 @@ *************************************************************************/ U08 getFPGAConcentratePumpsFault( void ) { - return fpgaSensorReadings.fpgaCP1CP2Fault; + return fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CONC_PUMP_FAULT_BITS; } /*********************************************************************//** * @brief + * The getFPGAAcidPumpIsParked function gets whether the acid pump is currently + * parked. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if acid pump is parked, FALSE if not + *************************************************************************/ +BOOL getFPGAAcidPumpIsParked( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP1_PARKED_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGABicarbPumpIsParked function gets whether the bicarb pump is currently + * parked. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if bicarb pump is parked, FALSE if not + *************************************************************************/ +BOOL getFPGABicarbPumpIsParked( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP2_PARKED_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGAAcidPumpParkFault function gets whether the acid pump park command + * has faulted. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if acid pump park command faulted, FALSE if not + *************************************************************************/ +BOOL getFPGAAcidPumpParkFault( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP1_PARK_FAULT_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getFPGABicarbPumpParkFault function gets whether the bicarb pump park command + * has faulted. + * @details Inputs: fpgaSensorReadings.fpgaCP1CP2Fault + * @details Outputs: none + * @return TRUE if bicarb pump park command faulted, FALSE if not + *************************************************************************/ +BOOL getFPGABicarbPumpParkFault( void ) +{ + U08 mask = fpgaSensorReadings.fpgaCP1CP2Fault & FPGA_CP2_PARK_FAULT_BIT; + BOOL result = ( mask > 0 ? TRUE : FALSE ); + + return result; +} + +/*********************************************************************//** + * @brief * The getFPGAEmstatOutByte function gets Emstat conductivity sensor output byte. * @details Inputs: fpgaSensorReadings.fpgaEmstatOutByte * @details Outputs: none Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -49,6 +49,8 @@ void setFPGACPiProbeType( U16 probeType ); void setFPGAV3AcidPumpControl( U08 pumpControl ); void setFPGAV3BicarbPumpControl( U08 pumpControl ); +void setFPGAV3AcidPumpParkCmd( void ); +void setFPGAV3BicarbPumpParkCmd( void ); void setFPGAAcidPumpSetStepSpeed( U16 stepSpeed ); void setFPGABicarbSetStepSpeed( U16 stepSpeed ); @@ -100,7 +102,11 @@ U08 getFPGACPoErrorCount( void ); U32 getFPGACPo( void ); -U08 getFPGAConcentratePumpsFault( void ); +U08 getFPGAConcentratePumpsFault( void ); +BOOL getFPGAAcidPumpIsParked( void ); +BOOL getFPGABicarbPumpIsParked( void ); +BOOL getFPGAAcidPumpParkFault( void ); +BOOL getFPGABicarbPumpParkFault( void ); U08 getFPGAEmstatCD1CD2OutByte( void ); U08 getFPGAEmstatCD1CD2RxErrCount( void ); @@ -149,8 +155,11 @@ #endif //***************** DVT Functions ***************************/ + void setFPGAAcidPumpControl( U08 control ); void setFPGABicarbPumpControl( U08 control ); +void setFPGAAcidPumpParkCmd( void ); +void setFPGABicarbPumpParkCmd( void ); U08 getFPGABaroReadCount( void ); U08 getFPGABaroErrorCount( void ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -1220,6 +1220,18 @@ handleTestDGDrainPumpDirectionOverrideRequest( message ); break; + case MSG_ID_DG_CONC_PUMP_PARK_STATUS_OVERRIDE: + handleTestDGConcPumpParkStatusOverrideRequest( message ); + break; + + case MSG_ID_DG_CONC_PUMP_PARK_FAULT_STATUS_OVERRIDE: + handleTestDGConcPumpParkFaultStatusOverrideRequest( message ); + break; + + case MSG_ID_DG_CONC_PUMP_PARK_COMMAND: + handleTestDGConcPumpParkCommandRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -2770,7 +2770,7 @@ } else { - requestConcentratePumpOff( ( CONCENTRATE_PUMPS_T )payload.index ); + requestConcentratePumpOff( ( CONCENTRATE_PUMPS_T )payload.index, FALSE ); } } @@ -3893,4 +3893,93 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** +* The handleTestDGConcPumpParkStatusOverrideRequest function handles a +* request to override the parked status of a given concentrate pump. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleTestDGConcPumpParkStatusOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); + + if ( FALSE == payload.reset ) + { + result = testSetConcentratePumpParkedOverride( payload.index, (U16)payload.state.u32 ); + } + else + { + result = testResetConcentratePumpParkedOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** +* The handleTestDGConcPumpParkFaultStatusOverrideRequest function handles a +* request to override the park faulted status of a given concentrate pump. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleTestDGConcPumpParkFaultStatusOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); + + if ( FALSE == payload.reset ) + { + result = testSetConcentratePumpParkCmdFaultedOverride( payload.index, (U16)payload.state.u32 ); + } + else + { + result = testResetConcentratePumpParkCmdFaultedOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** +* The handleTestDGConcPumpParkCommandRequest function handles a command +* to park a given concentrate pump. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleTestDGConcPumpParkCommandRequest( MESSAGE_T *message ) +{ + U32 pumpIdx; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + memcpy( &pumpIdx, message->payload, sizeof( U32 ) ); + + result = testSetConcentratePumpParkCommand( pumpIdx ); + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -reae0635792a827b7cf9197cf6f6e253f2a094260 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) @@ -418,6 +418,16 @@ // MSG_ID_DG_NV_RECORD_CRC_OVERRIDE void handleTestDGNVRecordCRCOverride( MESSAGE_T *message ); +// MSG_ID_DG_CONC_PUMP_PARK_STATUS_OVERRIDE +void handleTestDGConcPumpParkStatusOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_CONC_PUMP_PARK_FAULT_STATUS_OVERRIDE +void handleTestDGConcPumpParkFaultStatusOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_CONC_PUMP_PARK_COMMAND +void handleTestDGConcPumpParkCommandRequest( MESSAGE_T *message ); + + /**@}*/ #endif