Index: firmware/App/Controllers/BPModule.c =================================================================== diff -u -r3e6b89e98c3725c7afd94a3c37fe3efce3fde65f -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Controllers/BPModule.c (.../BPModule.c) (revision 3e6b89e98c3725c7afd94a3c37fe3efce3fde65f) +++ firmware/App/Controllers/BPModule.c (.../BPModule.c) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -54,7 +54,7 @@ // ********** private function prototypes ********** -static void checkBloodPressureReading( void ); +static void checkBloodPressureReading( BP_RESULTS_T *bpResults ); static BP_MODULE_STATE_T handleBPModuleIdleState( void ); static BP_MODULE_STATE_T handleBPModuleMeasureState( void ); static BP_MODULE_STATE_T handleBPModuleCheckState( void ); @@ -160,39 +160,39 @@ * The checkBloodPressureReading function validates blood pressure * measurement results against configured thresholds and activates * corresponding blood pressure alarms. - * @details \b Inputs: systolicPressure, heartRate + * @details \b Inputs: bpResults * @details \b Outputs: activate BP alarms * @return none ***************************************************************************/ -static void checkBloodPressureReading( void ) +static void checkBloodPressureReading( BP_RESULTS_T *bpResults ) { - U16 systolicPressure = getBPSystolicPressure(); - U16 heartRate = getBPHeartRate(); - - if ( systolicPressure <= BP_SYSTOLIC_LOW_LIMIT ) + if ( NULL != bpResults ) { - lowSystolicCount++; - if ( lowSystolicCount >= BP_LOW_SYSTOLIC_MAX_COUNT ) + if ( bpResults->systolic <= BP_SYSTOLIC_LOW_LIMIT ) { - activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW_TOO_MANY ); + lowSystolicCount++; + if ( lowSystolicCount >= BP_LOW_SYSTOLIC_MAX_COUNT ) + { + activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW_TOO_MANY ); + } + else + { + activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW ); + } } - else + if ( bpResults->systolic >= BP_SYSTOLIC_HIGH_LIMIT ) { - activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_LOW ); + activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_HIGH ); } + if ( bpResults->heartRate <= BP_HEART_RATE_LOW_LIMIT ) + { + activateAlarm( ALARM_ID_TD_BP_HEART_RATE_LOW ); + } + if ( bpResults->heartRate >= BP_HEART_RATE_HIGH_LIMIT ) + { + activateAlarm( ALARM_ID_TD_BP_HEART_RATE_HIGH ); + } } - if ( systolicPressure >= BP_SYSTOLIC_HIGH_LIMIT ) - { - activateAlarm( ALARM_ID_TD_BP_SYSTOLIC_HIGH ); - } - if ( heartRate <= BP_HEART_RATE_LOW_LIMIT ) - { - activateAlarm( ALARM_ID_TD_BP_HEART_RATE_LOW ); - } - if ( heartRate >= BP_HEART_RATE_HIGH_LIMIT ) - { - activateAlarm( ALARM_ID_TD_BP_HEART_RATE_HIGH ); - } } /*********************************************************************//** @@ -268,7 +268,7 @@ if( TRUE == getBPResults( &bpResults ) ) { - checkBloodPressureReading(); + checkBloodPressureReading( &bpResults ); } return nextState; Index: firmware/App/Drivers/BPDriver.c =================================================================== diff -u -r3e6b89e98c3725c7afd94a3c37fe3efce3fde65f -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision 3e6b89e98c3725c7afd94a3c37fe3efce3fde65f) +++ firmware/App/Drivers/BPDriver.c (.../BPDriver.c) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -31,7 +31,9 @@ #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. +#define BP_MODULE_BUSY_CLEAR 0 + /// Blood pressure driver states. typedef enum { @@ -104,29 +106,21 @@ switch ( bpDriverState ) { case BP_DRIVER_IDLE_STATE: - { bpDriverState = handleBPDriverIdleState(); break; - } case BP_DRIVER_MEASURE_STATE: - { bpDriverState = handleBPDriverMeasureState(); break; - } case BP_DRIVER_GET_DATA_STATE: - { bpDriverState = handleBPDriverGetDataState(); break; - } default: - { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_BP_DRIVER_STATE, bpDriverState ); bpDriverState = BP_DRIVER_IDLE_STATE; break; - } } } @@ -173,23 +167,26 @@ * The handleBPDriverMeasureState function executes the BP driver * measurement state handling. * @details \b Inputs: getNIBPStatusResponse -* @details \b Outputs: nextState +* @details \b Outputs: setNIBPCommand, bpDriverState, bpDriverError * @return next BP driver state ***************************************************************************/ static BP_DRIVER_STATE_T handleBPDriverMeasureState( void ) { BP_DRIVER_STATE_T nextState = BP_DRIVER_MEASURE_STATE; - if ( ( getNIBPStatusResponse() & BP_MODULE_BUSY_MASK ) == 0 ) + if ( BP_MODULE_BUSY_CLEAR == ( getNIBPStatusResponse() & BP_MODULE_BUSY_MASK ) ) { + // Verify BP measurement data is available if ( BP_RESP_CODE_BPDATA == getBPResponseCode() ) { setNIBPCommand( FPGA_NIBP_CMD_GET_BP_DATA ); nextState = BP_DRIVER_GET_DATA_STATE; } - else if ( ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) != 0 ) + // Check whether BP module error occurred + else if ( BP_MODULE_BUSY_CLEAR != ( getNIBPStatusResponse() & BP_MODULE_ERROR_MASK ) ) { bpDriverError = TRUE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, getNIBPStatusResponse(), bpDriverState ); nextState = BP_DRIVER_IDLE_STATE; } } @@ -289,8 +286,11 @@ /*********************************************************************//** * @brief * The getBPResults function returns the latest BP measurement results. + * @note + * This function shall only be called from the GeneralTask context to + * avoid concurrent access while bpResults is being updated. * @details \b Inputs: bpResults - * @details\b Outputs: results + * @details \b Outputs: results * @return TRUE if results copied, FALSE otherwise. ***************************************************************************/ BOOL getBPResults( BP_RESULTS_T *results ) Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r120487ddf3e3d69d1de5094d5252c037588e2ed8 -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 120487ddf3e3d69d1de5094d5252c037588e2ed8) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -17,6 +17,7 @@ #include "AirTrap.h" //#include "BloodFlow.h" +#include "BPModule.h" #include "Bubbles.h" #include "Buttons.h" #include "DDInterface.h" @@ -186,6 +187,7 @@ { // Initialize treatment mode each time we transition to it initTreatmentMode(); + initBPModule(); // Initialize treatment sub-modes each time we transition to treatment mode initBloodPrime(); initDialysis(); @@ -512,6 +514,8 @@ // Manage air trap control execAirTrapMonitorTreatment(); + // Execute Blood pressure module + execBPModule(); return currentTreatmentState; } Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r120487ddf3e3d69d1de5094d5252c037588e2ed8 -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 120487ddf3e3d69d1de5094d5252c037588e2ed8) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -191,6 +191,8 @@ SW_FAULT_ID_TD_SYRINGE_INVALID_CONT_CMD = 160, SW_FAULT_ID_TD_SYRINGE_INVALID_STATE = 161, SW_FAULT_ID_TD_SYRINGE_INVALID_VREF = 162, + SW_FAULT_ID_TD_BP_DRIVER_STATE = 163, + SW_FAULT_ID_TD_BP_MODULE_STATE = 164, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FpgaTD.c =================================================================== diff -u -r120487ddf3e3d69d1de5094d5252c037588e2ed8 -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision 120487ddf3e3d69d1de5094d5252c037588e2ed8) +++ firmware/App/Services/FpgaTD.c (.../FpgaTD.c) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -71,6 +71,9 @@ #define FPGA_H18_BUBBLE_STATUS_MASK 0x0002 ///< Bit mask for venous air bubble detector input status. #define FPGA_H18_BUBBLE_SELF_TEST_CMD 0x08 ///< Bit for venous air bubble detector self-test command. +#define FPGA_NIBP_CMD_MASK 0x0F ///< Bit mask for NIBP command bits +#define FPGA_NIBP_CMD_RDY 0x10 ///< NIBP command ready pulse bit + /// Control bits to run syringe pump in reverse direction // TODO - move to syringe pump controller unit when implemented. static const U08 SYRINGE_PUMP_CONTROL_RUN_REVERSE = SYRINGE_PUMP_CONTROL_SLEEP_OFF | SYRINGE_PUMP_CONTROL_NOT_RESET | @@ -165,6 +168,18 @@ U32 baroTemperature; ///< Reg 372. Baro temperature value in counts. U08 baroReadCount; ///< Reg 376. Baro read count. U08 baroErrorCount; ///< Reg 377. Baro error count. + U08 notUsed; ///< Reg 378. + U08 sPumpDacRdByte2; ///< Reg 379. + U08 sPumpDacRdByte3; ///< Reg 380. + U08 sPumpDacRdByte4; ///< Reg 381. + U08 sPumpDacRdByte5; ///< Reg 382. + U08 sPumpDacRdByte6; ///< Reg 383. + U08 nibpCtlStatus; ///< Reg 384. NIBP control status register. + U08 nibpStatusResp; ///< Reg 385. NIBP response status register. + S16 cuffPressure; ///< Reg 386. NIBP cuff pressure in mmHg. + U16 bpSystolic; ///< Reg 388. Systolic BP in mmHg. + U16 bpDiastolic; ///< Reg 390. Diastolic BP in mmHg. + U16 bpHr; ///< Reg 392. Heart rate in BPM. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -193,7 +208,8 @@ U32 h10Speed; ///< Reg 34. H10 Syringe pump time between step toggle (1/2 step period). U16 h10DACData; ///< Reg 38. H10 Syringe pump DAC data (12 bits). U16 h10DACControl; ///< Reg 40. H10 Syringe pump ADC and DAC control register. - U16 h12Period; ///< Reg 42. H12 Air pump time period for each count in PWM register. + U16 nibpCtl; ///< Reg 41. NIBP control register. + U16 nibpInflate; ///< Reg 42. NIBP inflate pressure register. U32 h5SetSpeed; ///< Reg 44. H5 ejector motor set speed. } FPGA_ACTUATORS_T; @@ -950,21 +966,6 @@ /*********************************************************************//** * @brief - * The setH12AirPumpMotorPWMCntTime function sets the air pump motor PWM count - * time in increments of 10 nS. The PWM period will then be 255 x given - * value x 10 nS. - * @details \b Inputs: fpgaActuatorSetPoints.h12Period - * @details \b Outputs: fpgaActuatorSetPoints.h12Period - * @param tenNS The time associated with each PWM count in power level setting. - * @return none - *************************************************************************/ -void setH12AirPumpMotorPWMCntTime( U16 tenNS ) -{ - fpgaActuatorSetPoints.h12Period = tenNS; -} - -/*********************************************************************//** - * @brief * The H18BubbleDetected function determines whether H18 bubble detector * sensor is currently detecting a bubble. * @details \b Inputs: fpgaSensorReadings @@ -1342,17 +1343,43 @@ } /*********************************************************************//** +<<<<<<< HEAD +* The setNIBPCommand function sets the FPGA NIBP command bits and pulses +* the command ready bit to notify the FPGA that a new NIBP command is +* available. +* @details \b Inputs: command +* @details \b Outputs: fpgaActuatorSetPoints.nibpCtl +* @return none +*************************************************************************/ +void setNIBPCommand( FPGA_NIBP_CMD_T command ) +{ + fpgaActuatorSetPoints.nibpCtl &= ~FPGA_NIBP_CMD_MASK; + fpgaActuatorSetPoints.nibpCtl |= ( (U16)command & FPGA_NIBP_CMD_MASK ); + fpgaActuatorSetPoints.nibpCtl |= FPGA_NIBP_CMD_RDY; +} + +/*********************************************************************//** +* The setNIBPInflatePressure function sets the initial NIBP cuff inflate +* pressure register. +* @details \b Inputs: pressure +* @details \b Outputs: fpgaActuatorSetPoints.nibpInflate +* @return none +*************************************************************************/ +void setNIBPInflatePressure( U16 pressure ) +{ + fpgaActuatorSetPoints.nibpInflate = pressure; +} + +/********************************************************************//** * @brief - * The setFPGASyringePumpControlFlags function sets the syringe pump control - * register per given bit flags. - * @details \b Inputs: none - * @details \b Outputs: fpgaActuatorSetPoints - * @param bitFlags control bit settings for syringe pump - * @return none - *************************************************************************/ -void setFPGASyringePumpControlFlags( U08 bitFlags ) + * The getNIBPControlStatus function returns the FPGA NIBP control status. + * @details \b Inputs: fpgaSensorReadings.nibpCtlStatus + * @details \b Outputs: none + * @return FPGA NIBP control status register. + ***************************************************************************/ +U08 getNIBPControlStatus( void ) { - fpgaActuatorSetPoints.h10Control = bitFlags; + return fpgaSensorReadings.nibpCtlStatus; } /*********************************************************************//** @@ -1412,6 +1439,63 @@ /*********************************************************************//** * @brief + * The getNIBPStatusResponse function returns the FPGA NIBP response status. + * @details \b Inputs: fpgaSensorReadings.nibpStatusResp + * @details \b Outputs: none + * @return FPGA NIBP response status register. + ***************************************************************************/ +U08 getNIBPStatusResponse( void ) +{ + return fpgaSensorReadings.nibpStatusResp; +} + +/*********************************************************************//** +* The getNIBPCuffPressure function returns the FPGA NIBP cuff pressure. +* @details \b Inputs: fpgaSensorReadings.cuffPressure +* @details \b Outputs: none +* @return NIBP cuff pressure in mmHg. +*************************************************************************/ +S16 getNIBPCuffPressure( void ) +{ + return fpgaSensorReadings.cuffPressure; +} + +/*********************************************************************//** +* The getNIBPSystolicPressure function returns the FPGA systolic blood +* pressure measurement. +* @details \b Inputs: fpgaSensorReadings.bpSystolic +* @details \b Outputs: none +* @return Systolic blood pressure in mmHg. +*************************************************************************/ +U16 getNIBPSystolicPressure( void ) +{ + return fpgaSensorReadings.bpSystolic; +} + +/*********************************************************************//** +* The getNIBPDiastolicPressure function returns the FPGA diastolic blood +* pressure measurement. +* @details \b Inputs: fpgaSensorReadings.bpDiastolic +* @details \b Outputs: none +* @return Diastolic blood pressure in mmHg. +*************************************************************************/ +U16 getNIBPDiastolicPressure( void ) +{ + return fpgaSensorReadings.bpDiastolic; +} + +/*********************************************************************//** +* The getNIBPHeartRate function returns the FPGA heart rate measurement. +* @details \b Inputs: fpgaSensorReadings.bpHr +* @details \b Outputs: none +* @return Heart rate in BPM. +*************************************************************************/ +U16 getNIBPHeartRate( void ) +{ + return fpgaSensorReadings.bpHr; +} + +/*********************************************************************//** * The getFPGASyringePumpADCReadCounter function gets the latest syringe pump * ADC read counter. Counter is 8-bit and rolls over when exceeding 255. * @details \b Inputs: fpgaSensorReadings Index: firmware/App/Services/FpgaTD.h =================================================================== diff -u -r120487ddf3e3d69d1de5094d5252c037588e2ed8 -ra8396c9e402372dd7c6ad9df69d5b5fb500a66bf --- firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision 120487ddf3e3d69d1de5094d5252c037588e2ed8) +++ firmware/App/Services/FpgaTD.h (.../FpgaTD.h) (revision a8396c9e402372dd7c6ad9df69d5b5fb500a66bf) @@ -65,6 +65,22 @@ U16 baroPromCRC; ///< Reg 366. Baro prom CRC. } BARO_PRES_SENSOR_MFG_T; +/// FPGA NIBP command definitions +typedef enum +{ + FPGA_NIBP_CMD_IDLE = 0x00, ///< No command. + FPGA_NIBP_CMD_GET_MODULE_DATA = 0x01, ///< Get NIBP module data. + FPGA_NIBP_CMD_SET_INITIAL_INFLATE = 0x02, ///< Set initial inflate pressure. + FPGA_NIBP_CMD_START_BP = 0x03, ///< Start adult BP measurement. + FPGA_NIBP_CMD_START_PEDS_BP = 0x04, ///< Start pediatric BP measurement. + FPGA_NIBP_CMD_ABORT_BP = 0x05, ///< Abort BP measurement. + FPGA_NIBP_CMD_GET_CUFF_PRESSURE = 0x06, ///< Get cuff pressure. + FPGA_NIBP_CMD_GET_BP_DATA = 0x07, ///< Get BP data. + FPGA_NIBP_CMD_SET_SLEEP_MODE = 0x08, ///< Set sleep mode. + FPGA_NIBP_CMD_CONTROL_PNEUMATICS = 0x09, ///< Control pneumatics. + FPGA_NIBP_CMD_RESET = 0x0A ///< Reset NIBP module. +} FPGA_NIBP_CMD_T; + // ********** public function prototypes ********** void initFpgaTD( void ); @@ -128,7 +144,6 @@ U16 getH12AirPumpMotorRPM( void ); void setH12AirPumpMotorPowerLevel( U08 power ); -void setH12AirPumpMotorPWMCntTime( U16 tenNS ); void setH19Control( U08 controlBits ); U08 getH19Control( void ); @@ -149,9 +164,18 @@ U16 getFPGAInletFan1TogglePeriod( void ); BOOL getH9FrontDoorClosedStatus( void ); -U32 getFPGAEjectorRetractOpticalSensor( void ); -U32 getFPGAEjectorEngageOpticalSensor( void ); +U32 getFPGAEjectorRetractOpticalSensor( void ); +U32 getFPGAEjectorEngageOpticalSensor( void ); +void setNIBPCommand( FPGA_NIBP_CMD_T command ); +void setNIBPInflatePressure( U16 pressure ); +U08 getNIBPControlStatus( void ); +U08 getNIBPStatusResponse( void ); +S16 getNIBPCuffPressure( void ); +U16 getNIBPSystolicPressure( void ); +U16 getNIBPDiastolicPressure( void ); +U16 getNIBPHeartRate( void ); + void setFPGASyringePumpControlFlags( U08 bitFlags ); void setFPGASyringePumpADCandDACControlFlags( U08 bitFlags ); void setFPGASyringePumpDACOutputLevel( U16 counts );