Index: firmware/App/Drivers/BPDriver.c =================================================================== diff -u -r74dd4df044948a45ba71b71269ff5b703072d310 -r5a601a06c2423c4379a618608974159366b10553 --- firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision 74dd4df044948a45ba71b71269ff5b703072d310) +++ firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision 5a601a06c2423c4379a618608974159366b10553) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AlarmMgmtTD.h" #include "BPDriver.h" #include "FpgaTD.h" @@ -28,6 +29,7 @@ #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_MODULE_BUSY_MASK 0x80 ///< Blood Pressure module busy mask #define BP_RESP_CODE_BPDATA 0x07 ///< Blood pressure response code indicating BP data is available. /// Blood pressure driver states. @@ -37,7 +39,7 @@ 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. + NUM_OF_BP_DRIVER_STATES ///< Number of BP driver states. } BP_DRIVER_STATE_T; // ********** private data ********** @@ -46,15 +48,22 @@ 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. +static BOOL bpMeasurementReady; ///< Blood pressure measurement ready flag. +static BOOL requestAdultBPMeasurement; ///< Request adult BP measurement flag. +static BOOL requestPedsBPMeasurement; ///< Request pediatric BP measurement flag. +static BOOL requestAbortBPMeasurement; ///< Request abort BP measurement flag. // ********** private function prototypes ********** static U08 getBPResponseCode( void ); +static void handleBPDriverIdleState( void ); +static void handleBPDriverMeasureState( void ); +static void handleBPDriverGetDataState( void ); /*********************************************************************//** * @brief * The getBPResponseCode function returns the FPGA NIBP response code. - * @details \b Inputs: FPGA NIBP response register + * @details \b Inputs: getNIBPStatusResponse * @details \b Outputs: none * @return FPGA NIBP response code. ***************************************************************************/ @@ -72,13 +81,16 @@ ***************************************************************************/ void initBPDriver( void ) { - bpDriverState = BP_DRIVER_IDLE_STATE; + bpDriverState = BP_DRIVER_IDLE_STATE; + bpMeasurementReady = FALSE; + bpDriverError = FALSE; } /*********************************************************************//** * @brief * The execBPDriver function executes the blood pressure driver state * machine. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT * @details \b Inputs: FPGA NIBP registers * @details \b Outputs: bpDriverState, bpResults * @return none @@ -89,92 +101,146 @@ { case BP_DRIVER_IDLE_STATE: { - // TODO + handleBPDriverIdleState(); 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; - } + handleBPDriverMeasureState(); break; } case BP_DRIVER_GET_DATA_STATE: { - bpResults.systolic = getNIBPSystolicPressure(); - bpResults.diastolic = getNIBPDiastolicPressure(); - bpResults.heartRate = getNIBPHeartRate(); - bpMeasurementReady = TRUE; - bpDriverState = BP_DRIVER_IDLE_STATE; + handleBPDriverGetDataState(); break; } - case BP_DRIVER_ERROR_STATE: - { - bpDriverState = BP_DRIVER_IDLE_STATE; - break; - } - default: { + activateAlarm( ALARM_ID_TD_SOFTWARE_FAULT ); bpDriverState = BP_DRIVER_IDLE_STATE; break; } } } /*********************************************************************//** +* @brief +* The handleBPDriverIdleState function executes the BP driver idle +* state handling. +* @details \b Inputs: requestAdultBPMeasurement, requestPedsBPMeasurement, +* requestAbortBPMeasurement +* @details \b Outputs: bpDriverState +* @return none +***************************************************************************/ +static void handleBPDriverIdleState( void ) +{ + if ( TRUE == requestAdultBPMeasurement ) + { + requestAdultBPMeasurement = FALSE; + bpMeasurementReady = FALSE; + bpDriverError = FALSE; + setNIBPCommand( FPGA_NIBP_CMD_START_BP ); + bpDriverState = BP_DRIVER_MEASURE_STATE; + } + else if ( TRUE == requestPedsBPMeasurement ) + { + requestPedsBPMeasurement = FALSE; + bpMeasurementReady = FALSE; + bpDriverError = FALSE; + setNIBPCommand( FPGA_NIBP_CMD_START_PEDS_BP ); + bpDriverState = BP_DRIVER_MEASURE_STATE; + } + else if ( TRUE == requestAbortBPMeasurement ) + { + requestAbortBPMeasurement = FALSE; + setNIBPCommand( FPGA_NIBP_CMD_ABORT_BP ); + bpDriverState = BP_DRIVER_IDLE_STATE; + } +} + +/*********************************************************************//** +* @brief +* The handleBPDriverMeasureState function executes the BP driver +* measurement state handling. +* @details \b Inputs: setNIBPCommand +* @details \b Outputs: bpDriverState +* @return none +***************************************************************************/ +static void handleBPDriverMeasureState( void ) +{ + if ( BP_RESP_CODE_BPDATA == getBPResponseCode() ) + { + setNIBPCommand( FPGA_NIBP_CMD_GET_BP_DATA ); + bpDriverState = BP_DRIVER_GET_DATA_STATE; + } + + else if ( ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) != 0 ) + { + bpDriverError = TRUE; + bpDriverState = BP_DRIVER_IDLE_STATE; + } +} + +/*********************************************************************//** +* @brief +* The handleBPDriverGetDataState function executes the BP driver +* get data state handling. +* @details \b Inputs: getNIBPStatusResponse +* @details \b Outputs: bpResults +* @return none +***************************************************************************/ +static void handleBPDriverGetDataState( void ) +{ + if ( ( getNIBPStatusResponse() & BP_MODULE_BUSY_MASK ) == 0 ) + { + bpResults.systolic = getNIBPSystolicPressure(); + bpResults.diastolic = getNIBPDiastolicPressure(); + bpResults.heartRate = getNIBPHeartRate(); + bpMeasurementReady = TRUE; + bpDriverState = BP_DRIVER_IDLE_STATE; + } +} + +/*********************************************************************//** * @brief - * The startAdultBPMeasurement function initiates an adult blood pressure + * The startAdultBPMeasurement function requests an adult blood pressure * measurement. * @details \b Inputs: none - * @details \b Outputs: bpDriverState + * @details \b Outputs: requestAdultBPMeasurement * @return none ***************************************************************************/ void startAdultBPMeasurement( void ) { - setNIBPCommand( FPGA_NIBP_CMD_START_BP ); - bpMeasurementReady = FALSE; - bpDriverError = FALSE; - bpDriverState = BP_DRIVER_MEASURE_STATE; + requestAdultBPMeasurement = TRUE; } /*********************************************************************//** * @brief - * The startPedsBPMeasurement function initiates a pediatric blood pressure + * The startPedsBPMeasurement function requests a pediatric blood pressure * measurement. * @details \b Inputs: none - * @details \b Outputs: bpDriverState + * @details \b Outputs: requestPedsBPMeasurement * @return none ***************************************************************************/ void startPedsBPMeasurement( void ) { - setNIBPCommand( FPGA_NIBP_CMD_START_PEDS_BP ); - bpMeasurementReady = FALSE; - bpDriverError = FALSE; - bpDriverState = BP_DRIVER_MEASURE_STATE; + requestPedsBPMeasurement = TRUE; } /*********************************************************************//** * @brief * The abortBPMeasurement function aborts the active blood pressure * measurement. * @details \b Inputs: none - * @details \b Outputs: bpDriverState + * @details \b Outputs: requestAbortBPMeasurement * @return none ***************************************************************************/ void abortBPMeasurement( void ) { - setNIBPCommand( FPGA_NIBP_CMD_ABORT_BP ); - bpDriverState = BP_DRIVER_IDLE_STATE; + requestAbortBPMeasurement = TRUE; } /*********************************************************************//** @@ -214,7 +280,7 @@ { BOOL result = FALSE; - if ( NULL != results ) + if ( ( NULL != results ) && ( TRUE == bpMeasurementReady ) ) { *results = bpResults; result = TRUE;