Index: firmware/App/Controllers/BPModule.c =================================================================== diff -u -r2e3f8b77a9ffcf6e19152c0475d33def40d93fb1 -r5a601a06c2423c4379a618608974159366b10553 --- firmware/App/Controllers/BPModule.c (.../BPModule.c) (revision 2e3f8b77a9ffcf6e19152c0475d33def40d93fb1) +++ firmware/App/Controllers/BPModule.c (.../BPModule.c) (revision 5a601a06c2423c4379a618608974159366b10553) @@ -16,6 +16,7 @@ ***************************************************************************/ #include "AlarmDefs.h" +#include "AlarmMgmtTD.h" #include "BPDriver.h" #include "BPModule.h" #include "FpgaTD.h" @@ -39,18 +40,28 @@ 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. + NUM_OF_BP_MODULE_STATES ///< Number of blood pressure module 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. +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 +static BOOL bpSystolicLowDetected; ///< Low systolic blood pressure detection +static BOOL bpSystolicLowTooManyDetected; ///< Consecutive low systolic detection +static BOOL bpSystolicHighDetected; ///< High systolic blood pressure detection +static BOOL bpHeartRateLowDetected; ///< Low heart rate detection +static BOOL bpHeartRateHighDetected; ///< High heart rate detection +static BOOL bpModuleErrorDetected; ///< Blood pressure module error detection flag. // ********** private function prototypes ********** +static void clearBPAlarmFlags( void ); static void checkBloodPressureReading( void ); +static void handleBPModuleIdleState( void ); +static void handleBPModuleMeasureState( void ); +static void handleBPModuleCheckState( void ); /*********************************************************************//** * @brief @@ -62,52 +73,61 @@ void initBPModule( void ) { initBPDriver(); - bpModuleState = BP_MODULE_IDLE_STATE; + bpModuleState = BP_MODULE_IDLE_STATE; + clearBPAlarmFlags(); } /*********************************************************************//** -* @brief -* The execBPModule function executes the blood pressure module state -* machine. -* @details \b Inputs: bpModuleState -* @details \b Outputs: bpModuleState, bpModuleResults -* @return none -***************************************************************************/ + * @brief + * The clearBPAlarmFlags function clears all blood pressure alarm + * detection flags. + * @details \b Inputs: none + * @details \b Outputs: BP alarm detection flags + * @return none + ***************************************************************************/ +static void clearBPAlarmFlags( void ) +{ + bpSystolicLowDetected = FALSE; + bpSystolicLowTooManyDetected = FALSE; + bpSystolicHighDetected = FALSE; + bpHeartRateLowDetected = FALSE; + bpHeartRateHighDetected = FALSE; + bpModuleErrorDetected = FALSE; +} + +/*********************************************************************//** + * @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: { + handleBPModuleIdleState(); 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; - } + handleBPModuleMeasureState(); break; } case BP_MODULE_CHECK_STATE: { - checkBloodPressureReading(); - bpModuleState = BP_MODULE_IDLE_STATE; + handleBPModuleCheckState(); break; } default: { + activateAlarm( ALARM_ID_TD_SOFTWARE_FAULT ); bpModuleState = BP_MODULE_IDLE_STATE; break; } @@ -157,44 +177,185 @@ } /*********************************************************************//** -* @brief -* The checkBloodPressureReading function validates blood pressure measurement -* results against configured limits. -* @details \b Inputs: bpModuleResults -* @details \b Outputs: BP alarm -* @return none -***************************************************************************/ + * @brief + * The isBPSystolicLowDetected function returns the systolic low + * detection state. + * @details \b Inputs: bpSystolicLowDetected + * @details \b Outputs: none + * @return TRUE if detected, FALSE otherwise. + ***************************************************************************/ +BOOL isBPSystolicLowDetected( void ) +{ + return bpSystolicLowDetected; +} + +/*********************************************************************//** + * @brief + * The isBPSystolicLowTooManyDetected function returns the consecutive + * systolic low detection state. + * @details \b Inputs: bpSystolicLowTooManyDetected + * @details \b Outputs: none + * @return TRUE if detected, FALSE otherwise. + ***************************************************************************/ +BOOL isBPSystolicLowTooManyDetected( void ) +{ + return bpSystolicLowTooManyDetected; +} + +/*********************************************************************//** + * @brief + * The isBPSystolicHighDetected function returns the systolic high + * detection state. + * @details \b Inputs: bpSystolicHighDetected + * @details \b Outputs: none + * @return TRUE if detected, FALSE otherwise. + ***************************************************************************/ +BOOL isBPSystolicHighDetected( void ) +{ + return bpSystolicHighDetected; +} + +/*********************************************************************//** + * @brief + * The isBPHeartRateLowDetected function returns the heart rate low + * detection state. + * @details \b Inputs: bpHeartRateLowDetected + * @details \b Outputs: none + * @return TRUE if detected, FALSE otherwise. + ***************************************************************************/ +BOOL isBPHeartRateLowDetected( void ) +{ + return bpHeartRateLowDetected; +} + +/*********************************************************************//** + * @brief + * The isBPHeartRateHighDetected function returns the heart rate high + * detection state. + * @details \b Inputs: bpHeartRateHighDetected + * @details \b Outputs: none + * @return TRUE if detected, FALSE otherwise. + ***************************************************************************/ +BOOL isBPHeartRateHighDetected( void ) +{ + return bpHeartRateHighDetected; +} + +/*********************************************************************//** + * @brief + * The hasBPModuleError function returns the blood pressure module + * error detection state. + * @details \b Inputs: bpModuleErrorDetected + * @details \b Outputs: none + * @return TRUE if error detected, FALSE otherwise. + ***************************************************************************/ +BOOL hasBPModuleError( void ) +{ + return bpModuleErrorDetected; +} + +/*********************************************************************//** + * @brief + * The checkBloodPressureReading function validates blood pressure + * measurement results against configured thresholds and activates + * corresponding blood pressure alarms. + * @details \b Inputs: bpModuleResults + * @details \b Outputs: bpSystolicLowDetected, bpSystolicLowTooManyDetected + * bpSystolicHighDetected, bpHeartRateLowDetected, bpHeartRateHighDetected + * @return none + ***************************************************************************/ static void checkBloodPressureReading( void ) { + clearBPAlarmFlags(); + if ( bpModuleResults.systolic <= BP_SYSTOLIC_LOW_LIMIT ) { - activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW ); + bpSystolicLowDetected = TRUE; lowSystolicCount++; if ( lowSystolicCount >= BP_LOW_SYSTOLIC_MAX_COUNT ) { + bpSystolicLowTooManyDetected = TRUE; activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW_TOO_MANY ); } + else + { + activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW ); + } } else { lowSystolicCount = 0; } - if ( bpModuleResults.systolic >= BP_SYSTOLIC_HIGH_LIMIT ) { + bpSystolicHighDetected = TRUE; activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_HIGH ); } if ( bpModuleResults.heartRate <= BP_HEART_RATE_LOW_LIMIT ) { + bpHeartRateLowDetected = TRUE; activateAlarm( ALARM_ID_TD_BP_HEART_RATE_LOW ); } if ( bpModuleResults.heartRate >= BP_HEART_RATE_HIGH_LIMIT ) { + bpHeartRateHighDetected = TRUE; activateAlarm( ALARM_ID_TD_BP_HEART_RATE_HIGH ); } } +/*********************************************************************//** + * @brief + * The handleBPModuleIdleState function executes the BP module idle + * state handling. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + ***************************************************************************/ +static void handleBPModuleIdleState( void ) +{ + // TODO +} + +/*********************************************************************//** + * @brief + * The handleBPModuleMeasureState function executes the BP module + * measurement state handling. + * @details \b Inputs: BP driver state/results + * @details \b Outputs: bpModuleState + * @return none + ***************************************************************************/ +static void handleBPModuleMeasureState( void ) +{ + execBPDriver(); + + if ( TRUE == isBPMeasurementReady() ) + { + getBPResults( &bpModuleResults ); + bpModuleState = BP_MODULE_CHECK_STATE; + } + else if ( TRUE == hasBPDriverError() ) + { + bpModuleErrorDetected = TRUE; + bpModuleState = BP_MODULE_IDLE_STATE; + } +} + +/*********************************************************************//** + * @brief + * The handleBPModuleCheckState function executes the BP module + * validation state handling. + * @details \b Inputs: bpModuleResults + * @details \b Outputs: BP alarm detection flags + * @return none + ***************************************************************************/ +static void handleBPModuleCheckState( void ) +{ + checkBloodPressureReading(); + bpModuleState = BP_MODULE_IDLE_STATE; +} + + /**@}*/