Index: firmware/App/Drivers/SafetyShutdown.c =================================================================== diff -u -r19a8bf98a7154e24c35da25225d4b55bf70ddd09 -rb9300084966f27ebd166962121c5217f5cd30eb0 --- firmware/App/Drivers/SafetyShutdown.c (.../SafetyShutdown.c) (revision 19a8bf98a7154e24c35da25225d4b55bf70ddd09) +++ firmware/App/Drivers/SafetyShutdown.c (.../SafetyShutdown.c) (revision b9300084966f27ebd166962121c5217f5cd30eb0) @@ -46,6 +46,7 @@ #define MIN_BACKUP_ALARM_CURRENT_MA 200.0F ///< Minimum backup alarm audio current (in mA) detected when safety shutdown asserted. #define MAX_BACKUP_ALARM_CURRENT_MA 10.0F ///< Maximum backup alarm audio current (in mA) detected when safety shutdown is recovered. +#define SAFETY_POST_24V_INITIAL 0 ///< Safety shutdown POST failed because 24V was out before safety line pulled. #define SAFETY_POST_24V_NOT_CUT 1 ///< Safety shutdown POST failed because 24V was not cut when safety line pulled. #define SAFETY_POST_NO_24V_RESTORE 2 ///< Safety shutdown POST failed because 24V was not restored when safety line reset. @@ -128,6 +129,14 @@ { case SAFETY_SHUTDOWN_SELF_TEST_STATE_START: safetyShutdownSelfTestState = SAFETY_SHUTDOWN_SELF_TEST_STATE_IN_PROGRESS; +#ifndef DISABLE_WD_AND_SFTY_POST_TESTS + // Verify 24V is up + if ( v24 < MIN_24V_LEVEL_ON_SAFETY_RECOVER ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SAFETY_SHUTDOWN_POST_TEST_FAILED, (F32)SAFETY_POST_24V_INITIAL, v24 ); + safetyShutdownSelfTestStatus = SELF_TEST_STATUS_FAILED; + } +#endif safetyShutdownSelfTestTimerCount = getMSTimerCount(); activateSafetyShutdown(); break; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r8b73263b38f449dacc0795c67a7cf6240cb79026 -rb9300084966f27ebd166962121c5217f5cd30eb0 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 8b73263b38f449dacc0795c67a7cf6240cb79026) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision b9300084966f27ebd166962121c5217f5cd30eb0) @@ -78,7 +78,7 @@ #define SCI2_RECEIVE_DMA_REQUEST 28 ///< Serial port 2 receive DMA request line. #define SCI2_TRANSMIT_DMA_REQUEST 29 ///< Serial port 2 transmit DMA request line. -#define MAX_COMM_ERROR_RETRIES 5 ///< Maximum consecutive FPGA communication error retries. +#define MAX_COMM_ERROR_RETRIES 10 ///< Maximum consecutive FPGA communication error retries. #define FPGA_INPUT_VOLTAGE_SCALE 3.0F ///< FPGA source and aux voltage. #define FPGA_PVN_VOLTAGE_SCALE 1.0F ///< FPGA pvn voltage. Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rad4d98e7d69ee6320a7ab573c353cd6ff92a76fe -rb9300084966f27ebd166962121c5217f5cd30eb0 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision ad4d98e7d69ee6320a7ab573c353cd6ff92a76fe) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision b9300084966f27ebd166962121c5217f5cd30eb0) @@ -39,6 +39,8 @@ #define DIA_FLOW_TO_FILL_FLOW_FIRST_ORDER_COEFF 7.5F ///< Dialysate flow rate to fill flow rate first order coefficient. #define DIA_FLOW_TO_FILL_FLOW_CONSTANT 2.0F ///< Dialysate flow rate to fill flow rate constant. +#define MAX_RESERVOIR_VOL_BEFORE_SWITCH_ML 1900.0F ///< Maximum reservoir volume before we switch reservoirs (in mL). + // ********** private data ********** /// States of the treatment reservoir management state machine. @@ -513,9 +515,7 @@ timeWaitToFillMS = timeDepleteMS - ( getFillTimeMS() + RESERVOIR_SETTLE_TIME_MS + RESERVOIR_CYCLE_EXTRA_MARGIN_TIME_MS ); // If the wait time has elapsed, trigger a fill command - // TODO uncomment - //if ( timeWaitToFillMS <= 0 ) - // TODO uncomment + if ( timeWaitToFillMS <= 0 ) { cmdStartDGFill( FILL_RESERVOIR_TO_VOLUME_ML, targetFillFlowRateLPM ); } @@ -587,10 +587,16 @@ static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForFillSettleState( void ) { TREATMENT_RESERVOIR_MGMT_STATE_T state = TREATMENT_RESERVOIR_MGMT_WAIT_FOR_FILL_SETTLE_STATE; + DG_RESERVOIR_ID_T active = getDGActiveReservoir(); + // Get the ultra-filtration volume milliliters + // Get the dilution level in percent = spent ultra-filtration volume / target fill volume in milliliters + volSpentUFML = getReservoirUltrafiltrationVol( activeReservoir ); + dilutionLevelPct = volSpentUFML / (F32)FILL_RESERVOIR_TO_VOLUME_ML; + // Wait for the reservoir to settle and then send the commands to switch the active reservoir TODO - restore #define below if ( ( TRUE == didTimeout( reservoirSwitchStartTimeMS, 15000 /*RESERVOIR_SETTLE_TIME_MS*/ ) ) && - ( ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)FILL_RESERVOIR_TO_VOLUME_ML ) ) ) + ( ( dilutionLevelPct >= MAX_RESERVOIR_DILUTION ) || ( volSpentML >= (F32)FILL_RESERVOIR_TO_VOLUME_ML ) || ( getReservoirWeight( active ) > MAX_RESERVOIR_VOL_BEFORE_SWITCH_ML ) ) ) { DG_RESERVOIR_ID_T inactiveRes = getDGInactiveReservoir();