Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204 -r32f48aca25ae69089c2cf77936239cce6daac229 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 32f48aca25ae69089c2cf77936239cce6daac229) @@ -56,10 +56,10 @@ // DG status static DG_OP_MODE_T dgCurrentOpMode = DG_MODE_INIT; ///< Current DG operation mode. -static U32 dgSubMode = 0; ///< Current state (sub-mode) of current DG operation mode. +static U32 dgSubMode = 0; ///< Current state (sub-mode) of current DG operation mode. +static BOOL dgStartCommandSent = FALSE; ///< Flag indicates command to start DG has been sent. static BOOL dgStarted = FALSE; ///< Flag indicates whether we have commanded the DG to start or stop. static BOOL dgTrimmerHeaterOn = FALSE; ///< Flag indicates whether we have commanded the DG to start or stop the trimmer heater. -static BOOL dgWaterSampled = FALSE; ///< Flag indicates whether we have commanded the DG to sample water. // State machine states /// Current state of treatment mode reservoir management. @@ -120,7 +120,6 @@ dgStarted = FALSE; dgTrimmerHeaterOn = FALSE; - dgWaterSampled = FALSE; dgPrimaryTempSet = 0.0; dgTrimmerTempSet = 0.0; dgActiveReservoirSet = DG_RESERVOIR_2; @@ -693,7 +692,7 @@ *************************************************************************/ void cmdStartDG( void ) { - dgStarted = TRUE; + dgStartCommandSent = TRUE; sendDGStartStopCommand( START_DG_CMD ); } @@ -798,8 +797,22 @@ { dgCmdResp[ DG_CMD_START_FILL ].commandID = DG_CMD_NONE; dgReservoirFillVolumeTargetSet = fillToVolMl; - sendDGFillCommand( fillToVolMl ); + sendDGFillCommand( DG_CMD_START, fillToVolMl ); } + +/*********************************************************************//** + * @brief + * The cmdStopDGFill function sends a fill command with stop parameter message to the DG. + * @details Inputs: none + * @details Outputs: fill command with stop parameter sent to DG. + * @return none + *************************************************************************/ +void cmdStopDGFill( void ) +{ + dgCmdResp[ DG_CMD_STOP_FILL ].commandID = DG_CMD_NONE; + dgReservoirFillVolumeTargetSet = 0; + sendDGFillCommand( DG_CMD_STOP, 0 ); +} /*********************************************************************//** * @brief @@ -828,10 +841,9 @@ * @details Outputs: sample water command sent to DG. * @return none *************************************************************************/ -void cmdDGSampleWater( void ) +void cmdDGSampleWater( SAMPLE_WATER_CMD_T cmd ) { - dgWaterSampled = TRUE; - sendDGSampleWaterCommand(); + sendDGSampleWaterCommand( cmd ); } /*********************************************************************//** @@ -897,7 +909,33 @@ return hasCommandResp; } +/*********************************************************************//** + * @brief + * The checkDGRestart function checks to see if DG has restarted after started + * by HD and triggers appropriate alarm. + * @details Inputs: dgStarted + * @details Outputs: triggers a fault alarm if DG restarted + * @return none + *************************************************************************/ +void checkDGRestart( void ) +{ + if ( ( dgStartCommandSent == TRUE ) && ( DG_MODE_CIRC == dgCurrentOpMode ) ) + { + dgStartCommandSent = FALSE; + dgStarted = TRUE; + } + if ( TRUE == dgStarted ) + { + if ( ( DG_MODE_FAUL != dgCurrentOpMode ) && ( DG_MODE_CIRC != dgCurrentOpMode ) && + ( DG_MODE_FILL != dgCurrentOpMode ) && ( DG_MODE_DRAI != dgCurrentOpMode ) ) + { + activateAlarmNoData( ALARM_ID_DG_RESTARTED_FAULT ); + } + } +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -r6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204 -r32f48aca25ae69089c2cf77936239cce6daac229 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 32f48aca25ae69089c2cf77936239cce6daac229) @@ -32,7 +32,7 @@ // ********** public definitions ********** -#define DRAIN_RESERVOIR_TO_VOLUME_ML 200 ///< Drain reservoir to this volume (in mL) during treatment. +#define DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during treatment. #ifndef V1_5_SYSTEM #define FILL_RESERVOIR_TO_VOLUME_ML 1700 ///< Fill reservoir to this volume (in mL) during treatment. #else @@ -148,14 +148,17 @@ void cmdStopDG( void ); void cmdSetDGActiveReservoir( DG_RESERVOIR_ID_T resID ); void cmdChangeDGValveSetting( DG_VALVE_SETTING_ID_T valveSettingID ); -void cmdStartDGFill( U32 fillToVolMl ); +void cmdStartDGFill( U32 fillToVolMl ); +void cmdStopDGFill( void ); void cmdStartDGDrain( U32 drainToVolMl, BOOL tareLoadCell ); void cmdStartDGTrimmerHeater( void ); -void cmdStopDGTrimmerHeater( void ); -void cmdDGSampleWater( void ); +void cmdStopDGTrimmerHeater( void ); +void cmdDGSampleWater( SAMPLE_WATER_CMD_T cmd ); void handleDGCommandResponse( DG_CMD_RESPONSE_T *dgCmdRespPtr ); BOOL getDGCommandResponse( U32 commandID, DG_CMD_RESPONSE_T *cmdRespPtr ); + +void checkDGRestart( void ); BOOL testSetDialOutLoadCellWeightOverride( U32 sensor, F32 value ); BOOL testResetDialOutLoadCellWeightOverride( U32 sensor ); Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204 -r32f48aca25ae69089c2cf77936239cce6daac229 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 6811f0251b0fa7d27c3e6d5eb16ade2bc88a3204) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 32f48aca25ae69089c2cf77936239cce6daac229) @@ -44,14 +44,6 @@ #define DIALYSATE_PUMP_PRIME_FLOW_RATE 300 ///< Dialysate pump flow rate during priming fluid path. #define LOAD_CELL_VOLUME_NOISE_TOLERANCE 0.05 ///< Allow 5% tolerance on load cell readings. -#define PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during prime. - -#define PRIME_CONSUMED_DIALYSATE_VOLUME_ML 100 ///< Volume of dialysate consumed during prime. - -/// Fill reservoir 1 to this volume (in mL) during prime. -#define PRIME_FILL_RESERVOIR_ONE_VOLUME_ML ( FILL_RESERVOIR_TO_VOLUME_ML - PRIME_CONSUMED_DIALYSATE_VOLUME_ML ) -#define PRIME_FILL_RESERVOIR_TWO_VOLUME_ML 500 ///< Fill reservoir 2 to this volume (in mL) during prime. - #define NO_AIR_DETECTED_COUNT ( 10 * MS_PER_SECOND ) ///< No air detected time period count. #define PURGE_AIR_TIME_OUT_COUNT ( 30 * MS_PER_SECOND ) ///< Time period count for purge air time out. #define MIN_LOAD_CELL_STEADY_VOLUME_TIME ( 10 * MS_PER_SECOND ) ///< Minimum time load cell reading need to remain steady in ms. @@ -85,9 +77,7 @@ static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. -static BOOL primeStopRequested; ///< Flag indicates alarm requesting to stop prime. static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. -static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been filled. static U32 noAirDetectedStartTime; ///< starting time when detecting no air. static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. @@ -101,7 +91,6 @@ static void resetPrimeFlags(); static void handlePrimePauseRequest( void ); static void broadcastPrimingStatus( void ); -static void execPrimeReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWaitForUserStartState( void ); @@ -146,9 +135,6 @@ primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; - reservoirFilledStatus[ DG_RESERVOIR_1 ] = FALSE; - reservoirFilledStatus[ DG_RESERVOIR_2 ] = FALSE; - setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); @@ -169,7 +155,6 @@ switch ( currentPrimeState ) { case HD_PRIME_START_STATE: - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); #ifdef SKIP_PRIMING currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; #else @@ -235,9 +220,18 @@ // Broadcast priming data broadcastPrimingStatus(); +} - // Exec reservoir management for priming - execPrimeReservoirMgmt(); +/*********************************************************************//** + * @brief + * The getPrimeState function returns the current state of prime sub-mode. + * @details Inputs: currentPrimeState + * @details Outputs: none + * @return current prime state + *************************************************************************/ +U32 getPrimeState( void ) +{ + return (U32)currentPrimeState; } /*********************************************************************//** @@ -254,28 +248,38 @@ /*********************************************************************//** * @brief - * The signalResumePrime function signals the prime sub-mode to resume - * previous operation. + * The signalStartPrime function signals the prime sub-mode the user requested + * to start priming operation. * @details Inputs: none - * @details Outputs: primeResumeRequested + * @details Outputs: primeStartRequested * @return none *************************************************************************/ -void signalResumePrime( void ) +void signalStartPrime( void ) { - primeResumeRequested = TRUE; + BOOL accepted = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + + if ( HD_PRIME_WAIT_FOR_USER_START_STATE == currentPrimeState ) + { + primeStartRequested = TRUE; + accepted = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + + sendStartPrimeCmdResponse( accepted, rejReason ); } /*********************************************************************//** * @brief - * The signalStopPrime function signals the prime sub-mode to stop when an - * alarm with stop property has been triggered. + * The signalResumePrime function signals the prime sub-mode to resume + * previous operation. * @details Inputs: none - * @details Outputs: primeStopRequested + * @details Outputs: primeResumeRequested * @return none *************************************************************************/ -void signalStopPrime( void ) +void signalResumePrime( void ) { - primeStopRequested = TRUE; + primeResumeRequested = TRUE; } /*********************************************************************//** @@ -287,10 +291,8 @@ *************************************************************************/ static void resetPrimeFlags( void ) { - // TODO: set to false after integration with UI - primeStartRequested = TRUE; + primeStartRequested = FALSE; primeResumeRequested = FALSE; - primeStopRequested = FALSE; } /*********************************************************************//** @@ -302,13 +304,12 @@ *************************************************************************/ static void handlePrimePauseRequest( void ) { - if ( ( TRUE == primeStopRequested ) && ( HD_PRIME_PAUSE != currentPrimeState ) ) + if ( ( TRUE == doesAlarmStatusIndicateStop() ) && ( HD_PRIME_PAUSE != currentPrimeState ) ) { signalDialOutPumpHardStop(); signalDialInPumpHardStop(); signalBloodPumpHardStop(); - primeStopRequested = FALSE; primePauseStartTime = getMSTimerCount(); previousPrimeState = currentPrimeState; currentPrimeState = HD_PRIME_PAUSE; @@ -335,7 +336,6 @@ if ( ++primeStatusBroadcastTimerCounter >= PRIME_DATA_PUB_INTERVAL ) { PRIMING_DATA_PAYLOAD_T primeData; - primeData.currentPrimeState = currentPrimeState; primeData.totalTime = MAX_PRIME_TIME; primeData.remainingTime = MAX_PRIME_TIME - elapsedPrimeTimeInSecs; @@ -346,126 +346,6 @@ /*********************************************************************//** * @brief - * The execPrimeReservoirMgmt function executes the state machine for the - * reservoir management during pre-treatment prime sub-mode. - * @details Inputs: currentReservoirMgmtState - * @details Outputs: DG reservoirs' fills managed. - * @return none - *************************************************************************/ -static void execPrimeReservoirMgmt( void ) -{ - DG_CMD_RESPONSE_T dgCmdResp; - DG_OP_MODE_T dgOpMode = getDGOpMode(); - U32 dgSubMode = getDGSubMode(); - - // treatment reservoir mgmt. state machine - switch ( currentReservoirMgmtState ) - { - case PRIME_RESERVOIR_MGMT_START_STATE: - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; - break; - - case PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: - if ( DG_MODE_CIRC == dgOpMode ) - { - if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP; - cmdStartDGDrain( PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); - } - } - else - { - // TODO Handle when DG mode is out of sync - } - break; - - case PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP: - if ( ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; - } - - if ( DG_MODE_DRAI == dgOpMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_DRAIN_STATE; - } - break; - - case PRIME_RESERVOIR_MGMT_DRAIN_STATE: - if ( DG_MODE_CIRC == dgOpMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_FILL_STATE; - } - break; - - case PRIME_RESERVOIR_MGMT_START_FILL_STATE: - if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP; - - if ( DG_RESERVOIR_1 == getDGInactiveReservoir() ) - { - cmdStartDGFill( PRIME_FILL_RESERVOIR_ONE_VOLUME_ML ); - } - else - { - cmdStartDGFill( PRIME_FILL_RESERVOIR_TWO_VOLUME_ML ); - } - } - break; - - case PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP: - if ( ( TRUE == getDGCommandResponse( DG_CMD_START_FILL, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_FILL_STATE; - } - - if ( DG_MODE_FILL == dgOpMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FILL_STATE; - } - break; - - case PRIME_RESERVOIR_MGMT_FILL_STATE: - if ( DG_MODE_CIRC == dgOpMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE; - } - break; - - case PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE: - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE; - - if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) - { - reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE; - } - else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) - { - reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; - } - break; - - case PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE: - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE; - - if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; - } - break; - - default: - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_RESERVOIR_MGMT_INVALID_STATE, (U32)currentReservoirMgmtState ); - break; - } -} - -/*********************************************************************//** - * @brief * The purgeAirValvesBloodPumpControl function controls valves and blood pump * to purge air. * @details Inputs: none @@ -495,7 +375,12 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_WAIT_FOR_USER_START_STATE; + // Keep updating start time until the user requested priming + primeStartTime = getMSTimerCount(); + +#ifndef SKIP_UI_INTERACTION if ( TRUE == primeStartRequested ) +#endif { primeStartRequested = FALSE; state = HD_PRIME_SALINE_SETUP_STATE; @@ -594,10 +479,8 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; - if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); @@ -669,9 +552,8 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; - if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) + if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); signalDialOutPumpHardStop(); setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); @@ -738,19 +620,16 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_WET_SELF_TESTS_STATE; - if ( TRUE == primeStopRequested ) + if ( TRUE == primeResumeRequested ) { signalResumeSelfTests(); } - if ( TRUE == primeResumeRequested ) - { - signalStopSelfTests(); - } - +#ifndef SKIP_WET_SELF_TESTS execWetSelfTests(); if ( TRUE == isWetSelfTestsPassed() ) +#endif { state = HD_PRIME_COMPLETE; }