Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r39c83612c7d83075cded8b7e1c8030898cdb5ad9 -r62e9a14081b3c97ea244c3c167098eba8cd409d1 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 39c83612c7d83075cded8b7e1c8030898cdb5ad9) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 62e9a14081b3c97ea244c3c167098eba8cd409d1) @@ -143,6 +143,7 @@ static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); static void calcMeasuredPumpsSpeed( void ); static void monitorPumpSpeed( CONCENTRATE_PUMPS_T pumpId, ALARM_ID_T alarm ); +static void checkConcentratePumpControlSet( CONCENTRATE_PUMPS_T pumpId ); /*********************************************************************//** * @brief @@ -159,7 +160,7 @@ acidConcentratePumpParkPersistenceClear = FALSE; ///< Boolean acid park persistence clearing. bicarbConcentratePumpParkPersistenceClear = FALSE; - for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; 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; @@ -308,7 +309,7 @@ { CONCENTRATE_PUMPS_T pumpId; - for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) + for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) { switch ( concentratePumps[ pumpId ].execState ) { @@ -738,14 +739,15 @@ static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ) { CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE; + F32 targetToCurreSpeedDiffMLPM = fabs( concentratePumps[ pumpId ].pumpTargetSpeed - concentratePumps[ pumpId ].currentPumpSpeed ); if ( ++concentratePumps[ pumpId ].controlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) { concentratePumps[ pumpId ].controlTimerCounter = 0; stepConcentratePumpToTargetSpeed( pumpId ); } - if ( concentratePumps[ pumpId ].pumpTargetSpeed >= CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM ) + if ( targetToCurreSpeedDiffMLPM >= CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM ) { // If the requested target speed is greater than the threshold, transition back to ramp state regardless of the status of the // control interval @@ -816,7 +818,10 @@ concentratePumps[ pumpId ].togglePeriodCount = CONCENTRATE_PUMP_ZERO_FLOW_RATE; } + // Check if the control set bit is set as desired and if not, correct it + checkConcentratePumpControlSet( pumpId ); + if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) { setFPGAAcidPumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); @@ -921,7 +926,47 @@ checkPersistentAlarm( alarm, isCpSpeedOut, cpError, tolerance ); } +/*********************************************************************//** + * @brief + * The checkConcentratePumpControlSet function monitors the status of the + * concentrate pumps control set bit and if they are different from the + * required set bit, they are set again. + * @details Inputs: concentratePumps + * @details Outputs: none + * @param pumpId pump id to check its control set bit + * @return none + *************************************************************************/ +static void checkConcentratePumpControlSet( CONCENTRATE_PUMPS_T pumpId ) +{ + U08 controlSetBits; + switch ( pumpId ) + { + case CONCENTRATEPUMPS_CP1_ACID: + controlSetBits = getFPGAAcidPumpControlStatus(); + + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAAcidPumpControl( concentratePumps[ pumpId ].controlSet ); + } + break; + + case CONCENTRATEPUMPS_CP2_BICARB: + controlSetBits = getFPGABicarbPumpControlStatus(); + + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGABicarbPumpControl( concentratePumps[ pumpId ].controlSet ); + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + break; + } +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r39c83612c7d83075cded8b7e1c8030898cdb5ad9 -r62e9a14081b3c97ea244c3c167098eba8cd409d1 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 39c83612c7d83075cded8b7e1c8030898cdb5ad9) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 62e9a14081b3c97ea244c3c167098eba8cd409d1) @@ -337,7 +337,7 @@ * The handleDrainStateTare function handles the tare state of the drain mode * state machine. * @details Inputs: drainEmptyTareTimerCtr - * @details Outputs: drainEmptyTareTimerCtr + * @details Outputs: drainEmptyTareTimerCtr, rinseConcentrateLines * @return the next state *************************************************************************/ static DG_DRAIN_STATE_T handleDrainStateTare( void ) @@ -371,8 +371,8 @@ * @brief * The handleRinseState function handles the tare state of the drain mode * state machine. - * @details Inputs: drainEmptyTareTimerCtr - * @details Outputs: drainEmptyTareTimerCtr + * @details Inputs: drainEmptyTareTimerCtr, rinseConcentrateLines + * @details Outputs: drainEmptyTareTimerCtr, rinseConcentrateLines * @return the next state *************************************************************************/ static DG_DRAIN_STATE_T handleRinseState( void ) @@ -384,6 +384,7 @@ if ( ++rinseConcentrateLinesTimerCtr > RINSE_CONCENTRATE_LINES_WAIT ) { rinseConcentrateLinesTimerCtr = 0; + rinseConcentrateLines = FALSE; requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, NO_PARK_CONC_PUMPS ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, NO_PARK_CONC_PUMPS ); requestNewOperationMode( DG_MODE_GENE ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -re9b499955bef76d8ca26abb2a65b60eaae1be649 -r62e9a14081b3c97ea244c3c167098eba8cd409d1 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision e9b499955bef76d8ca26abb2a65b60eaae1be649) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 62e9a14081b3c97ea244c3c167098eba8cd409d1) @@ -324,7 +324,7 @@ U16 fpgaDACRegFIn; ///< Reg 126. Debug DAC channel F output U16 fpgaDACRegGIn; ///< Reg 128. Debug DAC channel G output U16 fpgaDACRegHIn; ///< Reg 130. Debug DAC channel H output - U08 fgpaNewCP2Control; ///< Reg 132. Concentrate pump 2 control + U08 fpgaNewCP2Control; ///< Reg 132. Concentrate pump 2 control U08 fpgaNewCP1Control; ///< Reg 133. Concentrate pump 1 control } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -756,7 +756,7 @@ // 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.fpgaNewCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; fpgaActuatorSetPoints.fpgaCP1Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; fpgaActuatorSetPoints.fpgaCP2Control &= ~FPGA_CONC_PUMP_PARK_COMMAND; @@ -1299,6 +1299,25 @@ /*********************************************************************//** * @brief + * The getFPGAAcidPumpControlStatus function gets the status of the + * acid pump control status bits. + * 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 + * @return Acid pump control status bit + *************************************************************************/ +U08 getFPGAAcidPumpControlStatus( void ) +{ + return fpgaActuatorSetPoints.fpgaNewCP1Control; +} + +/*********************************************************************//** + * @brief * The setFPGABicarbPumpControl function sets the DVT concentrate pump 2 * (bicarb pump) control mode. * bit 7: Park (set in different function) @@ -1308,18 +1327,37 @@ * bit 3: Direction (1=Fwd, 0=Rev) * bit 0-2: Microstepping resolution * @details Inputs: none - * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control + * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP2Control * @param control Concentrate pump control set * @return none *************************************************************************/ void setFPGABicarbPumpControl( U08 control ) { - fpgaActuatorSetPoints.fgpaNewCP2Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) - fpgaActuatorSetPoints.fgpaNewCP2Control |= control; + fpgaActuatorSetPoints.fpgaNewCP2Control &= FPGA_CONC_PUMP_PARK_COMMAND; // preserve msb (park command bit) + fpgaActuatorSetPoints.fpgaNewCP2Control |= control; } /*********************************************************************//** * @brief + * The getFPGABicarbPumpControlStatus function gets 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.fpgaNewCP2Control + * @return Bicarb pump control status bit + *************************************************************************/ +U08 getFPGABicarbPumpControlStatus( void ) +{ + return fpgaActuatorSetPoints.fpgaNewCP2Control; +} + +/*********************************************************************//** + * @brief * The setFPGAAcidPumpParkCmd function sets the DVT concentrate pump 1 * (acid pump) park command bit. * bit 7: Park command bit @@ -1341,13 +1379,13 @@ * bit 7: Park command bit * bit 0-6: Other pump control bits (set in different function) * @details Inputs: none - * @details Outputs: fpgaActuatorSetPoints.fgpaNewCP2Control + * @details Outputs: fpgaActuatorSetPoints.fpgaNewCP2Control * @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 + fpgaActuatorSetPoints.fpgaNewCP2Control |= FPGA_CONC_PUMP_PARK_COMMAND; // this bit must be cleared after next transmit to prevent continuous park commands } /*********************************************************************//** Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r34ae229d1508df89630f4dc5fbe9291d135f0686 -r62e9a14081b3c97ea244c3c167098eba8cd409d1 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 34ae229d1508df89630f4dc5fbe9291d135f0686) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 62e9a14081b3c97ea244c3c167098eba8cd409d1) @@ -157,7 +157,9 @@ //***************** DVT Functions ***************************/ void setFPGAAcidPumpControl( U08 control ); +U08 getFPGAAcidPumpControlStatus( void ); void setFPGABicarbPumpControl( U08 control ); +U08 getFPGABicarbPumpControlStatus( void ); void setFPGAAcidPumpParkCmd( void ); void setFPGABicarbPumpParkCmd( void );