mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-15 07:48:29 -04:00
Started to implement a Break-element
This commit is contained in:
parent
6d22fe81a7
commit
6074a02724
@ -1,5 +1,6 @@
|
|||||||
package de.neemann.digital.core;
|
package de.neemann.digital.core;
|
||||||
|
|
||||||
|
import de.neemann.digital.core.wiring.Break;
|
||||||
import de.neemann.digital.core.wiring.Clock;
|
import de.neemann.digital.core.wiring.Clock;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -12,10 +13,11 @@ public class ModelEvent {
|
|||||||
|
|
||||||
public static final ModelEvent STEP = new ModelEvent(Event.STEP);
|
public static final ModelEvent STEP = new ModelEvent(Event.STEP);
|
||||||
|
|
||||||
public enum Event {STARTED, STOPPED, FETCHCLOCK, STEP}
|
public enum Event {STARTED, STOPPED, FETCHCLOCK, FETCHBREAK, STEP}
|
||||||
|
|
||||||
private final Event event;
|
private final Event event;
|
||||||
private ArrayList<Clock> clocks;
|
private ArrayList<Clock> clocks;
|
||||||
|
private ArrayList<Break> breaks;
|
||||||
|
|
||||||
public ModelEvent(Event event) {
|
public ModelEvent(Event event) {
|
||||||
this.event = event;
|
this.event = event;
|
||||||
@ -34,4 +36,14 @@ public class ModelEvent {
|
|||||||
public ArrayList<Clock> getClocks() {
|
public ArrayList<Clock> getClocks() {
|
||||||
return clocks;
|
return clocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void registerBreak(Break aBreak) {
|
||||||
|
if (breaks == null)
|
||||||
|
breaks = new ArrayList<Break>();
|
||||||
|
breaks.add(aBreak);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Break> getBreaks() {
|
||||||
|
return breaks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ public class AttributeKey<VALUE> {
|
|||||||
public static final AttributeKey<Boolean> FlipSelPositon = new AttributeKey<>("flipSelPos", Lang.get("key_flipSelPos"), false);
|
public static final AttributeKey<Boolean> FlipSelPositon = new AttributeKey<>("flipSelPos", Lang.get("key_flipSelPos"), false);
|
||||||
public static final AttributeKey<Rotation> Rotate = new AttributeKey<>("rotation", Lang.get("key_rotation"), new Rotation(0));
|
public static final AttributeKey<Rotation> Rotate = new AttributeKey<>("rotation", Lang.get("key_rotation"), new Rotation(0));
|
||||||
public static final AttributeKey<Integer> Width = new AttributeKey<>("Width", Lang.get("key_width"), 3);
|
public static final AttributeKey<Integer> Width = new AttributeKey<>("Width", Lang.get("key_width"), 3);
|
||||||
|
public static final AttributeKey<Integer> Cycles = new AttributeKey<>("Cycles", Lang.get("key_cycles"), 100000);
|
||||||
|
|
||||||
|
|
||||||
private final String key;
|
private final String key;
|
||||||
|
61
src/main/java/de/neemann/digital/core/wiring/Break.java
Normal file
61
src/main/java/de/neemann/digital/core/wiring/Break.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package de.neemann.digital.core.wiring;
|
||||||
|
|
||||||
|
import de.neemann.digital.core.*;
|
||||||
|
import de.neemann.digital.core.element.AttributeKey;
|
||||||
|
import de.neemann.digital.core.element.Element;
|
||||||
|
import de.neemann.digital.core.element.ElementTypeDescription;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author hneemann
|
||||||
|
*/
|
||||||
|
public class Break implements Element {
|
||||||
|
|
||||||
|
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Break.class, "brk")
|
||||||
|
.addAttribute(AttributeKey.Rotate)
|
||||||
|
.addAttribute(AttributeKey.Label)
|
||||||
|
.addAttribute(AttributeKey.Cycles);
|
||||||
|
|
||||||
|
|
||||||
|
private ObservableValue input;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setInputs(ObservableValue... inputs) throws NodeException {
|
||||||
|
input = inputs[0].checkBits(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObservableValue getInput() {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ObservableValue[] getOutputs() {
|
||||||
|
return new ObservableValue[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerNodes(Model model) {
|
||||||
|
model.addObserver(new MyModelStateObserver(model, this));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MyModelStateObserver implements ModelStateObserver {
|
||||||
|
private final Model model;
|
||||||
|
private final Break aBreak;
|
||||||
|
|
||||||
|
public MyModelStateObserver(Model model, Break aBreak) {
|
||||||
|
this.model = model;
|
||||||
|
this.aBreak = aBreak;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleEvent(ModelEvent event) {
|
||||||
|
switch (event.getType()) {
|
||||||
|
case FETCHBREAK:
|
||||||
|
event.registerBreak(aBreak);
|
||||||
|
break;
|
||||||
|
case STARTED:
|
||||||
|
model.removeObserver(this);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,11 +22,13 @@ public class Clock implements Element {
|
|||||||
|
|
||||||
private final ObservableValue output;
|
private final ObservableValue output;
|
||||||
private final int frequency;
|
private final int frequency;
|
||||||
public boolean startThisTimer = true;
|
private MyModelStateObserver observer;
|
||||||
|
|
||||||
public Clock(ElementAttributes attributes) {
|
public Clock(ElementAttributes attributes) {
|
||||||
output = new ObservableValue("C", 1);
|
output = new ObservableValue("C", 1);
|
||||||
frequency = attributes.get(AttributeKey.Frequency);
|
int f = attributes.get(AttributeKey.Frequency);
|
||||||
|
if (f < 1) f = 1;
|
||||||
|
frequency = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -40,19 +42,33 @@ public class Clock implements Element {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void disableTimer() {
|
public void disableTimer() {
|
||||||
this.startThisTimer = false;
|
observer.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerNodes(Model model) {
|
public void registerNodes(Model model) {
|
||||||
model.addObserver(new ModelStateObserver() {
|
observer = new MyModelStateObserver(model, this, frequency, output);
|
||||||
public Timer timer;
|
model.addObserver(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class MyModelStateObserver implements ModelStateObserver {
|
||||||
|
private final Model model;
|
||||||
|
private final Clock clock;
|
||||||
|
private final int frequency;
|
||||||
|
private final ObservableValue output;
|
||||||
|
private Timer timer;
|
||||||
|
|
||||||
|
public MyModelStateObserver(Model model, Clock clock, int frequency, ObservableValue output) {
|
||||||
|
this.model = model;
|
||||||
|
this.clock = clock;
|
||||||
|
this.frequency = frequency;
|
||||||
|
this.output = output;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(ModelEvent event) {
|
public void handleEvent(ModelEvent event) {
|
||||||
switch (event.getType()) {
|
switch (event.getType()) {
|
||||||
case STARTED:
|
case STARTED:
|
||||||
if (startThisTimer) {
|
|
||||||
int delay = 1000 / frequency;
|
int delay = 1000 / frequency;
|
||||||
if (delay < 100) delay = 100;
|
if (delay < 100) delay = 100;
|
||||||
timer = new Timer(delay, e -> {
|
timer = new Timer(delay, e -> {
|
||||||
@ -65,17 +81,19 @@ public class Clock implements Element {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
timer.start();
|
timer.start();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case STOPPED:
|
case STOPPED:
|
||||||
if (timer != null)
|
if (timer != null)
|
||||||
timer.stop();
|
timer.stop();
|
||||||
break;
|
break;
|
||||||
case FETCHCLOCK:
|
case FETCHCLOCK:
|
||||||
event.registerClock(Clock.this);
|
event.registerClock(clock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
public void remove() {
|
||||||
|
model.removeObserver(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
|
|||||||
private static final Icon iconOpenWin = IconCreator.create("OpenNew24.gif");
|
private static final Icon iconOpenWin = IconCreator.create("OpenNew24.gif");
|
||||||
private static final Icon iconSave = IconCreator.create("Save24.gif");
|
private static final Icon iconSave = IconCreator.create("Save24.gif");
|
||||||
private static final Icon iconSaveAs = IconCreator.create("SaveAs24.gif");
|
private static final Icon iconSaveAs = IconCreator.create("SaveAs24.gif");
|
||||||
|
private static final Icon iconFast = IconCreator.create("FastForward24.gif");
|
||||||
private final CircuitComponent circuitComponent;
|
private final CircuitComponent circuitComponent;
|
||||||
private final ToolTipAction save;
|
private final ToolTipAction save;
|
||||||
private final ElementLibrary library;
|
private final ElementLibrary library;
|
||||||
@ -227,6 +228,15 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
|
|||||||
}
|
}
|
||||||
}.setToolTip(Lang.get("menu_micro_tt"));
|
}.setToolTip(Lang.get("menu_micro_tt"));
|
||||||
|
|
||||||
|
ToolTipAction runFast = new ToolTipAction(Lang.get("menu_fast"), iconFast) {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
createAndStartModel(false);
|
||||||
|
circuitComponent.setManualChangeObserver(new MicroStepObserver(model));
|
||||||
|
}
|
||||||
|
}.setToolTip(Lang.get("menu_fast_tt"));
|
||||||
|
|
||||||
|
|
||||||
ToolTipAction speedTest = new ToolTipAction(Lang.get("menu_speedTest")) {
|
ToolTipAction speedTest = new ToolTipAction(Lang.get("menu_speedTest")) {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@ -250,6 +260,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
|
|||||||
run.add(runModel.createJMenuItem());
|
run.add(runModel.createJMenuItem());
|
||||||
run.add(runModelMicro.createJMenuItem());
|
run.add(runModelMicro.createJMenuItem());
|
||||||
run.add(doStep.createJMenuItem());
|
run.add(doStep.createJMenuItem());
|
||||||
|
run.add(runFast.createJMenuItem());
|
||||||
run.add(speedTest.createJMenuItem());
|
run.add(speedTest.createJMenuItem());
|
||||||
run.add(traceEnable);
|
run.add(traceEnable);
|
||||||
run.add(runClock);
|
run.add(runClock);
|
||||||
@ -267,6 +278,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
|
|||||||
toolBar.add(runModel.createJButtonNoText());
|
toolBar.add(runModel.createJButtonNoText());
|
||||||
toolBar.add(runModelMicro.createJButtonNoText());
|
toolBar.add(runModelMicro.createJButtonNoText());
|
||||||
toolBar.add(doStep.createJButtonNoText());
|
toolBar.add(doStep.createJButtonNoText());
|
||||||
|
toolBar.add(runFast.createJButtonNoText());
|
||||||
|
|
||||||
toolBar.addSeparator();
|
toolBar.addSeparator();
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ key_addrBits=Adress Bits
|
|||||||
key_flipSelPos=Tausche Position des Selectors
|
key_flipSelPos=Tausche Position des Selectors
|
||||||
key_rotation=Rotation
|
key_rotation=Rotation
|
||||||
key_width=Breite
|
key_width=Breite
|
||||||
|
key_cycles=Timeout Zyklen
|
||||||
|
|
||||||
rot_0=0\u00B0
|
rot_0=0\u00B0
|
||||||
rot_90=90\u00B0
|
rot_90=90\u00B0
|
||||||
rot_180=180\u00B0
|
rot_180=180\u00B0
|
||||||
@ -113,6 +115,9 @@ menu_runClock_tt=Wenn gew\u00E4hlt, werden beim Starten auch die Taktgeber gesta
|
|||||||
menu_help=Hilfe
|
menu_help=Hilfe
|
||||||
menu_editAttributes=Model Attribute Bearbeiten
|
menu_editAttributes=Model Attribute Bearbeiten
|
||||||
menu_editAttributes_tt=Diese Attribute beeinflussen das Modell, wenn es in andere Modelle eingebettet wird.
|
menu_editAttributes_tt=Diese Attribute beeinflussen das Modell, wenn es in andere Modelle eingebettet wird.
|
||||||
|
menu_fast=Schneller Lauf
|
||||||
|
menu_fast_tt=F\u00FChrt das Modell aus, bis ein Stopsignal \u00FCber ein BRK-Element detektiert wird.
|
||||||
|
|
||||||
|
|
||||||
menu_about=\u00DCber Digital
|
menu_about=\u00DCber Digital
|
||||||
win_saveChanges=Ver\u00E4nderungen speichern?
|
win_saveChanges=Ver\u00E4nderungen speichern?
|
||||||
|
@ -28,6 +28,8 @@ key_addrBits=Address Bits
|
|||||||
key_flipSelPos=Flip selector position
|
key_flipSelPos=Flip selector position
|
||||||
key_rotation=Rotation
|
key_rotation=Rotation
|
||||||
key_width=Width
|
key_width=Width
|
||||||
|
key_cycles=Timeout cycles
|
||||||
|
|
||||||
rot_0=0\u00B0
|
rot_0=0\u00B0
|
||||||
rot_90=90\u00B0
|
rot_90=90\u00B0
|
||||||
rot_180=180\u00B0
|
rot_180=180\u00B0
|
||||||
@ -112,7 +114,10 @@ menu_runClock_tt=If selected the clocks in the circuit are started
|
|||||||
menu_help=Help
|
menu_help=Help
|
||||||
menu_about=About
|
menu_about=About
|
||||||
menu_editAttributes=Edit Models Attributes
|
menu_editAttributes=Edit Models Attributes
|
||||||
menu_editAttributes_tt=These attributes effect the behavior is the model is included in othre models.
|
menu_editAttributes_tt=These attributes effect the behavior is the model is included in other models.
|
||||||
|
menu_fast=Run Fast
|
||||||
|
menu_fast_tt=Runs the model until a break is detected by the BRK element.
|
||||||
|
|
||||||
|
|
||||||
win_saveChanges=Save Changes?
|
win_saveChanges=Save Changes?
|
||||||
win_confirmExit=Confirm Exit!
|
win_confirmExit=Confirm Exit!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user