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