mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-16 08:25:09 -04:00
added a break element
This commit is contained in:
parent
c5c071f223
commit
ff32e2e25b
@ -110,6 +110,12 @@
|
|||||||
<pos x="240" y="190"/>
|
<pos x="240" y="190"/>
|
||||||
<rotate>0</rotate>
|
<rotate>0</rotate>
|
||||||
</visualElement>
|
</visualElement>
|
||||||
|
<visualElement>
|
||||||
|
<elementName>Break</elementName>
|
||||||
|
<elementAttributes/>
|
||||||
|
<pos x="190" y="110"/>
|
||||||
|
<rotate>0</rotate>
|
||||||
|
</visualElement>
|
||||||
</visualElements>
|
</visualElements>
|
||||||
<wires>
|
<wires>
|
||||||
<wire>
|
<wire>
|
||||||
|
@ -5,6 +5,7 @@ import de.neemann.digital.core.NodeException;
|
|||||||
import de.neemann.digital.core.ObservableValue;
|
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.ElementTypeDescription;
|
import de.neemann.digital.core.element.ElementTypeDescription;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -20,6 +21,9 @@ public class Break implements Element {
|
|||||||
|
|
||||||
private ObservableValue input;
|
private ObservableValue input;
|
||||||
|
|
||||||
|
public Break(ElementAttributes attributes) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setInputs(ObservableValue... inputs) throws NodeException {
|
public void setInputs(ObservableValue... inputs) throws NodeException {
|
||||||
input = inputs[0].checkBits(1, null);
|
input = inputs[0].checkBits(1, null);
|
||||||
|
@ -52,49 +52,4 @@ public class Clock implements Element {
|
|||||||
return frequency;
|
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);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
add(Out.LEDDESCRIPTION, menu);
|
add(Out.LEDDESCRIPTION, menu);
|
||||||
add(Out.PROBEDESCRIPTION, menu);
|
add(Out.PROBEDESCRIPTION, menu);
|
||||||
add(Clock.DESCRIPTION, menu);
|
add(Clock.DESCRIPTION, menu);
|
||||||
|
add(Break.DESCRIPTION, menu);
|
||||||
add(Out.SEVENDESCRIPTION, menu);
|
add(Out.SEVENDESCRIPTION, menu);
|
||||||
add(Out.SEVENHEXDESCRIPTION, menu);
|
add(Out.SEVENHEXDESCRIPTION, menu);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
src/main/java/de/neemann/digital/draw/shapes/BreakShape.java
Normal file
46
src/main/java/de/neemann/digital/draw/shapes/BreakShape.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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.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(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(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(Demultiplexer.DESCRIPTION.getName(), attr -> new DemuxerShape(attr.get(AttributeKey.SelectorBits), true, attr.get(AttributeKey.FlipSelPositon)));
|
||||||
|
@ -4,11 +4,13 @@ import de.neemann.digital.core.Model;
|
|||||||
import de.neemann.digital.core.NodeException;
|
import de.neemann.digital.core.NodeException;
|
||||||
import de.neemann.digital.core.Observer;
|
import de.neemann.digital.core.Observer;
|
||||||
import de.neemann.digital.core.SpeedTest;
|
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.Circuit;
|
||||||
import de.neemann.digital.draw.elements.PinException;
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
import de.neemann.digital.draw.elements.PinOrder;
|
import de.neemann.digital.draw.elements.PinOrder;
|
||||||
import de.neemann.digital.draw.library.ElementLibrary;
|
import de.neemann.digital.draw.library.ElementLibrary;
|
||||||
import de.neemann.digital.draw.model.ModelDescription;
|
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.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;
|
||||||
@ -277,6 +279,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.addSeparator();
|
||||||
toolBar.add(runFast.createJButtonNoText());
|
toolBar.add(runFast.createJButtonNoText());
|
||||||
|
|
||||||
toolBar.addSeparator();
|
toolBar.addSeparator();
|
||||||
@ -306,9 +309,15 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave {
|
|||||||
circuitComponent.setModeAndReset(CircuitComponent.Mode.running);
|
circuitComponent.setModeAndReset(CircuitComponent.Mode.running);
|
||||||
|
|
||||||
modelDescription = new ModelDescription(circuitComponent.getCircuit(), library);
|
modelDescription = new ModelDescription(circuitComponent.getCircuit(), library);
|
||||||
|
model = modelDescription.createModel();
|
||||||
modelDescription.connectToGui(circuitComponent);
|
modelDescription.connectToGui(circuitComponent);
|
||||||
|
|
||||||
|
if (runClock)
|
||||||
|
for (Clock c : model.getClocks())
|
||||||
|
model.addObserver(new RealTimeClock(model, c));
|
||||||
|
|
||||||
model.init();
|
model.init();
|
||||||
|
|
||||||
} catch (NodeException e) {
|
} catch (NodeException e) {
|
||||||
if (modelDescription != null) {
|
if (modelDescription != null) {
|
||||||
if (e.getNodes() != null)
|
if (e.getNodes() != null)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user