Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r1c7149a0ff9ea2497c7765128ba24404fd49a30c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 1c7149a0ff9ea2497c7765128ba24404fd49a30c) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file AirTrap.c * -* @author (last) Dara Navaei -* @date (last) 01-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean Nash * @date (original) 16-Sep-2020 Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file BloodFlow.c * -* @author (last) Dara Navaei -* @date (last) 02-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file BloodFlow.h * -* @author (last) Sean Nash -* @date (last) 14-Jan-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r7c0f0fa22adeb8e268ce1197a9de6adf11d5c09b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 7c0f0fa22adeb8e268ce1197a9de6adf11d5c09b) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file BloodLeak.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Peman Montazemi * @date (original) 18-Mar-2021 Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file DGInterface.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean * @date (original) 08-Apr-2020 Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -45,16 +45,16 @@ /// Interval (ms/task time) at which the dialIn flow data is published on the CAN bus. #define DIAL_IN_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133 ///< Max duty cycle change when ramping up ~ 200 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02 ///< Max duty cycle change when ramping down ~ 300 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89 ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. -#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10 ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. +#define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133F ///< Max duty cycle change when ramping up ~ 200 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02F ///< Max duty cycle change when ramping down ~ 300 mL/min/s. +#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89F ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. +#define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10F ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. #define DIP_CONTROL_INTERVAL_SEC 10 ///< Dialysate inlet pump control interval (in seconds). /// Interval (ms/task time) at which the dialIn pump is controlled. static const U32 DIP_CONTROL_INTERVAL = ( DIP_CONTROL_INTERVAL_SEC * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); -#define DIP_P_COEFFICIENT 0.0001 ///< P term for dialIn pump control. -#define DIP_I_COEFFICIENT 0.00075 ///< I term for dialIn pump control. +#define DIP_P_COEFFICIENT 0.0001F ///< P term for dialIn pump control. +#define DIP_I_COEFFICIENT 0.00075F ///< I term for dialIn pump control. #define DIP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. #define DIP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). @@ -64,12 +64,12 @@ #define DIP_SPEED_CALC_BUFFER_LEN ( 1000 / DIP_SPEED_CALC_INTERVAL / TASK_PRIORITY_INTERVAL ) #define DIP_HALL_EDGE_COUNTS_PER_REV 48 ///< Number of hall sensor edge counts per motor revolution. -#define DIP_MAX_FLOW_RATE 1320.0 ///< Maximum measured BP flow rate allowed. -#define DIP_MIN_FLOW_RATE -1320.0 ///< Minimum measured BP flow rate allowed. -#define DIP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0 ///< Maximum difference between measured motor speed and speed implied by measured flow. -#define DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0 ///< Maximum motor speed (RPM) while motor is commanded off. -#define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0 ///< Maximum difference in speed between motor and rotor (in rotor RPM). -#define DIP_MAX_MOTOR_SPEED_ERROR_RPM 300.0 ///< Maximum difference in speed between measured and commanded RPM. +#define DIP_MAX_FLOW_RATE 1320.0F ///< Maximum measured BP flow rate allowed. +#define DIP_MIN_FLOW_RATE -1320.0F ///< Minimum measured BP flow rate allowed. +#define DIP_MAX_FLOW_VS_SPEED_DIFF_RPM 200.0F ///< Maximum difference between measured motor speed and speed implied by measured flow. +#define DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0F ///< Maximum motor speed (RPM) while motor is commanded off. +#define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0F ///< Maximum difference in speed between motor and rotor (in rotor RPM). +#define DIP_MAX_MOTOR_SPEED_ERROR_RPM 300.0F ///< Maximum difference in speed between measured and commanded RPM. /// Persist time (task intervals) for flow vs. motor speed error condition. static const U32 DIP_FLOW_VS_SPEED_PERSIST = ((5 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); @@ -86,30 +86,31 @@ /// Time threshold to trigger an alarm if Dialysate flow data has not arrived within 3 seconds static const U32 DIP_DIALYSATE_FLOW_DATA_ALARM_THRESHOLD = ((3 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); -#define DIP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< Motor controller current should not exceed this when pump should be stopped. -#define DIP_MAX_CURR_WHEN_RUNNING_MA 2000.0 ///< Motor controller current should not exceed this when pump should be running. +#define DIP_MAX_CURR_WHEN_STOPPED_MA 150.0F ///< Motor controller current should not exceed this when pump should be stopped. +#define DIP_MAX_CURR_WHEN_RUNNING_MA 2000.0F ///< Motor controller current should not exceed this when pump should be running. #define DIP_MAX_CURR_ERROR_DURATION_MS 2000 ///< Motor controller current errors persisting beyond this duration will trigger an alarm. -#define DIAL_IN_PUMP_ADC_FULL_SCALE_V 3.0 ///< BP analog signals are 0-3V (while int. ADC ref V may be different). +#define DIAL_IN_PUMP_ADC_FULL_SCALE_V 3.0F ///< BP analog signals are 0-3V (while int. ADC ref V may be different). #define DIAL_IN_PUMP_ADC_ZERO 1998 ///< Mid-point (zero) for ADC readings. ///< Macro converts a 12-bit ADC reading to a signed 16-bit value. #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)DIAL_IN_PUMP_ADC_ZERO ) -#define DIP_SPEED_ADC_TO_RPM_FACTOR 1.751752 ///< Conversion factor from ADC counts to RPM for dialIn pump motor (3500 RPM/1998 counts). -#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.000238 ///< ~42 BP motor RPM = 1% PWM duty cycle -#define DIP_CURRENT_ADC_TO_MA_FACTOR 3.002 ///< Conversion factor from ADC counts to mA for dialIn pump motor. +#define DIP_SPEED_ADC_TO_RPM_FACTOR 1.751752F ///< Conversion factor from ADC counts to RPM for dialIn pump motor (3500 RPM/1998 counts). +#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.000238F ///< ~42 BP motor RPM = 1% PWM duty cycle +#define DIP_CURRENT_ADC_TO_MA_FACTOR 3.002F ///< Conversion factor from ADC counts to mA for dialIn pump motor. -#define DIP_REV_PER_LITER 146.84 ///< Rotor revolutions per liter. +#define DIP_REV_PER_LITER 146.84F ///< Rotor revolutions per liter. /// Macro converts flow rate to motor RPM. #define DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DIP_REV_PER_LITER / ML_PER_LITER ) -#define DIP_GEAR_RATIO 32.0 ///< DialIn pump motor to dialIn pump gear ratio. +#define DIP_GEAR_RATIO 32.0F ///< DialIn pump motor to dialIn pump gear ratio. #define DIP_PWM_ZERO_OFFSET 0.1F ///< 10% PWM duty cycle = zero speed. /// Macro converts flow rate to estimate PWM needed to achieve it. -#define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) +#define DIP_PWM_FROM_ML_PER_MIN(rate) ( ( ((rate)*(rate)) * 0.000001 ) + ( (rate) * 0.0005 ) + 0.126 + DIP_PWM_ZERO_OFFSET ) +//#define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) /// Conversion from PWM duty cycle % to commanded pump motor speed. -#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0 ) +#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) /// Measured dialIn flow is filtered w/ moving average. #define SIZE_OF_ROLLING_AVG 10 @@ -1016,11 +1017,15 @@ U08 dirErrorCnt = getFPGADialInPumpHallSensorStatus() & PUMP_DIR_ERROR_COUNT_MASK; // Check pump direction error count - if ( ( lastDialInPumpDirectionCount != dirErrorCnt ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + if ( lastDialInPumpDirectionCount != dirErrorCnt ) { - lastDialInPumpDirectionCount = dirErrorCnt; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_PUMP_DIRECTION_STATUS_ERROR, (U32)HD_PUMP_DIALYSATE_INLET_PUMP ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + lastDialInPumpDirectionCount = dirErrorCnt; + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_PUMP_DIRECTION_STATUS_ERROR, (U32)HD_PUMP_DIALYSATE_INLET_PUMP ) + } } dipMCDir = ( getMeasuredDialInPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); @@ -1029,19 +1034,27 @@ // Check set direction vs. direction from hall sensors if ( dialInPumpDirectionSet != dipDir ) { - if ( ( ++errorDialInPumpDirectionPersistTimerCtr >= DIP_DIRECTION_ERROR_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + if ( ++errorDialInPumpDirectionPersistTimerCtr >= DIP_DIRECTION_ERROR_PERSIST ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipDir ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipDir ) + } } } // Check set direction vs. direction from sign of motor controller speed else if ( dialInPumpDirectionSet != dipMCDir ) { - if ( ( ++errorDialInPumpDirectionPersistTimerCtr >= DIP_DIRECTION_ERROR_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + if ( ++errorDialInPumpDirectionPersistTimerCtr >= DIP_DIRECTION_ERROR_PERSIST ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipMCDir ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_DIRECTION_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipMCDir ) + } } } else @@ -1077,11 +1090,15 @@ { if ( measMotorSpeed > DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM ) { - if ( ( ++errorDialInMotorOffPersistTimerCtr >= DIP_OFF_ERROR_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_OFF_CHECK, measMotorSpeed ); - activateSafetyShutdown(); + if ( ++errorDialInMotorOffPersistTimerCtr >= DIP_OFF_ERROR_PERSIST ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_OFF_CHECK, measMotorSpeed ); + activateSafetyShutdown(); + } } } else @@ -1107,10 +1124,14 @@ // Check measured motor speed vs. commanded motor speed while controlling to target if ( ( deltaMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) ) { - if ( ( ++errorDialInMotorSpeedPersistTimerCtr >= DIP_MOTOR_SPEED_ERROR_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK, cmdMotorSpeed, measMotorSpeed ); + if ( ++errorDialInMotorSpeedPersistTimerCtr >= DIP_MOTOR_SPEED_ERROR_PERSIST ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK, cmdMotorSpeed, measMotorSpeed ); + } } } else @@ -1121,10 +1142,14 @@ // Check measured rotor speed vs. measured motor speed while controlling to target if ( deltaRotorSpeed > DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM ) { - if ( ( ++errorDialInRotorSpeedPersistTimerCtr >= DIP_ROTOR_SPEED_ERROR_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK, measRotorSpeed, measMotorSpeed ); + if ( ++errorDialInRotorSpeedPersistTimerCtr >= DIP_ROTOR_SPEED_ERROR_PERSIST ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_SPEED_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK, measRotorSpeed, measMotorSpeed ); + } } } else @@ -1153,26 +1178,34 @@ F32 flow = getMeasuredDialInFlowRate(); // Range check on measure DPi flow rate. - if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, ( flow > DIP_MAX_FLOW_RATE ) || ( flow < DIP_MIN_FLOW_RATE ) ) ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, ( flow > DIP_MAX_FLOW_RATE ) || ( flow < DIP_MIN_FLOW_RATE ) ) ) ) { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, flow ); +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, flow ); + } } // Check only performed while in treatment mode and while we are in control to target state if ( ( MODE_TREA == getCurrentOperationMode() ) && ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) ) { F32 flow = (F32)targetDialInFlowRate; F32 speed = getMeasuredDialInPumpSpeed(); - F32 impliedSpeed = ( flow / (F32)ML_PER_LITER ) * DIP_REV_PER_LITER * DIP_GEAR_RATIO; + F32 impliedSpeed = DIP_PWM_TO_MOTOR_SPEED_RPM( DIP_PWM_FROM_ML_PER_MIN( flow ) ); F32 delta = fabs( speed - impliedSpeed ); if ( delta > DIP_MAX_FLOW_VS_SPEED_DIFF_RPM ) { - if ( ( ++errorDialInFlowVsMotorSpeedPersistTimerCtr >= DIP_FLOW_VS_SPEED_PERSIST ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, speed ); + if ( ++errorDialInFlowVsMotorSpeedPersistTimerCtr >= DIP_FLOW_VS_SPEED_PERSIST ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, flow, speed ); + } } } else @@ -1205,10 +1238,14 @@ if ( dipCurr > DIP_MAX_CURR_WHEN_STOPPED_MA ) { dipCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; - if ( ( dipCurrErrorDurationCtr > DIP_MAX_CURR_ERROR_DURATION_MS ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_MOTOR_CURRNT_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK, getMeasuredDialInPumpMCCurrent() ); + if ( dipCurrErrorDurationCtr > DIP_MAX_CURR_ERROR_DURATION_MS ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_MOTOR_CURRNT_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK, getMeasuredDialInPumpMCCurrent() ); + } } } else @@ -1223,10 +1260,14 @@ if ( dipCurr > DIP_MAX_CURR_WHEN_RUNNING_MA ) { dipCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; - if ( ( dipCurrErrorDurationCtr > DIP_MAX_CURR_ERROR_DURATION_MS ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_MOTOR_CURRNT_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK, getMeasuredDialInPumpMCCurrent() ); + if ( dipCurrErrorDurationCtr > DIP_MAX_CURR_ERROR_DURATION_MS ) + { +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_MOTOR_CURRNT_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK, getMeasuredDialInPumpMCCurrent() ); + } } } else Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r450fd51053df274149ec091955baa33e23e1c7a7 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 450fd51053df274149ec091955baa33e23e1c7a7) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file DialOutFlow.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean * @date (original) 24-Jan-2020 Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r5cd5e80f09df23ea9be356f6a5d89286117f3515 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 5cd5e80f09df23ea9be356f6a5d89286117f3515) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file Fans.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 04-Aug-2021 Index: firmware/App/Controllers/Fans.h =================================================================== diff -u -r5cd5e80f09df23ea9be356f6a5d89286117f3515 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/Fans.h (.../Fans.h) (revision 5cd5e80f09df23ea9be356f6a5d89286117f3515) +++ firmware/App/Controllers/Fans.h (.../Fans.h) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file Fans.h * -* @author (last) Dara Navaei -* @date (last) 02-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 04-Aug-2021 Index: firmware/App/Controllers/FluidLeak.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/FluidLeak.c (.../FluidLeak.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Controllers/FluidLeak.c (.../FluidLeak.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -132,9 +132,11 @@ // Publish fluid leak state on interval if ( ++fluidLeakStatePublicationTimerCounter >= getU32OverrideValue( &fluidLeakStatePublishInterval ) ) { - U32 state = (U32)getFluidLeakState(); + FLUID_LEAK_DATA_T data; - broadcastData( MSG_ID_HD_FLUID_LEAK_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&state, sizeof( U32 ) ); + data.fluidLeakState = (U32)getFluidLeakState(); + + broadcastData( MSG_ID_HD_FLUID_LEAK_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( FLUID_LEAK_DATA_T ) ); fluidLeakStatePublicationTimerCounter = 0; } } Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file PresOccl.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -422,6 +422,7 @@ #ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_DVT_ARTERIAL_PRESSURE_SENSOR ) ) { +#endif if ( ARTERIAL_PRESSURE_NORMAL_OP == artPresStatus ) { U08 artReadCtr = getFPGADVTArterialPressureReadCounter(); @@ -447,38 +448,41 @@ resetPersistentAlarmTimer( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT ); } } - // Convert arterial pressure to mmHg if no fault - else if ( 0 == artPresAlarm ) -#else - if ( 0 == artPresAlarm ) -#endif - { - U08 artReadCtr = getFPGAArterialPressureReadCounter(); - U08 artErrorCtr = getFPGAArterialPressureErrorCounter(); - // Check for stale arterial pressure reading - // TODO I think we should check the change of the error count not if it is greater than 0? - if ( FALSE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, ( lastArterialPressureReadCtr == artReadCtr || artErrorCtr > 0 ) ) ) +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_DVT_ARTERIAL_PRESSURE_SENSOR ) ) + { +#endif + if ( 0 == artPresAlarm ) { - arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( rawArterialPres / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ) + - getF32OverrideValue( &arterialPressureOffset ); + U08 artReadCtr = getFPGAArterialPressureReadCounter(); + U08 artErrorCtr = getFPGAArterialPressureErrorCounter(); + + + // Check for stale arterial pressure reading + // TODO I think we should check the change of the error count not if it is greater than 0? + if ( FALSE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, ( lastArterialPressureReadCtr == artReadCtr || artErrorCtr > 0 ) ) ) + { + arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( rawArterialPres / ( ARTERIAL_PRESSURE_SENSITIVITY * ARTERIAL_PRESSURE_V_BIAS ) ) + + getF32OverrideValue( &arterialPressureOffset ); + } + else + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, (U32)artErrorCtr ); + } + // Record arterial pressure sensor read counter for next time around + lastArterialPressureReadCtr = artReadCtr; } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, (U32)artErrorCtr ); + #ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) + #endif + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT, (U32)artPresAlarm ) + } } - // Record arterial pressure sensor read counter for next time around - lastArterialPressureReadCtr = artReadCtr; } - else - { -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT, (U32)artPresAlarm ) - } - } // Check for stale venous pressure reading if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, ( lastVenousPressureReadCtr == venReadCtr ) ) ) Index: firmware/App/Controllers/Switches.c =================================================================== diff -u -rcc4f8440e8ad7fa8f2ced2467d922be7422c344c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/Switches.c (.../Switches.c) (revision cc4f8440e8ad7fa8f2ced2467d922be7422c344c) +++ firmware/App/Controllers/Switches.c (.../Switches.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,15 +7,16 @@ * * @file Switches.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 25-Jul-2021 * ***************************************************************************/ #include "FPGA.h" +#include "NVDataMgmt.h" #include "Switches.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -128,6 +129,22 @@ } } +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + // Clear active Alarms + if ( STATE_CLOSED == getSwitchStatus( FRONT_DOOR ) ) + { + clearAlarmCondition( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } + + if ( STATE_CLOSED == getSwitchStatus( PUMP_TRACK_SWITCH ) ) + { + clearAlarmCondition( ALARM_ID_PUMP_TRACK_LATCH_OPENED ); + } + } + publishSwitchesData(); } Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r6d743f84430c0e17011d07fb378de49d86853137 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 6d743f84430c0e17011d07fb378de49d86853137) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -8,7 +8,7 @@ * @file SyringePump.c * * @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @date (last) 31-Mar-2022 * * @author (original) Sean Nash * @date (original) 04-Mar-2021 @@ -68,7 +68,6 @@ #define SYRINGE_PUMP_RATE_ALARM_PERSISTENCE 3000 ///< Alarm persistence period (in ms) for syringe pump speed check alarms. #define SYRINGE_PUMP_DIR_ALARM_PERSISTENCE 3000 ///< Alarm persistence period (in ms) for syringe pump direction check alarms. #define SYRINGE_PUMP_OFF_ALARM_PERSISTENCE 1000 ///< Alarm persistence period (in ms) for syringe pump off check alarms. -#define SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE 30 ///< Alarm persistence period (in ms) for syringe pump occlusion alarms. #define SYRINGE_PUMP_ADC_READ_PERSISTENCE 100 ///< Syringe pump ADC stale read alarm persistence time (in ms). #define STEPS_TO_MICROSTEPS( s ) ( (s) * 32.0F ) ///< Macro conversion from steps to microsteps. @@ -321,7 +320,6 @@ initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, 0, SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, 0, SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE ); // Reset request flags resetSyringePumpRequestFlags(); @@ -1582,10 +1580,9 @@ F32 forceDelta = forceAtEndOfPriming - forceAtEndOfSeek; // Occlusion is detected if force at end of prime is > than force at end of seek by 0.5 volts or more BOOL occlusionDetected = ( forceDelta >= SYRINGE_FORCE_OCCLUSION_DIFF_V ? TRUE : FALSE ); - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, occlusionDetected ) ) + if ( TRUE == occlusionDetected ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, forceAtEndOfSeek, forceAtEndOfPriming ) // reuse this alarm after prime - forceAtEndOfSeek = 0.0; // reset this value in case we want to prime again result = TRUE; } Index: firmware/App/Controllers/Temperatures.c =================================================================== diff -u -r688cfa4a15a295c019ab0b403c558d5f2d1e2aa6 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision 688cfa4a15a295c019ab0b403c558d5f2d1e2aa6) +++ firmware/App/Controllers/Temperatures.c (.../Temperatures.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file Temperatures.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 01-Aug-2021 Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file Valves.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 07-Aug-2020 Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -36,8 +36,9 @@ // ********** private definitiions *********** -#define TUBING_BLOOD_PRIME_VOLUME_ML 80.0 ///< Target blood prime volume to prime the blood side circuit (in mL). -#define MAX_BLOOD_PRIME_VOLUME_ERROR_ML 60.0 ///< Maximum error in total additional blood prime volume (20% of total). +#define TUBING_BLOOD_PRIME_VOLUME_ML 80.0F ///< Target blood prime volume to prime the blood side circuit (in mL). +#define DEFAULT_BLOOD_PRIME_VOLUME_ML 300.0F ///< Default blood prime volume (in mL). +#define MAX_BLOOD_PRIME_VOLUME_ERROR_ML 60.0F ///< Maximum error in total additional blood prime volume (20% of total). #define MIN_RAMP_TIME_SEC 60 ///< Minimum ramp time for blood prime (in seconds). /// Initial flow rate for blood pump when starting blood prime operation. @@ -50,7 +51,7 @@ #define BLOOD_PRIME_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. -static const F32 BLOOD_PRIME_FLOW_INTEGRATOR = 1.0 / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); +static const F32 BLOOD_PRIME_FLOW_INTEGRATOR = 1.0F / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); // ********** private data ********** @@ -93,7 +94,7 @@ bloodPrimePublishTimerCtr = BLOOD_PRIME_DATA_PUBLISH_INTERVAL; cumulativeBloodPrimeVolume_mL.data = 0.0; expectedBloodPrimeVolume_mL = 0.0; - bloodPrimeTargetVolume_mL = 300.0; + bloodPrimeTargetVolume_mL = DEFAULT_BLOOD_PRIME_VOLUME_ML; resetBloodPrimeFlags(); bloodPrimeTargetVolume_mL = (F32)TUBING_BLOOD_PRIME_VOLUME_ML + (F32)getDialyzerBloodVolume(); @@ -237,10 +238,14 @@ cmdStopDGTrimmerHeater(); // Stop trimmer heater - dialysis sub-mode will restart as appropriate } // Is blood prime taking too long based on set BP rate? - else if ( ( fabs( expectedBloodPrimeVolume_mL - getBloodPrimeVolume() ) > MAX_BLOOD_PRIME_VOLUME_ERROR_ML ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + else if ( fabs( expectedBloodPrimeVolume_mL - getBloodPrimeVolume() ) > MAX_BLOOD_PRIME_VOLUME_ERROR_ML ) { - activateAlarmNoData( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE ); +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + activateAlarmNoData( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE ); + } } else { Index: firmware/App/Modes/ConsumableSelfTest.c =================================================================== diff -u -r3db5538afb80bc12822304d698343e0325fa708e -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 3db5538afb80bc12822304d698343e0325fa708e) +++ firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -8,7 +8,7 @@ * @file ConsumableSelfTest.c * * @author (last) Dara Navaei -* @date (last) 25-Feb-2022 +* @date (last) 31-Mar-2022 * * @author (original) Quang Nguyen * @date (original) 06-Mar-2021 @@ -109,21 +109,21 @@ break; case CONSUMABLE_SELF_TESTS_WATER_QUALITY_CHECK_STATE: - if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_BICARB_PUMP_CHECK ) ) + if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_TEST_BICARB_CONDUCTIVITY ) ) { currentConsumableSelfTestState = CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE; } break; case CONSUMABLE_SELF_TESTS_BICARB_PUMP_CHECK_STATE: - if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_ACID_PUMP_CHECK ) ) + if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_TEST_ACID_CONDUCTIVITY ) ) { - currentConsumableSelfTestState = CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE; + currentConsumableSelfTestState = DG_FILL_MODE_STATE_TEST_ACID_CONDUCTIVITY; } break; case CONSUMABLE_SELF_TESTS_ACID_PUMP_CHECK_STATE: - if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION ) ) + if ( ( DG_MODE_FILL == getDGOpMode() ) && ( getDGSubMode() >= DG_FILL_MODE_STATE_PRODUCE_DIALYSATE ) ) { currentConsumableSelfTestState = CONSUMABLE_SELF_TESTS_COMPLETE_STATE; cmdStopDGFill(); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file Dialysis.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean * @date (original) 15-Jan-2020 Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r0b9bce5890b5028b48467398f2f3c49447754fe3 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 0b9bce5890b5028b48467398f2f3c49447754fe3) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file ModeInitPOST.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r8457e008319c5f6b20085918dd1799a7bfe841ca -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 8457e008319c5f6b20085918dd1799a7bfe841ca) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -8,7 +8,7 @@ * @file ModePostTreat.c * * @author (last) Dara Navaei -* @date (last) 15-Feb-2022 +* @date (last) 31-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -361,13 +361,24 @@ *************************************************************************/ static HD_POST_TREATMENT_STATE_T handlePostTreatmentPatientDisconnectionState( void ) { - F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - HD_POST_TREATMENT_STATE_T state = HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; VALVE_T valve; - if ( STATE_CLOSED == getFPGADoorState() ) + F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); + HD_POST_TREATMENT_STATE_T state = HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); + +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) { + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + + if ( ( STATE_CLOSED == frontDoor ) && ( STATE_CLOSED == pumpTrack ) ) + { #ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) #endif @@ -434,7 +445,7 @@ /*********************************************************************//** * @brief * The handlePostTreatmentVerifyState function verifies cartridge removed, - * syringe removed, and doors are closed before transition to standby mode. + * syringe removed before transition to standby mode. * @details Inputs: doors' status, syringe status, occlusion sensors value * @details Outputs: requested transition to standby mode * @return current state (sub-mode) @@ -452,27 +463,20 @@ isCartridgeRemoved = isCartridgeUnloaded(); } - if ( STATE_CLOSED == getFPGADoorState() ) + if ( FALSE == isCartridgeRemoved ) { - if ( FALSE == isCartridgeRemoved ) - { - activateAlarmNoData( ALARM_ID_CARTRIDGE_REMOVAL_FAILURE ); - } + activateAlarmNoData( ALARM_ID_CARTRIDGE_REMOVAL_FAILURE ); + } - if ( TRUE == isSyringeDetected() ) - { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_DETECTED ); - } - // Wait for cartridge and syringe to be removed and for DG to finish any drains/fills. - if ( ( TRUE == isCartridgeRemoved ) && ( FALSE == isSyringeDetected() ) ) - { - cmdStopDG(); - requestNewOperationMode( MODE_STAN ); - } + if ( TRUE == isSyringeDetected() ) + { + activateAlarmNoData( ALARM_ID_HD_SYRINGE_DETECTED ); } - else + // Wait for cartridge and syringe to be removed and for DG to finish any drains/fills. + if ( ( TRUE == isCartridgeRemoved ) && ( FALSE == isSyringeDetected() ) ) { - activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + cmdStopDG(); + requestNewOperationMode( MODE_STAN ); } return HD_POST_TREATMENT_VERIFY_STATE; @@ -587,7 +591,7 @@ } // Drain has started and DG goes to re-circ mode flush lines state means drain completed - if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_LINES == getDGSubMode() ) ) + if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { isDrainCompleted = TRUE; } @@ -646,7 +650,7 @@ } // Drain has started and DG goes to generation idle mode flush lines state means drain completed - if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_LINES == getDGSubMode() ) ) + if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { isDrainCompleted = TRUE; } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -189,7 +189,9 @@ switch ( currentPreTreatmentState ) { case HD_PRE_TREATMENT_START_STATE: +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SAMPLE_WATER ) != SW_CONFIG_ENABLE_VALUE ) +#endif { transitionToSampleWater(); } @@ -259,14 +261,19 @@ F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); - if ( STATE_OPEN == getSwitchStatus( FRONT_DOOR ) ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) != SW_CONFIG_ENABLE_VALUE ) +#endif { - activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); - } + if ( STATE_OPEN == getSwitchStatus( FRONT_DOOR ) ) + { + activateAlarmNoData( ALARM_ID_CARTRIDGE_DOOR_OPENED ); + } - if ( STATE_OPEN == getSwitchStatus( PUMP_TRACK_SWITCH ) ) - { - activateAlarmNoData( ALARM_ID_PUMP_TRACK_LATCH_OPENED ); + if ( STATE_OPEN == getSwitchStatus( PUMP_TRACK_SWITCH ) ) + { + activateAlarmNoData( ALARM_ID_PUMP_TRACK_LATCH_OPENED ); + } } if ( ( FALSE == isSyringeDetected() ) && ( ( bolusVol > NEARLY_ZERO ) && ( hepRate > NEARLY_ZERO ) ) ) @@ -295,12 +302,22 @@ // Accept installation confirmation if we are in install state of pre-treatment mode and // Door closed, Cartridge installed, syringe is detected or Heparin not being used in this treatment. - if ( ( MODE_PRET == getCurrentOperationMode() ) && - ( HD_PRE_TREATMENT_CART_INSTALL_STATE == currentPreTreatmentState ) ) + if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_CART_INSTALL_STATE == currentPreTreatmentState ) ) { - if ( STATE_CLOSED == getSwitchStatus( PUMP_TRACK_SWITCH ) ) + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); + +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) { - if ( STATE_CLOSED == getSwitchStatus( FRONT_DOOR ) ) + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + + if ( STATE_CLOSED == pumpTrack ) + { + if ( STATE_CLOSED == frontDoor ) { if ( ( TRUE == isSyringeDetected() ) || ( ( bolusVol < NEARLY_ZERO ) && ( hepRate < NEARLY_ZERO ) ) ) { @@ -409,10 +426,12 @@ BOOL accepted = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM; +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) { patientConnectionConfirm = TRUE; } +#endif if ( TRUE == patientConnectionConfirm ) { @@ -514,6 +533,7 @@ preTreatmentData.primeState = getPrimeState(); preTreatmentData.recircState = getPreTreatmentRecircState(); preTreatmentData.patientConnectionState = 0; + preTreatmentData.wetSelfTestsState = getWetSelfTestState(); broadcastData( MSG_ID_PRE_TREATMENT_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&preTreatmentData, sizeof( PRE_TREATMENT_STATE_DATA_T ) ); preTreatmentPublishTimerCounter = 0; @@ -598,30 +618,29 @@ execSampleWater(); -#ifndef SKIP_SAMPLE_WATER - if ( ( SAMPLE_WATER_COMPLETE_STATE == getSampleWaterState() ) || - ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SAMPLE_WATER ) ) ) -#endif + if ( SAMPLE_WATER_COMPLETE_STATE == getSampleWaterState() ) { - cmdDGSampleWater( SAMPLE_WATER_CMD_END ); - - if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) { - if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) + cmdDGSampleWater( SAMPLE_WATER_CMD_END ); + + if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) { - state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; - cmdStartDG(); - transitionToConsumableSelfTest(); + if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) + { + state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + cmdStartDG(); + transitionToConsumableSelfTest(); + } + else + { + cmdStopDG(); + } } else { - cmdStopDG(); + requestNewOperationMode( MODE_STAN ); } } - else - { - requestNewOperationMode( MODE_STAN ); - } } return state; @@ -707,10 +726,12 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) { confirmInstallRequested = TRUE; } +#endif if ( TRUE == confirmInstallRequested ) { @@ -828,10 +849,12 @@ verifySwitchStatus(); } +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) { continueToTreatmentRequested = TRUE; } +#endif if ( TRUE == continueToTreatmentRequested ) { @@ -858,7 +881,6 @@ DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); setStartReservoirVolume( activeRes ); - resetHeparinVolumeDelivered(); // get clean starting volume/position before we start treatment requestNewOperationMode( MODE_TREA ); } @@ -1023,21 +1045,25 @@ { U32 volume = FILL_RESERVOIR_TO_VOLUME_ML; +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) { volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; } +#endif cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); } else { U32 volume = FILL_RESERVOIR_TO_VOLUME_ML; +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) { volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; } +#endif cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); } @@ -1046,10 +1072,12 @@ { U32 volume = FILL_RESERVOIR_TO_VOLUME_ML; +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) != SW_CONFIG_ENABLE_VALUE ) { volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; } +#endif cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); } @@ -1122,11 +1150,13 @@ if ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) { +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) { reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; } else +#endif { reservoirFlushedStatus[ DG_RESERVOIR_1 ] = TRUE; cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r1699da4737a1a176ed842cb30a887c9c2ffdfc94 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 1699da4737a1a176ed842cb30a887c9c2ffdfc94) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -51,11 +51,10 @@ static HD_STANDBY_STATE_T currentStandbyState; ///< Current state (sub-mode) of standby mode. -static BOOL treatStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of a treatment. -static BOOL flushStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of flush mode. -static BOOL heatDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of heat disinfect mode. -static BOOL chemDisinfectStartReqReceived = FALSE; ///< Flag indicates user has requested initiation of chemical disinfect mode. -static BOOL hasDisinfectCmdBeenSet = FALSE; ///< Flag indicates that a disinfect command has been set. +static BOOL treatStartReqReceived; ///< Flag indicates user has requested initiation of a treatment. +static BOOL flushStartReqReceived; ///< Flag indicates user has requested initiation of flush mode. +static BOOL heatDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of heat disinfect mode. +static BOOL chemDisinfectStartReqReceived; ///< Flag indicates user has requested initiation of chemical disinfect mode. static DG_DISINFECT_STATE_T dgDisinfectState; ///< DG disinfect state to be boadcast to UI. static U32 dataPublishCounter = 0; ///< Disinfects data publish counter. @@ -66,8 +65,17 @@ static HD_STANDBY_STATE_T handleStandbyModeWaitForTreatmentState( void ); static HD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushToStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGFlushInProgressState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGHeatDisinfectInProgressState( void ); + +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectCmdResponseState( void ); +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectStartState( void ); static HD_STANDBY_STATE_T handleStandbyModeDGChemDisininfectInProgressState( void ); static void publishDisinfectData( void ); @@ -76,17 +84,20 @@ * @brief * The initStandbyMode function initializes the Standby Mode module. * @details Inputs: none - * @details Outputs: Standby Mode module initialized. + * @details Outputs: currentStandbyState, treatStartReqReceived, + * flushStartReqReceived, dataPublishCounter, heatDisinfectStartReqReceived, + * chemDisinfectStartReqReceived, dgDisinfectState * @return none *************************************************************************/ void initStandbyMode( void ) { - currentStandbyState = STANDBY_START_STATE; - treatStartReqReceived = FALSE; - flushStartReqReceived = FALSE; - dataPublishCounter = 0; - hasDisinfectCmdBeenSet = FALSE; - dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + currentStandbyState = STANDBY_START_STATE; + treatStartReqReceived = FALSE; + flushStartReqReceived = FALSE; + dataPublishCounter = 0; + heatDisinfectStartReqReceived = FALSE; + chemDisinfectStartReqReceived = FALSE; + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; } /*********************************************************************//** @@ -155,14 +166,38 @@ currentStandbyState = handleStandbyModeWaitForDisinfectState(); break; + case STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGFlushCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGFlushToStartState(); + break; + case STANDBY_DG_FLUSH_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGFlushInProgressState(); break; + case STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGHeatDisinfectCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGHeatDisinfectStartState(); + break; + case STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGHeatDisinfectInProgressState(); break; + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectCmdResponseState(); + break; + + case STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE: + currentStandbyState = handleStandbyModeWaitForDGChemDisinfectStartState(); + break; + case STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE: currentStandbyState = handleStandbyModeDGChemDisininfectInProgressState(); break; @@ -425,12 +460,11 @@ else { rejReason = REQUEST_REJECT_REASON_DG_COMM_LOST; + sendDisinfectConfirmResponse( result, rejReason ); } } } - sendDisinfectConfirmResponse( result, rejReason ); - return result; } @@ -511,10 +545,8 @@ * The handleStandbyModeWaitForDisinfectState function handles wait for * disinfect state. * @details Inputs: flushStartReqReceived, heatDisinfectStartReqReceived, - * chemDisinfectStartReqReceived, hasDisinfectCmdBeenSet - * @details Outputs: flushStartReqReceived, heatDisinfectStartReqReceived, - * chemDisinfectStartReqReceived, hasDisinfectCmdBeenSet, dgDisinfectState, - * currentStandbyState + * chemDisinfectStartReqReceived + * @details Outputs: none * @return next state of the standby mode state machine *************************************************************************/ static HD_STANDBY_STATE_T handleStandbyModeWaitForDisinfectState( void ) @@ -523,55 +555,82 @@ if ( TRUE == flushStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) - { - cmdStartDGFlush(); - hasDisinfectCmdBeenSet = TRUE; - } - else if ( DG_MODE_FLUS == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - flushStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_FLUSH_STATE; - state = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; - } + cmdStartDGFlush(); + state = STANDBY_WAIT_FOR_DG_FLUSH_CMD_RESPONSE_STATE; } else if ( TRUE == heatDisinfectStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) - { - cmdStartDGHeatDisinfect(); - hasDisinfectCmdBeenSet = TRUE; - } - else if ( DG_MODE_HEAT == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - heatDisinfectStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_HEAT_STATE; - state = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; - } + cmdStartDGHeatDisinfect(); + state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_CMD_RESPONSE_STATE; } else if ( TRUE == chemDisinfectStartReqReceived ) { - if ( FALSE == hasDisinfectCmdBeenSet ) + cmdStartDGChemicalDisinfect(); + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_CMD_RESPONSE_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGFlushCmdResponseState function handles DG flush + * command response state. + * @details Inputs: none + * @details Outputs: flushStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +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; + + // Check if DG has responded to the start DG flush command + if ( TRUE == getDGCommandResponse( DG_CMD_START_FLUSH, &dgCmdResp ) ) + { + // Assume the command will be rejected and it goes back to wait for disinfect command + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + flushStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) { - cmdStartDGChemicalDisinfect(); - hasDisinfectCmdBeenSet = TRUE; + // If the command has not been rejected, transition to the next state + dgDisinfectState = DG_DISINFECT_FLUSH_STATE; + state = STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE; + result = TRUE; } - else if ( DG_MODE_CHEM == getDGOpMode() ) - { - hasDisinfectCmdBeenSet = FALSE; - chemDisinfectStartReqReceived = FALSE; - dgDisinfectState = DG_DISINFECT_CHEM_STATE; - state = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; - } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); } return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGFlushToStartState function handles DG flush + * wait to start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGFlushToStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_FLUSH_TO_START_STATE; + + if ( DG_MODE_FLUS == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_FLUSH_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGFlushInProgressState function handles DG flush * in progress state. * @details Inputs: none @@ -585,15 +644,70 @@ if ( getDGOpMode() != DG_MODE_FLUS ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGHeatDisinfectCmdResponseState function handles + * DG heat disinfect command response state. + * @details Inputs: none + * @details Outputs: heatDisinfectStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +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; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_HEAT_DISINFECT, &dgCmdResp ) ) + { + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + heatDisinfectStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + dgDisinfectState = DG_DISINFECT_HEAT_STATE; + state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE; + result = TRUE; + } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGHeatDisinfectStartState function handles + * DG heat disinfect wait for start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGHeatDisinfectStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_HEAT_DISINFECT_TO_START_STATE; + + if ( DG_MODE_HEAT == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_HEAT_DISINFECT_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGHeatDisinfectInProgressState function handles DG * heat disinfect in progress state. * @details Inputs: none @@ -607,15 +721,71 @@ if ( getDGOpMode() != DG_MODE_HEAT ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state; } /*********************************************************************//** * @brief + * The handleStandbyModeWaitForDGChemDisinfectCmdResponseState function handles + * DG chemical disinfect wait for command response state. + * @details Inputs: none + * @details Outputs: chemDisinfectStartReqReceived, dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +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; + + if ( TRUE == getDGCommandResponse( DG_CMD_START_CHEM_DISINFECT, &dgCmdResp ) ) + { + state = STANDBY_WAIT_FOR_DISINFECT_STATE; + chemDisinfectStartReqReceived = FALSE; + + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + dgDisinfectState = DG_DISINFECT_CHEM_STATE; + state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE; + result = TRUE; + } + + sendDisinfectConfirmResponse( result, dgCmdResp.rejectCode ); + } + + return state; + +} + +/*********************************************************************//** + * @brief + * The handleStandbyModeWaitForDGChemDisinfectStartState function handles + * DG chemical disinfect wait for start state. + * @details Inputs: none + * @details Outputs: dgDisinfectState + * @return next state of the standby mode state machine + *************************************************************************/ +static HD_STANDBY_STATE_T handleStandbyModeWaitForDGChemDisinfectStartState( void ) +{ + HD_STANDBY_STATE_T state = STANDBY_WAIT_FOR_DG_CHEM_DISINFECT_TO_START_STATE; + + if ( DG_MODE_CHEM == getDGOpMode() ) + { + dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; + state = STANDBY_DG_CHEM_DISINFECT_IN_PROGRESS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleStandbyModeDGChemDisininfectInProgressState function handles * DG chemical disinfect in progress state. * @details Inputs: none @@ -629,8 +799,9 @@ if ( getDGOpMode() != DG_MODE_CHEM ) { dgDisinfectState = DG_DISINFECT_NOT_RUNNING_STATE; - state = STANDBY_WAIT_FOR_TREATMENT_STATE; + state = STANDBY_WAIT_FOR_TREATMENT_STATE; } + publishDisinfectData(); return state; Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rf849c9bb850ba7c2cd27c7256639c965f38611fb -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f849c9bb850ba7c2cd27c7256639c965f38611fb) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file ModeTreatment.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 Index: firmware/App/Modes/ModeTreatmentParams.h =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file ModeTreatmentParams.h * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Sean Nash * @date (original) 29-May-2020 Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -39,17 +39,17 @@ #define MAX_PRIME_TIME ( 10 * SEC_PER_MIN ) ///< Maximum prime time (in seconds). #define PRIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the prime data is published on the CAN bus. -#define BLOOD_PUMP_FAST_FLOW_RATE_PURGE_AIR_ML_MIN 300 ///< Blood pump fast flow rate to fill fluid. +#define BLOOD_PUMP_FAST_FLOW_RATE_PURGE_AIR_ML_MIN 150 ///< Blood pump fast flow rate to fill fluid. #define BLOOD_PUMP_SLOW_FLOW_RATE_PURGE_AIR_ML_MIN 150 ///< Blood pump slow flow rate after fluid reach lower level of air trap sensor. #define BLOOD_PUMP_SALINE_FLOW_RATE_PURGE_AIR_ML_MIN 200 ///< Blood pump very slow flow rate during prime saline dialyzer state -#define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN 300 ///< Blood pump flow rate during prime recirculate blood circuit state. +#define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN 150 ///< Blood pump flow rate during prime recirculate blood circuit state. #define BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN 300 ///< Blood pump flow rate during prime the saline dialyzer dialysate state. #define DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN 300 ///< Dialysate pump flow rate during priming fluid path. #define DIALYSATE_DIALYZER_TUBE_VOLUME_ML 115 ///< This total tube volume is used to calculate the Dpi & Dpo time out in the dialysate dialyzer state. #define DIALYSATE_DIALYZER_BYPASS_TUBE_VOLUME_ML 75 ///< This volume is used to calculate the DPi pump time out in the dialyzer bypass state. #define DIALYZER_DVI_PATH_VOLUME_ML 17 ///< Path volume from the dialyzer to the VDI valve in mL. -#define DIALYZER_VOLUME_SCALE_FACTOR 0.5 ///< Half of the dialyzer total volume. +#define DIALYZER_VOLUME_SCALE_FACTOR 0.5F ///< Half of the dialyzer total volume. #define NO_AIR_DETECTED_COUNT ( 20 * MS_PER_SECOND ) ///< No air detected time period count. #define PURGE_AIR_TIME_OUT_COUNT ( 60 * MS_PER_SECOND ) ///< Time period count for purge air time out. @@ -181,11 +181,13 @@ switch ( currentPrimeState ) { case HD_PRIME_START_STATE: +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) { currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; } else +#endif { currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; } @@ -426,10 +428,12 @@ // Keep updating start time until the user requested priming primeStartTime = getMSTimerCount(); +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) { primeStartRequested = TRUE; } +#endif if ( TRUE == primeStartRequested ) { @@ -581,11 +585,15 @@ steadyVolumeSamplingStartTime = getMSTimerCount(); primeDialysateDialyzerStartTime = getMSTimerCount(); +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); state = HD_PRIME_WET_SELF_TESTS_STATE; } else +#endif { state = HD_PRIME_DIALYSATE_DIALYZER_STATE; } @@ -832,12 +840,9 @@ signalResumeSelfTests(); } - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) != SW_CONFIG_ENABLE_VALUE ) - { - execWetSelfTests(); - } + execWetSelfTests(); - if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) ) || ( TRUE == isWetSelfTestsPassed() ) ) + if ( TRUE == isWetSelfTestsPassed() ) { state = HD_PRIME_COMPLETE; } Index: firmware/App/Modes/Rinseback.c =================================================================== diff -u -r97494fb83f7e315750fd18f5f08a5106d6a4e4e4 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 97494fb83f7e315750fd18f5f08a5106d6a4e4e4) +++ firmware/App/Modes/Rinseback.c (.../Rinseback.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -37,10 +37,11 @@ // ********** private definitions ********** -#define TUBING_RINSEBACK_VOLUME_ML 80.0 ///< Target rinseback volume to deliver back to the patient (in mL). -#define MAX_TOTAL_ADDITIONAL_RINSEBACK_VOLUME_ML 300.0 ///< Maximum total additional rinseback volume allowed : all additionals (in mL). -#define MAX_RINSEBACK_VOLUME_ERROR_ML 60.0 ///< Maximum error in total additional rinseback volume (20% of total). -#define TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML 10.0 ///< Target rinseback volume for an additional volume request (in mL). +#define TUBING_RINSEBACK_VOLUME_ML 80.0F ///< Target rinseback volume to deliver back to the patient (in mL). +#define DEFAULT_RINSEBACK_VOLUME_ML 300.0F ///< Default rinseback volume (in mL). +#define MAX_TOTAL_ADDITIONAL_RINSEBACK_VOLUME_ML 300.0F ///< Maximum total additional rinseback volume allowed : all additionals (in mL). +#define MAX_RINSEBACK_VOLUME_ERROR_ML 60.0F ///< Maximum error in total additional rinseback volume (20% of total). +#define TARGET_ADDITIONAL_RINSEBACK_VOLUME_ML 10.0F ///< Target rinseback volume for an additional volume request (in mL). #define RINSEBACK_FLOW_RATE_ADJ_ML_MIN 25 ///< Adjustment amount (in mL/min) to apply when user requests increase/decrease in flow rate. #define MIN_RINSEBACK_FLOW_RATE_ML_MIN 50 ///< Minimum rinseback flow rate (in mL/min). #define MAX_RINSEBACK_FLOW_RATE_ML_MIN 150 ///< Maximum rinseback flow rate (in mL/min). @@ -56,7 +57,7 @@ /// Maximum time allowed for each additional rinseback volume delivery. static const U32 MAX_RINSEBACK_ADDITIONAL_TIME = ( 20 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ); /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. -static const F32 RINSEBACK_FLOW_INTEGRATOR = 1.0 / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); +static const F32 RINSEBACK_FLOW_INTEGRATOR = 1.0F / (F32)( SEC_PER_MIN * ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); // ********** private data ********** @@ -135,7 +136,7 @@ totalAdditionalRinsebackVolume_mL = 0.0; rinsebackAdditionalTimerCtr = 0; rinsebackPublishTimerCtr = 0; - rinsebackTargetVolume_mL = 300.0; + rinsebackTargetVolume_mL = DEFAULT_RINSEBACK_VOLUME_ML; resetRinsebackFlags(); } @@ -402,13 +403,17 @@ result = RINSEBACK_PAUSED_STATE; } // Is rinseback taking too long? - else if ( ( fabs( expectedRinsebackVolume_mL - getRinsebackVolume() ) > MAX_RINSEBACK_VOLUME_ERROR_ML ) && - ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) ) + else if ( fabs( expectedRinsebackVolume_mL - getRinsebackVolume() ) > MAX_RINSEBACK_VOLUME_ERROR_ML ) { - setRinsebackIsCompleted( TRUE ); - setupForRinsebackStopOrPause(); - activateAlarmNoData( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE ); - result = RINSEBACK_STOP_STATE; +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PUMP_FLOW_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + setRinsebackIsCompleted( TRUE ); + setupForRinsebackStopOrPause(); + activateAlarmNoData( ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE ); + result = RINSEBACK_STOP_STATE; + } } // Otherwise, continue rinseback else Index: firmware/App/Modes/SampleWater.c =================================================================== diff -u -re6e0e56ed9769723d5e4a561a9dfe4b16ad058e6 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision e6e0e56ed9769723d5e4a561a9dfe4b16ad058e6) +++ firmware/App/Modes/SampleWater.c (.../SampleWater.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file SampleWater.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Quang Nguyen * @date (original) 19-Feb-2021 Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r6b9d077b0adab3b771c5fa8ceeb7381ca54b84f5 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 6b9d077b0adab3b771c5fa8ceeb7381ca54b84f5) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file SelfTests.c * -* @author (last) Sean Nash -* @date (last) 02-Mar-2022 +* @author (last) Dara Navaei +* @date (last) 31-Mar-2022 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -72,8 +72,6 @@ /// Multiplier to conver flow (mL/min) into volume (mL) for period of general task interval. static const F32 SELF_TEST_FLOW_INTEGRATOR = ( ( 1.0F * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ) ); - - // ********** private data ********** static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; ///< Current state of the no cartridge self-tests state machine. @@ -637,14 +635,24 @@ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ) { NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); signalBloodPumpHardStop(); signalDialInPumpHardStop(); signalDialOutPumpHardStop(); selfTestStartTime = getMSTimerCount(); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) + { + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + // TODO: Use appropriate sensor driver - if ( STATE_CLOSED == getFPGADoorState() ) + if ( ( STATE_CLOSED == frontDoor ) && ( STATE_CLOSED == pumpTrack ) ) { state = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; } @@ -823,12 +831,22 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); // Restart self-test start time selfTestStartTime = getMSTimerCount(); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) + { + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + // TODO: Use appropriate sensor driver - if ( STATE_CLOSED == getFPGADoorState() ) + if (( STATE_CLOSED == frontDoor ) && (STATE_CLOSED == pumpTrack ) ) { state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); @@ -1058,11 +1076,15 @@ if ( TRUE == didTimeout( syringeOcclusionDelayStartTime, SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ) ) { - checkForPrimeOcclusion(); - state = DRY_SELF_TESTS_COMPLETE_STATE; + if ( FALSE == checkForPrimeOcclusion() ) // transition to complete state only when occlusion is removed + { + // clear the occlusion alarm condition to allow user to resume + clearAlarmCondition( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION ); // Resume option will appear + state = DRY_SELF_TESTS_COMPLETE_STATE; + } } - if ( TRUE == doesAlarmStatusIndicateStop() ) + if ( ( TRUE == doesAlarmStatusIndicateStop() ) && ( FALSE == isAlarmActive( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION ) ) ) { state = DRY_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r4aa825df0b7a7b93c6a7f1d4408d02844f4213f0 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 4aa825df0b7a7b93c6a7f1d4408d02844f4213f0) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -63,8 +63,8 @@ #define CLR_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 &= ~BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to disable backup alarm audio. #define ALARM_AUDIO_TEST_TONE 4 ///< Alarm audio state for continuous test tone. -#define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0 ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. -#define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0 ///< Minimum audio current (low gain) during test tone self-test (in mA). +#define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0F ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. +#define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). #define ALARM_AUDIO_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. #define MAX_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for maximum alarm audio volume. #define MIN_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for minimum alarm audio volume. @@ -338,6 +338,9 @@ data.almData1 = alarmData1.data.uInt.data; data.almDataType2 = (U32)alarmData2.dataType; data.almData2 = alarmData2.data.uInt.data; + data.almPriority = ALARM_TABLE[ alarm ].alarmPriority; + data.almRank = ALARM_TABLE[ alarm ].alarmSubRank; + data.almClrTopOnly = ALARM_TABLE[ alarm ].alarmClearOnly; broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); // Send information for UI to log to treatment log @@ -366,10 +369,12 @@ // Clear alarm condition and broadcast alarm condition clear if not already cleared if ( TRUE == alarmIsDetected[ alarm ] ) { - U32 a = (U32)alarm; + ALARM_NAME_DATA_T data; + data.alarmName = (U32)alarm; + alarmIsDetected[ alarm ] = FALSE; - broadcastData( MSG_ID_ALARM_CONDITION_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&a, sizeof( U32 ) ); + broadcastData( MSG_ID_ALARM_CONDITION_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); } } } @@ -395,9 +400,11 @@ // Clear alarm and broadcast alarm clear if not already cleared if ( TRUE == alarmIsActive[ alarm ] ) { - U32 a = (U32)alarm; + ALARM_NAME_DATA_T data; + + data.alarmName = (U32) alarm; - broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&a, sizeof( U32 ) ); + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); alarmIsActive[ alarm ] = FALSE; clearAlarmCondition( alarm ); @@ -894,6 +901,7 @@ else { if ( alarmStatus.alarmsState < NUM_OF_ALARM_PRIORITIES ) +#ifndef _RELEASE_ { if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ALARM_AUDIO ) != SW_CONFIG_ENABLE_VALUE ) { @@ -903,6 +911,7 @@ } } else +#endif { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, alarmStatus.alarmsState ) setAlarmAudioState( ALARM_PRIORITY_HIGH, @@ -1470,9 +1479,11 @@ { if ( TRUE == alarmIsActive[ a ] ) { - U32 al = (U32)a; + ALARM_NAME_DATA_T data; - broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&al, sizeof( U32 ) ); + data.alarmName = (U32)a; + + broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_NAME_DATA_T ) ); alarmIsActive[ a ] = FALSE; alarmStartedAt[ a ].data = 0; // Clear FIFO if this alarm was in it Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r4aa825df0b7a7b93c6a7f1d4408d02844f4213f0 -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 4aa825df0b7a7b93c6a7f1d4408d02844f4213f0) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -74,7 +74,7 @@ BOOL noDialRecirc; ///< No dialysate re-circulation allowed at this time BOOL ok; ///< Display OK button instead of other options BOOL noMinimize; ///< Prevent user from minimizing the alarm window - BOOL lampOn; ///< The alarm lamp is on + BOOL lampOn; ///< The alarm lamp is on } COMP_ALARM_STATUS_T; /// Record structure for unsigned integer alarm data. @@ -135,6 +135,9 @@ U32 almData1; ///< Supporting data #1 U32 almDataType2; ///< Supporting data type #2 U32 almData2; ///< Supporting data #2 + U32 almPriority; ///< Alarm priority + U32 almRank; ///< Alarm rank + BOOL almClrTopOnly; ///< Alarm clear (when on top) should only clear top alarm } ALARM_TRIGGERED_PAYLOAD_T; #pragma pack(pop) @@ -149,8 +152,14 @@ U32 silenceExpiresIn; ///< Silencing of alarms expires in this many seconds U16 alarmsFlags; ///< Bit flags: 1 = true, 0 = false for each bit flag } ALARM_COMP_STATUS_PAYLOAD_T; -#pragma pack(pop) +#pragma pack(pop) +/// Alarm name data publish +typedef struct +{ + U32 alarmName; ///< Alarm name. +} ALARM_NAME_DATA_T; + // ********** public function prototypes ********** void initAlarmMgmt( void ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file FPGA.c * -* @author (last) Dara Navaei -* @date (last) 14-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -1925,21 +1925,6 @@ /*********************************************************************//** * @brief - * The getDoorState function gets the current state of door switch. - * @details Inputs: none - * @details Outputs: none - * @return current door state - *************************************************************************/ -OPN_CLS_STATE_T getFPGADoorState( void ) -{ - // TODO: Get actual door state from FPGA or GPIO - BOOL const status = 0x0; - - return ( 0 == status ? STATE_CLOSED : STATE_OPEN ); -} - -/*********************************************************************//** - * @brief * The setFPGAValvesControlMode function sets the valves control mode. * @details Inputs: fpgaActuatorSetPoints * @details Outputs: fpgaActuatorSetPoints Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r36923cf573ee2ae49ddaaf001068934c6bf88c6c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 36923cf573ee2ae49ddaaf001068934c6bf88c6c) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file SystemComm.c * -* @author (last) Dara Navaei -* @date (last) 22-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r37a9fd8f15e413db5337371a7d1a1cb65567af7c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 37a9fd8f15e413db5337371a7d1a1cb65567af7c) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -152,7 +152,9 @@ data[ msgSize++ ] = 0; } +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ACK_ERRORS ) != SW_CONFIG_ENABLE_VALUE ) +#endif { // If ACK required, add to pending ACK list if ( TRUE == ackReq ) @@ -1822,6 +1824,7 @@ payload.alarmsFlags |= ( almStatus.alarmsToEscalate ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_ALARMS_TO_ESCALATE) : 0 ); payload.alarmsFlags |= ( almStatus.alarmsSilenced ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_ALARMS_SILENCED) : 0 ); payload.alarmsFlags |= ( almStatus.lampOn ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_LAMP_ON) : 0 ); + payload.alarmsFlags |= ( almStatus.noDialRecirc ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_DIALYSATE_RECIRC) : 0 ); payload.alarmsFlags |= ( almStatus.noMinimize ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_NO_MINIMIZE) : 0 ); payload.alarmsFlags |= ( almStatus.topAlarmConditionDetected ? BIT_BY_POS(ALARM_STATE_FLAG_BIT_POS_TOP_CONDITION) : 0 ); @@ -5844,6 +5847,7 @@ TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; BOOL result = FALSE; +#ifndef _RELEASE_ // Verify payload length if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) { @@ -5857,6 +5861,7 @@ result = testResetValvesCurrentOverride( payload.index ); } } +#endif // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); @@ -5909,6 +5914,7 @@ TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; BOOL result = FALSE; +#ifndef _RELEASE_ // Verify payload length if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) { @@ -5922,6 +5928,7 @@ result = testResetValvesPositionCountOverride( payload.index ); } } +#endif // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); @@ -6806,39 +6813,6 @@ /*********************************************************************//** * @brief - * The handleTestFansRPMAlarmStartTimeOverrideRequest function handles a - * request to override the fan RPM alarm start time. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleTestFansRPMAlarmStartTimeOffsetOverrideRequest( MESSAGE_T *message ) -{ - TEST_OVERRIDE_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); - - if ( FALSE == payload.reset ) - { - result = testSetFanRPMAlarmStartTimeOffsetOverride( payload.state.u32 ); - } - else - { - result = testResetFanRPMAlarmStartTimeOffsetOverride(); - } - } - - // Respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** - * @brief * The handleSetFansDutyCycleOverrideRequest function handles a * request to override the fans duty cycle. * @details Inputs: none @@ -6916,6 +6890,33 @@ /*********************************************************************//** * @brief + * The handleTestFansRPMAlarmStartTimeOffsetRequest function handles a + * request to set the fans RPM alarm start time offset. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestFansRPMAlarmStartTimeOffsetRequest( MESSAGE_T *message ) +{ + U32 rpmTimeOffset; + + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(U32) == message->hdr.payloadLen ) + { + memcpy( &rpmTimeOffset, message->payload, sizeof(U32) ); + + result = testSetFanRPMAlarmStartTimestamp( rpmTimeOffset ); + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The sendHDSWConfigRecord function sends out the HD software configuration record. * @details Inputs: none * @details Outputs: HD software configuration record msg constructed and queued Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r36923cf573ee2ae49ddaaf001068934c6bf88c6c -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 36923cf573ee2ae49ddaaf001068934c6bf88c6c) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file SystemCommMessages.h * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -255,6 +255,9 @@ // MSG_ID_UI_CONSUMABLE_INSTALL_CONFIRM void handleConsumableInstallConfirm( MESSAGE_T *message ); +// MSG_ID_UI_INSTALLATION_CONFIRM_RESPONSE +BOOL sendConsumableInstallCmdResponse( BOOL accepted, U32 reason ); + // MSG_ID_UI_INSTALLATION_CONFIRM void handleInstallationConfirm( MESSAGE_T *message ); Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -ra7675f3c917b632cf16207fc7ccfc1f38eb83f9b -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a7675f3c917b632cf16207fc7ccfc1f38eb83f9b) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file WatchdogMgmt.c * -* @author (last) Dara Navaei -* @date (last) 10-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r3db5538afb80bc12822304d698343e0325fa708e -r27a68f930508638f2eb6265ebb381c8918cbc37b --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 3db5538afb80bc12822304d698343e0325fa708e) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 27a68f930508638f2eb6265ebb381c8918cbc37b) @@ -7,8 +7,8 @@ * * @file TaskPriority.c * -* @author (last) Dara Navaei -* @date (last) 26-Feb-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019