Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r57ee0134869672b53ab5b7146b8988ede8f828d6 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) @@ -17,22 +17,61 @@ #include "Common.h" #include "AlarmLamp.h" #include "BloodFlow.h" +#include "Buttons.h" #include "DialInFlow.h" #include "DialOutFlow.h" +#include "Dialysis.h" #include "Buttons.h" #include "OperationModes.h" +#include "SystemCommMessages.h" +#include "Timers.h" +#include "TreatmentStop.h" #include "ModeTreatment.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; #endif +// ********** private definitions ********** + +typedef enum Treatment_States +{ + TREATMENT_START_STATE = 0, + TREATMENT_DIALYSIS_STATE, + TREATMENT_STOP_STATE, + TREATMENT_RINSEBACK_STATE, + TREATMENT_RB_RC_PAUSE_STATE, + TREATMENT_RECIRC_STATE, + TREATMENT_BYPASS_RECIRC_STATE, + TREATMENT_END_STATE, + NUM_OF_TREATMENT_STATES +} TREATMENT_STATE_T; + // ********** private data ********** +static TREATMENT_STATE_T currentTreatmentState; + +static U32 presTreatmentTimeSecs; +static U32 presBloodFlowRate; +static U32 presDialysateFlowRate; +static F32 presMaxUFVolumeML; +static F32 presUFRate; + +static U32 treatmentTimeMS; +static U32 lastTreatmentTimeStamp; + +#ifdef UF_TEST_ENABLED +static BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; +#endif + // ********** private function prototypes ********** +static TREATMENT_STATE_T handleTreatmentStartState( void ); +static TREATMENT_STATE_T handleTreatmentDialysisState( void ); +static TREATMENT_STATE_T handleTreatmentStopState( void ); + /************************************************************************* - * @brief initTreatmentMode + * @brief * The initTreatmentMode function initializes the Treatment Mode module. * @details * Inputs : none @@ -42,10 +81,11 @@ *************************************************************************/ void initTreatmentMode( void ) { + currentTreatmentState = TREATMENT_START_STATE; } /************************************************************************* - * @brief transitionToTreatmentMode + * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. * @details * Inputs : none @@ -55,18 +95,25 @@ *************************************************************************/ void transitionToTreatmentMode( void ) { - // temporary test code - alarm lamp medium alarm + // initialize mode each time we transition to it + initTreatmentMode(); + // initialize treatment sub-modes each time we transition to treatment mode + initDialysis(); + initTreatmentStop(); + // temporary test code. TODO - remove later +#ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); +#endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board start = getMSTimerCount(); #endif } /************************************************************************* - * @brief execTreatmentMode + * @brief * The execTreatmentMode function executes the Treatment Mode state machine. * @details * Inputs : none @@ -76,12 +123,67 @@ *************************************************************************/ void execTreatmentMode( void ) { + U32 elapsedTreatmentTimeInSecs; + +#ifndef UF_TEST_ENABLED BOOL stop = isStopButtonPressed(); if ( TRUE == stop ) { requestNewOperationMode( MODE_POST ); } +#else + // treatment mode state machine + switch ( currentTreatmentState ) + { + case TREATMENT_START_STATE: + currentTreatmentState = handleTreatmentStartState(); + break; + + case TREATMENT_DIALYSIS_STATE: + currentTreatmentState = handleTreatmentDialysisState(); + break; + + case TREATMENT_STOP_STATE: + currentTreatmentState = handleTreatmentStopState(); + break; + + case TREATMENT_RINSEBACK_STATE: + // TODO - implement + break; + + case TREATMENT_RB_RC_PAUSE_STATE: + // TODO - implement + break; + + case TREATMENT_RECIRC_STATE: + // TODO - implement + break; + + case TREATMENT_BYPASS_RECIRC_STATE: + // TODO - implement + break; + + case TREATMENT_END_STATE: + // TODO - implement + requestNewOperationMode( MODE_POST ); // TODO - test code - remove later + break; + + default: + // TODO - s/w fault + break; + } + + // update treatment time stats and broadcast - end treatment if time + elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; + if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) + { + stopDialysis(); + elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; + currentTreatmentState = TREATMENT_END_STATE; + } + broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, presTreatmentTimeSecs - elapsedTreatmentTimeInSecs ); +#endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 10 sec if ( TRUE == didTimeout( start, 10000U ) ) @@ -91,3 +193,108 @@ #endif } +/************************************************************************* + * @brief + * The handleTreatmentStartState function handles the Start state of \n + * the Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentStartState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_DIALYSIS_STATE; + + // initialize treatment time + treatmentTimeMS = 0; + lastTreatmentTimeStamp = getMSTimerCount(); + + // get prescription settings TODO - hard-coded for now + presTreatmentTimeSecs = 3600; + presBloodFlowRate = 300; + presDialysateFlowRate = 400; + presMaxUFVolumeML = 300.0; + presUFRate = 20.0; + + // kick dialysis sub-mode off + setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); + startDialysis(); + + return result; +} + +/************************************************************************* + * @brief + * The handleTreatmentDialysisState function handles the Dialysis state of \n + * the Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentDialysisState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_DIALYSIS_STATE; + U32 newTime = getMSTimerCount(); + U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); + + // update UF time + treatmentTimeMS += msSinceLast; + lastTreatmentTimeStamp = newTime; + + execDialysis(); + + if ( getOffButtonState() == BUTTON_STATE_PRESSED ) + { + if ( lastOffButtonState == BUTTON_STATE_RELEASED ) + { + lastOffButtonState = BUTTON_STATE_PRESSED; + stopDialysis(); + result = TREATMENT_STOP_STATE; + } + } + else + { + lastOffButtonState = BUTTON_STATE_RELEASED; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleTreatmentStopState function executes the Stop state of the \n + * Treatment Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentStopState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_STOP_STATE; + + execTreatmentStop(); + + if ( getOffButtonState() == BUTTON_STATE_PRESSED ) + { + if ( lastOffButtonState == BUTTON_STATE_RELEASED ) + { + lastOffButtonState = BUTTON_STATE_PRESSED; + lastTreatmentTimeStamp = getMSTimerCount(); + startDialysis(); + result = TREATMENT_DIALYSIS_STATE; + } + } + else + { + lastOffButtonState = BUTTON_STATE_RELEASED; + } + + return result; +} +