Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r52787cd53986cfd0abb7e674bf096898e5070f9a -r5069769a675a529142dfd5f9fb2491380cec8b83 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 52787cd53986cfd0abb7e674bf096898e5070f9a) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 5069769a675a529142dfd5f9fb2491380cec8b83) @@ -1458,15 +1458,20 @@ if ( ++isolatedUFBroadcastTimerCtr >= ULTRAFILTRATION_DATA_PUB_INTERVAL ) { ISOLATED_UF_DATA_PAYLOAD_T data; - U32 durationInMinutes = getIsolatedUFDurationMin(); - F32 volumeGoalMl = getIsolatedUFSetVolumeMl(); + U32 durationInMinutes = getIsolatedUFDurationMin(); + U32 durationSec = durationInMinutes * SEC_PER_MIN; + U32 elapsedSec = getIsolatedUFSessionElapsedTimeSec(); + F32 volumeGoalMl = getIsolatedUFSetVolumeMl(); data.mDuration = durationInMinutes; - data.mSetVolume = (U32)volumeGoalMl; - data.mVolumeDelivered = (U32)( getIsolatedUFVolumeDrawn() * (F32)ML_PER_LITER ); - data.mRate = (U32)getIsolatedUFRateMlMin(); + data.mElapsedTime = elapsedSec; + data.mRemainingTime = ( durationSec > elapsedSec ) ? ( durationSec - elapsedSec ) : 0U; + data.mSetVolume = volumeGoalMl; + data.mVolumeDelivered = getIsolatedUFVolumeDrawn() * (F32)ML_PER_LITER; + data.mRate = getIsolatedUFRateMlMin(); - sendMessage( MSG_ID_TD_ISOLATED_UF_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)(&data), sizeof( ISOLATED_UF_DATA_PAYLOAD_T ) ); + sendMessage( MSG_ID_TD_ISOLATED_UF_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08 *)(&data), sizeof( ISOLATED_UF_DATA_PAYLOAD_T ) ); + isolatedUFBroadcastTimerCtr = 0; } } Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r52787cd53986cfd0abb7e674bf096898e5070f9a -r5069769a675a529142dfd5f9fb2491380cec8b83 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 52787cd53986cfd0abb7e674bf096898e5070f9a) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 5069769a675a529142dfd5f9fb2491380cec8b83) @@ -89,9 +89,11 @@ typedef struct { U32 mDuration; ///< Isolated UF duration in minutes. - U32 mSetVolume; ///< Isolated UF set volume in mL. - U32 mVolumeDelivered; ///< Isolated UF volume delivered in mL. - U32 mRate; ///< Isolated UF rate in mL/min. + U32 mElapsedTime; ///< Isolated UF elapsed time in seconds. + U32 mRemainingTime; ///< ISO UF remaining time in seconds + F32 mSetVolume; ///< Isolated UF set volume in mL. + F32 mVolumeDelivered; ///< Isolated UF volume delivered in mL. + F32 mRate; ///< Isolated UF rate in mL/min. } ISOLATED_UF_DATA_PAYLOAD_T; /// Payload record structure for the in-line pressure limits change response. Index: firmware/App/Modes/StateTxIsolatedUF.c =================================================================== diff -u -r222b05e39082f727dcfa2d144fa6e040501882f0 -r5069769a675a529142dfd5f9fb2491380cec8b83 --- firmware/App/Modes/StateTxIsolatedUF.c (.../StateTxIsolatedUF.c) (revision 222b05e39082f727dcfa2d144fa6e040501882f0) +++ firmware/App/Modes/StateTxIsolatedUF.c (.../StateTxIsolatedUF.c) (revision 5069769a675a529142dfd5f9fb2491380cec8b83) @@ -41,6 +41,7 @@ static BOOL isolatedUFCompleted; ///< Flag indicating isolated UF completed. static BOOL ufPauseRequested; ///< Flag indicates UF pause has been requested by user. static BOOL ufResumeRequested; ///< Flag indicates UF resume has been requested by user. +static BOOL isolatedUFEndRequested; ///< Flag indicates isolated UF end has been requested by user. static F32 setDialysateFlowMlMin; ///< Dialysate flow rate (Qd) for isolated UF. static U32 isolatedUFElapsedTimerCtr; ///< Elapsed isolated UF time in general task intervals (50 ms per tick). @@ -71,6 +72,7 @@ isolatedUFCompleted = FALSE; ufPauseRequested = FALSE; ufResumeRequested = FALSE; + isolatedUFEndRequested = FALSE; setDialysateFlowMlMin = 0.0F; isolatedUFElapsedTimerCtr = 0U; } @@ -204,6 +206,21 @@ /*********************************************************************//** * @brief + * The getIsolatedUFSessionElapsedTimeSec function gets elapsed time for the + * current or most recently completed isolated UF session. + * @details \b Inputs: isolatedUFElapsedTimerCtr + * @details \b Outputs: none + * @return elapsed isolated UF session time in seconds. + *************************************************************************/ +U32 getIsolatedUFSessionElapsedTimeSec( void ) +{ + U32 elapsedTimeSec = ( isolatedUFElapsedTimerCtr * TASK_GENERAL_INTERVAL ) / MS_PER_SECOND; + + return elapsedTimeSec; +} + +/*********************************************************************//** + * @brief * The isIsolatedUFCompleted function determines whether isolated UF completed. * @details \b Inputs: isolatedUFCompleted * @details \b Outputs: none @@ -339,6 +356,90 @@ /*********************************************************************//** * @brief + * The handleIsoUFStateRequest function handles a request to pause, resume, + * or end isolated ultrafiltration. + * @details \b Message \b Sent: MSG_ID_TD_ISO_UF_STATE_RESPONSE + * @details \b Inputs: currentIsolatedUFState + * @details \b Outputs: ufPauseRequested, ufResumeRequested, + * isolatedUFEndRequested + * @param message Message from UI which includes an isolated UF command + * (pause, resume, or end). + * @return TRUE if request was accepted, FALSE otherwise. + **************************************************************************/ +BOOL handleIsoUFStateRequest( MESSAGE_T *message ) +{ + U32 requestedState = NUM_OF_ISO_UF_CMDS; + UI_RESPONSE_PAYLOAD_T response; + + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + memcpy( &requestedState , message->payload, sizeof( U32 ) ); + + if ( MODE_TREA != getCurrentOperationMode() ) + { + response.rejectionReason = REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE; + } + else if ( TREATMENT_ISO_UF_STATE != getTreatmentState() ) + { + response.rejectionReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; + } + else + { + switch ( (ISO_UF_CMD_T)requestedState ) + { + case ISO_UF_CMD_PAUSE: + if ( ISOLATED_UF_RUNNING_STATE == currentIsolatedUFState ) + { + ufPauseRequested = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } + else + { + response.rejectionReason = REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS; + } + break; + + case ISO_UF_CMD_RESUME: + if ( ISOLATED_UF_PAUSED_STATE == currentIsolatedUFState ) + { + ufResumeRequested = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } + else + { + response.rejectionReason = REQUEST_REJECT_REASON_UF_NOT_PAUSED; + } + break; + + case ISO_UF_CMD_END: + isolatedUFEndRequested = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + break; + + default: + response.rejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + break; + } + } + } + else + { + response.rejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + sendMessage( MSG_ID_TD_ISO_UF_STATE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)(&response), sizeof( UI_RESPONSE_PAYLOAD_T ) ); + + return response.accepted; +} + +/*********************************************************************//** + * @brief * The execIsolatedUF function executes the isolated UF sub-mode state machine. * @details \b Message \b Sent: TD_EVENT_SUB_STATE_CHANGE when state changes * @details \b Inputs: currentIsolatedUFState @@ -386,9 +487,20 @@ U32 durationTimerLimit = ( getIsolatedUFDurationMin() * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL; F32 setVolumeL = getIsolatedUFSetVolumeMl() / (F32)ML_PER_LITER; - if ( TRUE == ufPauseRequested ) + if ( TRUE == isolatedUFEndRequested ) { + isolatedUFEndRequested = FALSE; ufPauseRequested = FALSE; + ufResumeRequested = FALSE; + + cmdChangeQuf( 0.0F ); + + isolatedUFActive = FALSE; + isolatedUFCompleted = TRUE; + } + else if ( TRUE == ufPauseRequested ) + { + ufPauseRequested = FALSE; transitionToIsolatedUFState( ISOLATED_UF_PAUSED_STATE ); result = ISOLATED_UF_PAUSED_STATE; } @@ -399,8 +511,10 @@ if ( ( ( durationTimerLimit > 0U ) && ( isolatedUFElapsedTimerCtr >= durationTimerLimit ) ) || ( ( setVolumeL > 0.0F ) && ( getIsolatedUFVolumeDrawn() >= setVolumeL ) ) ) { - isolatedUFCompleted = TRUE; - isolatedUFActive = FALSE; + cmdChangeQuf( 0.0F ); + + isolatedUFCompleted = TRUE; + isolatedUFActive = FALSE; } } @@ -418,9 +532,20 @@ { ISOLATED_UF_STATE_T result = ISOLATED_UF_PAUSED_STATE; - if ( TRUE == ufResumeRequested ) + if ( TRUE == isolatedUFEndRequested ) { + isolatedUFEndRequested = FALSE; + ufPauseRequested = FALSE; ufResumeRequested = FALSE; + + cmdChangeQuf( 0.0F ); + + isolatedUFActive = FALSE; + isolatedUFCompleted = TRUE; + } + else if ( TRUE == ufResumeRequested ) + { + ufResumeRequested = FALSE; transitionToIsolatedUFState( ISOLATED_UF_RUNNING_STATE ); result = ISOLATED_UF_RUNNING_STATE; } Index: firmware/App/Modes/StateTxIsolatedUF.h =================================================================== diff -u -r96604b790636c66ef21980a4f13ee9f987f12fee -r5069769a675a529142dfd5f9fb2491380cec8b83 --- firmware/App/Modes/StateTxIsolatedUF.h (.../StateTxIsolatedUF.h) (revision 96604b790636c66ef21980a4f13ee9f987f12fee) +++ firmware/App/Modes/StateTxIsolatedUF.h (.../StateTxIsolatedUF.h) (revision 5069769a675a529142dfd5f9fb2491380cec8b83) @@ -52,9 +52,11 @@ void endIsolatedUFOnUserStop( void ); // Ends active isolated UF session F32 getIsolatedUFVolumeDrawn( void ); // Gets current isolated UF volume drawn from patient U32 getIsolatedUFSessionElapsedTimeMin( void ); // Gets elapsed isolated UF session time in minutes +U32 getIsolatedUFSessionElapsedTimeSec( void ); // Gets elapsed isolated UF session time in seconds BOOL handleUFPauseResumeRequest( MESSAGE_T *message ); // Routes UI pause/resume UF to dialysis or isolated UF BOOL signalPauseResumeIsolatedUF( MESSAGE_T *message ); // Handles UI pause/resume UF request +BOOL handleIsoUFStateRequest( MESSAGE_T *message ); // Handles ISO UF pause, resume, or end request /**@}*/ Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r52787cd53986cfd0abb7e674bf096898e5070f9a -r5069769a675a529142dfd5f9fb2491380cec8b83 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 52787cd53986cfd0abb7e674bf096898e5070f9a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 5069769a675a529142dfd5f9fb2491380cec8b83) @@ -135,6 +135,7 @@ { MSG_ID_UI_ISOLATED_UF_DURATION_CHANGE_REQUEST, &handleIsolatedUFDurationChangeRequest }, { MSG_ID_UI_ISOLATED_UF_VOLUME_GOAL_CHANGE_REQUEST, &handleIsolatedUFVolumeGoalChangeRequest }, { MSG_ID_UI_ISOLATED_UF_CONFIRM_REQUEST, &handleIsolatedUFConfirmRequest }, + { MSG_ID_UI_ISO_UF_STATE_REQUEST, &handleIsoUFStateRequest }, { MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST, &handleAutoLoadRequest }, { MSG_ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_REQUEST, &handleSetupTubingSetConnectionConfirmRequest }, { MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST, &handleAutoEjectRequest },