Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r7e9a0ee7e8f64336235f11a84726871777747f8c -re97941eef8021daeac9e8b9afa631cc37c117c2f --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 7e9a0ee7e8f64336235f11a84726871777747f8c) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision e97941eef8021daeac9e8b9afa631cc37c117c2f) @@ -35,7 +35,8 @@ #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" -#include "Timers.h" +#include "Timers.h" +#include "Utilities.h" /** * @addtogroup BloodFlow @@ -937,31 +938,34 @@ { U16 bpMotorHallSensorCount = getFPGABloodPumpHallSensorCount(); U16 last = bpLastMotorHallSensorCounts[ bpMotorSpeedCalcIdx ]; - U32 nextIdx = INC_WRAP( bpMotorSpeedCalcIdx, 0, BP_SPEED_CALC_BUFFER_LEN - 1 ); - U16 incDelta = ( bpMotorHallSensorCount >= bpLastMotorHallSensorCounts[ nextIdx ] ? \ - bpMotorHallSensorCount - bpLastMotorHallSensorCounts[ nextIdx ] : \ - ( HEX_64_K - bpLastMotorHallSensorCounts[ nextIdx ] ) + bpMotorHallSensorCount ); + U32 nextIdx = INC_WRAP( bpMotorSpeedCalcIdx, 0, BP_SPEED_CALC_BUFFER_LEN - 1 ); + U16 incDelta = u16DiffWithWrap( bpLastMotorHallSensorCounts[ nextIdx ], bpMotorHallSensorCount ); U16 decDelta = HEX_64_K - incDelta; U16 spdDelta; - U16 delta; + S16 delta; // Determine blood pump speed/direction from delta hall sensor count since last interval if ( incDelta < decDelta ) { spdDelta = incDelta; bloodPumpSpeedRPM.data = ( (F32)spdDelta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN; - // Keep a running 32-bit edge count used for safety check on volume in some functions - delta = ( bpMotorHallSensorCount >= last ? bpMotorHallSensorCount - last : ( HEX_64_K - last ) + bpMotorHallSensorCount ); - bloodPumpMotorEdgeCount += delta; } else { spdDelta = decDelta; bloodPumpSpeedRPM.data = ( (F32)spdDelta / (F32)BP_HALL_EDGE_COUNTS_PER_REV ) * (F32)SEC_PER_MIN * -1.0; - // Keep a running 32-bit edge count used for safety check on volume in some functions - delta = ( bpMotorHallSensorCount <= last ? last - bpMotorHallSensorCount : ( HEX_64_K - bpMotorHallSensorCount ) + last ); - bloodPumpMotorEdgeCount -= (S32)delta; } + + // Keep a running 32-bit edge count used for safety check on volume in some functions + delta = u16BiDiffWithWrap( last, bpMotorHallSensorCount ); + if ( delta >= 0 ) + { + bloodPumpMotorEdgeCount += delta; + } + else + { + bloodPumpMotorEdgeCount -= (U16)(delta * -1); + } // Update last count for next time bpLastMotorHallSensorCounts[ nextIdx ] = bpMotorHallSensorCount;