Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -re94dfd13d71e9257ea0535fb84ba0dcc0a8abe75 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision e94dfd13d71e9257ea0535fb84ba0dcc0a8abe75) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -75,6 +75,7 @@ if ( ( MODE_PRET == previousOpMode ) || ( MODE_TREA == previousOpMode ) ) { collectTreatmentLogData(); + sendTreatmentLogDataToUI(); } } Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r3d5431d5aebe0c88c38a8732455a6dcf004fe6c2 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 3d5431d5aebe0c88c38a8732455a6dcf004fe6c2) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -29,6 +29,7 @@ #include "ModePostTreat.h" #include "ModeTreatment.h" #include "ModeTreatmentParams.h" +#include "RTC.h" #include "SampleWater.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -195,31 +196,38 @@ treatmentLogData.bloodFlowRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); treatmentLogData.dialysateFlowRate_mL_min = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); - treatmentLogData.treatmentDuration_min = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); - treatmentLogData.actualTreatmentDur_min = getActualTreatmentTimeMins(); + treatmentLogData.treatmentDuration_sec = SEC_PER_MIN * getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); + treatmentLogData.actualTreatmentDur_sec = getActualTreatmentTimeSecs(); treatmentLogData.acidConcentrate = getTreatmentParameterU32( TREATMENT_PARAM_ACID_CONCENTRATE ); treatmentLogData.bicarbConcentrate = getTreatmentParameterU32( TREATMENT_PARAM_BICARB_CONCENTRATE ); treatmentLogData.dialysateTemperature_degC = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); treatmentLogData.dialyzerType = getTreatmentParameterU32( TREATMENT_PARAM_DIALYZER_TYPE ); - treatmentLogData.treatmentDateAndTime = getTreatmentStartTimeStamp(); + treatmentLogData.treatmentStartDateAndTime = getTreatmentStartTimeStamp(); + treatmentLogData.treatmentEndDateAndTime = getTreatmentEndTimeStamp(); + // There is treatment start time but treatment not completed means treatment ends early + if ( ( treatmentLogData.treatmentStartDateAndTime != 0 ) && ( FALSE == isTreatmentCompleted() ) ) + { + treatmentLogData.treatmentEndDateAndTime = getRTCTimestamp(); + } + treatmentLogData.avgBloodFlow_mL_min = getTreatmentAvgBloodFlowRate(); treatmentLogData.avgDialysateFlow_mL_min = getTreatmentAvgDialysateFlowRate(); - treatmentLogData.dialysateVolumeUsed_L = treatmentLogData.actualTreatmentDur_min * treatmentLogData.avgDialysateFlow_mL_min; + treatmentLogData.dialysateVolumeUsed_L = treatmentLogData.avgDialysateFlow_mL_min * treatmentLogData.actualTreatmentDur_sec / SEC_PER_MIN; treatmentLogData.avgDialysateTemperature_degC = getTreatmentAvgDialysateTemp(); if ( TRUE == isUFVolumeParamReceived() ) { treatmentLogData.targetUFVolume_L = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); - treatmentLogData.targetUFRate_mL_min = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * ML_PER_LITER / treatmentLogData.treatmentDuration_min; + treatmentLogData.targetUFRate_mL_min = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * ML_PER_LITER * SEC_PER_MIN / treatmentLogData.treatmentDuration_sec; } - if ( treatmentLogData.actualTreatmentDur_min > 0 ) + if ( treatmentLogData.actualTreatmentDur_sec > 0 ) { treatmentLogData.actualUFVolume_L = getUltrafiltrationVolumeCollected(); - treatmentLogData.actualUFRate_mL_min = getUltrafiltrationVolumeCollected() / treatmentLogData.actualTreatmentDur_min; + treatmentLogData.actualUFRate_mL_min = getUltrafiltrationVolumeCollected() * SEC_PER_MIN / treatmentLogData.actualTreatmentDur_sec; } else { @@ -238,13 +246,12 @@ /*********************************************************************//** * @brief - * The handleTreatmentLogDataRequest sends treatment log data to UI upon - * UI requests. + * The sendTreatmentLogDataToUI sends treatment log data to UI. * @details Inputs: treatmentLogData * @details Outputs: Sent treatment log data to UI * @return none *************************************************************************/ -void handleTreatmentLogDataRequest( void ) +void sendTreatmentLogDataToUI( void ) { BOOL accepted = TRUE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NONE; Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -rbd0ae373570f7f224bb9a6a4e86f805be77de192 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision bd0ae373570f7f224bb9a6a4e86f805be77de192) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -37,8 +37,8 @@ { U32 bloodFlowRate_mL_min; ///< Blood flow rate (in mL/min) U32 dialysateFlowRate_mL_min; ///< Dialysate flow rate (in mL/min) - U32 treatmentDuration_min; ///< Selected treatment duration (in min) - U32 actualTreatmentDur_min; ///< Actual treatment duration (in min) + U32 treatmentDuration_sec; ///< Selected treatment duration (in sec) + U32 actualTreatmentDur_sec; ///< Actual treatment duration (in sec) U32 acidConcentrate; ///< Acid concentrate option U32 bicarbConcentrate; ///< Bicarbonate concentrate option @@ -49,7 +49,8 @@ F32 dialysateTemperature_degC; ///< Dialysate temperature (in deg C) U32 dialyzerType; ///< Dialyzer type option - U32 treatmentDateAndTime; ///< Treatment date and time in epoch time (in seconds) + U32 treatmentStartDateAndTime; ///< Treatment start date and time in epoch time (in seconds) + U32 treatmentEndDateAndTime; ///< Treatment end date and time in epoch time (in seconds) F32 avgBloodFlow_mL_min; ///< Average blood flow rate during treatment (in mL/min) F32 avgDialysateFlow_mL_min; ///< Average dialysate flow rate during treatment (in mL/min) @@ -62,7 +63,6 @@ F32 actualUFRate_mL_min; ///< Actual ultrafiltration rate (in mL/min) U32 salineBolusVolume_mL; ///< Saline bolus volume (in mL) - U32 heparinType; ///< Heparin type F32 heparinBolusVolume_mL; ///< Heparin bolus volume (in mL) F32 heparinDispenseRate_mL_hr; ///< Heparin dispense rate (in mL/hr) U32 heparinPreStop_min; ///< Heparin pre-stop time (in min) @@ -71,7 +71,6 @@ F32 avgArterialPressure_mmHg; ///< Average arterial pressure (in mmHg) F32 avgVenousPressure_mmHg; ///< Average venous pressure (in mmHg) - U32 endTreatmentEarlyAlarm; ///< Alarm that causes treatment to end early U32 deviceID; ///< Serial number or UID U32 waterSampleTestResult; ///< Pass or fail } TREATMENT_LOG_DATA_PAYLOAD_T; @@ -83,7 +82,7 @@ U32 execPostTreatmentMode( void ); // Execute the post-treatment mode state machine (call from OperationModes) void collectTreatmentLogData( void ); -void handleTreatmentLogDataRequest( void ); +void sendTreatmentLogDataToUI( void ); void signalUserConfirmPatientDisconnection( void ); void signalUserConfirmDisposableRemoval( void ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r3d5431d5aebe0c88c38a8732455a6dcf004fe6c2 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 3d5431d5aebe0c88c38a8732455a6dcf004fe6c2) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -120,6 +120,7 @@ static BOOL sendLastTreatmentPeriodicData; ///< Flag determines if HD needs to send the last treatment periodic data. static U32 treatmentStartTimeStamp; ///< Treatment start timestampt for logging purpose. +static U32 treatmentEndTimeStamp; ///< Treatment end timestampt for logging purpose. // ********** private function prototypes ********** @@ -183,6 +184,7 @@ sendLastTreatmentPeriodicData = FALSE; treatmentStartTimeStamp = getRTCTimestamp(); + treatmentEndTimeStamp = 0; } /*********************************************************************//** @@ -278,15 +280,15 @@ /*********************************************************************//** * @brief - * The getActualTreatmentTimeMins function determines the actual treatment - * duration in minutes. + * The getActualTreatmentTimeSecs function determines the actual treatment + * duration in seconds. * @details Inputs: treatmentTimeMS * @details Outputs: none - * @return The actual treatment duration in minutes. + * @return The actual treatment duration in seconds. *************************************************************************/ -U32 getActualTreatmentTimeMins( void ) +U32 getActualTreatmentTimeSecs( void ) { - return ( treatmentTimeMS / ( MS_PER_SECOND * SEC_PER_MIN ) ); + return ( treatmentTimeMS / MS_PER_SECOND ); } /*********************************************************************//** @@ -358,8 +360,14 @@ F32 getTreatmentAvgBloodFlowRate( void ) { U32 const numberOfDataPoint = ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ); + F32 result = 0.0; - return ( treatmentBloodFlowRateTotal_mL_min / numberOfDataPoint ); + if ( numberOfDataPoint > 0 ) + { + result = ( treatmentBloodFlowRateTotal_mL_min / numberOfDataPoint ); + } + + return result; } /*********************************************************************//** @@ -373,8 +381,14 @@ F32 getTreatmentAvgDialysateFlowRate( void ) { U32 const numberOfDataPoint = ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ); + F32 result = 0.0; - return ( treatmentDialysateFlowRateTotal_mL_min / numberOfDataPoint ); + if ( numberOfDataPoint > 0 ) + { + result = ( treatmentDialysateFlowRateTotal_mL_min / numberOfDataPoint ); + } + + return result; } /*********************************************************************//** @@ -388,8 +402,14 @@ F32 getTreatmentAvgDialysateTemp( void ) { U32 const numberOfDataPoint = ( treatmentTimeMS / TREATMENT_PERIODIC_DATA_LOG_INTERVAL ); + F32 result = 0.0; - return ( treatmentDialysateTempTotal_degree_C / numberOfDataPoint ); + if ( numberOfDataPoint > 0 ) + { + result = ( treatmentDialysateTempTotal_degree_C / numberOfDataPoint ); + } + + return result; } /*********************************************************************//** @@ -407,6 +427,19 @@ /*********************************************************************//** * @brief + * The getTreatmentEndTimeStamp function returns the treatment end + * time stamp. + * @details Inputs: treatmentEndTimeStamp + * @details Outputs: none + * @return the treatment end time stamp + *************************************************************************/ +U32 getTreatmentEndTimeStamp( void ) +{ + return treatmentEndTimeStamp; +} + +/*********************************************************************//** + * @brief * The signalAlarmActionToTreatmentMode function executes the given alarm action * as appropriate while in Treatment Mode. * @details Inputs: none @@ -670,6 +703,7 @@ { treatmentCompleted = TRUE; sendLastTreatmentPeriodicData = TRUE; + treatmentEndTimeStamp = getRTCTimestamp(); stopDialysis(); transitionToTreatmentEnd(); SET_ALARM_WITH_1_U32_DATA( ALARM_ID_END_OF_TREATMENT_WARNING, presTreatmentTimeSecs ); Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r3d5431d5aebe0c88c38a8732455a6dcf004fe6c2 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 3d5431d5aebe0c88c38a8732455a6dcf004fe6c2) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -106,7 +106,7 @@ TREATMENT_STATE_T getTreatmentState( void ); // Determine the current treatment sub-mode (state) BOOL isTreatmentCompleted( void ); // Determine whether the treatment has completed U32 getTreatmentTimeRemainingSecs( void ); // Determine number of seconds remaining in the treatment -U32 getActualTreatmentTimeMins( void ); // Determine the actual treatment duration in minutes +U32 getActualTreatmentTimeSecs( void ); // Determine the actual treatment duration in seconds BOOL getRinsebackCompleted( void ); // Determine whether a rinseback has been completed void setRinsebackIsCompleted( BOOL flag ); // Set whether a rinseback has been completed (T blocks rinseback option) BOOL getBloodIsPrimed( void ); // Determine whether the blood-side circuit of the dialyzer has been primed with blood @@ -115,6 +115,7 @@ F32 getTreatmentAvgDialysateFlowRate( void ); // Get the treatment average dialysate flow rate during treatment F32 getTreatmentAvgDialysateTemp( void ); // Get the treatment average dialysate temperature during treatment U32 getTreatmentStartTimeStamp( void ); // Get the treatment start time stamp +U32 getTreatmentEndTimeStamp( void ); // Get the treatment end time stamp void broadcastTreatmentTimeAndState( void ); // Broadcast the times and states of this treatment Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r6820043b5dc623a84e7323168dd1d4bd9815e859 -r6f2218c22e666aec059afbd60f3d0d268b305ad0 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6820043b5dc623a84e7323168dd1d4bd9815e859) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6f2218c22e666aec059afbd60f3d0d268b305ad0) @@ -667,7 +667,7 @@ { if ( 0 == message->hdr.payloadLen ) { - handleTreatmentLogDataRequest(); + sendTreatmentLogDataToUI(); } else {