Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rbbd48b033ef7307a30815e490eb28825c7afcc2b -r8acb1d02ac39d202a47338091b249ff2f30f5ea7 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision bbd48b033ef7307a30815e490eb28825c7afcc2b) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8acb1d02ac39d202a47338091b249ff2f30f5ea7) @@ -31,6 +31,7 @@ #include "StateTxBloodPrime.h" #include "StateTxDialysis.h" #include "StateTxPaused.h" +#include "StateTxHDF.h" //#include "Switches.h" #include "TaskGeneral.h" #include "Timers.h" @@ -81,6 +82,7 @@ static U32 treatmentStateBroadcastTimerCtr; ///< Treatment state data broadcast timer counter used to schedule when to transmit data. static U32 treatmentParamsRangesBroadcastTimerCtr; ///< Treatment parameter ranges broadcast timer counter used to schedule when to transmit updated ranges. static U32 ultrafiltrationBroadcastTimerCtr; ///< Ultrafiltration data broadcast timer counter used to schedule when to transmit data. +static TREATMENT_TYPE_T treatmentType; ///< Treatment type. HDF or dialysis /// Interval (in task intervals) at which to publish alarm status to CAN bus. static OVERRIDE_U32_T treatmentTimePublishInterval; @@ -93,7 +95,7 @@ static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. static BOOL endTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment end. static BOOL endTreatmentRequest; ///< Flag indicates user has requested end of treatment from rinseback workflow. -static BOOL bloodPrimeToDialysisRequest; ///< Flag indicates blood prime has completed and time to start dialysis. +static BOOL bloodPrimeToTreatmentRequest; ///< Flag indicates blood prime has completed and time to start dialysis. static BOOL resumeBlockedByAlarm; ///< Flag indicates an alarm has blocked resume of this treatment. static U32 treatmentStartTimeStamp; ///< Treatment start timestamp for logging purpose. @@ -114,6 +116,7 @@ static TREATMENT_STATE_T handleTreatmentRinsebackState( void ); static TREATMENT_STATE_T handleTreatmentRecircState( void ); static TREATMENT_STATE_T handleTreatmentEndState( void ); +static TREATMENT_STATE_T handleTreatmentHDFState( void ); static void resetSignalFlags( void ); static void resetAlarmSignalFlags( void ); @@ -162,6 +165,7 @@ treatmentStartTimeStamp = 0; treatmentEndTimeStamp = 0; + treatmentType = TREATMENT_MODALITY_HD_SALINE_FLUID; } /*********************************************************************//** @@ -190,6 +194,7 @@ // initTreatmentRecirc(); // initTreatmentEnd(); initFluidBolus(); + initHDF(); // Started the treatment - set the start time in epoch // setTxLastStartTimeEpoch( getRTCTimestamp() ); @@ -208,14 +213,28 @@ presUFRateMlMin = presUFVolumeMl / (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFVolumeMl, presUFRateMlMin ); bicarbConvFactor = BICARBONATE_CONVERSION_FACTOR; + treatmentType = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_MODALITY ); - // Direct DD to generate dialysate and bypass while priming blood - cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, HDF_MAX_RATE, - getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, - getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), - bicarbConvFactor, - getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), - getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); + if (treatmentType == TREATMENT_MODALITY_HDF_ONLINE_FLUID ) + { + // Direct DD to generate dialysate and bypass while priming blood with HDF. + cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, HDF_MAX_RATE, + getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, + getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), + bicarbConvFactor, + getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), + getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); + } + else + { + // Direct DD to generate dialysate and bypass while priming blood + cmdStartGenerateDialysate( (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFRateMlMin, 0.0F, + getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ), TRUE, + getTreatmentParameterF32( TREATMENT_PARAM_ACID_CONCENTRATE_CONV_FACTOR ), + bicarbConvFactor, + getTreatmentParameterU32( TREATMENT_PARAM_SODIUM ), + getTreatmentParameterU32( TREATMENT_PARAM_BICARBONATE ) ); + } // Read back limits for transmit to UI. respRecord.artPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ); respRecord.venPresLimitWindowmmHg = getSysConfigTreatmentParameterU32( TREATMENT_PARAM_VEN_PRES_HIGH_LIMIT_WINDOW ); @@ -411,7 +430,7 @@ *************************************************************************/ void signalBloodPrimeToDialysis( void ) { - bloodPrimeToDialysisRequest = TRUE; + bloodPrimeToTreatmentRequest = TRUE; } /*********************************************************************//** @@ -484,6 +503,10 @@ currentTreatmentState = handleTreatmentEndState(); break; + case TREATMENT_HDF_STATE: + currentTreatmentState = handleTreatmentHDFState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, (U32)currentTreatmentState ); break; @@ -584,7 +607,7 @@ execBloodPrime(); // Handle signals from blood prime sub-mode - if ( TRUE == bloodPrimeToDialysisRequest ) + if ( TRUE == bloodPrimeToTreatmentRequest ) { lastTreatmentTimeStamp = getMSTimerCount(); // Kick dialysis sub-mode off @@ -595,10 +618,21 @@ // { // sendTreatmentLogEventData( UF_START_RESUME_EVENT, 0.0, presUFRate ); // } - transitionToDialysis(); -// // To update partial blood pump occlusion baseline - start of treatment -// signalBloodPumpPressureOcclBaseline(); - result = TREATMENT_DIALYSIS_STATE; + if ( treatmentType == TREATMENT_MODALITY_HDF_ONLINE_FLUID ) + { + transitionToHDF(); +// // To update partial blood pump occlusion baseline - start of treatment +// signalBloodPumpPressureOcclBaseline(); + result = TREATMENT_HDF_STATE; + } + else + { + transitionToDialysis(); +// // To update partial blood pump occlusion baseline - start of treatment +// signalBloodPumpPressureOcclBaseline(); + result = TREATMENT_DIALYSIS_STATE; + } + } } @@ -624,6 +658,9 @@ // Always update timestamp to avoid time jump on bolus exit lastTreatmentTimeStamp = newTime; + + //TODO: Handle UI integration switching between HDF and Dialysis sub modes. + // Only update treatment time when fluid bolus is not active if ( FALSE == isFluidBolusActive() ) { @@ -658,6 +695,60 @@ /*********************************************************************//** * @brief + * The handleTreatmentHDFState function handles the Dialysis state of + * the Treatment Mode state machine. + * @details \b Inputs: none + * @details \b Outputs: treatmentTimeMS, lastTreatmentTimeStamp, dialysis sub-mode + * executed. + * @return next treatment mode state + *************************************************************************/ +static TREATMENT_STATE_T handleTreatmentHDFState( void ) +{ + TREATMENT_STATE_T result = TREATMENT_HDF_STATE; + U32 newTime = getMSTimerCount(); + U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); + DIALYSIS_STATE_T dialysisState = getDialysisState(); + + // Always update timestamp to avoid time jump on bolus exit + lastTreatmentTimeStamp = newTime; + + //TODO: Handle UI integration switching between HDF and Dialysis sub modes. + + // Only update treatment time when fluid bolus is not active + if ( FALSE == isFluidBolusActive() ) + { + treatmentTimeMS += msSinceLast; + } + + // End treatment if treatment duration has been reached + if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) + { + treatmentCompleted = TRUE; +// sendLastTreatmentPeriodicData = TRUE; +// treatmentEndTimeStamp = getRTCTimestamp(); + pauseHDF(); + requestNewOperationMode( MODE_STAN ); // TODO transitionToTreatmentEnd(); + //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TD_END_OF_TREATMENT_WARNING, presTreatmentTimeSecs ); + result = TREATMENT_END_STATE; + } + // Otherwise, execute state machine for treatment dialysis sub-mode + else + { + execHDF(); + // Handle alarm page + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + transitionToTreatmentPaused(); + result = TREATMENT_PAUSED_STATE; + } + } + + return result; +} + + +/*********************************************************************//** + * @brief * The handleTreatmentPausedState function executes the Paused state of the * Treatment Mode state machine. * @details \b Inputs: none @@ -677,8 +768,16 @@ if ( TRUE == getBloodIsPrimed() ) { lastTreatmentTimeStamp = getMSTimerCount(); - transitionToDialysis(); - result = TREATMENT_DIALYSIS_STATE; + if ( treatmentType == TREATMENT_MODALITY_HDF_ONLINE_FLUID ) + { + transitionToDialysis(); + result = TREATMENT_HDF_STATE; + } + else + { + transitionToDialysis(); + result = TREATMENT_DIALYSIS_STATE; + } } else { @@ -1065,11 +1164,10 @@ #if 0 // TODO implement the test configuration //if ( TRUE == getTestConfigStatus( TEST_CONFIG_ENABLE_ONE_MINUTE_TREATMENT ) ) -#endif { treatmentTime = 1; } - +#endif return treatmentTime; } @@ -1099,7 +1197,7 @@ // rinsebackTopedRequest = FALSE; endTreatmentRequest = FALSE; // rinsebackToRecircRequest = FALSE; - bloodPrimeToDialysisRequest = FALSE; + bloodPrimeToTreatmentRequest = FALSE; // treatmentEndToRinsebackRequest = FALSE; }