diff --git a/simulation/.classpath b/simulation/.classpath
index 3717ff0..33968ad 100644
--- a/simulation/.classpath
+++ b/simulation/.classpath
@@ -4,6 +4,5 @@
-
diff --git a/simulation/src/de/c3ma/ollo/LuaSimulation.java b/simulation/src/de/c3ma/ollo/LuaSimulation.java
index 7ea3476..35d7fb0 100644
--- a/simulation/src/de/c3ma/ollo/LuaSimulation.java
+++ b/simulation/src/de/c3ma/ollo/LuaSimulation.java
@@ -9,5 +9,5 @@ package de.c3ma.ollo;
*/
public interface LuaSimulation {
- public void reboottriggered();
+ public void rebootTriggered();
}
diff --git a/simulation/src/de/c3ma/ollo/WS2812Simulation.java b/simulation/src/de/c3ma/ollo/WS2812Simulation.java
index c01d68c..02a8557 100644
--- a/simulation/src/de/c3ma/ollo/WS2812Simulation.java
+++ b/simulation/src/de/c3ma/ollo/WS2812Simulation.java
@@ -5,6 +5,7 @@ import java.io.IOException;
import java.nio.file.Files;
import javax.management.RuntimeErrorException;
+import javax.swing.SwingUtilities;
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
@@ -30,127 +31,130 @@ import de.c3ma.ollo.mockup.ESP8266Ws2812;
*/
public class WS2812Simulation implements LuaSimulation {
- private Globals globals = JsePlatform.standardGlobals();
- private ESP8266Tmr espTmr = new ESP8266Tmr();
- private ESP8266File espFile = new ESP8266File();
- private ESP8266Node espNode = new ESP8266Node(this);
- private DoFileFunction doFile = new DoFileFunction(globals);
- private ESP8266Ws2812 ws2812 = new ESP8266Ws2812();
- private String scriptName;
-
- public WS2812Simulation(File sourceFolder) {
- globals.load(new ESP8266Uart());
- globals.load(ws2812);
- globals.load(espTmr);
- globals.load(espFile);
- globals.load(espNode);
- globals.load(new ESP8266Wifi());
- globals.load(new ESP8266Net());
- globals.load(new ESP8266Time());
- globals.set("dofile", doFile);
-
- try {
- File tempFile = File.createTempFile("NodemcuSimuFile", "");
- File tempDir = new File(tempFile.getParent() + File.separator + "Nodemcu" + System.currentTimeMillis());
- tempDir.mkdir();
-
-
- System.out.println("[Nodemcu] Directory is " + tempDir.getAbsolutePath());
-
- // Copy all files into the temporary folder
- for (File f : sourceFolder.listFiles()) {
- Files.copy(f.toPath(), new File(tempDir.getAbsolutePath() + File.separator + f.getName()).toPath());
- }
+ private Globals globals = JsePlatform.standardGlobals();
+ private ESP8266Tmr espTmr = new ESP8266Tmr();
+ private ESP8266File espFile = new ESP8266File();
+ private ESP8266Node espNode = new ESP8266Node(this);
+ private DoFileFunction doFile = new DoFileFunction(globals);
+ private ESP8266Ws2812 ws2812 = new ESP8266Ws2812();
+ private String scriptName;
- espFile.setWorkingDirectory(tempDir);
- espNode.setWorkingDirectory(tempDir);
- doFile.setWorkingDirectory(tempDir);
- } catch (IOException e) {
- System.err.println("[Nodemcu] " + e.getMessage());
- espFile = null;
- espNode = null;
- }
- }
-
- public static void main(String[] args) {
-
- if (args.length == 0) {
- printUsage();
- return;
- }
-
- if (args.length >= 1) {
- File f = new File(args[0]);
- if (f.exists()) {
- WS2812Simulation simu = new WS2812Simulation(f.getParentFile());
- System.out.println("File : " + f.getAbsolutePath());
-
- if (args.length >= 2) {
- simu.setWS2812Layout(new File(args[1]));
- }
- try {
- if (args.length >= 3) {
- File additionalFile = new File(args[2]);
- if (additionalFile.exists() && (simu.doFile != null)) {
-
- Files.copy(additionalFile.toPath(),
- new File(simu.doFile.getWorkingDirectory() + File.separator + additionalFile.getName()).toPath());
- System.out.println("Integrate " + additionalFile.getName() + " into simulation");
- } else {
- System.err.println("Script " + args[2] + " cannot be found");
- System.exit(1);
- }
- }
-
- simu.callScript(f.getName());
- } catch (IOException e) {
- System.err.println("[Nodemcu] " + e.getMessage());
- }
- }
- } else {
- printUsage();
- }
-
- }
+ public WS2812Simulation(File sourceFolder) {
+ globals.load(new ESP8266Uart());
+ globals.load(ws2812);
+ globals.load(espTmr);
+ globals.load(espFile);
+ globals.load(espNode);
+ globals.load(new ESP8266Wifi());
+ globals.load(new ESP8266Net());
+ globals.load(new ESP8266Time());
+ globals.set("dofile", doFile);
- private void setWS2812Layout(File file) {
- if (file.exists()) {
- ws2812.setLayout(file);
- } else {
- throw new RuntimeException("WS2812 Layout: " + file.getAbsolutePath() + " does not exists");
- }
- }
+ try {
+ File tempFile = File.createTempFile("NodemcuSimuFile", "");
+ File tempDir = new File(tempFile.getParent() + File.separator + "Nodemcu" + System.currentTimeMillis());
+ tempDir.mkdir();
- private static void printUsage() {
- System.out.println("Usage:");
- System.out.println("one argument required: file to execute.");
- System.out.println(".e.g: init.lua");
- }
+ System.out.println("[Nodemcu] Directory is " + tempDir.getAbsolutePath());
- @Override
- public void reboottriggered() {
- System.out.println("=================== Reboot in Simulation -> call it again =================");
- this.espTmr.stopAllTimer();
- try {
- Thread.sleep(200);
- if (this.scriptName != null) {
- System.out.println("Reexecuting...");
- callScript(this.scriptName);
- }
- } catch (InterruptedException e) {
-
- }
-
- }
+ // Copy all files into the temporary folder
+ for (File f : sourceFolder.listFiles()) {
+ Files.copy(f.toPath(), new File(tempDir.getAbsolutePath() + File.separator + f.getName()).toPath());
+ }
- private void callScript(String filename) {
- this.scriptName=filename;
-
- if ((espFile != null) && (espFile.getFileInWorkingDir(filename) != null)) {
- LuaValue chunk = globals.loadfile(espFile.getFileInWorkingDir(filename).getAbsolutePath());
- chunk.call();
- } else {
- throw new RuntimeException("Copy into temporary folder failed; script not available");
- }
- }
+ espFile.setWorkingDirectory(tempDir);
+ espNode.setWorkingDirectory(tempDir);
+ doFile.setWorkingDirectory(tempDir);
+ } catch (IOException e) {
+ System.err.println("[Nodemcu] " + e.getMessage());
+ espFile = null;
+ espNode = null;
+ }
+ }
+
+ public static void main(String[] args) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ if (args.length == 0) {
+ printUsage();
+ return;
+ }
+
+ if (args.length >= 1) {
+ File f = new File(args[0]);
+ if (f.exists()) {
+ WS2812Simulation simu = new WS2812Simulation(f.getParentFile());
+ System.out.println("File : " + f.getAbsolutePath());
+
+ if (args.length >= 2) {
+ simu.setWS2812Layout(new File(args[1]));
+ }
+ try {
+ if (args.length >= 3) {
+ File additionalFile = new File(args[2]);
+ if (additionalFile.exists() && (simu.doFile != null)) {
+
+ Files.copy(additionalFile.toPath(), new File(simu.doFile.getWorkingDirectory()
+ + File.separator + additionalFile.getName()).toPath());
+ System.out.println("Integrate " + additionalFile.getName() + " into simulation");
+ } else {
+ System.err.println("Script " + args[2] + " cannot be found");
+ System.exit(1);
+ }
+ }
+
+ simu.callScript(f.getName());
+ } catch (IOException e) {
+ System.err.println("[Nodemcu] " + e.getMessage());
+ }
+ }
+ } else {
+ printUsage();
+ }
+
+ }
+ });
+ }
+
+ private void setWS2812Layout(File file) {
+ if (file.exists()) {
+ ws2812.setLayout(file);
+ } else {
+ throw new RuntimeException("WS2812 Layout: " + file.getAbsolutePath() + " does not exists");
+ }
+ }
+
+ private static void printUsage() {
+ System.out.println("Usage:");
+ System.out.println("one argument required: file to execute.");
+ System.out.println(".e.g: init.lua");
+ }
+
+ @Override
+ public void rebootTriggered() {
+ System.out.println("=================== Reboot in Simulation -> call it again =================");
+ this.espTmr.stopAllTimer();
+ try {
+ Thread.sleep(200);
+ if (this.scriptName != null) {
+ System.out.println("Reexecuting...");
+ callScript(this.scriptName);
+ }
+ } catch (InterruptedException e) {
+
+ }
+
+ }
+
+ private void callScript(String filename) {
+ this.scriptName = filename;
+
+ if ((espFile != null) && (espFile.getFileInWorkingDir(filename) != null)) {
+ LuaValue chunk = globals.loadfile(espFile.getFileInWorkingDir(filename).getAbsolutePath());
+ chunk.call();
+ } else {
+ throw new RuntimeException("Copy into temporary folder failed; script not available");
+ }
+ }
}
diff --git a/simulation/src/de/c3ma/ollo/mockup/ESP8266Node.java b/simulation/src/de/c3ma/ollo/mockup/ESP8266Node.java
index ab4fb8a..1ff7824 100644
--- a/simulation/src/de/c3ma/ollo/mockup/ESP8266Node.java
+++ b/simulation/src/de/c3ma/ollo/mockup/ESP8266Node.java
@@ -67,7 +67,7 @@ public class ESP8266Node extends TwoArgFunction {
@Override
public LuaValue call() {
System.out.println("[Node] Restart");
- nodemcuSimu.reboottriggered();
+ nodemcuSimu.rebootTriggered();
return LuaValue.valueOf(false);
}
diff --git a/simulation/src/de/c3ma/ollo/mockup/ESP8266Ws2812.java b/simulation/src/de/c3ma/ollo/mockup/ESP8266Ws2812.java
index f9df097..eda22c7 100644
--- a/simulation/src/de/c3ma/ollo/mockup/ESP8266Ws2812.java
+++ b/simulation/src/de/c3ma/ollo/mockup/ESP8266Ws2812.java
@@ -2,6 +2,9 @@ package de.c3ma.ollo.mockup;
import java.io.File;
+import javax.swing.SwingUtilities;
+
+import org.luaj.vm2.LuaString;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.OneArgFunction;
@@ -15,62 +18,70 @@ import de.c3ma.ollo.mockup.ui.WS2812Layout;
* creator: ollo
* project: WS2812Emulation
* $Id: $
+ *
* @author ollo
*/
public class ESP8266Ws2812 extends TwoArgFunction {
- private static WS2812Layout layout = null;
+ private static WS2812Layout layout = null;
- @Override
- public LuaValue call(LuaValue modname, LuaValue env) {
- env.checkglobals();
- final LuaTable ws2812 = new LuaTable();
- ws2812.set("init", new init());
- ws2812.set("write", new write());
- env.set("ws2812", ws2812);
- env.get("package").get("loaded").set("ws2812", ws2812);
- return ws2812;
- }
+ @Override
+ public LuaValue call(LuaValue modname, LuaValue env) {
+ env.checkglobals();
+ final LuaTable ws2812 = new LuaTable();
+ ws2812.set("init", new init());
+ ws2812.set("write", new write());
+ env.set("ws2812", ws2812);
+ env.get("package").get("loaded").set("ws2812", ws2812);
+ return ws2812;
+ }
- private class init extends ZeroArgFunction {
+ private class init extends ZeroArgFunction {
- @Override
- public LuaValue call() {
- System.out.println("[WS2812] init");
- return LuaValue.valueOf(true);
- }
-
- }
-
- private class write extends OneArgFunction {
+ @Override
+ public LuaValue call() {
+ System.out.println("[WS2812] init");
+ return LuaValue.valueOf(true);
+ }
- @Override
- public LuaValue call(LuaValue arg) {
- if (arg.isstring()) {
- int length = arg.checkstring().rawlen();
- if ((length % 3) == 0) {
- byte[] array = arg.toString().getBytes();
- for (int i = 0; i < length; i+=3) {
- if (ESP8266Ws2812.layout != null) {
- ESP8266Ws2812.layout.updateLED(i/3, array[i+0], array[i+1], array[i+2]);
- }
- }
- }
+ }
- if (ESP8266Ws2812.layout == null) {
- System.out.println("[WS2812] write length:" + length);
- } else {
- /*ESP8266Ws2812.layout.update(ESP8266Ws2812.layout.getGraphics());*/
- ESP8266Ws2812.layout.repaint();
- }
- }
- return LuaValue.valueOf(true);
- }
- }
+ private class write extends OneArgFunction {
- public void setLayout(File file) {
- if (ESP8266Ws2812.layout == null) {
- ESP8266Ws2812.layout = WS2812Layout.parse(file);
- }
- }
+ @Override
+ public LuaValue call(LuaValue arg) {
+ if (arg.isstring()) {
+ LuaString jstring = arg.checkstring();
+ int length = jstring.rawlen();
+ if ((length % 3) == 0) {
+ byte[] array = jstring.m_bytes;
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ for (int i = 0; i < length; i += 3) {
+ if (ESP8266Ws2812.layout != null) {
+ int r = array[i + 0]+(Byte.MIN_VALUE*-1);
+ int g = array[i + 1]+(Byte.MIN_VALUE*-1);
+ int b = array[i + 2]+(Byte.MIN_VALUE*-1);
+ ESP8266Ws2812.layout.updateLED(i / 3, r, g, b);
+ }
+ }
+ }
+ });
+ }
+
+ if (ESP8266Ws2812.layout == null) {
+ System.out.println("[WS2812] write length:" + length);
+ } else {
+ }
+ }
+ return LuaValue.valueOf(true);
+ }
+ }
+
+ public void setLayout(File file) {
+ if (ESP8266Ws2812.layout == null) {
+ ESP8266Ws2812.layout = WS2812Layout.parse(file);
+ }
+ }
}
diff --git a/simulation/src/de/c3ma/ollo/mockup/ui/WS2812Layout.java b/simulation/src/de/c3ma/ollo/mockup/ui/WS2812Layout.java
index 17e7636..cf2a977 100644
--- a/simulation/src/de/c3ma/ollo/mockup/ui/WS2812Layout.java
+++ b/simulation/src/de/c3ma/ollo/mockup/ui/WS2812Layout.java
@@ -10,6 +10,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import javax.swing.BorderFactory;
@@ -17,180 +18,177 @@ import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
/**
* created at 02.01.2018 - 12:57:02
* creator: ollo
* project: WS2812Emulation
* $Id: $
+ *
* @author ollo
*/
public class WS2812Layout extends JFrame {
-
- /**
- *
- */
- private static final long serialVersionUID = -6815557232118826140L;
-
- private ArrayList mLines = new ArrayList();
- private int mColumn = 0;
- private int mRow = 0;
- private Element[][] mElements;
- public static WS2812Layout parse(File file) {
- WS2812Layout layout = null;
- try {
- BufferedReader br = new BufferedReader(new FileReader(file));
- try {
- String line = br.readLine();
- if (line != null) {
- layout = new WS2812Layout();
- }
-
- while (line != null) {
- if (!line.startsWith("#")) {
- layout.mLines.add(line);
- layout.mRow++;
- layout.mColumn = Math.max(layout.mColumn, line.length());
- }
- /* get the next line */
- line = br.readLine();
- }
-
- /* parse each line */
- layout.parse();
- layout.createAndDisplayGUI();
- } finally {
- if (br != null) {
- br.close();
- }
- }
- } catch (IOException ioe) {
-
- }
- return layout;
- }
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6815557232118826140L;
- private void createAndDisplayGUI() {
- setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ private ArrayList mLines = new ArrayList();
+ private int mColumn = 0;
+ private int mRow = 0;
+ private Element[][] mElements;
- JPanel contentPane = new JPanel();
- contentPane.setLayout(new BorderLayout());
- contentPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
+ public static WS2812Layout parse(File file) {
+ WS2812Layout layout = null;
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(file));
+ try {
+ String line = br.readLine();
+ if (line != null) {
+ layout = new WS2812Layout();
+ }
- JPanel ledPanel = new JPanel();
- ledPanel.setLayout(new GridLayout(this.mRow, this.mColumn, 10, 10));
- for (int i = 0; i < this.mRow; i++)
- {
- for (int j = 0; j < this.mColumn; j++)
- {
- if (this.mElements[i][j] != null) {
- ledPanel.add(this.mElements[i][j]);
- }
- }
- }
- contentPane.add(ledPanel, BorderLayout.CENTER);
- JButton button = new JButton("Do something");
- button.setActionCommand("Do something");
- button.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent ae)
- {
- JButton but = (JButton) ae.getSource();
- //FIXME some clever logic
- }
- });
- contentPane.add(button, BorderLayout.SOUTH);
-
-
- setContentPane(contentPane);
- pack();
- setLocationByPlatform(true);
- setVisible(true);
- }
+ while (line != null) {
+ if (!line.startsWith("#")) {
+ layout.mLines.add(line);
+ layout.mRow++;
+ layout.mColumn = Math.max(layout.mColumn, line.length());
+ }
+ /* get the next line */
+ line = br.readLine();
+ }
- private void parse() {
- this.mElements = new Element[this.mRow][this.mColumn];
- int row=0;
- for (String line : this.mLines) {
- for (int i = 0; i < line.length(); i++) {
- char c = line.charAt(i);
- if ((('A' <= c) && (c <= 'Z')) ||
- (('0' <= c) && (c <= '9')) ||
- (c == 'Ä') || (c == 'Ö') || (c == 'Ü')) {
- this.mElements[row][i] = new Element(c);
- } else {
- this.mElements[row][i] = new Element();
- }
- this.mElements[row][i].setColor(0, 0, 0);
- }
- row++;
- }
- }
-
- public class Element extends JLabel {
-
- /**
- *
- */
- private static final long serialVersionUID = -3933903441113933637L;
-
- private boolean noText=false;
+ /* parse each line */
+ layout.parse();
+ layout.createAndDisplayGUI();
+ } finally {
+ if (br != null) {
+ br.close();
+ }
+ }
+ } catch (IOException ioe) {
- /**
- * Draw a simple rect
- */
- public Element() {
- super();
- this.noText = true;
- this.setBackground(Color.BLACK);
- }
-
- /**
- * Draw a character
- * @param character to show
- */
- public Element(char character) {
- super(""+character);
- setFont(new Font("Dialog", Font.BOLD, 24));
- setHorizontalAlignment(CENTER);
- //FIXME: Background color is not updated:
- this.setBackground(Color.BLACK);
- }
-
- public void setColor(int red, int green, int blue) {
- this.setForeground(new Color(red, green, blue));
- //FIXME changing the color is not working
- this.repaint();
- System.out.println( this.toString());
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- if (noText) {
- sb.append(" ");
- } else {
- sb.append("" + this.getText());
- }
- sb.append("|" + Integer.toHexString(this.getForeground().getRed()) +
- " " + Integer.toHexString(this.getForeground().getGreen()) +
- " " + Integer.toHexString(this.getForeground().getBlue()));
-
- return sb.toString();
- }
- }
+ }
+ return layout;
+ }
+
+ private void createAndDisplayGUI() {
+ setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ JPanel contentPane = new JPanel();
+ contentPane.setLayout(new BorderLayout());
+ contentPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
+
+ JPanel ledPanel = new JPanel();
+ ledPanel.setLayout(new GridLayout(this.mRow, this.mColumn, 10, 10));
+ for (int i = 0; i < this.mRow; i++) {
+ for (int j = 0; j < this.mColumn; j++) {
+ if (this.mElements[i][j] != null) {
+ ledPanel.add(this.mElements[i][j]);
+ }
+ }
+ }
+ contentPane.add(ledPanel, BorderLayout.CENTER);
+ JButton button = new JButton("Do something");
+ button.setActionCommand("Do something");
+ button.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ JButton but = (JButton) ae.getSource();
+ // FIXME some clever logic
+ }
+ });
+ contentPane.add(button, BorderLayout.SOUTH);
+
+ setContentPane(contentPane);
+ pack();
+ setLocationByPlatform(true);
+ setVisible(true);
+ }
+
+ private void parse() {
+ this.mElements = new Element[this.mRow][this.mColumn];
+ int row = 0;
+ for (String line : this.mLines) {
+ for (int i = 0; i < line.length(); i++) {
+ char c = line.charAt(i);
+ if ((('A' <= c) && (c <= 'Z')) || (('0' <= c) && (c <= '9')) || (c == 'Ä') || (c == 'Ö')
+ || (c == 'Ü')) {
+ this.mElements[row][i] = new Element(c);
+ } else {
+ this.mElements[row][i] = new Element();
+ }
+ this.mElements[row][i].setColor(0, 0, 0);
+ }
+ row++;
+ }
+ }
+
+ public class Element extends JLabel {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -3933903441113933637L;
+
+ private boolean noText = false;
+
+ /**
+ * Draw a simple rect
+ */
+ public Element() {
+ super();
+ this.noText = true;
+ this.setBackground(Color.BLACK);
+ }
+
+ /**
+ * Draw a character
+ *
+ * @param character
+ * to show
+ */
+ public Element(char character) {
+ super("" + character);
+ setFont(new Font("Dialog", Font.BOLD, 24));
+ setHorizontalAlignment(CENTER);
+ // FIXME: Background color is not updated:
+ this.setBackground(Color.BLACK);
+ }
+
+ public void setColor(int red, int green, int blue) {
+ this.setForeground(new Color(red, green, blue));
+ // FIXME changing the color is not working
+ this.repaint();
+ System.out.println(this.toString());
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ if (noText) {
+ sb.append(" ");
+ } else {
+ sb.append("" + this.getText());
+ }
+ sb.append("|" + Integer.toHexString(this.getForeground().getRed()) + " "
+ + Integer.toHexString(this.getForeground().getGreen()) + " "
+ + Integer.toHexString(this.getForeground().getBlue()));
+
+ return sb.toString();
+ }
+ }
+
+ public void updateLED(int index, int r, int g, int b) {
+ if (mElements != null) {
+ int i = (index / mColumn);
+ int j = (index % mColumn);
+ if ((i < mElements.length) && (j < mElements[i].length) && (mElements[i][j] != null)) {
+ Element curlbl = mElements[i][j];
+ curlbl.setColor(r, g, b);
+ }
+ }
+ }
- public void updateLED(int index, byte red, byte green, byte blue) {
- if (this.mElements != null) {
- int i = (index / this.mColumn);
- int j = (index % this.mColumn);
- if ((i < this.mElements.length) &&
- (j < this.mElements[i].length) &&
- (this.mElements[i][j] != null)) {
- this.mElements[i][j].setColor(red, green, blue);
- }
- }
- }
-
}