diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..d8e3e3ee170997d95bce4ca591a79b4e53c44236 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.project +.classpath +.settings/* +bin/* diff --git a/res/PM31_RGB_LED.png b/res/PM31_RGB_LED.png new file mode 100644 index 0000000000000000000000000000000000000000..0b41b57258a19805ff63071ce49a250acfe0d6fa Binary files /dev/null and b/res/PM31_RGB_LED.png differ diff --git a/src/tec/letsgoing/ardublock/simulator/Simulator.java b/src/tec/letsgoing/ardublock/simulator/Simulator.java new file mode 100644 index 0000000000000000000000000000000000000000..0e9e154354eaa1eb90f9e5af4281a477dc023c75 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/Simulator.java @@ -0,0 +1,145 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator; + +import java.util.Vector; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; +import tec.letsgoing.ardublock.simulator.simcode.SimCode; +import tec.letsgoing.ardublock.simulator.view.GUI; +import tec.letsgoing.ardublock.simulator.view.modules.RGB; + +/** + * @author Lucas + * + */ +public class Simulator implements Runnable { + private static Simulator instance; + private GUI gui; + private Thread guiThread; + private Thread simuThread; + private Arduino arduino; + private Vector<SimCode> setupCode; + private Vector<SimCode> loopCode; + private Vector<SimCode> functionsCode; + + private volatile boolean stopFlag=false; + + private Simulator() { + System.out.println("Konstruktor"); + createSubClasses(); + + + guiThread = new Thread(gui); + guiThread.start(); + } + + public static synchronized Simulator getInstance() { + if (instance==null) { + instance=new Simulator(); + } + return instance; + } + + private boolean createSubClasses () { + gui=new GUI(); + arduino=new Arduino(); + gui.connectPins(arduino); + return true; + } + + + public void startSimu() { + simuThread = new Thread(this); + simuThread.start(); + } + + + @Override + public void run() { + int counter = 0; + while (!stopFlag) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println("Thread"); + arduino.digitalWrite(0, true); + if (counter==2) arduino.digitalWrite(1, true); + if (counter==3) arduino.digitalWrite(2, true); + if (counter==4) arduino.digitalWrite(1, false); + + counter++; + } + } + + + public void stopSimu() { + stopFlag=true; + gui.stopThread(); + gui.dispose(); + } + + //reload new code from Ardublock + public boolean reload() { + + return true; + } + + //Function to reset the Arduino in the Simulation + public boolean reset() { + + return true; + } + + public boolean setSetupCode(Vector<SimCode> _setupCode) { + setupCode=_setupCode; + return true; + } + + public boolean setLoopCode(Vector<SimCode> _loopCode) { + loopCode=_loopCode; + return true; + } + + public boolean setFunctionsCode(Vector<SimCode> _functionsCode) { + functionsCode=_functionsCode; + return true; + } + + + + + + /** + * @param args + * @throws InterruptedException + */ + public static void main(String[] args) throws InterruptedException { + // TODO Auto-generated method stub + + + + System.out.println("Main Entry"); + Simulator simu = Simulator.getInstance(); + simu.startSimu(); + System.out.println("After Start"); + Thread.sleep(5000); + System.out.println("Send Stop"); + simu.stopSimu(); + System.out.println("Stopped"); + Thread.sleep(2000); + simu.startSimu(); + Thread.sleep(1000); + simu.stopSimu(); + + + + + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java new file mode 100644 index 0000000000000000000000000000000000000000..e72490600eb5e324f06e6533b13edb295ba90b21 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Arduino.java @@ -0,0 +1,78 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.arduino; + +import java.util.Vector; + +/** + * @author Lucas + * + */ +public class Arduino { + + private Vector<Variable> vars; + private Pin[] pins=new Pin[20]; + + public Arduino () { + for (int i =0;i<20;i++) { + pins[i]=new Pin(); + } + } + + public void createVariable(String _name,int _type, Object _value) { + //TODO search if Var ist already vorhanden + vars.add(new Variable(_name,_type)); + vars.lastElement().setValue(_value); + + } + + public void setVariable(String _name, Object _value) { + for(Variable var:vars) { + if (var.getName()==_name) { + var.setValue(_value); + break; + } + } + } + + public Object readVariable(String _name) { + for(Variable var:vars) { + if (var.getName()==_name) { + return var.getValue(); + } + } + return null; + } + + public boolean digitalWrite(int _pin, boolean _value) { + if (_value==true) pins[_pin].setValue(1023); + else pins[_pin].setValue(0); + return true; + } + + public boolean digitalRead(int _pin) { + if (pins[_pin].getValue()>=512) return true; + else return false; + } + //TODO Check Wie der Analogpin übergeben wird + public boolean analogWrite(int _pin,int _value) { + pins[_pin].setValue(_value); + return true; + } + + public int analogRead(int _pin) { + return pins[_pin].getValue(); + } + + public Pin getPin(int number) { + return pins[number]; + } + + public boolean reset() { + vars=new Vector<Variable>(); + pins=new Pin[20]; + return true; + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java new file mode 100644 index 0000000000000000000000000000000000000000..3ad235ba986660c22d84409728b7606495619c58 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Pin.java @@ -0,0 +1,52 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.arduino; + +import java.util.Observable; +import java.util.Observer; + +/** + * @author Lucas + * + */ +public class Pin extends Observable implements Observer { + private int value=0; + private boolean mode=false; //false == Input, true==Output + + @Override + public void update(Observable o, Object arg) { + // TODO Keine Funktionalität da noch kein Pinobjekt als Gegenstelle. +// System.out.println("Pin Update"); +// System.out.println(arg); + //Set Variable direkt + } + + public void setMode(boolean _mode) { + mode=_mode; + } + + public boolean getMode() { + return mode; + } + + + public void setValue(int _value) { + if (_value>1023) _value=1023; + if (_value<0) _value=0; + value=_value; + this.setChanged(); + this.notifyObservers(); + } + + public int getValue() { + return value; + } + + + + public void setObserver(Observer observ) { + this.addObserver(observ); + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java new file mode 100644 index 0000000000000000000000000000000000000000..d173669cfb8301376c2e7df6b83c32439f8109b1 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/arduino/Variable.java @@ -0,0 +1,40 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.arduino; + +/** + * @author Lucas + * + */ +public class Variable { + public static final int TYPE_INT=0; + public static final int TYPE_FLOAT=1; + public static final int TYPE_STRING=2; + + private String name; + private int type; + private Object value; + + public Variable(String _name,int _type) { + name=_name; + type=_type; + } + + public String getName() { + return name; + } + + public int getType() { + return type; + } + + public void setValue(Object _value) { + value=_value; + } + + public Object getValue() { + return value; + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java new file mode 100644 index 0000000000000000000000000000000000000000..100c8ec107420e0614c115381092c7536f2a90c2 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/simcode/SimCode.java @@ -0,0 +1,18 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.simcode; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; + +/** + * @author Lucas + * + */ +public abstract class SimCode { + + public void run(Arduino ArduinoClass) { + + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/GUI.java b/src/tec/letsgoing/ardublock/simulator/view/GUI.java new file mode 100644 index 0000000000000000000000000000000000000000..7ae24f297f712335519779a0bd138d2e8a3b8322 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/GUI.java @@ -0,0 +1,94 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.text.DefaultCaret; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.view.modules.ArduinoUno; +import tec.letsgoing.ardublock.simulator.view.modules.Button; +import tec.letsgoing.ardublock.simulator.view.modules.Modul; +import tec.letsgoing.ardublock.simulator.view.modules.Poti; +import tec.letsgoing.ardublock.simulator.view.modules.RGB; + +/** + * @author Lucas + * + */ +public class GUI extends JFrame implements Runnable{ + private Vector<String> serialprint; + private Modul[] modules= new Modul[4]; + private volatile boolean stopFlag=false; + private JTextArea serialLog=new JTextArea(); + + public GUI() { + super(); + //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + Container pane= this.getContentPane(); + JScrollPane scrollPane = new JScrollPane(serialLog); + DefaultCaret caret = (DefaultCaret)serialLog.getCaret(); + caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); + serialLog.setSize(20, 20); + serialLog.setRows(5); + serialLog.setAutoscrolls(true); + for (int i =0;i<105;i++) { + serialLog.append(Integer.toString(i)+"\n"); + } + + + pane.add(new JButton("Center"),BorderLayout.CENTER); + pane.add(new JButton("Line End"),BorderLayout.LINE_END); + pane.add(scrollPane,BorderLayout.PAGE_END); + this.setSize(400, 300); + this.setVisible(true); + + modules[0]= new RGB(); + modules[1]= new Button(); + modules[2]= new Poti(); + modules[3]= new ArduinoUno(); + } + + @Override + public void run() { + while (!stopFlag) { + System.out.println("Gui"); + super.repaint(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + public boolean serialPrint(String Content) { + serialprint.add(Content); + if (serialprint.size()>100) { + serialprint.remove(0); + } + + return true; + } + + public boolean connectPins(Arduino arduino) { + for (Modul modul:modules) { + modul.connect(arduino); + } + return true; + } + + public void stopThread() { + stopFlag=true; + } + +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java new file mode 100644 index 0000000000000000000000000000000000000000..322010c3c7b327fdb91d5da5de6a694e3356903d --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/ArduinoUno.java @@ -0,0 +1,26 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view.modules; + +import java.util.Observable; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; + +/** + * @author Lucas + * + */ +public class ArduinoUno extends Modul { + +public void updateModul(Pin arg0) { + + } + +public boolean connect(Arduino arduino) { + + return true; +} + +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java new file mode 100644 index 0000000000000000000000000000000000000000..f3b49775840524fd7314ebaa98705c2c8b3b9ca4 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Button.java @@ -0,0 +1,26 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view.modules; + +import java.util.Observable; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; + +/** + * @author Lucas + * + */ +public class Button extends Modul { + +public void updateModul(Pin pin) { + + } + +public boolean connect(Arduino arduino) { + + return true; +} + +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java new file mode 100644 index 0000000000000000000000000000000000000000..a1b496c5485426e85356d4126e1d7290d74a9d20 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Modul.java @@ -0,0 +1,69 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view.modules; + +import java.awt.Point; +import java.util.Observable; +import java.util.Observer; +import java.util.Vector; + +import javax.swing.JLayeredPane; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; + +/** + * @author Lucas + * + */ +public abstract class Modul extends Observable implements Observer{ + private boolean active; + private Point position; + protected Vector<Pin> pins=new Vector<Pin>(); + protected JLayeredPane layerpane; + + public void setState(boolean State) { + active=State; + } + + public boolean getState() { + return active; + } + + public void setPosition(Point Position) { + position=Position; + } + + public Point getPosition() { + return position; + } + + public void update(Observable arg0, Object arg1) { + System.out.println("Update"); + if (arg0 instanceof Pin) { + System.out.println("is Pin"); + for (Pin p:pins) { + if (p==(Pin)arg0) updateModul((Pin)arg0); + } + } + } + + public abstract void updateModul(Pin pin); + + public void addPin(Pin _pin) { + pins.add(_pin); + } + + public JLayeredPane getPane() { + return layerpane; + } + + public abstract boolean connect(Arduino arduino); + + + + + + +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java new file mode 100644 index 0000000000000000000000000000000000000000..0e259432c6be6dc098bc0914d8c469ed26941829 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/Poti.java @@ -0,0 +1,25 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view.modules; + +import java.util.Observable; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; + +/** + * @author Lucas + * + */ +public class Poti extends Modul { + +public void updateModul(Pin arg0) { + + } + +public boolean connect(Arduino arduino) { + + return true; +} +} diff --git a/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java new file mode 100644 index 0000000000000000000000000000000000000000..93922e74edd56693116352f395f7688151423427 --- /dev/null +++ b/src/tec/letsgoing/ardublock/simulator/view/modules/RGB.java @@ -0,0 +1,52 @@ +/** + * + */ +package tec.letsgoing.ardublock.simulator.view.modules; + +import java.util.Observable; +import java.util.Observer; + +import tec.letsgoing.ardublock.simulator.arduino.Arduino; +import tec.letsgoing.ardublock.simulator.arduino.Pin; + +/** + * @author Lucas + * + */ +public class RGB extends Modul { + private int redValue=0; + private int blueValue=0; + private int greenValue=0; + + + public void setObserver(Observer observ) { + this.addObserver(observ); + } + + + + public void updateModul(Pin pin) { + if (pin==pins.get(0)) redValue=pin.getValue(); + if (pin==pins.get(1)) blueValue=pin.getValue(); + if (pin==pins.get(2)) greenValue=pin.getValue(); + System.out.println("New Values: "+redValue+" "+blueValue+" "+greenValue); + } + + public boolean connect(Arduino arduino) { + System.out.println("Connected RGB"); + Pin tmpPin=arduino.getPin(0); + this.addPin(tmpPin); + tmpPin.setObserver(this); + + tmpPin=arduino.getPin(1); + this.addPin(tmpPin); + tmpPin.setObserver(this); + + tmpPin=arduino.getPin(2); + this.addPin(tmpPin); + tmpPin.setObserver(this); + + return true; + } + +}