Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r7d24ef2e6a4130b3a049e6106a0371fc6503271f -rae31b4c999dccae70fb40fb9d98a4380ce2c7415 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 7d24ef2e6a4130b3a049e6106a0371fc6503271f) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ae31b4c999dccae70fb40fb9d98a4380ce2c7415) @@ -1,20 +1,20 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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) Vinayakam Mani -* @date (last) 18-Sep-2024 +* @author (last) Dara Navaei +* @date (last) 18-Mar-2026 * * @author (original) Vinayakam Mani -* @date (original) 18-Sep-2024 +* @date (original) 19-Sep-2024 * ***************************************************************************/ -#include +#include // for fabs() calculations #include "ConcentratePumps.h" #include "FpgaDD.h" @@ -36,13 +36,12 @@ #define CONCENTRATE_PUMP_REVERSE_DIR 0x0 ///< Concentrate pump reverse direction configuration. #define CONCENTRATE_PUMP_RAMP_SPEED_INCREMENT 10.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. -#define CONCENTRATE_PUMP_MIN_SPEED 3.0F ///< Minimum speed for concentrate pump in mL per min. -#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.01F ///< Concentrate pump speed out of range tolerance when on in percentage. +#define CONCENTRATE_PUMP_MIN_SPEED 0.0F ///< Minimum speed for concentrate pump in mL per min. +#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.0075F ///< Concentrate pump speed out of range tolerance when on in percentage. #define CONCENTRATE_PUMP_CLEANING_SPD_OUT_OF_RANGE_TOL_PCT 0.05F ///< Concentrate pump cleaning mode speed out of range tolerance when on in percentage. -#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 1.0F ///< Concentrate pump speed out of range tolerance when slow in mL/min. -#define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 10.0F ///< Concentrate pump low speed threshold in mL/min. -#define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. - +#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 0.5F ///< Concentrate pump speed out of range tolerance when slow in mL/min. +#define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 5.0F ///< Concentrate pump low speed threshold in mL/min. +#define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFFFFFF ///< Pulse width value when zero flow rate or pump is off. #define CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER 0.4F ///< Volume output every revolution (mL). #define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). @@ -56,25 +55,19 @@ #define CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION_DIENER ( ( 1.0F / CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER ) * \ ( CONCENTRATE_PUMP_STEP_PER_REV * \ CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ) ) ///< Convert volume in to number of revolutions needed. -#define CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ( ( 1.0F / CONCENTRATE_PUMP_VOLUME_PER_REV ) * \ - ( CONCENTRATE_PUMP_VOLUME_PER_REV * \ - CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ) ) ///< Convert volume in to number of revolutions needed. #define CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION ( 0.50F / ( US_PER_SECOND * SEC_PER_MIN ) ) ///< Convert step period resolution (0.50 us) to minute. /// Volume output per pulse. -#define CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER ) -#define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_VOLUME_PER_REV ) +#define CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER ( CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. #define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. -#define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. +#define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. +#define UF_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< UF pump speed out of range timeout in milliseconds. #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 ZERO_REVOLUTION_COUNT 0 ///< Revolution count reached to Zero. - #define CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD 500 ///< Concentrate pump fault persistence period in milliseconds. #define CONCENTRATE_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 20.0F ///< Concentrate pump transition to ramp to target speed threshold in mL/min. @@ -115,7 +108,7 @@ CONCENTRATE_PUMP_STATE_T execState; ///< Concentrate pump execute current state. BOOL hasTurnOnPumpsBeenRequested; ///< Flag indicates a request to turn concentrate pumps on. F32 currentPumpSpeed; ///< Current controlled concentrate pumps' speed (mL/min). - U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). + U32 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. @@ -137,10 +130,8 @@ static BOOL acidConcentratePumpParkPersistenceClear; ///< Boolean acid park persistence clearing. static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicarb park persistence clearing. static BOOL ufPumpParkPersistenceClear; ///< Boolean for UF pump park persistence clearing. +static OVERRIDE_U32_T concentratePumpDataPublishInterval; ///< Concentrate pump data publish interval. -/// 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 OVERRIDE_U32_T hasParkBeenRequested[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Flag indicates a request to park the pump. static OVERRIDE_F32_T pumpTargetSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Target concentrate pumps' speed (mL/min). @@ -225,9 +216,14 @@ isDosingCompleted[ pumpId ] = FALSE; } + concentratePumpDataPublishInterval.data = CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL; + concentratePumpDataPublishInterval.ovInitData = CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL; + concentratePumpDataPublishInterval.ovData = 0; + concentratePumpDataPublishInterval.override = OVERRIDE_RESET; + initPersistentAlarm( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DD_D76_PUMP_SPEED_CONTROL_ERROR, 0, UF_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_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_DD_CONCENTRATE_PUMP_FAULT, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); } @@ -561,14 +557,7 @@ } else { - if ( TRUE == getTestConfigStatus( TEST_CONFIG_DIENER_CONC_PUMP ) ) - { - pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION_DIENER ); - } - else - { - pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ); - } + pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION_DIENER ); } if ( D11_PUMP == pumpId ) @@ -588,22 +577,11 @@ } /* - * If 3.0 <= speed <= 48 set it - * If speed < 3.0 set to 0 - * else speed > 48 set to 48 + * If 0.0 <= speed <= 200 set it + * If speed < 0.0 set to 0 + * else speed > 200 set to 200 */ - if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) ) - { - pumpTargetSpeed[ pumpId ].data = targetSpeed_ml_min; - } - else if ( targetSpeed_ml_min < CONCENTRATE_PUMP_MIN_SPEED ) - { - pumpTargetSpeed[ pumpId ].data = 0.0; - } - else - { - pumpTargetSpeed[ pumpId ].data = CONCENTRATE_PUMP_MAX_SPEED; - } + pumpTargetSpeed[ pumpId ].data = RANGE(targetSpeed_ml_min, CONCENTRATE_PUMP_MIN_SPEED, CONCENTRATE_PUMP_MAX_SPEED ); } else { @@ -756,13 +734,13 @@ * @param pumpId concentrate pump id to get target revolution count * @return the target revolution count for the given concentrate pump *************************************************************************/ -U16 getConcPumpTargetRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) +U32 getConcPumpTargetRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) { - U16 result = 0; + U32 result = 0; if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = (U16)getU32OverrideValue( &pumpTargetRevCnt[ pumpId ] ); + result = getU32OverrideValue( &pumpTargetRevCnt[ pumpId ] ); } else { @@ -782,13 +760,13 @@ * @param pumpId concentrate pump id to get current measured revolution count * @return the current revolution count for the given concentrate pump *************************************************************************/ -U16 getConcPumpCurrentMeasuredRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) +U32 getConcPumpCurrentMeasuredRevolutionCount( CONCENTRATE_PUMPS_T pumpId ) { - BOOL result = FALSE; + U32 result = 0; if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - result = (U16)getU32OverrideValue( &pumpMesauredRevCnt[ pumpId ] ); + result = getU32OverrideValue( &pumpMesauredRevCnt[ pumpId ] ); } else { @@ -884,7 +862,7 @@ { setFPGAD76PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } - +#if 0 // Park concentrate pump too if requested if ( TRUE == parkPump ) { @@ -905,6 +883,7 @@ } concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } +#endif } /*********************************************************************//** @@ -1067,16 +1046,9 @@ F32 timePerStep; F32 stepPeriodCounts; - if ( TRUE == getTestConfigStatus( TEST_CONFIG_DIENER_CONC_PUMP ) ) - { - timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER / ( concentratePumps[ pumpId ].currentPumpSpeed * CONCENTRATE_PUMP_STEP_PER_REV ); - } - else - { - timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV / ( concentratePumps[ pumpId ].currentPumpSpeed * CONCENTRATE_PUMP_STEP_PER_REV ); - } + timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER / ( concentratePumps[ pumpId ].currentPumpSpeed * CONCENTRATE_PUMP_STEP_PER_REV ); stepPeriodCounts = timePerStep / ( CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION * CONCENTRATE_PUMP_MICRO_STEPS_PER_STEP ); - concentratePumps[ pumpId ].togglePeriodCount = (U16)( stepPeriodCounts + FLOAT_TO_INT_ROUNDUP_OFFSET ); + concentratePumps[ pumpId ].togglePeriodCount = (U32)( stepPeriodCounts + FLOAT_TO_INT_ROUNDUP_OFFSET ); } else { @@ -1116,7 +1088,7 @@ static void calcMeasuredPumpsSpeed( void ) { CONCENTRATE_PUMPS_T pumpId; - U16 pulseWidthCount = 0; + U32 pulseWidthCount = 0; F32 pulseWidthInMicroSeconds = 0.0F; BOOL isPulseWidthOut = FALSE; CONCENTRATE_PUMPS_T pumpInAlarm = CONCENTRATEPUMPS_FIRST; @@ -1149,14 +1121,7 @@ } else if ( FALSE == isPumpPulseWidthOut ) { - if ( TRUE == getTestConfigStatus( TEST_CONFIG_DIENER_CONC_PUMP ) ) - { - measuredPumpSpeed[ pumpId ].data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER * SEC_PER_MIN; - } - else - { - measuredPumpSpeed[ pumpId ].data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; - } + measuredPumpSpeed[ pumpId ].data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER * SEC_PER_MIN; } // If pulse width is out of range capture pump out of range, pumpId and pulse width @@ -1291,10 +1256,10 @@ data.d10_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d10_PumpDirection ? d10_PumpSetSpeed * -1.0F : d10_PumpSetSpeed ); data.d10_PumpMeasuredSpeed = getMeasuredPumpSpeedMLPM( D10_PUMP ); data.d10_PumpTargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d10_PumpDirection ? d10_PumpTgtSpeed * -1.0F : d10_PumpTgtSpeed ); - data.d11_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D11_PUMP ); - data.d11_PumpMeasuredRevCount= (U32)getConcPumpCurrentMeasuredRevolutionCount( D11_PUMP ); - data.d10_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D10_PUMP ); - data.d10_PumpMeasuredRevCount= (U32)getConcPumpCurrentMeasuredRevolutionCount( D10_PUMP ); + data.d11_PumpTargetRevCount = getConcPumpTargetRevolutionCount( D11_PUMP ); + data.d11_PumpMeasuredRevCount= getConcPumpCurrentMeasuredRevolutionCount( D11_PUMP ); + data.d10_PumpTargetRevCount = getConcPumpTargetRevolutionCount( D10_PUMP ); + data.d10_PumpMeasuredRevCount= getConcPumpCurrentMeasuredRevolutionCount( D10_PUMP ); data.d11_PumpState = concentratePumps[ D11_PUMP ].execState; data.d10_PumpState = concentratePumps[ D10_PUMP ].execState; data.d11_PumpPulseUS = concentratePumps[ D11_PUMP ].pulseWidthUS; @@ -1438,6 +1403,7 @@ BOOL testConcentratePumpStartStopOverride( MESSAGE_T *message ) { BOOL result = FALSE; + BOOL speedRangeCheck = FALSE; // Verify tester has logged in with DD if ( TRUE == isTestingActivated() ) @@ -1451,10 +1417,10 @@ if ( (CONCENTRATE_PUMPS_T)payload.pumpID < NUM_OF_CONCENTRATE_PUMPS ) { + speedRangeCheck = ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED )? TRUE : FALSE ); + // Handle start command - if ( ( TRUE == payload.startStop ) && - ( ( payload.speed >= CONCENTRATE_PUMP_MIN_SPEED ) && ( payload.speed <= CONCENTRATE_PUMP_MAX_SPEED ) ) && - ( payload.volume > 0.0 ) ) + if ( ( TRUE == payload.startStop ) && ( TRUE == speedRangeCheck ) && ( payload.volume > 0.0 ) ) { setConcentratePumpTargetSpeed( (CONCENTRATE_PUMPS_T)payload.pumpID, payload.speed, payload.volume ); requestConcentratePumpOn ( (CONCENTRATE_PUMPS_T)payload.pumpID );