diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Character.java b/src/simulator/Character.java similarity index 88% rename from src/Character.java rename to src/simulator/Character.java index b584da1..829c149 100644 --- a/src/Character.java +++ b/src/simulator/Character.java @@ -1,3 +1,5 @@ +package simulator; + import java.awt.*; public class Character extends Rectangle { @@ -24,6 +26,9 @@ public class Character extends Rectangle { private double lastTimestamp; private double lastError; private double lastSpeed; + private double error; + private double dt; + private double errorRate; public static Character getInstance() { if (instance == null) { @@ -44,9 +49,9 @@ private Character(int width, int height, int sourceX, int sourceY) { } public void update() { - double error = Setpoint.getInstance().x - this.x; - double dt = System.currentTimeMillis() - lastTimestamp; - double errorRate = (error - lastError) / dt; + error = Setpoint.getInstance().x - this.x; + dt = System.currentTimeMillis() - lastTimestamp; + errorRate = (error - lastError) / dt; if (Math.abs(error) < I_ZONE) errorSum += error; int moveValue = (int) (error * kP + errorSum * kI + errorRate * kD); moveValue = (int) normalizeSpeed(moveValue); @@ -99,4 +104,13 @@ public void setPID(double kP, double kI, double kD) { setI(kI); setD(kD); } + + public double getError() { + return error; + } + + public double getRate() { + return errorRate; + } + } diff --git a/src/Main.java b/src/simulator/Main.java similarity index 68% rename from src/Main.java rename to src/simulator/Main.java index ea7f478..1c85d3e 100644 --- a/src/Main.java +++ b/src/simulator/Main.java @@ -1,3 +1,7 @@ +package simulator; + +import simulator.Window; + public class Main { public static void main(String[] args) { diff --git a/src/RerunButton.java b/src/simulator/RerunButton.java similarity index 91% rename from src/RerunButton.java rename to src/simulator/RerunButton.java index 221462f..96cc9b5 100644 --- a/src/RerunButton.java +++ b/src/simulator/RerunButton.java @@ -1,7 +1,7 @@ +package simulator; + import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; public class RerunButton extends JButton { diff --git a/src/Setpoint.java b/src/simulator/Setpoint.java similarity index 96% rename from src/Setpoint.java rename to src/simulator/Setpoint.java index 1308468..e3d7051 100644 --- a/src/Setpoint.java +++ b/src/simulator/Setpoint.java @@ -1,3 +1,5 @@ +package simulator; + import java.awt.*; public class Setpoint extends Rectangle { diff --git a/src/Window.java b/src/simulator/Window.java similarity index 90% rename from src/Window.java rename to src/simulator/Window.java index 3b719d0..15db388 100644 --- a/src/Window.java +++ b/src/simulator/Window.java @@ -1,8 +1,10 @@ -import textfields.BaseTextField; +package simulator; + +import simulator.information.Status; +import simulator.textfields.BaseTextField; import javax.swing.*; import java.awt.*; -import java.util.Set; public class Window extends JPanel { @@ -17,6 +19,7 @@ public class Window extends JPanel { private final BaseTextField kPField; private final BaseTextField kIField; private final BaseTextField kDField; + private final Status status; private Window() { super(IS_DOUBLE_BUFFERED); @@ -27,6 +30,7 @@ private Window() { character = Character.getInstance(); setpoint = Setpoint.getInstance(); rerunButton = RerunButton.getInstance(); + status = Status.getInstance(); kPField = new BaseTextField("kP", 300, 30); kIField = new BaseTextField("kI", 600, 30); kDField = new BaseTextField("kD", 900, 30); @@ -34,6 +38,7 @@ private Window() { this.add(kPField); this.add(kIField); this.add(kDField); + this.add(status); } @Override @@ -59,6 +64,7 @@ private void update() { delay(0.02); character.update(); character.setPID(kPField.getValue(), kIField.getValue(), kDField.getValue()); + status.update(); repaint(); } diff --git a/src/simulator/information/Status.java b/src/simulator/information/Status.java new file mode 100644 index 0000000..a58d172 --- /dev/null +++ b/src/simulator/information/Status.java @@ -0,0 +1,63 @@ +package simulator.information; + +import simulator.Character; + +import javax.swing.*; +import javax.swing.border.LineBorder; +import java.awt.*; + +public class Status extends JPanel { + + private static final int WIDTH = 640; + private static final int HEIGHT = 640; + private static final int X = 800; + private static final int Y = 480; + private static final int FONT_SIZE = 20; + private JTextField characterError; + private JTextField errorRate; + + private static Status instance; + + public static Status getInstance() { + if (instance == null) { + instance = new Status(); + } + return instance; + } + + private Status() { + configureCharacterError(); + configureErrorRate(); + this.add(characterError); + this.add(errorRate); + this.setLayout(null); + this.setVisible(true); + this.setBounds(X, Y, WIDTH, HEIGHT); + this.setBackground(Color.GRAY); + } + + public void configureCharacterError() { + characterError = new JTextField("Error: " + Character.getInstance().getError()); + characterError.setSize(200, 50); + characterError.setEditable(false); + characterError.setFont(new Font(Font.MONOSPACED, Font.PLAIN, FONT_SIZE)); + characterError.setLayout(null); + characterError.setBackground(Color.GRAY); + characterError.setBorder(new LineBorder(Color.GRAY)); + } + + public void configureErrorRate() { + errorRate = new JTextField("Error rate: " + Character.getInstance().getRate()); + errorRate.setBounds(0, 50, 400, 50); + errorRate.setEditable(false); + errorRate.setFont(new Font(Font.MONOSPACED, Font.PLAIN, FONT_SIZE)); + errorRate.setLayout(null); + errorRate.setBackground(Color.GRAY); + errorRate.setBorder(new LineBorder(Color.GRAY)); + } + + public void update() { + characterError.setText("Error: " + Character.getInstance().getError()); + errorRate.setText("Error rate: " + Character.getInstance().getRate()); + } +} diff --git a/src/textfields/BaseTextField.java b/src/simulator/textfields/BaseTextField.java similarity index 95% rename from src/textfields/BaseTextField.java rename to src/simulator/textfields/BaseTextField.java index 33fe81f..5fbc2d2 100644 --- a/src/textfields/BaseTextField.java +++ b/src/simulator/textfields/BaseTextField.java @@ -1,4 +1,4 @@ -package textfields; +package simulator.textfields; import javax.swing.*; import java.awt.*;