Created model for the logic Clock
[Mograsim.git] / net.mograsim.logic.core / src / net / mograsim / logic / core / components / Clock.java
index 6562135..b691d7e 100644 (file)
@@ -1,7 +1,11 @@
 package net.mograsim.logic.core.components;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 
+import net.mograsim.logic.core.LogicObservable;
+import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.timeline.Timeline;
 import net.mograsim.logic.core.timeline.TimelineEvent;
 import net.mograsim.logic.core.timeline.TimelineEventHandler;
@@ -10,8 +14,9 @@ import net.mograsim.logic.core.wires.Wire;
 import net.mograsim.logic.core.wires.Wire.ReadEnd;
 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
 
-public class Clock extends Component implements TimelineEventHandler
+public class Clock extends Component implements TimelineEventHandler, LogicObservable
 {
+       private Collection<LogicObserver> observers;
        private boolean toggle = false;
        private ReadWriteEnd out;
        private int delta;
@@ -26,6 +31,7 @@ public class Clock extends Component implements TimelineEventHandler
                super(timeline);
                this.delta = delta;
                this.out = out;
+               this.observers = new HashSet<>();
                addToTimeline();
        }
 
@@ -35,6 +41,7 @@ public class Clock extends Component implements TimelineEventHandler
                addToTimeline();
                out.feedSignals(toggle ? Bit.ONE : Bit.ZERO);
                toggle = !toggle;
+               notifyObservers();
        }
 
        public ReadWriteEnd getOut()
@@ -42,6 +49,11 @@ public class Clock extends Component implements TimelineEventHandler
                return out;
        }
 
+       public boolean isOn()
+       {
+               return !toggle;
+       }
+
        private void addToTimeline()
        {
                timeline.addEvent(this, delta);
@@ -58,4 +70,22 @@ public class Clock extends Component implements TimelineEventHandler
        {
                return List.of(out);
        }
+
+       @Override
+       public void registerObserver(LogicObserver ob)
+       {
+               observers.add(ob);
+       }
+
+       @Override
+       public void deregisterObserver(LogicObserver ob)
+       {
+               observers.remove(ob);
+       }
+
+       @Override
+       public void notifyObservers()
+       {
+               observers.forEach(ob -> ob.update(this));
+       }
 }