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.wires.Wire.ReadEnd;
\r
12 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
\r
15 * This class models a simple on/off (ONE/ZERO) switch for user interaction.
\r
17 * @author Christian Femers
\r
20 public class ManualSwitch extends Component implements LogicObservable
\r
22 private Collection<LogicObserver> observers;
\r
23 private ReadWriteEnd output;
\r
24 private boolean isOn;
\r
26 public ManualSwitch(Timeline timeline, ReadWriteEnd output)
\r
29 observers = new ArrayList<>();
\r
30 if (output.length() != 1)
\r
31 throw new IllegalArgumentException("Switch output can be only a single wire");
\r
32 this.output = output;
\r
35 public void switchOn()
\r
40 public void switchOff()
\r
45 public void toggle()
\r
50 public void setState(boolean isOn)
\r
52 if (this.isOn == isOn)
\r
55 output.feedSignals(getValue());
\r
59 public boolean isOn()
\r
64 public Bit getValue()
\r
66 return isOn ? Bit.ONE : Bit.ZERO;
\r
70 public List<ReadEnd> getAllInputs()
\r
76 public List<ReadWriteEnd> getAllOutputs()
\r
78 return List.of(output);
\r
82 public void registerObserver(LogicObserver ob)
\r
88 public void deregisterObserver(LogicObserver ob)
\r
90 observers.remove(ob);
\r
94 public void notifyObservers()
\r
96 observers.forEach(ob -> ob.update(this));
\r