diff --git a/src/tec/letsgoing/ardublock/simulator/Simulator.java b/src/tec/letsgoing/ardublock/simulator/Simulator.java index 2affd255374a5d1ef2e341d0dc4e517fb601b223..24104a349205032cf680bc34ebd5089587009230 100644 --- a/src/tec/letsgoing/ardublock/simulator/Simulator.java +++ b/src/tec/letsgoing/ardublock/simulator/Simulator.java @@ -26,8 +26,7 @@ import tec.letsgoing.ardublock.simulator.view.GUI; /** * Diese Klasse verwaltet alle Elemente des Simulators. Sie ist geschrieben als * Singelton. Daher wird die Instanz über getInstance geholt und der Konstruktor - * ist private. - * + * ist private.<br> * * Pinmapping: RGB: 9,10,11 Poti: A0 Button: 2,3,4 * @@ -35,27 +34,46 @@ import tec.letsgoing.ardublock.simulator.view.GUI; * * */ - public class Simulator implements Runnable, ActionListener { private static Simulator instance; private Arduino arduino; private GUI gui; private Thread guiThread; private Thread simuThread; - private Vector<SimCodeFunction> functionsCode = new Vector<SimCodeFunction>(); + /** + * Privater Konstruktor der Klasse Simulator<br> + * Die Klasse ist als Singelton geschrieben, daher sollte diese Konstruktor nie + * direkt aufgerufen werden. + */ private Simulator() { createSubClasses(); } + /** + * Funktion um die Instanz des Simulators zu erhalten. <br> + * Da es sich um einen Singelton handelt ist die Instanz bei jedem Aufruf die + * gleiche. + * + * @return Instanz des Simulators + */ public static synchronized Simulator getInstance() { if (instance == null) { instance = new Simulator(); + } else { + instance.reload(); } return instance; } + /** + * Erzeugt die Instanzen für die Klassen GUI und Arduino und initialisiert + * diese.<br> + * Startet den GUI-Thread. + * + * @return true + */ private boolean createSubClasses() { gui = new GUI(this); arduino = new Arduino(gui); @@ -67,6 +85,10 @@ public class Simulator implements Runnable, ActionListener { return true; } + /** + * Startet den Simulation<br> + * Wird durch den Play-Button gestartet. + */ public void startSimu() { arduino.setStop(false); if (simuThread instanceof Thread) { @@ -85,17 +107,23 @@ public class Simulator implements Runnable, ActionListener { } + /** + * Funktion welche vom Thread ausgeführt wird, nachdem Thread.start() ausgeführt + * wurde.<br> + * Aktiviert die Power-LED und führt die main-Funktion im Arduino aus. + */ @Override public void run() { arduino.getPin(20).setValue(1023); // Power ON LED arduino.setStop(false); - arduino.getFunction("main").run(arduino, null); -// while (!arduino.getStop()) { -// arduino.getFunction("loop").run(arduino, null); -// } } + /** + * Stoppt die Ausführung des Simulators.<br> + * Ruft dabei einem mal die Thread.interrupt() auf, weswegen alle sleep Aufrufe + * eine Interrupt Execption abfangen müssen. + */ public void stopSimu() { arduino.setStop(true); if (simuThread instanceof Thread) { @@ -106,7 +134,12 @@ public class Simulator implements Runnable, ActionListener { } - // reload new code from Ardublock + /** + * Setzt den Simulator wieder in den Ausgangszustand zurück. + * + * @return true, wenn der Thread korrekt gestoppt wurde und false, wenn der + * Thread nicht korrekt beendet wurde. + */ public boolean reload() { if (simuThread instanceof Thread) { stopSimu(); @@ -115,6 +148,7 @@ public class Simulator implements Runnable, ActionListener { } catch (InterruptedException e) { // e.printStackTrace(); arduino.errorAbort("Thread Überwachung gestört - Bitte Programm neustarten"); + return false; } } Point locationWindow = gui.getLocation(); @@ -130,7 +164,11 @@ public class Simulator implements Runnable, ActionListener { return true; } - // Function to reset the Arduino in the Simulation + /** + * Führt einen Reset des Arduinos aus und startet diesen neu. + * + * @return true + */ public boolean reset() { if (simuThread instanceof Thread) { stopSimu(); @@ -139,12 +177,21 @@ public class Simulator implements Runnable, ActionListener { } catch (InterruptedException e) { } } - startSimu(); - return true; } + /** + * Fügt dem Simulator eine neue Funktion hinzu. Diese wird sogleich auch dem + * Arduino übergeben.<br> + * Note: Es werden Funktionen nur hinzugefügt und nicht überschrieben. Sollte + * eine alte Funktion überschrieben werden, sollte zuvor resetFunctions() + * aufgerufen werden. + * + * @param _functionsCode Ein SimCodeFunction Objekt, welches hinzugefügt werden + * soll + * @return true + */ public boolean addFunctionsCode(SimCodeFunction _functionsCode) { functionsCode.add(_functionsCode); arduino.addFunction(_functionsCode); @@ -152,10 +199,13 @@ public class Simulator implements Runnable, ActionListener { } /** - * Function to Clear the Storage of saved Functions in Simulator-Class. After - * this a reload is needed to clear the Arduino. + * Funktion, welche den Funktionsspeicher in der Simulatorklasse und Arduino + * löscht.<br> + * Soll vor dem hochladen eines neuen Programms durchgeführt werden.<br> + * Vor dem ausführen muss der Simulator gestoppt werden, da sonst der Thread + * eine Nullpointer Exception hat. * - * @return boolean=true if the functions where correctly reset + * @return true */ public boolean resetFunctions() { functionsCode.clear(); @@ -164,6 +214,10 @@ public class Simulator implements Runnable, ActionListener { return true; } + /** + * Funktion, welche die GUI Interaktion verarbeitet und die entsprechenden + * Funktionen startet. + */ public void actionPerformed(ActionEvent arg0) { String command = arg0.getActionCommand(); if (command == "go") { @@ -180,6 +234,8 @@ public class Simulator implements Runnable, ActionListener { } /** + * Demo-Main Funktion. Nicht Teil des normalen Simulators. + * * @param args * @throws InterruptedException */ @@ -191,14 +247,14 @@ public class Simulator implements Runnable, ActionListener { SimTypeBool b1 = new SimTypeBool(true); SimTypeBool b0 = new SimTypeBool(false); - //SimTypeString s1 = new SimTypeString("CodeString Test"); - //SimTypeInt d1 = new SimTypeInt(9); + // SimTypeString s1 = new SimTypeString("CodeString Test"); + // SimTypeInt d1 = new SimTypeInt(9); SimTypeInt d5 = new SimTypeInt(5); SimTypeInt d3 = new SimTypeInt(0); SimTypeInt d9 = new SimTypeInt(9); SimTypeInt delay = new SimTypeInt(testdelay); - //SimTypeString s2 = new SimTypeString(d1); - //CodeAdd s5 = new CodeAdd(d1, d5); + // SimTypeString s2 = new SimTypeString(d1); + // CodeAdd s5 = new CodeAdd(d1, d5); // testLoop.add(new CodeDigitalWrite(d2, b0)); // testLoop.add(new CodeDelay(delay)); diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java index 0a268c16448d569c4a2f6de9ddb62e7e2c0895ac..aeeb06280a3dcec30dc39daf64c373cfb7bf737a 100644 --- a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java @@ -15,9 +15,6 @@ import tec.letsgoing.ardublock.simulator.view.GUI; * Hardware * * @author Lucas - * - * - * */ public class Arduino { private GUI gui; @@ -27,6 +24,10 @@ public class Arduino { private long startTime = 0; private volatile boolean stopFlag = false; + /** + * Konstruktor der Klasse Arduino. + * @param _gui Die GUI Instanz mit welcher die Hardware verknüpft wird. + */ public Arduino(GUI _gui) { gui = _gui; for (int i = 0; i < 21; i++) { @@ -34,12 +35,23 @@ public class Arduino { } } + /** + * Erzeugt eine globale Variable. + * @param _name Name der Variable + * @param _value Wert der Variable + */ public void createVariable(String _name, SimCode _value) { vars.add(new Variable(_name)); vars.lastElement().setValue(_value); } + /** + * Setzt eine globale Variable + * @param _name Name der Variable + * @param _value Wert der Variable + * @return true, wenn die Variable gesetzt wurde - false, wenn die Variable nicht vorhanden ist. + */ public boolean setVariable(String _name, SimCode _value) { for (Variable var : vars) { if (var.getName().equals(_name)) { @@ -51,6 +63,12 @@ public class Arduino { return false; } + /** + * Liest den Wert einer globalen Variable. + * Sollte diese nicht existieren, so wird die Ausführung des Programms beendet. + * @param _name Name der Variable + * @return SimCode die Variable + */ public SimCode readVariable(String _name) { for (Variable var : vars) { @@ -63,6 +81,13 @@ public class Arduino { return new SimTypeInt(0); } + /** + * Die digitalWrite Funktion vom Arduino + * @param _pin + * @param _value boolean + * @return true, wenn Pin korrekt - false, wenn es sich um einen falschen Pin handelt. + * + */ public boolean digitalWrite(int _pin, boolean _value) { if (_pin > 19) { this.errorAbort("Write auf Pin aufgerufen, welcher nicht existiert"); @@ -75,6 +100,11 @@ public class Arduino { return true; } + /** + * Funktion um den digitalen Wert eines Pins zu lesen. + * @param _pin Nummer des Pins + * @return boolean des Pin-Wertes + */ public boolean digitalRead(int _pin) { if (_pin > 19) { this.errorAbort("Read auf Pin aufgerufen, welcher nicht existiert"); @@ -86,6 +116,12 @@ public class Arduino { return false; } + /** + * Funktion für die analoge PWM Ausgabe. + * @param _pin Anzusteuernder Pin + * @param _value PWM-Wert + * @return true, für PWM Pin - false für nicht PWM-Pin + */ public boolean analogWrite(int _pin, int _value) { int[] array = { 3, 5, 6, 9, 10, 11 }; for (int i = 0; i < 6; i++) { @@ -98,17 +134,31 @@ public class Arduino { return false; } + /** + * Funktion um den analogen Wert eines Pins zu lesen + * @param _pin Zahl ohne das Vorangestellte A + * @return Wert des Pins + */ public int analogRead(int _pin) { if (_pin > 5) { this.errorAbort("AnalogRead auf nicht vorhandenen Pin angewendet"); } - return pins[_pin + 13].getValue(); + return pins[_pin + 14].getValue(); } + /** + * Funktion um ein speziellen Pin als Objekt zu erhalten + * @param number Absolute Nummer des Pins + * @return Pin-Objekt + */ public Pin getPin(int number) { return pins[number]; } + /** + * Reset-Funktion welche alle Variabeln löscht und Pins zurücksetzt. + * @return true + */ public boolean reset() { vars = new Vector<Variable>(); @@ -118,28 +168,52 @@ public class Arduino { return true; } + /** + * Löscht die im Arduino gespeicherten Funktionen + */ public void resetFunctions() { functions.clear(); } + /** + * Sendet einen Aufruf an die GUI für eine neue SerialPrint Zeile. + * @param content String welcher ausgegeben werden soll. + */ public void serialPrint(String content) { if (!stopFlag) { gui.serialPrint(content); } } + /** + * Füge eine Funktion zum Funktionsspeicher hinzu + * @param function SimCodeFunction Objekt, welches hinzugefügt werden soll. + */ public void addFunction(SimCodeFunction function) { functions.add(function); } + /** + * Speichere die aktuelle Zeit als startTime ab. <br> + * Dies wird benötigt, damit die Berechnung von millis() korrekt ist. + */ public void setStartTime() { startTime = System.currentTimeMillis(); } + /** + * Berechnung der vergangenen Millisekunden seit Programmstart + * @return Millisekunden seit Programmstart. + */ public int getMillis() { return (int) (System.currentTimeMillis() - startTime); } + /** + * Rufe eine Funktion aus dem Funktionsspeicher des Arduino ab. + * @param name Name der gesuchten Funktion + * @return SimCodeFunction-Objekt dieser Funktion + */ public SimCodeFunction getFunction(String name) { for (SimCodeFunction function : functions) { if (function.getName().equals(name)) { @@ -150,14 +224,26 @@ public class Arduino { return null; } + /** + * Setze das Stop-Flag auf einen boolean-Wert. + * @param value true für Ausführungsstop + */ public void setStop(boolean value) { stopFlag = value; } + /** + * Lese das Stop-Flag + * @return Wert des Stop-Flag + */ public boolean getStop() { return stopFlag; } + /** + * Funktion um die Ausführung intern zu beenden und eine Fehlermeldung im SerialLog anzuzeigen. + * @param error Fehlerbeschreibung für das SerialLog. + */ public void errorAbort(String error) { this.serialPrint("Fehler im Programm: " + error + " - Programm wird beendet\n"); this.setStop(true); diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java index 556a2c1f471a31d87895bd1ae35cc768c67adb14..18c7105e74cc4f4085247b8b539118eb849e8d4e 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java @@ -18,6 +18,12 @@ import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; */ public abstract class SimCode { + /** + * Hauptaufruf, welcher während der Simulation ausgeführt wird. Dieser enthält die komplette Logik des Blocks. + * @param _arduino Die Instanz des Arduinos, damit Zugriffe auf die Hardware möglich sind. + * @param functionHead Aktueller Funktionskopf um lokale Variablen zu ermöglichen. + * @return Ein SimCode Objekt sollte eines als "Ergebnis" entstehen. Ansonsten null + */ public abstract SimCode run(Arduino _arduino, SimCodeFunction functionHead); public abstract String toString(); diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java index 5a8e6d57abeb9a84667d392437346c7f398843f3..e53a56bebbcaf1ffdbd4738982c1efd9c96a452f 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeConnectString.java @@ -9,7 +9,7 @@ import tec.letsgoing.ardublock.simulator.simcode.datatypes.SimTypeString; import tec.letsgoing.ardublock.simulator.simcode.functions.SimCodeFunction; /** - * Verbinde einen beliebigen Block mit einer Zeichenkette + * Verbinde zwei beliebige Blöcke miteinander zu einem String. * * @author Lucas * diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java index df1cc91ce29cf47cfac088aed48287e8c75c9e23..89fa78d28f8637b6c206d1555ffc467c09762602 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/comm/CodeSerialPrint.java @@ -33,7 +33,7 @@ public class CodeSerialPrint extends SimCode { } _arduino.serialPrint(content); try { - Thread.sleep(1); // Übertragung benötigt Zeit und SPAM führt zu unresposivness. + Thread.sleep(1); // Übertragung benötigt Zeit und SPAM führt zu unresposivness der GUI } catch (InterruptedException e) { } return null; diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java index 5b2bdf9c6be21cf5d00cfcfecacc5a829729b332..97ca796fd00705661c50d7da844119785355e012 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeForCount.java @@ -32,7 +32,6 @@ public class CodeForCount extends SimCode { // TODO For/While Mit Vars ausrüsten @Override public SimCode run(Arduino _arduino, SimCodeFunction functionHead) { - // TODO delete Var after completion functionHead.createVariable(varname.toString(), new SimTypeInt(0)); for (int i = 0; i < count.run(_arduino, functionHead).getValue(); i++) { functionHead.setVariable(varname.toString(), new SimTypeInt(i)); diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java index 06e82d9d4a5a9afa1713a9061c754023e7a07b69..2d798d592f1f579512af5819874e1c531ebdb2ca 100644 --- a/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java +++ b/src/tec/letsgoing/ardublock/simulator/simcode/control/CodeWhileMillis.java @@ -31,7 +31,6 @@ public class CodeWhileMillis extends SimCode { @Override public SimCode run(Arduino _arduino, SimCodeFunction functionHead) { - // TODO Docu: Vergleich der Zeiten bis zum Überlauf zwischen C und Java functionHead.createVariable(varname.toString(), new SimTypeInt(_arduino.getMillis())); int startTime = _arduino.getMillis(); int dura = duration.run(_arduino, functionHead).getValue(); diff --git a/src/tec/letsgoing/ardublock/simulator/view/GUI.java b/src/tec/letsgoing/ardublock/simulator/view/GUI.java index e6f57646f7a87f2dcd29484261d332a8e8e2116e..a9e9b008ef6ba11fa52f6b8935a277eac5572ac1 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/GUI.java +++ b/src/tec/letsgoing/ardublock/simulator/view/GUI.java @@ -44,18 +44,21 @@ import tec.letsgoing.ardublock.simulator.view.modules.RGB; * */ public class GUI extends JFrame implements Runnable, ActionListener { - /** - * - */ private static final long serialVersionUID = 1L; - private static final int MAXIMUM_MESSAGES = 100; + private static final int MAXIMUM_MESSAGES = 100; //Anzahl der Seriellen Nachrichten private Vector<String> serialprint = new Vector<String>(); private Modul[] modules = new Modul[4]; private volatile boolean stopFlag = false; private JTextArea serialLog = new JTextArea(); + /** + * Konstruktor der Klasse GUI + * @param simu Instanz des Simulators + */ public GUI(Simulator simu) { super("ArdubBlock Simulator"); + + //Konstruktor der Module 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"))), @@ -65,32 +68,21 @@ public class GUI extends JFrame implements Runnable, ActionListener { modules[3] = new ArduinoUno(new ImageIcon(getToolkit().getImage(GUI.class.getResource("/img/ArduinoUno.png"))), simu); - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Vermutlich nicht gewünscht. this.setResizable(false); Container mainPane = this.getContentPane(); + //Panel welches alle Module sowie die Verdrahtung enthält. JPanel modulPanel = new JPanel(new BorderLayout()) { - /** - * - */ private static final long serialVersionUID = 1L; @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); - + drawConnections(g); //Zeichne Verdrahtung } }; + //Füge Module hinzu modulPanel.add(modules[0].getPane(), BorderLayout.WEST); modulPanel.add(modules[1].getPane(), BorderLayout.CENTER); modulPanel.add(modules[2].getPane(), BorderLayout.EAST); @@ -100,12 +92,16 @@ 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(-1300, 0); //FIXME Code to Run the Window on second screen + // this.setLocation(-1300, 0); //Möglichkeit die Renderingposition festzulegen this.setVisible(true); } + /** + * Erzeugt das Controlpanel mit den Steuerungsknöpfen + * @param simu Instanz des Simulators + * @return JPanel mit allen Knöpfen + */ private JPanel createControlPanel(Simulator simu) { JPanel controlPanel = new JPanel(); controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); @@ -138,10 +134,14 @@ public class GUI extends JFrame implements Runnable, ActionListener { return controlPanel; } + /** + * Erzeuge den Bereich mit dem SerialLog + * @return JPanel des SerialLogs + */ private JPanel createSerialLog() { JPanel panel = new JPanel(new BorderLayout()); JScrollPane scrollPane = new JScrollPane(serialLog); - serialLog.setRows(8); + serialLog.setRows(8); //Anzahl der Angezeigten Reihen serialLog.setAutoscrolls(true); serialLog.setForeground(Color.black); serialLog.setBackground(Color.white); @@ -164,7 +164,21 @@ public class GUI extends JFrame implements Runnable, ActionListener { return panel; } + /** + * Zeichne alle Verdrahtungen, welcher über die Modulgrenzen hinausgehen.<br> + * Diese Funktion ist sehr "Hardgecoded" eine Änderung an den Pin Zuordnungen wird hier Probleme verursachen. + * @param g Graphics Instanz des Panels + */ private void drawConnections(Graphics g) { + //Zeichne die Stromversorgung + 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); + } + + //Zeichne die Signalleitungen int[] assignment = { 11, 10, 9, 4, 3,2 , 14 }; g.setColor(Color.ORANGE); Vector<Point> pinArduino = modules[3].getPinPos(); @@ -176,7 +190,7 @@ public class GUI extends JFrame implements Runnable, ActionListener { for (Point p : pos) { Graphics2D g2 = (Graphics2D) g; g2.setStroke(roundLine); - if (counter > 5) { + if (counter > 5) { // Fall für die analoge Signalleitung g2.drawLine(p.x + modules[i].getPosition().x, p.y + modules[i].getPosition().y, p.x + modules[i].getPosition().x, pinArduino.get(assignment[counter]).y + posArduino.y-40); g2.drawLine(p.x + modules[i].getPosition().x, pinArduino.get(assignment[counter]).y + posArduino.y-40, @@ -185,7 +199,7 @@ public class GUI extends JFrame implements Runnable, ActionListener { g2.drawLine(pinArduino.get(assignment[counter]).x + posArduino.x, pinArduino.get(assignment[counter]).y + posArduino.y-40, pinArduino.get(assignment[counter]).x + posArduino.x, pinArduino.get(assignment[counter]).y + posArduino.y); - } else { + } else { //Alle anderen Signalleitungen g2.drawLine(p.x + modules[i].getPosition().x, p.y + modules[i].getPosition().y, p.x + modules[i].getPosition().x, p.y + modules[i].getPosition().y + 90 - (counter) * 10); g2.drawLine(p.x + modules[i].getPosition().x, @@ -196,19 +210,19 @@ public class GUI extends JFrame implements Runnable, ActionListener { p.y + modules[i].getPosition().y + 90 - (counter) * 10, pinArduino.get(assignment[counter]).x + posArduino.x, pinArduino.get(assignment[counter]).y + posArduino.y); - // 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++; } } } + /** + *Funktion welche die GUI aktualisiert und auf 144Hz ausgelegt ist. + */ public void run() { while (!stopFlag) { try { - Thread.sleep(7); + Thread.sleep(7); //144Hz } catch (InterruptedException e) { // e.printStackTrace(); @@ -217,6 +231,11 @@ public class GUI extends JFrame implements Runnable, ActionListener { } } + /** + * Fügt eine neue Nachricht der SerialLog hinzu und löscht eventuell alte Nachrichten. + * @param content Auszugebener String + * @return true + */ public boolean serialPrint(String content) { serialprint.add(content); if (serialprint.size() > MAXIMUM_MESSAGES) { @@ -230,6 +249,11 @@ public class GUI extends JFrame implements Runnable, ActionListener { return true; } + /** + * Verbindet alle Modulen mit ihren Pin Objekten auf dem Arduino. + * @param arduino Instanz der Arduinoklasse + * @return true + */ public boolean connectPins(Arduino arduino) { for (Modul modul : modules) { modul.connect(arduino); diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java index dfd867c106f4903b90f5b64d5f68beac944639aa..ea379ed1d1201842149b6e019bb3b562d3fa989e 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java @@ -31,9 +31,11 @@ public class ArduinoUno extends Modul { private int led13 = 0; public ArduinoUno(ImageIcon _icon, Simulator simu) { + //Offset für den Arduino um diesen mehr mittig zu platzieren. int locx = 50; int locy = 50; - layerpane.setPreferredSize(new Dimension(587 + locx, 418 + locy));// 587,418 + + layerpane.setPreferredSize(new Dimension(587 + locx, 418 + locy)); JLabel chiplabel = new JLabel(); ImageIcon chipIcon = _icon; chipIcon = new ImageIcon(chipIcon.getImage().getScaledInstance(587, 418, Image.SCALE_SMOOTH)); @@ -42,12 +44,9 @@ public class ArduinoUno extends Modul { chiplabel.setLocation(locx, locy); layerpane.add(chiplabel, 0); + //Label für die PowerLED JLabel labelPower = new JLabel() { - /** - * - */ private static final long serialVersionUID = 1L; - @Override public void paintComponent(Graphics g) { Graphics2D ga = (Graphics2D) g; @@ -64,12 +63,9 @@ public class ArduinoUno extends Modul { labelPower.setSize(20, 20); layerpane.add(labelPower, 0); + //Label für die Pin 13 LED JLabel label13 = new JLabel() { - /** - * - */ private static final long serialVersionUID = 1L; - @Override public void paintComponent(Graphics g) { Graphics2D ga = (Graphics2D) g; @@ -83,6 +79,7 @@ public class ArduinoUno extends Modul { label13.setSize(20, 20); layerpane.add(label13, 0); + //unsichtbarer Resetbutton JButton button = new JButton(); button.setSize(70, 70); button.setActionCommand("reset"); @@ -132,7 +129,7 @@ public class ArduinoUno extends Modul { for (int i = 0; i < 6; i++) { pins.add(new Point(i * 20 + locx + 447, locy + 397)); } - // Code to check the Pin Pos + // Dieser Code malt kleine Rechtecke an die PinPositionen um sie besser zu überprüfen. /* * JLabel label; for (Point pin:pins) { label= new JLabel() { * diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java index 16230697ab44b0a0640ab55cdd9f14fafc04afe4..a49fe3c4a50e0a36ea98cbf758489b70150a33b5 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java @@ -99,6 +99,9 @@ public class Button extends Modul implements ActionListener { return true; } + /** + * Funktion reagiert auf die Mausklicks und ändert das Icon + */ public void actionPerformed(ActionEvent arg0) { Integer pin = Integer.parseInt(arg0.getActionCommand()); boolean bool = ((JToggleButton) arg0.getSource()).isSelected(); diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java index d45de05dfd88ce157989eca89d1dda233ffd8d2d..646d4e53dc5b29c20aa2e3b38c6d5d9ac9137cd7 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java @@ -39,10 +39,12 @@ public abstract class Modul implements Observer { } public Point getPosition() { - // return position; return layerpane.getLocation(); } + /** + *Funktion welche aufgerufen wird, sobald sich ein Pin ändert. + */ public void update(Observable Observable, Object arg1) { if (Observable instanceof Pin) { for (Pin p : pins) { diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java index 28e0e5771e00babfa0f04dab0bf2bba81fea6302..c52a0f5fb7efe5c777664ec15be84b38dd6474a9 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java @@ -36,13 +36,13 @@ public class Poti extends Modul implements ChangeListener, MouseWheelListener { ImageIcon chipIcon = _icon; chiplabel.setIcon(chipIcon); chiplabel.setSize(294, 294); - slider = new JSlider(JSlider.HORIZONTAL, 0, 1024, 512); + slider = new JSlider(JSlider.HORIZONTAL, 0, 1023, 512); slider.setMajorTickSpacing(256); slider.setMinorTickSpacing(64); slider.setPaintTicks(true); - // Create the label table + //Erzeuge eine individuelle Slider Beschriftung 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")); @@ -79,14 +79,18 @@ public class Poti extends Modul implements ChangeListener, MouseWheelListener { return true; } + /** + * Funktion wird aufgerufen, wenn die Maus den Slider bewegt hat. + */ @Override public void stateChanged(ChangeEvent arg0) { - if (slider.getValue() == 1024) - slider.setValue(1023); // Kleiner Trick damit die 1024 angezeigt wird aber keinen Fehler verursacht pins.get(0).setValue(slider.getValue()); } + /** + * Funktion wird aufgerufen, wenn das Mausrad bewegt wurde. + */ @Override public void mouseWheelMoved(MouseWheelEvent arg0) { int notches = arg0.getWheelRotation(); diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java index 4c6f5a632899f148169bbe4e9defc116f8fe80b0..f4efe999d6c172b82fad3682f823a28f897651c5 100644 --- a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java @@ -28,6 +28,7 @@ public class RGB extends Modul { private int blueValue = 0; public RGB(ImageIcon _icon) { + //Erstellen der JLayerPane für das Modul layerpane.setPreferredSize(new Dimension(294, 294)); JLabel chiplabel = new JLabel(); ImageIcon chipIcon = _icon; @@ -35,10 +36,8 @@ public class RGB extends Modul { chiplabel.setSize(294, 294); layerpane.add(chiplabel, 1); + //Erzeuge ein JLabel welches das Leuchten der LED darstellt. JLabel ledlabel = new JLabel() { - /** - * - */ private static final long serialVersionUID = 1L; @Override @@ -50,7 +49,8 @@ public class RGB extends Modul { } }; - + + //Setze Position des Labels ledlabel.setLocation(107, 37); ledlabel.setSize(200, 200); layerpane.add(ledlabel, 0); @@ -58,6 +58,9 @@ public class RGB extends Modul { } + /** + * Funktion, welche die Pin Änderungen entgegen nimmt und verarbeitet. + */ public void updateModul(Pin pin) { if (pin == pins.get(0)) redValue = pin.getValue() / 4; @@ -67,6 +70,9 @@ public class RGB extends Modul { greenValue = pin.getValue() / 4; } + /** + * Verbindet das RGB Modul mit seinen 3 Pins am Arduino + */ public boolean connect(Arduino arduino) { // TODO Pins= R G B ? Aktuell RBG Pin tmpPin = arduino.getPin(11); @@ -84,6 +90,9 @@ public class RGB extends Modul { return true; } + /** + * Funktion, welche die Positionen der Modulpins berechnet (in Pixeln für das Zeichnen der Verdrahtung) + */ private void calculatePinPos() { Vector<Point> pins = new Vector<Point>(); for (int i = 0; i < 3; i++) {