added measurement dialog

This commit is contained in:
hneemann 2016-04-02 22:09:39 +02:00
parent 4606fe443e
commit a71bcffc66
12 changed files with 1539 additions and 1418 deletions

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<circuit> <circuit>
<version>1</version>
<attributes> <attributes>
<entry> <entry>
<string>Width</string> <string>Width</string>
@ -10,6 +11,10 @@
<visualElement> <visualElement>
<elementName>Register</elementName> <elementName>Register</elementName>
<elementAttributes> <elementAttributes>
<entry>
<string>valueIsProbe</string>
<boolean>true</boolean>
</entry>
<entry> <entry>
<string>Label</string> <string>Label</string>
<string>PC</string> <string>PC</string>
@ -19,7 +24,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="130" y="70"/> <pos x="260" y="140"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -34,7 +39,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="80" y="170"/> <pos x="160" y="340"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -49,7 +54,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="210" y="80"/> <pos x="420" y="160"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -60,7 +65,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="200" y="90"/> <pos x="400" y="180"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -71,7 +76,7 @@
<int>0</int> <int>0</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="200" y="100"/> <pos x="400" y="200"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -86,7 +91,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="320" y="80"/> <pos x="640" y="160"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -94,9 +99,7 @@
<elementAttributes> <elementAttributes>
<entry> <entry>
<string>rotation</string> <string>rotation</string>
<de.neemann.digital.core.element.Rotation> <rotation rotation="3"/>
<rotation>3</rotation>
</de.neemann.digital.core.element.Rotation>
</entry> </entry>
<entry> <entry>
<string>Label</string> <string>Label</string>
@ -107,7 +110,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="170" y="210"/> <pos x="340" y="420"/>
<rotate>3</rotate> <rotate>3</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -122,7 +125,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="290" y="160"/> <pos x="580" y="320"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -133,7 +136,7 @@
<string>C</string> <string>C</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="80" y="80"/> <pos x="160" y="160"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -144,7 +147,7 @@
<int>0</int> <int>0</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="280" y="180"/> <pos x="560" y="360"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -155,7 +158,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="340" y="140"/> <pos x="680" y="280"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -166,7 +169,7 @@
<int>16</int> <int>16</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="380" y="150"/> <pos x="760" y="300"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -174,16 +177,14 @@
<elementAttributes> <elementAttributes>
<entry> <entry>
<string>rotation</string> <string>rotation</string>
<de.neemann.digital.core.element.Rotation> <rotation rotation="1"/>
<rotation>1</rotation>
</de.neemann.digital.core.element.Rotation>
</entry> </entry>
<entry> <entry>
<string>Label</string> <string>Label</string>
<string>abs</string> <string>abs</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="390" y="210"/> <pos x="780" y="420"/>
<rotate>1</rotate> <rotate>1</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -191,22 +192,20 @@
<elementAttributes> <elementAttributes>
<entry> <entry>
<string>rotation</string> <string>rotation</string>
<de.neemann.digital.core.element.Rotation> <rotation rotation="1"/>
<rotation>1</rotation>
</de.neemann.digital.core.element.Rotation>
</entry> </entry>
<entry> <entry>
<string>Label</string> <string>Label</string>
<string>rel</string> <string>rel</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="350" y="210"/> <pos x="700" y="420"/>
<rotate>1</rotate> <rotate>1</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
<elementName>Not</elementName> <elementName>Not</elementName>
<elementAttributes/> <elementAttributes/>
<pos x="90" y="80"/> <pos x="180" y="160"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
<visualElement> <visualElement>
@ -217,138 +216,138 @@
<string>Reset</string> <string>Reset</string>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="110" y="110"/> <pos x="220" y="220"/>
<rotate>0</rotate> <rotate>0</rotate>
</visualElement> </visualElement>
</visualElements> </visualElements>
<wires> <wires>
<wire> <wire>
<p1 x="80" y="80"/> <p1 x="160" y="160"/>
<p2 x="90" y="80"/> <p2 x="180" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="110" y="80"/> <p1 x="220" y="160"/>
<p2 x="130" y="80"/> <p2 x="260" y="160"/>
</wire>
<wire>
<p1 x="160" y="80"/>
<p2 x="170" y="80"/>
</wire>
<wire>
<p1 x="240" y="80"/>
<p2 x="270" y="80"/>
</wire>
<wire>
<p1 x="270" y="80"/>
<p2 x="320" y="80"/>
</wire>
<wire>
<p1 x="170" y="80"/>
<p2 x="210" y="80"/>
</wire>
<wire>
<p1 x="270" y="160"/>
<p2 x="290" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="320" y="160"/> <p1 x="320" y="160"/>
<p2 x="340" y="160"/> <p2 x="340" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="400" y="160"/> <p1 x="480" y="160"/>
<p2 x="410" y="160"/> <p2 x="540" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="200" y="100"/> <p1 x="540" y="160"/>
<p2 x="210" y="100"/> <p2 x="640" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="280" y="180"/> <p1 x="340" y="160"/>
<p2 x="290" y="180"/> <p2 x="420" y="160"/>
</wire> </wire>
<wire> <wire>
<p1 x="360" y="150"/> <p1 x="540" y="320"/>
<p2 x="380" y="150"/> <p2 x="580" y="320"/>
</wire> </wire>
<wire> <wire>
<p1 x="120" y="70"/> <p1 x="640" y="320"/>
<p2 x="130" y="70"/> <p2 x="680" y="320"/>
</wire> </wire>
<wire> <wire>
<p1 x="120" y="40"/> <p1 x="800" y="320"/>
<p2 x="410" y="40"/> <p2 x="820" y="320"/>
</wire> </wire>
<wire> <wire>
<p1 x="240" y="200"/> <p1 x="240" y="80"/>
<p2 x="370" y="200"/> <p2 x="820" y="80"/>
</wire> </wire>
<wire> <wire>
<p1 x="200" y="90"/> <p1 x="480" y="400"/>
<p2 x="210" y="90"/> <p2 x="740" y="400"/>
</wire> </wire>
<wire> <wire>
<p1 x="120" y="90"/> <p1 x="400" y="180"/>
<p2 x="130" y="90"/> <p2 x="420" y="180"/>
</wire> </wire>
<wire> <wire>
<p1 x="80" y="170"/> <p1 x="240" y="180"/>
<p2 x="240" y="170"/> <p2 x="260" y="180"/>
</wire> </wire>
<wire> <wire>
<p1 x="370" y="170"/> <p1 x="160" y="340"/>
<p2 x="380" y="170"/> <p2 x="480" y="340"/>
</wire> </wire>
<wire> <wire>
<p1 x="240" y="170"/> <p1 x="740" y="340"/>
<p2 x="290" y="170"/> <p2 x="760" y="340"/>
</wire> </wire>
<wire> <wire>
<p1 x="270" y="140"/> <p1 x="480" y="340"/>
<p2 x="340" y="140"/> <p2 x="580" y="340"/>
</wire> </wire>
<wire> <wire>
<p1 x="110" y="110"/> <p1 x="400" y="200"/>
<p2 x="120" y="110"/> <p2 x="420" y="200"/>
</wire> </wire>
<wire> <wire>
<p1 x="240" y="170"/> <p1 x="560" y="360"/>
<p2 x="240" y="200"/> <p2 x="580" y="360"/>
</wire> </wire>
<wire> <wire>
<p1 x="370" y="170"/> <p1 x="540" y="280"/>
<p2 x="370" y="200"/> <p2 x="680" y="280"/>
</wire> </wire>
<wire> <wire>
<p1 x="390" y="170"/> <p1 x="720" y="300"/>
<p2 x="390" y="210"/> <p2 x="760" y="300"/>
</wire> </wire>
<wire> <wire>
<p1 x="120" y="40"/> <p1 x="240" y="140"/>
<p2 x="120" y="70"/> <p2 x="260" y="140"/>
</wire> </wire>
<wire> <wire>
<p1 x="120" y="90"/> <p1 x="220" y="220"/>
<p2 x="120" y="110"/> <p2 x="240" y="220"/>
</wire> </wire>
<wire> <wire>
<p1 x="170" y="80"/> <p1 x="480" y="340"/>
<p2 x="170" y="210"/> <p2 x="480" y="400"/>
</wire> </wire>
<wire> <wire>
<p1 x="410" y="40"/> <p1 x="240" y="80"/>
<p2 x="410" y="160"/> <p2 x="240" y="140"/>
</wire> </wire>
<wire> <wire>
<p1 x="350" y="160"/> <p1 x="240" y="180"/>
<p2 x="350" y="210"/> <p2 x="240" y="220"/>
</wire> </wire>
<wire> <wire>
<p1 x="270" y="80"/> <p1 x="740" y="340"/>
<p2 x="270" y="140"/> <p2 x="740" y="400"/>
</wire> </wire>
<wire> <wire>
<p1 x="270" y="140"/> <p1 x="340" y="160"/>
<p2 x="270" y="160"/> <p2 x="340" y="420"/>
</wire>
<wire>
<p1 x="820" y="80"/>
<p2 x="820" y="320"/>
</wire>
<wire>
<p1 x="780" y="340"/>
<p2 x="780" y="420"/>
</wire>
<wire>
<p1 x="700" y="320"/>
<p2 x="700" y="420"/>
</wire>
<wire>
<p1 x="540" y="160"/>
<p2 x="540" y="280"/>
</wire>
<wire>
<p1 x="540" y="280"/>
<p2 x="540" y="320"/>
</wire> </wire>
</wires> </wires>
</circuit> </circuit>

View File

@ -238,42 +238,12 @@
</entry> </entry>
<entry> <entry>
<string>Frequency</string> <string>Frequency</string>
<int>1000</int> <int>200</int>
</entry> </entry>
</elementAttributes> </elementAttributes>
<pos x="1040" y="460"/> <pos x="1040" y="460"/>
<rotate>2</rotate> <rotate>2</rotate>
</visualElement> </visualElement>
<visualElement>
<elementName>Probe</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>R0</string>
</entry>
<entry>
<string>Bits</string>
<int>16</int>
</entry>
</elementAttributes>
<pos x="640" y="60"/>
<rotate>0</rotate>
</visualElement>
<visualElement>
<elementName>Probe</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>R1</string>
</entry>
<entry>
<string>Bits</string>
<int>16</int>
</entry>
</elementAttributes>
<pos x="740" y="60"/>
<rotate>0</rotate>
</visualElement>
<visualElement> <visualElement>
<elementName>GPO.dig</elementName> <elementName>GPO.dig</elementName>
<elementAttributes/> <elementAttributes/>
@ -444,14 +414,6 @@
<p1 x="1440" y="500"/> <p1 x="1440" y="500"/>
<p2 x="1500" y="580"/> <p2 x="1500" y="580"/>
</wire> </wire>
<wire>
<p1 x="620" y="80"/>
<p2 x="640" y="60"/>
</wire>
<wire>
<p1 x="720" y="80"/>
<p2 x="740" y="60"/>
</wire>
<wire> <wire>
<p1 x="620" y="640"/> <p1 x="620" y="640"/>
<p2 x="920" y="640"/> <p2 x="920" y="640"/>
@ -546,7 +508,7 @@
</wire> </wire>
<wire> <wire>
<p1 x="560" y="140"/> <p1 x="560" y="140"/>
<p2 x="720" y="140"/> <p2 x="680" y="140"/>
</wire> </wire>
<wire> <wire>
<p1 x="1100" y="140"/> <p1 x="1100" y="140"/>
@ -641,7 +603,7 @@
<p2 x="1120" y="220"/> <p2 x="1120" y="220"/>
</wire> </wire>
<wire> <wire>
<p1 x="760" y="160"/> <p1 x="680" y="160"/>
<p2 x="840" y="160"/> <p2 x="840" y="160"/>
</wire> </wire>
<wire> <wire>
@ -664,10 +626,6 @@
<p1 x="160" y="160"/> <p1 x="160" y="160"/>
<p2 x="200" y="160"/> <p2 x="200" y="160"/>
</wire> </wire>
<wire>
<p1 x="560" y="160"/>
<p2 x="740" y="160"/>
</wire>
<wire> <wire>
<p1 x="840" y="160"/> <p1 x="840" y="160"/>
<p2 x="860" y="160"/> <p2 x="860" y="160"/>
@ -768,10 +726,6 @@
<p1 x="620" y="560"/> <p1 x="620" y="560"/>
<p2 x="680" y="560"/> <p2 x="680" y="560"/>
</wire> </wire>
<wire>
<p1 x="560" y="180"/>
<p2 x="760" y="180"/>
</wire>
<wire> <wire>
<p1 x="960" y="180"/> <p1 x="960" y="180"/>
<p2 x="1000" y="180"/> <p2 x="1000" y="180"/>
@ -797,7 +751,7 @@
<p2 x="200" y="180"/> <p2 x="200" y="180"/>
</wire> </wire>
<wire> <wire>
<p1 x="760" y="180"/> <p1 x="680" y="180"/>
<p2 x="780" y="180"/> <p2 x="780" y="180"/>
</wire> </wire>
<wire> <wire>
@ -809,7 +763,7 @@
<p2 x="140" y="440"/> <p2 x="140" y="440"/>
</wire> </wire>
<wire> <wire>
<p1 x="740" y="120"/> <p1 x="560" y="120"/>
<p2 x="860" y="120"/> <p2 x="860" y="120"/>
</wire> </wire>
<wire> <wire>
@ -824,10 +778,6 @@
<p1 x="180" y="120"/> <p1 x="180" y="120"/>
<p2 x="200" y="120"/> <p2 x="200" y="120"/>
</wire> </wire>
<wire>
<p1 x="560" y="120"/>
<p2 x="620" y="120"/>
</wire>
<wire> <wire>
<p1 x="440" y="120"/> <p1 x="440" y="120"/>
<p2 x="460" y="120"/> <p2 x="460" y="120"/>
@ -908,10 +858,6 @@
<p1 x="400" y="320"/> <p1 x="400" y="320"/>
<p2 x="400" y="420"/> <p2 x="400" y="420"/>
</wire> </wire>
<wire>
<p1 x="720" y="80"/>
<p2 x="720" y="140"/>
</wire>
<wire> <wire>
<p1 x="660" y="480"/> <p1 x="660" y="480"/>
<p2 x="660" y="540"/> <p2 x="660" y="540"/>
@ -964,10 +910,6 @@
<p1 x="420" y="200"/> <p1 x="420" y="200"/>
<p2 x="420" y="480"/> <p2 x="420" y="480"/>
</wire> </wire>
<wire>
<p1 x="740" y="120"/>
<p2 x="740" y="160"/>
</wire>
<wire> <wire>
<p1 x="740" y="400"/> <p1 x="740" y="400"/>
<p2 x="740" y="580"/> <p2 x="740" y="580"/>
@ -976,6 +918,14 @@
<p1 x="680" y="460"/> <p1 x="680" y="460"/>
<p2 x="680" y="560"/> <p2 x="680" y="560"/>
</wire> </wire>
<wire>
<p1 x="680" y="140"/>
<p2 x="680" y="160"/>
</wire>
<wire>
<p1 x="680" y="160"/>
<p2 x="680" y="180"/>
</wire>
<wire> <wire>
<p1 x="1320" y="260"/> <p1 x="1320" y="260"/>
<p2 x="1320" y="620"/> <p2 x="1320" y="620"/>
@ -1004,10 +954,6 @@
<p1 x="1260" y="300"/> <p1 x="1260" y="300"/>
<p2 x="1260" y="420"/> <p2 x="1260" y="420"/>
</wire> </wire>
<wire>
<p1 x="620" y="80"/>
<p2 x="620" y="120"/>
</wire>
<wire> <wire>
<p1 x="1200" y="200"/> <p1 x="1200" y="200"/>
<p2 x="1200" y="380"/> <p2 x="1200" y="380"/>
@ -1040,10 +986,6 @@
<p1 x="1400" y="20"/> <p1 x="1400" y="20"/>
<p2 x="1400" y="180"/> <p2 x="1400" y="180"/>
</wire> </wire>
<wire>
<p1 x="760" y="160"/>
<p2 x="760" y="180"/>
</wire>
<wire> <wire>
<p1 x="1020" y="420"/> <p1 x="1020" y="420"/>
<p2 x="1020" y="460"/> <p2 x="1020" y="460"/>

File diff suppressed because it is too large Load Diff

View File

@ -239,7 +239,7 @@ public class Model {
return signals; return signals;
} }
public static class Signal { public static class Signal implements Comparable<Signal> {
private final String name; private final String name;
private final ObservableValue value; private final ObservableValue value;
@ -248,6 +248,19 @@ public class Model {
this.name = name; this.name = name;
this.value = value; this.value = value;
} }
public String getName() {
return name;
}
public ObservableValue getValue() {
return value;
}
@Override
public int compareTo(Signal o) {
return name.compareTo(o.name);
}
} }
} }

View File

@ -27,6 +27,7 @@ public class AttributeKey<VALUE> {
public static final AttributeKey<Integer> TermWidth = new AttributeKey<>("termWidth", Lang.get("key_termWidth"), 50); public static final AttributeKey<Integer> TermWidth = new AttributeKey<>("termWidth", Lang.get("key_termWidth"), 50);
public static final AttributeKey<Integer> TermHeight = new AttributeKey<>("termHeight", Lang.get("key_termHeight"), 25); public static final AttributeKey<Integer> TermHeight = new AttributeKey<>("termHeight", Lang.get("key_termHeight"), 25);
public static final AttributeKey<Integer> Cycles = new AttributeKey<>("Cycles", Lang.get("key_cycles"), 100000); public static final AttributeKey<Integer> Cycles = new AttributeKey<>("Cycles", Lang.get("key_cycles"), 100000);
public static final AttributeKey<Boolean> ValueIsProbe = new AttributeKey<>("valueIsProbe", Lang.get("key_valueIsProbe"), false);
private final String key; private final String key;

View File

@ -26,10 +26,6 @@ public class Probe implements Element {
label = attributes.get(AttributeKey.Label); label = attributes.get(AttributeKey.Label);
} }
public Probe(int bits) {
label = null;
}
@Override @Override
public void setInputs(ObservableValue... inputs) throws NodeException { public void setInputs(ObservableValue... inputs) throws NodeException {
value = inputs[0]; value = inputs[0];

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.memory; package de.neemann.digital.core.memory;
import de.neemann.digital.core.BitsException; import de.neemann.digital.core.*;
import de.neemann.digital.core.Node;
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.AttributeKey;
import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
@ -19,9 +16,12 @@ public class Register extends Node implements Element {
.addAttribute(AttributeKey.Rotate) .addAttribute(AttributeKey.Rotate)
.addAttribute(AttributeKey.Bits) .addAttribute(AttributeKey.Bits)
.addAttribute(AttributeKey.Label) .addAttribute(AttributeKey.Label)
.addAttribute(AttributeKey.ValueIsProbe)
.setShortName("Reg"); .setShortName("Reg");
private final int bits; private final int bits;
private final boolean isProbe;
private final String label;
private ObservableValue dVal; private ObservableValue dVal;
private ObservableValue clockVal; private ObservableValue clockVal;
private ObservableValue enableVal; private ObservableValue enableVal;
@ -32,6 +32,8 @@ public class Register extends Node implements Element {
public Register(ElementAttributes attributes) { public Register(ElementAttributes attributes) {
bits = attributes.getBits(); bits = attributes.getBits();
this.q = new ObservableValue("Q", bits); this.q = new ObservableValue("Q", bits);
isProbe = attributes.get(AttributeKey.ValueIsProbe);
label = attributes.get(AttributeKey.Label);
} }
@Override @Override
@ -60,4 +62,10 @@ public class Register extends Node implements Element {
return new ObservableValue[]{q}; return new ObservableValue[]{q};
} }
@Override
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
}
} }

View File

@ -12,6 +12,7 @@ import de.neemann.digital.draw.model.RealTimeClock;
import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.draw.shapes.ShapeFactory;
import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.components.CircuitComponent;
import de.neemann.digital.gui.components.ElementOrderer; import de.neemann.digital.gui.components.ElementOrderer;
import de.neemann.digital.gui.components.ProbeDialog;
import de.neemann.digital.gui.state.State; import de.neemann.digital.gui.state.State;
import de.neemann.digital.gui.state.StateManager; import de.neemann.digital.gui.state.StateManager;
import de.neemann.digital.lang.Lang; import de.neemann.digital.lang.Lang;
@ -53,6 +54,8 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
private final ToolTipAction runToBreak; private final ToolTipAction runToBreak;
private final ElementLibrary library; private final ElementLibrary library;
private final JCheckBoxMenuItem runClock; private final JCheckBoxMenuItem runClock;
private final JCheckBoxMenuItem showProbes;
private final JCheckBoxMenuItem traceEnable;
private final LibrarySelector librarySelector; private final LibrarySelector librarySelector;
private final ShapeFactory shapeFactory; private final ShapeFactory shapeFactory;
private final SavedListener savedListener; private final SavedListener savedListener;
@ -280,16 +283,19 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
} }
}.setToolTip(Lang.get("menu_speedTest_tt")); }.setToolTip(Lang.get("menu_speedTest_tt"));
JCheckBoxMenuItem traceEnable = new JCheckBoxMenuItem(Lang.get("menu_trace")); showProbes = new JCheckBoxMenuItem(Lang.get("menu_probe"));
runClock = new JCheckBoxMenuItem(Lang.get("menu_runClock"), true); showProbes.setToolTipText(Lang.get("menu_probe_tt"));
traceEnable = new JCheckBoxMenuItem(Lang.get("menu_trace"));
runClock = new JCheckBoxMenuItem(Lang.get("menu_runClock"));
runClock.setToolTipText(Lang.get("menu_runClock_tt")); runClock.setToolTipText(Lang.get("menu_runClock_tt"));
run.add(runModelAction.createJMenuItem()); run.add(runModelAction.createJMenuItem());
run.add(runModelMicroAction.createJMenuItem()); run.add(runModelMicroAction.createJMenuItem());
run.add(doStep.createJMenuItem()); run.add(doStep.createJMenuItem());
run.add(runToBreak.createJMenuItem()); run.add(runToBreak.createJMenuItem());
run.add(speedTest.createJMenuItem()); //run.add(speedTest.createJMenuItem());
run.add(traceEnable); run.add(showProbes);
//run.add(traceEnable);
run.add(runClock); run.add(runClock);
doStep.setEnabled(false); doStep.setEnabled(false);
@ -390,6 +396,11 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
runToBreak.setEnabled(!runClock && model.isFastRunModel()); runToBreak.setEnabled(!runClock && model.isFastRunModel());
if (showProbes.isSelected())
new ProbeDialog(this, model, updateEvent).setVisible(true);
model.init(); model.init();
} catch (NodeException e) { } catch (NodeException e) {

View File

@ -402,13 +402,15 @@ public class CircuitComponent extends JComponent {
corner1 = getPosVector(e); corner1 = getPosVector(e);
wasRealyDragged = false; wasRealyDragged = false;
} else { } else {
if (e.getButton() == MouseEvent.BUTTON1) { if (corner2 != null) {
elements = circuit.getElementsToMove(Vector.min(corner1, corner2), Vector.max(corner1, corner2)); if (e.getButton() == MouseEvent.BUTTON1) {
state = State.MOVE; elements = circuit.getElementsToMove(Vector.min(corner1, corner2), Vector.max(corner1, corner2));
} else { state = State.MOVE;
elements = circuit.getElementsToCopy(Vector.min(corner1, corner2), Vector.max(corner1, corner2), shapeFactory); } else {
copyStartPosition = raster(getPosVector(e)); elements = circuit.getElementsToCopy(Vector.min(corner1, corner2), Vector.max(corner1, corner2), shapeFactory);
state = State.COPY; copyStartPosition = raster(getPosVector(e));
state = State.COPY;
}
} }
lastPos = getPosVector(e); lastPos = getPosVector(e);
} }

View File

@ -0,0 +1,123 @@
package de.neemann.digital.gui.components;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelStateObserver;
import de.neemann.digital.lang.Lang;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Collections;
/**
* @author hneemann
*/
public class ProbeDialog extends JDialog implements ModelStateObserver {
private final ModelEvent.Event type;
private final SignalTableModel tableModel;
public ProbeDialog(Frame owner, Model model, ModelEvent.Event type) {
super(owner, Lang.get("win_measures"), false);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.type = type;
ArrayList<Model.Signal> signals = model.getSignals();
Collections.sort(signals);
tableModel = new SignalTableModel(signals);
JTable list = new JTable(tableModel);
getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);
setAlwaysOnTop(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
model.addObserver(ProbeDialog.this);
}
@Override
public void windowClosed(WindowEvent e) {
model.removeObserver(ProbeDialog.this);
}
});
setPreferredSize(new Dimension(150, getPreferredSize().height));
pack();
setLocationRelativeTo(owner);
}
@Override
public void handleEvent(ModelEvent event) {
if (event.getType() == type) {
tableModel.fireChanged();
}
}
private class SignalTableModel implements TableModel {
private final ArrayList<Model.Signal> signals;
private ArrayList<TableModelListener> listeners = new ArrayList<>();
public SignalTableModel(ArrayList<Model.Signal> signals) {
this.signals = signals;
}
@Override
public int getRowCount() {
return signals.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int columnIndex) {
if (columnIndex == 0) return Lang.get("key_label");
else return Lang.get("key_value");
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) return signals.get(rowIndex).getName();
else return signals.get(rowIndex).getValue().getValueString();
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}
@Override
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
@Override
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public void fireChanged() {
TableModelEvent e = new TableModelEvent(this, 0, signals.size() - 1);
for (TableModelListener l : listeners)
l.tableChanged(e);
}
}
}

View File

@ -31,6 +31,8 @@ key_width=Breite
key_cycles=Timeout Zyklen key_cycles=Timeout Zyklen
key_termWidth=Zeichen pro Zeile key_termWidth=Zeichen pro Zeile
key_termHeight=Zeilen key_termHeight=Zeilen
key_valueIsProbe=Als Messwert anzeigen
rot_0=0\u00B0 rot_0=0\u00B0
rot_90=90\u00B0 rot_90=90\u00B0
@ -137,8 +139,11 @@ menu_exportSVG=Export SVG
menu_exportSVGLaTex=Export SVG+LaTeX menu_exportSVGLaTex=Export SVG+LaTeX
menu_delete=L\u00F6schen menu_delete=L\u00F6schen
menu_delete_tt=L\u00F6scht ausgew\u00E4hlte Elemente menu_delete_tt=L\u00F6scht ausgew\u00E4hlte Elemente
menu_probe=Zeige Messwerte
menu_probe_tt=Zeigt die Messwerte in einem eigenen Fenster
menu_about=\u00DCber Digital menu_about=\u00DCber Digital
win_saveChanges=\u00C4nderungen speichern? win_saveChanges=\u00C4nderungen speichern?
win_confirmExit=Beenden best\u00E4tigen! win_confirmExit=Beenden best\u00E4tigen!
win_stateChanged=Die Datei wurde ver\u00E4ndert! win_stateChanged=Die Datei wurde ver\u00E4ndert!
win_measures=Messwerte

View File

@ -31,6 +31,7 @@ key_width=Width
key_cycles=Timeout cycles key_cycles=Timeout cycles
key_termWidth=Characters per line key_termWidth=Characters per line
key_termHeight=Lines key_termHeight=Lines
key_valueIsProbe=Is measurment value
rot_0=0\u00B0 rot_0=0\u00B0
rot_90=90\u00B0 rot_90=90\u00B0
@ -138,7 +139,10 @@ menu_exportSVG=Export SVG
menu_exportSVGLaTex=Export SVG+LaTeX menu_exportSVGLaTex=Export SVG+LaTeX
menu_delete=Delete elements menu_delete=Delete elements
menu_delete_tt=Delete selected single element or group of elements menu_delete_tt=Delete selected single element or group of elements
menu_probe=Show Probe Values
menu_probe_tt=Shows values of probes in separate window
win_saveChanges=Save Changes? win_saveChanges=Save Changes?
win_confirmExit=Confirm Exit! win_confirmExit=Confirm Exit!
win_stateChanged=State Changed! win_stateChanged=State Changed!
win_measures=Measurments