Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -ra520312a49a6d1042a63800e3edc222290318d77 -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision a520312a49a6d1042a63800e3edc222290318d77) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -37,11 +37,13 @@ /// Defined states for the blood leak detector state machine. typedef enum BloodLeakStates { - BLOOD_LEAK_INIT_STATE = 0, ///< Initial state - BLOOD_LEAK_ZERO_STATE, ///< Zero state - BLOOD_LEAK_SELF_TEST_STATE, ///< Self-test state - BLOOD_LEAK_NORMAL_STATE, ///< Normal state - NUM_OF_BLOOD_LEAK_STATES ///< Number of blood leak detector states + BLOOD_LEAK_CHECK_SET_POINT_STATE = 0, ///< Check set point state. + BLOOD_LEAK_SET_SET_POINT_STATE, ///< Set set point state. + BLOOD_LEAK_INIT_STATE, ///< Init state. + BLOOD_LEAK_ZERO_STATE, ///< Zero state. + BLOOD_LEAK_SELF_TEST_STATE, ///< Self-test state. + BLOOD_LEAK_NORMAL_STATE, ///< Normal state. + NUM_OF_BLOOD_LEAK_STATES ///< Number of blood leak detector states. } BLOOD_LEAK_STATES_T; // ********** private data ********** @@ -56,12 +58,14 @@ static U32 bloodLeakPersistenceCtr = 0; ///< Blood leak alarm persistence timer counter. -/// Interval (in ms) at which to publish blood leak data to CAN bus. -static OVERRIDE_U32_T bloodLeakDataPublishInterval = { BLOOD_LEAK_PUB_INTERVAL, BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; +static OVERRIDE_U32_T bloodLeakDataPublishInterval = { BLOOD_LEAK_PUB_INTERVAL, + BLOOD_LEAK_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish blood leak data to CAN bus. static U32 bloodLeakDataPublicationTimerCounter = 0; ///< Timer counter used to schedule blood leak data publication to CAN bus. // ********** private function prototypes ********** +static BLOOD_LEAK_STATES_T handleBloodLeakCheckSetPointState( void ); +static BLOOD_LEAK_STATES_T handleBloodLeakSetSetPointState( void ); static BLOOD_LEAK_STATES_T handleBloodLeakInitState( void ); static BLOOD_LEAK_STATES_T handleBloodLeakZeroState( void ); static BLOOD_LEAK_STATES_T handleBloodLeakSelfTestState( void ); @@ -78,14 +82,14 @@ *************************************************************************/ void initBloodLeak( void ) { - bloodLeakState = BLOOD_LEAK_INIT_STATE; - bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; + bloodLeakState = BLOOD_LEAK_CHECK_SET_POINT_STATE; + bloodLeakStatus.data = BLOOD_LEAK_NOT_DETECTED; bloodLeakStatus.ovInitData = BLOOD_LEAK_NOT_DETECTED; - bloodLeakStatus.ovData = BLOOD_LEAK_NOT_DETECTED; - bloodLeakStatus.override = OVERRIDE_RESET; - bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; - bloodLeakZeroRequested = FALSE; - bloodLeakZeroStartTime = 0; + bloodLeakStatus.ovData = BLOOD_LEAK_NOT_DETECTED; + bloodLeakStatus.override = OVERRIDE_RESET; + bloodLeakSelfTestStatus = SELF_TEST_STATUS_IN_PROGRESS; + bloodLeakZeroRequested = FALSE; + bloodLeakZeroStartTime = 0; bloodLeakSelfTestStartTime = 0; } @@ -103,6 +107,14 @@ // Execute blood leak state machine switch( bloodLeakState ) { + case BLOOD_LEAK_CHECK_SET_POINT_STATE: + bloodLeakState = handleBloodLeakCheckSetPointState(); + break; + + case BLOOD_LEAK_SET_SET_POINT_STATE: + bloodLeakState = handleBloodLeakSetSetPointState(); + break; + case BLOOD_LEAK_INIT_STATE: bloodLeakState = handleBloodLeakInitState(); break; @@ -145,6 +157,41 @@ /*********************************************************************//** * @brief + * The handleBloodLeakCheckSetPointState function handles the check set point + * state to ensure the set point is set correctly. + * @details Inputs: none + * @details Outputs: Blood Leak module init. + * @return next state + *************************************************************************/ +static BLOOD_LEAK_STATES_T handleBloodLeakCheckSetPointState( void ) +{ + BLOOD_LEAK_STATES_T state = BLOOD_LEAK_CHECK_SET_POINT_STATE; + + // TODO remove + state = BLOOD_LEAK_SET_SET_POINT_STATE; + // TODO remove for testing only + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakSetSetPointState function handles the set set point state. + * @details Inputs: none + * @details Outputs: Blood Leak module init. + * @return next state + *************************************************************************/ +static BLOOD_LEAK_STATES_T handleBloodLeakSetSetPointState( void ) +{ + BLOOD_LEAK_STATES_T state = BLOOD_LEAK_SET_SET_POINT_STATE; + + state = BLOOD_LEAK_INIT_STATE; + + return state; +} + +/*********************************************************************//** + * @brief * The handleBloodLeakInitState function handles the Blood Leak module in init * state. * @details Inputs: none @@ -334,11 +381,20 @@ // Publish blood leak data on interval if ( ++bloodLeakDataPublicationTimerCounter >= getU32OverrideValue( &bloodLeakDataPublishInterval ) ) { - BLOOD_LEAK_DATA_T bloodLeakData; + BLOOD_LEAK_DATA_T data; - bloodLeakData.bloodLeakStatus = (U32)getBloodLeakStatus(); - bloodLeakData.bloodLeakState = (U32)bloodLeakState; - broadcastData( MSG_ID_HD_BLOOD_LEAK_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&bloodLeakData, sizeof( BLOOD_LEAK_DATA_T ) ); + data.bloodLeakStatus = (U32)getBloodLeakStatus(); + data.bloodLeakState = (U32)bloodLeakState; + data.bloodLeakZeroStatusCounter = (U32)getFPGABloodLeakZeroStatusCounter(); + data.bloodLeakCounter = (U32)getFPGABloodLeakCounter(); + data.bloodLeakZeroedStatus = (U32)getFPGABloodLeakZeroedStatus(); + data.bloodLeakDetectSetPoint = (U32)getFPGABloodLeakDetectSetPoint(); + data.bloodLeakDetectLevel = (U32)getFPGABloodLeakDetectLevel(); + data.bloodLeakStCount = (U32)getFPGABloodLeakStCount(); + data.bloodLeakLEDIntesity = (U32)getFPGABloodLeakLEDIntensity(); + data.bloodLeakRegisterCounter = (U32)getFPGABloodLeakRegisterCounter(); + + broadcastData( MSG_ID_HD_BLOOD_LEAK_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( BLOOD_LEAK_DATA_T ) ); bloodLeakDataPublicationTimerCounter = 0; } } Index: firmware/App/Controllers/BloodLeak.h =================================================================== diff -u -r09e6cf9de34acf18f6e1138bf56ac0edb4821186 -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision 09e6cf9de34acf18f6e1138bf56ac0edb4821186) +++ firmware/App/Controllers/BloodLeak.h (.../BloodLeak.h) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -46,6 +46,14 @@ { U32 bloodLeakStatus; ///< Blood leak detector status U32 bloodLeakState; ///< Blood leak detector state + U32 bloodLeakZeroStatusCounter; ///< Blood leak zero status counter + U32 bloodLeakCounter; ///< Blood leak counter + U32 bloodLeakZeroedStatus; ///< Blood leak zeroed status + U32 bloodLeakDetectSetPoint; ///< Blood leak detect set point + U32 bloodLeakDetectLevel; ///< Blood leak detect level + U32 bloodLeakStCount; ///< Blood leak st count + U32 bloodLeakLEDIntesity; ///< Blood leak LED intensity + U32 bloodLeakRegisterCounter; ///< Blood leak register counter } BLOOD_LEAK_DATA_T; // ********** public function prototypes ********** Index: firmware/App/HDCommon.h =================================================================== diff -u -rfcd12c3aa538b90a2ae19b9202bc5d847859a545 -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/HDCommon.h (.../HDCommon.h) (revision fcd12c3aa538b90a2ae19b9202bc5d847859a545) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -49,7 +49,7 @@ // #define RUN_BP_OPEN_LOOP 1 // Run blood pump in open loop mode // #define RUN_DPI_OPEN_LOOP 1 // Run dialysate inlet pump in open loop mode #define WORN_OUT_CARTRIDGE 1 // Running with an old worn out cartridge (max wear) - #define PBA_ESTIMATION 1 // Estimate arterial pressure rather than look at PBA sensor +// #define PBA_ESTIMATION 1 // Estimate arterial pressure rather than look at PBA sensor #define DISABLE_MOTOR_CURRENT_CHECKS 1 // Do not error on HD pump current checks #define DISABLE_PUMP_FLOW_CHECKS 1 // Do not error on HD pump flow checks #define DISABLE_PUMP_SPEED_CHECKS 1 // Do not error on HD pump speed checks Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r186bc3aa917f8626f5eab6e5e8bf9cddae03ac2c -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 186bc3aa917f8626f5eab6e5e8bf9cddae03ac2c) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -219,6 +219,21 @@ U16 fpgaVpvn; ///< Reg 414. FPGA pvn voltage. 1V range over 12 bits (0..4095). U16 fpgaTimerCount_ms; ///< Reg 416. Free running 1ms timer counter. Rolls over at 65535.Internal FPGA timer count in ms. U16 backupAlarmAudioPeakCurrent; ///< Reg 418. Piezo alarm peak ADC current in previous 10ms. 12 bit unsigned. + U08 V1EncError; ///< Reg 420. Pinch valve V1 encoder error counter. + U08 V2EncError; ///< Reg 421. Pinch valve V2 encoder error counter. + U08 V3EncError; ///< Reg 422. Pinch valve V3 encoder error counter. + 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 bloodDetectSetPoint; ///< Reg 430. Blood leak stored set point value. + U16 bloodDetectLevel; ///< Reg 432. Blood leak detection stored level value. + U16 bloodStCount; ///< Reg 434. Blood leak St Count. + U16 bloodLEDIntensity; ///< Reg 436. Blood leak LED intensity. + U16 bloodRdCounter; ///< Reg 438. Blood leak register counter. } FPGA_SENSORS_T; /// Record structure for FPGA continuous priority writes. @@ -241,6 +256,8 @@ U32 syringePumpStepToggleTime; ///< Reg 36. Syringe pump step time toggle register. Sets time between step toggle which dictates stepper motor speed. U16 syringePumpDACOut; ///< Reg 40. Syringe pump DAC output level (12-bit). U08 syringePumpADCandDACControl; ///< Reg 42. Syringe pump ADC and DAC control register. + U08 bloodLeakUARTControl; ///< Reg 43. Blood leak UART control. + U08 bloodLeakFIFOTransmit; ///< Reg 44. Character word store in FIFO to be transmitted into blood leak UART interface. } FPGA_ACTUATORS_T; // TODO clean up the struct @@ -1988,6 +2005,39 @@ fpgaActuatorSetPoints.fpgaSensorTest &= ~FPGA_BLOOD_LEAK_SELF_TEST_CMD; } +U08 getFPGABloodLeakZeroStatusCounter( void ) +{ + return fpgaSensorReadings.ZLeakCounter; +} +U08 getFPGABloodLeakCounter( void ) +{ + return fpgaSensorReadings.BLeakCounter; +} +U08 getFPGABloodLeakZeroedStatus( void ) +{ + return fpgaSensorReadings.bloodLeakZeroedStatus; +} +U16 getFPGABloodLeakDetectSetPoint( void ) +{ + return fpgaSensorReadings.bloodDetectSetPoint; +} +U16 getFPGABloodLeakDetectLevel( void ) +{ + return fpgaSensorReadings.bloodDetectLevel; +} +U16 getFPGABloodLeakStCount( void ) +{ + return fpgaSensorReadings.bloodStCount; +} +U16 getFPGABloodLeakLEDIntensity( void ) +{ + return fpgaSensorReadings.bloodLEDIntensity; +} +U16 getFPGABloodLeakRegisterCounter( void ) +{ + return fpgaSensorReadings.bloodRdCounter; +} + /*********************************************************************//** * @brief * The noFPGABubbleDetected function returns TRUE if no air bubble has been Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r09e6cf9de34acf18f6e1138bf56ac0edb4821186 -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 09e6cf9de34acf18f6e1138bf56ac0edb4821186) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -126,13 +126,22 @@ void setFPGABloodLeakSelfTest( void ); void clearFPGABloodLeakSelfTest( void ); +U08 getFPGABloodLeakZeroStatusCounter( void ); +U08 getFPGABloodLeakCounter( void ); +U08 getFPGABloodLeakZeroedStatus( void ); +U16 getFPGABloodLeakDetectSetPoint( void ); +U16 getFPGABloodLeakDetectLevel( void ); +U16 getFPGABloodLeakStCount( void ); +U16 getFPGABloodLeakLEDIntensity( void ); +U16 getFPGABloodLeakRegisterCounter( void ); + BOOL noFPGABubbleDetected( U32 bubble ); void setFPGABubbleSelfTest( U32 bubble ); void clearFPGABubbleSelfTest( U32 bubble ); void setFPGAValveDialyzerInletPosition( S16 setPoint ); -S16 getFPGAValveDialyzerInletPosition( void ); -U16 getFPGAValveDialyzerInletCurrentCounts( void ); +S16 getFPGAValveDialyzerInletPosition( void ); +U16 getFPGAValveDialyzerInletCurrentCounts( void ); void setFPGAValveDialyzerOutletPosition( S16 setPoint ); S16 getFPGAValveDialyzerOutletPosition( void ); Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rfcd12c3aa538b90a2ae19b9202bc5d847859a545 -r6982379266891326c9d45aecd7d54ad5c85ea69f --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision fcd12c3aa538b90a2ae19b9202bc5d847859a545) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 6982379266891326c9d45aecd7d54ad5c85ea69f) @@ -334,7 +334,7 @@ F32 timeDepletionMS = ( (F32)FILL_RESERVOIR_TO_VOLUME_ML / dialysateFlowMLP ) * SEC_PER_MIN * MS_PER_SECOND; F32 timeTotalCycleMS = fillTimeMS + RESERVOIR_SETTLE_TIME_MS + RESERVOIR_CYCLE_EXTRA_MARGIN_TIME_MS + ratios.timeFillPrepMS; F32 timeReservoirCycleMS = 0.0; - F32 timeUFDepletionMS = 0.0; + F32 timeUFDepletionMS = NEARLY_INFINITY; // Check if target UF flow is not zero to consider it in the calculations too if ( targetUFFlowMLP > NEARLY_ZERO )