Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -ra19a676d1e67bb3e1aca9e9bba49727f9d5f8b38 -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision a19a676d1e67bb3e1aca9e9bba49727f9d5f8b38) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -15,6 +15,7 @@ **************************************************************************/ #include "AlarmMgmt.h" +#include "ModeTreatment.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "DGInterface.h" @@ -26,18 +27,37 @@ // ********** private definitions ********** -#define START_DG_CMD TRUE -#define STOP_DG_CMD FALSE +#define START_DG_CMD TRUE ///< . +#define STOP_DG_CMD FALSE ///< . +#define DRAIN_RESERVOIR_TO_VOLUME_ML 100 ///< Drain reservoir to this volume (in mL) during treatment. +#define FILL_RESERVOIR_TO_VOLUME_ML 1500 ///< Fill reservoir to this volume (in mL) during treatment. + +/// States of the treatment reservoir management state machine. +typedef enum TreatmentReservoirMgmt_States +{ + TREATMENT_RESERVOIR_MGMT_START_STATE = 0, ///< If DG not already in re-circ mode, try to get it there. + TREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE, ///< In DG re-circ, wait for lines to flush - then start draining inactive reservoir. + TREATMENT_RESERVOIR_MGMT_DRAIN_RESERVOIR_STATE, ///< Wait for drain to complete. + TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE, ///< Wait to fill inactive reservoir (if appropriate) - then start filling inactive reservoir. + TREATMENT_RESERVOIR_MGMT_FILL_RESERVOIR_STATE, ///< Wait for fill to complete. + TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RES_SWITCH_STATE, ///< Wait for active reservoir to be consumed and switch cmd given - then back to flush DG lines state. + NUM_OF_TREATMENT_RESERVOIR_MGMT_STATES ///< Number of treatment reservoir mgmt. states. +} TREATMENT_RESERVOIR_MGMT_STATE_T; + // ********** private data ********** // DG status static DG_OP_MODE_T dgCurrentOpMode = DG_MODE_INIT; +static U32 dgSubMode = 0; static BOOL dgStarted = FALSE; static BOOL dgStartetSet = FALSE; static BOOL dgWaterSampled = FALSE; static BOOL dgWaterSampledSet = FALSE; +// state machine states +static TREATMENT_RESERVOIR_MGMT_STATE_T currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; ///< Current state of treatment mode reservoir management. + // DG sensor data static F32 dgPressures[ NUM_OF_DG_PRESSURE_SENSORS ]; static F32 dgPrimaryTempSet = 0.0; @@ -71,11 +91,99 @@ *************************************************************************/ void initDGInterface( void ) { - // TODO - anything to initialize? + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; } /*********************************************************************//** * @brief + * The execTreatmentReservoirMgmt function executes the state machine for the \n + * reservoir management during treatment mode. + * @details + * Inputs : none + * Outputs : DG reservoirs (drains & fills) managed. + * @return none + *************************************************************************/ +void execTreatmentReservoirMgmt( void ) +{ + DG_OP_MODE_T dgOpMode = getDGOpMode(); // TODO - the DG mode & sub-mode come as a pair at interval - they MUST be kept together. + U32 dgSubMode = getDGSubMode(); + + // treatment reservoir mgmt. state machine + switch ( currentTrtResMgmtState ) + { + case TREATMENT_RESERVOIR_MGMT_START_STATE: + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + break; + + case TREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML ); + } + } + else if ( DG_MODE_DRAI == dgOpMode ) + { + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_DRAIN_RESERVOIR_STATE; + } + else + { + // TODO - ??? + } + break; + + case TREATMENT_RESERVOIR_MGMT_DRAIN_RESERVOIR_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE; + } + break; + + case TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE: + // delay fill start if we've paused treatment? + if ( getTreatmentState() == TREATMENT_DIALYSIS_STATE ) + { + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGFill( FILL_RESERVOIR_TO_VOLUME_ML ); + } + } + else + { + // TODO - ??? + } + } + if ( DG_MODE_FILL == dgOpMode ) + { + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_FILL_RESERVOIR_STATE; + } + break; + + case TREATMENT_RESERVOIR_MGMT_FILL_RESERVOIR_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RES_SWITCH_STATE; + } + break; + + case TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RES_SWITCH_STATE: + // reservoir switch during treatment should only occur in this state (i.e. when DG is ready). + // state will reset to start when next reservoir switch is commanded. + // TODO - should this state machine determine when to give reservoir switch command? Or leave to treatment mode? + break; + + default: + // TODO - s/w fault + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; + break; + } +} + +/*********************************************************************//** + * @brief * The getDGOpMode function gets the current DG operating mode. * @details * Inputs : dgCurrentOpMode @@ -84,9 +192,20 @@ *************************************************************************/ DG_OP_MODE_T getDGOpMode( void ) { - DG_OP_MODE_T result = dgCurrentOpMode; + return dgCurrentOpMode; +} - return result; +/*********************************************************************//** + * @brief + * The getDGSubMode function gets the current DG operating sub-mode. + * @details + * Inputs : dgSubMode + * Outputs : none + * @return Current DG operating sub-mode. + *************************************************************************/ +U32 getDGSubMode( void ) +{ + return dgSubMode; } /*********************************************************************//** @@ -171,13 +290,15 @@ * Inputs : none * Outputs : dgCurrentOpMode * @param opMode : operating mode reported by DG. + * @param subMode : sub-mode (current state) of operating mode reported by DG. * @return none *************************************************************************/ -void setDGOpMode( U32 opMode ) +void setDGOpMode( U32 opMode, U32 subMode ) { if ( opMode < NUM_OF_DG_MODES ) { dgCurrentOpMode = (DG_OP_MODE_T)opMode; + dgSubMode = subMode; } } @@ -334,6 +455,8 @@ { dgActiveReservoirSet = resID; sendDGSwitchReservoirCommand( resID ); + // reset treatment reservoir mgmt. state machine on reservoir switch + currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; } else { Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -ra19a676d1e67bb3e1aca9e9bba49727f9d5f8b38 -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision a19a676d1e67bb3e1aca9e9bba49727f9d5f8b38) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -18,6 +18,7 @@ #define __DG_H__ #include "HDCommon.h" +#include "DGModes.h" /** * @defgroup DGInterface DGInterface @@ -30,24 +31,6 @@ // ********** public definitions ********** -/// Enumeration of DG operation modes. -typedef enum DG_Op_Modes -{ - DG_MODE_FAUL = 0, ///< Fault mode. - DG_MODE_SERV, ///< Service mode. - DG_MODE_INIT, ///< Initialization & POST mode. - DG_MODE_STAN, ///< Standby mode - connected to HD. - DG_MODE_SOLO, ///< Standby Solo mode - no HD connected. - DG_MODE_CIRC, ///< Re-circulate mode. - DG_MODE_FILL, ///< Fill mode. - DG_MODE_DRAI, ///< Drain mode. - DG_MODE_FLUS, ///< Flush mode. - DG_MODE_DISI, ///< Disinfect mode. - DG_MODE_CHEM, ///< Chemical Disinfect mode. - DG_MODE_NLEG, ///< Not legal - an illegal mode transition occurred. - NUM_OF_DG_MODES -} DG_OP_MODE_T; - /// Enumeration of DG reservoirs. typedef enum DG_Reservoirs { @@ -69,15 +52,17 @@ // ********** public function prototypes ********** void initDGInterface( void ); +void execTreatmentReservoirMgmt( void ); DG_OP_MODE_T getDGOpMode( void ); +U32 getDGSubMode( void ); DG_RESERVOIR_ID_T getDGActiveReservoir( void ); F32 getDGPressure( DG_PRESSURE_SENSORS_T sensorID ); U32 getDGROPumpPressureSetPt( void ); F32 getDGROPumpFlowRateMlMin( void ); U32 getDGDrainPumpRPMSetPt( void ); -void setDGOpMode( U32 opMode ); +void setDGOpMode( U32 opMode, U32 subMode ); void setDGDialysateTemperatures( F32 primaryHtrTemp, F32 trimmerHtrTemp ); void setDGReservoirsData( DG_RESERVOIR_ID_T resID, U32 fillVol, U32 drainVol ); void setDGPressures( F32 roIn, F32 roOut, F32 drainIn, F32 drainOut ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r93a439cf9d1b347e23b84d1156417380ee01efaa -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 93a439cf9d1b347e23b84d1156417380ee01efaa) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -16,9 +16,10 @@ #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" +#include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Buttons.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "ModeStandby.h" @@ -27,8 +28,24 @@ static U32 start; #endif +// ********** private definitions ********** + +/// Sub-mode states while in standby mode +typedef enum Standby_States +{ + STANDBY_START_STATE = 0, ///< Start standby + STANDBY_FLUSH_DG_LINES_STATE, ///< + STANDBY_DRAIN_RESERVOIR_STATE, ///< + STANDBY_WAIT_FOR_PRIME_STATE, ///< + STANDBY_FILL_RESERVOIR_STATE, ///< + STANDBY_WAIT_FOR_TREATMENT_STATE, ///< + NUM_OF_STANDBY_STATES ///< Number of standby states (sub-modes). +} STANDBY_STATE_T; + // ********** private data ********** +static STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. + // ********** private function prototypes ********** /************************************************************************* @@ -42,6 +59,7 @@ *************************************************************************/ void initStandbyMode( void ) { + currentStandbyState = STANDBY_START_STATE; } /************************************************************************* @@ -55,10 +73,9 @@ *************************************************************************/ void transitionToStandbyMode( void ) { - // temporary test code - TODO - remove later - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); + // re-initialize when transitioning to standby mode + initStandbyMode(); + #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); @@ -81,12 +98,94 @@ void execStandbyMode( void ) { BOOL stop = isStopButtonPressed(); + DG_OP_MODE_T dgOpMode = getDGOpMode(); // TODO - the DG mode & sub-mode come as a pair at interval - they MUST be kept together. + U32 dgSubMode = getDGSubMode(); - if ( TRUE == stop ) + // treatment mode state machine + switch ( currentStandbyState ) { - cmdStartDG(); - requestNewOperationMode( MODE_PRES ); + case STANDBY_START_STATE: + // temporary test code - TODO - remove later + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); + cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + cmdStartDG(); + currentStandbyState = STANDBY_FLUSH_DG_LINES_STATE; + break; + + case STANDBY_FLUSH_DG_LINES_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGDrain( 100 ); + } + } + else if ( DG_MODE_DRAI == dgOpMode ) + { + currentStandbyState = STANDBY_DRAIN_RESERVOIR_STATE; + } + else + { + cmdStartDG(); + } + break; + + case STANDBY_DRAIN_RESERVOIR_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + currentStandbyState = STANDBY_WAIT_FOR_PRIME_STATE; + } + break; + + case STANDBY_WAIT_FOR_PRIME_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGFill( 1500 ); + } + } + else if ( DG_MODE_FILL == dgOpMode ) + { + currentStandbyState = STANDBY_FILL_RESERVOIR_STATE; + } + break; + + case STANDBY_FILL_RESERVOIR_STATE: + // temporary test code - TODO - remove later + if ( DG_MODE_CIRC == dgOpMode ) + { + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + currentStandbyState = STANDBY_WAIT_FOR_TREATMENT_STATE; + } + break; + + case STANDBY_WAIT_FOR_TREATMENT_STATE: + // TODO - test code + if ( TRUE == stop ) + { + if ( DG_MODE_CIRC == getDGOpMode() ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + requestNewOperationMode( MODE_PRES ); + } + } + } + break; + + default: + // TODO - s/w fault + currentStandbyState = STANDBY_START_STATE; + break; } + #ifdef RM46_EVAL_BOARD_TARGET if ( TRUE == didTimeout( start, 5000U ) ) { Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rd4850547b287cc1f94ea3617a1902c5278ea86b4 -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d4850547b287cc1f94ea3617a1902c5278ea86b4) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -17,10 +17,10 @@ #include "AlarmLamp.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" #include "Dialysis.h" -#include "Buttons.h" #include "TaskGeneral.h" #include "OperationModes.h" #include "SystemCommMessages.h" @@ -231,6 +231,8 @@ broadcastTreatmentTimeAndState(); broadcastTreatmentSettingsRanges(); + + execTreatmentReservoirMgmt(); #endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 5 min Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r8377b4e6ed494cbfc5dfc2bd9ad3c89b85b333cd -r0b87f7e6142dc3710db5c32a0c7c6694343dd717 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8377b4e6ed494cbfc5dfc2bd9ad3c89b85b333cd) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 0b87f7e6142dc3710db5c32a0c7c6694343dd717) @@ -1399,13 +1399,16 @@ *************************************************************************/ void handleDGOpMode( MESSAGE_T *message ) { - if ( message->hdr.payloadLen == sizeof(U32) ) + U32 payloadSize = sizeof(U32) + sizeof(U32); + + if ( message->hdr.payloadLen == payloadSize ) { - U32 mode; + U32 mode, subMode; memcpy( &mode, message->payload, sizeof(U32) ); + memcpy( &subMode, &message->payload[sizeof(U32)], sizeof(U32) ); - setDGOpMode( mode ); + setDGOpMode( mode, subMode ); } else {