Index: firmware/App/Common.h =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -r8e53754325653805a454de6d82c0c8ca90e068a0 --- firmware/App/Common.h (.../Common.h) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Common.h (.../Common.h) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) @@ -84,6 +84,7 @@ #define MASK_OFF_LSW 0xFFFF0000 #define SHIFT_8_BITS_FOR_BYTE_SHIFT 8 #define SHIFT_16_BITS_FOR_WORD_SHIFT 16 +#define ML_PER_LITER 1000 // **** Common Macros **** @@ -106,6 +107,13 @@ activateAlarm1Data( a, dat1 ); \ } +#define SET_ALARM_WITH_1_F32_DATA(a,d1) { \ + ALARM_DATA_T dat1; \ + dat1.dataType = ALARM_DATA_TYPE_F32; \ + dat1.data.flt.data = (F32)(d1); \ + activateAlarm1Data( a, dat1 ); \ +} + #define SET_ALARM_WITH_2_U32_DATA(a,d1,d2) { \ ALARM_DATA_T dat1; \ ALARM_DATA_T dat2; \ Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -r8e53754325653805a454de6d82c0c8ca90e068a0 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) @@ -46,10 +46,15 @@ #define BP_MAX_PWM_DC_DELTA 0.01 // prevents large steps in PWM duty cycle #define BP_MIN_PWM_DC_DELTA -0.01 +#define BP_MAX_CURR_WHEN_STOPPED_MA 150.0 // motor controller current should not exceed this when pump should be stopped +#define BP_MIN_CURR_WHEN_RUNNING_MA 150.0 // motor controller current should always exceed this when pump should be running +#define BP_MAX_CURR_WHEN_RUNNING_MA 1000.0 // motor controller current should not exceed this when pump should be running +#define BP_MAX_CURR_ERROR_DURATION_MS 500 // motor controller current errors persisting beyond this duration will trigger an alarm + #define BP_SPEED_ADC_TO_RPM_FACTOR 1.375 // conversion factor from ADC counts to RPM for blood pump motor #define BP_CURRENT_ADC_TO_MA_FACTOR 2.65 // conversion factor from ADC counts to mA for blood pump motor -#define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR (124.0 / 1000.0)// 124 pump revolutions = 1 liter or 1,000 mL +#define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR (124.0 / ML_PER_LITER)// 124 pump revolutions = 1 liter or 1,000 mL #define BP_GEAR_RATIO 32.0 // blood pump motor to blood pump gear ratio #define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003125 // ~32 BP motor RPM = 1% PWM duty cycle #define BP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed @@ -111,6 +116,8 @@ static U32 flowReadingsIdx = 0; // index for next sample in rolling average array static F32 flowReadingsTotal = 0.0; // rolling total - used to calc average +static U32 bpCurrErrorDurationCtr = 0; // used for tracking persistence of bp current errors + static BLOOD_FLOW_SELF_TEST_STATE_T bloodPumpSelfTestState = BLOOD_FLOW_SELF_TEST_STATE_START; // current blood pump self test state static U32 bloodPumpSelfTestTimerCount = 0; // timer counter for blood pump self test @@ -232,6 +239,7 @@ U16 bpRPM = getIntADCReading( INT_ADC_BLOOD_PUMP_SPEED ); U16 bpmA = getIntADCReading( INT_ADC_BLOOD_PUMP_MOTOR_CURRENT ); F32 bpFlow = getFPGABloodFlow(); // TODO - change to avg. blood flow when available from FPGA + MOTOR_DIR_T bpMCDir; adcBloodPumpSpeedRPM.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpRPM)) * BP_SPEED_ADC_TO_RPM_FACTOR; adcBloodPumpCurrentmA.data = (F32)(SIGN_FROM_12_BIT_VALUE(bpmA)) * BP_CURRENT_ADC_TO_MA_FACTOR; @@ -242,6 +250,50 @@ flowReadingsIdx = INC_WRAP( flowReadingsIdx, 0, SIZE_OF_ROLLING_AVG-1 ); measuredBloodFlowRate.data = flowReadingsTotal / (F32)SIZE_OF_ROLLING_AVG; + if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) + { + // check set direction vs. direction from sign of motor controller speed + bpMCDir = ( getMeasuredBloodPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + if ( bloodPumpDirectionSet != bpMCDir ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMCDir ) + } + } + + // check motor controller current thresholds as appropriate + if ( BLOOD_PUMP_OFF_STATE == bloodPumpState ) + { + if ( getMeasuredBloodPumpCurrent() > BP_MAX_CURR_WHEN_STOPPED_MA ) + { + bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; + if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + } + } + else + { + bpCurrErrorDurationCtr = 0; + } + } + else // pump s/b running + { + F32 bpCurr = getMeasuredBloodPumpCurrent(); + + if ( ( bpCurr < BP_MIN_CURR_WHEN_RUNNING_MA ) || ( bpCurr > BP_MAX_CURR_WHEN_RUNNING_MA ) ) + { + bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; + if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + } + } + else + { + bpCurrErrorDurationCtr = 0; + } + } + // publish blood flow data on interval if ( ++bloodFlowDataPublicationTimerCounter > getPublishBloodFlowDataInterval() ) { Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -r8e53754325653805a454de6d82c0c8ca90e068a0 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) @@ -26,7 +26,11 @@ ALARM_ID_STUCK_BUTTON_TEST_FAILED, ALARM_ID_FPGA_POST_TEST_FAILED, ALARM_ID_WATCHDOG_POST_TEST_FAILED, - ALARM_ID_UI_COMM_POST_FAILED, + ALARM_ID_UI_COMM_POST_FAILED, // 5 + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, + ALARM_ID_BLOOD_PUMP_MC_SPEED_CHECK, + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK, NUM_OF_ALARM_IDS } ALARM_ID_T; @@ -110,37 +114,37 @@ SW_FAULT_ID_ALARM_LAMP_INVALID_SELF_TEST_STATE, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_STATE, - SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_DIRECTION, + SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_DIRECTION, // 5 SW_FAULT_ID_BUTTONS_INVALID_SELF_TEST_STATE, SW_FAULT_ID_BUTTONS_STOP_BUTTON_NOT_CONSUMED, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, - SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, + SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, // 10 SW_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, // 15 SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, - SW_FAULT_ID_COMM_BUFFERS_GET_TOO_MUCH_DATA, + SW_FAULT_ID_COMM_BUFFERS_GET_TOO_MUCH_DATA, // 20 SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, SW_FAULT_ID_COMM_BUFFERS_PEEK_TOO_MUCH_DATA, SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, - SW_FAULT_ID_FPGA_INVALID_IN_STATE, + SW_FAULT_ID_FPGA_INVALID_IN_STATE, // 25 SW_FAULT_ID_FPGA_INVALID_OUT_STATE, SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, - SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, + SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, // 30 SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL, SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, - SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, + SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, // 35 SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -r8e53754325653805a454de6d82c0c8ca90e068a0 --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) @@ -16,6 +16,7 @@ #include "Common.h" #include "SystemComm.h" +#include "Timers.h" #include "WatchdogMgmt.h" #include "TaskTimer.h"