Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r43e59e505bbea87c76822c51a3273eec3f4addaa -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 43e59e505bbea87c76822c51a3273eec3f4addaa) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -358,26 +358,26 @@ /*********************************************************************//** * @brief - * The getDialysateTemperature function gets the latest dialysate temperature. - * @details Inputs: dgDialysateTemp + * The getDGDisinfectsStates function returns the DG disinfects readings. + * @details Inputs: none * @details Outputs: none - * @return the current dialysate temperature + * @return the current DG disinfects readings *************************************************************************/ -F32 getDialysateTemperature( void ) +DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) { - return dgDialysateTemp; + return disinfectsStatus; } /*********************************************************************//** * @brief - * The getDGDisinfectsStates function returns the DG disinfects readings. - * @details Inputs: none + * The getDialysateTemperature function gets the latest dialysate temperature. + * @details Inputs: dgDialysateTemp * @details Outputs: none - * @return the current DG disinfects readings + * @return the current dialysate temperature *************************************************************************/ -DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ) +F32 getDialysateTemperature( void ) { - return disinfectsStatus; + return dgDialysateTemp; } /*********************************************************************//** Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -rcbaa57803fa8359407a799fca0cde6ae2c486bd7 -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision cbaa57803fa8359407a799fca0cde6ae2c486bd7) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -74,30 +74,30 @@ /// Payload record structure for DG temperature sensors data message. typedef struct { - F32 inletPrimaryHeater; ///< Inlet primary heater temperature sensor - F32 outletPrimaryHeater; ///< Outlet primary heater temperature sensor - F32 conductivitySensor1; ///< Conductivity sensor 1 temperature sensor - F32 conductivitySensor2; ///< Conductivity sensor 2 temperature sensor - F32 outletRedundant; ///< Outlet redundant temperature sensor - F32 inletDialysate; ///< Inlet dialysate temperature sensor - F32 primaryHeaterThermocouple; ///< Primary heaters thermocouple sensor - F32 trimmerHeaterThermocouple; ///< Trimmer heater thermocouple sensor - F32 priamyHeaterColdjunction; ///< Primary heaters cold junction temperature sensor - F32 trimmerHeaterColdjunction; ///< Trimmer heater cold junction temperature sensor - F32 primaryHeaterInternal; ///< Primary heaters internal temperature (calculated from thermocouple and cold junction) - F32 trimmerHeaterInternal; ///< Trimmer heater internal temperature (calculated from thermocouple and cold junction) - F32 fpgaBoard; ///< FPGA board temperature sensor - F32 loadCellA1B1; ///< Load cell A1/B1 temperature sensor - F32 loadCellA2B2; ///< Load cell A2/B2 temperature sensor - F32 internalTHDORTD; ///< THDo RTD channel temperature sensor - F32 internalTDIRTD; ///< TDI RTD channel temperature sensor - F32 internalCondSnsrTemp; ///< Conductivity Sensor internal temperature sensor - U32 primaryThermoCoupleRaw; ///< Primary heaters thermocouple raw ADC value - U32 primaryColdjuncRaw; ///< Primary heaters cold junction raw ADC value - U32 trimmerThermoCoupleRaw; ///< Trimmer heater thermocouple raw ADC value - U32 trimmerColdjuncRaw; ///< Trimmer heater cold junction raw ADC value - S32 cond1Raw; ///< Conductivity sensor 1 raw temperature ADC value - S32 cond2Raw; ///< Conductivity sensor 2 raw temperature ADC value + F32 TPi; ///< Inlet primary heaters temperature sensor + F32 TPo; ///< Outlet primary heaters temperature sensor + F32 TD1; ///< Conductivity sensor 1 temperature sensor + F32 TD2; ///< Conductivity sensor 2 temperature sensor + F32 TRo; ///< Outlet redundant temperature sensor + F32 TDi; ///< Inlet dialysate temperature sensor + F32 HtrPrimThermo; ///< Primary heaters internal temperature sensor + F32 HtrTrimThermo; ///< Trimmer heater internal temperature sensor + F32 HtrPrimColdJunc; ///< Primary heaters cold junction temperature sensor + F32 HtrTrimColdJunc; ///< Trimmer heater cold junction temperature sensor + F32 HtrPrimInternal; ///< Primary heaters internal temperature + F32 HtrTrimInternal; ///< Trimmer heater internal temperature + F32 DGBoardTemp; ///< DG board temperature + F32 ResOneLoadCellTemp; ///< Reservoir 1 load cell sensor temperature + F32 ResTwoLoadCellTemp; ///< Reservoir 2 load cell sensor temperature + F32 THDoInternalTemp; ///< THDo RTD channel temperature sensor + F32 TDiInternalTemp; ///< TDI RTD channel temperature sensor + F32 internalCondSnsrTemp; ///< Conductivity Sensor internal temperature sensor + U32 primaryThermoCoupleRaw; ///< Primary heaters thermocouple raw ADC value + U32 primaryColdjuncRaw; ///< Primary heaters cold junction raw ADC value + U32 trimmerThermoCoupleRaw; ///< Trimmer heater thermocouple raw ADC value + U32 trimmerColdjuncRaw; ///< Trimmer heater cold junction raw ADC value + S32 cond1Raw; ///< Conductivity sensor 1 raw temperature ADC value + S32 cond2Raw; ///< Conductivity sensor 2 raw temperature ADC value } TEMPERATURE_SENSORS_DATA_T; /// Payload record structure for a drain reservoir command message. @@ -156,6 +156,7 @@ F32 getReservoirBackupWeightLargeFilter( DG_RESERVOIR_ID_T resID ); F32 getDialysateTemperature( void ); DG_DISINFECT_UI_STATES_T getDGDisinfectsStates( void ); +F32 getDialysateTemperature( void ); DG_MIXING_RATIOS_T getDGMixingRatios( void ); void setDGOpMode( U32 opMode, U32 subMode ); Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r7499a42cc0f906f9a4a947c82c5b4615217ce7e5 -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 7499a42cc0f906f9a4a947c82c5b4615217ce7e5) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -22,7 +22,8 @@ #include "NVDataMgmt.h" #include "OperationModes.h" #include "PersistentAlarm.h" -#include "SystemCommMessages.h" +#include "SystemCommMessages.h" +#include "SelfTests.h" #include "TaskGeneral.h" #include "Temperatures.h" #include "Timers.h" @@ -69,6 +70,7 @@ #define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. +// The new arterial pressure sensor is the same as the venous pressure sensor #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. #define VENOUS_PRESSURE_CMD_MODE 1 ///< Venous pressure status bits indicate sensor in command mode. #define VENOUS_PRESSURE_STALE_DATA 2 ///< Venous pressure status bits indicate data is stale (no new data since last fpga read). @@ -709,7 +711,7 @@ static void checkOcclusions( void ) { U32 bpOccl = getMeasuredBloodPumpOcclusion(); - BOOL outOfRange = ( bpOccl < MIN_OCCLUSION_COUNTS || bpOccl > MAX_OCCLUSION_COUNTS ? TRUE : FALSE ); + BOOL outOfRange = ( bpOccl < MIN_OCCLUSION_COUNTS || bpOccl > MAX_OCCLUSION_COUNTS ? TRUE : FALSE ); #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) @@ -721,14 +723,37 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, bpOccl ); } - // Check for occlusion - if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + // Check for occlusion in PreTreatment modes when the cartridge is installed + // and setOcclusionInstallLevel has been called. + if( MODE_PRET == getCurrentOperationMode() ) { - signalBloodPumpHardStop(); // Stop pump immediately - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) + if( getPreTreatmentSubState() > HD_PRE_TREATMENT_CART_INSTALL_STATE && getDrySelfTestsState() > DRY_SELF_TESTS_START_STATE ) + { + // Check for occlusion + if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + signalBloodPumpHardStop(); // Stop pump immediately + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) + } + } } - else + // Check for occlusion in PreTreatment modes where pumps are moving + else if( MODE_TREA == getCurrentOperationMode() ) { + if( TREATMENT_STOP_STATE != getTreatmentState()) + { + // Check for occlusion + if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + signalBloodPumpHardStop(); // Stop pump immediately + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) + } + } + } + + // Clear alarm regardless of op mode once conditions are met. + if ( bpOccl <= ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { clearAlarmCondition( ALARM_ID_OCCLUSION_BLOOD_PUMP ); } } Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r3c5b521fcaa489eef9df0e2d657c7e0b23dd8ece -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 3c5b521fcaa489eef9df0e2d657c7e0b23dd8ece) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -91,6 +91,7 @@ /// Expected position of empty in relation to home position. #define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 10.84F ) + /// Margin of error for empty position determination. #define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5F ) /// Minimum retract position. @@ -1981,6 +1982,7 @@ *************************************************************************/ + /*********************************************************************//** * @brief * The testSetSyringePumpDataPublishIntervalOverride function overrides the Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -red4265fbaf50eefd9c7243fb1fc8ee7db0296746 -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision ed4265fbaf50eefd9c7243fb1fc8ee7db0296746) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -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 @@ -156,14 +156,6 @@ postState = handlePOSTStatus( testStatus ); break; - case POST_STATE_AC: - if ( getMonitoredLineLevel( MONITORED_LINE_24V ) < MIN_24V_MEASURED_FOR_AC ) - { - initiatePowerOff(); - } - postState = POST_STATE_WATCHDOG; - break; - case POST_STATE_WATCHDOG: testStatus = execWatchdogTest(); postState = handlePOSTStatus( testStatus ); @@ -191,6 +183,7 @@ case POST_STATE_BLOOD_FLOW: testStatus = execBloodFlowTest(); postState = handlePOSTStatus( testStatus ); + sendUIRequestPOSTFinalResult(); // request UI POST final result here so we have it before UI test below break; case POST_STATE_DIALYSATE_INLET_FLOW: Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rfe91ec494378a7df34e3c14853a797f9f8f044e9 -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision fe91ec494378a7df34e3c14853a797f9f8f044e9) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -478,12 +478,24 @@ * given reservoir. * @details Inputs: reservoirFilledStatus * @details Outputs: none - * @return TRUE if reservoir has been filled, otherwise FALSE; + * @return TRUE if reservoir has been filled, otherwise FALSE *************************************************************************/ BOOL getReservoirFillStatus( DG_RESERVOIR_ID_T reservoirID ) { return reservoirFilledStatus[ reservoirID ]; } +/*********************************************************************//** + * @brief + * The getPreTreatmentSubState function gets the current + * pre-treatment mode state. + * @details Inputs: currentPreTreatmentState + * @details Outputs: none + * @return currentPreTreatmentState + *************************************************************************/ +HD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ) +{ + return currentPreTreatmentState; +} /*********************************************************************//** * @brief Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rb2e2a47fef76897387c630a2508b6bc1521fff34 -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Modes/Prime.c (.../Prime.c) (revision b2e2a47fef76897387c630a2508b6bc1521fff34) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -166,6 +166,8 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); + doorClosedRequired( TRUE, TRUE ); + // Pumps should be off signalBloodPumpHardStop(); signalDialInPumpHardStop(); @@ -594,7 +596,7 @@ // Calculate the time out value that must passed prior to checking for the steady state volume in the reservoir primeDialysateDialyzerTimeLimit = (U32)( ( ( DIALYSATE_DIALYZER_TUBE_VOLUME_ML + dialyzerDialysateVolume ) * SEC_PER_MIN * MS_PER_SECOND ) / DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN ); - minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); + minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); steadyVolumeCount = 0; steadyVolumeSamplingStartTime = getMSTimerCount(); primeDialysateDialyzerStartTime = getMSTimerCount(); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rd6255708e8305bf5509485a860eb3469a42ec9ad -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision d6255708e8305bf5509485a860eb3469a42ec9ad) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -41,7 +41,7 @@ #define PUMP_RUN_SELF_TEST_TIME_MS ( 15 * MS_PER_SECOND ) ///< Self-test time to run pumps in ms. #define PUMP_SELF_TEST_FLOW_RATE_ML_MIN 100 ///< Self-test pump flow rate in mL/min. -#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 3 * MS_PER_SECOND ) ///< Delay 3 seconds then check for syringe pump prime occlusion. +#define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 1 * MS_PER_SECOND ) ///< Delay 3 seconds then check for syringe pump prime occlusion. #define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 5 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. #define NORMALIZED_PRESSURE_SELF_TEST_TIME ( 4 * MS_PER_SECOND ) ///< Time to wait for pressure to normalize in ms. @@ -326,7 +326,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); +// SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_NO_CART_SELF_TEST_TIMEOUT, currentNoCartSelfTestsState ); } } } @@ -389,7 +389,6 @@ *************************************************************************/ void execDrySelfTests( void ) { - SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; // execute dry self-tests state machine switch ( currentDrySelfTestsState ) @@ -467,11 +466,6 @@ // Self-tests flags should be handled by now, reset if flags not handled with current state resetSelfTestsFlags(); - if ( SELF_TEST_STATUS_FAILED == result ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, currentDrySelfTestsState ); - } - // Publish current self-test time data if ( calcTimeSince( selfTestPreviousPublishDataTime ) >= SELF_TEST_TIME_DATA_PUB_INTERVAL ) { @@ -891,10 +885,10 @@ { state = DRY_SELF_TESTS_OCCLUSION_SENSORS_STATE; } - else - { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); - } +// else +// { +// activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); +// } if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -1037,8 +1031,8 @@ { if ( TRUE == isSyringePumpPrimed() ) { + syringeOcclusionDelayStartTime = getMSTimerCount(); // Get the current time to check for occlusion after 1 second has elapsed state = DRY_SELF_TESTS_SYRINGE_PUMP_OCCLUSION_DETECTION_STATE; - syringeOcclusionDelayStartTime = getMSTimerCount(); // Get the current time to check for occlusion after 3 seconds has elapsed } else { Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r43e59e505bbea87c76822c51a3273eec3f4addaa -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 43e59e505bbea87c76822c51a3273eec3f4addaa) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -28,6 +28,7 @@ #include "Fans.h" #include "FPGA.h" #include "ModeStandby.h" +#include "ModeInitPOST.h" #include "OperationModes.h" #include "RTC.h" #include "SampleWater.h" @@ -2359,13 +2360,13 @@ { TEMPERATURE_SENSORS_DATA_T payload; - memcpy( &payload, message->payload, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); - setDialysateTemperatureReadings( payload.inletDialysate, payload.outletRedundant ); - } - // TODO - what to do if invalid payload length? - // TODO - how to know if DG stops sending these? -} - + memcpy( &payload, message->payload, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); + setDialysateTemperatureReadings( payload.TDi, payload.TRo ); + } + // TODO - what to do if invalid payload length? + // TODO - how to know if DG stops sending these? +} + /*********************************************************************//** * @brief * The handleDialysateFlowData function handles dialysate flow data broadcast @@ -5187,6 +5188,7 @@ if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) { memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) { result = testSetBatteryRemainingPercentOverride( payload.state.u32 );