Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -r2fb473f4574f9c150849bb39991a31bcadaae693 -r9af3827512621c9c710adea691c5e42f07023485 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 2fb473f4574f9c150849bb39991a31bcadaae693) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 9af3827512621c9c710adea691c5e42f07023485) @@ -55,11 +55,11 @@ //#define VALV_D80_MAX_OPEN_TIME_MS ( 10 * MS_PER_SECOND ) ///< Max time allowed for opening D80 valve during bicarb chamber (F) fill. #define VALV_D80_MAX_OPEN_TIME_MS ( 500 ) ///< Max time allowed for opening D80 valve during bicarb chamber (F) fill. #define DRY_BICART_MAX_DRAIN_TIME_MS ( 240 * MS_PER_SECOND ) ///< Max drain time for bicart chamber in ms. -#define DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS 50 ///< Conductivity sample period +#define DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS 500 ///< Conductivity sample period #define DRY_BICART_DRAIN_COND_ZERO_THRESH 0.05F ///< "Zero" conductivity threshold #define DRY_BICART_DRAIN_COND_STABLE_SAMPLES 10U ///< Debounce samples (10*50ms=500ms) #define DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ( 3 * MS_PER_SECOND ) ///< Time to stay in fluid drain per cycle -#define DRY_BICART_DRAIN_VENT_PHASE_TIME_MS 1500 ///< Time to keep D64 open per vent cycle +#define DRY_BICART_DRAIN_VENT_PHASE_TIME_MS ( 8 * MS_PER_SECOND ) ///< Time to keep D64 open per vent cycle #define DRY_BICART_DRAIN_COND_STABLE_COUNT_MAX 0xFFFFU /// Payload record structure for dry bicart fill request @@ -176,13 +176,13 @@ // Dry bicart fill exec execDryBicartFillMode(); - //Fill Bicarb chamber F + // Fill Bicarb chamber F execBicarbChamberFillMode(); - //Drain Bicart Chamber exec + // Dry bicart drain exec execDryBicartDrainMode(); - //Publish dry bicart data + // Publish dry bicart data publishDryBicartData(); } @@ -609,14 +609,14 @@ dryBiCartDrainExecState = handleDryBicartPressureEquillibriumState(); break; - case DRY_BICART_FLUID_DRAIN_END_STATE: - dryBiCartDrainExecState = handleDryBicartFluidDrainEndState(); - break; - case DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE: dryBiCartDrainExecState = handleDryBicartFluidDrainDurationCheckState(); break; + case DRY_BICART_FLUID_DRAIN_END_STATE: + dryBiCartDrainExecState = handleDryBicartFluidDrainEndState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_DRY_BICART_DRAIN_INVALID_EXEC_STATE, dryBiCartDrainExecState ); break; @@ -648,16 +648,18 @@ //Close D14 valve setValveState( D14_VALV, VALVE_STATE_CLOSED ); - // RUn D10 IN OPpen loop mode(max speed) - setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, 0xFFFF ); + // Run D10 IN Open loop mode(max speed) + setConcentratePumpTargetSpeed( D10_PUMP, CONCENTRATE_PUMP_MAX_SPEED, DOSING_CONT_VOLUME ); requestConcentratePumpOn( D10_PUMP ); // Run D48 setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); - // After a fluid drain window, go to duration/cond check (which alternates phases) + // After a fluid drain window, go to duration/condition check (which alternates phases) if ( TRUE == didTimeout( dryBiCartDrainPhaseStartTime, DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ) ) { + // Open D64 valve (vent/equilibrium) + setValveState( D64_VALV, VALVE_STATE_OPEN ); dryBiCartDrainPhaseStartTime = getMSTimerCount(); state = DRY_BICART_PRESSURE_EQUILLIBRIUM_STATE; } @@ -677,17 +679,12 @@ { DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_PRESSURE_EQUILLIBRIUM_STATE; - // Goal is to have D64 open at the same time as D80/D85 - setValveState( D80_VALV, VALVE_STATE_OPEN ); - setValveState( D85_VALV, VALVE_STATE_OPEN ); - - // Open D64 valve (vent/equil) - setValveState( D64_VALV, VALVE_STATE_OPEN ); - - // After vent window, close and go to duration/cond check + // After vent window, close and go to duration/condition check if ( TRUE == didTimeout( dryBiCartDrainPhaseStartTime, DRY_BICART_DRAIN_VENT_PHASE_TIME_MS ) ) { setValveState( D64_VALV, VALVE_STATE_CLOSED ); + setValveState( D80_VALV, VALVE_STATE_CLOSED ); + setValveState( D85_VALV, VALVE_STATE_CLOSED ); dryBiCartDrainPhaseStartTime = getMSTimerCount(); state = DRY_BICART_FLUID_DRAIN_DURATION_CHECK_STATE; } @@ -710,35 +707,33 @@ // Max drain time fallback if ( TRUE == didTimeout( dryBiCartDrainStartTime, DRY_BICART_MAX_DRAIN_TIME_MS ) ) { - return DRY_BICART_FLUID_DRAIN_END_STATE; + state = DRY_BICART_FLUID_DRAIN_END_STATE; } - // Sample conductivity periodically - if ( TRUE == didTimeout( dryBiCartDrainLastCondSampleTime, DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS ) ) + else { - F32 cond17 = getFilteredConductivity( D17_COND ); - F32 cond74 = getFilteredConductivity( D74_COND ); + // Sample conductivity periodically + if ( TRUE == didTimeout( dryBiCartDrainLastCondSampleTime, DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS ) ) + { + F32 cond17 = getFilteredConductivity( D17_COND ); + F32 cond74 = getFilteredConductivity( D74_COND ); + dryBiCartDrainLastCondSampleTime = getMSTimerCount(); - dryBiCartDrainLastCondSampleTime = getMSTimerCount(); + // Debounce "zero conductivity" detection + if ( ( cond17 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) && + ( cond74 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) ) + { + if ( dryBiCartDrainCondStableCount < DRY_BICART_DRAIN_COND_STABLE_COUNT_MAX ) + { + dryBiCartDrainCondStableCount++; + } + } - // Debounce "zero conductivity" detection - if ( ( cond17 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) && - ( cond74 <= DRY_BICART_DRAIN_COND_ZERO_THRESH ) ) - { - if ( dryBiCartDrainCondStableCount < DRY_BICART_DRAIN_COND_STABLE_COUNT_MAX ) + if ( dryBiCartDrainCondStableCount >= DRY_BICART_DRAIN_COND_STABLE_SAMPLES ) { - dryBiCartDrainCondStableCount++; + state = DRY_BICART_FLUID_DRAIN_END_STATE; } } - else - { - dryBiCartDrainCondStableCount = 0; - } - - if ( dryBiCartDrainCondStableCount >= DRY_BICART_DRAIN_COND_STABLE_SAMPLES ) - { - return DRY_BICART_FLUID_DRAIN_END_STATE; - } } dryBiCartDrainPhaseStartTime = getMSTimerCount(); @@ -760,8 +755,8 @@ DRY_BICART_DRAIN_EXEC_STATE_T state = DRY_BICART_FLUID_DRAIN_END_STATE; // Stop pumps - requestConcentratePumpOff( D10_PUMP, TRUE ); - setDialysatePumpTargetRPM( D48_PUMP, 0, TRUE ); + requestConcentratePumpOff( D10_PUMP, FALSE ); + signalDialysatePumpHardStop( D48_PUMP ); // Close valves used for drain setValveState( D64_VALV, VALVE_STATE_CLOSED );