Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4b2b9407e1 |
@ -77,7 +77,7 @@ public class CONFIG {
|
|||||||
|
|
||||||
public static final BasicStroke SWITCH_STROKE = new BasicStroke(15);
|
public static final BasicStroke SWITCH_STROKE = new BasicStroke(15);
|
||||||
|
|
||||||
public static boolean SHOW_WIRE_DETAILS = false;
|
public static boolean SHOW_WIRE_DETAILS = true;
|
||||||
|
|
||||||
public static boolean SHOW_NODE_VOLTAGES = false;
|
public static boolean SHOW_NODE_VOLTAGES = false;
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import javax.swing.*;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
import static de.ph87.electro.CONFIG.RASTER;
|
import static de.ph87.electro.CONFIG.RASTER;
|
||||||
import static de.ph87.electro.circuit.demo.Demos.poti;
|
import static de.ph87.electro.circuit.demo.Demos.capacitor;
|
||||||
|
|
||||||
public class Window extends JFrame {
|
public class Window extends JFrame {
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ public class Window extends JFrame {
|
|||||||
setPreferredSize(new Dimension(1200, 900));
|
setPreferredSize(new Dimension(1200, 900));
|
||||||
setExtendedState(MAXIMIZED_BOTH);
|
setExtendedState(MAXIMIZED_BOTH);
|
||||||
|
|
||||||
final Sidebar sidebar = new Sidebar(() -> setCircuit(new Circuit()));
|
final Sidebar sidebar = new Sidebar(() -> setCircuit(capacitor()));
|
||||||
final JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebar, circuitPanel);
|
final JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebar, circuitPanel);
|
||||||
|
|
||||||
sidebar.setPreferredSize(new Dimension(calcWidth(3), 0));
|
sidebar.setPreferredSize(new Dimension(calcWidth(3), 0));
|
||||||
@ -38,7 +38,7 @@ public class Window extends JFrame {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
final Window window = new Window();
|
final Window window = new Window();
|
||||||
window.setCircuit(poti());
|
window.setCircuit(capacitor());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCircuit(final Circuit circuit) {
|
public void setCircuit(final Circuit circuit) {
|
||||||
|
|||||||
@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -156,8 +157,17 @@ public class Circuit {
|
|||||||
return new File(file.getAbsolutePath().replaceAll("\\.json$", ".png"));
|
return new File(file.getAbsolutePath().replaceAll("\\.json$", ".png"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private long dtLast = 0;
|
||||||
|
|
||||||
public void evaluate() {
|
public void evaluate() {
|
||||||
Calculation.calculate(this);
|
final long now = System.nanoTime();
|
||||||
|
if (dtLast == 0) {
|
||||||
|
dtLast = now;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Duration dt = Duration.ofNanos(now - dtLast).dividedBy(10); // TODO remove /10
|
||||||
|
dtLast = now;
|
||||||
|
Calculation.calculate(this, dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,9 @@ public class CircuitPanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
final Thread thread = new Thread(this::run);
|
||||||
|
thread.setDaemon(true);
|
||||||
|
thread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCircuit(@NonNull final Circuit circuit) {
|
public void setCircuit(@NonNull final Circuit circuit) {
|
||||||
@ -44,4 +47,21 @@ public class CircuitPanel extends JPanel {
|
|||||||
mouseAdapter.drawDrag(g);
|
mouseAdapter.drawDrag(g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void run() {
|
||||||
|
final Object lock = new Object();
|
||||||
|
while (true) {
|
||||||
|
circuit.evaluate();
|
||||||
|
repaint();
|
||||||
|
//noinspection SynchronizationOnLocalVariableOrMethodParameter
|
||||||
|
synchronized (lock) {
|
||||||
|
try {
|
||||||
|
lock.wait(50);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error(e.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,13 +5,15 @@ import de.ph87.electro.circuit.Circuit;
|
|||||||
import de.ph87.electro.circuit.Resistance;
|
import de.ph87.electro.circuit.Resistance;
|
||||||
import de.ph87.electro.circuit.part.Part;
|
import de.ph87.electro.circuit.part.Part;
|
||||||
import de.ph87.electro.circuit.part.node.Node;
|
import de.ph87.electro.circuit.part.node.Node;
|
||||||
import de.ph87.electro.circuit.part.parts.Battery;
|
import de.ph87.electro.circuit.part.parts.Capacitor;
|
||||||
|
import de.ph87.electro.circuit.part.parts.CurrentSource;
|
||||||
import de.ph87.electro.circuit.wire.Wire;
|
import de.ph87.electro.circuit.wire.Wire;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.math3.linear.*;
|
import org.apache.commons.math3.linear.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -40,7 +42,7 @@ public class Calculation {
|
|||||||
currents = new ArrayRealVector(numNodes);
|
currents = new ArrayRealVector(numNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Calculation(final Set<Node> connectedNodes, final Battery pivot) {
|
private Calculation(@NonNull final Set<Node> connectedNodes, @NonNull final CurrentSource pivot, @NonNull final Duration dt) {
|
||||||
for (final Node node : connectedNodes) {
|
for (final Node node : connectedNodes) {
|
||||||
if (node instanceof final Node partNode) {
|
if (node instanceof final Node partNode) {
|
||||||
parts.add(partNode.getPart());
|
parts.add(partNode.getPart());
|
||||||
@ -56,19 +58,19 @@ public class Calculation {
|
|||||||
currents = new ArrayRealVector(this.nodes.size());
|
currents = new ArrayRealVector(this.nodes.size());
|
||||||
fromSchematic();
|
fromSchematic();
|
||||||
solve();
|
solve();
|
||||||
toSchematic();
|
toSchematic(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Calculation> calculate(final Circuit circuit) {
|
public static List<Calculation> calculate(@NonNull final Circuit circuit, @NonNull final Duration dt) {
|
||||||
final List<Calculation> calculations = new ArrayList<>();
|
final List<Calculation> calculations = new ArrayList<>();
|
||||||
final List<Battery> batteries = new ArrayList<>(circuit.streamParts().flatMap(Battery::filterCast).toList());
|
final List<CurrentSource> currentSources = new ArrayList<>(circuit.streamParts().flatMap(CurrentSource::filterCast).toList());
|
||||||
while (!batteries.isEmpty()) {
|
while (!currentSources.isEmpty()) {
|
||||||
final Battery pivot = batteries.removeFirst();
|
final CurrentSource pivot = currentSources.removeFirst();
|
||||||
final Set<Node> connectedNodes = new HashSet<>();
|
final Set<Node> connectedNodes = new HashSet<>();
|
||||||
pivot.getPlus().collectConnectedNodes(connectedNodes);
|
pivot.getPlus().collectConnectedNodes(connectedNodes);
|
||||||
pivot.getMinus().collectConnectedNodes(connectedNodes);
|
pivot.getMinus().collectConnectedNodes(connectedNodes);
|
||||||
connectedNodes.stream().map(Node::getPart).flatMap(Battery::filterCast).forEach(batteries::remove);
|
connectedNodes.stream().map(Node::getPart).flatMap(CurrentSource::filterCast).forEach(currentSources::remove);
|
||||||
calculations.add(new Calculation(connectedNodes, pivot));
|
calculations.add(new Calculation(connectedNodes, pivot, dt));
|
||||||
}
|
}
|
||||||
return calculations;
|
return calculations;
|
||||||
}
|
}
|
||||||
@ -81,23 +83,25 @@ public class Calculation {
|
|||||||
for (final Resistance resistance : part.getResistances()) {
|
for (final Resistance resistance : part.getResistances()) {
|
||||||
addResistor(resistance.a, resistance.b, resistance.getResistance());
|
addResistor(resistance.a, resistance.b, resistance.getResistance());
|
||||||
}
|
}
|
||||||
if (part instanceof final Battery battery) {
|
if (part instanceof final CurrentSource currentSource) {
|
||||||
final double current = battery.getVoltage() / battery.getInnerResistance().getResistance();
|
if (!(currentSource instanceof final Capacitor capacitor) || !capacitor.isCharging()) {
|
||||||
final int indexMinus = getNodeIndex(battery.getMinus());
|
final double current = currentSource.getVoltage() / currentSource.getInnerResistance().getResistance();
|
||||||
final int indexPlus = getNodeIndex(battery.getPlus());
|
final int indexMinus = getNodeIndex(currentSource.getMinus());
|
||||||
|
final int indexPlus = getNodeIndex(currentSource.getPlus());
|
||||||
addCurrentSource(indexMinus, indexPlus, current);
|
addCurrentSource(indexMinus, indexPlus, current);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toSchematic() {
|
private void toSchematic(@NonNull final Duration dt) {
|
||||||
wires.forEach(wire -> wire.setCurrent(getCurrent(wire)));
|
wires.forEach(wire -> wire.setCurrent(getCurrent(wire)));
|
||||||
parts.forEach(part -> {
|
parts.forEach(part -> {
|
||||||
for (final Resistance resistance : part.getResistances()) {
|
for (final Resistance resistance : part.getResistances()) {
|
||||||
resistance.setCurrent(getCurrent(resistance));
|
resistance.setCurrent(getCurrent(resistance));
|
||||||
}
|
}
|
||||||
part.getNodes().forEach(node -> node.setVoltage(getPotential(node)));
|
part.getNodes().forEach(node -> node.setVoltage(getPotential(node)));
|
||||||
part.postCalculate();
|
part.postCalculate(dt);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,4 +23,21 @@ public class Demos {
|
|||||||
return circuit;
|
return circuit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public static Circuit capacitor() {
|
||||||
|
final Circuit circuit = new Circuit();
|
||||||
|
|
||||||
|
final Capacitor capacitor = circuit.addPart(new Capacitor(RASTER(1, 0), Orientation.R0));
|
||||||
|
final Voltmeter voltmeter = circuit.addPart(new Voltmeter(RASTER(1, 2), Orientation.R0));
|
||||||
|
final Light light = circuit.addPart(new Light(RASTER(1, 4), Orientation.R0));
|
||||||
|
|
||||||
|
circuit.connect(capacitor.getMinus(), voltmeter.getA());
|
||||||
|
circuit.connect(voltmeter.getA(), light.getA());
|
||||||
|
|
||||||
|
circuit.connect(capacitor.getPlus(), voltmeter.getB());
|
||||||
|
circuit.connect(voltmeter.getB(), light.getB());
|
||||||
|
|
||||||
|
return circuit;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import lombok.ToString;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -141,7 +142,7 @@ public abstract class Part {
|
|||||||
// -
|
// -
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postCalculate() {
|
public void postCalculate(final @NonNull Duration dt) {
|
||||||
// -
|
// -
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,6 @@ import lombok.ToString;
|
|||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static de.ph87.electro.CONFIG.*;
|
import static de.ph87.electro.CONFIG.*;
|
||||||
import static de.ph87.electro.circuit.CircuitPainter.*;
|
import static de.ph87.electro.circuit.CircuitPainter.*;
|
||||||
@ -19,7 +18,7 @@ import static java.lang.Math.round;
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@ToString(callSuper = true, onlyExplicitlyIncluded = true)
|
@ToString(callSuper = true, onlyExplicitlyIncluded = true)
|
||||||
public class Battery extends Part {
|
public class Battery extends Part implements CurrentSource {
|
||||||
|
|
||||||
public static final double DEFAULT_INNER_RESISTANCE = 0.05;
|
public static final double DEFAULT_INNER_RESISTANCE = 0.05;
|
||||||
|
|
||||||
@ -65,14 +64,6 @@ public class Battery extends Part {
|
|||||||
innerResistance = new Resistance(minus, plus, dto.getResistance());
|
innerResistance = new Resistance(minus, plus, dto.getResistance());
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public static Stream<Battery> filterCast(@NonNull final Part part) {
|
|
||||||
if (part instanceof final Battery battery) {
|
|
||||||
return Stream.of(battery);
|
|
||||||
}
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void _render(@NonNull final Graphics2D g) {
|
protected void _render(@NonNull final Graphics2D g) {
|
||||||
drawLine(g, P10, P50, P50 - GAP / 2 - MINUS_W / 2, P50, Color.BLACK, SYMBOL_STROKE);
|
drawLine(g, P10, P50, P50 - GAP / 2 - MINUS_W / 2, P50, Color.BLACK, SYMBOL_STROKE);
|
||||||
|
|||||||
119
src/main/java/de/ph87/electro/circuit/part/parts/Capacitor.java
Normal file
119
src/main/java/de/ph87/electro/circuit/part/parts/Capacitor.java
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package de.ph87.electro.circuit.part.parts;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.Resistance;
|
||||||
|
import de.ph87.electro.circuit.part.Orientation;
|
||||||
|
import de.ph87.electro.circuit.part.Part;
|
||||||
|
import de.ph87.electro.circuit.part.node.Node;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static de.ph87.electro.CONFIG.*;
|
||||||
|
import static de.ph87.electro.circuit.CircuitPainter.*;
|
||||||
|
import static java.lang.Math.round;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class Capacitor extends Part implements CurrentSource {
|
||||||
|
|
||||||
|
private static final int MINUS_W = (int) round(0.1 * RASTER);
|
||||||
|
|
||||||
|
private static final int GAP = (int) round(0.05 * RASTER);
|
||||||
|
|
||||||
|
private static final int PLUS_W = (int) round(0.02 * RASTER);
|
||||||
|
|
||||||
|
private static final int PLUS_H = (int) round(0.6 * RASTER);
|
||||||
|
|
||||||
|
private final Point size = new Point(RASTER, RASTER);
|
||||||
|
|
||||||
|
private final Node plus;
|
||||||
|
|
||||||
|
private final Node minus;
|
||||||
|
|
||||||
|
private final Resistance innerResistance;
|
||||||
|
|
||||||
|
private double capacityFarad = 1;
|
||||||
|
|
||||||
|
private double chargeCoulomb = capacityFarad * 3;
|
||||||
|
|
||||||
|
private double innerVoltage = chargeCoulomb / capacityFarad;
|
||||||
|
|
||||||
|
private double outerVoltage;
|
||||||
|
|
||||||
|
private boolean charging = false;
|
||||||
|
|
||||||
|
public Capacitor(@NonNull final Point position, @NonNull final Orientation orientation) {
|
||||||
|
super("Kondensator", position, orientation);
|
||||||
|
minus = addNode("-", P10, P50);
|
||||||
|
plus = addNode("+", P90, P50);
|
||||||
|
innerResistance = new Resistance(plus, minus, RESISTANCE_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Capacitor(@NonNull final LightDto dto) {
|
||||||
|
super(dto);
|
||||||
|
minus = addNode(dto.getB(), P10, P50);
|
||||||
|
plus = addNode(dto.getA(), P90, P50);
|
||||||
|
capacityFarad = 0;
|
||||||
|
innerResistance = new Resistance(plus, minus, dto.getResistance());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postCalculate(@NonNull final Duration dt) {
|
||||||
|
outerVoltage = plus.getVoltage() - minus.getVoltage();
|
||||||
|
|
||||||
|
final double timeSeconds = dt.toNanos() / 1_000_000_000.0;
|
||||||
|
final double current = innerResistance.getCurrent();
|
||||||
|
if (!Double.isNaN(outerVoltage) && innerVoltage < outerVoltage) {
|
||||||
|
innerResistance.setResistance(RESISTANCE_MIN);
|
||||||
|
final double resistance = outerVoltage / current;
|
||||||
|
final double targetCharge = capacityFarad * outerVoltage;
|
||||||
|
final double deltaCharge = (targetCharge - chargeCoulomb) * (timeSeconds / (timeSeconds + RC(resistance)));
|
||||||
|
chargeCoulomb += deltaCharge;
|
||||||
|
} else {
|
||||||
|
innerResistance.setResistance(RESISTANCE_MAX);
|
||||||
|
chargeCoulomb += current * timeSeconds;
|
||||||
|
if (chargeCoulomb < 0) {
|
||||||
|
chargeCoulomb = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
innerVoltage = chargeCoulomb / capacityFarad;
|
||||||
|
charging = !Double.isNaN(outerVoltage) && innerVoltage < outerVoltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getVoltage() {
|
||||||
|
if (!Double.isNaN(plus.getVoltage()) && !Double.isNaN(minus.getVoltage())) {
|
||||||
|
if (innerVoltage < outerVoltage) {
|
||||||
|
return outerVoltage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return innerVoltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double RC(final double resistance) {
|
||||||
|
return resistance * capacityFarad;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void _render(@NonNull final Graphics2D g) {
|
||||||
|
drawLine(g, P10, P50, P50 - GAP / 2 - MINUS_W / 2, P50, Color.BLACK, SYMBOL_STROKE);
|
||||||
|
drawLine(g, P50 + GAP / 2 + PLUS_W / 2, P50, P90, P50, Color.BLACK, SYMBOL_STROKE);
|
||||||
|
fillRect(g, P50 - MINUS_W - GAP / 2, P50 - PLUS_H / 2, MINUS_W, PLUS_H, Color.BLACK);
|
||||||
|
fillRect(g, P50 + GAP / 2, P50 - PLUS_H / 2, MINUS_W, PLUS_H, Color.BLACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void _labels(@NonNull final Graphics2D g) {
|
||||||
|
drawText(g, LABEL_FONT, "%.1fC %.1fV".formatted(chargeCoulomb, getVoltage()), P50, P10, Color.BLACK, orientation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public java.util.List<Resistance> getResistances() {
|
||||||
|
return List.of(innerResistance);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
package de.ph87.electro.circuit.part.parts;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.Resistance;
|
||||||
|
import de.ph87.electro.circuit.part.Part;
|
||||||
|
import de.ph87.electro.circuit.part.node.Node;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public interface CurrentSource {
|
||||||
|
|
||||||
|
Node getPlus();
|
||||||
|
|
||||||
|
Node getMinus();
|
||||||
|
|
||||||
|
double getVoltage();
|
||||||
|
|
||||||
|
Resistance getInnerResistance();
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
static Stream<CurrentSource> filterCast(@NonNull final Part part) {
|
||||||
|
if (part instanceof final CurrentSource currentSource) {
|
||||||
|
return Stream.of(currentSource);
|
||||||
|
}
|
||||||
|
return Stream.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -9,6 +9,7 @@ import lombok.NonNull;
|
|||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -65,7 +66,7 @@ public class Light extends Part {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postCalculate() {
|
public void postCalculate(@NonNull final Duration dt) {
|
||||||
potentialDifference = abs(b.getVoltage() - a.getVoltage());
|
potentialDifference = abs(b.getVoltage() - a.getVoltage());
|
||||||
defect |= potentialDifference > maxVoltage;
|
defect |= potentialDifference > maxVoltage;
|
||||||
if (defect) {
|
if (defect) {
|
||||||
|
|||||||
@ -27,7 +27,9 @@ public class Switch1x1 extends Part {
|
|||||||
|
|
||||||
private final Node output;
|
private final Node output;
|
||||||
|
|
||||||
private final Resistance innerResistance;
|
private final Resistance resistanceOpen;
|
||||||
|
|
||||||
|
private final Resistance resistanceClosed;
|
||||||
|
|
||||||
private boolean state = false;
|
private boolean state = false;
|
||||||
|
|
||||||
@ -35,7 +37,8 @@ public class Switch1x1 extends Part {
|
|||||||
super("Ausschalter", position, orientation);
|
super("Ausschalter", position, orientation);
|
||||||
common = addNode("C", P10, P50);
|
common = addNode("C", P10, P50);
|
||||||
output = addNode("O", P90, P50);
|
output = addNode("O", P90, P50);
|
||||||
innerResistance = new Resistance(common, output, RESISTANCE_MIN);
|
resistanceOpen = new Resistance(common, output, RESISTANCE_MAX);
|
||||||
|
resistanceClosed = new Resistance(common, output, RESISTANCE_MIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Switch1x1(@NonNull final Switch1x1Dto dto) {
|
public Switch1x1(@NonNull final Switch1x1Dto dto) {
|
||||||
@ -43,7 +46,8 @@ public class Switch1x1 extends Part {
|
|||||||
common = addNode(dto.getCommon(), P10, P50);
|
common = addNode(dto.getCommon(), P10, P50);
|
||||||
output = addNode(dto.getOutput(), P90, P50);
|
output = addNode(dto.getOutput(), P90, P50);
|
||||||
state = dto.isState();
|
state = dto.isState();
|
||||||
innerResistance = new Resistance(common, output, RESISTANCE_MIN);
|
resistanceOpen = new Resistance(common, output, RESISTANCE_MAX);
|
||||||
|
resistanceClosed = new Resistance(common, output, RESISTANCE_MIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setState(@NonNull final boolean state) {
|
public void setState(@NonNull final boolean state) {
|
||||||
@ -68,8 +72,9 @@ public class Switch1x1 extends Part {
|
|||||||
@Override
|
@Override
|
||||||
public List<Resistance> getResistances() {
|
public List<Resistance> getResistances() {
|
||||||
if (state) {
|
if (state) {
|
||||||
return List.of(innerResistance);
|
return List.of(resistanceClosed);
|
||||||
}
|
}
|
||||||
|
// return List.of(resistanceOpen);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import de.ph87.electro.circuit.wire.Wire;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
import static de.ph87.electro.CONFIG.RASTER;
|
import static de.ph87.electro.CONFIG.RASTER;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -22,7 +24,7 @@ class CalculationServiceTest {
|
|||||||
circuit.connect(battery.getMinus(), light.getA());
|
circuit.connect(battery.getMinus(), light.getA());
|
||||||
circuit.connect(battery.getPlus(), light.getB());
|
circuit.connect(battery.getPlus(), light.getB());
|
||||||
|
|
||||||
for (final Calculation calculation : Calculation.calculate(circuit)) {
|
for (final Calculation calculation : Calculation.calculate(circuit, Duration.ofNanos(1))) {
|
||||||
calculation.toString().lines().forEach(log::info);
|
calculation.toString().lines().forEach(log::info);
|
||||||
circuit.streamParts().forEach(part -> {
|
circuit.streamParts().forEach(part -> {
|
||||||
log.info("");
|
log.info("");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user