Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r56b1e4181f80f63d290101348dacdb3f1c39c538 -r7d0fd5ed6b9db0479af90477e5108f6d3fa8df17 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 56b1e4181f80f63d290101348dacdb3f1c39c538) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 7d0fd5ed6b9db0479af90477e5108f6d3fa8df17) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ConcentratePumps.c * * @author (last) Dara Navaei -* @date (last) 20-Jul-2023 +* @date (last) 09-Apr-2024 * * @author (original) Quang Nguyen * @date (original) 22-Oct-2020 @@ -19,6 +19,7 @@ #include "ConcentratePumps.h" #include "FPGA.h" #include "MessageSupport.h" +#include "OperationModes.h" #include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -64,7 +65,6 @@ #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. -#define CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Concentrate pump park fault timeout in milliseconds. #define CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD 500 ///< Concentrate pump fault persistence period in milliseconds. #define CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 5.0F ///< Concentrate pump transition to ramp to target speed threshold in mL/min. @@ -118,6 +118,7 @@ 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). + BOOL isConcPumpParkInProgress; ///< Concentrate pump park progress boolean flag (T/F). } CONCENTRATE_PUMP_T; // ********** private data ********** @@ -156,8 +157,8 @@ { CONCENTRATE_PUMPS_T pumpId; - concentratePumpMonitorTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - acidConcentratePumpParkPersistenceClear = FALSE; ///< Boolean acid park persistence clearing. + concentratePumpMonitorTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + acidConcentratePumpParkPersistenceClear = FALSE; bicarbConcentratePumpParkPersistenceClear = FALSE; for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) @@ -172,14 +173,13 @@ concentratePumps[ pumpId ].pumpTargetSpeed = 0.0F; concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT + concentratePumps[ pumpId ].isConcPumpParkInProgress = FALSE; stopConcentratePump( pumpId ); } - initPersistentAlarm( ALARM_ID_DG_CP1_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CP2_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_CP1_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_CP2_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); - initPersistentAlarm( ALARM_ID_DG_ACID_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_BICARB_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); } @@ -213,6 +213,16 @@ concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parkFaulted.data = (U32)getFPGAAcidPumpParkFault(); concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parkFaulted.data = (U32)getFPGABicarbPumpParkFault(); + if ( ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ) ) || ( TRUE == getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ) ) ) + { + // If the pump has parked or faulted during the park, then it is not in progress + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].isConcPumpParkInProgress = FALSE; + } + if ( ( TRUE == getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ) ) || ( TRUE == getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ) ) ) + { + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].isConcPumpParkInProgress = FALSE; + } + // Don't monitor persistence for cp speed alarms if we parked. if ( TRUE == acidConcentratePumpParkPersistenceClear ) { @@ -249,17 +259,6 @@ monitorPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB, ALARM_ID_DG_CP2_SPEED_CONTROL_ERROR ); } -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - BOOL isAcidPumpParked = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); - BOOL isBicarbPumpParked = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ); - - checkPersistentAlarm( ALARM_ID_DG_ACID_CONCENTRATE_PUMP_PARK_FAULT, isAcidPumpParked, isAcidPumpParked, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); - checkPersistentAlarm( ALARM_ID_DG_BICARB_CONCENTRATE_PUMP_PARK_FAULT, isBicarbPumpParked, isBicarbPumpParked, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); - } - checkPersistentAlarm( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, isConcPumpFault, fpgaConcPumpsFault, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); if ( ++concentratePumpMonitorTimerCounter >= getU32OverrideValue( &concentratePumpDataPublishInterval ) ) @@ -269,8 +268,6 @@ U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; 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 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; @@ -379,6 +376,8 @@ #endif { concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = TRUE; + acidConcentratePumpParkPersistenceClear = FALSE; + bicarbConcentratePumpParkPersistenceClear = FALSE; } } else @@ -389,6 +388,72 @@ /*********************************************************************//** * @brief + * The handleConcentratePumpParkRequest function accepts/rejects the park + * concentrate pumps request. + * @details Inputs: Pump state and DG operating mode + * @details Outputs: command response set to true if able to perform parking pump. + * @return result as true if park is accomplished. + *************************************************************************/ +BOOL handleConcentratePumpParkRequest( void ) +{ + DG_CMD_RESPONSE_T cmdResponse; + BOOL result = FALSE; + DG_OP_MODE_T opMode = getCurrentOperationMode(); + + cmdResponse.commandID = DG_CMD_PARK_CONCENTRATE_PUMPS; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + + // pumps should be not ON and DG operation mode is not in filling and fault mode + if ( ( concentratePumps[CONCENTRATEPUMPS_CP1_ACID].execState == CONCENTRATE_PUMP_OFF_STATE ) && + ( concentratePumps[CONCENTRATEPUMPS_CP2_BICARB].execState == CONCENTRATE_PUMP_OFF_STATE ) && + ( DG_MODE_FILL != opMode ) && + ( DG_MODE_FAUL != opMode ) ) + { + // Park concentrate pump + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, PARK_CONC_PUMPS ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, PARK_CONC_PUMPS ); + result = TRUE; + } + else + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE; + result = FALSE; + } + + sendCommandResponseMsg( &cmdResponse ); + + return result; +} + +/*********************************************************************//** + * @brief + * The isConcPumpParkInProgress function requests whether the concentrate + * pump park is in progress or not. + * @details Inputs: concentratePumps + * @details Outputs: none + * @param pumpId concentrate pump id + * @return TRUE if the concentrate pump park is in progress otherwise, FALSE + *************************************************************************/ +BOOL isConcPumpParkInProgress( CONCENTRATE_PUMPS_T pumpId ) +{ + BOOL status = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + status = concentratePumps[ pumpId ].isConcPumpParkInProgress; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } + + return status; +} + +/*********************************************************************//** + * @brief * The requestConcentratePumpOff function requests the module to turn off * the concentrate pumps. * @details Inputs: none @@ -437,6 +502,11 @@ targetSpeed_ml_min *= -1.0; } + /* + * If 3 <= speed <= 48 set it + * If speed < 3 set to 0 + * else speed > 48 set to 48 + */ if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) ) { concentratePumps[ pumpId ].pumpTargetSpeed = targetSpeed_ml_min; @@ -445,7 +515,7 @@ { concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; } - else if ( targetSpeed_ml_min > CONCENTRATE_PUMP_MAX_SPEED ) + else { concentratePumps[ pumpId ].pumpTargetSpeed = CONCENTRATE_PUMP_MAX_SPEED; } @@ -632,6 +702,7 @@ setFPGABicarbPumpParkCmd(); bicarbConcentratePumpParkPersistenceClear = TRUE; } + concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } } #ifndef _RELEASE_ @@ -843,27 +914,32 @@ *************************************************************************/ static void calcMeasuredPumpsSpeed( void ) { + CONCENTRATE_PUMPS_T pumpId; U16 pulseWidthCount = 0; F32 pulseWidthInMicroSeconds = 0.0F; BOOL isPulseWidthOut = FALSE; - CONCENTRATE_PUMPS_T pumpId; CONCENTRATE_PUMPS_T pumpInAlarm = CONCENTRATEPUMPS_FIRST; F32 pumpInAlarmPulseWidthInMicroSeconds = 0.0F; BOOL isPumpPulseWidthOut = FALSE; for ( pumpId = CONCENTRATEPUMPS_FIRST; pumpId < NUM_OF_CONCENTRATE_PUMPS; pumpId++ ) { - switch (pumpId) + switch ( pumpId ) { case CONCENTRATEPUMPS_CP1_ACID: pulseWidthCount = getFPGACP1HallSensePulseWidth(); break; + case CONCENTRATEPUMPS_CP2_BICARB: pulseWidthCount = getFPGACP2HallSensePulseWidth(); break; + +#ifndef _VECTORCAST_ + // Disabled in VectorCAST since it cannot be reached in VectorCAST because the switch case is in a for loop default: // Loop only allows for valid concentrate pump Ids. break; +#endif } pulseWidthInMicroSeconds = pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; @@ -881,7 +957,7 @@ } // If pulse width is out of range capture pump out of range, pumpId and pulse width - if ( TRUE == isPumpPulseWidthOut) + if ( TRUE == isPumpPulseWidthOut ) { // Pulse width for this concentrate pump is out of range isPulseWidthOut = TRUE; @@ -891,7 +967,6 @@ } checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pumpInAlarm, pumpInAlarmPulseWidthInMicroSeconds ); - } /*********************************************************************//** @@ -907,7 +982,7 @@ static void monitorPumpSpeed( CONCENTRATE_PUMPS_T pumpId, ALARM_ID_T alarm ) { F32 cpTargetSpeed = concentratePumps[ pumpId ].currentPumpSpeed; - F32 cpError = fabs( getMeasuredPumpSpeedMLPM( pumpId ) - cpTargetSpeed ); + F32 cpError = fabs( fabs( getMeasuredPumpSpeedMLPM( pumpId ) ) - cpTargetSpeed ); BOOL isCpSpeedOut = FALSE; F32 tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM;