/// /// Copyright (c) 2017 Sensus Metering Systems /// namespace TBF.BenchControl.Modbus.TankSelector { public class SelectTankOp : IOperation { TankSelector tankSelector; TankId tankId; ushort bitMask; ushort unselectBitMask; bool alreadySet; bool unselectedWaitLevel; bool doUnselect; int time; public SelectTankOp(TankSelector tankSelector, TankId tankId) { this.tankSelector = tankSelector; this.tankId = tankId; /// tankId is always TankId.Cold, TankId.Warm or TankId.Hot this.bitMask = (ushort)((tankId == TankId.Cold) ? QuidoOutputs.SelectColdTank : (tankId == TankId.Warm) ? QuidoOutputs.SelectWarmTank : QuidoOutputs.SelectHotTank); } /// Start this operation public void Start() { if (tankSelector.CurrentActivity == Activity.Selected && tankSelector.CurrentTank == tankId) { alreadySet = true; /// Nothing to be done in Run() unselectedWaitLevel = false; doUnselect = false; } else if (tankSelector.CurrentActivity == Activity.Selected_Waiting1min && tankSelector.CurrentTank == tankId) { alreadySet = false; unselectedWaitLevel = false; doUnselect = false; time = 1; /// Skip resetting button bit in Run(), wait 1 min. } else if (tankSelector.CurrentActivity == Activity.Idle || tankSelector.CurrentActivity == Activity.Unknown) { SelectTankFromIdleState(); } else if (tankSelector.CurrentActivity == Activity.Unselected_WaitingLevel) { alreadySet = false; unselectedWaitLevel = true; doUnselect = false; } else if (tankSelector.CurrentActivity == Activity.Selected || tankSelector.CurrentActivity == Activity.Selected_Waiting1min) { /// /// it follows that (tankSelector.CurrentTank != tankId) => unselect the tank first /// alreadySet = false; unselectedWaitLevel = false; doUnselect = true; TankId selectedTankId = tankSelector.CurrentTank; unselectBitMask = (ushort)((selectedTankId == TankId.Cold) ? QuidoOutputs.PumpToColdTank : (selectedTankId == TankId.Warm) ? QuidoOutputs.PumpToWarmTank : QuidoOutputs.PumpToHotTank); tankSelector.State = (selectedTankId == TankId.Cold) ? State.ColdTankUnselected_WaitingLevel : (selectedTankId == TankId.Warm) ? State.WarmTankUnselected_WaitingLevel : State.HotTankUnselected_WaitingLevel; tankSelector.ResetBit(unselectBitMask); } } void SelectTankFromIdleState() { /// tankId is always TankId.Cold, TankId.Warm or TankId.Hot tankSelector.State = (tankId == TankId.Cold) ? State.ColdTankSelected_Waiting1min : (tankId == TankId.Warm) ? State.WarmTankSelected_Waiting1min : State.HotTankSelected_Waiting1min; alreadySet = false; unselectedWaitLevel = false; doUnselect = false; time = 0; /// Reset button bit in Run(), wait 1 min. tankSelector.SetBit(bitMask); } /// Run this operation public Event Run() { if (alreadySet) { return Event.ConditionMet; } else if (doUnselect) { tankSelector.ResetBit(unselectBitMask); doUnselect = false; unselectedWaitLevel = true; return Event.ConditionNotMet; } else if (unselectedWaitLevel) { if (tankSelector.CurrentActivity == Activity.Idle) { SelectTankFromIdleState(); } return Event.ConditionNotMet; } else if (time == 0) { tankSelector.ResetBit(bitMask); time++; return Event.ConditionNotMet; } else if (time <= 60) { time++; return Event.ConditionNotMet; } else { return Event.ConditionMet; } } /// Stop this operation public void Stop() { } } }