/************************************************************************** * * Copyright (c) 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 BPModule.c * * @author (last) Varshini Nagabooshanam * @date (last) 18-May-2026 * * @author (original) Varshini Nagabooshanam * @date (original) 18-May-2026 * ***************************************************************************/ #include "AlarmDefs.h" #include "BPDriver.h" #include "BPModule.h" #include "FpgaTD.h" /** * @addtogroup BPModule * @{ */ // ********** private definitions ********** #define BP_SYSTOLIC_LOW_LIMIT 90 ///< Low systolic blood pressure threshold in mmHg #define BP_SYSTOLIC_HIGH_LIMIT 180 ///< High systolic blood pressure threshold in mmHG #define BP_HEART_RATE_LOW_LIMIT 40 ///< Low heart rate threshold in BPM #define BP_HEART_RATE_HIGH_LIMIT 180 ///< High heart rate threshold in BPM #define BP_LOW_SYSTOLIC_MAX_COUNT 3 ///< Maximum consecutive low systolic pressure events. /// Blood pressure module states. typedef enum { BP_MODULE_IDLE_STATE = 0, ///< Blood Pressure idle state. BP_MODULE_MEASURE_STATE, ///< Blood pressure measurement state BP_MODULE_CHECK_STATE, ///< Blood pressure validation state NUM_OF_BP_MODULE_STATES ///< Number of blood pressure states. } BP_MODULE_STATE_T; // ********** private data ********** static BP_MODULE_STATE_T bpModuleState = BP_MODULE_IDLE_STATE; ///< Current blood pressure module state. static BP_RESULTS_T bpModuleResults; ///< Latest blood pressure measurement results. static U08 lowSystolicCount; ///< Consecutive low systolic pressure counter. // ********** private function prototypes ********** static void checkBloodPressureReading( void ); /*********************************************************************//** * @brief * The initBPModule function initializes the blood pressure module. * @details \b Inputs: none * @details \b Outputs: bpModuleState * @return none ***************************************************************************/ void initBPModule( void ) { initBPDriver(); bpModuleState = BP_MODULE_IDLE_STATE; } /*********************************************************************//** * @brief * The execBPModule function executes the blood pressure module state * machine. * @details \b Inputs: bpModuleState * @details \b Outputs: bpModuleState, bpModuleResults * @return none ***************************************************************************/ void execBPModule( void ) { switch ( bpModuleState ) { case BP_MODULE_IDLE_STATE: { break; } case BP_MODULE_MEASURE_STATE: { execBPDriver(); if ( TRUE == isBPMeasurementReady() ) { getBPResults( &bpModuleResults ); bpModuleState = BP_MODULE_CHECK_STATE; } else if ( TRUE == hasBPDriverError() ) { activateAlarm( ALARM_ID_TD_BP_MODULE_ERROR ); bpModuleState = BP_MODULE_IDLE_STATE; } break; } case BP_MODULE_CHECK_STATE: { checkBloodPressureReading(); bpModuleState = BP_MODULE_IDLE_STATE; break; } default: { bpModuleState = BP_MODULE_IDLE_STATE; break; } } } /*********************************************************************//** * @brief * The initiateAdultBPReading function initiates an adult blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpModuleState * @return none ***************************************************************************/ void initiateAdultBPReading( void ) { startAdultBPMeasurement(); bpModuleState = BP_MODULE_MEASURE_STATE; } /*********************************************************************//** * @brief * The initiatePedsBPReading function initiates a pediatric blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpModuleState * @return none ***************************************************************************/ void initiatePedsBPReading( void ) { startPedsBPMeasurement(); bpModuleState = BP_MODULE_MEASURE_STATE; } /*********************************************************************//** * @brief * The abortBPReading function aborts the active blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpModuleState * @return none ***************************************************************************/ void abortBPReading( void ) { abortBPMeasurement(); bpModuleState = BP_MODULE_IDLE_STATE; } /*********************************************************************//** * @brief * The checkBloodPressureReading function validates blood pressure measurement * results against configured limits. * @details \b Inputs: bpModuleResults * @details \b Outputs: BP alarm * @return none ***************************************************************************/ static void checkBloodPressureReading( void ) { if ( bpModuleResults.systolic <= BP_SYSTOLIC_LOW_LIMIT ) { activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW ); lowSystolicCount++; if ( lowSystolicCount >= BP_LOW_SYSTOLIC_MAX_COUNT ) { activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW_TOO_MANY ); } } else { lowSystolicCount = 0; } if ( bpModuleResults.systolic >= BP_SYSTOLIC_HIGH_LIMIT ) { activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_HIGH ); } if ( bpModuleResults.heartRate <= BP_HEART_RATE_LOW_LIMIT ) { activateAlarm( ALARM_ID_TD_BP_HEART_RATE_LOW ); } if ( bpModuleResults.heartRate >= BP_HEART_RATE_HIGH_LIMIT ) { activateAlarm( ALARM_ID_TD_BP_HEART_RATE_HIGH ); } } /**@}*/