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); - } - } - } - }