From 847c715730cefc84768ab2012e8d3e6265717c98 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Wed, 29 May 2019 16:57:19 +0200 Subject: [PATCH] Added adapters for OrGate and NotGate --- .../modeladapter/ViewLogicModelAdapter.java | 37 ++++++++++++++----- ...ateAdapter.java => SimpleGateAdapter.java} | 21 ++++++++--- 2 files changed, 44 insertions(+), 14 deletions(-) rename LogicUI/src/era/mi/gui/modeladapter/componentadapters/{AndGateAdapter.java => SimpleGateAdapter.java} (57%) diff --git a/LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java b/LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java index d159b605..c64ae971 100644 --- a/LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java +++ b/LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java @@ -14,12 +14,17 @@ import java.util.stream.Collectors; import era.mi.gui.model.ViewModel; import era.mi.gui.model.components.GUIAndGate; import era.mi.gui.model.components.GUIComponent; +import era.mi.gui.model.components.GUINotGate; +import era.mi.gui.model.components.GUIOrGate; import era.mi.gui.model.wires.GUIWire; import era.mi.gui.model.wires.Pin; import era.mi.gui.model.wires.WireCrossPoint; -import era.mi.gui.modeladapter.componentadapters.AndGateAdapter; import era.mi.gui.modeladapter.componentadapters.ComponentAdapter; +import era.mi.gui.modeladapter.componentadapters.SimpleGateAdapter; import era.mi.logic.components.Component; +import era.mi.logic.components.gates.AndGate; +import era.mi.logic.components.gates.NotGate; +import era.mi.logic.components.gates.OrGate; import era.mi.logic.timeline.Timeline; import era.mi.logic.wires.Wire; import era.mi.logic.wires.Wire.ReadEnd; @@ -30,7 +35,9 @@ public class ViewLogicModelAdapter static { Map, ComponentAdapter> componentAdaptersModifiable = new HashMap<>(); - componentAdaptersModifiable.put(GUIAndGate.class, new AndGateAdapter()); + componentAdaptersModifiable.put(GUIOrGate.class, new SimpleGateAdapter(OrGate::new)); + componentAdaptersModifiable.put(GUIAndGate.class, new SimpleGateAdapter(AndGate::new)); + componentAdaptersModifiable.put(GUINotGate.class, new SimpleGateAdapter((t, p, o, i) -> new NotGate(t, p, i[0], o))); // TODO list all "primitive" adapters here componentAdapters = Collections.unmodifiableMap(componentAdaptersModifiable); } @@ -40,7 +47,9 @@ public class ViewLogicModelAdapter // TODO replace Timeline with LogicModel as soon as it exists Timeline timeline = new Timeline(10); - Map logicWiresPerPin = convertWires(viewModel.getWires(), params, timeline); + Map logicWiresPerPin = convertWires( + viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()), + viewModel.getWires(), params, timeline); Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); Map oneToOneComponents = new HashMap<>(); @@ -60,9 +69,9 @@ public class ViewLogicModelAdapter return timeline; } - private static Map convertWires(List wires, LogicModelParameters params, Timeline timeline) + private static Map convertWires(Set allPins, List wires, LogicModelParameters params, Timeline timeline) { - Map> connectedPinGroups = getConnectedPinGroups(wires); + Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups); setGUIWiresLogicModelBinding(wires, logicWiresPerPin); return logicWiresPerPin; @@ -80,22 +89,30 @@ public class ViewLogicModelAdapter private static void setGUIWiresLogicModelBinding(List wires, Map logicWiresPerPin) { - Map guiWireSharedReadEnd = logicWiresPerPin.values().stream() + Map guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd)); for (GUIWire guiWire : wires) guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1()))); } - private static Map> getConnectedPinGroups(List wires) + private static Map> getConnectedPinGroups(Set allPins, List wires) { Map> connectedPinsPerPin = new HashMap<>(); + + for (Pin p : allPins) + { + HashSet connectedPins = new HashSet<>(); + connectedPins.add(p); + connectedPinsPerPin.put(p, connectedPins); + } + wires.forEach(wire -> { Pin pin1 = wire.getPin1(); Pin pin2 = wire.getPin2(); - Set pin1ConnectedPins = connectedPinsPerPin.putIfAbsent(pin1, new HashSet<>()); - Set pin2ConnectedPins = connectedPinsPerPin.putIfAbsent(pin2, new HashSet<>()); + Set pin1ConnectedPins = connectedPinsPerPin.get(pin1); + Set pin2ConnectedPins = connectedPinsPerPin.get(pin2); pin1ConnectedPins.addAll(pin2ConnectedPins); pin1ConnectedPins.add(pin1); @@ -110,6 +127,8 @@ public class ViewLogicModelAdapter private static Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIComponent guiComponent, Map logicWiresPerPin, ComponentAdapter adapter) { + if (adapter == null) + throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass()); return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin); } diff --git a/LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java b/LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java similarity index 57% rename from LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java rename to LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java index 3b34d900..e256ff03 100644 --- a/LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java +++ b/LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java @@ -3,20 +3,26 @@ package era.mi.gui.modeladapter.componentadapters; import java.util.List; import java.util.Map; -import era.mi.gui.model.components.GUIAndGate; +import era.mi.gui.model.components.SimpleRectangularGUIGate; import era.mi.gui.model.wires.Pin; import era.mi.gui.modeladapter.LogicModelParameters; import era.mi.logic.components.Component; -import era.mi.logic.components.gates.AndGate; import era.mi.logic.timeline.Timeline; import era.mi.logic.wires.Wire; import era.mi.logic.wires.Wire.ReadEnd; import era.mi.logic.wires.Wire.ReadWriteEnd; -public class AndGateAdapter implements ComponentAdapter +public class SimpleGateAdapter implements ComponentAdapter { + private final ComponentConstructor constructor; + + public SimpleGateAdapter(ComponentConstructor constructor) + { + this.constructor = constructor; + } + @Override - public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIAndGate guiComponent, + public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularGUIGate guiComponent, Map logicWiresPerPin) { ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd(); @@ -24,6 +30,11 @@ public class AndGateAdapter implements ComponentAdapter ReadEnd[] ins = new ReadEnd[inputPins.size()]; for (int i = 0; i < inputPins.size(); i++) ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd(); - return new AndGate(timeline, params.gateProcessTime, out, ins); + return constructor.newComponent(timeline, params.gateProcessTime, out, ins); + } + + public static interface ComponentConstructor + { + public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins); } } \ No newline at end of file -- 2.17.1