Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -rb7aca6a5c7073dbae6a31d0f87d81bc241eece33 -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision b7aca6a5c7073dbae6a31d0f87d81bc241eece33) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -44,12 +44,12 @@ // ********** private definitions ********** -#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. +#define BAL_CHAMBER_DATA_PUBLISH_INTERVAL ( 50 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the balancing chamber data published. #define BAL_CHAMBER_FILL_PRES_DROP_MS ( 200 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber filling started and corrosponding valves opened. #define BAL_CHAMBER_FILL_COMPLETE_MS ( 100 / TASK_GENERAL_INTERVAL ) ///< Time (ms/tasktime) to confirm the balancing chamber fill completed and pressure is within range #define SPENT_FILL_COMPLETE_QD_LOW_RISE_MAX_MLPM 300.0F ///< For Qd <= 300 mL/min (Diener 1000). #define SPENT_FILL_COMPLETE_DP_RISE_PSIG 0.5F ///< Minimum 100 ms spent pressure rise (current minus n-2) to count as a rise hit at low Qd. -#define SPENT_FILL_COMPLETE_DP_RISE_HIGH_QD_PSIG 3.0F ///< Minimum spent pressure rise for Diener 2000 or Qd > 300 mL/min. +#define SPENT_FILL_COMPLETE_DP_RISE_HIGH_QD_PSIG 2.0F ///< Minimum spent pressure rise for Diener 2000 or Qd > 300 mL/min. #define SPENT_FILL_SLOPE_SPENT_PRESSURE_HIGH_PSIG 2.0F ///< Above this spent pressure rise, only one rise hit is required. #define SPENT_FILL_SLOPE_MAX_RISE_HITS 2 ///< Rise hits required when Qd <= 150 in the low spent-pressure band. #define SPENT_FILL_DETECT_COUNT_TOL_PCT 1.0F ///< Allowed detection timing tolerance as a fraction of expected BC switching count. @@ -69,6 +69,7 @@ #define BC_ACID_SPEED_OFFSET_MLPM 160.0F ///< Acid speed formula offset (mL/min). #define BC_ACID_SPEED_DISC_CONSTANT 102400.0F ///< Acid speed formula discriminant constant. #define BC_ACID_SPEED_DISC_VOL_COEF 96000.0F ///< Acid speed formula volume coefficient. +#define SPENT_FILL_COMPLETE_PRESSURE 33.0F /// Payload record structure for balancing chamber switch only request typedef struct @@ -117,6 +118,8 @@ static BOOL isBalChamberSwitchingPeriodUpdatePending; ///< BC switching period update pending apply at fill end. static U32 bcSwitchingBasedOnClosedPeriodCounter; ///< Valve-close segments remaining before first-cycle relaxations clear after Qd timing apply. static F32 balancingError; ///< Balancing error that has been calculated during balancing chamber switching. +static F32 riseDeltaPsi; +static BOOL riseHit; //TODO: remove later once level sensor working static U32 bicarbChamberPeriodicFillCounter; @@ -1472,43 +1475,43 @@ U32 minDetectCount = balChamberValveClosePeriod - detectTolCount; BOOL isDetectionInCountWindow = ( ( currentBalChamberFillCounter >= minDetectCount ) && ( currentBalChamberFillCounter <= maxDetectCount ) ) ? TRUE : FALSE; - F32 riseDeltaPsi = spentDialPressure - lastPrevSpentDialPressure; - BOOL riseHit = ( riseDeltaPsi > riseThresholdPsig ) ? TRUE : FALSE; + riseDeltaPsi = spentDialPressure - lastPrevSpentDialPressure; + riseHit = ( riseDeltaPsi > riseThresholdPsig ) ? TRUE : FALSE; U32 requiredRiseCount; // Mid band between low/high spent pressure rise: require two rise hits. if ( riseDeltaPsi > SPENT_FILL_SLOPE_SPENT_PRESSURE_HIGH_PSIG ) { requiredRiseCount = 1U; } - else - { - requiredRiseCount = 2U; - } +// else +// { +// requiredRiseCount = 2U; +// } if ( ( TRUE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) { spentFillRiseHitCount += 1; spentFillRiseMissCounter = 0; } - else if ( spentFillRiseHitCount > 0 ) - { - if ( ( FALSE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) - { - spentFillRiseMissCounter += 1; +// else if ( spentFillRiseHitCount > 0 ) +// { +// if ( ( FALSE == riseHit ) && ( TRUE == isDetectionInCountWindow ) ) +// { +// spentFillRiseMissCounter += 1; +// +// if ( spentFillRiseMissCounter >= 2 ) +// { +// spentFillRiseHitCount = 0; +// spentFillRiseMissCounter = 0; +// } +// } +// } - if ( spentFillRiseMissCounter >= 2 ) - { - spentFillRiseHitCount = 0; - spentFillRiseMissCounter = 0; - } - } - } - lastPrevSpentDialPressure = prevSpentDialPressure; prevSpentDialPressure = spentDialPressure; - state = ( spentFillRiseHitCount >= requiredRiseCount ) ? TRUE : FALSE; + state = ( ( spentFillRiseHitCount >= requiredRiseCount ) || ( spentDialPressure >= SPENT_FILL_COMPLETE_PRESSURE ) ) ? TRUE : FALSE; return state; } @@ -1846,8 +1849,8 @@ BAL_CHAMBER_DATA_T data; data.balChamberExecState = (U32)balChamberExecState; - data.balChamberSWState = (U32)balChamberSWState; - data.balChamberSWFreq = getBalChamberSwitchingFreq(); + data.balChamberSWState = (U32)spentFillRiseHitCount; + data.balChamberSWFreq = riseDeltaPsi; data.isSpentFillComplete = isSpentFillComplete; data.currentBalChamberSwitchingCounter = currentBalChamberFillCounter; data.isPressureStabilizedDuringFill = isPressureStabilizedDuringFill; Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r56410a2475a4a6d1aa93642c630cdf37683d3231 -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 56410a2475a4a6d1aa93642c630cdf37683d3231) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -72,6 +72,8 @@ //Testing #define DELAY_BC_SWITCHING_AT_START_UP ( 10 * MS_PER_SECOND ) ///< Provide a balancing chamber switching start up delay to stabilize pump speed etc., +#define MAX_UF_RATE 150 + /// Payload record structure for Gen dialysate execution state set request typedef struct { @@ -114,6 +116,7 @@ static void monitorChamberLevelStatus( void ); static void publishGenDialysateModeData( void ); static U32 getFreshDialPumpInitialRpm( void ); +static DD_GEND_MODE_STATE_T handleGenDPrimeFluidDiscardState( void ); /*********************************************************************//** * @brief @@ -488,6 +491,33 @@ //TODO : define actuators states break; + case DD_GEND_PRIME_FLUID_DISCARD_STATE: + // Deactivate Balancing Chamber Switching + //requestBalChamberSwitching( FALSE ); + // Turn off fresh & spent pumps + signalDialysatePumpHardStop( D12_PUMP ); + signalDialysatePumpHardStop( D48_PUMP ); + + setValveState( D40_VALV, VALVE_STATE_CLOSED ); + setValveState( D35_VALV, VALVE_STATE_CLOSED ); + setValveState( D100_VALV, VALVE_STATE_OPEN ); + setValveState( D34_VALV, VALVE_STATE_CLOSED ); + setValveState( D91_VALV, VALVE_STATE_CLOSED ); + setValveState( D47_VALV, VALVE_STATE_CLOSED ); + setValveState( D52_VALV, VALVE_STATE_CLOSED ); + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + setValveState( D65_VALV, VALVE_STATE_CLOSED ); + //Close all balancing chamber valves + valveControlForBCClosedState(); + + //UF pump on + setConcentratePumpTargetSpeed( D76_PUMP, MAX_UF_RATE, DOSING_CONT_VOLUME ); + requestConcentratePumpOn( D76_PUMP ); + + //Rinse pump On + setRinsePumpState( RINSE_PUMP_STATE_ON ); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE1, state ) break; @@ -564,6 +594,10 @@ genDialysateState = handleGenDIsolatedUFState(); break; + case DD_GEND_PRIME_FLUID_DISCARD_STATE: + genDialysateState = handleGenDPrimeFluidDiscardState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE, genDialysateState ) genDialysateState = DD_GEND_STATE_START; @@ -812,6 +846,21 @@ state = DD_GEND_DIALYSATE_DELIVERY_STATE; } + if ( TRUE == getprimeFluidDiscardStatus() ) + { + // Deactivate Balancing Chamber Switching + requestBalChamberSwitching( FALSE ); + + // Wait for the Balancing Chamber to complete the current cycle before transition into spent chamber fill state + if ( getBalancingChamberStatus() == FALSE ) + { + setModeGenDStateTransition( DD_GEND_PRIME_FLUID_DISCARD_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_PRIME_FLUID_DISCARD_STATE; + } + + } + return state; } @@ -957,6 +1006,30 @@ /*********************************************************************//** * @brief + * The handleGenDPrimeFluidDiscardState function performs discarding the + * priming fluid from disposable tube set. Runs the ultrafiltration pump (D76) + * to discard the priming fluid. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next gen dialysate mode state + *************************************************************************/ +static DD_GEND_MODE_STATE_T handleGenDPrimeFluidDiscardState( void ) +{ + DD_GEND_MODE_STATE_T state = DD_GEND_PRIME_FLUID_DISCARD_STATE; + + if ( FALSE == getprimeFluidDiscardStatus() ) + { + requestConcentratePumpOff( D76_PUMP, FALSE ); + setValveState( D100_VALV, VALVE_STATE_CLOSED ); + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); + state = DD_GEND_DIALYSATE_BYPASS_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The requestDDGenDialyasteStop function handles an TD request to stop * generation dialysis mode. * @details \b Inputs: Generation dialysate mode / state Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -r0452674a0f7a356ab65d147d8222b6efabfd0bf7 -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 0452674a0f7a356ab65d147d8222b6efabfd0bf7) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -206,6 +206,7 @@ { pendingStartDDGenDialRequest = FALSE; } + setTDDialyzerBypass( TRUE ); requestNewOperationMode( DD_MODE_GEND ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rff0edadf0c6f161a0a092ddaf94d1940d64f7d5e -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision ff0edadf0c6f161a0a092ddaf94d1940d64f7d5e) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -315,6 +315,7 @@ { MSG_ID_FP_CONDUCTIVITY_SENSOR_CAL_REQUEST, &testHandleConductivitySensorCalRequest }, { MSG_ID_DD_MIXING_CONTROL_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testMixingControlDataPublishIntervalOverride }, { MSG_ID_DD_BICART_DEPRESSURISE_REQUEST_OVERRIDE_REQUEST, &testDryBiCartDepressurizeRequestOverride }, + { MSG_ID_DD_TD_PRIME_REQUEST_DATA, &handlePrimeDataRequestMsg }, }; /// Calculation for number of entries in the incoming message function handler look-up table. Index: firmware/App/Services/TDInterface.c =================================================================== diff -u -rbd522c8ffdf75130571e5b6a79d1b1d6acd78b1c -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision bd522c8ffdf75130571e5b6a79d1b1d6acd78b1c) +++ firmware/App/Services/TDInterface.c (.../TDInterface.c) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -95,6 +95,8 @@ static U32 tdSubMode; ///< Current state (sub-mode) of current TD operation mode. static BOOL tdDialyzerBypass; ///< TD dialyzer bypass static BOOL tdOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh TD op mode data +static BOOL chamberHValveOpen; ///< Chamber H vent valve open status +static BOOL primeFluidDiscardStart; ///< Priming fluid discard start status static OVERRIDE_F32_T tdDialysateFlowrate; ///< TD Dialysate flow rate static OVERRIDE_F32_T tdUFRate; ///< TD ultrafiltration rate @@ -238,6 +240,34 @@ /*********************************************************************//** * @brief + * The setChamberHValveStatus function sets the requested Chamber H vent + * valve open state, used to open chamber H valve to depressurize. + * @details \b Inputs: none + * @details \b Outputs: chamberHValveOpen + * @param flag TRUE to request the Chamber H vent valve open, FALSE to close it + * @return none + *************************************************************************/ +void setChamberHValveStatus( BOOL flag ) +{ + chamberHValveOpen = flag; +} + +/*********************************************************************//** + * @brief + * The setprimeFluidDiscardStatus function sets the requested priming fluid + * discard state, used to discard priming fluid. + * @details \b Inputs: none + * @details \b Outputs: primeFluidDiscardStart + * @param flag TRUE to request priming fluid discard start, FALSE to stop it + * @return none + *************************************************************************/ +void setprimeFluidDiscardStatus( BOOL flag ) +{ + primeFluidDiscardStart = flag; +} + +/*********************************************************************//** + * @brief * The setTDOpMode function sets the latest TD operating mode reported by * the TD (called by TD published message handler). * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if reported TD mode is invalid. @@ -364,6 +394,32 @@ /*********************************************************************//** * @brief + * The getChamberHValveStatus function returns the current Chamber H vent + * valve open request status. + * @details \b Inputs: chamberHValveOpen + * @details \b Outputs: none + * @return TRUE if Chamber H vent valve open is requested, FALSE if not + *************************************************************************/ +BOOL getChamberHValveStatus( void ) +{ + return chamberHValveOpen; +} + +/*********************************************************************//** + * @brief + * The getprimeFluidDiscardStatus function returns the current priming fluid + * discard request status. + * @details \b Inputs: primeFluidDiscardStart + * @details \b Outputs: none + * @return TRUE if priming fluid discard is requested, FALSE if not + *************************************************************************/ +BOOL getprimeFluidDiscardStatus( void ) +{ + return primeFluidDiscardStart; +} + +/*********************************************************************//** + * @brief * The getTDTargetDialysateTemperature function gets the latest TD * target dialysate temperature rate. * @details \b Inputs: tdDialysateTemp @@ -609,7 +665,35 @@ return result; } +/*********************************************************************//** + * @brief + * The handlePrimeDataRequestMsg function handles a prime data request + * from TD, updates Chamber H vent valve and priming fluid discard requests. + * @details \b Inputs: none + * @details \b Outputs: message handled + * @param message a pointer to the message to handle + * @return TRUE if message is sucessfully parsed, FALSE if not. + *************************************************************************/ +BOOL handlePrimeDataRequestMsg( MESSAGE_T *message ) +{ + BOOL result = FALSE; + if ( message->hdr.payloadLen == sizeof( PRIME_DATA_REQ_PAYLOAD_T ) ) + { + PRIME_DATA_REQ_PAYLOAD_T payload; + + memcpy( &payload, message->payload, sizeof( PRIME_DATA_REQ_PAYLOAD_T ) ); + + setChamberHValveStatus( payload.chamberHValveOpen ); + setprimeFluidDiscardStatus( payload.primeFluidDiscardStart ); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DD_2_TD, result ); + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/TDInterface.h =================================================================== diff -u -rc992ffdef2060d3d534abd2538bfb31dd25b9fbc -r67453852a25077d0da103dca88449ee79d628680 --- firmware/App/Services/TDInterface.h (.../TDInterface.h) (revision c992ffdef2060d3d534abd2538bfb31dd25b9fbc) +++ firmware/App/Services/TDInterface.h (.../TDInterface.h) (revision 67453852a25077d0da103dca88449ee79d628680) @@ -56,8 +56,12 @@ F32 getTDBicarbConversionFactor( void ); U32 getTDSodiumConcentration( void ); U32 getTDBicarbonateConcentration( void ); - +BOOL getChamberHValveStatus( void ); +BOOL getprimeFluidDiscardStatus( void ); +void setChamberHValveStatus( BOOL flag ); +void setprimeFluidDiscardStatus( BOOL flag ); TD_OP_MODE_T getTDOpMode( void ); +BOOL handlePrimeDataRequestMsg( MESSAGE_T *message ); BOOL testTDTreatmentParamsOverride( MESSAGE_T *message );