138 lines
3.7 KiB
C#
138 lines
3.7 KiB
C#
///
|
|
/// 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);
|
|
}
|
|
|
|
|
|
/// <summary>Start this operation</summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>Run this operation</summary>
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>Stop this operation</summary>
|
|
public void Stop()
|
|
{
|
|
}
|
|
}
|
|
}
|