Circuit, Battery, Light, propagate
This commit is contained in:
commit
803145617b
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/.idea/
|
||||||
|
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
30
pom.xml
Normal file
30
pom.xml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>de.ph87</groupId>
|
||||||
|
<artifactId>Electro</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.32</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-simple</artifactId>
|
||||||
|
<version>2.0.12</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
||||||
19
src/main/java/de/ph87/electro/Main.java
Normal file
19
src/main/java/de/ph87/electro/Main.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package de.ph87.electro;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.Circuit;
|
||||||
|
import de.ph87.electro.circuit.part.PartBattery;
|
||||||
|
import de.ph87.electro.circuit.part.other.PartLight;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
final Circuit circuit = new Circuit();
|
||||||
|
final PartBattery battery = circuit.addBattery("Batterie", 1, 0, 3);
|
||||||
|
final PartLight light = circuit.addLight("Licht", 1, 1, 3);
|
||||||
|
circuit.connect(battery.getMinus(), light.getMinus());
|
||||||
|
circuit.connect(battery.getPlus(), light.getPlus());
|
||||||
|
circuit.evaluate();
|
||||||
|
circuit.getParts().forEach(System.out::println);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
50
src/main/java/de/ph87/electro/circuit/Circuit.java
Normal file
50
src/main/java/de/ph87/electro/circuit/Circuit.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package de.ph87.electro.circuit;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.junction.Junction;
|
||||||
|
import de.ph87.electro.circuit.junction.Wire;
|
||||||
|
import de.ph87.electro.circuit.part.Part;
|
||||||
|
import de.ph87.electro.circuit.part.PartOther;
|
||||||
|
import de.ph87.electro.circuit.part.PartBattery;
|
||||||
|
import de.ph87.electro.circuit.part.other.PartLight;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class Circuit {
|
||||||
|
|
||||||
|
private final List<Part> parts = new ArrayList<>();
|
||||||
|
|
||||||
|
private final List<PartBattery> batteries = new ArrayList<>();
|
||||||
|
|
||||||
|
private final List<PartOther> others = new ArrayList<>();
|
||||||
|
|
||||||
|
private final List<Wire> wires = new ArrayList<>();
|
||||||
|
|
||||||
|
public PartBattery addBattery(final String name, final int x, final int y, final double voltage) {
|
||||||
|
final PartBattery battery = new PartBattery(name, x, y, voltage);
|
||||||
|
parts.add(battery);
|
||||||
|
batteries.add(battery);
|
||||||
|
return battery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PartLight addLight(final String name, final int x, final int y, final double maxVoltage) {
|
||||||
|
final PartLight light = new PartLight(name, x, y, maxVoltage);
|
||||||
|
parts.add(light);
|
||||||
|
others.add(light);
|
||||||
|
return light;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void connect(final Junction a, final Junction b) {
|
||||||
|
wires.add(new Wire(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void evaluate() {
|
||||||
|
wires.forEach(Wire::reset);
|
||||||
|
parts.forEach(Part::reset);
|
||||||
|
batteries.forEach(PartBattery::propagate);
|
||||||
|
others.forEach(PartOther::evaluate);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
5
src/main/java/de/ph87/electro/circuit/ShortCircuit.java
Normal file
5
src/main/java/de/ph87/electro/circuit/ShortCircuit.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package de.ph87.electro.circuit;
|
||||||
|
|
||||||
|
public class ShortCircuit extends Exception {
|
||||||
|
|
||||||
|
}
|
||||||
64
src/main/java/de/ph87/electro/circuit/junction/Junction.java
Normal file
64
src/main/java/de/ph87/electro/circuit/junction/Junction.java
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package de.ph87.electro.circuit.junction;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.ShortCircuit;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString(onlyExplicitlyIncluded = true)
|
||||||
|
public class Junction {
|
||||||
|
|
||||||
|
@ToString.Include
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private final Point position;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@ToString.Include
|
||||||
|
private double voltage = Double.NaN;
|
||||||
|
|
||||||
|
private final List<Wire> wires = new ArrayList<>();
|
||||||
|
|
||||||
|
public Junction(final String name, final int x, final int y) {
|
||||||
|
this.name = name;
|
||||||
|
this.position = new Point(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
voltage = Double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void injectVoltage(final double newVoltage) throws ShortCircuit {
|
||||||
|
if (voltage == newVoltage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Double.isNaN(voltage)) {
|
||||||
|
voltage = newVoltage;
|
||||||
|
for (Wire wire : wires) {
|
||||||
|
wire.propagateVoltage(this);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new ShortCircuit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void propagateVoltage(final Wire source) throws ShortCircuit {
|
||||||
|
if (voltage == source.getVoltage()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Double.isNaN(voltage)) {
|
||||||
|
voltage = source.getVoltage();
|
||||||
|
for (Wire wire : this.wires) {
|
||||||
|
wire.propagateVoltage(this);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new ShortCircuit();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
42
src/main/java/de/ph87/electro/circuit/junction/Wire.java
Normal file
42
src/main/java/de/ph87/electro/circuit/junction/Wire.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package de.ph87.electro.circuit.junction;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.ShortCircuit;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class Wire {
|
||||||
|
|
||||||
|
private final Junction junction0;
|
||||||
|
|
||||||
|
private final Junction junction1;
|
||||||
|
|
||||||
|
private double voltage = Double.NaN;
|
||||||
|
|
||||||
|
public Wire(final Junction junction0, final Junction junction1) {
|
||||||
|
if (junction0 == junction1) {
|
||||||
|
throw new RuntimeException("Cannot connect Pin to itself!");
|
||||||
|
}
|
||||||
|
this.junction0 = junction0;
|
||||||
|
this.junction1 = junction1;
|
||||||
|
junction0.getWires().add(this);
|
||||||
|
junction1.getWires().add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
voltage = Double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void propagateVoltage(final Junction source) throws ShortCircuit {
|
||||||
|
if (voltage == source.getVoltage()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Double.isNaN(this.voltage)) {
|
||||||
|
voltage = source.getVoltage();
|
||||||
|
junction0.propagateVoltage(this);
|
||||||
|
junction1.propagateVoltage(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new ShortCircuit();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
33
src/main/java/de/ph87/electro/circuit/part/Part.java
Normal file
33
src/main/java/de/ph87/electro/circuit/part/Part.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package de.ph87.electro.circuit.part;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.junction.Junction;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@ToString(onlyExplicitlyIncluded = true)
|
||||||
|
public abstract class Part {
|
||||||
|
|
||||||
|
@ToString.Include
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private Point position;
|
||||||
|
|
||||||
|
protected final List<Junction> junctions = new ArrayList<>();
|
||||||
|
|
||||||
|
protected Part(final String name, final int x, final int y) {
|
||||||
|
this.name = name;
|
||||||
|
this.position = new Point(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
junctions.forEach(Junction::reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
39
src/main/java/de/ph87/electro/circuit/part/PartBattery.java
Normal file
39
src/main/java/de/ph87/electro/circuit/part/PartBattery.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package de.ph87.electro.circuit.part;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.ShortCircuit;
|
||||||
|
import de.ph87.electro.circuit.junction.Junction;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class PartBattery extends Part {
|
||||||
|
|
||||||
|
private final Junction plus;
|
||||||
|
|
||||||
|
private final Junction minus;
|
||||||
|
|
||||||
|
private final double voltage;
|
||||||
|
|
||||||
|
private ShortCircuit shortCircuit = null;
|
||||||
|
|
||||||
|
public PartBattery(final String name, final int x, final int y, final double voltage) {
|
||||||
|
super(name, x, y);
|
||||||
|
this.voltage = voltage;
|
||||||
|
minus = new Junction("-", 0, 1);
|
||||||
|
plus = new Junction("+", 2, 1);
|
||||||
|
junctions.add(minus);
|
||||||
|
junctions.add(plus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void propagate() {
|
||||||
|
try {
|
||||||
|
shortCircuit = null;
|
||||||
|
minus.injectVoltage(0);
|
||||||
|
plus.injectVoltage(voltage);
|
||||||
|
} catch (ShortCircuit e) {
|
||||||
|
shortCircuit = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
11
src/main/java/de/ph87/electro/circuit/part/PartOther.java
Normal file
11
src/main/java/de/ph87/electro/circuit/part/PartOther.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package de.ph87.electro.circuit.part;
|
||||||
|
|
||||||
|
public abstract class PartOther extends Part {
|
||||||
|
|
||||||
|
protected PartOther(final String name, final int x, final int y) {
|
||||||
|
super(name, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void evaluate();
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
package de.ph87.electro.circuit.part.other;
|
||||||
|
|
||||||
|
import de.ph87.electro.circuit.junction.Junction;
|
||||||
|
import de.ph87.electro.circuit.part.PartOther;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
|
import static java.lang.Math.abs;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class PartLight extends PartOther {
|
||||||
|
|
||||||
|
private final double maxVoltage;
|
||||||
|
|
||||||
|
private final Junction minus;
|
||||||
|
|
||||||
|
private final Junction plus;
|
||||||
|
|
||||||
|
private boolean defect = false;
|
||||||
|
|
||||||
|
private double voltage = 0;
|
||||||
|
|
||||||
|
public PartLight(final String name, final int x, final int y, final double maxVoltage) {
|
||||||
|
super(name, x, y);
|
||||||
|
this.maxVoltage = maxVoltage;
|
||||||
|
minus = new Junction("", 0, 1);
|
||||||
|
plus = new Junction("", 2, 1);
|
||||||
|
junctions.add(minus);
|
||||||
|
junctions.add(plus);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void repair() {
|
||||||
|
defect = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void evaluate() {
|
||||||
|
voltage = abs(plus.getVoltage() - minus.getVoltage());
|
||||||
|
if (voltage > maxVoltage) {
|
||||||
|
defect = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user