b5b230ad831f8de5e94326e49aeb8a6621961076
[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 boolean isOn()\r
60         {\r
61                 return isOn;\r
62         }\r
63 \r
64         public Bit getValue()\r
65         {\r
66                 return isOn ? Bit.ONE : Bit.ZERO;\r
67         }\r
68 \r
69         @Override\r
70         public List<ReadEnd> getAllInputs()\r
71         {\r
72                 return List.of();\r
73         }\r
74 \r
75         @Override\r
76         public List<ReadWriteEnd> getAllOutputs()\r
77         {\r
78                 return List.of(output);\r
79         }\r
80 \r
81         @Override\r
82         public void registerObserver(LogicObserver ob)\r
83         {\r
84                 observers.add(ob);\r
85         }\r
86 \r
87         @Override\r
88         public void deregisterObserver(LogicObserver ob)\r
89         {\r
90                 observers.remove(ob);\r
91         }\r
92 \r
93         @Override\r
94         public void notifyObservers()\r
95         {\r
96                 observers.forEach(ob -> ob.update(this));\r
97         }\r
98 \r
99 }\r