Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r5cee5f88d4d3f18b4178621f1ef175b0873d6248 -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 5cee5f88d4d3f18b4178621f1ef175b0873d6248) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -77,43 +77,43 @@ /// Enumeration of drain pump states. typedef enum DrainPump_States { - DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state - DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state - DRAIN_PUMP_OPEN_LOOP_STATE, ///< Drain pump open loop state - NUM_OF_DRAIN_PUMP_STATES ///< Number of drain pump states + DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state + DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state + DRAIN_PUMP_OPEN_LOOP_STATE, ///< Drain pump open loop state + NUM_OF_DRAIN_PUMP_STATES ///< Number of drain pump states } DRAIN_PUMP_STATE_T; /// Enumeration of drain pump self-test states. typedef enum DrainPump_Self_Test_States { - DRAIN_PUMP_SELF_TEST_STATE_START = 0, ///< Drain pump self-test start state - DRAIN_PUMP_TEST_STATE_IN_PROGRESS, ///< Drain pump self-test in progress state - DRAIN_PUMP_TEST_STATE_COMPLETE, ///< Drain pump self-test completed state - NUM_OF_DRAIN_PUMP_SELF_TEST_STATES ///< Number of drain pump self-test states + DRAIN_PUMP_SELF_TEST_STATE_START = 0, ///< Drain pump self-test start state + DRAIN_PUMP_TEST_STATE_IN_PROGRESS, ///< Drain pump self-test in progress state + DRAIN_PUMP_TEST_STATE_COMPLETE, ///< Drain pump self-test completed state + NUM_OF_DRAIN_PUMP_SELF_TEST_STATES ///< Number of drain pump self-test states } DRAIN_PUMP_SELF_TEST_STATE_T; // ********** private data ********** -static DRAIN_PUMP_STATE_T drainPumpState = DRAIN_PUMP_OFF_STATE; ///< Current state of drain pump controller state machine. -static U32 drainPumpDataPublicationTimerCounter = 0; ///< Used to schedule drain pump data publication to CAN bus. -static U32 drainPumpDAC = 0; ///< Initial drain pump DAC value. -static U32 drainPumpDACSet = 0; ///< Currently set drain pump DAC value. -static PUMP_CONTROL_MODE_T drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; ///< Requested drain pump control mode. -static PUMP_CONTROL_MODE_T drainPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set drain pump control mode. +static DRAIN_PUMP_STATE_T drainPumpState = DRAIN_PUMP_OFF_STATE; ///< Current state of drain pump controller state machine. +static U32 drainPumpDataPublicationTimerCounter = 0; ///< Used to schedule drain pump data publication to CAN bus. +static U32 drainPumpDAC = 0; ///< Initial drain pump DAC value. +static U32 drainPumpDACSet = 0; ///< Currently set drain pump DAC value. +static PUMP_CONTROL_MODE_T drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; ///< Requested drain pump control mode. +static PUMP_CONTROL_MODE_T drainPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set drain pump control mode. static OVERRIDE_U32_T drainPumpDataPublishInterval = { DRAIN_PUMP_DATA_PUB_INTERVAL, DRAIN_PUMP_DATA_PUB_INTERVAL, - 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. -static U32 targetDrainPumpRPM = 0; ///< Target drain pump RPM. -static F32 targetDrainPumpOutletPressure = 0.0; ///< Target outlet pressure for the drain pump. + 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus. +static U32 targetDrainPumpRPM = 0; ///< Target drain pump RPM. +static F32 targetDrainPumpOutletPressure = 0.0; ///< Target outlet pressure for the drain pump. -static U32 drainControlTimerCounter = 0; ///< Determines when to perform control on drain pump. -static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. -static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. +static U32 drainControlTimerCounter = 0; ///< Determines when to perform control on drain pump. +static BOOL hasClosedLoopBeenRequested = FALSE; ///< Closed loop pump control flag. +static U32 currentDrainPumpRPM = 0; ///< Current drain pump RPM from feedback. /* TODO These variables are used for POST. POST will be implemented later -static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< Current drain pump self test state. -static U32 drainPumpSelfTestTimerCount = 0; ///< Timer counter for drain pump self test. +static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< Current drain pump self test state. +static U32 drainPumpSelfTestTimerCount = 0; ///< Timer counter for drain pump self test. */ /// ADC to RPM conversion coefficient or RPM to ADC conversion. @@ -139,7 +139,7 @@ { stopDrainPump(); - hasClosedLoopBeenRequested = FALSE; + hasClosedLoopBeenRequested = FALSE; // Initialize the drain pump PI controller initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, @@ -266,30 +266,31 @@ // The RPM is only checked in open loop state that the pump is run at a fixed RPM. // The persistent alarm waits for a couple of seconds before raising an alarm, this is supposed to cover // when the pump is turned on and it takes a while to ramp up to target RPM. - if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + /*if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) { U32 targetRPM = getTargetDrainPumpRPM(); F32 threshold = OPEN_LOOP_RPM_OUT_OF_RANGE * targetRPM; // Check if RPM is out of range. Using fabs since the read RPM can be above or below the target. BOOL isRPMOutOfRange = fabs( targetRPM - currentDrainPumpRPM ) > threshold; - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, currentDrainPumpRPM, threshold ); + //checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, currentDrainPumpRPM, threshold ); } // Check if the pump is in off state and the RPM is greater than the minimum RPM if ( drainPumpState == DRAIN_PUMP_OFF_STATE ) { BOOL isRPMTooHigh = currentDrainPumpRPM > MIN_DRAIN_PUMP_RPM; - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, currentDrainPumpRPM, MIN_DRAIN_PUMP_RPM ); + //checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, currentDrainPumpRPM, MIN_DRAIN_PUMP_RPM ); // If the off fault alarm has become active, trigger the safety shutdown if ( isAlarmActive( ALARM_ID_DRAIN_PUMP_OFF_FAULT ) ) { - activateSafetyShutdown(); + //activateSafetyShutdown(); + BOOL test = FALSE; } - } + }*/ // Publish drain pump data on interval publishDrainPumpData(); @@ -429,7 +430,7 @@ // control at set interval if ( ++drainControlTimerCounter >= DRP_CONTROL_INTERVAL ) { - F32 outletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); + F32 outletDrainPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, getTargetDrainPumpOutletP(), outletDrainPressure ); // The PI controller sends the DAC out and it is rounded to the nearest offset and is fed to the FPGA @@ -451,7 +452,16 @@ *************************************************************************/ static DRAIN_PUMP_STATE_T handleDrainPumpOpenLoopState( void ) { - return DRAIN_PUMP_OPEN_LOOP_STATE; + DRAIN_PUMP_STATE_T state = DRAIN_PUMP_OPEN_LOOP_STATE; + + // Check if the RPM is 0, and if it is turn off the pump + if ( getTargetDrainPumpRPM() == 0 ) + { + state = DRAIN_PUMP_OFF_STATE; + signalDrainPumpHardStop(); + } + + return state; } /*********************************************************************//** @@ -584,11 +594,7 @@ if ( TRUE == isTestingActivated() ) { - // Check for the RPM to be in range - if ( value >= MIN_DRAIN_PUMP_RPM && value <= MAX_DRAIN_PUMP_RPM ) - { - result = setDrainPumpTargetRPM( value ); - } + result = setDrainPumpTargetRPM( value ); } return result; Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -30,6 +30,7 @@ #include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Timers.h" +#include "UVReactors.h" #include "Valves.h" /** @@ -91,9 +92,12 @@ signalDrainPumpHardStop(); startPrimaryHeater(); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1 ); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2 ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2_BICARB ); + // UV on + turnOnUVReactor( INLET_UV_REACTOR ); + turnOnUVReactor( OUTLET_UV_REACTOR ); #ifndef _VECTORCAST_ { // TODO - test code to start the fan since we're turning the heater on Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -19,13 +19,15 @@ #include "CPLD.h" #include "DrainPump.h" #include "Heaters.h" +#include "ModeStandby.h" #include "OperationModes.h" #include "Reservoirs.h" #include "ROPump.h" #include "SystemComm.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" -#include "ModeStandby.h" /** * @addtogroup DGStandbyMode @@ -34,18 +36,29 @@ // ********** private definitions ********** -#define WATER_SAMPLE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Duration of water sample state (in ms). +#define FILTER_FLUSH_TIME_MS ( 120 * MS_PER_SECOND ) ///< Duration of filter flush state (in ms). +#define MAX_WATER_SAMPLE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Maximum duration of water sample state (in ms). +#define FLUSH_EXPIRATION_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration in which a filter flush is valid (in ms). +#define FILTER_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Filter flush data broadcast interval. // ********** private data ********** static DG_STANDBY_MODE_STATE_T standbyState = DG_STANDBY_MODE_STATE_START; ///< Currently active standby state. -static BOOL pendingSampleWaterRequest = FALSE; ///< Flag indicating HD has requested a water sample. +static BOOL stopSampleWaterRequest = FALSE; ///< Flag indicating HD has requested to stop sample water +static BOOL startSampleWaterRequest = FALSE; ///< Flag indicating HD has requested to start sample water +static BOOL flushFilterRequest = FALSE; ///< Flag indicating HD has requested to flush filters +static BOOL endSampleWaterRequest = FALSE; ///< Flag indicating HD has requested to end sample water + static BOOL pendingStartDGRequest = FALSE; ///< Flag indicating HD has requested DG start (go to re-circulate mode). static U32 waterSampleStartTime = 0; ///< Time stamp for start of water sample state. +static U32 filterFlushStartTime = 0; ///< Time stamp for start of filter flush state. +static U32 filterFlushPublishTimerCounter = 0; ///< Filter flush data publish timer counter. // ********** private function prototypes ********** static DG_STANDBY_MODE_STATE_T handleStandbyIdleState( void ); +static DG_STANDBY_MODE_STATE_T handleStandbyFlushFilterState( void ); +static DG_STANDBY_MODE_STATE_T handleStandbyFlushFilterIdleState( void ); static DG_STANDBY_MODE_STATE_T handleStandbySampleWaterState( void ); /*********************************************************************//** @@ -58,9 +71,15 @@ void initStandbyMode( void ) { standbyState = DG_STANDBY_MODE_STATE_START; - pendingSampleWaterRequest = FALSE; - pendingStartDGRequest = FALSE; + stopSampleWaterRequest = FALSE; + startSampleWaterRequest = FALSE; + flushFilterRequest = FALSE; + endSampleWaterRequest = FALSE; + waterSampleStartTime = 0; + filterFlushStartTime = 0; + filterFlushPublishTimerCounter = 0; + pendingStartDGRequest = FALSE; } /*********************************************************************//** @@ -85,8 +104,8 @@ signalDrainPumpHardStop(); stopPrimaryHeater(); stopTrimmerHeater(); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1 ); - requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2 ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2_BICARB ); // UV off resetReservoirLoadCellsOffset( DG_RESERVOIR_1 ); @@ -113,6 +132,14 @@ standbyState = handleStandbyIdleState(); break; + case DG_STANDBY_MODE_STATE_FLUSH_FILTER: + standbyState = handleStandbyFlushFilterState(); + break; + + case DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE: + standbyState = handleStandbyFlushFilterIdleState(); + break; + case DG_STANDBY_MODE_STATE_SAMPLE_WATER: standbyState = handleStandbySampleWaterState(); break; @@ -136,52 +163,112 @@ *************************************************************************/ static DG_STANDBY_MODE_STATE_T handleStandbyIdleState( void ) { - DG_STANDBY_MODE_STATE_T result = DG_STANDBY_MODE_STATE_IDLE; + DG_STANDBY_MODE_STATE_T state = DG_STANDBY_MODE_STATE_IDLE; // go to standby solo mode if HD is turned off or stops communicating. if ( FALSE == isHDCommunicating() ) { // TODO if HD comm loss, should we wait an hour or so before going to solo standby? requestNewOperationMode( DG_MODE_SOLO ); } // if HD requests water sample, go to water sample state - else if ( TRUE == pendingSampleWaterRequest ) + else if ( TRUE == flushFilterRequest ) { - pendingSampleWaterRequest = FALSE; - waterSampleStartTime = getMSTimerCount(); + flushFilterRequest = FALSE; + filterFlushStartTime = getMSTimerCount(); setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VSP, VALVE_STATE_OPEN ); - result = DG_STANDBY_MODE_STATE_SAMPLE_WATER; + setValveState( VPD, VALVE_STATE_OPEN ); // TODO: VPD drain state is closed for V3 + state = DG_STANDBY_MODE_STATE_FLUSH_FILTER; } else if ( TRUE == pendingStartDGRequest ) { pendingStartDGRequest = FALSE; requestNewOperationMode( DG_MODE_CIRC ); } - return result; + return state; } /*********************************************************************//** * @brief + * The handleStandbyFilterFlushState function executes the flush filter state + * of the standby mode state machine. + * @details Inputs: filterFLushStartTime + * @details Outputs: Flushed the filters + * @return the next state + *************************************************************************/ +static DG_STANDBY_MODE_STATE_T handleStandbyFlushFilterState( void ) +{ + DG_STANDBY_MODE_STATE_T state = DG_STANDBY_MODE_STATE_FLUSH_FILTER; + + if ( TRUE == didTimeout( filterFlushStartTime, FILTER_FLUSH_TIME_MS ) ) + { + state = DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE; + } + + if ( FILTER_FLUSH_DATA_PUBLISH_INTERVAL <= filterFlushPublishTimerCounter++ ) + { + U32 const timeout = FILTER_FLUSH_TIME_MS / MS_PER_SECOND; + U32 const countdown = ( ( getMSTimerCount() - filterFlushStartTime ) / MS_PER_SECOND ); + filterFlushPublishTimerCounter = 0; + + broadcastFilterFlushData( timeout, countdown ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyFlushFilterIdleState function executes the flush filter state + * of the standby mode state machine. + * @details Inputs: filterFLushStartTime + * @details Outputs: Flushed the filters + * @return the next state + *************************************************************************/ +static DG_STANDBY_MODE_STATE_T handleStandbyFlushFilterIdleState( void ) +{ + DG_STANDBY_MODE_STATE_T state = DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE; + + if ( TRUE == startSampleWaterRequest ) + { + startSampleWaterRequest = FALSE; + waterSampleStartTime = getMSTimerCount(); + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VSP, VALVE_STATE_OPEN ); + state = DG_STANDBY_MODE_STATE_SAMPLE_WATER; + } + + if ( TRUE == endSampleWaterRequest ) + { + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VPD, VALVE_STATE_CLOSED ); + state = DG_STANDBY_MODE_STATE_IDLE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbySampleWaterState function executes the sample water state * of the standby mode state machine. - * @details Inputs: none - * @details Outputs: Sample water state of the standby mode executed + * @details Inputs: stopSampleWaterRequest, waterSampleStartTime + * @details Outputs: Finished sample water and closed valve * @return the next state *************************************************************************/ static DG_STANDBY_MODE_STATE_T handleStandbySampleWaterState( void ) { - DG_STANDBY_MODE_STATE_T result = DG_STANDBY_MODE_STATE_SAMPLE_WATER; + DG_STANDBY_MODE_STATE_T state = DG_STANDBY_MODE_STATE_SAMPLE_WATER; - // VPi and VSP valves open for 10 seconds, then close and return to idle state - if ( TRUE == didTimeout( waterSampleStartTime, WATER_SAMPLE_TIME_MS ) ) + // After HD requests to stop or 10 seconds has elapsed, close and return to idle state + if ( ( TRUE == stopSampleWaterRequest ) || ( TRUE == didTimeout( waterSampleStartTime, MAX_WATER_SAMPLE_TIME_MS ) ) ) { - setValveState( VPI, VALVE_STATE_CLOSED ); setValveState( VSP, VALVE_STATE_CLOSED ); - result = DG_STANDBY_MODE_STATE_IDLE; + setValveState( VPD, VALVE_STATE_OPEN ); // TODO: VPD drain state is closed for V3 + state = DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE; } - return result; + return state; } /*********************************************************************//** @@ -191,17 +278,58 @@ * @details Outputs: pendingSampleWaterRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ -BOOL requestWaterSample( void ) +void waterSampleCommandHandler( SAMPLE_WATER_CMD_T sampleWaterCmd ) { - BOOL result = FALSE; + DG_CMD_RESPONSE_T cmdResponse; - if ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) + cmdResponse.commandID = DG_CMD_SAMPLE_WATER; + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE; + + switch ( sampleWaterCmd ) { - result = TRUE; - pendingSampleWaterRequest = TRUE; + case SAMPLE_WATER_CMD_STOP: + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_SAMPLE_WATER == standbyState ) ) + { + stopSampleWaterRequest = TRUE; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + } + break; + + case SAMPLE_WATER_CMD_START: + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE == standbyState ) ) + { + startSampleWaterRequest = TRUE; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + } + break; + + case SAMPLE_WATER_CMD_FLUSH: + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) ) + { + flushFilterRequest = TRUE; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + } + break; + + case SAMPLE_WATER_CMD_END: + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_FLUSH_FILTER_IDLE == standbyState ) ) + { + endSampleWaterRequest = TRUE; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + } + break; + + default: + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_INVALID_PARAMETER; + break; } - return result; + sendCommandResponseMsg( &cmdResponse ); } /*********************************************************************//** Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r5fc16235c1752c993b3f1285f3a2b9738372af7a -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 5fc16235c1752c993b3f1285f3a2b9738372af7a) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -39,7 +39,7 @@ DG_STANDBY_MODE_STATE_T getCurrentStandbyState( void ); // get the current state of the standby mode. -BOOL requestWaterSample( void ); // HD requests water sample +void waterSampleCommandHandler( SAMPLE_WATER_CMD_T sampleWaterCmd ); BOOL requestDGStart( void ); // HD requests DG start (go to re-circulate mode) BOOL startDGHeatDisinfect( void ); // HD start heat disinfect mode Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r79e9be79f488da3a4aef5d755d359fff91a8db3e -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 79e9be79f488da3a4aef5d755d359fff91a8db3e) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -156,8 +156,8 @@ 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 + U16 fpgaFanIn1Pulse; ///< Reg 378. Fan inlet 1 pulse time in 2.5 us resolution + U16 fpgaFanOut1Pulse; ///< Reg 380. Fan outlet 1 pulse time in 2.5 us resolution U08 fpgaEmstatOutByte; ///< Reg 382. Emstat output FIFO - data from the Emstat device U08 fpgaEmstatRxErrorCount; ///< Reg 383. Number of receive errors since power-up @@ -169,6 +169,12 @@ U08 fpgaGPIOReg; ///< Reg 392. FGPA GPIO register U08 fpgaDummyByte2Addr; ///< Reg 393. Dummy byte address to maintain an even addressing scheme U16 fpgaADCTemp; ///< Reg 394. Internal FPGA die temperature ADC + + U16 fpgaFanIn2Pulse; ///< Reg 396. Fan inlet 2 pulse time in 2.5 resolution + U16 fpgaFanOut2Pulse; ///< Reg 398. Fan outlet 2 pulse time in 2.5 resolution + U16 fpgaFanIn3Pulse; ///< Reg 400. Fan inlet 3 pulse time in 2.5 resolution + U16 fpgaFanOut3Pulse; ///< Reg 402. Fan outlet 3 pulse time in 2.5 resolution + } DG_FPGA_SENSORS_T; typedef struct @@ -1594,7 +1600,7 @@ *************************************************************************/ U16 getFPGAInletFan1TogglePeriod( void ) { - return fpgaSensorReadings.fpgaFan1Pulse; + return fpgaSensorReadings.fpgaFanIn1Pulse; } /*********************************************************************//** @@ -1606,7 +1612,7 @@ *************************************************************************/ U16 getFPGAInletFan2TogglePeriod( void ) { - return fpgaSensorReadings.fpgaFan2Pulse; + return fpgaSensorReadings.fpgaFanIn2Pulse; } /*********************************************************************//** @@ -1618,7 +1624,7 @@ *************************************************************************/ U16 getFPGAInletFan3TogglePeriod( void ) { - return 0; + return fpgaSensorReadings.fpgaFanIn3Pulse; } /*********************************************************************//** @@ -1630,7 +1636,7 @@ *************************************************************************/ U16 getFPGAOutletFan1TogglePeriod( void ) { - return 0; + return fpgaSensorReadings.fpgaFanOut1Pulse; } /*********************************************************************//** @@ -1642,7 +1648,7 @@ *************************************************************************/ U16 getFPGAOutletFan2TogglePeriod( void ) { - return 0; + return fpgaSensorReadings.fpgaFanOut2Pulse; } /*********************************************************************//** @@ -1654,7 +1660,7 @@ *************************************************************************/ U16 getFPGAOutletFan3TogglePeriod( void ) { - return 0; + return fpgaSensorReadings.fpgaFanOut3Pulse; } /*********************************************************************//** Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r82cefc09d89b0bdf8e45578d14ad9bdd68027fab -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 82cefc09d89b0bdf8e45578d14ad9bdd68027fab) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -38,7 +38,7 @@ #define DEFAULT_FILL_VOLUME_ML 1700 ///< Default fill volume for treatment in mL. #define DISINFECT_FILL_VOLUME_ML 2400 ///< Fill volume for disinfection in mL. #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///< Maximum fill volume in mL. -#define DEFAULT_DRAIN_VOLUME_ML 100 ///< Default drain volume in mL. +#define DEFAULT_DRAIN_VOLUME_ML 0 ///< Default drain volume in mL. #define MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///< Maximum drain volume in mL. #define MAX_RESERVOIR_WEIGHT 10000 ///< Maximum reservoir weight in grams. @@ -344,10 +344,36 @@ } sendCommandResponseMsg( &cmdResponse ); -} +} /*********************************************************************//** * @brief + * The tareReservoir function sets the tare load cell variable to TRUE. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +void tareReservoir( void ) +{ + tareLoadCellRequest = TRUE; +} + +/*********************************************************************//** + * @brief + * The resetReservoirsLowestWeight function resets the lowest load cell + * weight of the reservoirs. + * @details Inputs: reservoirLowestWeight + * @details Outputs: reservoirLowestWeight + * @return none + *************************************************************************/ +void resetReservoirsLowestWeight( void ) +{ + reservoirLowestWeight[ DG_RESERVOIR_1 ] = MAX_RESERVOIR_WEIGHT; + reservoirLowestWeight[ DG_RESERVOIR_2 ] = MAX_RESERVOIR_WEIGHT; +} + +/*********************************************************************//** + * @brief * The getInactiveReservoir function gets the inactive reservoir. * @details Inputs: activeReservoir * @details Outputs: none @@ -424,6 +450,13 @@ if ( hasTimeOut || hasTargetReached ) { + // TODO remove Test code + if ( reservoirId == DG_RESERVOIR_1 ) + { + BOOL test = TRUE; + } + // TODO remove test code + result = TRUE; reservoirLowestWeight[ reservoirId ] = MAX_RESERVOIR_WEIGHT; Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -ref85c4f5bd363adfd405faf3b91910363d8030f1 -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision ef85c4f5bd363adfd405faf3b91910363d8030f1) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -67,7 +67,11 @@ void startFillCmd( U32 fillToVolMl ); // handle fill command from HD void stopFillCmd( void ); // handle stop fill command from HD void startDrainCmd( DRAIN_CMD_T drainCmd ); // handle drain command from HD -void stopDrainCmd( void ); // handle stop drain command from HD +void stopDrainCmd( void ); // handle stop drain command from HD + +void tareReservoir( void ); + +void resetReservoirsLowestWeight( void ); DG_RESERVOIR_ID_T getInactiveReservoir( void ); F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -37,11 +37,11 @@ // ********** private definitions ********** #define NUM_OF_CAN_OUT_BUFFERS 5 ///< Number of CAN buffers for transmit -#define NUM_OF_CAN_IN_BUFFERS 6 ///< Number of CAN buffers for receiving +#define NUM_OF_CAN_IN_BUFFERS 7 ///< Number of CAN buffers for receiving #ifndef DEBUG_ENABLED - #define NUM_OF_MSG_IN_BUFFERS 6 ///< Number of Msg buffers for receiving + #define NUM_OF_MSG_IN_BUFFERS 7 ///< Number of Msg buffers for receiving #else - #define NUM_OF_MSG_IN_BUFFERS 7 + #define NUM_OF_MSG_IN_BUFFERS 8 #define SCI1_RECEIVE_DMA_REQUEST 30 #define SCI1_TRANSMIT_DMA_REQUEST 31 #endif @@ -81,9 +81,9 @@ { COMM_BUFFER_OUT_CAN_DG_ALARM, COMM_BUFFER_OUT_CAN_DG_2_HD, + COMM_BUFFER_OUT_CAN_DG_2_UI, COMM_BUFFER_OUT_CAN_DG_BROADCAST, - COMM_BUFFER_OUT_CAN_PC, - COMM_BUFFER_OUT_CAN_DG_2_UI + COMM_BUFFER_OUT_CAN_PC }; /// Array of in-coming CAN buffers. @@ -93,6 +93,7 @@ COMM_BUFFER_IN_CAN_UI_ALARM, COMM_BUFFER_IN_CAN_HD_2_DG, COMM_BUFFER_IN_CAN_HD_BROADCAST, + COMM_BUFFER_IN_CAN_UI_2_DG, COMM_BUFFER_IN_CAN_UI_BROADCAST, COMM_BUFFER_IN_CAN_PC, #ifdef DEBUG_ENABLED @@ -999,6 +1000,10 @@ handlePowerOffWarning( message ); break; + case MSG_ID_ALARM_CLEARED: + handleAlarmClear( message ); + break; + case MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS: handleSetDialysateTemperatureCmd( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -416,7 +416,7 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); return result; -} +} /*********************************************************************//** * @brief @@ -767,6 +767,25 @@ /*********************************************************************//** * @brief + * The handleAlarmClear function handles a clear alarm message from the HD. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleAlarmClear( MESSAGE_T *message ) +{ + if ( message->hdr.payloadLen == sizeof( U32 ) ) + { + U32 alarmId; + + memcpy(&alarmId, message->payload, sizeof( U32 ) ); + clearAlarm( (ALARM_ID_T)alarmId ); + } +} + +/*********************************************************************//** + * @brief * The handleSetDialysateTemperatureCmd function handles a dialysate temperature * set points message from the HD. * @details Inputs: none @@ -878,6 +897,36 @@ /*********************************************************************//** * @brief + * The broadcastFilterFlushData function sends out the filter flush progress data. + * @details Inputs: none + * @details Outputs: filter flush data msg constructed and queued + * @param timeout flush filter timeout (in sec) + * @param countdown flush filter timeout count down (in sec) + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastFilterFlushData( U32 timeout, U32 countdown ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_FILTER_FLUSH_PROGRESS; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); + + memcpy( payloadPtr, &timeout, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &countdown, sizeof( U32 ) ); + + // 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 broadcastHeatDisinfectData function sends out the heat disinfect * mode data. * @details Inputs: none @@ -905,6 +954,7 @@ } /*********************************************************************//** + * @brief * The sendCommandResponseMsg function constructs a command response to HD * and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none @@ -996,13 +1046,21 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof( U32 ) ) + if ( message->hdr.payloadLen == sizeof( FILL_CMD_T ) ) { - U32 fillToVolumeMl; + FILL_CMD_T fillCmd; result = TRUE; - memcpy( &fillToVolumeMl, message->payload, sizeof( U32 ) ); - startFillCmd( fillToVolumeMl ); + memcpy( &fillCmd, message->payload, sizeof( FILL_CMD_T ) ); + + if ( DG_CMD_START == fillCmd.cmd ) + { + startFillCmd( fillCmd.fillToVolumeMl ); + } + else + { + stopFillCmd(); + } } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); @@ -1102,12 +1160,13 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == 0 ) + if ( message->hdr.payloadLen == sizeof( U32 ) ) { - if ( DG_MODE_STAN == getCurrentOperationMode() ) - { - result = requestWaterSample(); - } + SAMPLE_WATER_CMD_T sampleWaterCmd; + + result = TRUE; + memcpy( &sampleWaterCmd, message->payload, sizeof( U32 ) ); + waterSampleCommandHandler( sampleWaterCmd ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -r021e6ea5f99fd6da424d8ab81d6a106f2cb41294 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 021e6ea5f99fd6da424d8ab81d6a106f2cb41294) @@ -101,12 +101,18 @@ // MSG_ID_DG_UV_REACTORS_DATA BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); +// MSG_ID_DG_FILTER_FLUSH_PROGRESS +BOOL broadcastFilterFlushData( U32 timeout, U32 countdown ); + // MSG_ID_DG_COMMAND_RESPONSE void sendCommandResponseMsg( DG_CMD_RESPONSE_T *cmdResponsePtr ); // MSG_ID_POWER_OFF_WARNING void handlePowerOffWarning( MESSAGE_T *message ); +// MSG_ID_ALARM_CLEARED +void handleAlarmClear( MESSAGE_T *message ); + // MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS void handleSetDialysateTemperatureCmd( MESSAGE_T *message );