Index: firmware/App/Controllers/Ejector.c =================================================================== diff -u -r2d40deb50ffb27667c3e57f427b1e197e163910e -re130387b9e8ed54237a6e4c3020222060c2be5a9 --- firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision 2d40deb50ffb27667c3e57f427b1e197e163910e) +++ firmware/App/Controllers/Ejector.c (.../Ejector.c) (revision e130387b9e8ed54237a6e4c3020222060c2be5a9) @@ -60,18 +60,19 @@ static BOOL ejectorHomeRequested; ///< Flag indicating that ejector home operation is requested. static BOOL ejectorRetractRequested; ///< Flag indicating that ejector retract operation is requested. static BOOL ejectorExtendRequested; ///< Flag indicating that ejector extend operation is requested. +static BOOL ejectorAbortRequested; ///< Flag indicating that ejector abort operation in requested. // ********** private function prototypes ********** static EJECTOR_STATE_T handleEjectorStartState( void ); static EJECTOR_STATE_T handleEjectorHomingState( void ); -static EJECTOR_STATE_T handleEjectorRetractedState ( void ); -static EJECTOR_STATE_T handleEjectorExtendedState ( void ); -static EJECTOR_STATE_T handleEjectorRetractingState ( void ); -static EJECTOR_STATE_T handleEjectorExtendingState ( void ); +static EJECTOR_STATE_T handleEjectorRetractedState( void ); +static EJECTOR_STATE_T handleEjectorExtendedState( void ); +static EJECTOR_STATE_T handleEjectorRetractingState( void ); +static EJECTOR_STATE_T handleEjectorExtendingState( void ); static EJECTOR_STATE_T handleEjectorRetractBackoffState( void ); static EJECTOR_STATE_T handleEjectorDirChangeStopState( void ); -static void setEjectorSpeed( F32 speed ); +static EJECTOR_STATE_T handleEjectorAbortState( void ); static void resetEjectorFlags( void ); static void publishEjectorData( void ); @@ -104,14 +105,15 @@ * The resetEjectorFlags function resets the ejector flags to FALSE. * @details \b Inputs: none * @details \b Outputs: ejectorHomeRequested, ejectorRetractRequested, - * ejectorExtendRequested + * ejectorExtendRequested, ejectorAbortRequested * @return none *************************************************************************/ static void resetEjectorFlags( void ) { ejectorHomeRequested = FALSE; ejectorRetractRequested = FALSE; ejectorExtendRequested = FALSE; + ejectorAbortRequested = FALSE; } /*********************************************************************//** @@ -194,6 +196,20 @@ /*********************************************************************//** * @brief + * The abortEjectorOperation function requests an ejector abort operation. + * @details \b Inputs: none + * @details \b Outputs: ejectorAbortRequested + * @return none + *************************************************************************/ +void abortEjectorOperation( void ) +{ + setEjectorMotorSpeed( EJECTOR_OFF_MOTOR_SPEED_RPM ); + // Set the flag to TRUE regardless of where the ejector is at + ejectorAbortRequested = TRUE; +} + +/*********************************************************************//** + * @brief * The getEjectorState function returns the current ejector control state machine. * @details \b Inputs: currentEjectorState * @details \b Outputs: none @@ -214,6 +230,12 @@ *************************************************************************/ void execEjectorController( void ) { + if ( TRUE == ejectorAbortRequested ) + { + // If abort has been called, set it to abort state no matter where we are at. + currentEjectorState = EJECTOR_STATE_ABORT; + } + switch( currentEjectorState ) { case EJECTOR_STATE_INIT: @@ -248,6 +270,10 @@ currentEjectorState = handleEjectorDirChangeStopState(); break; + case EJECTOR_STATE_ABORT: + currentEjectorState = handleEjectorAbortState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_EJECTOR_INVALID_STATE, (U32)currentEjectorState ) break; @@ -449,6 +475,28 @@ /*********************************************************************//** * @brief + * The handleEjectorAbortState function handles the abort state of the + * ejector control state machine. + * @details \b Inputs: ejectorOperationTimerCounter, ejectorHomeRequested + * @details \b Outputs: ejectorOperationTimerCounter + * @return next state of the ejector control state machine + *************************************************************************/ +static EJECTOR_STATE_T handleEjectorAbortState( void ) +{ + EJECTOR_STATE_T state = EJECTOR_STATE_ABORT; + + if ( TRUE == ejectorHomeRequested ) + { + ejectorOperationTimerCounter = 0; + setEjectorMotorSpeed( EJECTOR_RETRACT_MOTOR_SPEED_RPM ); + state = EJECTOR_STATE_HOMING; + } + + return state; +} + +/*********************************************************************//** + * @brief * The publishEjectorData function constructs and sends the air pump data * broadcast message. * @details \b Message \b Sent: MSG_ID_TD_EJECTOR_DATA Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r51f42cd88bd9c50ed9096a2d1d8ff859a95aff95 -re130387b9e8ed54237a6e4c3020222060c2be5a9 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 51f42cd88bd9c50ed9096a2d1d8ff859a95aff95) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision e130387b9e8ed54237a6e4c3020222060c2be5a9) @@ -15,12 +15,19 @@ * ***************************************************************************/ -#include "Bubbles.h" +#include "AirPump.h" +#include "BloodFlow.h" +#include "Buttons.h" +#include "CpldInterface.h" +#include "Ejector.h" #include "Messaging.h" #include "ModeFault.h" #include "OperationModes.h" +#include "RotaryValve.h" #include "Switches.h" #include "Utilities.h" +#include "Valve3Way.h" +#include "Valves.h" /** * @addtogroup TDFaultMode @@ -33,10 +40,13 @@ static SELF_TEST_STATUS_T faultPOSTSelfTestResult; ///< Fault POST self test result. // ********** private function prototypes ********** +static void transitionToModeFaultState( TD_FAULT_STATE_T newState ); -static TD_FAULT_STATE_T handleFaultStartState( void ); -static TD_FAULT_STATE_T handleFaultRunNVPOSTsState( void ); +static TD_FAULT_STATE_T handleFaultEnergizedActuatorsState( void ); +static TD_FAULT_STATE_T handleFaultDeenergizedActuatorsState( void ); +// TODO keep reading the NV data if came here from POST + /*********************************************************************//** * @brief * The initFaultMode function initializes the Fault Mode unit. @@ -46,8 +56,13 @@ *************************************************************************/ void initFaultMode( void ) { - faultState = TD_FAULT_STATE_START; + faultState = TD_FAULT_ENERGIZED_STATE; faultPOSTSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + + if ( TRUE == isSafetyShutdownActivated() ) + { + faultState = TD_FAULT_DEENERGIZED_STATE; + } } /*********************************************************************//** @@ -59,24 +74,21 @@ *************************************************************************/ U32 transitionToFaultMode( void ) { - TD_OP_MODE_T previousOpMode = getPreviousOperationMode(); -// DD_OP_MODE_T dgOperationMode = getDGOpMode(); + TD_OP_MODE_T previousOpMode = getPreviousOperationMode(); initFaultMode(); + transitionToModeFaultState( faultState ); + // requestAlarmLampPattern( LAMP_PATTERN_FAULT ); // in case we get here before LED POST can take alarm lamp out of manual control. doorClosedRequired( FALSE ); // syringeDetectionRequired( FALSE ); - setVenousBubbleDetectionEnabled( H18_BBLD, FALSE ); + //setVenousBubbleDetectionEnabled( H18_BBLD, FALSE ); setCurrentSubState( NO_SUB_STATE ); // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, FALSE ); -// // Stop trimmer heater -// cmdStopDGTrimmerHeater(); -// // Stop syringe pump -// stopSyringePump(); // Publish POST failure status to UI if fault triggered in Init/POST mode if ( MODE_INIT == previousOpMode ) @@ -102,46 +114,23 @@ *************************************************************************/ U32 execFaultMode( void ) { -// BOOL stop = isStopButtonPressed(); -// DG_OP_MODE_T dgOperationMode = getDGOpMode(); + // The stop button press events are consumed here upon requesting to stop. + isStopButtonPressed(); - // Ensure all pumps are stopped -// signalBloodPumpHardStop(); -// setAirPumpState( AIR_PUMP_STATE_OFF ); - - // Ensure all valves are in safe position -// setValveAirTrap( VALVE_3WAY_COMMON_TO_CLOSED_STATE ); -// setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); -// setValvePosition( H19, VALVE_POSITION_C_CLOSE ); - - // If DG not stopped, stop it -// if ( DG_MODE_GENE == dgOperationMode ) -// { -// cmdStopDG(); -// } - switch( faultState ) { - case TD_FAULT_STATE_START: - faultState = handleFaultStartState(); + case TD_FAULT_ENERGIZED_STATE: + faultState = handleFaultEnergizedActuatorsState(); break; - case TD_FAULT_STATE_RUN_NV_POSTS: - faultState = handleFaultRunNVPOSTsState(); + case TD_FAULT_DEENERGIZED_STATE: + faultState = handleFaultDeenergizedActuatorsState(); break; - case TD_FAULT_STATE_COMPLETE: - // Do nothing unless the test configuration to recover treatment is enabled -// if ( ( TRUE == getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) ) && ( TRUE == hasRecoverFromFaultModeBeenSet() ) ) -// { -// TD_OP_MODE_T prevMode = getPreviousOperationMode(); -// -// requestNewOperationMode( prevMode ); -// } - break; - default: - faultState = TD_FAULT_STATE_COMPLETE; + // Fault in fault mode is needed? + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_FAULT_INVALID_STATE, (U32)faultState ) + faultState = TD_FAULT_ENERGIZED_STATE; break; } @@ -164,52 +153,76 @@ /*********************************************************************//** * @brief - * The handleFaultStartState function handles the start state of the fault mode. + * The transition to mode fault state function. * @details \b Inputs: none * @details \b Outputs: none + * @return none + *************************************************************************/ +static void transitionToModeFaultState( TD_FAULT_STATE_T newState ) +{ + switch ( newState ) + { + case TD_FAULT_ENERGIZED_STATE: + signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + abortEjectorOperation(); + // stopSyringePump(); + break; + + case TD_FAULT_DEENERGIZED_STATE: + signalBloodPumpHardStop(); + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + setValvePosition( H1_VALV, VALVE_POSITION_C_CLOSE ); + setValvePosition( H19_VALV, VALVE_POSITION_C_CLOSE ); + set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); + abortEjectorOperation(); + // stopSyringePump(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_FAULT_INVALID_STATE, (U32)newState ) + break; + } +} + +/*********************************************************************//** + * @brief + * The handleFaultEnergizedActuatorsState function handles the energized state + * of the fault mode. + * @details \b Inputs: none + * @details \b Outputs: none * @return next state *************************************************************************/ -static TD_FAULT_STATE_T handleFaultStartState( void ) +static TD_FAULT_STATE_T handleFaultEnergizedActuatorsState( void ) { - TD_FAULT_STATE_T state = TD_FAULT_STATE_COMPLETE; -// NVDATAMGMT_RECORDS_READ_STATUS_T status = getNVRecordsReadStatus(); -// -// switch ( status ) -// { -// // If the records are queued or already read, go directly to NV POST to process -// // their CRCs. -// case NVDATAMGMT_RECORDS_QUEUED: -// case NVDATAMGMT_RECORDS_READ: -// state = HD_FAULT_STATE_RUN_NV_POSTS; -// break; -// -// // If the NV post was completed prior to transitioning to fault mode, do nothing -// case NVDATAMGMT_RECORDS_CRC_CHECKED: -// state = HD_FAULT_STATE_COMPLETE; -// break; -// } + TD_FAULT_STATE_T state = TD_FAULT_ENERGIZED_STATE; + if ( TRUE == isSafetyShutdownActivated() ) + { + state = TD_FAULT_DEENERGIZED_STATE; + transitionToModeFaultState( state ); + } + return state; } /*********************************************************************//** * @brief - * The handleFaultRunNVPOSTsState function handles running non-volatile POSTs. - * @details \b Inputs: faultPOSTSelfTestResult - * @details \b Outputs: faultPOSTSelfTestResult + * The handleFaultDeenergizedActuatorsState function handles the deenergized state + * of the fault mode. + * @details \b Inputs: none + * @details \b Outputs: none * @return next state *************************************************************************/ -static TD_FAULT_STATE_T handleFaultRunNVPOSTsState( void ) +static TD_FAULT_STATE_T handleFaultDeenergizedActuatorsState( void ) { - TD_FAULT_STATE_T state = TD_FAULT_STATE_RUN_NV_POSTS; -// faultPOSTSelfTestResult = execNVDataMgmtSelfTest(); -// -// // Regardless of the status of the NV POST transition to the complete state. -// if ( ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) || ( SELF_TEST_STATUS_FAILED == faultPOSTSelfTestResult ) ) -// { -// state = HD_FAULT_STATE_COMPLETE; -// } - + TD_FAULT_STATE_T state = TD_FAULT_DEENERGIZED_STATE; + // terminal state return state; } Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -ra5560a2917aa62bcafd8e6a81041ace723237109 -re130387b9e8ed54237a6e4c3020222060c2be5a9 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision a5560a2917aa62bcafd8e6a81041ace723237109) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision e130387b9e8ed54237a6e4c3020222060c2be5a9) @@ -85,6 +85,11 @@ U32 ufState; ///< Ultrafiltration state. } UF_DATA_PAYLOAD_T; +/// Maximum time in this mode before blood sitting alarm given (in general task intervals). +#define MAX_TIME_BLOOD_SITTING ( ( 5 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) +/// Maximum time in this mode before blood sitting warning given (in general task intervals). +#define WARN_TIME_BLOOD_SITTING ( ( 4 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) + #pragma pack(pop) // ********** public function prototypes ********** Index: firmware/App/Monitors/Pressures.c =================================================================== diff -u -rb88a8fd2c5fca8f055d6df1437635692388fcb0d -re130387b9e8ed54237a6e4c3020222060c2be5a9 --- firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision b88a8fd2c5fca8f055d6df1437635692388fcb0d) +++ firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision e130387b9e8ed54237a6e4c3020222060c2be5a9) @@ -88,7 +88,7 @@ #define HIGH_VEN_PRES_ALARM_PERSISTENCE 500 ///< Alarm persistence period for high venous pressure alarm #define PRES_OCCL_ALARM_PERSISTENCE ( 3 * MS_PER_SECOND ) ///< Alarm persistence period for occlusion alarms #define VEN_OCCL_ALARM_PERSISTENCE 100 ///< Alarm persistence period for venous occlusion alarm. -#define AIR_PUMP_TOLERANCE_TIMEOUT_MS (1 * MS_PER_SECOND ) ///< Time to allow increased maximum venous high limit +#define AIR_PUMP_TOLERANCE_TIMEOUT_MS ( 1 * MS_PER_SECOND ) ///< Time to allow increased maximum venous high limit /// Measured arterial pressure is filtered w/ 10 second moving average for pressure compensation of flow. #define SIZE_OF_LONG_ART_ROLLING_AVG ( ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) * 10 )