From ff32e2e25b3d4c382cf9109a59811c46c7a0b5aa Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 29 Mar 2016 17:16:49 +0200 Subject: [PATCH] added a break element --- src/main/dig/Ampel_MSJK.dig | 6 +++ .../de/neemann/digital/core/wiring/Break.java | 4 ++ .../de/neemann/digital/core/wiring/Clock.java | 45 ----------------- .../digital/draw/library/ElementLibrary.java | 1 + .../digital/draw/model/RealTimeClock.java | 50 +++++++++++++++++++ .../digital/draw/shapes/BreakShape.java | 46 +++++++++++++++++ .../digital/draw/shapes/ShapeFactory.java | 1 + .../java/de/neemann/digital/gui/Main.java | 9 ++++ 8 files changed, 117 insertions(+), 45 deletions(-) create mode 100644 src/main/java/de/neemann/digital/draw/model/RealTimeClock.java create mode 100644 src/main/java/de/neemann/digital/draw/shapes/BreakShape.java diff --git a/src/main/dig/Ampel_MSJK.dig b/src/main/dig/Ampel_MSJK.dig index beb22404f..0ed12671b 100644 --- a/src/main/dig/Ampel_MSJK.dig +++ b/src/main/dig/Ampel_MSJK.dig @@ -110,6 +110,12 @@ 0 + + Break + + + 0 + diff --git a/src/main/java/de/neemann/digital/core/wiring/Break.java b/src/main/java/de/neemann/digital/core/wiring/Break.java index 2eda0b933..075bb3482 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Break.java +++ b/src/main/java/de/neemann/digital/core/wiring/Break.java @@ -5,6 +5,7 @@ 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; /** @@ -20,6 +21,9 @@ public class Break implements Element { private ObservableValue input; + public Break(ElementAttributes attributes) { + } + @Override public void setInputs(ObservableValue... inputs) throws NodeException { input = inputs[0].checkBits(1, null); diff --git a/src/main/java/de/neemann/digital/core/wiring/Clock.java b/src/main/java/de/neemann/digital/core/wiring/Clock.java index 46ae0a0ef..4a98ca74e 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Clock.java +++ b/src/main/java/de/neemann/digital/core/wiring/Clock.java @@ -52,49 +52,4 @@ public class Clock implements Element { return frequency; } -// 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 -// public void handleEvent(ModelEvent event) { -// switch (event.getType()) { -// case STARTED: -// int delay = 1000 / frequency; -// if (delay < 100) delay = 100; -// timer = new Timer(delay, e -> { -// output.setValue(1 - output.getValue()); -// try { -// model.doStep(); -// } catch (NodeException e1) { -// SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1)); -// timer.stop(); -// } -// }); -// timer.start(); -// break; -// case STOPPED: -// if (timer != null) -// timer.stop(); -// break; -// case FETCHCLOCK: -// event.registerClock(clock); -// break; -// } -// } -// -// public void remove() { -// model.removeObserver(this); -// } -// } } diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index 92cb0c739..78eab1ac5 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -47,6 +47,7 @@ public class ElementLibrary implements Iterable add(Out.LEDDESCRIPTION, menu); add(Out.PROBEDESCRIPTION, menu); add(Clock.DESCRIPTION, menu); + add(Break.DESCRIPTION, menu); add(Out.SEVENDESCRIPTION, menu); add(Out.SEVENHEXDESCRIPTION, menu); diff --git a/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java new file mode 100644 index 000000000..5dcf9be32 --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/model/RealTimeClock.java @@ -0,0 +1,50 @@ +package de.neemann.digital.draw.model; + +import de.neemann.digital.core.*; +import de.neemann.digital.core.wiring.Clock; +import de.neemann.gui.ErrorMessage; + +import javax.swing.*; + +/** + * @author hneemann + */ +public class RealTimeClock implements ModelStateObserver { + + private final Model model; + private final int frequency; + private final ObservableValue output; + private Timer timer; + + public RealTimeClock(Model model, Clock clock) { + this.model = model; + int f = clock.getFrequency(); + if (f < 1) f = 1; + this.frequency = f; + this.output = clock.getClockOutput(); + } + + @Override + public void handleEvent(ModelEvent event) { + switch (event.getType()) { + case STARTED: + int delay = 1000 / frequency; + if (delay < 100) delay = 100; + timer = new Timer(delay, e -> { + output.setValue(1 - output.getValue()); + try { + model.doStep(); + } catch (NodeException e1) { + SwingUtilities.invokeLater(new ErrorMessage("ClockError").addCause(e1)); + timer.stop(); + } + }); + timer.start(); + break; + case STOPPED: + if (timer != null) + timer.stop(); + break; + } + } +} diff --git a/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java b/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java new file mode 100644 index 000000000..1ae35e9a3 --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/shapes/BreakShape.java @@ -0,0 +1,46 @@ +package de.neemann.digital.draw.shapes; + +import de.neemann.digital.core.Observer; +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.Graphic; +import de.neemann.digital.draw.graphics.Orientation; +import de.neemann.digital.draw.graphics.Style; +import de.neemann.digital.draw.graphics.Vector; + +/** + * @author hneemann + */ +public class BreakShape implements Shape { + private static final int SIZE = 8; + private static final int SIZEQ = 5; + private static final Vector RAD = new Vector(SIZE, SIZE); + private static final Vector D1 = new Vector(SIZEQ, -SIZEQ); + private static final Vector D2 = new Vector(SIZEQ, SIZEQ); + private final String label; + + public BreakShape(String label) { + this.label = label; + } + + @Override + public Pins getPins() { + return new Pins().add(new Pin(new Vector(0, 0), "brk", Pin.Direction.input)); + } + + @Override + public Interactor applyStateMonitor(IOState ioState, Observer guiObserver) { + return null; + } + + @Override + public void drawTo(Graphic graphic) { + Vector center = new Vector(2 + SIZE, 0); + graphic.drawCircle(center.sub(RAD), center.add(RAD), Style.NORMAL); + graphic.drawLine(center.sub(D1), center.add(D1), Style.NORMAL); + graphic.drawLine(center.sub(D2), center.add(D2), Style.NORMAL); + Vector textPos = new Vector(SIZE * 3, 0); + graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.LEFTCENTER, Style.NORMAL); + } +} 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 7c0a0ab07..7ed56ccb3 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -50,6 +50,7 @@ public final class ShapeFactory { 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(Break.DESCRIPTION.getName(), attributes -> new BreakShape(attributes.get(AttributeKey.Label))); 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))); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index bc942322c..27b7e0b2c 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -4,11 +4,13 @@ import de.neemann.digital.core.Model; import de.neemann.digital.core.NodeException; import de.neemann.digital.core.Observer; import de.neemann.digital.core.SpeedTest; +import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.PinException; import de.neemann.digital.draw.elements.PinOrder; import de.neemann.digital.draw.library.ElementLibrary; import de.neemann.digital.draw.model.ModelDescription; +import de.neemann.digital.draw.model.RealTimeClock; import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.components.ElementOrderer; @@ -277,6 +279,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { toolBar.add(runModel.createJButtonNoText()); toolBar.add(runModelMicro.createJButtonNoText()); toolBar.add(doStep.createJButtonNoText()); + toolBar.addSeparator(); toolBar.add(runFast.createJButtonNoText()); toolBar.addSeparator(); @@ -306,9 +309,15 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { circuitComponent.setModeAndReset(CircuitComponent.Mode.running); modelDescription = new ModelDescription(circuitComponent.getCircuit(), library); + model = modelDescription.createModel(); modelDescription.connectToGui(circuitComponent); + if (runClock) + for (Clock c : model.getClocks()) + model.addObserver(new RealTimeClock(model, c)); + model.init(); + } catch (NodeException e) { if (modelDescription != null) { if (e.getNodes() != null)