Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rfbf04988794f0eaa8a7a596a349bae1dfff0e079 -ra504d6899e709d7432af9c055db1bd1fe340d032 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision fbf04988794f0eaa8a7a596a349bae1dfff0e079) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a504d6899e709d7432af9c055db1bd1fe340d032) @@ -17,8 +17,11 @@ #include // for memcpy() +#include "ModeRecirculate.h" #include "OperationModes.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" +#include "Valves.h" #include "Reservoirs.h" /** @@ -29,16 +32,20 @@ // ********** private definitions ********** #define MIN_RESERVOIR_VOLUME_ML 0 ///< Minimum reservoir volume in mL. -#define MAX_RESERVOIR_VOLUME_ML 3000 ///< Maximum reservoir volume in mL. -#define DEFAULT_FILL_VOLUME_ML 1500 ///< Default fill volume for treatment in mL. -#define DISINFECT_FILL_VOLUME_ML 2900 ///> Fill volume for disinfection in mL. +#define MAX_RESERVOIR_VOLUME_ML 2500 ///< Maximum reservoir volume in mL. +#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 MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum drain volume in mL. #define MIN_DRAIN_VOLUME_ML 20 ///> Minimum drain volume in mL. +#define RESERVOIR_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the reservoir data is published on the CAN bus. + // ********** private data ********** +static U32 reservoirDataPublicationTimerCounter = 0; ///< used to schedule reservoir data publication to CAN bus. + static OVERRIDE_U32_T activeReservoir = { 0, 0, 0, 0 }; ///< The active reservoir that the DG is filling/draining/etc. static OVERRIDE_U32_T fillVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir fill volume (in mL). static OVERRIDE_U32_T drainVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir drain volume (in mL). @@ -51,42 +58,109 @@ * @details * Inputs : none * Outputs : Reservoirs module initialized. - * @param none * @return none *************************************************************************/ void initReservoirs( void ) { - activeReservoir.data = RESERVOIR_1; + activeReservoir.data = RESERVOIR_2; + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; } /*********************************************************************//** * @brief + * The execReservoirs function manages periodic tasks for the Reservoirs module. + * @details + * Inputs : none + * Outputs : Reservoir data broadcast on interval. + * @return none + *************************************************************************/ +void execReservoirs( void ) +{ + // publish active reservoir, fill/drain volume targets at 1 Hz. + if ( ++reservoirDataPublicationTimerCounter >= RESERVOIR_DATA_PUB_INTERVAL ) + { + U32 actRes = getActiveReservoir(); + U32 filVol = getReservoirFillVolumeTargetMl(); + U32 drnVol = getReservoirDrainVolumeTargetMl(); + broadcastReservoirData( actRes, filVol, drnVol ); + reservoirDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The setActiveReservoir function sets the given reservoir as active \n + * (meaning HD will be drawing from this reservoir). + * @details + * Inputs : none + * Outputs : Specified reservoir is set as active. + * @param resID : ID of reservoir to set as active. + * @return TRUE if set active reservoir command successful, FALSE if not. + *************************************************************************/ +BOOL setActiveReservoirCmd( RESERVOIR_ID_T resID ) +{ + BOOL result = FALSE; + + // switch reservoir command only valid in re-circulate mode + if ( DG_MODE_CIRC == getCurrentOperationMode() ) + { + switch ( resID ) + { + case RESERVOIR_1: + activeReservoir.data = (U32)resID; + result = TRUE; + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); // TODO - valve states are reversed for the two reservoirs for now - revert back when load cells are fixed. + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + break; + + case RESERVOIR_2: + activeReservoir.data = (U32)resID; + result = TRUE; + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + break; + + default: + // invalid reservoir given - cmd will be NAK'd w/ false result. + break; + } + } + + return result; +} + +/*********************************************************************//** + * @brief * The startFill function handles a fill command from the HD. * @details * Inputs : none * Outputs : move to fill mode - * @param resID : Reservoir to drain. * @param fillToVolMl : Target volume (in mL) to fill reservoir to. - * @param targetPrimeTemp : Target temperature of dialysate to fill reservoir with. - * @param targetTrimTemp : Target temperature of dialysate coming out of reservoir. * @return TRUE if fill command successful, FALSE if not. *************************************************************************/ -BOOL startFill( RESERVOIR_ID_T resID, U32 fillToVolMl, F32 targetPrimeTemp, F32 targetTrimTemp ) +BOOL startFillCmd( U32 fillToVolMl ) { BOOL result = FALSE; - // fill command only valid in standby mode - if ( MODE_STAN == getCurrentOperationMode() ) + // fill command only valid in re-circulate mode + if ( ( DG_MODE_CIRC == getCurrentOperationMode() ) && + ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getCurrentRecirculateState() ) ) { // validate parameters - if ( ( resID < NUM_OF_RESERVOIRS ) && ( fillToVolMl < MAX_FILL_VOLUME_ML ) ) + if ( fillToVolMl < MAX_FILL_VOLUME_ML ) { - activeReservoir.data = (U32)resID; fillVolumeTargetMl.data = fillToVolMl; - // TODO - relay temperature targets to the heater controller module - requestNewOperationMode( MODE_FILL ); + requestNewOperationMode( DG_MODE_FILL ); + result = TRUE; } } @@ -101,14 +175,15 @@ * Outputs : move to standby mode * @return TRUE if stop fill command successful, FALSE if not. *************************************************************************/ -BOOL stopFill( void ) +BOOL stopFillCmd( void ) { BOOL result = FALSE; // stop fill command only valid in fill mode - if ( MODE_FILL == getCurrentOperationMode() ) + if ( DG_MODE_FILL == getCurrentOperationMode() ) { - requestNewOperationMode( MODE_STAN ); + fillVolumeTargetMl.data = 0; + requestNewOperationMode( DG_MODE_CIRC ); } return result; @@ -120,24 +195,21 @@ * @details * Inputs : none * Outputs : - * @param resID : Reservoir to drain. * @param drainToVolMl : Target volume (in mL) to drain reservoir to. * @return TRUE if drain command successful, FALSE if not. *************************************************************************/ -BOOL startDrain( RESERVOIR_ID_T resID, U32 drainToVolMl ) +BOOL startDrainCmd( U32 drainToVolMl ) { BOOL result = FALSE; - // drain command only valid in standby mode - if ( MODE_STAN == getCurrentOperationMode() ) + // drain command only valid in re-circulate mode + if ( DG_MODE_CIRC == getCurrentOperationMode() ) { // validate parameters - if ( ( resID < NUM_OF_RESERVOIRS ) && - ( drainToVolMl > MIN_DRAIN_VOLUME_ML ) && ( drainToVolMl < MAX_DRAIN_VOLUME_ML ) ) + if ( ( drainToVolMl > MIN_DRAIN_VOLUME_ML ) && ( drainToVolMl < MAX_DRAIN_VOLUME_ML ) ) { - activeReservoir.data = (U32)resID; drainVolumeTargetMl.data = drainToVolMl; - requestNewOperationMode( MODE_DRAI ); + requestNewOperationMode( DG_MODE_DRAI ); } } @@ -152,19 +224,52 @@ * Outputs : move to standby mode * @return TRUE if stop drain command successful, FALSE if not. *************************************************************************/ -BOOL stopDrain( void ) +BOOL stopDrainCmd( void ) { BOOL result = FALSE; // stop drain command only valid in drain mode - if ( MODE_DRAI == getCurrentOperationMode() ) + if ( DG_MODE_DRAI == getCurrentOperationMode() ) { - requestNewOperationMode( MODE_STAN ); + drainVolumeTargetMl.data = 0; + requestNewOperationMode( DG_MODE_CIRC ); } return result; } +/*********************************************************************//** + * @brief + * The startTrimmerHeater function handles a start trimmer heater command \n + * from the HD. + * @details + * Inputs : none + * Outputs : start trimmer heater + * @return TRUE if stop drain command successful, FALSE if not. + *************************************************************************/ +BOOL startTrimmerHeaterCmd( void ) +{ + BOOL result = FALSE; + // TODO + return result; +} + +/*********************************************************************//** + * @brief + * The stopTrimmerHeater function handles a stop trimmer heater command \n + * from the HD. + * @details + * Inputs : none + * Outputs : stop trimmer heater + * @return TRUE if stop drain command successful, FALSE if not. + *************************************************************************/ +BOOL stopTrimmerHeaterCmd( void ) +{ + BOOL result = FALSE; + // TODO + return result; +} + /************************************************************************* * GET SUPPORT FUNCTIONS *************************************************************************/ @@ -200,11 +305,11 @@ *************************************************************************/ U32 getReservoirFillVolumeTargetMl( void ) { - U32 result = (RESERVOIR_ID_T)fillVolumeTargetMl.data; + U32 result = fillVolumeTargetMl.data; if ( OVERRIDE_KEY == fillVolumeTargetMl.override ) { - result = (RESERVOIR_ID_T)fillVolumeTargetMl.ovData; + result = fillVolumeTargetMl.ovData; } return result; @@ -221,11 +326,11 @@ *************************************************************************/ U32 getReservoirDrainVolumeTargetMl( void ) { - U32 result = (RESERVOIR_ID_T)drainVolumeTargetMl.data; + U32 result = drainVolumeTargetMl.data; if ( OVERRIDE_KEY == drainVolumeTargetMl.override ) { - result = (RESERVOIR_ID_T)drainVolumeTargetMl.ovData; + result = drainVolumeTargetMl.ovData; } return result;