1 package net.mograsim.logic.core.components;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.List;
\r
7 import net.mograsim.logic.core.LogicObservable;
\r
8 import net.mograsim.logic.core.LogicObserver;
\r
9 import net.mograsim.logic.core.timeline.Timeline;
\r
10 import net.mograsim.logic.core.types.Bit;
\r
11 import net.mograsim.logic.core.types.BitVector;
\r
12 import net.mograsim.logic.core.wires.Wire.ReadEnd;
\r
13 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
\r
16 * This class models a simple on/off (ONE/ZERO) switch for user interaction.
\r
18 * @author Christian Femers
\r
21 public class ManualSwitch extends Component implements LogicObservable
\r
23 private Collection<LogicObserver> observers;
\r
24 private ReadWriteEnd output;
\r
26 public ManualSwitch(Timeline timeline, ReadWriteEnd output)
\r
29 observers = new ArrayList<>();
\r
30 this.output = output;
\r
33 public void switchFullOn()
\r
35 setState(BitVector.of(Bit.ONE, output.length()));
\r
38 public void switchFullOff()
\r
40 setState(BitVector.of(Bit.ZERO, output.length()));
\r
43 public void toggle()
\r
51 public void setState(Bit bit)
\r
53 setState(BitVector.of(bit));
\r
56 public void setState(BitVector bits)
\r
58 if (bits.length() != output.length())
\r
59 throw new IllegalArgumentException("Incorrect bit vector length");
\r
60 if (bits.equals(output.getInputValues()))
\r
62 output.feedSignals(bits);
\r
66 public boolean isFullOn()
\r
68 return BitVector.of(Bit.ONE, output.length()).equals(output.getInputValues());
\r
71 public BitVector getValues()
\r
73 return output.getInputValues();
\r
77 public List<ReadEnd> getAllInputs()
\r
83 public List<ReadWriteEnd> getAllOutputs()
\r
85 return List.of(output);
\r
89 public void registerObserver(LogicObserver ob)
\r
95 public void deregisterObserver(LogicObserver ob)
\r
97 observers.remove(ob);
\r
101 public void notifyObservers()
\r
103 observers.forEach(ob -> ob.update(this));
\r