Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r2ed9aeffa168aa0c9310a4f6308725b177577d80 -reea25dc85d5dc793ad24a72481b00f5493c4c26a --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 2ed9aeffa168aa0c9310a4f6308725b177577d80) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision eea25dc85d5dc793ad24a72481b00f5493c4c26a) @@ -8,7 +8,7 @@ * @file PresOccl.c * * @author (last) Dara Navaei -* @date (last) 01-Sep-2022 +* @date (last) 12-Oct-2022 * * @author (original) Sean * @date (original) 15-Jan-2020 @@ -105,6 +105,8 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 5 ///< Data publish counter start count. #define SHIFT_14_BITS 14 ///< Shift 14 bits. + +#define PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Occlusion sensor FPGA error timeout in milliseconds. /// Defined states for the pressure and occlusion monitor state machine. typedef enum PresOccl_States @@ -141,8 +143,6 @@ static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. -static U08 lastArterialPressureReadCtr; ///< Previous arterial pressure sensor read count. -static U08 lastVenousPressureReadCtr; ///< Previous venous pressure sensor read count. static U08 lastBPOcclReadCtr; ///< Previous BP occlusion sensor read count. static U08 lastBPErrorCtr; ///< Previous BP error count. @@ -186,35 +186,34 @@ void initPresOccl( void ) { // Initialize persistent pressure alarms - initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_ARTERIAL_PRESSURE_LOW, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_ARTERIAL_PRESSURE_HIGH, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_VENOUS_PRESSURE_LOW, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_VENOUS_PRESSURE_HIGH, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_READ_TIMEOUT_ERROR, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_VENOUS_LINE_OCCLUSION, 0, VEN_OCCL_ALARM_PERSISTENCE ); - lastArterialPressureReadCtr = 0; - lastVenousPressureReadCtr = 0; + // Initialize the FPGA persistent alarms + initFPGAPersistentAlarm( FPGA_PERS_ERROR_OCCLUSION_PRESSURE_SENSOR, ALARM_ID_HD_OCCLUSION_SENSOR_FPGA_FAULT, + PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS, PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ); + initFPGAPersistentAlarm( FPGA_PERS_ERROR_ARTERIAL_PRESSURE_SENSOR, ALARM_ID_HD_ARTERIAL_SENSOR_FPGA_FAULT, + PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS, PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ); + initFPGAPersistentAlarm( FPGA_PERS_ERROR_VENOUS_PRESSURE_SESNOR, ALARM_ID_HD_VENOUS_SENSOR_FPGA_FAULT, + PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS, PRES_SENSORS_FPGA_ERROR_TIMEOUT_MS ); #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) #endif { lastBPOcclReadCtr = 0; - lastBPErrorCtr = 0; + lastBPErrorCtr = 0; } - longFilteredArterialPressure = 0.0; - shortFilteredArterialPressure = 0.0; - shortFilteredVenousPressure = 0.0; + longFilteredArterialPressure = 0.0F; + shortFilteredArterialPressure = 0.0F; + shortFilteredVenousPressure = 0.0F; presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; @@ -392,82 +391,43 @@ * @brief * The convertInlinePressures function reads inline pressure sensor readings * and converts to mmHg. Sensor status/alarm is checked. - * @details Inputs: FPGA + * @details Inputs: none * @details Outputs: arterialPressure, venousPressure * @return none *************************************************************************/ static void convertInlinePressures( void ) { - F32 rawArterialPres = 0.0; - U08 artPresStatus = 0; - F32 venPresPSI = 0.0; - U16 fpgaVenPres = getFPGAVenousPressure(); - U16 venPres = fpgaVenPres & 0x3FFF; // 14-bit data - U08 venPresStatus = (U08)( fpgaVenPres >> SHIFT_14_BITS ); // High 2 bits is status code for venous pressure - U08 venReadCtr = getFPGAVenousPressureReadCounter(); - U16 fpgaArtPres = getFPGADVTArterialPressure(); - U16 artPres = fpgaArtPres & 0x3FFF; - rawArterialPres = (F32)artPres; - artPresStatus = (U08)( fpgaArtPres >> SHIFT_14_BITS ); + // Venous pressure sensor data + U16 fpgaVenPres = getFPGAVenousPressure(); + U08 venReadCtr = getFPGAVenousPressureReadCounter(); + U08 venErrorCtr = getFPGAVenousPressureErrorCounter(); + U16 venPres = fpgaVenPres & 0x3FFF; // 14-bit data + U08 venPresStatus = (U08)( fpgaVenPres >> SHIFT_14_BITS ); // High 2 bits is status code for venous pressure + // Arterial pressure sensor data + U16 fpgaArtPres = getFPGADVTArterialPressure(); + U08 artReadCtr = getFPGADVTArterialPressureReadCounter(); + U08 artErrorCtr = getFPGATDVTArterialPressureErrorCounter(); + U16 artPres = fpgaArtPres & 0x3FFF; + U08 artPresStatus = (U08)( fpgaArtPres >> SHIFT_14_BITS ); + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_ARTERIAL_PRESSURE_SENSOR, artErrorCtr, artReadCtr ); + //checkFPGAPersistentAlarms( FPGA_PERS_ERROR_VENOUS_PRESSURE_SESNOR, venReadCtr, venReadCtr ); // TODO investigate this with Noe if ( ARTERIAL_PRESSURE_NORMAL_OP == artPresStatus ) { - U08 artReadCtr = getFPGADVTArterialPressureReadCounter(); - - // Check for stale venous pressure reading - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR, ( lastArterialPressureReadCtr == artReadCtr ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_ARTERIAL_PRESSURE_READ_TIMEOUT_ERROR ); - } - // Record arterial pressure sensor read counter for next time around - lastArterialPressureReadCtr = artReadCtr; - - arterialPressure.data = ( (F32)(rawArterialPres - ARTERIAL_PRESSURE_OFFSET) * - (ARTERIAL_PRESSURE_MAX_PSI - ARTERIAL_PRESSURE_MIN_PSI) / (F32)ARTERIAL_PRESSURE_SCALE ) + ARTERIAL_PRESSURE_MIN_PSI; + // If the arterial pressure status is normal, convert the counts to pressure in mmHg + arterialPressure.data = ( (F32)( artPres - ARTERIAL_PRESSURE_OFFSET ) * + ( ARTERIAL_PRESSURE_MAX_PSI - ARTERIAL_PRESSURE_MIN_PSI ) / (F32)ARTERIAL_PRESSURE_SCALE ) + ARTERIAL_PRESSURE_MIN_PSI; arterialPressure.data = arterialPressure.data * PSI_TO_MMHG; } - else if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT, TRUE ) ) - { - activateAlarmNoData( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT ); - } - else - { - resetPersistentAlarmTimer( ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT ); - } - - // Check for stale venous pressure reading - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR, ( lastVenousPressureReadCtr == venReadCtr ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_VENOUS_PRESSURE_READ_TIMEOUT_ERROR ); - } - // Record venous pressure sensor read counter for next time around - lastVenousPressureReadCtr = venReadCtr; - - // Convert venous pressure to PSI and then mmHg - venPresPSI = ( (F32)( venPres - VENOUS_PRESSURE_OFFSET ) * ( VENOUS_PRESSURE_MAX_PSI - VENOUS_PRESSURE_MIN_PSI ) / (F32)VENOUS_PRESSURE_SCALE ) + - VENOUS_PRESSURE_MIN_PSI; - - // Convert venous pressure from PSI to mmHg if sensor status is normal if ( VENOUS_PRESSURE_NORMAL_OP == venPresStatus ) { + // Convert venous pressure to PSI and then mmHg + F32 venPresPSI = ( (F32)( venPres - VENOUS_PRESSURE_OFFSET ) * ( VENOUS_PRESSURE_MAX_PSI - VENOUS_PRESSURE_MIN_PSI ) / (F32)VENOUS_PRESSURE_SCALE ) + + VENOUS_PRESSURE_MIN_PSI; venousPressure.data = venPresPSI * PSI_TO_MMHG; } - // If venous pressure sensor status is not normal, fault -#ifndef _RELEASE_ - else if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) - { - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT, TRUE ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT, (U32)venPresStatus ) - } - } -#endif - else - { - resetPersistentAlarmTimer( ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT ); - } // Filter inline pressure readings filterInlinePressureReadings( getMeasuredArterialPressure(), getMeasuredVenousPressure() ); @@ -485,23 +445,8 @@ U08 bpReadCtr = getFPGABloodPumpOcclusionReadCounter(); U08 bpErrorCtr = getFPGABloodPumpOcclusionErrorCounter(); -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRESSURE_CHECKS ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - // Check for sensor errors - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR, ( bpErrorCtr != lastBPErrorCtr ) ) ) - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BP_OCCLUSION_SENSOR_ERROR, (U32)bpErrorCtr ) - } + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_OCCLUSION_PRESSURE_SENSOR, bpErrorCtr, bpReadCtr ); - // Check for stale occlusion reads - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_BP_OCCLUSION_READ_TIMEOUT_ERROR, ( bpReadCtr == lastBPOcclReadCtr ) ) ) - { - activateAlarmNoData( ALARM_ID_HD_BP_OCCLUSION_READ_TIMEOUT_ERROR ); - } - } - // Record occlusion sensor readings bloodPumpOcclusion.data = (U32)getFPGABloodPumpOcclusion(); @@ -1002,6 +947,7 @@ return result; } + /************************************************************************* * TEST SUPPORT FUNCTIONS Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r2a3b3e3864c423cc538aff9760989e419c1ab503 -reea25dc85d5dc793ad24a72481b00f5493c4c26a --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 2a3b3e3864c423cc538aff9760989e419c1ab503) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision eea25dc85d5dc793ad24a72481b00f5493c4c26a) @@ -8,7 +8,7 @@ * @file SelfTests.c * * @author (last) Dara Navaei -* @date (last) 22-Sep-2022 +* @date (last) 28-Sep-2022 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -1505,22 +1505,21 @@ *************************************************************************/ static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( void ) { - WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; + WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; + BUBBLE_STATUS_T ADVBubbleStatus = getBubbleStatus( ADV ); - BUBBLE_STATUS_T const ADVBubbleStatus = getBubbleStatus( ADV ); - if ( BUBBLE_NOT_DETECTED == ADVBubbleStatus ) { #ifndef _RELEASE_ - // TODO do we need both of these? if ( ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_BLOOD_LEAK_SELF_TEST ) != SW_CONFIG_ENABLE_VALUE ) && ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SELF_TESTS_AIR_BUBBLE_CHECK ) != SW_CONFIG_ENABLE_VALUE ) ) #endif { - zeroBloodLeak(); + if ( TRUE == zeroBloodLeak() ) + { + state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; + } } - - state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; } else {