Index: firmware/App/Modes/TreatmentEnd.c =================================================================== diff -u -r825b34b09f0aae662485b261dbad6b3fc1d125e4 -rdea8c26f95f282335261bec6242d60790e8ce9f5 --- firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision 825b34b09f0aae662485b261dbad6b3fc1d125e4) +++ firmware/App/Modes/TreatmentEnd.c (.../TreatmentEnd.c) (revision dea8c26f95f282335261bec6242d60790e8ce9f5) @@ -34,6 +34,8 @@ // ********** private definitiions *********** +/// Interval at which treatment end progress is to be published to UI. +#define TREATMENT_END_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Target flow rate for blood while waiting for user to initiate final rinseback. #define TX_END_BP_FLOW_RATE_ML_MIN 100 @@ -52,13 +54,18 @@ static BOOL txEndAlarmEndTreatmentRequested; ///< Flag indicates user requesting end treatment from alarm. static BOOL txEndRinsebackRequested; ///< Flag indicates user requesting final rinseback. static BOOL txEndDrainCmdSent; ///< Flag indicates DG Drain command has been sent. +static U32 treatmentEndPublishTimerCtr; ///< Timer counter for determining interval for treatment end status to be published. +/// Interval (in task intervals) at which to publish treatment end data to CAN bus. +static OVERRIDE_U32_T treatmentEndPublishInterval = { TREATMENT_END_DATA_PUBLISH_INTERVAL, TREATMENT_END_DATA_PUBLISH_INTERVAL, TREATMENT_END_DATA_PUBLISH_INTERVAL, 0 }; // ********** private function prototypes ********** static void resetTreatmentEndFlags( void ); static void setupForTxEndWait4RinsebackState( void ); static void setupForTxEndPausedState( void ); +static void publishTreatmentEndData( void ); +static U32 getPublishTreatmentEndInterval( void ); static TREATMENT_END_STATE_T handleTxEndWait4RinsebackState( void ); static TREATMENT_END_STATE_T handleTxEndPausedState( void ); @@ -216,6 +223,8 @@ setCurrentSubState( (U32)treatmentEndState ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, treatmentEndState ); } + publishTreatmentEndData(); + // Re-circulate flags should be handled by now - reset in case not handled by current state resetTreatmentEndFlags(); } @@ -312,24 +321,16 @@ } else { - TREATMENT_STOP_PAYLOAD_T data; - - data.timeout = 0; - data.countdown = 0; - // Ensure we do not sit in stopped state for too long if ( bloodSittingTimerCtr > WARN_TIME_BLOOD_SITTING ) { - data.timeout = MAX_TIME_BLOOD_SITTING / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); - data.countdown = ( bloodSittingTimerCtr >= MAX_TIME_BLOOD_SITTING ? 0 : ( MAX_TIME_BLOOD_SITTING - bloodSittingTimerCtr ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); activateAlarmNoData( ALARM_ID_HD_END_OF_TREATMENT_ALARM ); } if ( bloodSittingTimerCtr > MAX_TIME_BLOOD_SITTING ) { // Raise the alarm activateAlarmNoData( ALARM_ID_HD_END_OF_TREATMENT_HIGH ); } - broadcastData( MSG_ID_HD_TREATMENT_STOP_TIMER_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( TREATMENT_STOP_PAYLOAD_T ) ); } return result; @@ -452,4 +453,98 @@ return treatmentEndState; } +/*********************************************************************//** + * @brief + * The publishTreatmentEndData function publishes Treatment End progress to UI + * at 1 Hz interval. + * @details Inputs: treatmentEndPublishTimerCtr + * @details Outputs: Treatment end data published + * @return none + *************************************************************************/ +static void publishTreatmentEndData( void ) +{ + if ( ++treatmentEndPublishTimerCtr >= getPublishTreatmentEndInterval() ) + { + TREATMENT_STOP_PAYLOAD_T data; + + data.timeout = 0; + data.countdown = 0; + + // update blood sitting timer if active + if ( bloodSittingTimerCtr > 0 ) + { + data.timeout = MAX_TIME_BLOOD_SITTING / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); + data.countdown = ( bloodSittingTimerCtr >= MAX_TIME_BLOOD_SITTING ? 0 : ( MAX_TIME_BLOOD_SITTING - bloodSittingTimerCtr ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); + } + broadcastData( MSG_ID_HD_TREATMENT_STOP_TIMER_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( TREATMENT_STOP_PAYLOAD_T ) ); + } +} + +/*********************************************************************//** + * @brief + * The getPublishTreatmentEndInterval function gets the treatment end data + * publication interval. + * @details Inputs: treatmentEndPublishInterval + * @details Outputs: none + * @return the current treatment end publication interval (in task intervals). + *************************************************************************/ +static U32 getPublishTreatmentEndInterval( void ) +{ + U32 result = treatmentEndPublishInterval.data; + + if ( OVERRIDE_KEY == treatmentEndPublishInterval.override ) + { + result = treatmentEndPublishInterval.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetTreatmentEndPublishIntervalOverride function sets the override of the + * treatment end data publication interval. + * @details Inputs: none + * @details Outputs: treatmentEndPublishInterval + * @param ms milliseconds between treatment end broadcasts + * @return TRUE if override set successful, FALSE if not + *************************************************************************/ +BOOL testSetTreatmentEndPublishIntervalOverride( U32 ms ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = ms / TASK_GENERAL_INTERVAL; + + result = TRUE; + treatmentEndPublishInterval.ovData = intvl; + treatmentEndPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTreatmentEndPublishIntervalOverride function resets the override of the + * treatment end data publication interval. + * @details Inputs: none + * @details Outputs: treatmentEndPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTreatmentEndPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + treatmentEndPublishInterval.override = OVERRIDE_RESET; + treatmentEndPublishInterval.ovData = treatmentEndPublishInterval.ovInitData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/TreatmentEnd.h =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -rdea8c26f95f282335261bec6242d60790e8ce9f5 --- firmware/App/Modes/TreatmentEnd.h (.../TreatmentEnd.h) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Modes/TreatmentEnd.h (.../TreatmentEnd.h) (revision dea8c26f95f282335261bec6242d60790e8ce9f5) @@ -45,6 +45,8 @@ void signalTreatmentEndAlarmEndTxUserAction( void ); // from user for alarm void signalTreatmentEndUserAction( REQUESTED_TREATMENT_END_USER_ACTIONS_T action ); // from user TREATMENT_END_STATE_T getCurrentTreatmentEndState( void ); +BOOL testSetTreatmentEndPublishIntervalOverride( U32 ms ); +BOOL testResetTreatmentEndPublishIntervalOverride( void ); /**@}*/