Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rd558c3058a027d8f4407c7bb882505e30225a7f9 -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision d558c3058a027d8f4407c7bb882505e30225a7f9) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file DGInterface.h * * @author (last) Dara Navaei -* @date (last) 07-Mar-2022 +* @date (last) 13-Jul-2022 * * @author (original) Sean * @date (original) 08-Apr-2020 @@ -34,6 +34,8 @@ #define DEFAULT_TARGET_FILL_FLOW_RATE_LPM 0.8F ///< Default target fill flow rate in L/min. #define DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during treatment. +#define LOAD_CELL_PRIMARY_BACKUP_MAX_ALLOWED_DRIFT_GRAMS 10.0F ///< Reservoir load cell drift difference allowed +#define LOAD_CELL_ILLEGAL_WEIGHT_VALUE -10000.0F ///< Initial value for Load Cells, known bad value /// DG Concentrate ratios data structure. typedef struct @@ -151,6 +153,7 @@ F32 getLoadCellWeight( LOAD_CELL_ID_T loadCellID ); F32 getReservoirWeight( DG_RESERVOIR_ID_T resID ); F32 getReservoirWeightLargeFilter( DG_RESERVOIR_ID_T resID ); +F32 getReservoirBackupWeightLargeFilter( DG_RESERVOIR_ID_T resID ); F32 getDialysateTemperature( void ); DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ); DG_MIXING_RATIOS_T getDGMixingRatios( void ); Index: firmware/App/Controllers/Switches.c =================================================================== diff -u -r9bf209fc5813b7e806f51f408ece77174a336c9b -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Controllers/Switches.c (.../Switches.c) (revision 9bf209fc5813b7e806f51f408ece77174a336c9b) +++ firmware/App/Controllers/Switches.c (.../Switches.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file Switches.c * * @author (last) Dara Navaei -* @date (last) 13-Jun-2022 +* @date (last) 13-Jul-2022 * * @author (original) Dara Navaei * @date (original) 25-Jul-2021 @@ -111,7 +111,8 @@ break; #ifndef _VECTORCAST_ - // The default cannot be reached in VectorCAST since the cases are run in a for loop + // Since this is a for loop the default cannot be reached in VectorCAST for 100% coverage + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_SWITCH_ID, i ) break; Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r06477e29097a60ca81d5d9382c4a773d30dedf69 -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 06477e29097a60ca81d5d9382c4a773d30dedf69) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file SyringePump.c * * @author (last) Dara Navaei -* @date (last) 15-Jun-2022 +* @date (last) 13-Jul-2022 * * @author (original) Sean Nash * @date (original) 04-Mar-2021 @@ -503,12 +503,9 @@ if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && ( heparinDeliveryState != HEPARIN_STATE_OFF ) ) { { - heparinDeliveryState = HEPARIN_STATE_STOPPED; - if ( ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) - { - syringePumpSetRate = SYRINGE_PUMP_RETRACT_RATE; - syringePumpRetractRequested = TRUE; - } + heparinDeliveryState = HEPARIN_STATE_STOPPED; + syringePumpSetRate = SYRINGE_PUMP_RETRACT_RATE; + syringePumpRetractRequested = TRUE; } } @@ -609,7 +606,6 @@ { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (F32)SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, syringePumpSetRate ) } - } return syringePumpBolusRequested; @@ -1858,9 +1854,9 @@ syringePumpRampTimerCtr++; if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { - syringePumpRampUpToggleTime = (U32)((F32)SYRINGE_PUMP_START_RAMP_SPEED / - (F32)( ( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr ) / SYRINGE_PUMP_RAMP_DIVISOR ) ); - syringePumpRampUpPct = syringePumpSetToggleTime / syringePumpRampUpToggleTime; + syringePumpRampUpToggleTime = (U32)( (F32)SYRINGE_PUMP_START_RAMP_SPEED / + ( (F32)( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr ) / (F32)SYRINGE_PUMP_RAMP_DIVISOR ) ); + syringePumpRampUpPct = (F32)syringePumpSetToggleTime / (F32)syringePumpRampUpToggleTime; if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r9bf209fc5813b7e806f51f408ece77174a336c9b -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 9bf209fc5813b7e806f51f408ece77174a336c9b) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file Dialysis.c * * @author (last) Dara Navaei -* @date (last) 23-May-2022 +* @date (last) 13-Jul-2022 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -65,6 +65,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 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). @@ -106,6 +107,7 @@ static void updateUFVolumes( void ); static void publishSalineBolusData( void ); +static void checkLoadCellsStablePrimaryBackupDriftOutOfRange( DG_RESERVOIR_ID_T reservoirID ); /*********************************************************************//** * @brief @@ -118,6 +120,8 @@ *************************************************************************/ void initDialysis( void ) { + U16 i; + currentDialysisState = DIALYSIS_START_STATE; currentUFState = UF_START_STATE; currentSalineBolusState = SALINE_BOLUS_STATE_IDLE; @@ -142,6 +146,10 @@ uFAccuracyCheckTimerCtr = 0; lastUFVolumeChecked = 0.0; + for (i=0; i (LOAD_CELL_ILLEGAL_WEIGHT_VALUE + 1) ) + { + // Weight has been previously saved, ok to test + loadCellPreviousDrift = lcLastSteadyWeight[lcPrimaryIndex] - lcLastSteadyWeight[lcBackupIndex]; + driftDiff = fabs ( loadCellCurrentDrift - loadCellPreviousDrift ); + } + // Save latest reading for next test time + lcLastSteadyWeight[lcPrimaryIndex] = loadCellPrimaryWeight; + lcLastSteadyWeight[lcBackupIndex] = loadCellBackupWeight; + + // 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 ) + } +} + /**@}*/ Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -rcf112a84960c23d396255453a49118181fd250f1 -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision cf112a84960c23d396255453a49118181fd250f1) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file ModeInitPOST.c * * @author (last) Dara Navaei -* @date (last) 03-Apr-2022 +* @date (last) 13-Jul-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rfe91ec494378a7df34e3c14853a797f9f8f044e9 -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision fe91ec494378a7df34e3c14853a797f9f8f044e9) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file ModeStandby.c * * @author (last) Dara Navaei -* @date (last) 03-May-2022 +* @date (last) 13-Jul-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -589,7 +589,6 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushCmdResponseState( void ) { DG_CMD_RESPONSE_T dgCmdResp; - HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; BOOL result = FALSE; @@ -669,7 +668,6 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectCmdResponseState( void ) { DG_CMD_RESPONSE_T dgCmdResp; - HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; BOOL result = FALSE; @@ -746,7 +744,6 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectCmdResponseState( void ) { DG_CMD_RESPONSE_T dgCmdResp; - HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; BOOL result = FALSE; Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r9bf209fc5813b7e806f51f408ece77174a336c9b -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 9bf209fc5813b7e806f51f408ece77174a336c9b) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -7,8 +7,8 @@ * * @file Rinseback.c * -* @author (last) Sean Nash -* @date (last) 09-May-2022 +* @author (last) Dara Navaei +* @date (last) 13-Jul-2022 * * @author (original) Sean Nash * @date (original) 20-Jan-2021 @@ -493,14 +493,8 @@ { RINSEBACK_STATE_T result = RINSEBACK_STOP_STATE; - // Have we been in this stopped state for too long w/o having delivered full blood volume back to patient? - if ( ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) && ( getRinsebackVolume() < rinsebackTargetVolume_mL ) ) - { - signalGoToTreatmentStopped(); - activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); - } // Have we been in this stopped state for too long despite having delivered full blood volume back to patient? - else if ( ( rinsebackTimerCtr > MAX_RINSEBACK_DONE_TIME ) && ( getRinsebackVolume() >= rinsebackTargetVolume_mL ) ) + if ( ( rinsebackTimerCtr > MAX_RINSEBACK_DONE_TIME ) && ( getRinsebackVolume() >= rinsebackTargetVolume_mL ) ) { signalGoToTreatmentStopped(); activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); @@ -511,6 +505,12 @@ { activateAlarmNoData( ALARM_ID_HD_TREATMENT_RINSEBACK_TIMEOUT_WARNING ); } + // Have we been in this stopped state for too long w/o having delivered full blood volume back to patient? + else if ( ( rinsebackTimerCtr > MAX_RINSEBACK_TIME ) && ( getRinsebackVolume() < rinsebackTargetVolume_mL ) ) + { + signalGoToTreatmentStopped(); + activateAlarmNoData( ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM ); + } else if ( TRUE == recircRequested ) { signalRinsebackToRecirc(); Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r837ce5b9b64a6ccdb006af5fcc62a540fe14dfb7 -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 837ce5b9b64a6ccdb006af5fcc62a540fe14dfb7) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) @@ -8,7 +8,7 @@ * @file SystemCommMessages.h * * @author (last) Dara Navaei -* @date (last) 14-Jun-2022 +* @date (last) 13-Jul-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -74,9 +74,6 @@ // ACK MSG BOOL sendACKMsg( MESSAGE_T *message ); -// Serialize message -U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ); - // MSG_ID_DG_CHECK_IN void handleDGCheckIn( MESSAGE_T *message );