Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06 -r780d9a73fe04ddd85282c413fbe5984f374f2b61 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 4d2dcd2d5ee3c7684be139b7e560b16d8c3abc06) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 780d9a73fe04ddd85282c413fbe5984f374f2b61) @@ -155,7 +155,7 @@ * @brief * The handlePrimeState function handles priming the blood and dialysate circuits. * @details Inputs: none - * @details Outputs: requested mode transition to treatment mode + * @details Outputs: transition to self test wet state after priming passed * @return current state (sub-mode) *************************************************************************/ static PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ) Index: firmware/App/Modes/Prime.c =================================================================== diff -u -raa2e734a9f69c46bfdd88f138addd369e12bbd0a -r780d9a73fe04ddd85282c413fbe5984f374f2b61 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision aa2e734a9f69c46bfdd88f138addd369e12bbd0a) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 780d9a73fe04ddd85282c413fbe5984f374f2b61) @@ -31,20 +31,38 @@ // ********** private definitions ********** #define BLOOD_PUMP_FLOW_RATE_PURGE_AIR 100 ///< Blood pump flow rate during prime purge air state. -#define BLOOD_PUMP_FLOW_RATE_COLLECT_AIR 300 ///< Blood pump flow rate during prime collect air state. -#define NO_AIR_DETECTED_COUNT ( 5 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< No air detected time period count. -#define PURGE_AIR_TIME_OUT_COUNT ( 5 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Time period count for purge air time out. +#define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT 300 ///< Blood pump flow rate during prime recirculate blood circuit state. +#define NO_AIR_DETECTED_COUNT ( 10 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< No air detected time period count. +#define PURGE_AIR_TIME_OUT_COUNT ( 10 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Time period count for purge air time out. +#define PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML 100 ///< Drain reservoir to this volume (in mL) during prime. +#define PRIME_FILL_RESERVOIR_TO_VOLUME_ML 600 ///< Fill reservoir to this volume (in mL) during prime. + +/// States of the treatment reservoir management state machine. +typedef enum PreTreatmentReservoirMgmt_States +{ + PRETREATMENT_RESERVOIR_MGMT_START_STATE = 0, ///< If DG not already in re-circ mode, try to get it there. + PRETREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE, ///< In DG re-circ, wait for lines to flush - then start draining inactive reservoir. + PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_DRAIN_STATE, ///< Wait for drain to complete. + PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE, ///< Wait for fill to complete. + PRETREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. + NUM_OF_PRETREATMENT_RESERVOIR_MGMT_STATES ///< Number of pre-treatment reservoir mgmt. states. +} PRETREATMENT_RESERVOIR_MGMT_STATE_T; + // ********** private data ********** static PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. +static PRETREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. + static BOOL isPrimeCompleted; ///< Status if prime sequence has been completed. static BOOL primeStartReqReceived; ///< Flag to indicate if a request to start priming has been received. +static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag to indicate if a reservoir has been filled. static U32 noAirDetectedTimerCounter; ///< No air detected timer counter. -static U32 purgeAirTimeOutTimerCount; ///< timer counter for purse air state time out. +static U32 purgeAirTimeOutTimerCount; ///< Timer counter for purse air state time out. // ********** private function prototypes ********** +static void execPreTreatmentReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); static PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ); @@ -70,7 +88,7 @@ * The transitionToPrime function prepares for transition to prime sub-mode. * This function will reset anything required before the start of priming sequence. * @details Inputs: none - * @details Outputs: none + * @details Outputs: currentPrimeState, isPrimeCompleted, primeStartReqReceived, reservoirFilledStatus[] * @return none *************************************************************************/ void transitionToPrime( void ) @@ -79,8 +97,8 @@ isPrimeCompleted = FALSE; primeStartReqReceived = FALSE; - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); - cmdStartDGFill( FILL_RESERVOIR_TO_VOLUME_ML ); + reservoirFilledStatus[ DG_RESERVOIR_1 ] = FALSE; + reservoirFilledStatus[ DG_RESERVOIR_2 ] = FALSE; } /*********************************************************************//** @@ -96,6 +114,7 @@ switch ( currentPrimeState ) { case PRIME_START_STATE: + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); currentPrimeState = PRIME_SALINE_SETUP_STATE; break; @@ -115,6 +134,8 @@ currentPrimeState = handlePrimeDialysateDialyzerState(); break; } + + execPreTreatmentReservoirMgmt(); } /*********************************************************************//** @@ -131,6 +152,78 @@ /*********************************************************************//** * @brief + * The execPreTreatmentReservoirMgmt function executes the state machine for the + * reservoir management during pre-treatment mode. + * @details Inputs: currentReservoirMgmtState + * @details Outputs: DG reservoirs' fills managed. + * @return none + *************************************************************************/ +static void execPreTreatmentReservoirMgmt( void ) +{ + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + // treatment reservoir mgmt. state machine + switch ( currentReservoirMgmtState ) + { + case PRETREATMENT_RESERVOIR_MGMT_START_STATE: + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + break; + + case PRETREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGDrain( PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML ); + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_DRAIN_STATE; + } + } + break; + + case PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_DRAIN_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + cmdStartDGFill( PRIME_FILL_RESERVOIR_TO_VOLUME_ML ); + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE; + } + } + break; + + case PRETREATMENT_RESERVOIR_MGMT_WAIT_TO_FILL_STATE: + if ( DG_MODE_CIRC == dgOpMode ) + { + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; + } + break; + + case PRETREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE: + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; + + if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + { + reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + } + + if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] && FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) + { + reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; + } + break; + + default: + // TODO - s/w fault + currentReservoirMgmtState = PRETREATMENT_RESERVOIR_MGMT_START_STATE; + break; + } +} + +/*********************************************************************//** + * @brief * The purgeAirValvesBloodPumpControl function controls valves and blood pump * to purge air. * @details Inputs: none @@ -154,7 +247,7 @@ * priming. * @details Inputs: primeStartReqReceived * @details Outputs: control valves to purge air - * @return current state (sub-mode) + * @return current state *************************************************************************/ static PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ) { @@ -176,7 +269,7 @@ * to blood circuit circulation state if fluid is detected at upper sensor. * @details Inputs: air trap levels * @details Outputs: runs blood pump, control valves to trap air - * @return current state (sub-mode) + * @return current state *************************************************************************/ static PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ) { @@ -195,7 +288,7 @@ setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_CLOSED ); - setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_COLLECT_AIR, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setBloodPumpTargetFlowRate( BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); noAirDetectedTimerCounter = 0; state = PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; } @@ -210,7 +303,7 @@ * detected for a period of time, the blood pump is stopped. * @details Inputs: air trap levels * @details Outputs: stop blood pump, control valves to purge air - * @return current state (sub-mode) + * @return current state *************************************************************************/ static PRE_TREATMENT_PRIME_STATE_T handlePrimeCircBloodCircuitState( void ) { @@ -226,7 +319,11 @@ if ( ++noAirDetectedTimerCounter > NO_AIR_DETECTED_COUNT ) { signalBloodPumpHardStop(); - state = PRIME_DIALYSATE_DIALYZER_STATE; + + if ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + { + state = PRIME_DIALYSATE_DIALYZER_STATE; + } } return state; @@ -238,7 +335,7 @@ * dialysate dialyzer fluid path. * @details Inputs: none * @details Outputs: isPrimeCompleted - * @return current state (sub-mode) + * @return current state *************************************************************************/ static PRE_TREATMENT_PRIME_STATE_T handlePrimeDialysateDialyzerState( void ) { Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rb01542f8e4ef5a29e9b08fc0d465478de516bf02 -r780d9a73fe04ddd85282c413fbe5984f374f2b61 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision b01542f8e4ef5a29e9b08fc0d465478de516bf02) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 780d9a73fe04ddd85282c413fbe5984f374f2b61) @@ -1313,14 +1313,12 @@ *************************************************************************/ void handleLoadCellReadingsFromDG( MESSAGE_T *message ) { - BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof(LOAD_CELL_READINGS_PAYLOAD_T) ) { LOAD_CELL_READINGS_PAYLOAD_T payload; memcpy( &payload, message->payload, sizeof(LOAD_CELL_READINGS_PAYLOAD_T) ); - result = setNewLoadCellReadings( payload.res1PrimaryLoadCell, payload.res1BackupLoadCell, payload.res2PrimaryLoadCell, payload.res2BackupLoadCell ); + setNewLoadCellReadings( payload.res1PrimaryLoadCell, payload.res1BackupLoadCell, payload.res2PrimaryLoadCell, payload.res2BackupLoadCell ); } // TODO - what to do if invalid payload length? // TODO - how to know if DG stops sending these?