Index: firmware/App/Drivers/BPDriver.c =================================================================== diff -u -r143f7b732efbb9efdc690757823e711b5022b29d -r12fa9b72d8e338b624879c284488a04b17115762 --- firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision 143f7b732efbb9efdc690757823e711b5022b29d) +++ firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision 12fa9b72d8e338b624879c284488a04b17115762) @@ -17,7 +17,9 @@ #include "AlarmMgmtTD.h" #include "BPDriver.h" +#include "Common.h" #include "FpgaTD.h" +#include "TaskGeneral.h" /** * @addtogroup BPDriver @@ -32,14 +34,24 @@ #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. #define BP_MODULE_BUSY_CLEAR 0 ///< Blood pressure module buy clear +#define BP_COMMAND_CLEAR_DELAY_TICKS ( ( 10 / TASK_GENERAL_INTERVAL ) + 1 ) +#define BP_FPGA_CMD_GIVEN_MASK 0x10 +#define BP_MODULE_CMD_STARTED_MASK 0x01 +#define BP_MODULE_CMD_IN_PROGRESS_MASK 0x02 /// 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. - NUM_OF_BP_DRIVER_STATES ///< Number of BP driver states. + BP_DRIVER_IDLE_STATE = 0, + BP_DRIVER_CLEAR_CMD_STATE, + BP_DRIVER_WAIT_CLEAR_CMD_STATE, + BP_DRIVER_SEND_CMD_STATE, + BP_DRIVER_WAIT_FPGA_ACK_STATE, + BP_DRIVER_CLEAR_CMD_AFTER_ACK_STATE, + BP_DRIVER_WAIT_MODULE_START_STATE, + BP_DRIVER_WAIT_MEASUREMENT_COMPLETE_STATE, + BP_DRIVER_GET_DATA_STATE, + NUM_OF_BP_DRIVER_STATES } BP_DRIVER_STATE_T; // ********** private data ********** @@ -52,12 +64,20 @@ static BOOL requestPedsBPMeasurement; ///< Request pediatric BP measurement static BOOL requestAbortBPMeasurement; ///< Request abort BP measurement static BOOL bpCuffConnected; ///< Blood pressure cuff connection +static U08 pendingBPCommand; ///< Pending BP command +static U08 bpCommandClearCtr; ///< Command clear delay counter // ********** private function prototypes ********** static U08 getBPResponseCode( void ); static BP_DRIVER_STATE_T handleBPDriverIdleState( void ); -static BP_DRIVER_STATE_T handleBPDriverMeasureState( void ); +static BP_DRIVER_STATE_T handleBPDriverClearCmdState( void ); +static BP_DRIVER_STATE_T handleBPDriverWaitClearCmdState( void ); +static BP_DRIVER_STATE_T handleBPDriverSendCmdState( void ); +static BP_DRIVER_STATE_T handleBPDriverWaitFpgaAckState( void ); +static BP_DRIVER_STATE_T handleBPDriverClearCmdAfterAckState( void ); +static BP_DRIVER_STATE_T handleBPDriverWaitModuleStartState( void ); +static BP_DRIVER_STATE_T handleBPDriverWaitMeasurementCompleteState( void ); static BP_DRIVER_STATE_T handleBPDriverGetDataState( void ); /*********************************************************************//** @@ -79,6 +99,8 @@ bpResults.systolic = 0; bpResults.diastolic = 0; bpResults.heartRate = 0; + pendingBPCommand = (U08)BP_CMD_IDLE; + bpCommandClearCtr = 0; } /*********************************************************************//** @@ -104,18 +126,42 @@ ***************************************************************************/ void execBPDriver( void ) { - bpCuffConnected = ( getNIBPControlStatus() != 0 ); + bpCuffConnected = ( getNIBPControlStatus() != 0 ) ? TRUE : FALSE; switch ( bpDriverState ) { case BP_DRIVER_IDLE_STATE: bpDriverState = handleBPDriverIdleState(); break; - case BP_DRIVER_MEASURE_STATE: - bpDriverState = handleBPDriverMeasureState(); + case BP_DRIVER_CLEAR_CMD_STATE: + bpDriverState = handleBPDriverClearCmdState(); break; + case BP_DRIVER_WAIT_CLEAR_CMD_STATE: + bpDriverState = handleBPDriverWaitClearCmdState(); + break; + + case BP_DRIVER_SEND_CMD_STATE: + bpDriverState = handleBPDriverSendCmdState(); + break; + + case BP_DRIVER_WAIT_FPGA_ACK_STATE: + bpDriverState = handleBPDriverWaitFpgaAckState(); + break; + + case BP_DRIVER_CLEAR_CMD_AFTER_ACK_STATE: + bpDriverState = handleBPDriverClearCmdAfterAckState(); + break; + + case BP_DRIVER_WAIT_MODULE_START_STATE: + bpDriverState = handleBPDriverWaitModuleStartState(); + break; + + case BP_DRIVER_WAIT_MEASUREMENT_COMPLETE_STATE: + bpDriverState = handleBPDriverWaitMeasurementCompleteState(); + break; + case BP_DRIVER_GET_DATA_STATE: bpDriverState = handleBPDriverGetDataState(); break; @@ -142,60 +188,147 @@ if ( TRUE == requestAdultBPMeasurement ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_IDLE_STATE, BP_DRIVER_MEASURE_STATE ) + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_IDLE_STATE, BP_DRIVER_CLEAR_CMD_STATE ); requestAdultBPMeasurement = FALSE; bpMeasurementReady = FALSE; bpDriverError = FALSE; - setNIBPCommand( (U08)BP_CMD_START_BP ); - nextState = BP_DRIVER_MEASURE_STATE; + pendingBPCommand = (U08)BP_CMD_START_BP; + nextState = BP_DRIVER_CLEAR_CMD_STATE; } else if ( TRUE == requestPedsBPMeasurement ) { requestPedsBPMeasurement = FALSE; bpMeasurementReady = FALSE; bpDriverError = FALSE; - setNIBPCommand( (U08)BP_CMD_START_PEDS_BP ); - nextState = BP_DRIVER_MEASURE_STATE; + pendingBPCommand = (U08)BP_CMD_START_PEDS_BP; + nextState = BP_DRIVER_CLEAR_CMD_STATE; } else if ( TRUE == requestAbortBPMeasurement ) { requestAbortBPMeasurement = FALSE; - setNIBPCommand( (U08)BP_CMD_ABORT_BP ); + pendingBPCommand = (U08)BP_CMD_ABORT_BP; + nextState = BP_DRIVER_CLEAR_CMD_STATE; } return nextState; } /*********************************************************************//** * @brief -* The handleBPDriverMeasureState function executes the BP driver -* measurement state handling. +* The handleBPDriverClearCmdState function clears the BP command ready bit. * @details \b Inputs: none -* @details \b Outputs: setNIBPCommand, bpDriverState, bpDriverError +* @details \b Outputs: setNIBPCommand, bpCommandClearCtr * @return next BP driver state ***************************************************************************/ -static BP_DRIVER_STATE_T handleBPDriverMeasureState( void ) +static BP_DRIVER_STATE_T handleBPDriverClearCmdState( void ) { - BP_DRIVER_STATE_T nextState = BP_DRIVER_MEASURE_STATE; + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_CLEAR_CMD_STATE; - if ( BP_MODULE_BUSY_CLEAR == ( getNIBPStatusResponse() & BP_MODULE_BUSY_MASK ) ) + setNIBPCommand( (U08)BP_CMD_IDLE ); + bpCommandClearCtr = 0; + + return nextState; +} + +/*********************************************************************//** +* @brief +* The handleBPDriverWaitClearCmdState function waits after clearing the +* BP command ready bit. +* @details \b Inputs: bpCommandClearCtr +* @details \b Outputs: bpCommandClearCtr +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverWaitClearCmdState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_CLEAR_CMD_STATE; + + bpCommandClearCtr++; + if ( bpCommandClearCtr >= BP_COMMAND_CLEAR_DELAY_TICKS ) { - U32 respCode = getBPResponseCode(); + bpCommandClearCtr = 0; + nextState = BP_DRIVER_SEND_CMD_STATE; + } - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, 11, respCode ) - // Verify BP measurement data is available - if ( BP_RESP_CODE_BPDATA == respCode ) + return nextState; +} + +/*********************************************************************//** +* @brief +* The handleBPDriverSendCmdState function sends the pending BP command. +* @details \b Inputs: pendingBPCommand +* @details \b Outputs: setNIBPCommand +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverSendCmdState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_FPGA_ACK_STATE; + + setNIBPCommand( pendingBPCommand ); + + return nextState; +} + +/*********************************************************************//** +* @brief +* The handleBPDriverWaitFpgaAckState function waits for FPGA command +* acknowledge. +* @details \b Inputs: getNIBPControlStatus +* @details \b Outputs: none +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverWaitFpgaAckState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_FPGA_ACK_STATE; + + if ( 0 != ( getNIBPControlStatus() & BP_FPGA_CMD_GIVEN_MASK ) ) + { + nextState = BP_DRIVER_CLEAR_CMD_AFTER_ACK_STATE; + } + + return nextState; +} + +/*********************************************************************//** +* @brief +* The handleBPDriverClearCmdAfterAckState function clears the BP command +* ready bit after FPGA acknowledge. +* @details \b Inputs: none +* @details \b Outputs: setNIBPCommand +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverClearCmdAfterAckState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_MODULE_START_STATE; + + setNIBPCommand( (U08)BP_CMD_IDLE ); + + return nextState; +} + +/*********************************************************************//** +* @brief +* The handleBPDriverWaitModuleStartState function waits for the BP module +* to signal that the command started. +* @details \b Inputs: getNIBPStatusResponse, pendingBPCommand +* @details \b Outputs: none +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverWaitModuleStartState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_MODULE_START_STATE; + + if ( 0 != ( getNIBPStatusResponse() & BP_MODULE_CMD_STARTED_MASK ) ) + { + if ( ( (U08)BP_CMD_START_BP == pendingBPCommand ) || ( (U08)BP_CMD_START_PEDS_BP == pendingBPCommand ) ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_MEASURE_STATE, BP_DRIVER_GET_DATA_STATE ) - setNIBPCommand( (U08)BP_CMD_GET_BP_DATA ); + nextState = BP_DRIVER_WAIT_MEASUREMENT_COMPLETE_STATE; + } + else if ( (U08)BP_CMD_GET_BP_DATA == pendingBPCommand ) + { nextState = BP_DRIVER_GET_DATA_STATE; } - // Check whether BP module error occurred - else if ( BP_MODULE_BUSY_CLEAR != ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) ) + else { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_MEASURE_STATE, BP_DRIVER_IDLE_STATE ) - bpDriverError = TRUE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, getNIBPStatusResponse(), bpDriverState ); nextState = BP_DRIVER_IDLE_STATE; } } @@ -205,30 +338,53 @@ /*********************************************************************//** * @brief -* The handleBPDriverGetDataState function retrieves blood pressure -* measurement results. +* The handleBPDriverWaitMeasurementCompleteState function waits for the +* BP measurement command to complete. * @details \b Inputs: getNIBPStatusResponse -* @details \b Outputs: bpMeasurementReady +* @details \b Outputs: pendingBPCommand * @return next BP driver state ***************************************************************************/ -static BP_DRIVER_STATE_T handleBPDriverGetDataState( void ) +static BP_DRIVER_STATE_T handleBPDriverWaitMeasurementCompleteState( void ) { - BP_DRIVER_STATE_T nextState = BP_DRIVER_GET_DATA_STATE; + BP_DRIVER_STATE_T nextState = BP_DRIVER_WAIT_MEASUREMENT_COMPLETE_STATE; - if ( ( getNIBPStatusResponse() & BP_MODULE_BUSY_MASK ) == 0 ) + if ( 0 == ( getNIBPStatusResponse() & BP_MODULE_CMD_IN_PROGRESS_MASK ) ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_GET_DATA_STATE, 11 ) - bpResults.systolic = getNIBPSystolicPressure(); - bpResults.diastolic = getNIBPDiastolicPressure(); - bpResults.heartRate = getNIBPHeartRate(); - bpMeasurementReady = TRUE; - nextState = BP_DRIVER_IDLE_STATE; + pendingBPCommand = (U08)BP_CMD_GET_BP_DATA; + nextState = BP_DRIVER_CLEAR_CMD_STATE; } + else if ( 0 != ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) ) + { + bpDriverError = TRUE; + nextState = BP_DRIVER_IDLE_STATE; + } return nextState; } /*********************************************************************//** +* @brief +* The handleBPDriverGetDataState function retrieves blood pressure +* measurement results. +* @details \b Inputs: FPGA NIBP blood pressure registers +* @details \b Outputs: bpResults, bpMeasurementReady +* @return next BP driver state +***************************************************************************/ +static BP_DRIVER_STATE_T handleBPDriverGetDataState( void ) +{ + BP_DRIVER_STATE_T nextState = BP_DRIVER_IDLE_STATE; + + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_BUTTON, BP_DRIVER_GET_DATA_STATE, 11 ); + bpResults.systolic = (U32)getNIBPSystolicPressure(); + bpResults.diastolic = (U32)getNIBPDiastolicPressure(); + bpResults.heartRate = (U32)getNIBPHeartRate(); + bpMeasurementReady = TRUE; + pendingBPCommand = (U08)BP_CMD_IDLE; + + return nextState; +} + +/*********************************************************************//** * @brief * The startAdultBPMeasurement function requests an adult blood pressure * measurement.