Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -rb8a36ae9692adf58ae92ff1093f7be2eda9397d8 -r3e9328290bdbc18a940935bd7f7c720ca8432b1d --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision b8a36ae9692adf58ae92ff1093f7be2eda9397d8) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3e9328290bdbc18a940935bd7f7c720ca8432b1d) @@ -63,6 +63,29 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 0 ///< Data publish counter start count. +/*************************DVT Definitions********************************************/ + +#define CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP 0x07 ///< Concentrate pump control 1/8th step. +#define CONCENTRATE_PUMP_CONTROL_REVERSE_DIR 0x08 ///< Concentrate pump control reverse direction. +#define CONCENTRATE_PUMP_CONTROL_FORWARD_DIR 0x00 ///< Concentrate pump control forward direction. +#define CONCENTRATE_PUMP_CONTROL_ENABLE 0x00 ///< Concentrate pump control enable pump. +#define CONCENTRATE_PUMP_CONTROL_NOT_RESET 0x20 ///< Concentrate pump control not reset. +#define CONCENTRATE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Concentrate pump control sleep off. + +static const U32 CONCENTRATE_PUMP_CONTROL_FORWARD = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | + CONCENTRATE_PUMP_CONTROL_NOT_RESET | + CONCENTRATE_PUMP_CONTROL_ENABLE | + CONCENTRATE_PUMP_CONTROL_FORWARD_DIR | + CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP; ///< Concentrate pump control forward. + +static const U32 CONCENTRATE_PUMP_CONTROL_REVERSE = CONCENTRATE_PUMP_CONTROL_SLEEP_OFF | + CONCENTRATE_PUMP_CONTROL_NOT_RESET | + CONCENTRATE_PUMP_CONTROL_ENABLE | + CONCENTRATE_PUMP_CONTROL_REVERSE_DIR | + CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP; ///< Concentrate pump control reverse. + +/*************************DVT Definitions********************************************/ + /// Enumeration of concentrate pump states. typedef enum ConcentratePumpState { @@ -85,8 +108,8 @@ U16 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Concentrate pump motor direction. - void ( *control )( U08 ); ///< Concentrate pump FPGA control function pointer. - void ( *setStepSpeed )( U16 ); ///< Concentrate pump FPGA set step speed function pointer. + U08 controlSet; ///< Concentrate pump control set. (Used in DVT) + F32 pulseWidthUS; ///< Concentrate pump pulse width in microseconds. } CONCENTRATE_PUMP_T; // ********** private data ********** @@ -101,17 +124,12 @@ static DG_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. static DG_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. -static F32 cp1PulsetemporaryRemove; -static F32 cp2PulsetemporaryRemove; - - // ********** private function prototypes ********** static void stopConcentratePump( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOffState( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpRampToTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ); static CONCENTRATE_PUMP_STATE_T handleConcentratePumpControlTargetSpeedState( CONCENTRATE_PUMPS_T pumpId ); - static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ); @@ -125,23 +143,16 @@ void initConcentratePump( void ) { CONCENTRATE_PUMPS_T pumpId; - concentratePumpMonitorTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].control = &setFPGACP1Control; - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].setStepSpeed = &setFPGACP1SetStepSpeed; - - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].control = &setFPGACP2Control; - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].setStepSpeed = &setFPGACP2SetStepSpeed; - for ( pumpId = CONCENTRATEPUMPS_CP1_ACID; pumpId < NUM_OF_CONCENTRATE_PUMPS; ++pumpId ) { concentratePumps[ pumpId ].controlTimerCounter = 0; concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; - + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT stopConcentratePump( pumpId ); } @@ -180,40 +191,40 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcentratePumpsFault ); } - calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); + calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); - // Get CP1 specifications - U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; - F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); - - // Get CP2 specifications - U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; - F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); - + U08 cp1Direction = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].direction; + F32 cp1SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; + F32 cp1Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); + U08 cp2Direction = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].direction; + F32 cp2SetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; + F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + // 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 ); data.cp2CurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2SetSpeed * -1.0 : cp2SetSpeed ); data.cp2MeasuredSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == cp2Direction ? cp2Speed * -1.0 : cp2Speed ); data.cp1State = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState; data.cp2State = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState; + data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; + data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; - data.cp1PulseInSeconds = cp1PulsetemporaryRemove; - data.cp2PulseInSeconds = cp2PulsetemporaryRemove; - #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif { - F32 cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].currentPumpSpeed; - F32 cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].currentPumpSpeed; - checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); - checkPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, cp2Error > CONCENTRATE_PUMP_ERROR_TOLERANCE, cp2Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + F32 cp1TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pumpTargetSpeed; + F32 cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) - cp1TargetSpeed ) / cp1TargetSpeed; + BOOL isCP1SpeedOut = ( cp1Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + + F32 cp2TargetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; + F32 cp2Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) - cp2TargetSpeed ) / cp2TargetSpeed; + BOOL isCP2SpeedOut = ( cp2Error > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_CP1_SPEED_CONTROL_ERROR, isCP1SpeedOut, cp1Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + checkPersistentAlarm( ALARM_ID_CP2_SPEED_CONTROL_ERROR, isCP2SpeedOut, cp2Error, CONCENTRATE_PUMP_ERROR_TOLERANCE ); } concentratePumpMonitorTimerCounter = 0; @@ -248,10 +259,13 @@ concentratePumps[ pumpId ].execState = handleConcentratePumpControlTargetSpeedState( pumpId ); break; +#ifndef _VECTORCAST_ + // The switch case is in a for loop so the default case cannot be covered in VectorCAST default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, pumpId ) concentratePumps[ pumpId ].execState = CONCENTRATE_PUMP_OFF_STATE; break; +#endif } } } @@ -278,14 +292,7 @@ calStatus |= getNVRecord2Driver( GET_CAL_CONCENTRATE_PUMPS_RECORD, (U08*)&concentratePumpsCalRecord, sizeof( DG_CONC_PUMPS_CAL_RECORD_T ), NUM_OF_CAL_DATA_DG_CONC_PUMPS, ALARM_ID_NO_ALARM ); - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } + result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); return result; } @@ -329,10 +336,8 @@ { if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { -#ifndef DISABLE_CONC_PUMPS concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested = FALSE; - concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; -#endif + concentratePumps[ pumpId ].pumpTargetSpeed = 0.0; } else { @@ -356,12 +361,14 @@ { if ( targetSpeed_ml_min >= 0.0 ) { - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_FORWARD_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; // For DVT } else { - concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_REVERSE_DIR; - targetSpeed_ml_min *= -1.0; + concentratePumps[ pumpId ].direction = CONCENTRATE_PUMP_REVERSE_DIR; // For V3 + concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_REVERSE; // For DV + targetSpeed_ml_min *= -1.0; } if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) ) @@ -478,8 +485,16 @@ concentratePumps[ pumpId ].currentPumpSpeed = 0.0; concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; - concentratePumps[ pumpId ].control( CONCENTRATE_PUMP_OFF_CONTROL ); - concentratePumps[ pumpId ].setStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) + { + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAV3AcidPumpControl( CONCENTRATE_PUMP_OFF_CONTROL ) : + setFPGAV3BicarbPumpControl( CONCENTRATE_PUMP_OFF_CONTROL ); + } +#endif + + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ) : + setFPGABicarbSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } /*********************************************************************//** @@ -497,9 +512,20 @@ if ( TRUE == concentratePumps[ pumpId ].hasTurnOnPumpsBeenRequested ) { - U08 controlValue = ( CONCENTRATE_PUMP_ON_CONTROL | concentratePumps[ pumpId ].direction ); + U08 controlSet = 0; +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) + { + controlSet = ( CONCENTRATE_PUMP_ON_CONTROL | concentratePumps[ pumpId ].direction ); + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAV3AcidPumpControl( controlSet ) : setFPGAV3BicarbPumpControl( controlSet ); + } + else +#endif + { + controlSet = concentratePumps[ pumpId ].controlSet; + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpControl( controlSet ) : setFPGABicarbPumpControl( controlSet ); + } - concentratePumps[ pumpId ].control( controlValue ); state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } @@ -545,7 +571,6 @@ if ( ++concentratePumps[ pumpId ].controlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) { concentratePumps[ pumpId ].controlTimerCounter = 0; - stepConcentratePumpToTargetSpeed( pumpId ); } @@ -570,7 +595,6 @@ static BOOL stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ) { F32 speedIncrease; - BOOL hasTgtBeenReached = FALSE; F32 currentToTargetDiff = fabs( concentratePumps[ pumpId ].pumpTargetSpeed - concentratePumps[ pumpId ].currentPumpSpeed ); @@ -606,7 +630,8 @@ concentratePumps[ pumpId ].togglePeriodCount = CONCENTRATE_PUMP_ZERO_FLOW_RATE; } - concentratePumps[ pumpId ].setStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + CONCENTRATEPUMPS_CP1_ACID == pumpId ? setFPGAAcidPumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ) : + setFPGABicarbSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); return hasTgtBeenReached; } @@ -623,36 +648,27 @@ *************************************************************************/ static void calcMeasuredPumpsSpeed( CONCENTRATE_PUMPS_T pumpId, U16 pulseWidthCount ) { - if ( ( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState != CONCENTRATE_PUMP_OFF_STATE ) && - ( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState != CONCENTRATE_PUMP_OFF_STATE ) ) + //if ( ( concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].execState != CONCENTRATE_PUMP_OFF_STATE ) && + // ( concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].execState != CONCENTRATE_PUMP_OFF_STATE ) ) // DEBUG_DENALI + if ( TRUE ) { - F32 pulseWidthInMicroSecond = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; - BOOL isPulseWidthOut = ( pulseWidthInMicroSecond <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + F32 pulseWidthInMicroSeconds = (F32)pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; + BOOL isPulseWidthOut = ( pulseWidthInMicroSeconds <= (F32)CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; - // TODO once the pulse is figured out remove this code - if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) - { - cp1PulsetemporaryRemove = pulseWidthInMicroSecond; - } - else - { - cp2PulsetemporaryRemove = pulseWidthInMicroSecond; - } - // TODO once the pulse is figured out remove this code - - checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSecond, + checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSeconds, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); if ( FALSE == isPulseWidthOut ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSecond ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; } } - else + /*else { // Clear the alarm condition checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, FALSE, 0, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); - } + }*/ if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) {