/************************************************************************** * * Copyright (c) 2024-2026 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file GLXferPump.c * * @author (last) Dara Navaei * @date (last) 03-Sep-2025 * * @author (original) Sean Nash * @date (original) 19-Sep-2024 * ***************************************************************************/ #include #include "AlarmMgmtTD.h" #include "FpgaTD.h" #include "GLXferPump.h" #include "GPIO.h" #include "Messaging.h" /** * @addtogroup GLXferPump * @{ */ // ********** private definitions ********** #define AIR_PUMP_PWM_TIME 20 ///< Time (in 10ns increments) per PWM register count for the air pump = 20 kHz. #define AIR_PUMP_RPM_FACTOR 60 ///< Air pump rpm pump factor #define TEN_MICRO ( 10 * 1E-6F ) ///< 10 X 10^-6 #define MOTOR_RPM_ZERO_RAW 0xFFFFU ///< Air pump Zero RPM // ********** private data ********** static F32 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. // ********** private function prototypes ********** static U08 convertPercentageToScalar( F32 percentage ); // TODO: remove after validating power static U08 scalarPowerLevel; ///< Current scalar power level /*********************************************************************//** * @brief * The initGasLiqXferPumpDriver function initializes the gas/liquid transfer * pump driver unit. * @details \b Inputs: none * @details \b Outputs: currentAirPumpMotorPowerLevel * @return none *************************************************************************/ void initGasLiqXferPumpDriver( void ) { currentAirPumpMotorPowerLevel = AIR_PUMP_MOTOR_OFF; setH12AirPumpMotorPowerLevel( currentAirPumpMotorPowerLevel ); setH12AirPumpMotorPWMCntTime( AIR_PUMP_PWM_TIME ); } /*********************************************************************//** * @brief * The setAirPumpMotorPower function sets the air pump motor to the given * power level in duty cycle percentage (0..100%). * @details \b Message \b Sent: MSG_ID_TD_EVENT if changing air pump power level. * @details \b Inputs: none * @details \b Outputs: currentAirPumpMotorPowerLevel * @param power Power level for air pump (0=off, 1..100=lower to higher power level). * @return none. *************************************************************************/ void setAirPumpMotorPower( F32 power ) { U08 scalarPower = scalarPowerLevel = convertPercentageToScalar( power ); // if state is changing, set the air pump to the given on/off state and send event if ( power != currentAirPumpMotorPowerLevel ) { setH12AirPumpMotorPowerLevel( scalarPower ); SEND_EVENT_WITH_2_F32_DATA( TD_EVENT_AIR_PUMP_ON_OFF, currentAirPumpMotorPowerLevel, power ); currentAirPumpMotorPowerLevel = power; } } /*********************************************************************//** * @brief * The getAirPumpMotorState function gets the current set power level of the * air pump motor. * @details \b Inputs: currentAirPumpMotorPowerLevel * @details \b Outputs: none * @return Current set power level of the air pump motor. *************************************************************************/ F32 getAirPumpMotorPower( void ) { return currentAirPumpMotorPowerLevel; } /*********************************************************************//** * @brief * The getAirPumpMotorScalarPower function gets the current set scalar power level of the * air pump motor. * @details \b Inputs: none * @details \b Outputs: scalarPowerLevel * @return Current set scalar power level of the air pump motor. *************************************************************************/ F32 getAirPumpMotorScalarPower( void ) { return scalarPowerLevel; } /*********************************************************************//** * @brief * The getAirPumpMotorRPM function reads the air pump RPM from FPGA. * minimum RPM that reports is 400 rpm and anything slower considered 0 (0xFFFF) * to convert the real RPM, use the formula rpm = (60.0 / ( getH12AirPumpMotorRPM() * 10 * 1E-6 ) * @details \b Inputs: none * @details \b Outputs: none * @return air pump motor RPM value. *************************************************************************/ U16 getAirPumpMotorRPM( void ) { F32 realRPM; U16 fpgaRPM = getH12AirPumpMotorRPM(); if ( MOTOR_RPM_ZERO_RAW == fpgaRPM ) { realRPM = 0.0F; } else { realRPM = ( ( ( F32 )AIR_PUMP_RPM_FACTOR ) / ( F32 )( fpgaRPM * TEN_MICRO ) ); } return ( U16 )realRPM; } /*********************************************************************//** * @brief * The PercentageToScalar function convert percentage 0-100% duty * cycle to 0-250 scalar value. * @details \b Inputs: none * @details \b Outputs: none * @param percentage Power level for air pump (0=off, 1-100.0 for ON). * @return U08 8-bit PWM value (0-250) *************************************************************************/ static U08 convertPercentageToScalar( F32 percentage ) { F32 power; // Clamp input to 0-100% power = RANGE( percentage, AIR_PUMP_DUTY_CYCLE_MIN, AIR_PUMP_DUTY_CYCLE_MAX ); // Calculate 0-250 scalar value = ( power / 100 ) * 250 return (U08)( ceilf ( ( ( power / FRACTION_TO_PERCENT_FACTOR ) * (F32)AIR_PUMP_MAX_PWM ) ) ); } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /**@}*/