From fa03810c21bf980d1912ff676d943d8f2c256aed Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 3 Sep 2019 09:33:42 +0200 Subject: [PATCH] Added a push button combined with a LED --- .../de/neemann/digital/core/io/ButtonLED.java | 44 ++++++++++ .../digital/draw/library/ElementLibrary.java | 1 + .../digital/draw/shapes/ButtonLEDShape.java | 84 +++++++++++++++++++ .../digital/draw/shapes/ButtonShape.java | 2 +- .../digital/draw/shapes/ShapeFactory.java | 1 + src/main/resources/lang/lang_de.xml | 5 ++ src/main/resources/lang/lang_en.xml | 5 ++ .../resources/dig/backtrack/AllComponents.dig | 13 ++- 8 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/neemann/digital/core/io/ButtonLED.java create mode 100644 src/main/java/de/neemann/digital/draw/shapes/ButtonLEDShape.java diff --git a/src/main/java/de/neemann/digital/core/io/ButtonLED.java b/src/main/java/de/neemann/digital/core/io/ButtonLED.java new file mode 100644 index 000000000..b376aad57 --- /dev/null +++ b/src/main/java/de/neemann/digital/core/io/ButtonLED.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.core.io; + +import de.neemann.digital.core.NodeException; +import de.neemann.digital.core.ObservableValues; +import de.neemann.digital.core.element.ElementAttributes; +import de.neemann.digital.core.element.ElementTypeDescription; +import de.neemann.digital.core.element.Keys; + +import static de.neemann.digital.core.element.PinInfo.input; + +/** + * The button combined with a LED. + */ +public class ButtonLED extends Button { + + /** + * The ButtonLED description + */ + public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(ButtonLED.class, input("in")) + .addAttribute(Keys.ROTATE) + .addAttribute(Keys.LABEL) + .addAttribute(Keys.ACTIVE_LOW) + .addAttribute(Keys.MAP_TO_KEY) + .addAttribute(Keys.COLOR); + + /** + * Creates a new instance + * + * @param attributes the buttons attributes + */ + public ButtonLED(ElementAttributes attributes) { + super(attributes); + } + + @Override + public void setInputs(ObservableValues inputs) throws NodeException { + inputs.get(0).checkBits(1, null); + } +} 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 a1b654bbf..d63df8bfb 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -131,6 +131,7 @@ public class ElementLibrary implements Iterable .add(new LibraryNode(Lang.get("lib_more")) .add(RGBLED.DESCRIPTION) .add(Out.POLARITYAWARELEDDESCRIPTION) + .add(ButtonLED.DESCRIPTION) .add(Out.SEVENDESCRIPTION) .add(Out.SEVENHEXDESCRIPTION) .add(Out.SIXTEENDESCRIPTION) diff --git a/src/main/java/de/neemann/digital/draw/shapes/ButtonLEDShape.java b/src/main/java/de/neemann/digital/draw/shapes/ButtonLEDShape.java new file mode 100644 index 000000000..575e20c8f --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/shapes/ButtonLEDShape.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2019 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.draw.shapes; + +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.Observer; +import de.neemann.digital.core.Value; +import de.neemann.digital.core.element.ElementAttributes; +import de.neemann.digital.core.element.Keys; +import de.neemann.digital.core.element.PinDescription; +import de.neemann.digital.core.element.PinDescriptions; +import de.neemann.digital.core.io.ButtonLED; +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.Style; +import de.neemann.digital.draw.graphics.Vector; + +import static de.neemann.digital.draw.shapes.GenericShape.SIZE2; +import static de.neemann.digital.draw.shapes.OutputShape.OUT_SIZE; + +/** + * The shape used for the button combined with a LED. + */ +public class ButtonLEDShape extends ButtonShape { + private final PinDescription input; + private final PinDescription output; + private final Style color; + private ObservableValue inputValue; + private Value ledValue; + private ButtonLED button; + + /** + * Creates a new instance + * + * @param attr the attributes + * @param inputs the inputs + * @param outputs the outputs + */ + public ButtonLEDShape(ElementAttributes attr, PinDescriptions inputs, PinDescriptions outputs) { + super(attr, inputs, outputs); + input = inputs.get(0); + output = outputs.get(0); + color = Style.NORMAL.deriveStyle(0, true, attr.get(Keys.COLOR)); + } + + @Override + public Pins getPins() { + return new Pins() + .add(new Pin(new Vector(0, 0), output)) + .add(new Pin(new Vector(0, 20), input)); + } + + @Override + public InteractorInterface applyStateMonitor(IOState ioState, Observer guiObserver) { + inputValue = ioState.getInput(0); + button = (ButtonLED) ioState.getElement(); + return super.applyStateMonitor(ioState, guiObserver); + } + + @Override + public void readObservableValues() { + if (inputValue != null) + ledValue = inputValue.getCopy(); + } + + @Override + public void drawTo(Graphic graphic, Style heighLight) { + super.drawTo(graphic, heighLight); + + if (ledValue == null || ledValue.getBool()) { + Vector center; + if (button != null && button.isPressed()) { + center = new Vector(-OUT_SIZE - 1, 0); + } else + center = new Vector(-OUT_SIZE - 1 - ButtonShape.HEIGHT, -ButtonShape.HEIGHT); + graphic.drawCircle(center.add(-SIZE2, -SIZE2), center.add(SIZE2, SIZE2), color); + } + } +} diff --git a/src/main/java/de/neemann/digital/draw/shapes/ButtonShape.java b/src/main/java/de/neemann/digital/draw/shapes/ButtonShape.java index 139e0f48d..8ed9b784f 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ButtonShape.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ButtonShape.java @@ -27,7 +27,7 @@ import static de.neemann.digital.draw.shapes.OutputShape.OUT_SIZE; */ public class ButtonShape implements Shape { - private static final int HEIGHT = OUT_SIZE / 2; + protected static final int HEIGHT = OUT_SIZE / 2; private final String label; private final PinDescriptions outputs; 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 448f3d1f2..6081000f8 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ShapeFactory.java @@ -110,6 +110,7 @@ public final class ShapeFactory { map.put(RGBLED.DESCRIPTION.getName(), RGBLEDShape::new); map.put(Out.POLARITYAWARELEDDESCRIPTION.getName(), PolarityAwareLEDShape::new); map.put(Button.DESCRIPTION.getName(), ButtonShape::new); + map.put(ButtonLED.DESCRIPTION.getName(), ButtonLEDShape::new); map.put(Probe.DESCRIPTION.getName(), ProbeShape::new); map.put(Clock.DESCRIPTION.getName(), ClockShape::new); map.put(Out.SEVENDESCRIPTION.getName(), SevenSegShape::new); diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index d683c98ac..76736139d 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -165,6 +165,11 @@ Taster Ein einfacher Taster, welcher in seinen Ausgangszustand zurückkehrt, wenn er nicht gehalten wird. Das Ausgangssignal des Tasters. + Taster mit LED + Ein einfacher Taster, welcher in seinen Ausgangszustand zurückkehrt, wenn er nicht gehalten wird. + Der Taster verfügt über eine LED, die über ein Eingangssignal geschaltet werden kann. + Das Ausgangssignal des Tasters. + Eingang zur Steuerung der LED. Text Zeigt einen einfachen Text in der Schaltung an. Hat keine weitere Funktion für die Simulation. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 6d0e91633..f39842c87 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -178,6 +178,11 @@ Button A simple push button which goes back to its original state when it is released. The output signal of the button. + Button + A simple push button which goes back to its original state when it is released. + The push button has an LED which can be switched via an input signal. + The output signal of the button. + Input for controlling the LED. Text Shows a text in the circuit. Does not affect the simulation. diff --git a/src/test/resources/dig/backtrack/AllComponents.dig b/src/test/resources/dig/backtrack/AllComponents.dig index 455cc413f..ab2913903 100644 --- a/src/test/resources/dig/backtrack/AllComponents.dig +++ b/src/test/resources/dig/backtrack/AllComponents.dig @@ -604,6 +604,11 @@ + + ButtonLED + + + @@ -1059,8 +1064,8 @@ - - + + @@ -1074,6 +1079,10 @@ + + + +