Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r9848d793638e2f613678e60ea7c0f1e7bc31d9eb -r1f91b5a53bda942b0967817bbd5e68a499dbf816 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 9848d793638e2f613678e60ea7c0f1e7bc31d9eb) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 1f91b5a53bda942b0967817bbd5e68a499dbf816) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Dialysis.c * -* @author (last) Dara Navaei -* @date (last) 23-May-2022 +* @author (last) Michael Garthwaite +* @date (last) 19-Jan-2023 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -52,6 +52,14 @@ #define MAX_ACTIVE_LOAD_CELL_CHANGE_G 50.0F ///< Maximum delta between new and previous measured UF volume. +/// Defined states for the Load Cell cycles. +typedef enum Reservoir_Steady_Cycle +{ + RESERVOIR_STEADY_CYCLE_START = 0, ///< Reservoir steady cycle load cell reading at Start + RESERVOIR_STEADY_CYCLE_FINAL, ///< Reservoir steady cycle load cell reading at Final + NUM_OF_RESERVOIR_STEADY_CYCLES ///< Number of Reservoir steady cycle load cell readings +} RESERVOIR_STEADY_CYCLE_T; + // ********** private data ********** static DIALYSIS_STATE_T currentDialysisState; ///< Current state of the dialysis sub-mode state machine. @@ -65,7 +73,7 @@ static F32 resCurrVolume[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoir current volume. static F32 resLastVolume[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoir previous volume. static F32 measUFVolumeFromPriorReservoirs; ///< Current total ultrafiltration volume from previous reservoirs in current treatment. -static F32 lcLastSteadyWeight[NUM_OF_LOAD_CELLS]; ///< Load Cell Last Steady Weight for drift test +static F32 lcLastSteadyWeight[NUM_OF_RESERVOIR_STEADY_CYCLES][NUM_OF_LOAD_CELLS]; ///< Load Cell Last Steady Weight for drift test Start/Final cycle static U32 uFTimeMS; ///< Current elapsed ultrafiltration time (in ms). Used for calculating UF reference volume. static U32 lastUFTimeStamp; ///< HD timer value when we last took stock of ultrafiltration time (so we can determine how much time has elapsed since). @@ -107,7 +115,7 @@ static void updateUFVolumes( void ); static void publishSalineBolusData( void ); -static void checkLoadCellsStablePrimaryBackupDriftOutOfRange( DG_RESERVOIR_ID_T reservoirID ); +static void checkLoadCellsStablePrimaryBackupDriftOutOfRange( DG_RESERVOIR_ID_T reservoirID, RESERVOIR_STEADY_CYCLE_T cycle ); /*********************************************************************//** * @brief @@ -148,7 +156,8 @@ for (i=0; i (LOAD_CELL_ILLEGAL_WEIGHT_VALUE + 1) ) + SEND_EVENT_WITH_2_F32_DATA( event, loadCellPrimaryWeight, loadCellBackupWeight ) + + if ( ( RESERVOIR_STEADY_CYCLE_FINAL == cycle ) && ( lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcPrimaryIndex ] > ( LOAD_CELL_ILLEGAL_WEIGHT_VALUE + 1 ) ) ) { - // Weight has been previously saved, ok to test - loadCellPreviousDrift = lcLastSteadyWeight[lcPrimaryIndex] - lcLastSteadyWeight[lcBackupIndex]; - driftDiff = fabs ( loadCellCurrentDrift - loadCellPreviousDrift ); + // Start Weight has been previously saved, ok to test + loadCellPreviousDrift = lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcPrimaryIndex ] - lcLastSteadyWeight[ RESERVOIR_STEADY_CYCLE_START ][ lcBackupIndex ]; + driftDiff = fabs ( loadCellCurrentDrift - loadCellPreviousDrift ); } // Save latest reading for next test time - lcLastSteadyWeight[lcPrimaryIndex] = loadCellPrimaryWeight; - lcLastSteadyWeight[lcBackupIndex] = loadCellBackupWeight; + lcLastSteadyWeight[ cycle ][ lcPrimaryIndex ] = loadCellPrimaryWeight; + lcLastSteadyWeight[ cycle ][ lcBackupIndex ] = loadCellBackupWeight; - // Check for drift out of range - if ( driftDiff > LOAD_CELL_PRIMARY_BACKUP_MAX_ALLOWED_DRIFT_GRAMS ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ULTRAFILTRATION_ALARMS ) != SW_CONFIG_ENABLE_VALUE ) +#endif { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_LOAD_CELL_PRIMARY_BACKUP_DRIFT_OUT_OF_RANGE, loadCellCurrentDrift, loadCellPreviousDrift ) + // Check for drift out of range + if ( driftDiff > LOAD_CELL_PRIMARY_BACKUP_MAX_ALLOWED_DRIFT_GRAMS ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_LOAD_CELL_PRIMARY_BACKUP_DRIFT_OUT_OF_RANGE, loadCellCurrentDrift, loadCellPreviousDrift ) + } } }