/************************************************************************** * * 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 BPDriver.c * * @author (last) Varshini Nagabooshanam * @date (last) 18-May-2026 * * @author (original) Varshini Nagabooshanam * @date (original) 18-May-2026 * ***************************************************************************/ #include "BPDriver.h" #include "FpgaTD.h" /** * @addtogroup BPDriver * @{ */ // ********** private definitions ********** #define BP_RESP_CODE_MASK 0x3C ///< Blood pressure response code mask. #define BP_RESP_CODE_SHIFT 2 ///< Blood pressure response code bit shift. #define BP_MODULE_ERROR_MASK 0x40 ///< Blood pressure module error mask. #define BP_RESP_CODE_BPDATA 0x07 ///< Blood pressure response code indicating BP data is available. /// Blood pressure driver states. typedef enum { BP_DRIVER_IDLE_STATE = 0, ///< Idle state. BP_DRIVER_MEASURE_STATE, ///< Measurement state. BP_DRIVER_GET_DATA_STATE, ///< Get data state. BP_DRIVER_ERROR_STATE, ///< Error state. NUM_OF_BP_DRIVER_STATES ///< Number of driver states. } BP_DRIVER_STATE_T; // ********** private data ********** static BP_DRIVER_STATE_T bpDriverState = BP_DRIVER_IDLE_STATE; ///< Current blood pressure driver state. static BP_RESULTS_T bpResults; ///< Latest blood pressure measurement results. static BOOL bpMeasurementReady; ///< Blood pressure measurement ready static BOOL bpDriverError; ///< Blood pressure driver error flag. // ********** private function prototypes ********** static U08 getBPResponseCode( void ); /*********************************************************************//** * @brief * The getBPResponseCode function returns the FPGA NIBP response code. * @details \b Inputs: FPGA NIBP response register * @details \b Outputs: none * @return FPGA NIBP response code. ***************************************************************************/ static U08 getBPResponseCode( void ) { return ( ( getNIBPStatusResponse() & BP_RESP_CODE_MASK ) >> BP_RESP_CODE_SHIFT ); } /*********************************************************************//** * @brief * The initBPDriver function initializes the blood pressure driver. * @details \b Inputs: none * @details \b Outputs: bpDriverState, bpResults, bpErrorCode * @return none ***************************************************************************/ void initBPDriver( void ) { bpDriverState = BP_DRIVER_IDLE_STATE; } /*********************************************************************//** * @brief * The execBPDriver function executes the blood pressure driver state * machine. * @details \b Inputs: FPGA NIBP registers * @details \b Outputs: bpDriverState, bpResults * @return none ***************************************************************************/ void execBPDriver( void ) { switch ( bpDriverState ) { case BP_DRIVER_IDLE_STATE: { // TODO break; } case BP_DRIVER_MEASURE_STATE: { if ( BP_RESP_CODE_BPDATA == getBPResponseCode() ) { bpDriverState = BP_DRIVER_GET_DATA_STATE; } else if ( ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) != 0 ) { bpDriverError = TRUE; bpDriverState = BP_DRIVER_ERROR_STATE; } break; } case BP_DRIVER_GET_DATA_STATE: { bpResults.systolic = getNIBPSystolicPressure(); bpResults.diastolic = getNIBPDiastolicPressure(); bpResults.heartRate = getNIBPHeartRate(); bpMeasurementReady = TRUE; bpDriverState = BP_DRIVER_IDLE_STATE; break; } case BP_DRIVER_ERROR_STATE: { bpDriverState = BP_DRIVER_IDLE_STATE; break; } default: { bpDriverState = BP_DRIVER_IDLE_STATE; break; } } } /*********************************************************************//** * @brief * The startAdultBPMeasurement function initiates an adult blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpDriverState * @return none ***************************************************************************/ void startAdultBPMeasurement( void ) { setNIBPCommand( FPGA_NIBP_CMD_START_BP ); bpMeasurementReady = FALSE; bpDriverError = FALSE; bpDriverState = BP_DRIVER_MEASURE_STATE; } /*********************************************************************//** * @brief * The startPedsBPMeasurement function initiates a pediatric blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpDriverState * @return none ***************************************************************************/ void startPedsBPMeasurement( void ) { setNIBPCommand( FPGA_NIBP_CMD_START_PEDS_BP ); bpMeasurementReady = FALSE; bpDriverError = FALSE; bpDriverState = BP_DRIVER_MEASURE_STATE; } /*********************************************************************//** * @brief * The abortBPMeasurement function aborts the active blood pressure * measurement. * @details \b Inputs: none * @details \b Outputs: bpDriverState * @return none ***************************************************************************/ void abortBPMeasurement( void ) { setNIBPCommand( FPGA_NIBP_CMD_ABORT_BP ); bpDriverState = BP_DRIVER_IDLE_STATE; } /*********************************************************************//** * @brief * The isBPMeasurementReady function returns the blood pressure * measurement ready state * @details \b Inputs: bpMeasurementReady * @details \b Outputs: none * @return TRUE if measurement ready, FALSE otherwise. ***************************************************************************/ BOOL isBPMeasurementReady( void ) { return bpMeasurementReady; } /*********************************************************************//** * @brief * The hasBPDriverError function returns the blood pressure driver * error state. * @details \b Inputs: bpDriverError * @details \b Outputs: none * @return TRUE if module error exists, FALSE otherwise. ***************************************************************************/ BOOL hasBPDriverError( void ) { return bpDriverError; } /*********************************************************************//** * @brief * The getBPResults function returns the latest BP measurement results. * @details \b Inputs: bpResults * @details\b Outputs: results * @return TRUE if results copied, FALSE otherwise. ***************************************************************************/ BOOL getBPResults( BP_RESULTS_T *results ) { BOOL result = FALSE; if ( NULL != results ) { *results = bpResults; result = TRUE; } return result; } /**@}*/