X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fatomic%2FModelClock.java;h=e22ca82644ed8be6be91e70fbc14289a344cda50;hb=648fc6e69e09fe4467cb6bac47934be1a7dcf0d6;hp=38963536d0d8163deded311a08155614e9f01edf;hpb=7d05144c25daa53e60fc9ed9fd503546a86567f8;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java index 38963536..e22ca826 100644 --- a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java @@ -1,5 +1,12 @@ package net.mograsim.logic.model.model.components.atomic; +import static net.mograsim.logic.model.preferences.RenderPreferences.FOREGROUND_COLOR; +import static net.mograsim.logic.model.preferences.RenderPreferences.TEXT_COLOR; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + import org.eclipse.swt.graphics.Color; import com.google.gson.JsonSyntaxException; @@ -10,6 +17,7 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.model.model.LogicModelModifiable; import net.mograsim.logic.model.model.components.ModelComponent; import net.mograsim.logic.model.model.components.Orientation; @@ -18,10 +26,11 @@ import net.mograsim.logic.model.model.wires.Pin; import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter; +import net.mograsim.logic.model.preferences.RenderPreferences; import net.mograsim.logic.model.serializing.IdentifyParams; import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; public class ModelClock extends ModelComponent { @@ -36,6 +45,8 @@ public class ModelClock extends ModelComponent private OrientationCalculator oc; private CoreClock clock; + private final List> hlsListeners; + public ModelClock(LogicModelModifiable model, ModelClockParams params) { this(model, params, null); @@ -45,7 +56,6 @@ public class ModelClock extends ModelComponent { super(model, name, false); this.params = params; - logicObs = (i) -> model.requestRedraw(); oc = new OrientationCalculator(params.orientation, width, height); setSize(oc.width(), oc.height()); @@ -53,13 +63,89 @@ public class ModelClock extends ModelComponent this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); addPin(outputPin); + this.hlsListeners = new ArrayList<>(); + + logicObs = i -> + { + model.requestRedraw(); + BitVector v = getOutValues(); + hlsListeners.forEach(l -> l.accept(v)); + }; + + setHighLevelStateHandler(new HighLevelStateHandler() + { + @Override + public Object get(String stateID) + { + switch (stateID) + { + case "out": + if (clock != null) + return getOutValues(); + return null; + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public void set(String stateID, Object newState) + { + switch (stateID) + { + case "out": + throw new UnsupportedOperationException("cannot set state of clock"); + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public void addListener(String stateID, Consumer stateChanged) + { + switch (stateID) + { + case "out": + hlsListeners.add(stateChanged); + break; + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public void removeListener(String stateID, java.util.function.Consumer stateChanged) + { + switch (stateID) + { + case "out": + hlsListeners.remove(stateChanged); + break; + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + }); + init(); } @Override - public void render(GeneralGC gc, Rectangle visibleRegion) + public void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion) { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + Color foreground = renderPrefs.getColor(FOREGROUND_COLOR); if (foreground != null) gc.setForeground(foreground); gc.drawRectangle(getBounds()); @@ -68,7 +154,7 @@ public class ModelClock extends ModelComponent Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); gc.setFont(labelFont); Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + Color textColor = renderPrefs.getColor(TEXT_COLOR); if (textColor != null) gc.setForeground(textColor); gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true); @@ -89,32 +175,7 @@ public class ModelClock extends ModelComponent return clock != null; } - @Override - public Object getHighLevelState(String stateID) - { - switch (stateID) - { - case "out": - if (clock != null) - return clock.getOut().getInputValues(); - return null; - default: - return super.getHighLevelState(stateID); - } - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "out": - throw new UnsupportedOperationException("cannot set state of clock"); - default: - super.setHighLevelState(stateID, newState); - } - } - + // TODO remove public CoreClock getClock() { return clock; @@ -142,6 +203,11 @@ public class ModelClock extends ModelComponent return params; } + private BitVector getOutValues() + { + return clock.getOutValues(); + } + static { LogicCoreAdapter.addComponentAdapter(new ClockAdapter());