626804f0b17dc0cd081d05242484cc5fcbb3711d
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / ManualSwitch.java
1 package net.mograsim.logic.core.components;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.List;\r
6 \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
13 \r
14 /**\r
15  * This class models a simple on/off (ONE/ZERO) switch for user interaction.\r
16  *\r
17  * @author Christian Femers\r
18  *\r
19  */\r
20 public class ManualSwitch extends Component implements LogicObservable\r
21 {\r
22         private Collection<LogicObserver> observers;\r
23         private ReadWriteEnd output;\r
24         private boolean isOn;\r
25 \r
26         public ManualSwitch(Timeline timeline, ReadWriteEnd output)\r
27         {\r
28                 super(timeline);\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
33         }\r
34 \r
35         public void switchOn()\r
36         {\r
37                 setState(true);\r
38         }\r
39 \r
40         public void switchOff()\r
41         {\r
42                 setState(false);\r
43         }\r
44 \r
45         public void toggle()\r
46         {\r
47                 setState(!isOn);\r
48         }\r
49 \r
50         public void setState(boolean isOn)\r
51         {\r
52                 if (this.isOn == isOn)\r
53                         return;\r
54                 this.isOn = isOn;\r
55                 output.feedSignals(getValue());\r
56                 notifyObservers();\r
57         }\r
58 \r
59         public void setToValueOf(Bit bit)\r
60         {\r
61                 if (bit == Bit.ONE)\r
62                         switchOn();\r
63                 else if (bit == Bit.ZERO)\r
64                         switchOff();\r
65                 else\r
66                         throw new IllegalArgumentException("Cannot set ManualSwitch to the value of Bit " + bit);\r
67         }\r
68 \r
69         public boolean isOn()\r
70         {\r
71                 return isOn;\r
72         }\r
73 \r
74         public Bit getValue()\r
75         {\r
76                 return isOn ? Bit.ONE : Bit.ZERO;\r
77         }\r
78 \r
79         @Override\r
80         public List<ReadEnd> getAllInputs()\r
81         {\r
82                 return List.of();\r
83         }\r
84 \r
85         @Override\r
86         public List<ReadWriteEnd> getAllOutputs()\r
87         {\r
88                 return List.of(output);\r
89         }\r
90 \r
91         @Override\r
92         public void registerObserver(LogicObserver ob)\r
93         {\r
94                 observers.add(ob);\r
95         }\r
96 \r
97         @Override\r
98         public void deregisterObserver(LogicObserver ob)\r
99         {\r
100                 observers.remove(ob);\r
101         }\r
102 \r
103         @Override\r
104         public void notifyObservers()\r
105         {\r
106                 observers.forEach(ob -> ob.update(this));\r
107         }\r
108 \r
109 }\r