Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -rbd594d51a6487960035f36d516c801de1b4aaff9 -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision bd594d51a6487960035f36d516c801de1b4aaff9) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) @@ -164,7 +164,6 @@ static U16 bpLastMotorHallSensorCount = 0; ///< last hall sensor count for the blood pump motor static U32 bloodPumpMotorEdgeCount = 0; ///< running counter for blood pump motor revolutions -static MOTOR_DIR_T bpMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; ///< pump direction according to hall sensor count static U32 bpMotorSpeedCalcTimerCtr = 0; ///< counter determines interval for calculating blood pump motor speed from hall sensor count. static U32 errorBloodFlowVsMotorSpeedPersistTimerCtr = 0; ///< persistence timer counter for flow vs. motor speed error condition. @@ -967,7 +966,7 @@ * a 1 second interval. * @details * Inputs : bpLastMotorHallSensorCount, bpMotorSpeedCalcTimerCtr, current count from FPGA - * Outputs : bpMotorDirectionFromHallSensors, bloodPumpSpeedRPM + * Outputs : bloodPumpSpeedRPM * @return none *************************************************************************/ static void updateBloodPumpSpeedAndDirectionFromHallSensors( void ) @@ -982,13 +981,11 @@ // determine blood pump speed/direction from delta hall sensor count since last interval if ( incDelta < decDelta ) { - bpMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; delta = incDelta; bloodPumpSpeedRPM.data = ( (F32)delta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; } else { - bpMotorDirectionFromHallSensors = MOTOR_DIR_REVERSE; delta = decDelta; bloodPumpSpeedRPM.data = ( (F32)delta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; } @@ -1046,17 +1043,18 @@ *************************************************************************/ static void checkBloodPumpDirection( void ) { - MOTOR_DIR_T bpMCDir; - if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) { + MOTOR_DIR_T bpMCDir, bpDir; + bpMCDir = ( getMeasuredBloodPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + bpDir = ( getMeasuredBloodPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); // check set direction vs. direction from hall sensors - if ( bloodPumpDirectionSet != bpMotorDirectionFromHallSensors ) + if ( bloodPumpDirectionSet != bpDir ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMotorDirectionFromHallSensors ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpDir ) #endif } // check set direction vs. direction from sign of motor controller speed Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rbd594d51a6487960035f36d516c801de1b4aaff9 -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision bd594d51a6487960035f36d516c801de1b4aaff9) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) @@ -159,7 +159,6 @@ static U32 dipHomeStartTime = 0; ///< when did dialysate inlet pump home command begin? (in ms) static U16 dipLastMotorHallSensorCount = 0; ///< last hall sensor count for the dialysate inlet pump motor -static MOTOR_DIR_T dipMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; ///< pump direction according to hall sensor count static U32 dipMotorSpeedCalcTimerCtr = 0; ///< counter determines interval for calculating dialysate inlet pump motor speed from hall sensor count. static U32 errorDialInFlowVsMotorSpeedPersistTimerCtr = 0; ///< persistence timer counter for flow vs. motor speed error condition. @@ -932,7 +931,7 @@ * a 1 second interval. * @details * Inputs : dipLastMotorHallSensorCount, dipMotorSpeedCalcTimerCtr, current count from FPGA - * Outputs : dipMotorDirectionFromHallSensors, dialInPumpSpeedRPM + * Outputs : dialInPumpSpeedRPM * @return none *************************************************************************/ static void updateDialInPumpSpeedAndDirectionFromHallSensors( void ) @@ -947,13 +946,11 @@ // determine dialysate inlet pump speed/direction from delta hall sensor count since last interval if ( incDelta < decDelta ) { - dipMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; delta = incDelta; dialInPumpSpeedRPM.data = ( (F32)delta / (F32)DIP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; } else { - dipMotorDirectionFromHallSensors = MOTOR_DIR_REVERSE; delta = decDelta; dialInPumpSpeedRPM.data = ( (F32)delta / (F32)DIP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; } @@ -1002,17 +999,18 @@ *************************************************************************/ static void checkDialInPumpDirection( void ) { - MOTOR_DIR_T dipMCDir; - if ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) { + MOTOR_DIR_T dipMCDir, dipDir; + dipMCDir = ( getMeasuredDialInPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + dipDir = ( getMeasuredDialInPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); // check set direction vs. direction from hall sensors - if ( dialInPumpDirectionSet != dipMotorDirectionFromHallSensors ) + if ( dialInPumpDirectionSet != dipDir ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipMotorDirectionFromHallSensors ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipDir ) #endif } // check set direction vs. direction from sign of motor controller speed Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) @@ -147,7 +147,6 @@ static U32 dopHomeStartTime = 0; ///< when did dialysate outlet pump home command begin? (in ms) static U16 dopLastMotorHallSensorCount = 0; ///< last hall sensor count for the dialysate outlet pump motor -static MOTOR_DIR_T dopMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; ///< pump direction according to hall sensor count static U32 dopMotorSpeedCalcTimerCtr = 0; ///< counter determines interval for calculating dialysate outlet pump motor speed from hall sensor count. static U32 errorDialOutMotorOffPersistTimerCtr = 0; ///< persistence timer counter for motor off check error condition. @@ -757,7 +756,7 @@ * a 1 second interval. * @details * Inputs : dopLastMotorHallSensorCount, dopMotorSpeedCalcTimerCtr, current count from FPGA - * Outputs : dopMotorDirectionFromHallSensors, dialOutPumpSpeedRPM + * Outputs : dialOutPumpSpeedRPM * @return none *************************************************************************/ static void updateDialOutPumpSpeedAndDirectionFromHallSensors( void ) @@ -772,13 +771,11 @@ // determine dialysate outlet pump speed/direction from delta hall sensor count since last interval if ( incDelta < decDelta ) { - dopMotorDirectionFromHallSensors = MOTOR_DIR_FORWARD; delta = incDelta; dialOutPumpSpeedRPM.data = ( (F32)delta / (F32)DOP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; } else { - dopMotorDirectionFromHallSensors = MOTOR_DIR_REVERSE; delta = decDelta; dialOutPumpSpeedRPM.data = ( (F32)delta / (F32)DOP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; } @@ -827,17 +824,18 @@ *************************************************************************/ static void checkDialOutPumpDirection( void ) { - MOTOR_DIR_T dopMCDir; - if ( DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE == dialOutPumpState ) { + MOTOR_DIR_T dopMCDir, dopDir; + dopMCDir = ( getMeasuredDialOutPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + dopDir = ( getMeasuredDialOutPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); // check set direction vs. direction from hall sensors - if ( dialOutPumpDirectionSet != dopMotorDirectionFromHallSensors ) + if ( dialOutPumpDirectionSet != dopDir ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK, (U32)dialOutPumpDirectionSet, (U32)dopMotorDirectionFromHallSensors ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK, (U32)dialOutPumpDirectionSet, (U32)dopDir ) #endif } // check set direction vs. direction from sign of motor controller speed Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) @@ -40,7 +40,9 @@ #define VENOUS_PRESSURE_OFFSET ( 1638 ) ///< Offset for 14-bit venous pressure sensor reading. #define VENOUS_PRESSURE_SCALE ( 14745 - VENOUS_PRESSURE_OFFSET ) ///< Scale for venous pressure sensor. #define VENOUS_PRESSURE_MIN ( 30.0 ) ///< Minimum of scale for venous pressure sensor reading (in TBD u/m). -#define VENOUS_PRESSURE_MAX ( 90.0 ) ///< Maximum of scale for venous pressure sensor reading (in TBD u/m). +#define VENOUS_PRESSURE_MAX ( 90.0 ) ///< Maximum of scale for venous pressure sensor reading (in TBD u/m). + +#define PSI_TO_MMHG ( 51.7149 ) ///< Conversion factor for converting PSI to mmHg. /// Defined states for the pressure and occlusion monitor state machine. typedef enum PresOccl_States @@ -76,10 +78,6 @@ static PRESSURE_SELF_TEST_STATE_T presOcclSelfTestState = PRESSURE_SELF_TEST_STATE_START; ///< current pressure self-test state. static U32 bloodPumpSelfTestTimerCount = 0; ///< timer counter for pressure self-test. -static F32 arterialPressureLowLimitmmHG = 0.0; ///< lower alarm limit for arterial pressure. -static F32 arterialPressureHighLimitmmHG = 0.0; ///< upper alarm limit for arterial pressure. -static F32 venousPressureLowLimitmmHG = 0.0; ///< lower alarm limit for venous pressure. -static F32 venousPressureHighLimitmmHG = 0.0; ///< upper alarm limit for venous pressure. // TODO - set thresholds for occlusions static F32 bloodPumpOcclusionPressureThresholdmmHG = 50.0; ///< pressure threshold for blood pump occlusion. static F32 dialInPumpOcclusionPressureThresholdmmHG = 50.0; ///< pressure threshold for dialysate inlet pump occlusion. @@ -108,38 +106,6 @@ /*********************************************************************//** * @brief - * The setPressureLimits function sets the lower and upper alarm limits - * for a given pressure sensor. - * @details - * Inputs : none - * Outputs : pressure limits - * @param sensor pressure sensor we are setting limits for - * @param low lower alarm limit (mmHg) - * @param high upper alarm limit (mmHg) - * @return none - *************************************************************************/ -void setPressureLimits( PRESSURE_SENSORS_T sensor, F32 low, F32 high ) -{ - switch ( sensor ) // TODO - will low/high limits be range checked by caller or should we do it here? what are valid ranges? - { - case PRESSURE_SENSOR_ARTERIAL: - arterialPressureLowLimitmmHG = low; - arterialPressureHighLimitmmHG = high; - break; - - case PRESSURE_SENSOR_VENOUS: - venousPressureLowLimitmmHG = low; - venousPressureHighLimitmmHG = high; - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PRES_OCCL_INVALID_PRES_SENSOR, sensor ) - break; - } -} - -/*********************************************************************//** - * @brief * The setOcclusionThreshold function sets the occlusion pressure threshold * for a given occlusion sensor. * @details @@ -234,11 +200,13 @@ U16 venPres = getFPGAVenousPressure(); U16 bldOccl = getFPGABloodPumpOcclusion(); U16 dliOccl = getFPGADialInPumpOcclusion(); - U16 dloOccl = getFPGADialOutPumpOcclusion(); + U16 dloOccl = getFPGADialOutPumpOcclusion(); + F32 venPresPSI; // TODO - convert ADC counts to mmHg for each sensor arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY / ARTERIAL_PRESSURE_V_BIAS ) ); - venousPressure.data = ( (F32)(venPres - VENOUS_PRESSURE_OFFSET) * (VENOUS_PRESSURE_MAX - VENOUS_PRESSURE_MIN) / (F32)VENOUS_PRESSURE_SCALE ) - VENOUS_PRESSURE_MIN; + venPresPSI = ( (F32)(venPres - VENOUS_PRESSURE_OFFSET) * (VENOUS_PRESSURE_MAX - VENOUS_PRESSURE_MIN) / (F32)VENOUS_PRESSURE_SCALE ) - VENOUS_PRESSURE_MIN; + venousPressure.data = venPresPSI * PSI_TO_MMHG; bloodPumpOcclusion.data = (F32)bldOccl; dialInPumpOcclusion.data = (F32)dliOccl; dialOutPumpOcclusion.data = (F32)dloOccl; Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -rde5a0d43bdef611d963d11855bc958a8d8899a09 -r1ffe793b3a3557a408b0f5d30539e8f0f499e559 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision de5a0d43bdef611d963d11855bc958a8d8899a09) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 1ffe793b3a3557a408b0f5d30539e8f0f499e559) @@ -53,7 +53,6 @@ void initPresOccl( void ); void execPresOccl( void ); -void setPressureLimits( PRESSURE_SENSORS_T sensor, F32 low, F32 high ); void setOcclusionThreshold( OCCLUSION_SENSORS_T sensor, F32 threshold ); SELF_TEST_STATUS_T execPresOcclTest( void );