Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r402885eda2ed755a079c854d1228ac5f76cbec7c -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 402885eda2ed755a079c854d1228ac5f76cbec7c) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -84,6 +84,8 @@ #define BLOOD_LEAK_EMB_MODE_ZERO_CMD_RQRD_Q 5 ///< Blood leak embedded mode zero command required queue count. #define BLOOD_LEAK_EMB_MODE_NUM_OF_RETRIES 3 ///< Blood leak embedded mode number of retries to enqueue. +#define BLOOD_LEAK_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Blood leak embedded mode FPGA error timeout in milliseconds. + /// Defined states for the blood leak detector state machine. typedef enum BloodLeakStates { @@ -329,7 +331,7 @@ * The zeroBloodLeak function requests that the Blood Leak Detector be * zeroed. * @details Inputs: bloodLeakEmbModeCmdEnqueueCount - * @details Outputs: bloodLeakCmd.cmdZeroRequested, bloodLeakUARTCmdIndex, + * @details Outputs: bloodLeakEmbModeHasZeroBeenRqustd, * bloodLeakEmbModeCmdEnqueueCount * @return TRUE if the zero commands were successfully queued otherwise, FALSE *************************************************************************/ Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -r402885eda2ed755a079c854d1228ac5f76cbec7c -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision 402885eda2ed755a079c854d1228ac5f76cbec7c) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -506,7 +506,7 @@ * The setDGOpMode function sets the latest DG operating mode reported by * the DG. * @details Inputs: none - * @details Outputs: dgCurrentOpMode, dgSubMode + * @details Outputs: dgCurrentOpMode, dgSubMode, dgOpModeDataFreshFlag * @param opMode operating mode reported by DG * @param subMode sub-mode (current state) of operating mode reported by DG * @return none @@ -531,7 +531,8 @@ * The setDialysateTemperatureReadings function sets the latest dialysate * temperatures reported by the DG. * @details Inputs: none - * @details Outputs: dgDialysateTemp, dgRedundantDialysateTemp + * @details Outputs: dgDialysateTemp, dgRedundantDialysateTemp, + * dgDialysateTemperatureDataFreshFlag * @param temp1 dialysate temperature reported by DG * @param temp2 redundant dialysate temperature reported by DG * @return none @@ -549,7 +550,8 @@ * The setDGReservoirsData function sets the latest reservoir data * reported by the DG. * @details Inputs: none - * @details Outputs: dgActiveReservoir, dgReservoirFillVolumeTarget, dgReservoirDrainVolumeTarget + * @details Outputs: dgActiveReservoir, dgReservoirFillVolumeTarget, + * dgReservoirDrainVolumeTarget, dgReservoirsDataFreshFlag * @param resID ID of active reservoir * @param fillVol Reservoir fill to volume reported by DG * @param drainVol Reservoir drain to volume reported by DG @@ -576,7 +578,7 @@ * The setDialysateFlowData function sets the latest dialysate flow rate * and its freshness status. The dialysate flow data is reported by the DG. * @details Inputs: none - * @details Outputs: dgDialysateFlowRateMlMin + * @details Outputs: dgDialysateFlowRateMlMin, dgDialysateFlowDataFreshFlag * @param flowRate latest dialysate flow rate (mL/min) reported by DG * @return none *************************************************************************/ @@ -599,7 +601,8 @@ * every 100 ms. * @details Inputs: none * @details Outputs: loadCellWeightInGrams[], smFilteredReservoirWeightInGrams[], - * lgFilteredReservoirWeightInGrams[] + * lgFilteredReservoirWeightInGrams[], lgLoadCellReadingsTotal[], + * lgLoadCellBackupReadingsTotal[], lgLoadCellReadingsIdx, dgLoadCellDataFreshFlag * @param res1Primary New weight from primary load cell of reservoir 1 * @param res1Backup New weight from backup load cell of reservoir 1 * @param res2Primary New weight from primary load cell of reservoir 2 @@ -1153,7 +1156,7 @@ * @brief * The checkDGTrimmerHeaterStatus function checks to see the status of the * trimmer heater and set them according to the status of the trimmer heater flag. - * @details Inputs: dgTrimmerHeaterOn + * @details Inputs: dgTrimmerHeaterOn, dgHeatersData * @details Outputs: none * @return none *************************************************************************/ Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -59,7 +59,7 @@ /// Fans exec states typedef enum fans_Exec_States { - FANS_EXEC_STATE_WAIT_FOR_POST_STATE = 0, ///< Fans exec state start state. + FANS_EXEC_STATE_START = 0, ///< Fans exec state start state. FANS_EXEC_STATE_RUN_STATE, ///< Fans exec state run state. NUM_OF_FANS_EXEC_STATES, ///< Number of fans exec states. } FANS_EXEC_STATES_T; @@ -76,7 +76,6 @@ static FANS_EXEC_STATES_T fansExecState; ///< Fans exec state. static U32 fansControlCounter; ///< Fans control interval counter. static U32 fansPublishCounter; ///< Fans data publish interval counter. -static BOOL isPOSTComplete; ///< Flag that indicates whether POST is complete or not. static BOOL hasAlarmBeenRaised; ///< Flag that indicates whether RPM out of range alarm has been raised once. static U32 rpmAlarmStartTimeOffset; ///< RPM out of range alarm start time offset. static S32 rpmAlarmStartTime; ///< RPM alarm start time. @@ -90,7 +89,7 @@ static OVERRIDE_U32_T fansPublishInterval = { FANS_DATA_PUBLISH_INTERVAL, FANS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Fans publish time interval override -static FANS_EXEC_STATES_T handleExecStateWaitForPOST( void ); +static FANS_EXEC_STATES_T handleExecStateStart( void ); static FANS_EXEC_STATES_T handleExecStateRun( void ); static void setInletFansDutyCycle( F32 pwm ); @@ -105,7 +104,7 @@ * The initFans function initializes the fans module. * @details Inputs: none * @details Outputs: fansExecState, fansControlCounter, - * fansPublishCounter, isPOSTComplete, hasAlarmBeenRaised, fansStatus, + * fansPublishCounter, hasAlarmBeenRaised, fansStatus, * rpmAlarmStartTime, rpmAlarmStartTimeOffset * @return none *************************************************************************/ @@ -114,10 +113,9 @@ FAN_NAMES_T fan; // Initialize the variables - fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; + fansExecState = FANS_EXEC_STATE_START; fansControlCounter = 0; fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - isPOSTComplete = FALSE; hasAlarmBeenRaised = FALSE; rpmAlarmStartTime = 0; rpmAlarmStartTimeOffset = 0; @@ -153,8 +151,6 @@ // TODO implement the calibration processing function. // It returns a pass for now - - isPOSTComplete = TRUE; status = SELF_TEST_STATUS_PASSED; return status; @@ -171,8 +167,8 @@ { switch ( fansExecState ) { - case FANS_EXEC_STATE_WAIT_FOR_POST_STATE: - fansExecState = handleExecStateWaitForPOST(); + case FANS_EXEC_STATE_START: + fansExecState = handleExecStateStart(); break; case FANS_EXEC_STATE_RUN_STATE: @@ -234,17 +230,12 @@ * @details Outputs: none * @return the next state of the exec state machine *************************************************************************/ -static FANS_EXEC_STATES_T handleExecStateWaitForPOST( void ) +static FANS_EXEC_STATES_T handleExecStateStart( void ) { - FANS_EXEC_STATES_T state = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; + FANS_EXEC_STATES_T state = FANS_EXEC_STATE_RUN_STATE; - // Wait for the self test to finish before starting the fans - if ( TRUE == isPOSTComplete ) - { - // Start the fans with minimum PWM. The control will decide the next PWM automatically. - setInletFansDutyCycle( FANS_MIN_DUTY_CYCLE ); - state = FANS_EXEC_STATE_RUN_STATE; - } + // Start the fans with minimum PWM. The control will decide the next PWM automatically. + setInletFansDutyCycle( FANS_MIN_DUTY_CYCLE ); return state; } @@ -428,10 +419,8 @@ isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ) ? TRUE : FALSE ); } - // Check if the alarm has not been raise yet, raise it then - // Before checking for the alarm, the POST must be completed. The fans POST is after the temperatures POST that should get their - // calibration to be able to apply them and calculate the temperatures that are used to alarm the fans. - if ( ( FALSE == hasAlarmBeenRaised ) && ( TRUE == isPOSTComplete ) ) + // If the fans alarm has been raised already, do not raise again + if ( FALSE == hasAlarmBeenRaised ) { isAlarmTriggered = isPersistentAlarmTriggered( ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE, isFanRPMOutOfRange ); Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -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 ); 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(); Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -68,7 +68,6 @@ #define SYRINGE_PUMP_RATE_ALARM_PERSISTENCE 3000 ///< Alarm persistence period (in ms) for syringe pump speed check alarms. #define SYRINGE_PUMP_DIR_ALARM_PERSISTENCE 3000 ///< Alarm persistence period (in ms) for syringe pump direction check alarms. #define SYRINGE_PUMP_OFF_ALARM_PERSISTENCE 1000 ///< Alarm persistence period (in ms) for syringe pump off check alarms. -#define SYRINGE_PUMP_ADC_READ_PERSISTENCE 100 ///< Syringe pump ADC stale read alarm persistence time (in ms). #define STEPS_TO_MICROSTEPS( s ) ( (s) * 32.0F ) ///< Macro conversion from steps to microsteps. #define MICROSTEPS_TO_STEPS( m ) ( (m) / 32.0F ) ///< Macro conversion from microsteps to steps. @@ -154,6 +153,8 @@ #define SYRINGE_PUMP_RAMP_STALL_RETRIES 3 ///< Syringe pump ramp stall retries allowed. #define SYRINGE_PUMP_STALL_SPEED_THRESHOLD 0.05F ///< Minimum syringe pump speed to be considered not stalled. +#define SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Syringe pump ADC FPGA error timeout in milliseconds. + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { @@ -222,8 +223,6 @@ static BOOL syringePumpDACVrefWriteInProgress; ///< Flag indicates DAC Vref write is in progress. static F32 syringePumpDACVref; ///< DAC Vref setting for force sensor. -static U08 lastSyringePumpADCReadCtr; ///< Remember last ADC read counter to check new reads are fresh. - static U32 syringePumpStallCtr; ///< Counts time when position is not changing during ramp. static U32 syringePumpStallRetryCount; ///< Counts pump ramp up stall retries. static HD_HEPARIN_FORCE_SENSOR_CAL_RECORD_T forceSensorCalRecord; ///< HD heparin force sensor calibration record. @@ -305,8 +304,6 @@ syringePumpPrimeCompleted = FALSE; syringePumpRampUpPct = 0.0; - lastSyringePumpADCReadCtr = 0; - // Zero pump position counts buffer syringePumpMotorSpeedCalcIdx = 0; for ( i = 0; i < SYRINGE_PUMP_SPEED_CALC_BUFFER_LEN; i++ ) @@ -318,13 +315,15 @@ syringePumpStallRetryCount = 0; // Initialize persistent alarms - initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, 0, SYRINGE_PUMP_ADC_READ_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR, 0, SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, 0, SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, 0, SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ); + initFPGAPersistentAlarm( FPGA_PERS_ERROR_SYRINGE_PUMP_ADC, ALARM_ID_HD_SYRINGE_PUMP_FPGA_ADC_FAULT, + SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS, SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS ); + // Reset request flags resetSyringePumpRequestFlags(); } @@ -1069,22 +1068,15 @@ } } - if ( syringePumpDACVrefWriteInProgress != TRUE ) + if ( ( FALSE == syringePumpDACVrefWriteInProgress ) && ( getCurrentOperationMode() > MODE_INIT ) ) { - // Check ADC read is fresh (takes FPGA a while to configure ADC so don't check until after init/POST mode - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, - ( ( getCurrentOperationMode() > MODE_INIT ) && ( lastSyringePumpADCReadCtr == getSyringePumpADCReadCounter() ) ) ) ) - { #ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SYRINGE_PUMP_ALARMS ) != SW_CONFIG_ENABLE_VALUE ) + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SYRINGE_PUMP_ALARMS ) != SW_CONFIG_ENABLE_VALUE ) #endif - { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); - } + { + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_SYRINGE_PUMP_ADC, getSyringePumpADCandDACStatus(), getSyringePumpADCReadCounter() ); } - lastSyringePumpADCReadCtr = getSyringePumpADCReadCounter(); - // Check pump status if ( getSyringePumpStatus() != 0 ) { Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r402885eda2ed755a079c854d1228ac5f76cbec7c -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 402885eda2ed755a079c854d1228ac5f76cbec7c) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -138,18 +138,18 @@ { U08 errorCountProcessor; ///< Reg 256. TBD. U08 errorCountPC; ///< Reg 257. TBD. - U08 bloodFlowMeterDataPktCount; ///< Reg 258. Blood flow sensor data packet count. - U08 bloodFlowMeterSlowPktCounts; ///< Reg 259. Blood flow sensor slow data packet count. - F32 bloodFlowLast; ///< Reg 260. Blood flow rate data. - U08 bloodFlowMeterDeviceStatus; ///< Reg 264. Blood flow sensor status. - U08 bloodFlowMeterResponse; ///< Reg 265. TBD. - U08 dialysateFlowMeterDataPktCount; ///< Reg 266. Dialysate flow sensor data packet count. - U08 dialysateFlowMeterSlowPckCounts; ///< Reg 267. Dialysate flow sensor slow data packet count. - F32 dialysateFlowLast; ///< Reg 268. Dialysate flow rate data. - U08 dialysateFlowMeterDeviceStatus; ///< Reg 272. Dialysate flow sensor status. - U08 dialysateFlowMeterResponse; ///< Reg 273. TBD. - U08 bloodFlowMeterErrorCount; ///< Reg 274. Blood flow sensor error count. - U08 dialysateFlowMeterErrorCount; ///< Reg 275. Dialysate flow sensor error count. + U08 bloodFlowMeterDataPktCount; ///< Reg 258. Blood flow sensor data packet count. (OBSOLETE) + U08 bloodFlowMeterSlowPktCounts; ///< Reg 259. Blood flow sensor slow data packet count. (OBSOLETE) + F32 bloodFlowLast; ///< Reg 260. Blood flow rate data. (OBSOLETE) + U08 bloodFlowMeterDeviceStatus; ///< Reg 264. Blood flow sensor status. (OBSOLETE) + U08 bloodFlowMeterResponse; ///< Reg 265. TBD. (OBSOLETE) + U08 dialysateFlowMeterDataPktCount; ///< Reg 266. Dialysate flow sensor data packet count. (OBSOLETE) + U08 dialysateFlowMeterSlowPckCounts; ///< Reg 267. Dialysate flow sensor slow data packet count. (OBSOLETE) + F32 dialysateFlowLast; ///< Reg 268. Dialysate flow rate data. (OBSOLETE) + U08 dialysateFlowMeterDeviceStatus; ///< Reg 272. Dialysate flow sensor status. (OBSOLETE) + U08 dialysateFlowMeterResponse; ///< Reg 273. TBD. (OBSOLETE) + U08 bloodFlowMeterErrorCount; ///< Reg 274. Blood flow sensor error count. (OBSOLETE) + U08 dialysateFlowMeterErrorCount; ///< Reg 275. Dialysate flow sensor error count. (OBSOLETE) U16 bloodOcclusionData; ///< Reg 276. Blood pump occlusion sensor data. U08 bloodOcclusionReadCount; ///< Reg 278. Blood pump occlusion sensor read count. U08 bloodOcclusionErrorCount; ///< Reg 279. Blood pump occlusion sensor error count. @@ -164,9 +164,9 @@ U08 dialInPumpHallSensorStatus; ///< Reg 291. Dialysate inlet pump hall sensor status. U32 adc1Channel0; ///< Reg 292. ADC1 channel 0 data. U32 adc1Channel1; ///< Reg 296. ADC1 channel 1 data. - U32 bloodFlowSoundSpeedData; ///< Reg 300. Blood flow sensor - sound speed data. - U32 bloodFlowAccFlowData; ///< Reg 304. Blood flow sensor - accumulated flow data. - F32 bloodFlowSignalStrength; ///< Reg 308. Blood flow sensor - signal strength. + U32 bloodFlowSoundSpeedData; ///< Reg 300. Blood flow sensor - sound speed data. (OBSOLETE) + U32 bloodFlowAccFlowData; ///< Reg 304. Blood flow sensor - accumulated flow data. (OBSOLETE) + F32 bloodFlowSignalStrength; ///< Reg 308. Blood flow sensor - signal strength. (OBSOLETE) U08 adc1SequenceCount; ///< Reg 312. ADC1 round robin channel sequence count. U08 adc1ErrorCount; ///< Reg 313. ADC1 error count. U16 accelX; ///< Reg 314. Accelerometer X axis data. @@ -183,9 +183,9 @@ U08 dialOutPumpSensorStatus; ///< Reg 335. Dialysate outlet pump hall sensor status. U16 dialInPumpHallSensorCount; ///< Reg 336. Dialysate inlet pump hall sensor count. U16 dialOutPumpHallSensorCount; ///< Reg 338. Dialysate outlet pump hall sensor count. - U32 dialysateFlowSoundSpeedData; ///< Reg 340. Dialysate flow sensor - sound speed data. - U32 dialysateFlowAccFlowData; ///< Reg 344. Dialysate flow sensor - accumulated flow data. - F32 dialysateFlowSignalStrength; ///< Reg 348. Dialysate flow sensor - signal strength. + U32 dialysateFlowSoundSpeedData; ///< Reg 340. Dialysate flow sensor - sound speed data. (OBSOLETE) + U32 dialysateFlowAccFlowData; ///< Reg 344. Dialysate flow sensor - accumulated flow data. (OBSOLETE) + F32 dialysateFlowSignalStrength; ///< Reg 348. Dialysate flow sensor - signal strength. (OBSOLETE) U16 fan1PulseTime; ///< Reg 352. Fan 1 pulse time in 2.5 uSec resolution. 0xFFFF if fan RPM < 500 RPM. U16 fan2PUlseTime; ///< Reg 354. Fan 2 pulse time in 2.5 uSec resolution. 0xFFFF if fan RPM < 500 RPM. U16 fpgaGPIO; ///< Reg 356. FPGA GPIO register. @@ -227,15 +227,15 @@ U08 V4EncError; ///< Reg 423. Pinch valve V4 encoder error counter. U08 ADACounter; ///< Reg 424. ADA bubble counter. U08 ADVCounter; ///< Reg 425. ADV bubble counter. - U08 ZLeakCounter; ///< Reg 426. Blood leak zero status counter. - U08 BLeakCounter; ///< Reg 427. Blood leak counter. - U08 PBoErrorCount; ///< Reg 428. PBo error count. - U08 bloodLeakZeroedStatus; ///< Reg 429. Blood leak and sensor zeored status. - U16 bloodLeakDetectSetPoint; ///< Reg 430. Blood leak stored set point value. - U16 bloodLeakDetectLevel; ///< Reg 432. Blood leak detection stored level value. - U16 bloodLeakStCount; ///< Reg 434. Blood leak St Count. - U16 bloodLeakLEDIntensity; ///< Reg 436. Blood leak LED intensity. - U16 bloodLeakRdCounter; ///< Reg 438. Blood leak register counter. + U08 ZLeakCounter; ///< Reg 426. Blood leak zero status counter. (OBSOLETE) + U08 BLeakCounter; ///< Reg 427. Blood leak counter. (OBSOLETE) + U08 VenousErrorCounter; ///< Reg 428. Venous error counter. + U08 bloodLeakZeroedStatus; ///< Reg 429. Blood leak and sensor zeored status. (OBSOLETE) + U16 bloodLeakDetectSetPoint; ///< Reg 430. Blood leak stored set point value. (OBSOLETE) + U16 bloodLeakDetectLevel; ///< Reg 432. Blood leak detection stored level value. (OBSOLETE) + U16 bloodLeakStCount; ///< Reg 434. Blood leak St Count. (OBSOLETE) + U16 bloodLeakLEDIntensity; ///< Reg 436. Blood leak LED intensity. (OBSOLETE) + U16 bloodLeakRdCounter; ///< Reg 438. Blood leak register counter. (OBSOLETE) U16 arterialPressure; ///< Reg 440. Arterial pressure sensor. U16 arterialPressureTemperature; ///< Reg 442. Arterial pressure sensor temperature. U08 arterialPressureReadCount; ///< Reg 444. Arterial pressure sensor read count. @@ -246,9 +246,6 @@ U08 bloodLeakRxFIFODataOut; ///< Reg 450. Blood leak receive FIFO data out. U08 dummyByte; ///< Reg 451. Dummy byte to meet the even of the data. U16 fpgaCompatibilityRev; ///< Reg 452. Compatibility revisions - U08 bloodLeakSelfTestErrorCounter; ///< Reg 452. Blood leak self test error counter. - U08 bloodLeakZeroErrorCounter; ///< Reg 453. Blood leak zero error counter. - } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -1655,6 +1652,19 @@ /*********************************************************************//** * @brief + * The getFPGAVenousPressureErrorCounter function gets the latest venous pressure + * sensor error counter. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return last venous pressure sensor error counter + *************************************************************************/ +U08 getFPGAVenousPressureErrorCounter( void ) +{ + return fpgaSensorReadings.VenousErrorCounter; +} + +/*********************************************************************//** + * @brief * The setFPGASyringePumpControlFlags function sets the syringe pump control * register per given bit flags. * @details Inputs: none @@ -2163,32 +2173,6 @@ /*********************************************************************//** * @brief - * The getFPGABloodLeakSelfTestErrorCounter function returns the blood leak - * self test error counter. - * @details Inputs: none - * @details Outputs: none - * @return fpgaSensorReadings.bloodLeakSelfTestErrorCounter - *************************************************************************/ -U08 getFPGABloodLeakSelfTestErrorCounter( void ) -{ - return fpgaSensorReadings.bloodLeakSelfTestErrorCounter; -} - -/*********************************************************************//** - * @brief - * The getFPGABloodLeakZeroErrorCounter function returns the blood leak - * zero error counter. - * @details Inputs: none - * @details Outputs: none - * @return fpgaSensorReadings.bloodLeakZeroErrorCounter - *************************************************************************/ -U08 getFPGABloodLeakZeroErrorCounter( void ) -{ - return fpgaSensorReadings.bloodLeakZeroErrorCounter; -} - -/*********************************************************************//** - * @brief * The noFPGABubbleDetected function returns TRUE if no air bubble has been * detected and FALSE if an air bubble has been detected. * @details Inputs: fpgaSensorReadings Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r242ad36c7a1ec4ee5012c9f009899f9e0bd87628 -rc4597167d133bcafd1a0576d0f7c53f430d98d4b --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 242ad36c7a1ec4ee5012c9f009899f9e0bd87628) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision c4597167d133bcafd1a0576d0f7c53f430d98d4b) @@ -88,6 +88,7 @@ U16 getFPGAVenousPressure( void ); U16 getFPGAVenousPressureTemperature( void ); U08 getFPGAVenousPressureReadCounter( void ); +U08 getFPGAVenousPressureErrorCounter( void ); U16 getFPGABloodPumpOcclusion( void ); U08 getFPGABloodPumpOcclusionReadCounter( void ); U08 getFPGABloodPumpOcclusionErrorCounter( void ); @@ -139,8 +140,6 @@ U16 getFPGABloodLeakRxFIFOCount( void ); U08 getFPGABloodLeakRxErrorCount( void ); U08 getFPGABloodLeakRxFIFODataOut( void ); -U08 getFPGABloodLeakSelfTestErrorCounter( void ); -U08 getFPGABloodLeakZeroErrorCounter( void ); BOOL noFPGABubbleDetected( U32 bubble ); void setFPGABubbleSelfTest( U32 bubble );