Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -re48bec7b1330b195afadcbf8bc58bdb4f1d5b03e -r8d2a2aec6986e58a1f6f75d4ba8864ee689fde48 --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision e48bec7b1330b195afadcbf8bc58bdb4f1d5b03e) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 8d2a2aec6986e58a1f6f75d4ba8864ee689fde48) @@ -54,7 +54,6 @@ // Bicart Vent #define DRY_BICART_VENT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to vent dry bibag gas before actuating Bicarb chamber(F) venting. #define DRY_BICART_VENT_MAX_TIME_MS ( 10 * MS_PER_SECOND ) ///< Max time to vent both bicart and Chamber F. -#define DRY_BICART_VENT_TIME_MS ( 5 * MS_PER_SECOND ) ///< Max time to vent both bicart and Chamber F. #define DRY_BICART_VENT_COMPLETE_PRESSURE 1.5F ///< Pressure reached to inidcate the drybicart venting being completed. // Bicarb chamber fill/Supply @@ -63,10 +62,10 @@ // Bicart Drain #define DRY_BICART_MAX_DRAIN_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Max drain time for bicart chamber in ms. #define DRY_BICART_DRAIN_FLUID_PHASE_TIME_MS ( 3 * MS_PER_SECOND ) ///< Time to stay in fluid drain per cycle -#define DRY_BICART_DRAIN_COND_SAMPLE_PERIOD_MS 50 ///< Conductivity sample period +#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_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_VENT_PHASE_TIME_MS 1500 ///< 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 @@ -188,13 +187,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(); } @@ -631,14 +630,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; @@ -670,16 +669,18 @@ //Close D14 valve setValveState( D14_VALV, VALVE_STATE_CLOSED ); - // RUn D10 IN OPpen loop mode(max speed) + // 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; } @@ -699,17 +700,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; } @@ -732,35 +728,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(); @@ -782,8 +776,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 );