Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u -rc049177f4d18a4740a357941b48a833d7115b581 -r07904e71ea9190b7df8edde6c671149513bb72f2 --- firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision c049177f4d18a4740a357941b48a833d7115b581) +++ firmware/App/Controllers/AirPump.c (.../AirPump.c) (revision 07904e71ea9190b7df8edde6c671149513bb72f2) @@ -16,7 +16,9 @@ ***************************************************************************/ #include "AirPump.h" +#include "AirTrap.h" #include "AlarmMgmtTD.h" +#include "GLXferPump.h" #include "Messaging.h" #include "OperationModes.h" #include "PersistentAlarm.h" @@ -32,6 +34,7 @@ #define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Air pump data publish interval. #define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Air pump data publish start counter. +#define AIR_PUMP_STALL_PERSISTENCE ( 150 / TASK_GENERAL_INTERVAL ) ///< Stall duration before alarm (150 ms) #pragma pack(push, 1) /// Payload record structure for air pump test set command message payload. @@ -45,6 +48,7 @@ // ********** private data ********** static AIR_PUMP_STATE_T currentAirPumpState; ///< Current air pump control state. +static U08 airPumpStallCounter; ///< Air pump stall counter. static U16 currentAirPumpRPM; ///< Current air pump RPM. static F32 currentAirPumpPowerLevel; ///< Current air pump power level setting in % duty cycle (0..100%). static U32 airPumpDataPublicationTimerCounter; ///< Air pump data broadcast timer counter. @@ -55,6 +59,7 @@ static AIR_PUMP_STATE_T handleAirPumpStartState( void ); static AIR_PUMP_STATE_T handleAirPumpOffState( void ); static AIR_PUMP_STATE_T handleAirPumpOnState ( void ); +static void checkAirPumpStallCondition( void ); static void publishAirPumpData( void ); /*********************************************************************//** @@ -73,6 +78,8 @@ airPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; currentAirPumpState = AIR_PUMP_STATE_INIT; currentAirPumpPowerLevel = AIR_PUMP_MOTOR_OFF; + currentAirPumpRPM = 0; + airPumpStallCounter = 0; airPumpDataPublishInterval.data = AIR_PUMP_DATA_PUB_INTERVAL; airPumpDataPublishInterval.ovData = AIR_PUMP_DATA_PUB_INTERVAL; airPumpDataPublishInterval.ovInitData = AIR_PUMP_DATA_PUB_INTERVAL; @@ -167,6 +174,9 @@ break; } + // Check stall condition + checkAirPumpStallCondition(); + publishAirPumpData(); } @@ -225,6 +235,35 @@ /*********************************************************************//** * @brief + * The checkAirPumpStallCondition function detects an air pump stall. + * @details \b Alarm: ALARM_ID_TD_AIR_PUMP_STALL when the air pump is + * commanded on and the measured RPM is zero for multiple controller cycles. + * @details \b Inputs: currentAirPumpPowerLevel, currentAirPumpRPM + * @details \b Outputs: airPumpStallCounter + * @return none + *************************************************************************/ +static void checkAirPumpStallCondition( void ) +{ + if ( ( currentAirPumpPowerLevel > 0 ) && ( currentAirPumpRPM == 0 ) ) + { + // we are commanding air pump to run but zero measured pump speed indicates it is not running + if ( ++airPumpStallCounter >= AIR_PUMP_STALL_PERSISTENCE ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AIR_PUMP_STALL, currentAirPumpPowerLevel, currentAirPumpRPM ); + // Stop H12 air pump + setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); + // Stop air trap control + endAirTrapControl(); + } + } + else + { + airPumpStallCounter = 0; + } +} + +/*********************************************************************//** + * @brief * The publishAirPumpData function constructs and sends the air pump data * broadcast message. * @details \b Message \b Sent: MSG_ID_TD_AIR_PUMP_DATA @@ -241,6 +280,8 @@ AIR_PUMP_PAYLOAD_T data; data.h12State = getAirPumpState(); + data.h12Power = (U32)currentAirPumpPowerLevel; + data.h12Rpm = (U32)currentAirPumpRPM; data.h12Power = currentAirPumpPowerLevel; data.h12Rpm = (U32)currentAirPumpRPM; //TODO:remove after validating pump speed Index: firmware/App/Controllers/AirPump.h =================================================================== diff -u -r515eb6e184a716fb21f7a5008e54570c1f58fe42 -r07904e71ea9190b7df8edde6c671149513bb72f2 --- firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision 515eb6e184a716fb21f7a5008e54570c1f58fe42) +++ firmware/App/Controllers/AirPump.h (.../AirPump.h) (revision 07904e71ea9190b7df8edde6c671149513bb72f2) @@ -7,8 +7,8 @@ * * @file AirPump.h * -* @author (last) Sean Nash -* @date (last) 23-Jun-2025 +* @author (last) Sameer Kalliadan Poyil +* @date (last) 27-Feb-2026 * * @author (original) Sean Nash * @date (original) 19-Sep-2024 @@ -38,8 +38,12 @@ typedef struct { U32 h12State; ///< Air pump state status - U32 h12Power; ///< Air pump power level setting U32 h12Rpm; ///< Air pump speed in RPM. + F32 h12Power; ///< Air pump power level setting in duty cycle percentage + //TODO: remove after validating air pump speed + U32 fpgah12Rpm; ///< Air pump fpga speed in RPM. + //TODO: remove after validating air pump speed + U32 scalarPower; ///< Scalar power } AIR_PUMP_PAYLOAD_T; #pragma pack(pop) @@ -56,7 +60,7 @@ void initAirPump(void); void execAirPumpController(void); -void setAirPumpState( AIR_PUMP_STATE_T state, U08 power ); +BOOL setAirPumpState( AIR_PUMP_STATE_T state, F32 power ); AIR_PUMP_STATE_T getAirPumpState( void ); BOOL testAirPumpDataPublishIntervalOverride( MESSAGE_T *message ); Index: firmware/App/Drivers/GLXferPump.h =================================================================== diff -u -rf049791a4d8b29118e1eb29e351fdca6a1908ffa -r07904e71ea9190b7df8edde6c671149513bb72f2 --- firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision f049791a4d8b29118e1eb29e351fdca6a1908ffa) +++ firmware/App/Drivers/GLXferPump.h (.../GLXferPump.h) (revision 07904e71ea9190b7df8edde6c671149513bb72f2) @@ -7,8 +7,8 @@ * * @file GLXferPump.h * -* @author (last) Dara Navaei -* @date (last) 09-Nov-2025 +* @author (last) Sameer Kalliadan Poyil +* @date (last) 27-Feb-2026 * * @author (original) Sean Nash * @date (original) 19-Sep-2024 @@ -33,15 +33,23 @@ // ********** public definitions ********** -#define AIR_PUMP_MOTOR_OFF 0 ///< Power level setting (PWM) for H12 air pump to turn pump off. -#define AIR_PUMP_MOTOR_MAX_PWM 60 ///< Power level setting (PWM) maximum for H12 air pump. +#define AIR_PUMP_MOTOR_OFF 0.0F ///< Power level setting (PWM) for H12 air pump to turn pump off. +#define AIR_PUMP_DUTY_CYCLE_MIN 0.0F ///< Air pump minimum duty cycle in percentage +#define AIR_PUMP_DUTY_CYCLE_MAX 100.0F ///< Air pump maximum duty cycle in percentage +#define AIR_PUMP_DUTY_CYCLE_LIMIT 24.0F ///< Air pump limit duty cycle in percentage from 1- 23 as invalid +#define AIR_PUMP_MAX_PWM 250 ///< Air pump maximum PWM, FPGA ignores 251-255 // ********** public function prototypes ********** void initGasLiqXferPumpDriver( void ); -void setAirPumpMotorPower( U08 power ); -U08 getAirPumpMotorPower( void ); U16 getAirPumpMotorRPM( void ); +void setAirPumpMotorPower( F32 power ); +F32 getAirPumpMotorPower( void ); +U16 getAirPumpMotorRPM( void ); +// TODO:remove after testing +U16 getAirPumpMotorFPGARPM( void ); +// TODO:remove after testing +U32 getAirPumpMotorScalarPower( void ); BOOL testSetAirPump( MESSAGE_T *message ); Index: firmware/App/Services/FpgaTD.c =================================================================== diff -u -rd213e668492c3f6e572486d1a3dfb69ecd2424e8 -r07904e71ea9190b7df8edde6c671149513bb72f2 --- firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision d213e668492c3f6e572486d1a3dfb69ecd2424e8) +++ firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 07904e71ea9190b7df8edde6c671149513bb72f2) @@ -7,8 +7,8 @@ * * @file FpgaTD.c * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2025 +* @author (last) Jashwant Gantyada +* @date (last) 13-Mar-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -152,7 +152,7 @@ U08 h6RotorStatus; ///< Reg 346. H6 rotor status. U08 reserved5; ///< Reg 347. Reserved register. U16 h12Speed; ///< Reg 348. H12 speed (air pump in RPM). - U16 rotorRevsCounter; ///< Reg 350. Rotor revs counter + U16 h4RotorRevsCounter; ///< Reg 350. H4 rotor revs counter U16 baroManufactInfo; ///< Reg 352. Baro sensor manufacturing information. U16 baroPresSensitivity; ///< Reg 354. Baro sensor prom coefficient 1. U16 baroPresOffset; ///< Reg 356. Baro sensor prom coefficient 2. @@ -604,6 +604,19 @@ /*********************************************************************//** * @brief + * The getH4RotorRevsCounter function gets the latest blood pump + * rotor revolutions count. + * @details \b Inputs: fpgaSensorReadings.h4RotorRevsCounter + * @details \b Outputs: none + * @return Latest blood pump revolutions count reading. + *************************************************************************/ +U16 getH4RotorRevsCounter( void ) +{ + return fpgaSensorReadings.h4RotorRevsCounter; +} + +/*********************************************************************//** + * @brief * The setH5ControlFlags function sets the control flags for the H5 ejector * stepper motor. * @note Bit 0 - MS1 (bit 1 of microstepping configuration setting) @@ -911,6 +924,18 @@ /*********************************************************************//** * @brief + * The getH12AirPumpMotorRPM function reads the air pump RPM from FPGA. + * @details \b Inputs: fpgaSensorReadings + * @details \b Outputs: none + * @return air pump RPM value + *************************************************************************/ +U16 getH12AirPumpMotorRPM( void ) +{ + return fpgaSensorReadings.h12Speed; +} + +/*********************************************************************//** + * @brief * The setH12AirPumpMotorPowerLevel function sets the air pump motor power level * to 0 to turn pump off or 1..255 for varying power levels. * @details \b Inputs: fpgaActuatorSetPoints.h12Control Index: firmware/App/Services/FpgaTD.h =================================================================== diff -u -rf08afb101ec9f209412551c485e7b2faed0aa900 -r07904e71ea9190b7df8edde6c671149513bb72f2 --- firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision f08afb101ec9f209412551c485e7b2faed0aa900) +++ firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 07904e71ea9190b7df8edde6c671149513bb72f2) @@ -7,8 +7,8 @@ * * @file FpgaTD.h * -* @author (last) Dara Navaei -* @date (last) 19-Dec-2025 +* @author (last) Jashwant Gantyada +* @date (last) 12-Mar-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -91,6 +91,7 @@ S16 getH4RotorCount( void ); S16 getH4TorqueCount( void ); +U16 getH4RotorRevsCounter( void ); U08 getH6Status( void ); U08 getH6RotorStatus( void ); @@ -125,6 +126,7 @@ void setH13ValveState( VALVE_3WAY_STATE_T state ); void setH20ValveState( VALVE_3WAY_STATE_T state ); +U16 getH12AirPumpMotorRPM( void ); void setH12AirPumpMotorPowerLevel( U08 power ); void setH12AirPumpMotorPWMCntTime( U16 tenNS );