Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r9a45dcbdfae33fc06479d99b8d52bada8f682194 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 9a45dcbdfae33fc06479d99b8d52bada8f682194) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -37,14 +37,6 @@ #define START_DG_CMD TRUE ///< Parameter for DG start/stop command function. True = start. #define STOP_DG_CMD FALSE ///< Parameter for DG start/stop command function. False = stop. -// TODO remove -#define RESERVOIR_SETTLE_TIME_MS 5000 ///< Time (in ms) allotted for reservoir to settle (after fill, before drain). - -#define MAX_RESERVOIR_VOLUME_ML 1950.0 ///< Maximum reservoir volume. Switch reservoirs if active reservoir exceeds this volume. - -#define MAX_RESERVOIR_DEPLETION_TIME_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Maximum allowed depletion time in milliseconds. -// TODO remove - #define SIZE_OF_LARGE_LOAD_CELL_AVG 32 ///< Large load cell moving average has 32 samples. #define DIALYSATE_TEMP_PERSISTENCE_PERIOD ( 3 * MS_PER_SECOND ) ///< Persistence period for dialysate temperature alarm. @@ -54,23 +46,6 @@ #define DIALYSATE_TEMP_HIGH_LIMIT_C 42.0 ///< Dialysate high temperature limit in degree C. #define DIALYSATE_TEMP_LOW_LIMIT_C 33.0 ///< Dialysate low temperature limit in degree C. -// TODO remove -/// 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, // TODO remove ///< 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_FILL_SETTLE_STATE, ///< Wait a bit for filled reservoir to settle before getting baseline weight (volume). - TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RES_SWITCH_STATE, // TODO remove ///< Wait for active reservoir to be consumed and switch cmd given - then back to flush DG lines state. - TREATMENT_RESERVOIR_MGMT_WAIT_FOR_SWITCH_SETTLE_STATE, ///< Wait for inactive reservoir to settle before getting final weight (volume) before starting to drain. - NUM_OF_TREATMENT_RESERVOIR_MGMT_STATES ///< Number of treatment reservoir mgmt. states. -} TREATMENT_RESERVOIR_MGMT_STATE_T; -// TODO remove - - // ********** private data ********** // DG status @@ -81,9 +56,7 @@ static BOOL dgTrimmerHeaterOn = FALSE; ///< Flag indicates whether we have commanded the DG to start or stop the trimmer heater. // State machine states -/// Current state of treatment mode reservoir management. -static TREATMENT_RESERVOIR_MGMT_STATE_T currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; -static U32 resMgmtTimer = 0; ///< Used for keeping state time. +static U32 timeStartMS = 0; // TODO is this needed? // DG sensor data static F32 dgDialysateTemp = 0.0; ///< Dialysate temperature reported by the DG. @@ -120,35 +93,13 @@ static DG_DISINFECT_UI_STATES_T disinfectsStatus; ///< DG disinfects status. static DG_MIXING_RATIOS_T dgMixingRatios; ///< DG mixing ratios. -// TOD remove -// TODO New variables for the reservoir management -// TODO add these to the init function -static U32 timeStartMS = 0; ///< Used to track time pumping from active reservoir (for volume used calculation). -static U32 timeDepletionMS = 0; -static F32 volTotalMl = 0.0; -static F32 volSpentMl = 0.0; ///< Accumulated volume used from active reservoir. - -// TODO set the reservoirs alarms properties -// TODO remove - // DG command response static DG_CMD_RESPONSE_T dgCmdResp[ NUM_OF_DG_COMMANDS ]; ///< Keep the latest DG command response for each command. // ********** private function prototypes ********** static void checkDGRestart( void ); -// Reservoir management functions -static void checkReservoirDepletionTime( void ); -static void checkReservoirMaxVolume( void ); - -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtStartState( void ); -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtDrainState( void ); -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitToFillState( void ); -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtFillState( void ); -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForFillSettleState( void ); -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForSwitchSettleState( void ); - /*********************************************************************//** * @brief * The initDGInterface function initializes the DGInterface module. @@ -218,23 +169,6 @@ checkDGRestart(); } - -/*********************************************************************//** - * @brief - * The initTreatmentReservoirMgmt function initializes the treatment reservoir - * management state machine. - * @details Inputs: none - * @details Outputs: treatment reservoir management state machine initialized. - * @return none - *************************************************************************/ -void initTreatmentReservoirMgmt( void ) -{ - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; - resMgmtTimer = 0; - timeStartMS = getMSTimerCount(); - volSpentMl = 0.0; -} - /*********************************************************************//** * @brief * The dialysisResumed function initializes the reservoir re-use timer @@ -248,223 +182,8 @@ timeStartMS = getMSTimerCount(); } -/*********************************************************************//** - * @brief - * The execTreatmentReservoirMgmt function executes the state machine for the - * reservoir management during treatment mode. - * @details Inputs: none - * @details Outputs: DG reservoirs (drains & fills) managed. - * @return none - *************************************************************************/ -void execTreatmentReservoirMgmt( void ) // TODO remove this exec DEBUG_DENALI yes later not now! -{ - DG_OP_MODE_T dgOpMode = getDGOpMode(); - U32 dgSubMode = getDGSubMode(); - U32 msSinceLastVolumeCalc = calcTimeSince( timeStartMS ); - F32 flowRateMlPerMs = (F32)getTargetDialInFlowRate() / (F32)( MS_PER_SECOND * SEC_PER_MIN ); - - // Calculate volume used from active reservoir - do not accumulate if saline bolus in progress - if ( SALINE_BOLUS_STATE_IN_PROGRESS != getSalineBolusState() ) - { - volSpentMl += ( flowRateMlPerMs * msSinceLastVolumeCalc ); - } - timeStartMS = getMSTimerCount(); // TODO this should go to one of the handlers probably wait for reservoir to settle state prior to switching to drain - - // Alarm if active reservoir is full and inactive reservoir is not yet ready - if ( getReservoirWeight( getDGActiveReservoir() ) > MAX_RESERVOIR_VOLUME_ML ) - { - if ( currentTrtResMgmtState < TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RES_SWITCH_STATE ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_RESERVOIR_FULL_AND_DG_NOT_READY_TO_SWITCH, getReservoirWeight( getDGActiveReservoir() ), (F32)currentTrtResMgmtState ) - } - else - { - clearAlarmCondition( ALARM_ID_HD_RESERVOIR_FULL_AND_DG_NOT_READY_TO_SWITCH ); - } - } - - // Treatment reservoir mgmt. state machine - switch ( currentTrtResMgmtState ) - { - case TREATMENT_RESERVOIR_MGMT_START_STATE: - currentTrtResMgmtState = handleReservoirMgmtStartState(); - break; - case TREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: // TODO remove - if ( DG_MODE_GENE == dgOpMode ) - { - if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) - { - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); - } - } - 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_GENE == dgOpMode ) - { - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE; - } - break; - - case TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE: - // Delay fill start if we have paused treatment? - if ( getTreatmentState() == TREATMENT_DIALYSIS_STATE ) - { - if ( DG_MODE_GENE == dgOpMode ) - { - if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) - { - U32 fillToVolume = FILL_RESERVOIR_TO_VOLUME_ML; - - if ( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) <= SLOW_DIALYSATE_FLOW_ML_MIN ) - { - fillToVolume = FILL_RESERVOIR_TO_VOLUME_LOW_FLOW_ML; - } - cmdStartDGFill( fillToVolume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); - } - } - 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_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) - { - resMgmtTimer = getMSTimerCount(); - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_WAIT_FOR_FILL_SETTLE_STATE; - } - break; - - case TREATMENT_RESERVOIR_MGMT_WAIT_FOR_FILL_SETTLE_STATE: - if ( TRUE == didTimeout( resMgmtTimer, RESERVOIR_SETTLE_TIME_MS ) ) - { - 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). - // Switch reservoirs when active reservoir is spent or full (i.e. we have pumped fill volume through dialyzer) and DG ready - if ( ( volSpentMl >= (F32)dgReservoirFillVolumeTargetSet ) || ( getReservoirWeight( getDGActiveReservoir() ) > MAX_RESERVOIR_VOLUME_ML ) ) - { - DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir(); - - // Signal dialysis sub-mode to capture baseline volume for next reservoir. - setStartReservoirVolume( inactiveRes ); - // Command DG to switch reservoirs - cmdSetDGActiveReservoir( inactiveRes ); - // Signal dialysis sub-mode to switch reservoirs - signalReservoirsSwitched(); - volSpentMl = 0.0; - // Wait for used reservoir to settle - resMgmtTimer = getMSTimerCount(); - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_WAIT_FOR_SWITCH_SETTLE_STATE; - } - break; - - case TREATMENT_RESERVOIR_MGMT_WAIT_FOR_SWITCH_SETTLE_STATE: - if ( TRUE == didTimeout( resMgmtTimer, RESERVOIR_SETTLE_TIME_MS ) ) - { - // Signal dialysis sub-mode to capture final volume of prior reservoir after settling. - setFinalReservoirVolume(); - // Reset to start state to restart drain, fill, switch process. - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; - } - break; - - default: - // TODO - s/w fault - currentTrtResMgmtState = TREATMENT_RESERVOIR_MGMT_START_STATE; - break; - } -} - - -static void checkReservoirDepletionTime( void ) -{ - if ( TRUE == didTimeout( timeStartMS, MAX_RESERVOIR_DEPLETION_TIME_MS ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_ACTIVE_RESERVOIR_DEPLETION_TIME_OUT, calcTimeSince( timeStartMS ) ) - } -} - - -static void checkReservoirMaxVolume( void ) -{ - DG_RESERVOIR_ID_T active = getDGActiveReservoir(); - - if ( getReservoirWeight( active ) >= MAX_RESERVOIR_VOLUME_ML ) - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_ACTIVE_RESERVOIR_WEIGHT_OUT_OF_RANGE, getReservoirWeight( active ) ) - } -} - -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtStartState( void ) -{ - TREATMENT_RESERVOIR_MGMT_STATE_T state = TREATMENT_RESERVOIR_MGMT_START_STATE; - DG_OP_MODE_T dgOpMode = getDGOpMode(); - - if ( DG_MODE_GENE == dgOpMode ) - { - if ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) - { - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); - } - } - else if ( DG_MODE_DRAI == dgOpMode ) - { - state = TREATMENT_RESERVOIR_MGMT_DRAIN_RESERVOIR_STATE; - } - - return state; -} -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtDrainState( void ) -{ - TREATMENT_RESERVOIR_MGMT_STATE_T state = TREATMENT_RESERVOIR_MGMT_DRAIN_RESERVOIR_STATE; - DG_OP_MODE_T dgOpMode = getDGOpMode(); - - if ( DG_MODE_GENE == dgOpMode ) - { - state = TREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE; - } - - return state; -} - -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitToFillState( void ) -{ - -} -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtFillState( void ) -{ - -} -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForFillSettleState( void ) -{ - -} -static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForSwitchSettleState( void ) -{ - -} - - /*********************************************************************//** * @brief * The getDGOpMode function gets the current DG operating mode. Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -r9a45dcbdfae33fc06479d99b8d52bada8f682194 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 9a45dcbdfae33fc06479d99b8d52bada8f682194) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -33,12 +33,7 @@ // ********** public definitions ********** #define DEFAULT_TARGET_FILL_FLOW_RATE_LPM 0.8 ///< Default target fill flow rate in L/min. - -// TODO remove the #defines -#define DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during treatment. -#define FILL_RESERVOIR_TO_VOLUME_ML 1700 ///< Fill reservoir to this volume (in mL) during treatment. -#define FILL_RESERVOIR_TO_VOLUME_LOW_FLOW_ML 1300 ///< Fill reservoir to this volume (in mL) during treatment if dialysate flow is slow. -#define SLOW_DIALYSATE_FLOW_ML_MIN 250 ///< Threshold for slow dialysate flow designation. +#define DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during treatment. /// DG Concentrate ratios data structure. typedef struct @@ -122,9 +117,7 @@ void execDGInterfaceMonitor( void ); -void initTreatmentReservoirMgmt( void ); // TODO remove void dialysisResumed( void ); -void execTreatmentReservoirMgmt( void ); // TODO remove DG_OP_MODE_T getDGOpMode( void ); U32 getDGSubMode( void ); Index: firmware/App/Modes/ConsumableSelfTest.c =================================================================== diff -u -r9a45dcbdfae33fc06479d99b8d52bada8f682194 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 9a45dcbdfae33fc06479d99b8d52bada8f682194) +++ firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -18,6 +18,7 @@ #include "ConsumableSelfTest.h" #include "DGInterface.h" #include "ModePreTreat.h" +#include "Reservoirs.h" /** * @addtogroup ConsumableSelfTest Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r9a45dcbdfae33fc06479d99b8d52bada8f682194 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 9a45dcbdfae33fc06479d99b8d52bada8f682194) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -25,6 +25,7 @@ #include "PresOccl.h" #include "PreTreatmentRecirc.h" #include "Prime.h" +#include "Reservoirs.h" #include "SelfTests.h" #include "SampleWater.h" #include "SystemCommMessages.h" Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r284948857d8d212e25bd379fa3e7f6305fbc56e4 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 284948857d8d212e25bd379fa3e7f6305fbc56e4) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -784,7 +784,6 @@ // Otherwise, execute state machine for treatment dialysis sub-mode else { - // execTreatmentReservoirMgmt(); TODO DEBUG_DENALI remove later, yes later not now! execReservoirs(); execDialysis(); // Handle alarm stoppage Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rc7890e8beda1708d2dea0762dcc40ca5a12222e3 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c7890e8beda1708d2dea0762dcc40ca5a12222e3) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -1963,6 +1963,27 @@ return result; } +/*********************************************************************//** + * @brief + * The handleDGMixingRatios function handles a concentrate mixing ratios and + * prepare fill time broadcast from DG. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleDGMixingRatios( MESSAGE_T *message ) +{ + if ( message->hdr.payloadLen == sizeof( DG_MIXING_RATIOS_T ) ) + { + DG_MIXING_RATIOS_T payload; + + memcpy( &payload, message->payload, sizeof( DG_MIXING_RATIOS_T ) ); + + setDGMixingRatios( payload ); + } +} + #ifdef EMC_TEST_BUILD BOOL broadcastCANErrorCount( U32 count ) { @@ -6779,25 +6800,4 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } -/*********************************************************************//** - * @brief - * The handleDGMixingRatios function handles a concentrate mixing ratios and - * prepare fill time broadcast from DG. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleDGMixingRatios( MESSAGE_T *message ) -{ - if ( message->hdr.payloadLen == sizeof( DG_MIXING_RATIOS_T ) ) - { - DG_MIXING_RATIOS_T payload; - - memcpy( &payload, message->payload, sizeof( DG_MIXING_RATIOS_T ) ); - - setDGMixingRatios( payload ); - } -} - /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r9a45dcbdfae33fc06479d99b8d52bada8f682194 -r182a81ed78f66f05ef286e2456c6c86f5e4f3e28 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9a45dcbdfae33fc06479d99b8d52bada8f682194) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 182a81ed78f66f05ef286e2456c6c86f5e4f3e28) @@ -308,7 +308,7 @@ // MSG_ID_HD_DISPOSABLE_REMOVAL_CONFIRM_RESPONSE BOOL sendDisposableRemovalConfirmResponse( BOOL accepted, U32 reason ); -// MSG_ID_UI_TREATMENT_LOG_DATA_REQUESTsendDGPOSTResultRequest +// MSG_ID_UI_TREATMENT_LOG_DATA_REQUEST void handleUITreatmentLogDataRequest( MESSAGE_T *message ); // MSG_ID_HD_TREATMENT_LOG_DATA_RESPONSE @@ -406,6 +406,9 @@ // MSG_ID_DG_REQUEST_CONCENTRATE_RATIOS BOOL sendDGConcentrateMixingRatiosRequest( void ); +// MSG_ID_DG_CONCENTRATE_MIXING_RATIOS_DATA +void handleDGMixingRatios( MESSAGE_T *message ); + #ifdef EMC_TEST_BUILD // MSG_ID_CAN_ERROR_COUNT BOOL broadcastCANErrorCount( U32 count ); @@ -766,9 +769,6 @@ // MSG_ID_HD_STOP_RTC_CLOCK void handleStopHDRTCClock( MESSAGE_T *message ); -// MSG_ID_DG_CONCENTRATE_MIXING_RATIOS_DATA -void handleDGMixingRatios( MESSAGE_T *message ); - /**@}*/ #endif