194 lines
3.8 KiB
C#
194 lines
3.8 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using VCRlogic;
|
|
|
|
namespace VCRlogic
|
|
{
|
|
public static class SMtape
|
|
{
|
|
private static StateTape _concreteState;
|
|
|
|
public delegate void TapeEventHandler();
|
|
|
|
public static event TapeEventHandler evIntape;
|
|
|
|
public static event TapeEventHandler evOuttape;
|
|
|
|
public static event TapeEventHandler evEndtape;
|
|
|
|
public static event TapeEventHandler evNoendtape;
|
|
|
|
|
|
public static void initSMtape()
|
|
{
|
|
setState(new StapeNoTapeIn());
|
|
}
|
|
|
|
public static void setState(StateTape e)
|
|
{
|
|
_concreteState = null;
|
|
_concreteState = e;
|
|
}
|
|
|
|
|
|
public static void insertTape()
|
|
{
|
|
if (evIntape != null)
|
|
{
|
|
evIntape();
|
|
}
|
|
}
|
|
|
|
public static void ejectTape()
|
|
{
|
|
if (evOuttape != null)
|
|
{
|
|
evOuttape();
|
|
}
|
|
}
|
|
|
|
|
|
public static void endTape()
|
|
{
|
|
if (evEndtape != null)
|
|
{
|
|
evEndtape();
|
|
}
|
|
}
|
|
|
|
public static void notEndTape()
|
|
{
|
|
if (evNoendtape != null)
|
|
{
|
|
evNoendtape();
|
|
}
|
|
}
|
|
}
|
|
|
|
public abstract class StateTape
|
|
{
|
|
public abstract void evIntape();
|
|
|
|
public abstract void evOuttape();
|
|
|
|
public abstract void evEndtape();
|
|
|
|
public abstract void evNotendtape();
|
|
}
|
|
|
|
|
|
public class StapeNoTapeIn : StateTape
|
|
{
|
|
|
|
public StapeNoTapeIn()
|
|
{
|
|
Debug.Print("NoTapeIn\n");
|
|
|
|
// sub to event
|
|
SMtape.evIntape += evIntape;
|
|
}
|
|
public override void evIntape()
|
|
{
|
|
//unsub
|
|
SMtape.evIntape -= evIntape;
|
|
|
|
SMtape.setState(new StapeTapeInNotEnd());
|
|
}
|
|
|
|
public override void evOuttape()
|
|
{
|
|
}
|
|
|
|
public override void evEndtape()
|
|
{
|
|
|
|
}
|
|
|
|
public override void evNotendtape()
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public class StapeTapeInNotEnd : StateTape
|
|
{
|
|
|
|
|
|
public StapeTapeInNotEnd()
|
|
{
|
|
|
|
Debug.Print("TapeInNotEnd\n");
|
|
//sub
|
|
SMtape.evOuttape += evOuttape;
|
|
SMtape.evEndtape += evEndtape;
|
|
}
|
|
|
|
public override void evIntape()
|
|
{
|
|
}
|
|
|
|
public override void evOuttape()
|
|
{
|
|
//unsub
|
|
SMtape.evOuttape -= evOuttape;
|
|
SMtape.evEndtape -= evEndtape;
|
|
SMtape.setState(new StapeNoTapeIn());
|
|
}
|
|
|
|
public override void evEndtape()
|
|
{
|
|
//unsub
|
|
SMtape.evOuttape -= evOuttape;
|
|
SMtape.evEndtape -= evEndtape;
|
|
SMtape.setState(new StapeTapeInEnd());
|
|
}
|
|
|
|
public override void evNotendtape()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public class StapeTapeInEnd : StateTape
|
|
{
|
|
|
|
public StapeTapeInEnd()
|
|
{
|
|
Debug.Print("TapeInEnd\n");
|
|
SMtape.evOuttape += evOuttape;
|
|
SMtape.evNoendtape += evNotendtape;
|
|
|
|
}
|
|
|
|
public override void evIntape()
|
|
{
|
|
|
|
}
|
|
|
|
public override void evOuttape()
|
|
{
|
|
SMtape.evOuttape -= evOuttape;
|
|
SMtape.evNoendtape -= evNotendtape;
|
|
SMtape.setState(new StapeNoTapeIn());
|
|
}
|
|
|
|
public override void evEndtape()
|
|
{
|
|
|
|
}
|
|
|
|
public override void evNotendtape()
|
|
{
|
|
SMtape.evOuttape -= evOuttape;
|
|
SMtape.evNoendtape -= evNotendtape;
|
|
SMtape.setState(new StapeTapeInNotEnd());
|
|
}
|
|
}
|
|
} |