Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rf267c42c91fd6e22db80e19039b8993582de51e9 -rf6413fefb94be1273323d4193bba3c522cf8ecb4 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision f267c42c91fd6e22db80e19039b8993582de51e9) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision f6413fefb94be1273323d4193bba3c522cf8ecb4) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2020 Diality Inc. - All Rights Reserved. * @@ -18,28 +18,34 @@ #include // for memcpy() #include "OperationModes.h" +#include "SystemCommMessages.h" #include "Reservoirs.h" +/** + * @addtogroup Reservoirs + * @{ + */ + // ********** private definitions ********** -#define DEFAULT_DIALYSATE_TEMP_PRIMARY_C 39.0 -#define DEFAULT_DIALYSATE_TEMP_TRIMMER_C 37.0 +#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_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 DEFAULT_TREATMENT_FILL_VOLUME_ML 1500 -#define DEFAULT_PRIME_FILL_VOLUME_ML 2500 -#define DEFAULT_DRAIN_VOLUME_ML 100 - // ********** private data ********** -static RESERVOIR_ID_T activeReservoir; -static U32 fillVolumeTargetMl; -static U32 drainVolumeTargetMl; -static F32 targetDialysateTemperaturePrimary; -static F32 targetDialysateTemperatureTrim; +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). // ********** private function prototypes ********** -/************************************************************************* +/*********************************************************************//** * @brief * The initReservoirs function initializes the Reservoirs module. * @details @@ -50,14 +56,12 @@ *************************************************************************/ void initReservoirs( void ) { - activeReservoir = RESERVOIR_1; - fillVolumeTargetMl = DEFAULT_TREATMENT_FILL_VOLUME_ML; - drainVolumeTargetMl = DEFAULT_DRAIN_VOLUME_ML; - targetDialysateTemperaturePrimary = DEFAULT_DIALYSATE_TEMP_PRIMARY_C; - targetDialysateTemperatureTrim = DEFAULT_DIALYSATE_TEMP_TRIMMER_C; + activeReservoir.data = RESERVOIR_1; + fillVolumeTargetMl.data = DEFAULT_FILL_VOLUME_ML; + drainVolumeTargetMl.data = DEFAULT_DRAIN_VOLUME_ML; } -/************************************************************************* +/*********************************************************************//** * @brief * The startFill function handles a fill command from the HD. * @details @@ -73,21 +77,45 @@ { BOOL result = FALSE; - // validate parameters - if ( resID < NUM_OF_RESERVOIRS ) // TODO also check volume and temps vs. max capacities + // fill command only valid in standby mode + if ( MODE_STAN == getCurrentOperationMode() ) { - activeReservoir = resID; - fillVolumeTargetMl = fillToVolMl; - targetDialysateTemperaturePrimary = targetPrimeTemp; - targetDialysateTemperatureTrim = targetTrimTemp; - requestNewOperationMode( MODE_FILL ); + // validate parameters + if ( ( resID < NUM_OF_RESERVOIRS ) && ( fillToVolMl < MAX_FILL_VOLUME_ML ) ) + { + activeReservoir.data = (U32)resID; + fillVolumeTargetMl.data = fillToVolMl; + // TODO - relay temperature targets to the heater controller module + requestNewOperationMode( MODE_FILL ); + } } return result; } -/************************************************************************* +/*********************************************************************//** * @brief + * The stopFill function handles a stop fill command from the HD. + * @details + * Inputs : none + * Outputs : move to standby mode + * @return TRUE if stop fill command successful, FALSE if not. + *************************************************************************/ +BOOL stopFill( void ) +{ + BOOL result = FALSE; + + // stop fill command only valid in fill mode + if ( MODE_FILL == getCurrentOperationMode() ) + { + requestNewOperationMode( MODE_STAN ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The startDrain function handles a fill command from the HD * @details * Inputs : none @@ -100,13 +128,255 @@ { BOOL result = FALSE; - // validate parameters - if ( resID < NUM_OF_RESERVOIRS ) // TODO also check volume vs. max capacity + // drain command only valid in standby mode + if ( MODE_STAN == getCurrentOperationMode() ) { - activeReservoir = resID; - drainVolumeTargetMl = drainToVolMl; - requestNewOperationMode( MODE_DRAI ); + // validate parameters + if ( ( resID < NUM_OF_RESERVOIRS ) && + ( drainToVolMl > MIN_DRAIN_VOLUME_ML ) && ( drainToVolMl < MAX_DRAIN_VOLUME_ML ) ) + { + activeReservoir.data = (U32)resID; + drainVolumeTargetMl.data = drainToVolMl; + requestNewOperationMode( MODE_DRAI ); + } } return result; } + +/*********************************************************************//** + * @brief + * The stopDrain function handles a stop drain command from the HD. + * @details + * Inputs : none + * Outputs : move to standby mode + * @return TRUE if stop drain command successful, FALSE if not. + *************************************************************************/ +BOOL stopDrain( void ) +{ + BOOL result = FALSE; + + // stop drain command only valid in drain mode + if ( MODE_DRAI == getCurrentOperationMode() ) + { + requestNewOperationMode( MODE_STAN ); + } + + return result; +} + +/************************************************************************* + * GET SUPPORT FUNCTIONS + *************************************************************************/ + +/*********************************************************************//** + * @brief + * The getActiveReservoir function gets the active reservoir. + * @details + * Inputs : activeReservoir + * Outputs : none + * @return the currently active reservoir. + *************************************************************************/ +RESERVOIR_ID_T getActiveReservoir( void ) +{ + RESERVOIR_ID_T result = (RESERVOIR_ID_T)activeReservoir.data; + + if ( OVERRIDE_KEY == activeReservoir.override ) + { + result = (RESERVOIR_ID_T)activeReservoir.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getReservoirFillVolumeTargetMl function gets the reservoir fill \n + * volume (in mL). + * @details + * Inputs : fillVolumeTargetMl + * Outputs : none + * @return the current target reservoir fill volume (in mL). + *************************************************************************/ +U32 getReservoirFillVolumeTargetMl( void ) +{ + U32 result = (RESERVOIR_ID_T)fillVolumeTargetMl.data; + + if ( OVERRIDE_KEY == fillVolumeTargetMl.override ) + { + result = (RESERVOIR_ID_T)fillVolumeTargetMl.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getReservoirDrainVolumeTargetMl function gets the reservoir drain \n + * volume (in mL). + * @details + * Inputs : drainVolumeTargetMl + * Outputs : none + * @return the current target reservoir drain volume (in mL). + *************************************************************************/ +U32 getReservoirDrainVolumeTargetMl( void ) +{ + U32 result = (RESERVOIR_ID_T)drainVolumeTargetMl.data; + + if ( OVERRIDE_KEY == drainVolumeTargetMl.override ) + { + result = (RESERVOIR_ID_T)drainVolumeTargetMl.ovData; + } + + return result; +} + + +/**@}*/ + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetDGActiveReservoirOverride function overrides the active \n + * reservoir. + * @details + * Inputs : activeReservoir + * Outputs : activeReservoir + * @param value : override active reservoir ID. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetDGActiveReservoirOverride( RESERVOIR_ID_T value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + activeReservoir.ovData = value; + activeReservoir.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The activeReservoir function resets the override of the active \n + * reservoir. + * @details + * Inputs : activeReservoir + * Outputs : activeReservoir + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetDGActiveReservoirOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + activeReservoir.override = OVERRIDE_RESET; + activeReservoir.ovData = activeReservoir.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetReservoirFillVolumeMlOverride function overrides the target \n + * reservoir fill volume (in mL). + * @details + * Inputs : fillVolumeTargetMl + * Outputs : fillVolumeTargetMl + * @param value : override target reservoir fill volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetReservoirFillVolumeMlOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + fillVolumeTargetMl.ovData = value; + fillVolumeTargetMl.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetReservoirFillVolumeMlOverride function resets the override of the \n + * target reservoir fill volume. + * @details + * Inputs : fillVolumeTargetMl + * Outputs : fillVolumeTargetMl + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetReservoirFillVolumeMlOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + fillVolumeTargetMl.override = OVERRIDE_RESET; + fillVolumeTargetMl.ovData = fillVolumeTargetMl.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetReservoirDrainVolumeMlOverride function overrides the target \n + * reservoir drain volume (in mL). + * @details + * Inputs : drainVolumeTargetMl + * Outputs : drainVolumeTargetMl + * @param value : override target reservoir drain volume (in mL) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetReservoirDrainVolumeMlOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + drainVolumeTargetMl.ovData = value; + drainVolumeTargetMl.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetReservoirDrainVolumeMlOverride function resets the override of the \n + * target reservoir drain volume. + * @details + * Inputs : drainVolumeTargetMl + * Outputs : drainVolumeTargetMl + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetReservoirDrainVolumeMlOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + drainVolumeTargetMl.override = OVERRIDE_RESET; + drainVolumeTargetMl.ovData = drainVolumeTargetMl.ovInitData; + } + + return result; +} Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -rf267c42c91fd6e22db80e19039b8993582de51e9 -rf6413fefb94be1273323d4193bba3c522cf8ecb4 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision f267c42c91fd6e22db80e19039b8993582de51e9) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision f6413fefb94be1273323d4193bba3c522cf8ecb4) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2020 Diality Inc. - All Rights Reserved. * @@ -19,6 +19,15 @@ #include "DGCommon.h" +/** + * @defgroup Reservoirs Reservoirs + * @brief Reservoirs service module. + * Maintains reservoir set points and handles reservoir related commands from the HD + * + * @addtogroup Reservoirs + * @{ + */ + // ********** public definitions ********** /// Enumeration of reservoirs TODO - move to a Reservoirs.h in Services? @@ -34,6 +43,21 @@ void initReservoirs( void ); BOOL startFill( RESERVOIR_ID_T resID, U32 fillToVolMl, F32 targetPrimeTemp, F32 targetTrimTemp ); // handle fill command from HD +BOOL stopFill( void ); // handle stop fill command from HD BOOL startDrain( RESERVOIR_ID_T resID, U32 drainToVolMl ); // handle drain command from HD +BOOL stopDrain( void ); // handle stop drain command from HD +DATA_GET_PROTOTYPE( RESERVOIR_ID_T, getActiveReservoir ); +DATA_GET_PROTOTYPE( U32, getReservoirFillVolumeTargetMl ); +DATA_GET_PROTOTYPE( U32, getReservoirDrainVolumeTargetMl ); + +BOOL testSetDGActiveReservoirOverride( RESERVOIR_ID_T value ); +BOOL testResetDGActiveReservoirOverride( void ); +BOOL testSetReservoirFillVolumeMlOverride( U32 value ); +BOOL testResetReservoirFillVolumeMlOverride( void ); +BOOL testSetReservoirDrainVolumeMlOverride( U32 value ); +BOOL testResetReservoirDrainVolumeMlOverride( void ); + +/**@}*/ + #endif