GUIBitDisplay and GUIManualSwitch now support logicWidth != 1
[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.types.BitVector;\r
12 import net.mograsim.logic.core.wires.Wire.ReadEnd;\r
13 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;\r
14 \r
15 /**\r
16  * This class models a simple on/off (ONE/ZERO) switch for user interaction.\r
17  *\r
18  * @author Christian Femers\r
19  *\r
20  */\r
21 public class ManualSwitch extends Component implements LogicObservable\r
22 {\r
23         private Collection<LogicObserver> observers;\r
24         private ReadWriteEnd output;\r
25 \r
26         public ManualSwitch(Timeline timeline, ReadWriteEnd output)\r
27         {\r
28                 super(timeline);\r
29                 observers = new ArrayList<>();\r
30                 this.output = output;\r
31         }\r
32 \r
33         public void switchFullOn()\r
34         {\r
35                 setState(BitVector.of(Bit.ONE, output.length()));\r
36         }\r
37 \r
38         public void switchFullOff()\r
39         {\r
40                 setState(BitVector.of(Bit.ZERO, output.length()));\r
41         }\r
42 \r
43         public void toggle()\r
44         {\r
45                 if (isFullOn())\r
46                         switchFullOff();\r
47                 else\r
48                         switchFullOn();\r
49         }\r
50 \r
51         public void setState(Bit bit)\r
52         {\r
53                 setState(BitVector.of(bit));\r
54         }\r
55 \r
56         public void setState(BitVector bits)\r
57         {\r
58                 if (bits.length() != output.length())\r
59                         throw new IllegalArgumentException("Incorrect bit vector length");\r
60                 if (bits.equals(output.getInputValues()))\r
61                         return;\r
62                 output.feedSignals(bits);\r
63                 notifyObservers();\r
64         }\r
65 \r
66         public boolean isFullOn()\r
67         {\r
68                 return BitVector.of(Bit.ONE, output.length()).equals(output.getInputValues());\r
69         }\r
70 \r
71         public BitVector getValues()\r
72         {\r
73                 return output.getInputValues();\r
74         }\r
75 \r
76         @Override\r
77         public List<ReadEnd> getAllInputs()\r
78         {\r
79                 return List.of();\r
80         }\r
81 \r
82         @Override\r
83         public List<ReadWriteEnd> getAllOutputs()\r
84         {\r
85                 return List.of(output);\r
86         }\r
87 \r
88         @Override\r
89         public void registerObserver(LogicObserver ob)\r
90         {\r
91                 observers.add(ob);\r
92         }\r
93 \r
94         @Override\r
95         public void deregisterObserver(LogicObserver ob)\r
96         {\r
97                 observers.remove(ob);\r
98         }\r
99 \r
100         @Override\r
101         public void notifyObservers()\r
102         {\r
103                 observers.forEach(ob -> ob.update(this));\r
104         }\r
105 \r
106 }\r