Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rfee71ca73745dad573b28acd13b66624cceeabc0 -r8e2cfecc47bb3912078b29513f1717c1567f0071 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision fee71ca73745dad573b28acd13b66624cceeabc0) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) @@ -166,25 +166,32 @@ *************************************************************************/ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ) { - switch( action ) + if ( HD_PRE_TREATMENT_PRIME_STATE == currentPreTreatmentState ) { - case ALARM_ACTION_STOP: - break; + signalAlarmActionToPrimeMode( action ); + } + else + { + switch( action ) + { + case ALARM_ACTION_STOP: + break; - case ALARM_ACTION_RESUME: - break; + case ALARM_ACTION_RESUME: + break; - case ALARM_ACTION_END_TREATMENT: - requestNewOperationMode( MODE_POST ); - break; + case ALARM_ACTION_END_TREATMENT: + requestNewOperationMode( MODE_POST ); + break; - case ALARM_ACTION_ACK: - // Nothing to be done here - break; + case ALARM_ACTION_ACK: + // Nothing to be done here + break; - default: - // Ignore - break; + default: + // Ignore + break; + } } } Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r6e07046677cba738be6f78b155f4f23120a43081 -r8e2cfecc47bb3912078b29513f1717c1567f0071 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 6e07046677cba738be6f78b155f4f23120a43081) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) @@ -72,13 +72,17 @@ // ********** private data ********** static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. +static HD_PRE_TREATMENT_PRIME_STATE_T previousPrimeState; ///< Previous state of the prime sub-mode, to use when resuming from pause. static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. static U32 primeStartTime; ///< Starting time of priming (in ms). +static U32 primePauseStartTime; ///< Priming pause start time (in ms). static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static BOOL primeStartReqReceived; ///< Flag to indicate if a request to start priming has been received. +static BOOL primePauseReqReceived; ///< Flag to indicate if a request to pause priming has been received. +static BOOL primeResumeReqReceived; ///< Flag to indicate if a request to resume priming has been received. static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag to indicate if a reservoir has been filled. static U32 noAirDetectedStartTime; ///< starting time when detecting no air. @@ -90,6 +94,7 @@ // ********** private function prototypes ********** +static void handlePrimePauseRequest( void ); static void broadcastPrimingStatus( void ); static void execPrimeReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); @@ -102,6 +107,7 @@ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirTwoFillCompleteState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateBypassState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWetSelfTestsState( void ); +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePause( void ); /*********************************************************************//** * @brief @@ -131,12 +137,19 @@ wetSelfTestsResult = FALSE; primeStartTime = getMSTimerCount(); + primePauseStartTime = 0; primeStatusBroadcastTimerCounter = 0; // TODO: set to false after integration with UI primeStartReqReceived = TRUE; + primeResumeReqReceived = FALSE; + primePauseReqReceived = FALSE; 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, FALSE ); } /*********************************************************************//** @@ -188,12 +201,19 @@ currentPrimeState = handlePrimeWetSelfTestsState(); break; + case HD_PRIME_PAUSE: + currentPrimeState = handlePrimePause(); + break; + default: currentPrimeState = HD_PRIME_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, (U32)currentReservoirMgmtState ); break; } + // Handle prime pause request + handlePrimePauseRequest(); + // Broadcast priming data broadcastPrimingStatus(); @@ -216,6 +236,59 @@ /*********************************************************************//** * @brief + * The signalAlarmActionToPrimeMode function executes the given alarm action + * as appropriate while in Prime Mode. + * @details Inputs: none + * @details Outputs: given alarm action executed + * @param action ID of alarm action to execute + * @return none + *************************************************************************/ +void signalAlarmActionToPrimeMode( ALARM_ACTION_T action ) +{ + switch ( action ) + { + case ALARM_ACTION_STOP: + primePauseReqReceived = TRUE; + break; + + case ALARM_ACTION_RESUME: + primeResumeReqReceived = TRUE; + break; + + case ALARM_ACTION_ACK: + // Nothing to be done here + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, (U32)action ) + break; + } +} + +/*********************************************************************//** + * @brief + * The handlePrimePauseRequest function handles prime pause request. + * @details Inputs: none + * @details Outputs: stop all pumps, switch to prime pause state. + * @return none + *************************************************************************/ +static void handlePrimePauseRequest( void ) +{ + if ( ( TRUE == primePauseReqReceived ) && ( HD_PRIME_PAUSE != currentPrimeState ) ) + { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + signalBloodPumpHardStop(); + + primePauseReqReceived = FALSE; + primePauseStartTime = getMSTimerCount(); + previousPrimeState = currentPrimeState; + currentPrimeState = HD_PRIME_PAUSE; + } +} + +/*********************************************************************//** + * @brief * The broadcastPrimeTimeAndStatus function broadcasts prime status * data during priming. * @details Inputs: pre-treatment time and state data @@ -397,6 +470,7 @@ { purgeAirValvesBloodPumpControl(); purgeAirTimeOutStartTime = getMSTimerCount(); + primeStartReqReceived = FALSE; state = HD_PRIME_SALINE_PURGE_AIR_STATE; } @@ -545,7 +619,7 @@ *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeReservoirTwoFillCompleteState( void ) { - HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) { @@ -617,4 +691,52 @@ return HD_PRIME_WET_SELF_TESTS_STATE; } +/*********************************************************************//** + * @brief + * The handlePrimePause function handles prime pause state. + * @details Inputs: previousPrimeState + * @details Outputs: primeStartTime, primeResumeReqReceived + * @return current state + *************************************************************************/ +static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePause( void ) +{ + HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_PAUSE; + + if ( TRUE == primeResumeReqReceived ) + { + primeResumeReqReceived = FALSE; + primeStartTime += calcTimeSince( primePauseStartTime ); + + switch ( previousPrimeState ) + { + case HD_PRIME_SALINE_SETUP_STATE: + case HD_PRIME_SALINE_PURGE_AIR_STATE: + case HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE: + primeStartReqReceived = TRUE; + state = HD_PRIME_SALINE_SETUP_STATE; + break; + + case HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE: + case HD_PRIME_DIALYSATE_DIALYZER_STATE: + state = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + break; + + case HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE: + case HD_PRIME_DIALYSATE_BYPASS_STATE: + state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; + break; + + case HD_PRIME_WET_SELF_TESTS_STATE: + state = HD_PRIME_WET_SELF_TESTS_STATE; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, (U32)previousPrimeState ); + break; + } + } + + return state; +} + /**@}*/ Index: firmware/App/Modes/Prime.h =================================================================== diff -u -rfee71ca73745dad573b28acd13b66624cceeabc0 -r8e2cfecc47bb3912078b29513f1717c1567f0071 --- firmware/App/Modes/Prime.h (.../Prime.h) (revision fee71ca73745dad573b28acd13b66624cceeabc0) +++ firmware/App/Modes/Prime.h (.../Prime.h) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) @@ -50,6 +50,7 @@ void execPrime( void ); BOOL isWetSelfTestsPassed( void ); +void signalAlarmActionToPrimeMode( ALARM_ACTION_T action ); /**@}*/ Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r8e2cfecc47bb3912078b29513f1717c1567f0071 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8e2cfecc47bb3912078b29513f1717c1567f0071) @@ -238,6 +238,7 @@ SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 + SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;