From 8f2619bb2311d41fc321519d9199d7e77a27e352 Mon Sep 17 00:00:00 2001 From: Lucas Stratmann <lucas.stratmann@student.reutlingen-university.de> Date: Thu, 3 Sep 2020 16:04:23 +0200 Subject: [PATCH] Wiring, Resetbutton, Potilabel --- UML.dia | Bin 17331 -> 18197 bytes .../ardublock/simulator/Simulator.java | 12 ++-- .../ardublock/simulator/arduino/Arduino.java | 3 + .../ardublock/simulator/arduino/Pin.java | 3 + .../ardublock/simulator/arduino/Variable.java | 3 + .../ardublock/simulator/simcode/SimCode.java | 3 + .../simcode/comm/CodeConnectString.java | 2 + .../simcode/comm/CodeSerialPrint.java | 1 + .../simulator/simcode/control/CodeDelay.java | 2 +- .../simulator/simcode/control/CodeElse.java | 2 +- .../simulator/simcode/control/CodeElseIf.java | 2 +- .../simulator/simcode/control/CodeFor.java | 2 +- .../simcode/control/CodeForCount.java | 2 +- .../simulator/simcode/control/CodeIf.java | 1 + .../simulator/simcode/control/CodeTypeIf.java | 2 + .../simulator/simcode/control/CodeWhile.java | 2 +- .../simcode/control/CodeWhileMillis.java | 2 +- .../simcode/datatypes/SimTypeBool.java | 2 +- .../simcode/datatypes/SimTypeInt.java | 2 +- .../simcode/datatypes/SimTypeString.java | 2 +- .../functions/CodeExecuteFunction.java | 2 +- .../simcode/functions/SimCodeFunction.java | 2 +- .../simulator/simcode/io/CodeAnalogRead.java | 4 +- .../simulator/simcode/io/CodeAnalogWrite.java | 2 +- .../simulator/simcode/io/CodeDigitalRead.java | 3 +- .../simcode/io/CodeDigitalWrite.java | 2 +- .../ardublock/simulator/view/GUI.java | 50 +++++++++++-- .../simulator/view/modules/ArduinoUno.java | 66 ++++++++++++++++-- .../simulator/view/modules/Button.java | 16 ++++- .../simulator/view/modules/Modul.java | 13 +++- .../simulator/view/modules/Poti.java | 42 ++++++++++- .../ardublock/simulator/view/modules/RGB.java | 14 ++++ 32 files changed, 231 insertions(+), 35 deletions(-) diff --git a/UML.dia b/UML.dia index f9f2622288ad09c5e631c423b1693e4af6b500fd..8ff568e509c13da6e3fdfcacfb332b5fcab30a2c 100644 GIT binary patch literal 18197 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 Aga7~l literal 17331 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N} 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]t9r%IEqjY0Df$tgW68)u!D_{Xu{j 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 diff --git a/src/tec/letsgoing/ardublock/simulator/Simulator.java b/src/tec/letsgoing/ardublock/simulator/Simulator.java index ca867aa..9185bb9 100644 --- a/src/tec/letsgoing/ardublock/simulator/Simulator.java +++ b/src/tec/letsgoing/ardublock/simulator/Simulator.java @@ -27,12 +27,16 @@ import tec.letsgoing.ardublock.simulator.simcode.vars.CodeMillis; import tec.letsgoing.ardublock.simulator.view.GUI; /** - * @author Lucas + * Diese Klasse verwaltet alle Elemente des Simulators. Sie ist geschrieben als Singelton. + * * * Pinmapping: * RGB: 9,10,11 * Poti: A5 * Button: 3,4,5 + * @author Lucas + * + * */ public class Simulator implements Runnable, ActionListener { @@ -43,10 +47,8 @@ public class Simulator implements Runnable, ActionListener { private Thread simuThread; private Vector<SimCodeFunction> functionsCode = new Vector<SimCodeFunction>(); - - //changed to public by Anian - //private Simulator() { - public Simulator() { + + private Simulator() { createSubClasses(); } diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java index 1970fe8..9956dd5 100644 --- a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java @@ -11,7 +11,10 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; import tec.letsgoing.ardublock.simulator.view.GUI; /** + * Diese Klasse hält die Daten eines "virtuellen" Arduinos und verwaltet die Hardware * @author Lucas + * + * * */ public class Arduino { diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java index d1f0662..c24d32a 100644 --- a/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java @@ -7,7 +7,10 @@ import java.util.Observable; import java.util.Observer; /** + * Diese Klasse ist für einen Pin auf dem Arduino * @author Lucas + * + * * */ public class Pin extends Observable { diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java index 109fd7f..22fdba8 100644 --- a/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java @@ -6,7 +6,10 @@ package tec.letsgoing.ardublock.simulator.arduino; import tec.letsgoing.ardublock.simulator.simcode.SimCode; /** + * Diese Klasse speichert eine Variable und stellt diese über Operationen zur Verfügung * @author Lucas + * + * * */ public class Variable { diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java index c306437..04d81c1 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java @@ -8,6 +8,9 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas + * + * Jedes Codeelement erbt von dieser dieser Klasse. + * Durch die run()-Methode kann jedes Code-Objekt ausgeführt werden. * */ public abstract class SimCode { diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java index b1c7c2e..2ac24cd 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java @@ -10,6 +10,8 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas + * + * Verbinde einen beliebigen Block mit einer Zeichenkette * */ public class CodeConnectString extends SimCode { diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java index 82aa58a..823fc3c 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java @@ -11,6 +11,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas + * Sende Nachricht via Serial * */ public class CodeSerialPrint extends SimCode { diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeDelay.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeDelay.java index d64ddf2..1a2a743 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeDelay.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeDelay.java @@ -10,7 +10,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Warte Millisekunden. */ public class CodeDelay extends SimCode { SimTypeInt codeBlock; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElse.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElse.java index 200f52e..a628aec 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElse.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElse.java @@ -11,7 +11,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Führe Befehle aus, falls "falls"-Block FALSCH (und evtl. "sonst falls"-Block) sind. */ public class CodeElse extends CodeTypeIf { private Vector<SimCode> codeBlocks; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElseIf.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElseIf.java index 837d21e..42bd522 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElseIf.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeElseIf.java @@ -12,7 +12,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Führe die Befehle aus wenn falls-Block FALSCH ist und Bedingung WAHR ist. */ public class CodeElseIf extends CodeTypeIf { private CodeTypeIf follow; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeFor.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeFor.java index 3a8ca8f..5969616 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeFor.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeFor.java @@ -12,7 +12,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Wiederhole die Befehle x-mal. */ public class CodeFor extends SimCode { SimTypeInt count; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java index d441b28..9d7b600 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java @@ -13,7 +13,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Wiederhole die Befehle x-mal. Die Wiederholungen werden in der Variable gespeichert. */ public class CodeForCount extends SimCode { private SimTypeInt count; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeIf.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeIf.java index 7ac50fe..e604af3 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeIf.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeIf.java @@ -13,6 +13,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas * + * Führe Befehle aus, wenn die Bedingung WAHR ist. */ public class CodeIf extends CodeTypeIf { private CodeTypeIf follow; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeTypeIf.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeTypeIf.java index 4efc4c5..378b1d9 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeTypeIf.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeTypeIf.java @@ -9,6 +9,8 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas + * + * Unterklasse für die If-Codeblöcke * */ public abstract class CodeTypeIf extends SimCode { diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhile.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhile.java index 68db29f..3a1d4bf 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhile.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhile.java @@ -12,7 +12,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Führe Befehle aus, solange die Bedingung WAHR ist. */ public class CodeWhile extends SimCode { SimTypeBool condition; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java index 6ca2717..e9d7db6 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java @@ -13,7 +13,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Befehle ausserhalb von mache werden nur alle x-Millisekunden ausgeführt\nDie Startzeit jedes Durchgangs wird in der Variable gespeichert */ public class CodeWhileMillis extends SimCode { private SimTypeInt duration; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeBool.java b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeBool.java index 0179cbc..90850f7 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeBool.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeBool.java @@ -9,7 +9,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Klasse für einen BooldatenTyp */ public class SimTypeBool extends SimCode { boolean value = false; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeInt.java b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeInt.java index e1e8998..e70b468 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeInt.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeInt.java @@ -9,7 +9,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Klasse für einen Int-Datentyp */ public class SimTypeInt extends SimCode { private int value = 0; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeString.java b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeString.java index 0dba4ae..8d38b79 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeString.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/datatypes/SimTypeString.java @@ -9,7 +9,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Klasse für einen Zeichenketten Datentyp */ public class SimTypeString extends SimCode { private String content; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/functions/CodeExecuteFunction.java b/src/tec/letsgoing/ardublock/simulator/simcode/functions/CodeExecuteFunction.java index a64f5ec..63c2189 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/functions/CodeExecuteFunction.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/functions/CodeExecuteFunction.java @@ -8,7 +8,7 @@ import tec.letsgoing.ardublock.simulator.simcode.SimCode; /** * @author Lucas - * + * Führt das Unterprogramm mit dem Namen aus. */ public class CodeExecuteFunction extends SimCode { private String name; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/functions/SimCodeFunction.java b/src/tec/letsgoing/ardublock/simulator/simcode/functions/SimCodeFunction.java index 61859e1..fe0aff0 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/functions/SimCodeFunction.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/functions/SimCodeFunction.java @@ -11,7 +11,7 @@ import tec.letsgoing.ardublock.simulator.simcode.SimCode; /** * @author Lucas - * + * Erstellt ein Unterprogramm. */ public class SimCodeFunction { private String name; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogRead.java b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogRead.java index 4b855a4..1ccd918 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogRead.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogRead.java @@ -9,7 +9,9 @@ import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeInt; import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** - * @author Lucas //TODO Block Beschreibung realtiv zu Ardublock + * Liest den analogen Wert vom Pin [0V=0;5V=1023] + * @author Lucas + * */ public class CodeAnalogRead extends SimCode { private SimTypeInt pin; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogWrite.java b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogWrite.java index 8d6c35e..2fd74c2 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogWrite.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeAnalogWrite.java @@ -10,7 +10,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * PWM-Ausgang Wert[0-255] zuweisen */ public class CodeAnalogWrite extends SimCode { private SimTypeInt pin; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalRead.java b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalRead.java index 8edb168..bbe6a23 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalRead.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalRead.java @@ -10,8 +10,9 @@ import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeInt; import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** + * Liest den digitalen Wert des Pins ein [HIGH/LOW] * @author Lucas - * + * */ public class CodeDigitalRead extends SimCode { private SimTypeInt pin; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalWrite.java b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalWrite.java index fa98aac..496cb22 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalWrite.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/io/CodeDigitalWrite.java @@ -11,7 +11,7 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** * @author Lucas - * + * Ausgang eines digitalen Ausgangs festlegen (HIGH/LOW) */ public class CodeDigitalWrite extends SimCode { SimTypeInt pin; diff --git a/src/tec/letsgoing/ardublock/simulator/view/GUI.java b/src/tec/letsgoing/ardublock/simulator/view/GUI.java index 4b560d3..7bcd7f0 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/GUI.java +++ b/src/tec/letsgoing/ardublock/simulator/view/GUI.java @@ -3,11 +3,16 @@ */ package tec.letsgoing.ardublock.simulator.view; +import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Stroke; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; @@ -33,6 +38,7 @@ import tec.letsgoing.ardublock.simulator.view.modules.Poti; import tec.letsgoing.ardublock.simulator.view.modules.RGB; /** + * Verwaltet die graphische Oberfläche. * @author Lucas * */ @@ -45,17 +51,32 @@ public class GUI extends JFrame implements Runnable, ActionListener { public GUI(Simulator simu) { super("ArdubBlock Simulator"); - // TODO Module geben Pin Positionen modules[0] = new RGB(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/PM31_RGB_LED.png")))); modules[1] = new Button(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/PM26_Taster.png"))),new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/Taster_Off.png"))),new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/Taster_On.png")))); modules[2] = new Poti(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/PM24_Potentiometer.png")))); - modules[3] = new ArduinoUno(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/ArduinoUno.png")))); - + modules[3] = new ArduinoUno(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/ArduinoUno.png"))),simu); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); Container mainPane = this.getContentPane(); - JPanel modulPanel = new JPanel(new BorderLayout()); + JPanel modulPanel = new JPanel(new BorderLayout()) { + @Override + public void paint(Graphics g) { + + super.paint(g); + + for (int i =-1 ; i<2;i++) { + g.setColor(Color.BLACK); + g.fillRect(i*294+261, 183, 60, 5); + g.setColor(Color.RED); + g.fillRect(i*294+261, 211, 60, 5); + + } + drawConnections(g); + + } + }; modulPanel.add(modules[0].getPane(), BorderLayout.WEST); modulPanel.add(modules[1].getPane(), BorderLayout.CENTER); modulPanel.add(modules[2].getPane(), BorderLayout.EAST); @@ -65,7 +86,8 @@ public class GUI extends JFrame implements Runnable, ActionListener { mainPane.add(createControlPanel(simu), BorderLayout.LINE_END); mainPane.add(createSerialLog(), BorderLayout.PAGE_END); this.pack(); - //this.setLocation(-1000, 0); Code to Run the Window on seconds screen + System.out.println(modules[2].getPane().getLocation()); + //this.setLocation(-1300, 0); //FIXME Code to Run the Window on second screen this.setVisible(true); } @@ -129,6 +151,24 @@ public class GUI extends JFrame implements Runnable, ActionListener { panel.add(scrollPane, BorderLayout.PAGE_END); return panel; } + + private void drawConnections(Graphics g) { + int[] assignment= {11,10,9,5,4,3,19}; + g.setColor(Color.ORANGE); + Vector<Point> pinArduino=modules[3].getPinPos(); + Point posArduino=modules[3].getPosition(); + int counter=0; + Stroke roundLine=new BasicStroke(5,BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); + for (int i=0;i<3;i++) { + Vector<Point> pos =modules[i].getPinPos(); + for (Point p:pos) { + Graphics2D g2 = (Graphics2D) g; + g2.setStroke(roundLine); + g2.drawLine(p.x+modules[i].getPosition().x, p.y+modules[i].getPosition().y, pinArduino.get(assignment[counter]).x+posArduino.x, pinArduino.get(assignment[counter]).y+posArduino.y); + counter++; + } + } + } public void run() { while (!stopFlag) { diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java index cc8d31a..6c04cf9 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java @@ -8,16 +8,23 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; +import javax.swing.JToggleButton; +import tec.letsgoing.ardublock.simulator.Simulator; import tec.letsgoing.ardublock.simulator.arduino.Arduino; import tec.letsgoing.ardublock.simulator.arduino.Pin; import tec.letsgoing.ardublock.simulator.view.GUI; /** + * Modul für einen Arduino Uno * @author Lucas * */ @@ -26,15 +33,16 @@ public class ArduinoUno extends Modul { private boolean ledOn; private int led13 = 0; - public ArduinoUno(ImageIcon _icon) { - - // TODO Arduino mittig anordnen - layerpane.setPreferredSize(new Dimension(587, 418)); + public ArduinoUno(ImageIcon _icon,Simulator simu) { + int locx=100; + int locy=50; + layerpane.setPreferredSize(new Dimension(587+locx, 418+locy));//587,418 JLabel chiplabel = new JLabel(); ImageIcon chipIcon = _icon; chipIcon = new ImageIcon(chipIcon.getImage().getScaledInstance(587, 418, Image.SCALE_SMOOTH)); chiplabel.setIcon(chipIcon); chiplabel.setSize(587, 418); + chiplabel.setLocation(locx, locy); layerpane.add(chiplabel, 0); JLabel labelPower = new JLabel() { @@ -50,7 +58,7 @@ public class ArduinoUno extends Modul { }; - labelPower.setLocation(504, 126); + labelPower.setLocation(504+locx, 126+locy); labelPower.setSize(20, 20); layerpane.add(labelPower, 0); @@ -64,9 +72,25 @@ public class ArduinoUno extends Modul { }; - label13.setLocation(257, 89); + label13.setLocation(257+locx, 89+locy); label13.setSize(20, 20); layerpane.add(label13, 0); + + JButton button = new JButton(); + button.setSize(70, 70); + button.setActionCommand("reset"); + button.addActionListener(simu); + button.setOpaque(false); + button.setContentAreaFilled(false); + button.setBorderPainted(false); + + JLabel labelButton = new JLabel(); + labelButton.add(button); + labelButton.setSize(60, 51); + labelButton.setLocation(64+locx, 1+locy); + layerpane.add(labelButton,0); + + calculatePinPos(locx,locy); } @@ -89,5 +113,35 @@ public class ArduinoUno extends Modul { tmpPin.setObserver(this); return true; } + + private void calculatePinPos(int locx,int locy) { + Vector<Point> pins=new Vector<Point>(); + int offset=0; + for (int i=15;i>1;i--) { + if (i<8)offset=-11; + pins.add(new Point(i*20+locx+246+offset,locy+19)); + } + for (int i=0;i<6;i++) { + pins.add(new Point(i*20+locx+447,locy+397)); + } + //Code to check the Pin Pos + /*JLabel label; + for (Point pin:pins) { + label= new JLabel() { + @Override + public void paintComponent(Graphics g) { + g.setColor(Color.RED); + g.fillRect(0, 0, 10, 10); + } + + }; + + label.setLocation(pin.x,pin.y); + label.setSize(10, 10); + layerpane.add(label, 0); + }*/ + this.setPinPos(pins); + } + } diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java index cd63318..4cebd9f 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java @@ -3,9 +3,14 @@ */ package tec.letsgoing.ardublock.simulator.view.modules; +import java.awt.Color; import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Vector; + import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JToggleButton; @@ -14,6 +19,7 @@ import tec.letsgoing.ardublock.simulator.arduino.Arduino; import tec.letsgoing.ardublock.simulator.arduino.Pin; /** + * Modul mit 3 Toogle Buttons * @author Lucas * */ @@ -64,7 +70,7 @@ public class Button extends Modul implements ActionListener { layerpane.add(label1, 0); layerpane.add(label2, 0); layerpane.add(label3, 0); - + calculatePinPos(); } public void updateModul(Pin pin) { @@ -109,5 +115,13 @@ public class Button extends Modul implements ActionListener { lastState[pin] = value; pins.get(pin).setValue(value); } + + private void calculatePinPos() { + Vector<Point> pins=new Vector<Point>(); + for (int i=0;i<3;i++) { + pins.add(new Point(i*30+117,235)); + } + this.setPinPos(pins); + } } diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java index 8a932b6..3522dc4 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java @@ -15,6 +15,7 @@ import tec.letsgoing.ardublock.simulator.arduino.Arduino; import tec.letsgoing.ardublock.simulator.arduino.Pin; /** + * Oberklasse für alle Module * @author Lucas * */ @@ -23,6 +24,7 @@ public abstract class Modul implements Observer { private Point position; protected Vector<Pin> pins = new Vector<Pin>(); protected JLayeredPane layerpane = new JLayeredPane(); + protected Vector<Point> pinPos=new Vector<Point>(); public void setState(boolean State) { active = State; @@ -37,7 +39,8 @@ public abstract class Modul implements Observer { } public Point getPosition() { - return position; + //return position; + return layerpane.getLocation(); } public void update(Observable Observable, Object arg1) { @@ -55,6 +58,14 @@ public abstract class Modul implements Observer { public void addPin(Pin _pin) { pins.add(_pin); } + + public Vector<Point> getPinPos() { + return pinPos; + } + + public void setPinPos(Vector<Point> _pins) { + pinPos=_pins; + } public JLayeredPane getPane() { return layerpane; diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java index be3ad1e..7c90764 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java @@ -3,7 +3,15 @@ */ package tec.letsgoing.ardublock.simulator.view.modules; +import java.awt.Color; import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.Hashtable; +import java.util.Vector; + import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -15,10 +23,11 @@ import tec.letsgoing.ardublock.simulator.arduino.Arduino; import tec.letsgoing.ardublock.simulator.arduino.Pin; /** + * Modul mit einem Potentiometer * @author Lucas * */ -public class Poti extends Modul implements ChangeListener { +public class Poti extends Modul implements ChangeListener, MouseWheelListener { int value = 0; JSlider slider; @@ -33,10 +42,19 @@ public class Poti extends Modul implements ChangeListener { slider.setMajorTickSpacing(256); slider.setMinorTickSpacing(64); slider.setPaintTicks(true); + + //Create the label table + Hashtable<Integer,JLabel> labelTable = new Hashtable<Integer,JLabel>(); + labelTable.put( new Integer( 10 ), new JLabel("0 V") ); + labelTable.put( new Integer( 512 ), new JLabel("2.5 V") ); + labelTable.put( new Integer( 1023 ), new JLabel("5 V") ); + slider.setLabelTable( labelTable ); + slider.setPaintLabels(true); slider.setPreferredSize(new Dimension(180,50)); slider.setOpaque(false); slider.addChangeListener(this); + slider.addMouseWheelListener(this); JPanel sliderPanel=new JPanel(); sliderPanel.add(slider); @@ -46,6 +64,9 @@ public class Poti extends Modul implements ChangeListener { layerpane.add(chiplabel, 0); layerpane.add(sliderPanel,0); + calculatePinPos(); + + } @@ -67,4 +88,23 @@ public class Poti extends Modul implements ChangeListener { pins.get(0).setValue(slider.getValue()); } + + @Override + public void mouseWheelMoved(MouseWheelEvent arg0) { + int notches = arg0.getWheelRotation(); + if (notches > 0) { + slider.setValue(slider.getValue()+10); + } else { + slider.setValue(slider.getValue()-10); + } + + + + } + private void calculatePinPos() { + Vector<Point> pins=new Vector<Point>(); + pins.add(new Point(30+117,235)); + this.setPinPos(pins); + } + } diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java index 104e87e..0c92578 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java @@ -7,6 +7,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Point; +import java.util.Vector; + import javax.swing.ImageIcon; import javax.swing.JLabel; @@ -14,6 +17,7 @@ import tec.letsgoing.ardublock.simulator.arduino.Arduino; import tec.letsgoing.ardublock.simulator.arduino.Pin; /** + * Modul mit einer RGB LED * @author Lucas * */ @@ -44,6 +48,8 @@ public class RGB extends Modul { ledlabel.setLocation(107, 37); ledlabel.setSize(200, 200); layerpane.add(ledlabel, 0); + calculatePinPos(); + } public void updateModul(Pin pin) { @@ -71,5 +77,13 @@ public class RGB extends Modul { return true; } + + private void calculatePinPos() { + Vector<Point> pins=new Vector<Point>(); + for (int i=0;i<3;i++) { + pins.add(new Point(i*30+117,235)); + } + this.setPinPos(pins); + } } -- GitLab