Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rf25fbefbf6baa354b26dcbe17787821124b56c82 -r9798f57bc288270fe058fe098a76088cbb34d50c --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision f25fbefbf6baa354b26dcbe17787821124b56c82) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) @@ -63,7 +63,7 @@ #define SYRINGE_PUMP_RETRACT_RATE 10800.0 ///< Retract rate is 15 mL/ 5 s = 3 mL/s = 10,800 mL/hr. #define SYRINGE_PUMP_SEEK_RATE 3600.0 ///< Seek plunger rate is 5 mL/ 5 s = 1 mL/s = 3,600 mL/hr. #define SYRINGE_PUMP_PRIME_RATE 635.0 ///< Prime rate is 0.5 mm ^ 2 x PI x 450 mm = 0.353 mL / 2s = 635 mL/hr. -#define SYRINGE_PUMP_MAX_RATE 11000.0 ///< Maximum rate of the syringe pump (in mL). +#define SYRINGE_PUMP_MAX_RATE 11000.0 ///< Maximum rate of the syringe pump (in mL/hr). #define SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for syringe pump speed check alarms. @@ -80,9 +80,17 @@ #define SYRINGE_PUMP_HOME_DETECT_THRESHOLD_V 0.25 ///< Syringe pump home detected threshold (in V). #define SYRINGE_PUMP_PRIME_VOLUME_ML 0.353 ///< Target syringe prime volume (in mL). +/// Expected position of empty in relation to home postion. +#define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 11.0 ) +/// Margin of error for empty position determination. +#define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5 ) + #define SYRINGE_PUMP_START_RAMP_SPEED 300000 ///< Starting speed for all syringe pump operations to ramp up from. #define SYRINGE_PUMP_RAMP_DIVISOR 5 ///< Used for ramping profile. +#define SYRINGE_PUMP_RATE_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. measured rate check. +#define SYRINGE_PUMP_VOLUME_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. encoder based volume check. + // Bit definitions for syringe pump control register #define SYRINGE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Syringe pump control register bit for sleep mode (active low). #define SYRINGE_PUMP_CONTROL_NOT_RESET 0x20 ///< Syringe pump control register bit for resetting stepper motor (active low). @@ -205,7 +213,7 @@ static BOOL checkOcclusionOrEmpty( BOOL stopPump ); static BOOL checkSyringeRemoved( BOOL stopPump ); static BOOL checkMaxTravel( BOOL stopPump, S32 maxPos ); -static BOOL checkMaxMeasRate( BOOL stopPump, F32 maxRate ); +static BOOL checkMaxMeasRate( BOOL stopPump, F32 pctMargin ); static BOOL checkVolumeVsSafetyVolume( BOOL stopPump, F32 pctMargin ); static void publishSyringePumpData( void ); @@ -317,22 +325,21 @@ { F32 tgtRate = 0.0; - // TODO - test code - remove later - setTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME, 2.0 ); - // Get set Heparin bolus volume (mL) and convert to target rate (mL/hr) tgtRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) / HEPARIN_BOLUS_TIME_HR; // If valid to start a bolus, kick it off - if ( ( tgtRate >= MIN_HEPARIN_BOLUS_RATE ) && ( tgtRate <= MAX_HEPARIN_BOLUS_RATE ) && - ( TRUE == isSyringeDetected() ) && ( FALSE == isSyringePumpHome() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) + if ( ( tgtRate >= MIN_HEPARIN_BOLUS_RATE ) && ( tgtRate <= MAX_HEPARIN_BOLUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { - syringePumpSetRate = tgtRate; - syringePumpBolusRequested = TRUE; + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) + { + syringePumpSetRate = tgtRate; + syringePumpBolusRequested = TRUE; + } } else { - // TODO - s/w fault + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (F32)SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, tgtRate ) } return syringePumpBolusRequested; @@ -349,18 +356,17 @@ { F32 flowRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); - if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && - ( TRUE == isSyringeDetected() ) && ( FALSE == isSyringePumpHome() ) ) + if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { - if ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) + if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) ) { syringePumpSetRate = flowRate; syringePumpContinuousRequested = TRUE; } } else { - // TODO - s/w fault + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (F32)SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, flowRate ) } return syringePumpContinuousRequested; @@ -386,7 +392,7 @@ } else { - // TODO - s/w fault + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (F32)SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, vRef ) } return syringePumpDACVrefSetRequested; @@ -621,9 +627,9 @@ if ( syringePumpDACVrefWriteInProgress != TRUE ) { // Check ADC read is fresh - if ( lastSyringePumpADCReadCtr == adcReadCtr ) + if ( lastSyringePumpADCReadCtr == adcReadCtr ) // TODO - add persistence { - // TODO - fault + activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); } lastSyringePumpADCReadCtr = adcReadCtr; } @@ -677,7 +683,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, 0, syringePumpState ) // TODO - replace 0 with appropriate enum + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, syringePumpState ) break; } @@ -722,6 +728,8 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_OFF_STATE; // TODO - check position is not changing while stopped + // activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR ); + // activateSafetyShutdown(); // Check for request flags if ( TRUE == syringePumpRetractRequested ) @@ -803,8 +811,8 @@ else if ( TRUE == isSyringeDetected() ) { stopSyringePump(); + activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_DETECTED_IN_RETRACT ); result = SYRINGE_PUMP_OFF_STATE; - // TODO - alarm } return result; @@ -884,6 +892,9 @@ // Check for occlusion stopPump = checkOcclusionOrEmpty( stopPump ); + // Check position > max travel + stopPump = checkMaxTravel( stopPump, syringePumpVolumeStartPosition * ( SYRINGE_PUMP_PRIME_VOLUME_ML * SYRINGE_ENCODER_COUNTS_PER_ML ) ); + // If anything found that would require stopping the pump, stop pump and go to off state if ( TRUE == stopPump ) { @@ -893,7 +904,6 @@ return result; } - /*********************************************************************//** * @brief * The handleSyringePumpBolusState function handles the bolus delivery state @@ -906,26 +916,32 @@ { SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_HEP_BOLUS_STATE; BOOL stopPump = FALSE; + F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); // Handle ramp up rampSyringePump(); // Is bolus completed? - if ( getSyringePumpVolumeDelivered() >= getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) ) + if ( getSyringePumpVolumeDelivered() >= bolusVol ) { stopPump = TRUE; } // Has syringe been removed? stopPump = checkSyringeRemoved( stopPump ); - // TODO - check volume vs. safety volume (fault) + // Check volume vs. safety volume + stopPump = checkVolumeVsSafetyVolume( stopPump, SYRINGE_PUMP_VOLUME_CHECK_MARGIN ); // Check for occlusion stopPump = checkOcclusionOrEmpty( stopPump ); - // TODO - check for meas. speed > 1.05 mL/hr for TBD sec (fault) + // Check for commanded vs. meas. rate + stopPump = checkMaxMeasRate( stopPump, SYRINGE_PUMP_RATE_CHECK_MARGIN ); + // Check position > max travel + stopPump = checkMaxTravel( stopPump, syringePumpVolumeStartPosition * ( SYRINGE_PUMP_PRIME_VOLUME_ML * SYRINGE_ENCODER_COUNTS_PER_ML ) ); + // If anything found that would require stopping the pump, stop pump and go to off state if ( TRUE == stopPump ) { @@ -955,14 +971,17 @@ // Has syringe been removed? stopPump = checkSyringeRemoved( stopPump ); - // TODO - check volume vs. safety volume (fault) + // Check volume vs. safety volume + stopPump = checkVolumeVsSafetyVolume( stopPump, SYRINGE_PUMP_VOLUME_CHECK_MARGIN ); // Check for occlusion stopPump = checkOcclusionOrEmpty( stopPump ); - // TODO - check for meas. speed > 1.05 mL/hr for TBD sec (fault) + // Check for commanded vs. meas. rate + stopPump = checkMaxMeasRate( stopPump, SYRINGE_PUMP_RATE_CHECK_MARGIN ); - // TODO - check position > max travel (alarm for empty syringe) + // Check position > max travel + stopPump = checkMaxTravel( stopPump, SYRINGE_PUMP_EMPTY_POS + SYRINGE_PUMP_EMPTY_POS_MARGIN ); // If anything found that would require stopping the pump, stop pump and go to off state if ( TRUE == stopPump ) @@ -976,21 +995,57 @@ /*********************************************************************//** * @brief + * The handleSyringePumpCalibrateForceSensorState function handles the + * calibrate force sensor state of the syringe pump control state machine. + * of the pressure/occlusion monitor state machine. + * @details Inputs: DAC status + * @details Outputs: syringePumpDACVrefWriteInProgress, ADC read mode restored + * @return next state + *************************************************************************/ +static SYRINGE_PUMP_STATE_T handleSyringePumpCalibrateForceSensorState( void ) +{ + SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE; + + // Wait for DAC setting write to EEPROM to complete + if ( ( getFPGASyringePumpADCandDACStatus() & SYRINGE_PUMP_ADC_DAC_ERROR_COUNT_DAC_WR_DONE ) != 0 ) + { + syringePumpDACVrefWriteInProgress = FALSE; + // Switch back from DAC to ADC control + setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_RD_DAC_ON_ADC | SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_ADC ); + // Back to off state + result = SYRINGE_PUMP_OFF_STATE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The checkOcclusionOrEmpty function checks the force sensor for excessive * pressure. Would indicate occlusion or jam or empty syringe. * @details Inputs: TBD * @details Outputs: TBD * @param stopPump flag passed in by caller indicating whether pump should be stopped - * @return TRUE if occlusion/empty condition detected, FALSE if not + * @return TRUE if pump should be stopped, FALSE if not *************************************************************************/ static BOOL checkOcclusionOrEmpty( BOOL stopPump ) { BOOL result = stopPump; + F32 force = getSyringePumpForceV(); - if ( getSyringePumpForceV() >= SYRINGE_FORCE_OCCLUSION_THRESHOLD_V ) + if ( force >= SYRINGE_FORCE_OCCLUSION_THRESHOLD_V ) { + S32 pos = getSyringePumpPosition(); + + if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, (F32)pos, force ) + } result = TRUE; - // TODO - alarm (alarm for occlusion or empty syringe depending on position) } return result; @@ -1004,7 +1059,7 @@ * @details Inputs: TBD * @details Outputs: TBD * @param stopPump flag passed in by caller indicating whether pump should be stopped - * @return TRUE if syringe removed, FALSE if not + * @return TRUE if pump should be stopped, FALSE if not *************************************************************************/ static BOOL checkSyringeRemoved( BOOL stopPump ) { @@ -1013,7 +1068,7 @@ if ( FALSE == isSyringeDetected() ) { result = TRUE; - // TODO - alarm + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_REMOVED, (U32)syringePumpState ) } return result; @@ -1028,14 +1083,23 @@ * @details Outputs: TBD * @param stopPump flag passed in by caller indicating whether pump should be stopped * @param maxPos maximum position allowed in current state - * @return TRUE if max travel exceeded, FALSE if not + * @return TRUE if pump should be stopped, FALSE if not *************************************************************************/ static BOOL checkMaxTravel( BOOL stopPump, S32 maxPos ) { BOOL result = stopPump; + S32 pos = getSyringePumpPosition(); + if ( pos > ( SYRINGE_PUMP_EMPTY_POS + SYRINGE_PUMP_EMPTY_POS_MARGIN ) ) + { + result = TRUE; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, getSyringePumpForceV() ) + } + else if ( pos > maxPos ) + { + result = TRUE; + } - return result; } @@ -1047,15 +1111,23 @@ * @details Inputs: TBD * @details Outputs: TBD * @param stopPump flag passed in by caller indicating whether pump should be stopped - * @param maxRate maximum measured rate allowed in current state - * @return TRUE if max rate exceeded, FALSE if not + * @param pctMargin percent tolerance allowed between set and measured rate + * @return TRUE if pump should be stopped, FALSE if not *************************************************************************/ -static BOOL checkMaxMeasRate( BOOL stopPump, F32 maxRate ) +static BOOL checkMaxMeasRate( BOOL stopPump, F32 pctMargin ) { BOOL result = stopPump; + F32 rate = getSyringePumpMeasRate(); + F32 delta = fabs( syringePumpSetRate - rate ); + F32 max = MAX( rate, syringePumpSetRate ); + F32 error = ( max > 0.0 ? ( 1.0 - ( delta / max ) ) : 0.0 ); + if ( error > pctMargin ) + { + result = TRUE; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, syringePumpSetRate, rate ) + } - return result; } @@ -1069,38 +1141,20 @@ * @details Outputs: TBD * @param stopPump flag passed in by caller indicating whether pump should be stopped * @param pctMargin percent tolerance allowed between volume and safety volume - * @return TRUE if volume check fails, FALSE if not + * @return TRUE if pump should be stopped, FALSE if not *************************************************************************/ static BOOL checkVolumeVsSafetyVolume( BOOL stopPump, F32 pctMargin ) { BOOL result = stopPump; + F32 vol = getSyringePumpVolumeDelivered(); + F32 delta = fabs( vol - syringePumpSafetyVolumeDelivered ); + F32 max = MAX( vol, syringePumpSafetyVolumeDelivered ); + F32 error = ( fabs( max ) < NEARLY_ZERO ? 0.0 : ( 1.0 - ( delta / max ) ) ); - - - return result; -} - -/*********************************************************************//** - * @brief - * The handleSyringePumpCalibrateForceSensorState function handles the - * calibrate force sensor state of the syringe pump control state machine. - * of the pressure/occlusion monitor state machine. - * @details Inputs: DAC status - * @details Outputs: syringePumpDACVrefWriteInProgress, ADC read mode restored - * @return next state - *************************************************************************/ -static SYRINGE_PUMP_STATE_T handleSyringePumpCalibrateForceSensorState( void ) -{ - SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE; - - // Wait for DAC setting write to EEPROM to complete - if ( ( getFPGASyringePumpADCandDACStatus() & SYRINGE_PUMP_ADC_DAC_ERROR_COUNT_DAC_WR_DONE ) != 0 ) + if ( error > pctMargin ) { - syringePumpDACVrefWriteInProgress = FALSE; - // Switch back from DAC to ADC control - setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_RD_DAC_ON_ADC | SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_ADC ); - // Back to off state - result = SYRINGE_PUMP_OFF_STATE; + result = TRUE; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_VOLUME_ERROR, vol, syringePumpSafetyVolumeDelivered ) } return result; Index: firmware/App/HDCommon.h =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r9798f57bc288270fe058fe098a76088cbb34d50c --- firmware/App/HDCommon.h (.../HDCommon.h) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) @@ -44,10 +44,10 @@ #define DISABLE_ACCELS 1 // Disable accelerometer POST and monitoring // #define DISABLE_CRC_ERROR 1 // Do not error on bad CRC for CAN messages // #define DISABLE_ACK_ERRORS 1 // Do not error on failure of other node(s) to ACK a message -// #define DISABLE_MOTOR_CURRENT_CHECKS 1 // Do not error on HD pump current checks -// #define DISABLE_PUMP_FLOW_CHECKS 1 // Do not error on HD pump flow checks -// #define DISABLE_PUMP_SPEED_CHECKS 1 // Do not error on HD pump speed checks -// #define DISABLE_PUMP_DIRECTION_CHECKS 1 // Do not error on HD pump direction checks + #define DISABLE_MOTOR_CURRENT_CHECKS 1 // Do not error on HD pump current checks + #define DISABLE_PUMP_FLOW_CHECKS 1 // Do not error on HD pump flow checks + #define DISABLE_PUMP_SPEED_CHECKS 1 // Do not error on HD pump speed checks + #define DISABLE_PUMP_DIRECTION_CHECKS 1 // Do not error on HD pump direction checks // #define DISABLE_SALINE_BOLUS_CHECKS 1 // Do not error on HD saline bolus checks // #define DISABLE_SYRINGE_PUMP 1 // Disable syringe pump functionality #define DISABLE_PRESSURE_CHECKS 1 // Do not error on HD pressure checks Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rac6532c81f2a6d4ad1c67420c22d59f6aeeaae13 -r9798f57bc288270fe058fe098a76088cbb34d50c --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ac6532c81f2a6d4ad1c67420c22d59f6aeeaae13) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) @@ -764,14 +764,15 @@ // Update UF ref volume in UF running state only refUFVolume += ( ( (F32)msSinceLast / MS_PER_SECOND ) / SEC_PER_MIN ) * setUFRate; - // Calculate UF volumes and provide to dialysate outlet pump controller - updateUFVolumes(); - // If we have reached target UF volume, UF is complete - set UF rate to zero for remainder of treatment if ( refUFVolume >= maxUFVolumeML ) { setUFRate = 0.0; } + + // Calculate UF volumes and provide to dialysate outlet pump controller + updateUFVolumes(); + // Handle saline bolus start request from user if ( TRUE == salineBolusStartRequested ) { @@ -804,7 +805,7 @@ *************************************************************************/ static UF_STATE_T handleUFOffState( DIALYSIS_STATE_T *dialysisState ) { - UF_STATE_T result = UF_RUNNING_STATE; + UF_STATE_T result = UF_RUNNING_STATE; // TODO - remove this state and handler return result; } @@ -820,26 +821,8 @@ *************************************************************************/ static UF_STATE_T handleUFCompletedState( DIALYSIS_STATE_T *dialysisState ) { - UF_STATE_T result = UF_COMPLETED_STATE; + UF_STATE_T result = UF_RUNNING_STATE; // TODO - remove this state and handler - // Calculate UF volumes and provide to dialysate outlet pump controller - updateUFVolumes(); - - // Handle saline bolus start request from user - if ( TRUE == salineBolusStartRequested ) - { - salineBolusAutoResumeUF = FALSE; - // Go to saline bolus state - if ( SALINE_BOLUS_STATE_IDLE == currentSalineBolusState ) - { - *dialysisState = DIALYSIS_SALINE_BOLUS_STATE; - } - else - { - salineBolusStartRequested = FALSE; - } - } - return result; } Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -rf25fbefbf6baa354b26dcbe17787821124b56c82 -r9798f57bc288270fe058fe098a76088cbb34d50c --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision f25fbefbf6baa354b26dcbe17787821124b56c82) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) @@ -61,10 +61,10 @@ { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=3}, {.uInt=0} }, // TREATMENT_PARAM_DIALYZER_TYPE { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=60}, {.uInt=30} }, // TREATMENT_PARAM_BP_MEAS_INTERVAL { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=150}, {.uInt=75} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE - { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=200}, {.sInt=-300} }, // TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=200}, {.sInt=100} }, // TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=-100}, {.sInt=600}, {.sInt=-100} }, // TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT - { CRITICAL_DATA_TYPE_S32, {.sInt=100}, {.sInt=600}, {.sInt=400} }, // TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT + { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=0}, {.sInt=-300} }, // TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT + { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=0}, {.sInt=0} }, // TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT + { CRITICAL_DATA_TYPE_S32, {.sInt=20}, {.sInt=600}, {.sInt=20} }, // TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT + { CRITICAL_DATA_TYPE_S32, {.sInt=20}, {.sInt=600}, {.sInt=400} }, // TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=1.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_DISPENSE_RATE { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=2.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME { CRITICAL_DATA_TYPE_F32, {.sFlt=35.0}, {.sFlt=38.0}, {.sFlt=37.0} }, // TREATMENT_PARAM_DIALYSATE_TEMPERATURE Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r27f3db92495948d4c1192421c1b0c20338c4a034 -r9798f57bc288270fe058fe098a76088cbb34d50c --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 27f3db92495948d4c1192421c1b0c20338c4a034) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9798f57bc288270fe058fe098a76088cbb34d50c) @@ -252,6 +252,10 @@ SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, + SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, // 110 + SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, + SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;