Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u --- firmware/App/Controllers/ConcentratePumps.c (revision 0) +++ firmware/App/Controllers/ConcentratePumps.c (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -0,0 +1,408 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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) Quang Nguyen +* @date (last) 30-Sep-2020 +* +* @author (original) Quang Nguyen +* @date (original) 30-Sep-2020 +* +***************************************************************************/ +#include + +#include "ConcentratePumps.h" +#include "FPGA.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" + +/** + * @addtogroup ConcentratePumps + * @{ + */ + +// ********** private definitions ********** + +#define CONCENTRATE_PUMP_ON_CONTROL 0x1A ///< Configuration to turn on concentrate pump with 8 microsteps. +#define CONCENTRATE_PUMP_OFF_CONTROL 0x3A ///< Configuration to turn off concentrate pump. + +#define CONCENTRATE_PUMP_SPEED_INCREAMENT 8.0 ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. +#define CONCENTRATE_PUMP_MIN_SPEED 3.0 ///< Minimum speed for concentrate pump in mL per min. +#define CONCENTRATE_PUMP_MAX_SPEED 49.0 ///< Maximum speed for concentrate pump in mL per min. + +#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.15 ///< Volume output every revolution (mL). +#define CONCENTRATE_PUMP_PULSE_PER_REV 4 ///< Number of pulses generate for every revolution. +#define CONCENTRATE_PUMP_STEP_PER_REV 200 ///< Number of steps for every revolution. +#define CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION 100 ///< Hall sense period resolution in microseconds. + +#define CONCENTRATE_PUMP_MICRO_STEPS 8 ///< Number of micro-steps. +#define CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION ( 2 * 0.25 / ( US_PER_SECOND * SEC_PER_MIN ) ) ///< Step period resolution in minute. + +/// Volume output per pulse. +#define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) + +#define CONCENTRATE_PUMP_MONITOR_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. +#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. + +/// Enumeration of concentrate pump states. +typedef enum ConcentratePumpState +{ + CONCENTRATE_PUMP_OFF_STATE = 0, ///< Concentrate pump off state + CONCENTRATE_PUMP_ON_STATE, ///< Concentrate pump on state + NUM_OF_CONCENTRATE_PUMP_STATES ///< Number of concentrate pump states +} CONCENTRATE_PUMP_STATE_T; + +// ********** private data ********** +static CONCENTRATE_PUMP_STATE_T concentratePumpState; ///< Concentrate pump module current state. +static BOOL isPumpOnRequested; ///< Flag indicates a request to turn concentrate pumps on. +static BOOL isPumpOffRequested; ///< Flag indicates a request to turn concentrate pumps off. +static U32 concentratePumpControlTimerCounter; ///< Timer counter to perform control on concentrate pump. +static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. + +static OVERRIDE_F32_T pumpTargetSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Target concentrate pumps' speed (mL/min). +static F32 currentPumpSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Current controlled concentrate pumps' speed (mL/min). +static U16 convertedStepSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Converted pump speed (mL/min) to step speed. + +// ********** private function prototypes ********** + +static void stopConcentratePump( void ); +static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOffState( void ); + +static void stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); +static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOnState( void ); +static F32 getConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId ); + +/*********************************************************************//** + * @brief + * The initConcentratePump function initializes the ConcentratePumps module. + * @details Inputs: none + * @details Outputs: ConcentratePumps module initialized + * @return none + *************************************************************************/ +void initConcentratePump( void ) +{ + concentratePumpState = CONCENTRATE_PUMP_OFF_STATE; + isPumpOnRequested = FALSE; + isPumpOffRequested = FALSE; + concentratePumpControlTimerCounter = 0; + concentratePumpMonitorTimerCounter = 0; + + stopConcentratePump(); +} + +/*********************************************************************//** + * @brief + * The execConcentratePumpMonitor function executes the concentrate pump monitor. + * @details Inputs: none + * @details Outputs: publish concentrate pump data + * @return none + *************************************************************************/ +void execConcentratePumpMonitor( void ) +{ + if ( ++concentratePumpMonitorTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) + { + concentratePumpMonitorTimerCounter = 0U; + + F32 const cp1PulseWidthInSecond = (F32)( getFPGACP1HallSensePulseWidth() * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION ) / US_PER_SECOND; + F32 const cp2PulseWidthInSecond = (F32)( getFPGACP2HallSensePulseWidth() * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION ) / US_PER_SECOND; + + F32 const cp1SpeedMlPerMin = ( 1 / cp1PulseWidthInSecond ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + F32 const cp2SpeedMlPerMin = ( 1 / cp2PulseWidthInSecond ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + + broadcastConcentratePumpData( getConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1 ), cp1SpeedMlPerMin, getConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2 ), cp2SpeedMlPerMin ); + } +} + +/*********************************************************************//** + * @brief + * The execConcentratePumpController function executes the concentrate pump controller. + * @details Inputs: concentratePumpState + * @details Outputs: concentratePumpState + * @return none + *************************************************************************/ +void execConcentratePumpController( void ) +{ + switch ( concentratePumpState ) + { + case CONCENTRATE_PUMP_OFF_STATE: + concentratePumpState = handleConcentratePumpOffState(); + break; + case CONCENTRATE_PUMP_ON_STATE: + concentratePumpState = handleConcentratePumpOnState(); + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, concentratePumpState ) + concentratePumpState = CONCENTRATE_PUMP_OFF_STATE; + break; + } +} + +/*********************************************************************//** + * @brief + * The requestConcentratePumpOn function requests the module to turn on + * the concentrate pumps. + * @details Inputs: none + * @details Outputs: set flag isPumpOnRequested to TRUE + * @return none + *************************************************************************/ +void requestConcentratePumpOn( void ) +{ + isPumpOnRequested = TRUE; +} + +/*********************************************************************//** + * @brief + * The requestConcentratePumpOff function requests the module to turn off + * the concentrate pumps. + * @details Inputs: none + * @details Outputs: set flag isPumpOffRequested to TRUE + * @return none + *************************************************************************/ +void requestConcentratePumpOff( void ) +{ + isPumpOffRequested = TRUE; + pumpTargetSpeed[ CONCENTRATEPUMPS_CP1 ].data = 0.0; + pumpTargetSpeed[ CONCENTRATEPUMPS_CP2 ].data = 0.0; +} + +/*********************************************************************//** + * @brief + * The setConcentratePumpTargetSpeed function sets the target step speed based on + * given speed in mL/min to specified concentrate pump. + * @details Inputs: none + * @details Outputs: set target step speed for given pump + * @param pumpId pump id to set step speed + * @param targetSpeed_ml_min target speed in mL/min + * @return none + *************************************************************************/ +void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min ) +{ + if ( ( CONCENTRATE_PUMP_MIN_SPEED <= targetSpeed_ml_min ) && ( targetSpeed_ml_min <= CONCENTRATE_PUMP_MAX_SPEED ) && + ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) ) + { + pumpTargetSpeed[ pumpId ].data = targetSpeed_ml_min; + } + else + { + if ( pumpId >= NUM_OF_CONCENTRATE_PUMPS ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ) + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE, targetSpeed_ml_min ) + } + } +} + +/*********************************************************************//** + * @brief + * The stopConcentratePump function sets the concentrate pump step speed to zero + * and turns off concentrate pumps. + * @details Inputs: none + * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn concentrate pumps off + * @return none + *************************************************************************/ +static void stopConcentratePump( void ) +{ + U32 ii; + + for ( ii = 0; ii < NUM_OF_CONCENTRATE_PUMPS; ii++ ) + { + pumpTargetSpeed[ ii ].data = 0.0; + pumpTargetSpeed[ ii ].ovData = 0.0; + pumpTargetSpeed[ ii ].ovInitData = 0.0; + pumpTargetSpeed[ ii ].override = OVERRIDE_RESET; + + currentPumpSpeed[ ii ] = 0.0; + } + + setFPGACP1Control( CONCENTRATE_PUMP_OFF_CONTROL ); + setFPGACP2Control( CONCENTRATE_PUMP_OFF_CONTROL ); + setFPGACP1SetStepSpeed( currentPumpSpeed[ CONCENTRATEPUMPS_CP1 ] ); + setFPGACP2SetStepSpeed( currentPumpSpeed[ CONCENTRATEPUMPS_CP2 ] ); +} + +/*********************************************************************//** + * @brief + * The handleConcentratePumpOffState function turns on concentrate pumps and + * switch to on state upon request. + * @details Inputs: none + * @details Outputs: concentrate pumps turn on + * @return state + *************************************************************************/ +static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOffState( void ) +{ + CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_OFF_STATE; + + if ( isPumpOnRequested ) + { + setFPGACP1Control( CONCENTRATE_PUMP_ON_CONTROL ); + setFPGACP2Control( CONCENTRATE_PUMP_ON_CONTROL ); + + state = CONCENTRATE_PUMP_ON_STATE; + isPumpOnRequested = FALSE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The stepConcentratePumpToTargetSpeed function steps current step speed + * toward target speed with predefined step increase. + * @details Inputs: none + * @details Outputs: currentPumpSpeed[] + * @param pumpId concentrate pump id to increase current step speed + * @return none + *************************************************************************/ +static void stepConcentratePumpToTargetSpeed( CONCENTRATE_PUMPS_T pumpId ) +{ + F32 const currentToTargetDiff = fabs( getConcentratePumpTargetSpeed( pumpId ) - currentPumpSpeed[ pumpId ] ); + F32 speedIncrease; + + if ( currentToTargetDiff > NEARLY_ZERO ) + { + if ( currentToTargetDiff > CONCENTRATE_PUMP_SPEED_INCREAMENT ) + { + speedIncrease = CONCENTRATE_PUMP_SPEED_INCREAMENT; + } + else + { + speedIncrease = currentToTargetDiff; + } + + // Subtract current speed when target speed is smaller + if ( getConcentratePumpTargetSpeed( pumpId ) < currentPumpSpeed[ pumpId ] ) + { + speedIncrease *= -1; + } + + currentPumpSpeed[ pumpId ] += speedIncrease; + } + + F32 const timePerStep = CONCENTRATE_PUMP_VOLUME_PER_REV / ( currentPumpSpeed[ pumpId ] * CONCENTRATE_PUMP_STEP_PER_REV ) ; + F32 const stepPeriod = timePerStep / ( CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION * CONCENTRATE_PUMP_MICRO_STEPS ); + convertedStepSpeed[ pumpId ] = (U16)( stepPeriod ); +} + +/*********************************************************************//** + * @brief + * The handleConcentratePumpOnState function turns off concentrate pumps switch + * to off state upon request. While in on state, the function controls concentrate + * pumps to a target step speed. + * @details Inputs: currentPumpSpeed[] + * @details Outputs: control concentrate pumps to target step speed + * @return state + *************************************************************************/ +static CONCENTRATE_PUMP_STATE_T handleConcentratePumpOnState( void ) +{ + CONCENTRATE_PUMP_STATE_T state = CONCENTRATE_PUMP_ON_STATE; + + if ( ++concentratePumpControlTimerCounter >= CONCENTRATE_PUMP_CONTROL_INTERVAL ) + { + concentratePumpControlTimerCounter = 0; + + stepConcentratePumpToTargetSpeed( CONCENTRATEPUMPS_CP1 ); + stepConcentratePumpToTargetSpeed( CONCENTRATEPUMPS_CP2 ); + + setFPGACP1SetStepSpeed( convertedStepSpeed[ CONCENTRATEPUMPS_CP1 ] ); + setFPGACP2SetStepSpeed( convertedStepSpeed[ CONCENTRATEPUMPS_CP2 ] ); + } + + if ( isPumpOffRequested ) + { + state = CONCENTRATE_PUMP_OFF_STATE; + isPumpOffRequested = FALSE; + + stopConcentratePump(); + } + + return state; +} + +static F32 getConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId ) +{ + F32 result = 0.0; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) + { + if ( OVERRIDE_KEY == pumpTargetSpeed[ pumpId ].override ) + { + result = pumpTargetSpeed[ pumpId ].ovData; + } + else + { + result = pumpTargetSpeed[ pumpId ].data; + } + } + else + { + activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); + } + + return result; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetConcentratePumpTargetSpeedOverride function overrides the target + * speed value of given concentrate pump id. + * @details Inputs: none + * @details Outputs: targetPumpSpeed[] + * @param pumpId concentrate pump id + * @param value override concentrate pump target speed + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetConcentratePumpTargetSpeedOverride( U32 pumpId, F32 value ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && isTestingActivated() ) + { + if ( ( CONCENTRATE_PUMP_MIN_SPEED <= value ) && ( value <= CONCENTRATE_PUMP_MAX_SPEED ) ) + { + result = TRUE; + pumpTargetSpeed[ pumpId ].ovData = value; + pumpTargetSpeed[ pumpId ].override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetConcentratePumpTargetSpeedOverride function resets the override of the + * speed value of given concentrate pump id. + * @details Inputs: none + * @details Outputs: targetPumpSpeed[] + * @param pumpId concentrate pump id + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetConcentratePumpTargetSpeedOverride( U32 pumpId ) +{ + BOOL result = FALSE; + + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS && isTestingActivated() ) + { + result = TRUE; + pumpTargetSpeed[ pumpId ].ovData = pumpTargetSpeed[ pumpId ].ovInitData; + pumpTargetSpeed[ pumpId ].override = OVERRIDE_RESET; + } + + return result; +} + +/**@}*/ Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u --- firmware/App/Controllers/ConcentratePumps.h (revision 0) +++ firmware/App/Controllers/ConcentratePumps.h (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -0,0 +1,66 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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.h +* +* @author (last) Quang Nguyen +* @date (last) 30-Sep-2020 +* +* @author (original) Quang Nguyen +* @date (original) 30-Sep-2020 +* +***************************************************************************/ + +#ifndef __CONCENTRATEPUMPS_H__ +#define __CONCENTRATEPUMPS_H__ + +#include "DGCommon.h" + +/** + * @defgroup ConcentratePumps ConcentratePumps + * @brief Concentrate pumps monitor and control module. Monitors and control concentrate pump with an open loop approach. + * + * @addtogroup ConcentratePumps + * @{ + */ + +// ********** public definitions ********** + +/// Enumeration of concentrate pumps. +typedef enum ConcentratePumps +{ + CONCENTRATEPUMPS_CP1 = 0, ///< Acid concentrate pump + CONCENTRATEPUMPS_CP2, ///< Bicarbonate concentrate pump + NUM_OF_CONCENTRATE_PUMPS ///< Number of concentrate pumps +} CONCENTRATE_PUMPS_T; + +/// Concentrate pump data struct. +typedef struct +{ + F32 cp1TargetSpeed; ///< Concentrate pump CP1 target speed + F32 cp1MeasuredSpeed; ///< Concentrate pump CP1 measured speed + F32 cp2TargetSpeed; ///< Concentrate pump CP2 target speed + F32 cp2MeasuredSpeed; ///< Concentrate pump CP2 measured speed +} CONCENTRATE_PUMP_DATA_T; + +// ********** public function prototypes ********** + +void initConcentratePump( void ); +void execConcentratePumpMonitor( void ); +void execConcentratePumpController( void ); + +void requestConcentratePumpOn( void ); +void requestConcentratePumpOff( void ); + +void setConcentratePumpTargetSpeed( CONCENTRATE_PUMPS_T pumpId, F32 targetSpeed_ml_min ); + +BOOL testSetConcentratePumpTargetSpeedOverride( U32 pumpId, F32 value ); +BOOL testResetConcentratePumpTargetSpeedOverride( U32 pumpId ); + +/**@}*/ + +#endif Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "ConcentratePumps.h" #include "ConductivitySensors.h" #include "FPGA.h" #include "LoadCell.h" @@ -70,6 +71,7 @@ setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); // Conc. pumps on + requestConcentratePumpOn(); } /*********************************************************************//** @@ -162,6 +164,7 @@ // if we've reached our target fill to volume (by weight), we're done filling - go back to re-circ mode if ( getReservoirFillVolumeTargetMl() <= getLoadCellFilteredWeight( fillWeightLoadCell ) ) { + requestConcentratePumpOff(); requestNewOperationMode( DG_MODE_CIRC ); } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r54f45c387430e440ab4607451fc84dea61f273f1 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 54f45c387430e440ab4607451fc84dea61f273f1) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -144,6 +144,9 @@ SW_FAULT_ID_UTIL_INVALID_WIN_COUNT, SW_FAULT_ID_UTIL_INVALID_WIN_MAX_COUNT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, + SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, // 55 + SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, + SW_FAULT_ID_CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -156,16 +156,31 @@ U08 fpgaReserved1; ///< Reg 375. Reserved U16 fpgaValveStates; ///< Reg 376. Valves states + U16 fpgaFan1Pulse; ///< Reg 378. Fan 1 pulse time in 2.5 us solution + U16 fpgaFan2Pulse; ///< Reg 380. Fan 2 pulse time in 2.5 us solution + + U08 fpgaEmstatOutByte; ///< Reg 382. Emstat output FIFO - data from the Emstat device + U08 fpgaEmstatRxErrorCount; ///< Reg 383. Number of receive errors since power-up + U16 fpgaEmstatTxFifoCount; ///< Reg 384. Number of bytes in the Emstat Tx FIFO buffer + U16 fpgaEmstatRxFifoCount; ///< Reg 386. Number of bytes in the Emstat Rx FIFO buffer + U16 fpgaCP1HallSense; ///< Reg 388. Concentrate pump CP1 hall sensor pulse width. + U16 fpgaCP2HallSense; ///< Reg 390. Concentrate pump CP2 hall sensor pulse width. } DG_FPGA_SENSORS_T; typedef struct { - U08 fpgaCPoControlReg; ///< Reg 12. CPo control register - U08 fpgaCPiControlReg; ///< Reg 13. CPi control register - U16 fpgaCPoProbeType; ///< Reg 14. CPo probe type - U16 fpgaCPiProbeType; ///< Reg 16. CPi probe type - U16 fpgaDrainPumpSetSpeed; ///< Reg 18. Drain pump control register - U16 fpgaValveStates; ///< Reg 20. Valve control register + U08 fpgaCPoControlReg; ///< Reg 12. CPo control register + U08 fpgaCPiControlReg; ///< Reg 13. CPi control register + U16 fpgaCPoProbeType; ///< Reg 14. CPo probe type + U16 fpgaCPiProbeType; ///< Reg 16. CPi probe type + U16 fpgaDrainPumpSetSpeed; ///< Reg 18. Drain pump control register + U16 fpgaValveStates; ///< Reg 20. Valve control register + U08 fpgaAcclCmd; ///< Reg 22. Accelerometer interface command register + U08 fpgaCP1Control; ///< Reg 23. Concentrate pump CP1 control register + U16 fpgaCP1StepSpeed; ///< Reg 24. Concentrate pump CP1 step speed register + U16 fpgaCP2StepSpeed; ///< Reg 26. Concentrate pump CP2 step speed register + U08 fpgaCP2Control; ///< Reg 28. Concentrate pump CP2 control register + U08 fpgaEmstatControl; ///< Reg 29. Emstat conductivity sensor control register } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -935,6 +950,60 @@ /*********************************************************************//** * @brief + * The setFPGACP1Control function sets the control configuration for + * concentrate pump CP1. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP1Control + * @param pumpControl The concentrate pump control configuration + * @return none + *************************************************************************/ +void setFPGACP1Control( U08 pumpControl ) +{ + fpgaActuatorSetPoints.fpgaCP1Control = pumpControl; +} + +/*********************************************************************//** + * @brief + * The setFPGACP2Control function sets the control configuration for + * concentrate pump CP2. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP2Control + * @param pumpControl The concentrate pump control configuration + * @return none + *************************************************************************/ +void setFPGACP2Control( U08 pumpControl ) +{ + fpgaActuatorSetPoints.fpgaCP2Control = pumpControl; +} + +/*********************************************************************//** + * @brief + * The setFPGACP1SetStepSpeed function sets the step speed period for concentrate pump CP1. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP1StepSpeed + * @param stepSpeed The concentrate pump step speed period + * @return none + *************************************************************************/ +void setFPGACP1SetStepSpeed( U16 stepSpeed ) +{ + fpgaActuatorSetPoints.fpgaCP1StepSpeed = stepSpeed; +} + +/*********************************************************************//** + * @brief + * The setFPGACP2SetStepSpeed function sets the step speed period for concentrate pump CP2. + * @details Inputs: none + * @details Outputs: fpgaActuatorSetPoints.fpgaCP2StepSpeed + * @param stepSpeed The concentrate pump step speed period + * @return none + *************************************************************************/ +void setFPGACP2SetStepSpeed( U16 stepSpeed ) +{ + fpgaActuatorSetPoints.fpgaCP2StepSpeed = stepSpeed; +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details Inputs: fpgaHeader * @details Outputs: none @@ -1434,4 +1503,67 @@ return fpgaSensorReadings.fpgaCPo; } +/*********************************************************************//** + * @brief + * The getFPGAEmstatOutByte function gets Emstat conductivity sensor output byte. + * @details Inputs: fpgaSensorReadings.fpgaEmstatOutByte + * @details Outputs: none + * @return Emstat conductivity sensor output byte + *************************************************************************/ +U08 getFPGAEmstatOutByte( void ) +{ + return fpgaSensorReadings.fpgaEmstatOutByte; +} + +/*********************************************************************//** + * @brief + * The getFPGAEmstatRxErrCount function gets Emstat conductivity sensor error count. + * @details Inputs: fpgaSensorReadings.fpgaEmstatRxErrorCount + * @details Outputs: none + * @return Emstat conductivity sensor receive error count + *************************************************************************/ +U08 getFPGAEmstatRxErrCount( void ) +{ + return fpgaSensorReadings.fpgaEmstatRxErrorCount; +} + +/*********************************************************************//** + * @brief + * The getFPGAEmstatRxFifoCount function gets Emstat conductivity sensor receive + * fifo buffer count. + * @details Inputs: fpgaSensorReadings.fpgaEmstatTxFifoCount + * @details Outputs: none + * @return Emstat conductivity sensor receive fifo buffer count + *************************************************************************/ +U16 getFPGAEmstatRxFifoCount( void ) +{ + return fpgaSensorReadings.fpgaEmstatRxFifoCount; +} + +/*********************************************************************//** + * @brief + * The getFPGACP1HallSensePulseWidth function gets concentrate pump CP1 + * hall sense pulse width. + * @details Inputs: fpgaSensorReadings.fpgaCP1HallSense + * @details Outputs: none + * @return concentrate pump CP1 hall sense pulse width + *************************************************************************/ +U16 getFPGACP1HallSensePulseWidth( void ) +{ + return fpgaSensorReadings.fpgaCP1HallSense; +} + +/*********************************************************************//** + * @brief + * The getFPGACP1HallSensePulseWidth function gets concentrate pump CP2 + * hall sense pulse width. + * @details Inputs: fpgaSensorReadings.fpgaCP2HallSense + * @details Outputs: none + * @return concentrate pump CP2 hall sense pulse width + *************************************************************************/ +U16 getFPGACP2HallSensePulseWidth( void ) +{ + return fpgaSensorReadings.fpgaCP2HallSense; +} + /**@}*/ Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r7cc6fbb41e6b460fedff71581f6205ef36d5deb6 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 7cc6fbb41e6b460fedff71581f6205ef36d5deb6) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -44,6 +44,10 @@ void setFPGAValveStates( U16 valveStates ); void setFPGADrainPumpSpeed( U08 drainPumpDAC ); void setFPGACPoProbeType( U16 probeType ); +void setFPGACP1Control( U08 pumpControl ); +void setFPGACP2Control( U08 pumpControl ); +void setFPGACP1SetStepSpeed( U16 stepSpeed ); +void setFPGACP2SetStepSpeed( U16 stepSpeed ); void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); U16 getFPGAValveStates( void ); @@ -98,8 +102,10 @@ U08 getFPGAEmstatOutByte( void ); U08 getFPGAEmstatRxErrCount( void ); -U16 getFPGAEmstatTxFifoCount( void ); U16 getFPGAEmstatRxFifoCount( void ); + +U16 getFPGACP1HallSensePulseWidth( void ); +U16 getFPGACP2HallSensePulseWidth( void ); void getFPGAAccelAxes( S16 *x, S16 *y, S16 *z ); void getFPGAAccelMaxes( S16 *xm, S16*ym, S16*zm ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r6dfc8ab61908df85dd18a8db78c3b37eda892554 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6dfc8ab61908df85dd18a8db78c3b37eda892554) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -1144,6 +1144,10 @@ handleSetAccelCalibration( message ); break; + case MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE: + handleSetConcentratePumpTargetSpeed( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r7cc6fbb41e6b460fedff71581f6205ef36d5deb6 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 7cc6fbb41e6b460fedff71581f6205ef36d5deb6) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -511,7 +511,7 @@ /*********************************************************************//** * @brief - * The broadcastDrainPumpData function sends out RO pump data. + * The broadcastDrainPumpData function sends out drain pump data. * @details Inputs: none * @details Outputs: Drain pump data msg constructed and queued * @param tgtSpeed target speed for drain pump in RPM @@ -539,8 +539,44 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); return result; -} +} +/*********************************************************************//** + * @brief + * The broadcastConcentratePumpData function sends out concentrate pumps' data. + * @details Inputs: none + * @details Outputs: concentrate pump data msg constructed and queued + * @param cp1TgtSpeed target speed for concentrate pump CP1 + * @param measuredCP1Speed measured speed for concentrate pump CP1 using hall sense + * @param cp2TgtSpeed target speed for concentrate pump CP2 + * @param measuredCP2Speed measured speed for concentrate pump CP2 using hall sense + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastConcentratePumpData( F32 cp1TgtSpeed, F32 cp1MeasuredSpeed, F32 cp2TgtSpeed, F32 cp2MeasuredSpeed ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + CONCENTRATE_PUMP_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_CONCENTRATE_PUMP_DATA; + msg.hdr.payloadLen = sizeof( CONCENTRATE_PUMP_DATA_T ); + + payload.cp1TargetSpeed = cp1TgtSpeed; + payload.cp1MeasuredSpeed = cp1MeasuredSpeed; + payload.cp2TargetSpeed = cp2TgtSpeed; + payload.cp2MeasuredSpeed = cp2MeasuredSpeed; + + memcpy( payloadPtr, &payload, sizeof( CONCENTRATE_PUMP_DATA_T ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + /*********************************************************************//** * @brief * The broadcastPressureSensorsData function sends out DG pressure data. @@ -711,12 +747,12 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(TARGET_TEMPS_PAYLOAD_T) ) + if ( message->hdr.payloadLen == sizeof( TARGET_TEMPS_PAYLOAD_T ) ) { TARGET_TEMPS_PAYLOAD_T payload; result = TRUE; - memcpy( &payload, message->payload, sizeof(TARGET_TEMPS_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TARGET_TEMPS_PAYLOAD_T ) ); setPrimaryHeaterTargetTemperature( payload.targetPrimaryHeaterTemp ); setTrimmerHeaterTargetTemperature( payload.targetTrimmerHeaterTemp ); } @@ -769,13 +805,13 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { RESERVOIR_ID_T reservoirID; U32 resID; result = TRUE; - memcpy( &resID, message->payload, sizeof(U32) ); + memcpy( &resID, message->payload, sizeof( U32 ) ); reservoirID = (RESERVOIR_ID_T)resID; setActiveReservoirCmd( reservoirID ); } @@ -795,12 +831,12 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { U32 fillToVolumeMl; result = TRUE; - memcpy( &fillToVolumeMl, message->payload, sizeof(U32) ); + memcpy( &fillToVolumeMl, message->payload, sizeof( U32 ) ); startFillCmd( fillToVolumeMl ); } @@ -821,12 +857,12 @@ if ( message->hdr.payloadLen == sizeof( DRAIN_CMD_T ) ) { - DRAIN_CMD_T drainToVolMl; + DRAIN_CMD_T drainCmd; result = TRUE; - memcpy( &drainToVolMl, message->payload, sizeof( DRAIN_CMD_T ) ); + memcpy( &drainCmd, message->payload, sizeof( DRAIN_CMD_T ) ); - startDrainCmd( drainToVolMl ); + startDrainCmd( drainCmd ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); @@ -845,11 +881,11 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { BOOL startingTreatment; - memcpy( &startingTreatment, message->payload, sizeof(U32) ); + memcpy( &startingTreatment, message->payload, sizeof( U32 ) ); if ( DG_MODE_STAN == getCurrentOperationMode() && TRUE == startingTreatment ) { @@ -877,11 +913,11 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { BOOL startingHeater; - memcpy( &startingHeater, message->payload, sizeof(U32) ); + memcpy( &startingHeater, message->payload, sizeof( U32 ) ); if ( TRUE == startingHeater ) { @@ -937,7 +973,7 @@ U08 days = message->payload[3]; U08 months = message->payload[4]; U32 years; - memcpy(&years, &message->payload[5], sizeof(U32)); + memcpy(&years, &message->payload[5], sizeof( U32 )); result = setRTCTimestamp( seconds, minutes, hours, days, months, years ); @@ -958,11 +994,11 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(U32) ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { BOOL startingHeater; - memcpy( &startingHeater, message->payload, sizeof(U32) ); + memcpy( &startingHeater, message->payload, sizeof( U32 ) ); if ( TRUE == startingHeater ) { @@ -1115,9 +1151,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetWatchdogTaskCheckInOverride( payload.index, (BOOL)(payload.state.u32) ); @@ -1147,9 +1183,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetAlarmStateOverride( payload.index, payload.state.u32 ); @@ -1179,9 +1215,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetLoadCellOverride( payload.index, payload.state.f32 ); @@ -1211,9 +1247,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetMeasuredTemperatureOverride( payload.index, payload.state.f32 ); @@ -1244,9 +1280,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetTemperatureSensorsPublishIntervalOverride( payload.state.u32 ); @@ -1276,9 +1312,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetHeatersPublishIntervalOverride( payload.state.u32 ); @@ -1308,9 +1344,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetLoadCellDataPublishIntervalOverride( payload.state.u32 ); @@ -1340,9 +1376,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetDGPressureSensorOverride( payload.index, payload.state.f32 ); @@ -1372,9 +1408,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetPressuresDataPublishIntervalOverride( payload.state.u32 ); @@ -1404,9 +1440,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetTargetROPumpPressureOverride( payload.state.u32 ); @@ -1436,9 +1472,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetMeasuredROFlowRateOverride( payload.state.f32 ); @@ -1468,9 +1504,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetROPumpDataPublishIntervalOverride( payload.state.u32 ); @@ -1500,9 +1536,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetTargetDrainPumpSpeedOverride( payload.state.u32 ); @@ -1532,9 +1568,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetDrainPumpDataPublishIntervalOverride( payload.state.u32 ); @@ -1564,9 +1600,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetValveStateOverride( payload.index, payload.state.u32 ); @@ -1596,9 +1632,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetValvesStatesPublishIntervalOverride( payload.state.u32 ); @@ -1628,9 +1664,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetSafetyShutdownOverride( payload.state.u32 ); @@ -1660,9 +1696,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetAccelAxisOverride( payload.index, payload.state.f32 ); @@ -1692,9 +1728,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetAccelMaxOverride( payload.index, payload.state.f32 ); @@ -1724,9 +1760,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetAccelDataPublishIntervalOverride( payload.state.u32 ); @@ -1754,11 +1790,11 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(ACCEL_CAL_PAYLOAD_T) ) + if ( message->hdr.payloadLen == sizeof( ACCEL_CAL_PAYLOAD_T ) ) { ACCEL_CAL_PAYLOAD_T payload; - memcpy( &payload, message->payload, sizeof(ACCEL_CAL_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( ACCEL_CAL_PAYLOAD_T ) ); result = setAccelCalibration( payload.xOffset, payload.yOffset, payload.zOffset ); } @@ -1781,9 +1817,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetConductivityOverride( payload.index, payload.state.f32 ); @@ -1814,9 +1850,9 @@ BOOL result = FALSE; // verify payload length - if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { - memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); if ( FALSE == payload.reset ) { result = testSetConductivityDataPublishIntervalOverride( payload.state.u32 ); @@ -1831,4 +1867,36 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** + * @brief + * The handleSetConcentratePumpTargetSpeed function handles a request to + * override a concentrate pump's target speed value. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetConcentratePumpTargetSpeed( 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 = testSetConcentratePumpTargetSpeedOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetConcentratePumpTargetSpeedOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r7cc6fbb41e6b460fedff71581f6205ef36d5deb6 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 7cc6fbb41e6b460fedff71581f6205ef36d5deb6) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -62,6 +62,9 @@ // MSG_ID_DRAIN_PUMP_DATA BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac ); + +// MSG_ID_DG_CONCENTRATE_PUMP_DATA +BOOL broadcastConcentratePumpData( F32 cp1TgtSpeed, F32 cp1MeasuredSpeed, F32 cp2TgtSpeed, F32 cp2MeasuredSpeed ); // MSG_ID_DG_PRESSURES_DATA BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); @@ -194,6 +197,9 @@ // MSG_ID_DG_ACCEL_SET_CALIBRATION: void handleSetAccelCalibration( MESSAGE_T *message ); +// MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE +void handleSetConcentratePumpTargetSpeed( MESSAGE_T *message ); + /**@}*/ #endif Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -17,7 +17,8 @@ #include "gio.h" #include "lin.h" - + +#include "ConcentratePumps.h" #include "DrainPump.h" #include "Heaters.h" #include "OperationModes.h" @@ -66,6 +67,10 @@ // manage drain pump execDrainPumpController(); + + // manage concentrate pump + execConcentratePumpMonitor(); + execConcentratePumpController(); // manage time-based reservoir tasks execReservoirs(); Index: firmware/source/sys_main.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -ra726311564521affd46cbbaf129bdffb22e1d58f --- firmware/source/sys_main.c (.../sys_main.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/source/sys_main.c (.../sys_main.c) (revision a726311564521affd46cbbaf129bdffb22e1d58f) @@ -65,6 +65,7 @@ #include "AlarmMgmt.h" #include "CommBuffers.h" #include "ConductivitySensors.h" +#include "ConcentratePumps.h" #include "CPLD.h" #include "DrainPump.h" #include "FPGA.h" @@ -172,6 +173,7 @@ initHeaters(); initTemperatureSensors(); initConductivitySensors(); + initConcentratePump(); initROPump(); initDrainPump(); initAccel();