Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r0f7e24faee00439d8d212de3bda6f94dcca40855 -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 0f7e24faee00439d8d212de3bda6f94dcca40855) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -136,13 +136,15 @@ static F32 bloodFlowCalGain = 1.0; ///< blood flow calibration gain. static F32 bloodFlowCalOffset = 0.0; ///< blood flow calibration offset. -static OVERRIDE_U32_T bloodFlowDataPublishInterval = { BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, 0 }; ///< Interval (in ms) at which to publish blood flow data to CAN bus -static OVERRIDE_S32_T targetBloodFlowRate = { 0, 0, 0, 0 }; ///< requested blood flow rate -static OVERRIDE_F32_T measuredBloodFlowRate = { 0.0, 0.0, 0.0, 0 }; ///< measured blood flow rate -static OVERRIDE_F32_T bloodPumpRotorSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump rotor speed -static OVERRIDE_F32_T bloodPumpSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor speed -static OVERRIDE_F32_T adcBloodPumpMCSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor controller speed -static OVERRIDE_F32_T adcBloodPumpMCCurrentmA = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor controller current +/// Interval (in task intervals) at which to publish blood flow data to CAN bus. +static OVERRIDE_U32_T bloodFlowDataPublishInterval = { BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, BLOOD_FLOW_DATA_PUB_INTERVAL, 0 }; +static OVERRIDE_S32_T targetBloodFlowRate = { 0, 0, 0, 0 }; ///< requested blood flow rate (mL/min) +static OVERRIDE_F32_T measuredBloodFlowRate = { 0.0, 0.0, 0.0, 0 }; ///< measured blood flow rate (mL/min) +static OVERRIDE_F32_T bloodPumpRotorSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump rotor speed (RPM) +static OVERRIDE_F32_T bloodPumpSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor speed (RPM) +static OVERRIDE_F32_T adcBloodPumpMCSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor controller speed (RPM) +static OVERRIDE_F32_T adcBloodPumpMCCurrentmA = { 0.0, 0.0, 0.0, 0 }; ///< measured blood pump motor controller current (mA) +static OVERRIDE_F32_T bloodFlowSignalStrength = { 0.0, 0.0, 0.0, 0 }; ///< measured blood flow signal strength (%) static U32 bpControlTimerCounter = 0; ///< determines when to perform control on blood flow @@ -408,7 +410,8 @@ F32 bpFlow = ( ( getFPGABloodFlow() * -1.0 ) * bloodFlowCalGain ) + bloodFlowCalOffset; // blood flow sensor installed backwards on HD adcBloodPumpMCSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_TO_RPM_FACTOR; - adcBloodPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; + adcBloodPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; + bloodFlowSignalStrength.data = getFPGABloodFlowSignalStrength(); filterBloodFlowReadings( bpFlow ); @@ -753,6 +756,26 @@ return result; } +/*********************************************************************//** + * @brief + * The getMeasuredBloodFlowSignalStrength function gets the measured blood flow + * signal strength. + * @details Inputs: bloodFlowSignalStrength + * @details Outputs: none + * @return the current blood flow signal strength (in %). + *************************************************************************/ +F32 getMeasuredBloodFlowSignalStrength( void ) +{ + F32 result = bloodFlowSignalStrength.data; + + if ( OVERRIDE_KEY == bloodFlowSignalStrength.override ) + { + result = bloodFlowSignalStrength.ovData; + } + + return result; +} + /*********************************************************************//** * @brief * The getMeasuredBloodPumpRotorSpeed function gets the measured blood flow @@ -850,33 +873,19 @@ static void publishBloodFlowData( void ) { // publish blood flow data on interval -#ifndef FLOW_DEBUG if ( ++bloodFlowDataPublicationTimerCounter >= getPublishBloodFlowDataInterval() ) -#endif - { - S32 flowStPt = (S32)getTargetBloodFlowRate(); - F32 measFlow = getMeasuredBloodFlowRate(); - F32 measRotSpd = getMeasuredBloodPumpRotorSpeed(); - F32 measSpd = getMeasuredBloodPumpSpeed(); - F32 measMCSpd = getMeasuredBloodPumpMCSpeed(); - F32 measMCCurr = getMeasuredBloodPumpMCCurrent(); - F32 pumpPWMPctDutyCycle = bloodPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; -#ifdef FLOW_DEBUG - // TODO - temporary debug code - remove later - char debugFlowStr[ 256 ]; - - F32 measFlowSig = getFPGABloodFlowSignalStrength() * 100.0; - F32 dialFlow = getMeasuredDialInFlowRate(); - F32 dialFlowSig = getFPGADialysateFlowSignalStrength() * 100.0; - F32 bldOccl = getMeasuredBloodPumpOcclusion(); - F32 dpiOccl = getMeasuredDialInPumpOcclusion(); - F32 dpoOccl = getMeasuredDialOutPumpOcclusion(); - - sprintf( debugFlowStr, "Blood: %5.1f, %6.1f, %6.1f Dial-I: %5.1f, %6.1f, %6.1f Dial-O: %6.1f\n", measFlowSig, measFlow, bldOccl, dialFlowSig, dialFlow, dpiOccl, dpoOccl ); - sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); -#else - broadcastBloodFlowData( flowStPt, measFlow, measRotSpd, measSpd, measMCSpd, measMCCurr, pumpPWMPctDutyCycle ); -#endif + { + BLOOD_PUMP_STATUS_PAYLOAD_T payload; + + payload.setPoint = (S32)getTargetBloodFlowRate(); + payload.measFlow = getMeasuredBloodFlowRate(); + payload.measRotorSpd = getMeasuredBloodPumpRotorSpeed(); + payload.measPumpSpd = getMeasuredBloodPumpSpeed(); + payload.measMCSpd = getMeasuredBloodPumpMCSpeed(); + payload.measMCCurr = getMeasuredBloodPumpMCCurrent(); + payload.pwmDC = bloodPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; + payload.flowSigStrength = getMeasuredBloodFlowSignalStrength() * 100.0; + broadcastBloodFlowData( payload ); bloodFlowDataPublicationTimerCounter = 0; } } @@ -1014,14 +1023,22 @@ if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) { - // check set direction vs. direction from hall sensors or sign of motor controller speed - bpMCDir = ( getMeasuredBloodPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); - if ( ( bloodPumpDirectionSet != bpMCDir ) || ( bloodPumpDirectionSet != bpMotorDirectionFromHallSensors ) ) + bpMCDir = ( getMeasuredBloodPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + + // check set direction vs. direction from hall sensors + if ( bloodPumpDirectionSet != bpMotorDirectionFromHallSensors ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMotorDirectionFromHallSensors ) #endif } + // check set direction vs. direction from sign of motor controller speed + if ( bloodPumpDirectionSet != bpMCDir ) + { +#ifndef DISABLE_PUMP_DIRECTION_CHECKS + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMCDir ) +#endif + } } } @@ -1040,7 +1057,7 @@ *************************************************************************/ static void checkBloodPumpSpeeds( void ) { - F32 measMotorSpeed = getMeasuredBloodPumpSpeed(); + F32 measMotorSpeed = fabs( getMeasuredBloodPumpSpeed() ); S32 cmdRate = getTargetBloodFlowRate(); // check for pump running while commanded off @@ -1651,5 +1668,50 @@ return result; } + +/*********************************************************************//** + * @brief + * The testSetMeasuredBloodFlowSignalStrengthOverride function overrides the measured + * blood flow signal strength. + * @details Inputs: none + * @details Outputs: bloodFlowSignalStrength + * @param value override measured blood flow signal strength (in %) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetMeasuredBloodFlowSignalStrengthOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodFlowSignalStrength.ovData = value / 100.0; + bloodFlowSignalStrength.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetMeasuredBloodFlowSignalStrengthOverride function resets the override + * of the measured blood flow signal strength. + * @details Inputs: none + * @details Outputs: bloodFlowSignalStrength + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetMeasuredBloodFlowSignalStrengthOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + bloodFlowSignalStrength.override = OVERRIDE_RESET; + bloodFlowSignalStrength.ovData = bloodFlowSignalStrength.ovInitData; + } + + return result; +} /**@}*/ Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -r2acda0ccdd00334bec87bfbe61c4e78e867925de -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 2acda0ccdd00334bec87bfbe61c4e78e867925de) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -37,6 +37,19 @@ #define VOLUME_PER_BP_MOTOR_REV_ML 0.2 ///< Theoretical volume (mL) of blood/saline volume per motor revolution. +/// Payload record structure for a blood pump data message. +typedef struct +{ + S32 setPoint; + F32 measFlow; + F32 measRotorSpd; + F32 measPumpSpd; + F32 measMCSpd; + F32 measMCCurr; + F32 pwmDC; + F32 flowSigStrength; +} BLOOD_PUMP_STATUS_PAYLOAD_T; + // ********** public function prototypes ********** void initBloodFlow( void ); @@ -55,6 +68,7 @@ S32 getTargetBloodFlowRate( void ); F32 getMeasuredBloodFlowRate( void ); +F32 getMeasuredBloodFlowSignalStrength( void); F32 getMeasuredBloodPumpRotorSpeed( void ); F32 getMeasuredBloodPumpSpeed( void ); F32 getMeasuredBloodPumpMCSpeed( void ); @@ -76,6 +90,8 @@ BOOL testResetMeasuredBloodPumpMCSpeedOverride( void ); BOOL testSetMeasuredBloodPumpMCCurrentOverride( F32 value ); BOOL testResetMeasuredBloodPumpMCCurrentOverride( void ); +BOOL testSetMeasuredBloodFlowSignalStrengthOverride( F32 value ); +BOOL testResetMeasuredBloodFlowSignalStrengthOverride( void ); /**@}*/ Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r0f7e24faee00439d8d212de3bda6f94dcca40855 -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 0f7e24faee00439d8d212de3bda6f94dcca40855) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -140,6 +140,7 @@ static OVERRIDE_F32_T dialInPumpSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured dialysate inlet pump motor speed static OVERRIDE_F32_T adcDialInPumpMCSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured dialysate inlet pump motor controller speed static OVERRIDE_F32_T adcDialInPumpMCCurrentmA = { 0.0, 0.0, 0.0, 0 }; ///< measured dialysate inlet pump motor controller current +static OVERRIDE_F32_T dialInFlowSignalStrength = { 0.0, 0.0, 0.0, 0 }; ///< measured dialysate flow signal strength (%) static U32 dipControlTimerCounter = 0; ///< determines when to perform control on dialIn flow @@ -375,6 +376,7 @@ adcDialInPumpMCSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(dipRPM)) * DIP_SPEED_ADC_TO_RPM_FACTOR; adcDialInPumpMCCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(dipmA)) * DIP_CURRENT_ADC_TO_MA_FACTOR; + dialInFlowSignalStrength.data = getFPGADialysateFlowSignalStrength(); filterDialInFlowReadings( dipFlow ); @@ -717,7 +719,27 @@ } return result; -} +} + +/*********************************************************************//** + * @brief + * The getMeasuredDialInFlowSignalStrength function gets the measured dialIn flow + * signal strength. + * @details Inputs: dialInFlowSignalStrength + * @details Outputs: none + * @return the current dialIn flow signal strength (in %). + *************************************************************************/ +F32 getMeasuredDialInFlowSignalStrength( void ) +{ + F32 result = dialInFlowSignalStrength.data; + + if ( OVERRIDE_KEY == dialInFlowSignalStrength.override ) + { + result = dialInFlowSignalStrength.ovData; + } + + return result; +} /*********************************************************************//** * @brief @@ -818,14 +840,17 @@ // publish dialIn flow data on interval if ( ++dialInFlowDataPublicationTimerCounter >= getPublishDialInFlowDataInterval() ) { - S32 flowStPt = (S32)getTargetDialInFlowRate(); - F32 measFlow = getMeasuredDialInFlowRate(); - F32 measRotSpd = getMeasuredDialInPumpRotorSpeed(); - F32 measSpd = getMeasuredDialInPumpSpeed(); - F32 measMCSpd = getMeasuredDialInPumpMCSpeed(); - F32 measMCCurr = getMeasuredDialInPumpMCCurrent(); - F32 pumpPWMPctDutyCycle = dialInPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; - broadcastDialInFlowData( flowStPt, measFlow, measRotSpd, measSpd, measMCSpd, measMCCurr, pumpPWMPctDutyCycle ); + DIALIN_PUMP_STATUS_PAYLOAD_T payload; + + payload.setPoint = (S32)getTargetDialInFlowRate(); + payload.measFlow = getMeasuredDialInFlowRate(); + payload.measRotorSpd = getMeasuredDialInPumpRotorSpeed(); + payload.measPumpSpd = getMeasuredDialInPumpSpeed(); + payload.measMCSpd = getMeasuredDialInPumpMCSpeed(); + payload.measMCCurr = getMeasuredDialInPumpMCCurrent(); + payload.pwmDC = dialInPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; + payload.flowSigStrength = getMeasuredDialInFlowSignalStrength() * 100.0; + broadcastDialInFlowData( payload ); dialInFlowDataPublicationTimerCounter = 0; } } @@ -953,14 +978,22 @@ if ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) { - // check set direction vs. direction from hall sensors or sign of motor controller speed - dipMCDir = ( getMeasuredDialInPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); - if ( ( dialInPumpDirectionSet != dipMCDir ) || ( dialInPumpDirectionSet != dipMotorDirectionFromHallSensors ) ) + dipMCDir = ( getMeasuredDialInPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + + // check set direction vs. direction from hall sensors + if ( dialInPumpDirectionSet != dipMotorDirectionFromHallSensors ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipMotorDirectionFromHallSensors ) #endif } + // check set direction vs. direction from sign of motor controller speed + if ( dialInPumpDirectionSet != dipMCDir ) + { +#ifndef DISABLE_PUMP_DIRECTION_CHECKS + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, (U32)dialInPumpDirectionSet, (U32)dipMCDir ) +#endif + } } } @@ -1590,5 +1623,50 @@ return result; } + +/*********************************************************************//** + * @brief + * The testSetMeasuredDialInFlowSignalStrengthOverride function overrides the measured + * dialysate flow signal strength. + * @details Inputs: none + * @details Outputs: dialInFlowSignalStrength + * @param value override measured dialysate flow signal strength (in %) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetMeasuredDialInFlowSignalStrengthOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + dialInFlowSignalStrength.ovData = value / 100.0; + dialInFlowSignalStrength.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetMeasuredDialInFlowSignalStrengthOverride function resets the override + * of the measured dialysate flow signal strength. + * @details Inputs: none + * @details Outputs: dialInFlowSignalStrength + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetMeasuredDialInFlowSignalStrengthOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + dialInFlowSignalStrength.override = OVERRIDE_RESET; + dialInFlowSignalStrength.ovData = dialInFlowSignalStrength.ovInitData; + } + + return result; +} /**@}*/ Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r2acda0ccdd00334bec87bfbe61c4e78e867925de -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 2acda0ccdd00334bec87bfbe61c4e78e867925de) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -35,6 +35,19 @@ #define MIN_DIAL_IN_FLOW_RATE 100 ///< Minimum dialysate inlet flow rate (in mL/min). #define DIALYSATE_FLOW_RATE_FOR_RECIRC 100 ///< Dialysate recirculation flow rate (in mL/min). +/// Payload record structure for a dialysate inlet pump data message. +typedef struct +{ + S32 setPoint; + F32 measFlow; + F32 measRotorSpd; + F32 measPumpSpd; + F32 measMCSpd; + F32 measMCCurr; + F32 pwmDC; + F32 flowSigStrength; +} DIALIN_PUMP_STATUS_PAYLOAD_T; + // ********** public function prototypes ********** void initDialInFlow( void ); @@ -49,12 +62,13 @@ SELF_TEST_STATUS_T execDialInFlowTest( void ); -DATA_GET_PROTOTYPE( S32, getTargetDialInFlowRate ); -DATA_GET_PROTOTYPE( F32, getMeasuredDialInFlowRate); -DATA_GET_PROTOTYPE( F32, getMeasuredDialInPumpRotorSpeed ); -DATA_GET_PROTOTYPE( F32, getMeasuredDialInPumpSpeed ); -DATA_GET_PROTOTYPE( F32, getMeasuredDialInPumpMCSpeed ); -DATA_GET_PROTOTYPE( F32, getMeasuredDialInPumpMCCurrent ); +S32 getTargetDialInFlowRate( void ); +F32 getMeasuredDialInFlowRate( void ); +F32 getMeasuredDialInFlowSignalStrength( void ); +F32 getMeasuredDialInPumpRotorSpeed( void ); +F32 getMeasuredDialInPumpSpeed( void ); +F32 getMeasuredDialInPumpMCSpeed( void ); +F32 getMeasuredDialInPumpMCCurrent( void ); BOOL setDialInFlowCalibration( F32 gain, F32 offset ); void getDialInFlowCalibration( F32 *gain, F32 *offset ); @@ -72,6 +86,8 @@ BOOL testResetMeasuredDialInPumpMCSpeedOverride( void ); BOOL testSetMeasuredDialInPumpMCCurrentOverride( F32 value ); BOOL testResetMeasuredDialInPumpMCCurrentOverride( void ); +BOOL testSetMeasuredDialInFlowSignalStrengthOverride( F32 value ); +BOOL testResetMeasuredDialInFlowSignalStrengthOverride( void ); /**@}*/ Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r0f7e24faee00439d8d212de3bda6f94dcca40855 -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 0f7e24faee00439d8d212de3bda6f94dcca40855) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -831,14 +831,22 @@ if ( DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE == dialOutPumpState ) { - // check set direction vs. direction from hall sensors or sign of motor controller speed dopMCDir = ( getMeasuredDialOutPumpMCSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); - if ( ( dialOutPumpDirectionSet != dopMCDir ) || ( dialOutPumpDirectionSet != dopMotorDirectionFromHallSensors ) ) + + // check set direction vs. direction from hall sensors + if ( dialOutPumpDirectionSet != dopMotorDirectionFromHallSensors ) { #ifndef DISABLE_PUMP_DIRECTION_CHECKS SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK, (U32)dialOutPumpDirectionSet, (U32)dopMotorDirectionFromHallSensors ) #endif } + // check set direction vs. direction from sign of motor controller speed + if ( dialOutPumpDirectionSet != dopMCDir ) + { +#ifndef DISABLE_PUMP_DIRECTION_CHECKS + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK, (U32)dialOutPumpDirectionSet, (U32)dopMCDir ) +#endif + } } } Index: firmware/App/HDCommon.h =================================================================== diff -u -r4a22fc18a17947587613273eb8cc08fd8c95beb8 -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 4a22fc18a17947587613273eb8cc08fd8c95beb8) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -30,8 +30,8 @@ // ********** development build switches ********** #ifndef _RELEASE_ -#define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) -#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) +//#define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) +//#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) #ifndef _VECTORCAST_ // #define DISABLE_UI_TREATMENT_WORKFLOW 1 // disable UI treatment workflow // #define RM46_EVAL_BOARD_TARGET 1 // limited build runs on RM46 eval board @@ -52,7 +52,6 @@ // #define RUN_PUMPS_OPEN_LOOP 1 // BP and DPi pumps will be run open loop (no flow sensor feedback) // #define RAW_FLOW_SENSOR_DATA 1 // test build will not filter flow sensor data // #define READ_FPGA_ASYNC_DATA 1 // test build reads non-priority register page every other time -// #define FLOW_DEBUG 1 // test build sends flow, signal strength, and occlusion readings to debug UART // #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button #define ALARMS_DEBUG 1 // triggered alarms sent to debug UART Index: firmware/App/Services/MessagePayloads.h =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -71,18 +71,6 @@ F32 zOffset; } ACCEL_CAL_PAYLOAD_T; -/// Payload record structure for a peristaltic pump data message. -typedef struct -{ - U32 setPoint; - F32 measFlow; - F32 measRotorSpd; - F32 measPumpSpd; - F32 measMCSpd; - F32 measMCCurr; - F32 pwmDC; -} PERISTALTIC_PUMP_STATUS_PAYLOAD_T; - /// Payload record structure for the pressure & occlusions data message. typedef struct { Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -ra4f5ed3748870d287a4c2c6fcc003fc4d3b9233f -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a4f5ed3748870d287a4c2c6fcc003fc4d3b9233f) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -1414,6 +1414,14 @@ handleTestSetTreatmentParameter( message ); break; + case MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE: + handleTestBloodFlowSignalStrengthOverrideRequest( message ); + break; + + case MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE: + handleTestDialInFlowSignalStrengthOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r0785222033c051524fbe19e49c08ba7f3f7a347c -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 0785222033c051524fbe19e49c08ba7f3f7a347c) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -19,10 +19,8 @@ #include "Accel.h" #include "AlarmLamp.h" -#include "BloodFlow.h" #include "Buttons.h" #include "DGInterface.h" -#include "DialInFlow.h" #include "FPGA.h" #include "MessagePayloads.h" #include "ModeStandby.h" @@ -821,37 +819,22 @@ * @details * Inputs : none * Outputs : blood flow data msg constructed and queued. - * @param flowStPt Current set point for blood flow - * @param measFlow Latest measured blood flow - * @param measRotorSpd Latest measured blood pump rotoro speed - * @param measSpd Latest measured blood pump speed - * @param measMCspd Latest measured blood pump motor controller speed - * @param measSpd Latest measured blood pump motor controller current - * @param pwmDC Latest PWM duty cycle % + * @param bloodData blood pump and flow data record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastBloodFlowData( U32 flowStPt, F32 measFlow, F32 measRotorSpd, F32 measSpd, F32 measMCSpd, F32 measMCCurr, F32 pwmDC ) +BOOL broadcastBloodFlowData( BLOOD_PUMP_STATUS_PAYLOAD_T bloodData ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - PERISTALTIC_PUMP_STATUS_PAYLOAD_T payload; // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_BLOOD_FLOW_DATA; - msg.hdr.payloadLen = sizeof( PERISTALTIC_PUMP_STATUS_PAYLOAD_T ); + msg.hdr.payloadLen = sizeof( BLOOD_PUMP_STATUS_PAYLOAD_T ); - payload.setPoint = flowStPt; - payload.measFlow = measFlow; - payload.measRotorSpd = measRotorSpd; - payload.measPumpSpd = measSpd; - payload.measMCSpd = measMCSpd; - payload.measMCCurr = measMCCurr; - payload.pwmDC = pwmDC; + memcpy( payloadPtr, &bloodData, sizeof( BLOOD_PUMP_STATUS_PAYLOAD_T ) ); - memcpy( payloadPtr, &payload, sizeof( PERISTALTIC_PUMP_STATUS_PAYLOAD_T ) ); - // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); @@ -865,37 +848,22 @@ * @details * Inputs : none * Outputs : dialysate flow data msg constructed and queued. - * @param flowStPt Current set point for dialysate flow - * @param measFlow Latest measured dialysate flow - * @param measRotorSpd Latest measured dialysate pump rotor speed - * @param measSpd Latest measured dialysate pump speed - * @param measMCspd Latest measured dialysate pump motor controller speed - * @param measSpd Latest measured dialysate pump motor controller current - * @param pwmDC Latest PWM duty cycle % + * @param dialInData Dialysate inlet pump and flow data record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastDialInFlowData( U32 flowStPt, F32 measFlow, F32 measRotorSpd, F32 measSpd, F32 measMCSpd, F32 measMCCurr, F32 pwmDC ) +BOOL broadcastDialInFlowData( DIALIN_PUMP_STATUS_PAYLOAD_T dialInData ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - PERISTALTIC_PUMP_STATUS_PAYLOAD_T payload; // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DIALYSATE_FLOW_DATA; - msg.hdr.payloadLen = sizeof( PERISTALTIC_PUMP_STATUS_PAYLOAD_T ); + msg.hdr.payloadLen = sizeof( DIALIN_PUMP_STATUS_PAYLOAD_T ); - payload.setPoint = flowStPt; - payload.measFlow = measFlow; - payload.measRotorSpd = measRotorSpd; - payload.measPumpSpd = measSpd; - payload.measMCSpd = measMCSpd; - payload.measMCCurr = measMCCurr; - payload.pwmDC = pwmDC; + memcpy( payloadPtr, &dialInData, sizeof( DIALIN_PUMP_STATUS_PAYLOAD_T ) ); - memcpy( payloadPtr, &payload, sizeof( PERISTALTIC_PUMP_STATUS_PAYLOAD_T ) ); - // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); @@ -2378,6 +2346,38 @@ // respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } + +/*********************************************************************//** + * @brief + * The handleTestBloodFlowSignalStrengthOverrideRequest function handles a + * request to override the measured blood flow signal strength (%). + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestBloodFlowSignalStrengthOverrideRequest( 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 = testSetMeasuredBloodFlowSignalStrengthOverride( payload.state.f32 ); + } + else + { + result = testResetMeasuredBloodFlowSignalStrengthOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} /*********************************************************************//** * @brief @@ -2642,6 +2642,38 @@ // respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } + +/*********************************************************************//** + * @brief + * The handleTestDialInFlowSignalStrengthOverrideRequest function handles a + * request to override the measured dialysate inlet flow signal strength (%). + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestDialInFlowSignalStrengthOverrideRequest( 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 = testSetMeasuredDialInFlowSignalStrengthOverride( payload.state.f32 ); + } + else + { + result = testResetMeasuredDialInFlowSignalStrengthOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} /*********************************************************************//** * @brief Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r0785222033c051524fbe19e49c08ba7f3f7a347c -r6eb873c4bc96fb22e85ac23aeee1c37e5366d731 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 0785222033c051524fbe19e49c08ba7f3f7a347c) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 6eb873c4bc96fb22e85ac23aeee1c37e5366d731) @@ -18,11 +18,13 @@ #ifndef __SYSTEM_COMM_MESSAGES_H__ #define __SYSTEM_COMM_MESSAGES_H__ -#include "HDCommon.h" -#include "MsgQueues.h" -#include "DialOutFlow.h" +#include "HDCommon.h" +#include "BloodFlow.h" #include "DGInterface.h" +#include "DialInFlow.h" +#include "DialOutFlow.h" #include "Dialysis.h" +#include "MsgQueues.h" #include "Valves.h" /** @@ -175,10 +177,10 @@ BOOL broadcastAlarmCleared( U16 alarm ); // MSG_ID_BLOOD_FLOW_DATA -BOOL broadcastBloodFlowData( U32 flowStPt, F32 measFlow, F32 measRotorSpd, F32 measSpd, F32 measMCSpd, F32 measMCCurr, F32 pwmDC ); +BOOL broadcastBloodFlowData( BLOOD_PUMP_STATUS_PAYLOAD_T bloodData ); // MSG_ID_DIALYSATE_FLOW_DATA -BOOL broadcastDialInFlowData( U32 flowStPt, F32 measFlow, F32 measRotorSpd, F32 measSpd, F32 measMCSpd, F32 measMCCurr, F32 pwmDC ); +BOOL broadcastDialInFlowData( DIALIN_PUMP_STATUS_PAYLOAD_T dialInData ); // MSG_ID_DIALYSATE_OUT_FLOW_DATA BOOL broadcastDialOutFlowData( DIAL_OUT_FLOW_DATA_T *dialOutFlowData ); @@ -253,6 +255,9 @@ // MSG_ID_BLOOD_FLOW_MEAS_OVERRIDE void handleTestBloodFlowMeasuredOverrideRequest( MESSAGE_T *message ); +// MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE +void handleTestBloodFlowSignalStrengthOverrideRequest( MESSAGE_T *message ); + // MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE void handleTestBloodPumpMCMeasuredSpeedOverrideRequest( MESSAGE_T *message ); @@ -277,6 +282,9 @@ // MSG_ID_DIAL_IN_FLOW_MEAS_OVERRIDE void handleTestDialInFlowMeasuredOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE +void handleTestDialInFlowSignalStrengthOverrideRequest( MESSAGE_T *message ); + // MSG_ID_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE void handleTestDialInPumpMCMeasuredSpeedOverrideRequest( MESSAGE_T *message );