Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r7478d513d7493d08484a880f5cd6c296c9616e70 -rd3e3e25740d545eb958a595e87fa3034633e7392 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d3e3e25740d545eb958a595e87fa3034633e7392) @@ -47,7 +47,8 @@ #define USER_CONFIRM_CHANGE_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Require user to confirm UF volume change within this time. #define PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ( 10 * SEC_PER_MIN ) ///< Prevent UF volume change if treatment within this much time from end of treatment (in seconds). -#define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the treatment time & state data is published on the CAN bus +#define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the treatment time & state data is published on the CAN bus. +#define TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. #define CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. #define CALC_ELAPSED_TREAT_TIME_IN_MIN() ( ( treatmentTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) ///< Macro to calculate the elapsed treatment time in minutes. @@ -66,6 +67,7 @@ static U32 treatmentTimeMS; ///< Elapsed treatment time (in ms). static U32 lastTreatmentTimeStamp; ///< Last time elapsed treatment time was recorded (a timestamp in ms). static U32 treatmentTimeBroadcastTimerCtr; ///< Treatment 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 BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; // TODO - test code - remove later @@ -76,6 +78,8 @@ // ********** private function prototypes ********** +static void broadcastTreatmentTimeAndState( void ); +static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentDialysisState( void ); static TREATMENT_STATE_T handleTreatmentStopState( void ); @@ -96,6 +100,7 @@ treatmentTimeMS = 0; lastTreatmentTimeStamp = 0; treatmentTimeBroadcastTimerCtr = 0; + treatmentParamsRangesBroadcastTimerCtr = 0; presTreatmentTimeSecs = 0; presBloodFlowRate = 0; @@ -161,8 +166,6 @@ *************************************************************************/ void execTreatmentMode( void ) { - U32 elapsedTreatmentTimeInSecs; - #ifndef UF_TEST_ENABLED BOOL stop = isStopButtonPressed(); @@ -225,26 +228,8 @@ break; } - // update treatment time stats and broadcast - end treatment if time - elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; - if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) - { - stopDialysis(); - elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; - currentTreatmentState = TREATMENT_DIALYSIS_END_STATE; - } - // broadcast treatment time and state data at interval - if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) - { - U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; - DIALYSIS_STATE_T dialysisState = getDialysisState(); - UF_STATE_T uFState = getUltrafiltrationState(); - BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); - - broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); - broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); - treatmentTimeBroadcastTimerCtr = 0; - } + broadcastTreatmentTimeAndState(); + broadcastTreatmentSettingsRanges(); #endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 10 sec @@ -468,9 +453,9 @@ { DIALYSIS_STATE_T currDialysisState = getDialysisState(); UF_STATE_T currUFState = getUltrafiltrationState(); - F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // what would UF rate be if user selected to adjust it? - U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // what would the treatment duration be if user selected to adjust it? - U32 dialVolume = presDialysateFlowRate * trtTime; // what would dialysate volume be if user selected to adjust time? + F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // what UF rate would be if user selected to adjust it + U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // what the treatment duration would be if user selected to adjust it + U32 dialVolume = presDialysateFlowRate * trtTime; // what dialysate volume would be if user selected to adjust time // UF should already be paused but let's make sure. if ( ( TREATMENT_DIALYSIS_STATE == currentTreatmentState ) && @@ -648,3 +633,70 @@ return result; } + +/*********************************************************************//** + * @brief + * The broadcastTreatmentTimeAndState function broadcasts treatment time and \n + * state data during treatment. + * @details + * Inputs : treatment time and state data + * Outputs : treatment time and state messages sent on interval + * @return none + *************************************************************************/ +static void broadcastTreatmentTimeAndState( void ) +{ + U32 elapsedTreatmentTimeInSecs; + + // update treatment time stats and broadcast - end treatment if time + elapsedTreatmentTimeInSecs = treatmentTimeMS / MS_PER_SECOND; + if ( elapsedTreatmentTimeInSecs >= presTreatmentTimeSecs ) + { + stopDialysis(); + elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; + currentTreatmentState = TREATMENT_DIALYSIS_END_STATE; + } + // broadcast treatment time and state data at interval + if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) + { + U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; + DIALYSIS_STATE_T dialysisState = getDialysisState(); + UF_STATE_T uFState = getUltrafiltrationState(); + BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); + + broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); + broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); + treatmentTimeBroadcastTimerCtr = 0; + } +} + +/*********************************************************************//** + * @brief + * The broadcastTreatmentSettingsRanges function computes and broadcasts \n + * updated treatment parameter ranges that the user may change during treatment. + * @details + * Inputs : current operating mode, treatment states and parameters + * Outputs : valid ranges message sent on interval + * @return none + *************************************************************************/ +static void broadcastTreatmentSettingsRanges( void ) +{ + if ( ++treatmentParamsRangesBroadcastTimerCtr >= TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ) + { + U32 minTime = CALC_ELAPSED_TREAT_TIME_IN_MIN() + 2; // add two minutes to cover rounding and ensure it's valid for next minute + U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationVolumeCollected() ) / MAX_UF_RATE_ML_MIN; + U32 maxTime1 = minTime + maxTimeRem; + U32 maxTime2 = MAX_DIALYSATE_VOLUME_ML / presDialysateFlowRate; + U32 maxTime = MIN( maxTime1, maxTime2 ); + U32 minUFVol = (U32)(getUltrafiltrationVolumeCollected() + 1); + U32 maxUFVol = presUFRate * ( presTreatmentTimeSecs / SEC_PER_MIN ); + U32 minDialRate = MIN_DIAL_IN_FLOW_RATE; + U32 maxDialRate = MAX_DIALYSATE_VOLUME_ML / ( presTreatmentTimeSecs / SEC_PER_MIN ); + + maxTime = MIN( maxTime, MAX_TREATMENT_TIME_MINUTES ); + maxUFVol = MIN( maxUFVol, MAX_UF_VOLUME_ML ); + maxDialRate = MIN( maxDialRate, MAX_DIAL_IN_FLOW_RATE ); + // send ranges to UI + sendTreatmentParamsRangesToUI( minTime, maxTime, minUFVol, maxUFVol, minDialRate, maxDialRate ); + treatmentParamsRangesBroadcastTimerCtr = 0; + } +}