Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r85a680de4306aa033b1dc1f386fa5fa0a25cf73b -r11a47fa824c22e255cac5ddadc17364fa27a2b0a --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 85a680de4306aa033b1dc1f386fa5fa0a25cf73b) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 11a47fa824c22e255cac5ddadc17364fa27a2b0a) @@ -35,7 +35,8 @@ #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" -#include "Timers.h" +#include "Timers.h" +#include "Utilities.h" /** * @addtogroup BloodFlow @@ -938,31 +939,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;