(modelDescription.getCircuit().getMeasurementOrdering()) {
+ @Override
+ public boolean equals(Model.Signal a, String b) {
+ return a.getName().equals(b);
+ }
+ }.order(signals);
+
+ dataSet = new DataSet(signals);
+
+ DataSetObserver dataSetObserver = new DataSetObserver(type, dataSet);
+ model.addObserver(dataSetObserver);
+ }
+}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java b/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java
index 74b19e8b0..81dea9f3d 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java
@@ -1,6 +1,8 @@
package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -18,10 +20,10 @@ public class DemuxerShape implements Shape {
private final int height;
private Pins pins;
- public DemuxerShape(int selectorBits, boolean hasInput, boolean flip) {
+ public DemuxerShape(ElementAttributes attr, boolean hasInput) {
this.hasInput = hasInput;
- this.flip = flip;
- outputCount = 1 << selectorBits;
+ this.flip = attr.get(AttributeKey.FlipSelPositon);
+ outputCount = 1 << attr.get(AttributeKey.SelectorBits);
height = hasInput || (outputCount <= 2) ? outputCount * SIZE : (outputCount - 1) * SIZE;
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/DriverShape.java b/src/main/java/de/neemann/digital/draw/shapes/DriverShape.java
index c47de763f..fb648573f 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/DriverShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/DriverShape.java
@@ -1,6 +1,8 @@
package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -19,8 +21,8 @@ public class DriverShape implements Shape {
private final boolean bottom;
private Pins pins;
- public DriverShape(boolean bottom) {
- this.bottom = bottom;
+ public DriverShape(ElementAttributes attr) {
+ this.bottom = attr.get(AttributeKey.FlipSelPositon);
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/InputShape.java b/src/main/java/de/neemann/digital/draw/shapes/InputShape.java
index 15049e2fd..8283c49c0 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/InputShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/InputShape.java
@@ -3,6 +3,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.element.Element;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -24,8 +25,8 @@ public class InputShape implements Shape {
private final String label;
private IOState ioState;
- public InputShape(String label) {
- this.label = label;
+ public InputShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/LEDShape.java b/src/main/java/de/neemann/digital/draw/shapes/LEDShape.java
index 23b2d37d0..cd44264a8 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/LEDShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/LEDShape.java
@@ -2,6 +2,8 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -10,8 +12,6 @@ import de.neemann.digital.draw.graphics.Orientation;
import de.neemann.digital.draw.graphics.Style;
import de.neemann.digital.draw.graphics.Vector;
-import java.awt.*;
-
import static de.neemann.digital.draw.shapes.OutputShape.SIZE;
/**
@@ -24,9 +24,9 @@ public class LEDShape implements Shape {
private Style onStyle;
private IOState ioState;
- public LEDShape(String label, Color color) {
- this.label = label;
- onStyle = new Style(1, true, color);
+ public LEDShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
+ onStyle = new Style(1, true, attr.get(AttributeKey.Color));
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java b/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java
index bc2278459..c0ab4d584 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java
@@ -1,6 +1,8 @@
package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -16,9 +18,9 @@ public class MuxerShape implements Shape {
private final boolean flip;
private Pins pins;
- public MuxerShape(int selectorBits, boolean flip) {
- this.flip = flip;
- this.inputCount = 1 << selectorBits;
+ public MuxerShape(ElementAttributes attr) {
+ this.flip = attr.get(AttributeKey.FlipSelPositon);
+ this.inputCount = 1 << attr.get(AttributeKey.SelectorBits);
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/OutputShape.java b/src/main/java/de/neemann/digital/draw/shapes/OutputShape.java
index 2447dfe0f..616586e61 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/OutputShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/OutputShape.java
@@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -20,8 +21,8 @@ public class OutputShape implements Shape {
private final String label;
private IOState ioState;
- public OutputShape(String label) {
- this.label = label;
+ public OutputShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ProbeShape.java b/src/main/java/de/neemann/digital/draw/shapes/ProbeShape.java
index 331b0d2de..1f11e1b65 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ProbeShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ProbeShape.java
@@ -1,6 +1,7 @@
package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -18,8 +19,8 @@ public class ProbeShape implements Shape {
private IOState ioState;
private int bits;
- public ProbeShape(String label) {
- this.label = label;
+ public ProbeShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ResetShape.java b/src/main/java/de/neemann/digital/draw/shapes/ResetShape.java
index 46de05b4c..a884394d5 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ResetShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ResetShape.java
@@ -1,6 +1,7 @@
package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
@@ -15,8 +16,8 @@ public class ResetShape implements Shape {
private final String label;
- public ResetShape(String label) {
- this.label = label;
+ public ResetShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java b/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
index 98fddbf4a..f76665865 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SevenSegHexShape.java
@@ -2,26 +2,25 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.Style;
import de.neemann.digital.draw.graphics.Vector;
-import java.awt.*;
-
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/**
* @author hneemann
*/
public class SevenSegHexShape extends SevenShape {
- private static final int[] table = new int[]{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
+ private static final int[] TABLE = new int[]{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
private Pins pins;
private ObservableValue input;
- public SevenSegHexShape(String label, Color color) {
- super(label, color);
+ public SevenSegHexShape(ElementAttributes attr) {
+ super(attr);
}
@Override
@@ -30,7 +29,7 @@ public class SevenSegHexShape extends SevenShape {
return onStyle;
int v = (int) input.getValueIgnoreBurn() & 0xf;
- v = table[v];
+ v = TABLE[v];
if ((v & (1 << i)) != 0)
return onStyle;
else
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java b/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
index 02a368417..4c831e45f 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SevenSegShape.java
@@ -2,14 +2,13 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins;
import de.neemann.digital.draw.graphics.Style;
import de.neemann.digital.draw.graphics.Vector;
-import java.awt.*;
-
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/**
@@ -19,8 +18,8 @@ public class SevenSegShape extends SevenShape {
private ObservableValue[] inputs;
private Pins pins;
- public SevenSegShape(String label, Color color) {
- super(label, color);
+ public SevenSegShape(ElementAttributes attr) {
+ super(attr);
}
@Override
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SevenShape.java b/src/main/java/de/neemann/digital/draw/shapes/SevenShape.java
index 86c635be4..f922a0c0e 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SevenShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SevenShape.java
@@ -1,5 +1,7 @@
package de.neemann.digital.draw.shapes;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.draw.graphics.Graphic;
import de.neemann.digital.draw.graphics.Polygon;
import de.neemann.digital.draw.graphics.Style;
@@ -23,9 +25,9 @@ public abstract class SevenShape implements Shape {
protected final Style onStyle;
protected final Style offStyle;
- public SevenShape(String label, Color color) {
- this.label = label;
- onStyle = new Style(8, true, color);
+ public SevenShape(ElementAttributes attr) {
+ this.label = attr.getLabel();
+ onStyle = new Style(8, true, attr.get(AttributeKey.Color));
offStyle = new Style(8, true, new Color(230, 230, 230));
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/Shape.java b/src/main/java/de/neemann/digital/draw/shapes/Shape.java
index 8c7be91e9..844498943 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/Shape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/Shape.java
@@ -1,8 +1,11 @@
package de.neemann.digital.draw.shapes;
+import de.neemann.digital.core.Model;
import de.neemann.digital.core.Observer;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pins;
+import de.neemann.digital.draw.model.ModelDescription;
+import de.neemann.digital.draw.model.ModelEntry;
/**
* @author hneemann
@@ -23,7 +26,7 @@ public interface Shape extends Drawable {
* shape can register the guiObserver to one of the the input or output ObservableValues.
* To access the actual state while drawing, the Shape needs to store the IOState in a member
* variable.
- *
+ *
* If the shape returns an interactor, this interactors clicked method is called if the
* shape is clicked in the running mode.
*
@@ -33,4 +36,14 @@ public interface Shape extends Drawable {
*/
Interactor applyStateMonitor(IOState ioState, Observer guiObserver);
+ /**
+ * Allows the shape to make its drawing dependent of the model.
+ * It is used by {@link DataShape} to create and show the data graph.
+ *
+ * @param modelDescription the models description
+ * @param model the model itself
+ * @param element the ModelElement this shape belongs to
+ */
+ default void registerModel(ModelDescription modelDescription, Model model, ModelEntry element) {
+ }
}
diff --git a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
index 347051dfa..7efddc3ce 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java
@@ -15,6 +15,7 @@ import de.neemann.digital.core.memory.RAMSinglePort;
import de.neemann.digital.core.wiring.*;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.gui.LibrarySelector;
+import de.neemann.digital.gui.components.data.DummyElement;
import de.neemann.digital.lang.Lang;
import java.util.HashMap;
@@ -42,24 +43,25 @@ public final class ShapeFactory {
map.put(RAMDualPort.DESCRIPTION.getName(), attr -> new RAMShape("RAM", RAMDualPort.DESCRIPTION.getInputNames(attr), outputInfos(RAMDualPort.DESCRIPTION, attr), attr.get(AttributeKey.Label)));
map.put(RAMSinglePort.DESCRIPTION.getName(), attr -> new RAMShape("RAM", RAMSinglePort.DESCRIPTION.getInputNames(attr), outputInfos(RAMSinglePort.DESCRIPTION, attr), attr.get(AttributeKey.Label)));
- map.put(In.DESCRIPTION.getName(), attr -> new InputShape(attr.get(AttributeKey.Label)));
- map.put(Reset.DESCRIPTION.getName(), attr -> new ResetShape(attr.get(AttributeKey.Label)));
- map.put(Const.DESCRIPTION.getName(), attr -> new ConstShape(attr.get(AttributeKey.Value)));
- map.put(Out.DESCRIPTION.getName(), attr -> new OutputShape(attr.get(AttributeKey.Label)));
- map.put(Out.LEDDESCRIPTION.getName(), attr -> new LEDShape(attr.get(AttributeKey.Label), attr.get(AttributeKey.Color)));
- map.put(Probe.DESCRIPTION.getName(), attr -> new ProbeShape(attr.get(AttributeKey.Label)));
- map.put(Clock.DESCRIPTION.getName(), attr -> new ClockShape(attr.get(AttributeKey.Label)));
- map.put(Out.SEVENDESCRIPTION.getName(), attr -> new SevenSegShape(attr.get(AttributeKey.Label), attr.get(AttributeKey.Color)));
- map.put(Out.SEVENHEXDESCRIPTION.getName(), attr -> new SevenSegHexShape(attr.get(AttributeKey.Label), attr.get(AttributeKey.Color)));
+ map.put(In.DESCRIPTION.getName(), InputShape::new);
+ map.put(Reset.DESCRIPTION.getName(), ResetShape::new);
+ map.put(Const.DESCRIPTION.getName(), ConstShape::new);
+ map.put(Out.DESCRIPTION.getName(), OutputShape::new);
+ map.put(Out.LEDDESCRIPTION.getName(), LEDShape::new);
+ map.put(Probe.DESCRIPTION.getName(), ProbeShape::new);
+ map.put(Clock.DESCRIPTION.getName(), ClockShape::new);
+ map.put(Out.SEVENDESCRIPTION.getName(), SevenSegShape::new);
+ map.put(Out.SEVENHEXDESCRIPTION.getName(), SevenSegHexShape::new);
+ map.put(DummyElement.DATADESCRIPTION.getName(), DataShape::new);
- map.put(Break.DESCRIPTION.getName(), attributes -> new BreakShape(attributes.get(AttributeKey.Label)));
+ map.put(Break.DESCRIPTION.getName(), BreakShape::new);
- map.put(Multiplexer.DESCRIPTION.getName(), attr -> new MuxerShape(attr.get(AttributeKey.SelectorBits), attr.get(AttributeKey.FlipSelPositon)));
- map.put(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr.get(AttributeKey.SelectorBits), true, attr.get(AttributeKey.FlipSelPositon)));
- map.put(Decoder.DESCRIPTION.getName(), attr -> new DemuxerShape(attr.get(AttributeKey.SelectorBits), false, attr.get(AttributeKey.FlipSelPositon)));
+ map.put(Multiplexer.DESCRIPTION.getName(), MuxerShape::new);
+ map.put(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, true));
+ map.put(Decoder.DESCRIPTION.getName(), attr -> new DemuxerShape(attr, false));
- map.put(Splitter.DESCRIPTION.getName(), attr -> new SplitterShape(attr.get(AttributeKey.InputSplit), attr.get(AttributeKey.OutputSplit)));
- map.put(Driver.DESCRIPTION.getName(), attr -> new DriverShape(attr.get(AttributeKey.FlipSelPositon)));
+ map.put(Splitter.DESCRIPTION.getName(), SplitterShape::new);
+ map.put(Driver.DESCRIPTION.getName(), DriverShape::new);
}
private OutputPinInfo[] outputInfos(ElementTypeDescription description, ElementAttributes attributes) {
diff --git a/src/main/java/de/neemann/digital/draw/shapes/SplitterShape.java b/src/main/java/de/neemann/digital/draw/shapes/SplitterShape.java
index 95d75207b..21c6cb5bb 100644
--- a/src/main/java/de/neemann/digital/draw/shapes/SplitterShape.java
+++ b/src/main/java/de/neemann/digital/draw/shapes/SplitterShape.java
@@ -2,6 +2,8 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.BitsException;
import de.neemann.digital.core.Observer;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.wiring.Splitter;
import de.neemann.digital.draw.elements.IOState;
import de.neemann.digital.draw.elements.Pin;
@@ -20,7 +22,9 @@ public class SplitterShape implements Shape {
private final int length;
private Pins pins;
- public SplitterShape(String inputDef, String outputDef) throws BitsException {
+ public SplitterShape(ElementAttributes attr) throws BitsException {
+ String inputDef = attr.get(AttributeKey.InputSplit);
+ String outputDef = attr.get(AttributeKey.OutputSplit);
inputs = new Splitter.Ports(inputDef).getNames();
outputs = new Splitter.Ports(outputDef).getNames();
length = (Math.max(inputs.length, outputs.length) - 1) * SIZE + 2;
diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java
index d5036703a..4b082e960 100644
--- a/src/main/java/de/neemann/digital/gui/Main.java
+++ b/src/main/java/de/neemann/digital/gui/Main.java
@@ -550,6 +550,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
@Override
public void hasChanged() {
try {
+ model.fireManualChangeEvent();
model.doStep();
circuitComponent.repaint();
} catch (NodeException | RuntimeException e) {
diff --git a/src/main/java/de/neemann/digital/gui/components/data/DataSample.java b/src/main/java/de/neemann/digital/gui/components/data/DataSample.java
index a6d9ab2ce..b03963bb5 100644
--- a/src/main/java/de/neemann/digital/gui/components/data/DataSample.java
+++ b/src/main/java/de/neemann/digital/gui/components/data/DataSample.java
@@ -56,9 +56,11 @@ public class DataSample {
*
* @param i the index of the value
* @param value the value
+ * @return this for chained calls
*/
- public void setValue(int i, long value) {
+ public DataSample setValue(int i, long value) {
values[i] = value;
+ return this;
}
/**
diff --git a/src/main/java/de/neemann/digital/gui/components/data/DataSet.java b/src/main/java/de/neemann/digital/gui/components/data/DataSet.java
index 33c266624..31278cf08 100644
--- a/src/main/java/de/neemann/digital/gui/components/data/DataSet.java
+++ b/src/main/java/de/neemann/digital/gui/components/data/DataSet.java
@@ -24,6 +24,23 @@ public class DataSet implements Iterable, Drawable {
private DataSample min;
private DataSample max;
+ /**
+ * Creates a simple dummy DataSet used for creating the DataShape
+ */
+ public DataSet() {
+ this(createDummy());
+ add(new DataSample(0, signalSize()));
+ add(new DataSample(1, signalSize()).setValue(1, 1));
+ }
+
+ private static ArrayList createDummy() {
+ ArrayList list = new ArrayList<>();
+ list.add(new Model.Signal("A", null));
+ list.add(new Model.Signal("B", null));
+ list.add(new Model.Signal("C", null));
+ return list;
+ }
+
/**
* Creates a new instance
*
@@ -173,4 +190,8 @@ public class DataSet implements Iterable, Drawable {
public int getGraphicHeight() {
return signalSize() * (SIZE + SEP) + 2 * BORDER;
}
+
+ public ArrayList getSignals() {
+ return signals;
+ }
}
diff --git a/src/main/java/de/neemann/digital/gui/components/data/DataSetDialog.java b/src/main/java/de/neemann/digital/gui/components/data/DataSetDialog.java
index 7a13e1760..1ce8bb9df 100644
--- a/src/main/java/de/neemann/digital/gui/components/data/DataSetDialog.java
+++ b/src/main/java/de/neemann/digital/gui/components/data/DataSetDialog.java
@@ -19,12 +19,10 @@ import java.util.List;
* @author hneemann
*/
public class DataSetDialog extends JDialog implements ModelStateObserver {
- private final ModelEvent.Event type;
private final ArrayList signals;
private final DataSetComponent dsc;
- private DataSample manualSample;
- private int maintime;
private DataSet dataSet;
+ private DataSetObserver dataSetObserver;
/**
* Creates a new instance
@@ -38,7 +36,6 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setAlwaysOnTop(true);
- this.type = type;
signals = model.getSignalsCopy();
new OrderMerger(ordering) {
@@ -50,6 +47,8 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
dataSet = new DataSet(signals);
+ dataSetObserver = new DataSetObserver(type, dataSet);
+
dsc = new DataSetComponent(dataSet);
JScrollPane scrollPane = new JScrollPane(dsc);
getContentPane().add(scrollPane);
@@ -75,21 +74,7 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
@Override
public void handleEvent(ModelEvent event) {
- if (event.getType() == ModelEvent.Event.MANUALCHANGE) {
- if (manualSample == null)
- manualSample = new DataSample(maintime, signals.size());
- manualSample.fillWith(signals);
- }
-
- if (event.getType() == type) {
- if (manualSample != null) {
- dataSet.add(manualSample);
- manualSample = null;
- maintime++;
- }
- dataSet.add(new DataSample(maintime, signals.size()).fillWith(signals));
- maintime++;
- }
+ dataSetObserver.handleEvent(event);
dsc.revalidate();
dsc.repaint();
}
diff --git a/src/main/java/de/neemann/digital/gui/components/data/DataSetObserver.java b/src/main/java/de/neemann/digital/gui/components/data/DataSetObserver.java
new file mode 100644
index 000000000..8ba931670
--- /dev/null
+++ b/src/main/java/de/neemann/digital/gui/components/data/DataSetObserver.java
@@ -0,0 +1,41 @@
+package de.neemann.digital.gui.components.data;
+
+import de.neemann.digital.core.ModelEvent;
+import de.neemann.digital.core.ModelStateObserver;
+
+/**
+ * @author hneemann
+ */
+public class DataSetObserver implements ModelStateObserver {
+
+ private final DataSet dataSet;
+ private final ModelEvent.Event type;
+
+ private DataSample manualSample;
+ private int maintime;
+
+ public DataSetObserver(ModelEvent.Event type, DataSet dataSet) {
+ this.type = type;
+ this.dataSet = dataSet;
+ }
+
+ @Override
+ public void handleEvent(ModelEvent event) {
+ if (event.getType() == ModelEvent.Event.MANUALCHANGE) {
+ if (manualSample == null)
+ manualSample = new DataSample(maintime, dataSet.signalSize());
+ manualSample.fillWith(dataSet.getSignals());
+ }
+
+ if (event.getType() == type) {
+ if (manualSample != null) {
+ dataSet.add(manualSample);
+ manualSample = null;
+ maintime++;
+ }
+ dataSet.add(new DataSample(maintime, dataSet.signalSize()).fillWith(dataSet.getSignals()));
+ maintime++;
+ }
+ }
+
+}
diff --git a/src/main/java/de/neemann/digital/gui/components/data/DummyElement.java b/src/main/java/de/neemann/digital/gui/components/data/DummyElement.java
new file mode 100644
index 000000000..a0fb3e0dc
--- /dev/null
+++ b/src/main/java/de/neemann/digital/gui/components/data/DummyElement.java
@@ -0,0 +1,46 @@
+package de.neemann.digital.gui.components.data;
+
+import de.neemann.digital.core.Model;
+import de.neemann.digital.core.NodeException;
+import de.neemann.digital.core.ObservableValue;
+import de.neemann.digital.core.element.AttributeKey;
+import de.neemann.digital.core.element.Element;
+import de.neemann.digital.core.element.ElementAttributes;
+import de.neemann.digital.core.element.ElementTypeDescription;
+
+/**
+ * Only a placeholder.
+ * Has no connections to the model!
+ *
+ * @author hneemann
+ */
+public class DummyElement implements Element {
+
+ /**
+ * The DataElement description
+ */
+ public static final ElementTypeDescription DATADESCRIPTION = new ElementTypeDescription("Data", DummyElement.class)
+ .addAttribute(AttributeKey.MicroStep);
+
+ /**
+ * Creates a new dummy element
+ *
+ * @param attr the attributes
+ */
+ public DummyElement(ElementAttributes attr) {
+ }
+
+ @Override
+ public void setInputs(ObservableValue... inputs) throws NodeException {
+ }
+
+ @Override
+ public ObservableValue[] getOutputs() {
+ return new ObservableValue[0];
+ }
+
+ @Override
+ public void registerNodes(Model model) {
+ }
+
+}
diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties
index 7e0354f86..4253d55d3 100644
--- a/src/main/resources/lang/lang_de.properties
+++ b/src/main/resources/lang/lang_de.properties
@@ -36,7 +36,7 @@ key_showListing=Zeige Listing an, wenn verf\u00FCgbar
key_showDataTable=Zeige Messwertetabelle
key_showDataGraph=Zeige Messwertegraph
key_startClock=Starte den Takt
-
+key_microStep=Zeige Mikroschritte
rot_0=0\u00B0
rot_90=90\u00B0
diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties
index 8cbefbd3b..2161354c7 100644
--- a/src/main/resources/lang/lang_en.properties
+++ b/src/main/resources/lang/lang_en.properties
@@ -36,6 +36,7 @@ key_showListing=Show list file if available
key_showDataTable=Show measurement values
key_showDataGraph=Show measurement graph
key_startClock=Start timer
+key_microStep=Show micro steps
rot_0=0\u00B0
rot_90=90\u00B0