-package net.mograsim.logic.core.components;
-
-import java.util.List;
-
-import net.mograsim.logic.core.timeline.Timeline;
-import net.mograsim.logic.core.types.Bit;
-import net.mograsim.logic.core.wires.Wire.ReadEnd;
-import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
-
-/**
- * This class models a simple on/off (ONE/ZERO) switch for user interaction.
- *
- * @author Christian Femers
- *
- */
-public class ManualSwitch extends Component
-{
- private ReadWriteEnd output;
- private boolean isOn;
-
- public ManualSwitch(Timeline timeline, ReadWriteEnd output)
- {
- super(timeline);
- if (output.length() != 1)
- throw new IllegalArgumentException("Switch output can be only a single wire");
- this.output = output;
- }
-
- public void switchOn()
- {
- setState(true);
- }
-
- public void switchOff()
- {
- setState(false);
- }
-
- public void toggle()
- {
- setState(!isOn);
- }
-
- public void setState(boolean isOn)
- {
- if (this.isOn == isOn)
- return;
- this.isOn = isOn;
- output.feedSignals(getValue());
- }
-
- public boolean isOn()
- {
- return isOn;
- }
-
- public Bit getValue()
- {
- return isOn ? Bit.ONE : Bit.ZERO;
- }
-
- @Override
- public List<ReadEnd> getAllInputs()
- {
- return List.of();
- }
-
- @Override
- public List<ReadWriteEnd> getAllOutputs()
- {
- return List.of(output);
- }
-
-}
+package net.mograsim.logic.core.components;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import net.mograsim.logic.core.LogicObservable;\r
+import net.mograsim.logic.core.LogicObserver;\r
+import net.mograsim.logic.core.timeline.Timeline;\r
+import net.mograsim.logic.core.types.Bit;\r
+import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
+import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
+\r
+/**\r
+ * This class models a simple on/off (ONE/ZERO) switch for user interaction.\r
+ *\r
+ * @author Christian Femers\r
+ *\r
+ */\r
+public class ManualSwitch extends Component implements LogicObservable\r
+{\r
+ private Collection<LogicObserver> observers;\r
+ private ReadWriteEnd output;\r
+\r
+ public ManualSwitch(Timeline timeline, ReadWriteEnd output)\r
+ {\r
+ super(timeline);\r
+ observers = new ArrayList<>();\r
+ if (output.length() != 1)\r
+ throw new IllegalArgumentException("Switch output can be only a single wire");\r
+ this.output = output;\r
+ }\r
+\r
+ public void switchOn()\r
+ {\r
+ setState(true);\r
+ }\r
+\r
+ public void switchOff()\r
+ {\r
+ setState(false);\r
+ }\r
+\r
+ public void toggle()\r
+ {\r
+ setState(!isOn());\r
+ }\r
+\r
+ public void setState(boolean isOn)\r
+ {\r
+ setToValueOf(isOn ? Bit.ONE : Bit.ZERO);\r
+ }\r
+\r
+ public void setToValueOf(Bit bit)\r
+ {\r
+ if (!bit.isBinary())\r
+ throw new IllegalArgumentException("Cannot set ManualSwitch to the value of Bit " + bit);\r
+ if (bit == output.getInputValue())\r
+ return;\r
+ output.feedSignals(bit);\r
+ notifyObservers();\r
+ }\r
+\r
+ public boolean isOn()\r
+ {\r
+ return output.getInputValue() == Bit.ONE;\r
+ }\r
+\r
+ public Bit getValue()\r
+ {\r
+ return output.getInputValue();\r
+ }\r
+\r
+ @Override\r
+ public List<ReadEnd> getAllInputs()\r
+ {\r
+ return List.of();\r
+ }\r
+\r
+ @Override\r
+ public List<ReadWriteEnd> getAllOutputs()\r
+ {\r
+ return List.of(output);\r
+ }\r
+\r
+ @Override\r
+ public void registerObserver(LogicObserver ob)\r
+ {\r
+ observers.add(ob);\r
+ }\r
+\r
+ @Override\r
+ public void deregisterObserver(LogicObserver ob)\r
+ {\r
+ observers.remove(ob);\r
+ }\r
+\r
+ @Override\r
+ public void notifyObservers()\r
+ {\r
+ observers.forEach(ob -> ob.update(this));\r
+ }\r
+\r
+}\r