tbf/TestBenchFramework/BenchControl/Modbus/TankSelector/SelectTankOp.cs

146 lines
4.1 KiB
C#

///
/// Copyright (c) 2017 Sensus Metering Systems
///
using log4net;
namespace TBF.BenchControl.Modbus.TankSelector
{
public class SelectTankOp : IOperation
{
private static readonly ILog log = LogManager.GetLogger(typeof(SelectTankOp));
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.SetBit(unselectBitMask);
}
log.DebugFormat("Start() alreadySet={0} unselectedWaitLevel={1} doUnselect={2} time={3} tankId={4}", alreadySet, unselectedWaitLevel, doUnselect, time, tankId);
}
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()
{
log.DebugFormat("Run() alreadySet={0} unselectedWaitLevel={1} doUnselect={2} time={3} tankId={4}", alreadySet, unselectedWaitLevel, doUnselect, time, tankId);
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()
{
}
}
}