Fixed ManualSwitch concerning U and added Bit methods
[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 \r
25         public ManualSwitch(Timeline timeline, ReadWriteEnd output)\r
26         {\r
27                 super(timeline);\r
28                 observers = new ArrayList<>();\r
29                 if (output.length() != 1)\r
30                         throw new IllegalArgumentException("Switch output can be only a single wire");\r
31                 this.output = output;\r
32         }\r
33 \r
34         public void switchOn()\r
35         {\r
36                 setState(true);\r
37         }\r
38 \r
39         public void switchOff()\r
40         {\r
41                 setState(false);\r
42         }\r
43 \r
44         public void toggle()\r
45         {\r
46                 setState(!isOn());\r
47         }\r
48 \r
49         public void setState(boolean isOn)\r
50         {\r
51                 setToValueOf(isOn ? Bit.ONE : Bit.ZERO);\r
52         }\r
53 \r
54         public void setToValueOf(Bit bit)\r
55         {\r
56                 if (!bit.isBinary())\r
57                         throw new IllegalArgumentException("Cannot set ManualSwitch to the value of Bit " + bit);\r
58                 if (bit == output.getInputValue())\r
59                         return;\r
60                 output.feedSignals(bit);\r
61                 notifyObservers();\r
62         }\r
63 \r
64         public boolean isOn()\r
65         {\r
66                 return output.getInputValue() == Bit.ONE;\r
67         }\r
68 \r
69         public Bit getValue()\r
70         {\r
71                 return output.getInputValue();\r
72         }\r
73 \r
74         @Override\r
75         public List<ReadEnd> getAllInputs()\r
76         {\r
77                 return List.of();\r
78         }\r
79 \r
80         @Override\r
81         public List<ReadWriteEnd> getAllOutputs()\r
82         {\r
83                 return List.of(output);\r
84         }\r
85 \r
86         @Override\r
87         public void registerObserver(LogicObserver ob)\r
88         {\r
89                 observers.add(ob);\r
90         }\r
91 \r
92         @Override\r
93         public void deregisterObserver(LogicObserver ob)\r
94         {\r
95                 observers.remove(ob);\r
96         }\r
97 \r
98         @Override\r
99         public void notifyObservers()\r
100         {\r
101                 observers.forEach(ob -> ob.update(this));\r
102         }\r
103 \r
104 }\r