Kai did magic

This commit is contained in:
C3MA 2018-01-12 20:38:35 +01:00
parent a83600281d
commit 78a9027ad7
6 changed files with 341 additions and 329 deletions

View File

@ -4,6 +4,5 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="libs/luaj-jme-3.0.1.jar" sourcepath="libs/luaj-3.0.1/src"/> <classpathentry kind="lib" path="libs/luaj-jme-3.0.1.jar" sourcepath="libs/luaj-3.0.1/src"/>
<classpathentry kind="lib" path="libs/luaj-jse-3.0.1.jar"/> <classpathentry kind="lib" path="libs/luaj-jse-3.0.1.jar"/>
<classpathentry kind="lib" path="libs/luaj-sources-3.0.1.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@ -9,5 +9,5 @@ package de.c3ma.ollo;
*/ */
public interface LuaSimulation { public interface LuaSimulation {
public void reboottriggered(); public void rebootTriggered();
} }

View File

@ -5,6 +5,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import javax.management.RuntimeErrorException; import javax.management.RuntimeErrorException;
import javax.swing.SwingUtilities;
import org.luaj.vm2.Globals; import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue; import org.luaj.vm2.LuaValue;
@ -30,127 +31,130 @@ import de.c3ma.ollo.mockup.ESP8266Ws2812;
*/ */
public class WS2812Simulation implements LuaSimulation { public class WS2812Simulation implements LuaSimulation {
private Globals globals = JsePlatform.standardGlobals(); private Globals globals = JsePlatform.standardGlobals();
private ESP8266Tmr espTmr = new ESP8266Tmr(); private ESP8266Tmr espTmr = new ESP8266Tmr();
private ESP8266File espFile = new ESP8266File(); private ESP8266File espFile = new ESP8266File();
private ESP8266Node espNode = new ESP8266Node(this); private ESP8266Node espNode = new ESP8266Node(this);
private DoFileFunction doFile = new DoFileFunction(globals); private DoFileFunction doFile = new DoFileFunction(globals);
private ESP8266Ws2812 ws2812 = new ESP8266Ws2812(); private ESP8266Ws2812 ws2812 = new ESP8266Ws2812();
private String scriptName; 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());
}
espFile.setWorkingDirectory(tempDir); public WS2812Simulation(File sourceFolder) {
espNode.setWorkingDirectory(tempDir); globals.load(new ESP8266Uart());
doFile.setWorkingDirectory(tempDir); globals.load(ws2812);
} catch (IOException e) { globals.load(espTmr);
System.err.println("[Nodemcu] " + e.getMessage()); globals.load(espFile);
espFile = null; globals.load(espNode);
espNode = null; globals.load(new ESP8266Wifi());
} globals.load(new ESP8266Net());
} globals.load(new ESP8266Time());
globals.set("dofile", doFile);
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();
}
}
private void setWS2812Layout(File file) { try {
if (file.exists()) { File tempFile = File.createTempFile("NodemcuSimuFile", "");
ws2812.setLayout(file); File tempDir = new File(tempFile.getParent() + File.separator + "Nodemcu" + System.currentTimeMillis());
} else { tempDir.mkdir();
throw new RuntimeException("WS2812 Layout: " + file.getAbsolutePath() + " does not exists");
}
}
private static void printUsage() { System.out.println("[Nodemcu] Directory is " + tempDir.getAbsolutePath());
System.out.println("Usage:");
System.out.println("one argument required: file to execute.");
System.out.println(".e.g: init.lua");
}
@Override // Copy all files into the temporary folder
public void reboottriggered() { for (File f : sourceFolder.listFiles()) {
System.out.println("=================== Reboot in Simulation -> call it again ================="); Files.copy(f.toPath(), new File(tempDir.getAbsolutePath() + File.separator + f.getName()).toPath());
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) { espFile.setWorkingDirectory(tempDir);
this.scriptName=filename; espNode.setWorkingDirectory(tempDir);
doFile.setWorkingDirectory(tempDir);
if ((espFile != null) && (espFile.getFileInWorkingDir(filename) != null)) { } catch (IOException e) {
LuaValue chunk = globals.loadfile(espFile.getFileInWorkingDir(filename).getAbsolutePath()); System.err.println("[Nodemcu] " + e.getMessage());
chunk.call(); espFile = null;
} else { espNode = null;
throw new RuntimeException("Copy into temporary folder failed; script not available"); }
} }
}
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");
}
}
} }

View File

@ -67,7 +67,7 @@ public class ESP8266Node extends TwoArgFunction {
@Override @Override
public LuaValue call() { public LuaValue call() {
System.out.println("[Node] Restart"); System.out.println("[Node] Restart");
nodemcuSimu.reboottriggered(); nodemcuSimu.rebootTriggered();
return LuaValue.valueOf(false); return LuaValue.valueOf(false);
} }

View File

@ -2,6 +2,9 @@ package de.c3ma.ollo.mockup;
import java.io.File; import java.io.File;
import javax.swing.SwingUtilities;
import org.luaj.vm2.LuaString;
import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue; import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.OneArgFunction; import org.luaj.vm2.lib.OneArgFunction;
@ -15,62 +18,70 @@ import de.c3ma.ollo.mockup.ui.WS2812Layout;
* creator: ollo<br /> * creator: ollo<br />
* project: WS2812Emulation<br /> * project: WS2812Emulation<br />
* $Id: $<br /> * $Id: $<br />
*
* @author ollo<br /> * @author ollo<br />
*/ */
public class ESP8266Ws2812 extends TwoArgFunction { public class ESP8266Ws2812 extends TwoArgFunction {
private static WS2812Layout layout = null; private static WS2812Layout layout = null;
@Override @Override
public LuaValue call(LuaValue modname, LuaValue env) { public LuaValue call(LuaValue modname, LuaValue env) {
env.checkglobals(); env.checkglobals();
final LuaTable ws2812 = new LuaTable(); final LuaTable ws2812 = new LuaTable();
ws2812.set("init", new init()); ws2812.set("init", new init());
ws2812.set("write", new write()); ws2812.set("write", new write());
env.set("ws2812", ws2812); env.set("ws2812", ws2812);
env.get("package").get("loaded").set("ws2812", ws2812); env.get("package").get("loaded").set("ws2812", ws2812);
return ws2812; return ws2812;
} }
private class init extends ZeroArgFunction { private class init extends ZeroArgFunction {
@Override @Override
public LuaValue call() { public LuaValue call() {
System.out.println("[WS2812] init"); System.out.println("[WS2812] init");
return LuaValue.valueOf(true); return LuaValue.valueOf(true);
} }
}
private class write extends OneArgFunction {
@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) { private class write extends OneArgFunction {
System.out.println("[WS2812] write length:" + length);
} else {
/*ESP8266Ws2812.layout.update(ESP8266Ws2812.layout.getGraphics());*/
ESP8266Ws2812.layout.repaint();
}
}
return LuaValue.valueOf(true);
}
}
public void setLayout(File file) { @Override
if (ESP8266Ws2812.layout == null) { public LuaValue call(LuaValue arg) {
ESP8266Ws2812.layout = WS2812Layout.parse(file); 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);
}
}
} }

View File

@ -10,6 +10,7 @@ import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
@ -17,180 +18,177 @@ import javax.swing.JButton;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/** /**
* created at 02.01.2018 - 12:57:02<br /> * created at 02.01.2018 - 12:57:02<br />
* creator: ollo<br /> * creator: ollo<br />
* project: WS2812Emulation<br /> * project: WS2812Emulation<br />
* $Id: $<br /> * $Id: $<br />
*
* @author ollo<br /> * @author ollo<br />
*/ */
public class WS2812Layout extends JFrame { public class WS2812Layout extends JFrame {
/**
*
*/
private static final long serialVersionUID = -6815557232118826140L;
private ArrayList<String> mLines = new ArrayList<String>();
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)); private static final long serialVersionUID = -6815557232118826140L;
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 void createAndDisplayGUI() { private ArrayList<String> mLines = new ArrayList<String>();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); private int mColumn = 0;
private int mRow = 0;
private Element[][] mElements;
JPanel contentPane = new JPanel(); public static WS2812Layout parse(File file) {
contentPane.setLayout(new BorderLayout()); WS2812Layout layout = null;
contentPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2)); try {
BufferedReader br = new BufferedReader(new FileReader(file));
try {
String line = br.readLine();
if (line != null) {
layout = new WS2812Layout();
}
JPanel ledPanel = new JPanel(); while (line != null) {
ledPanel.setLayout(new GridLayout(this.mRow, this.mColumn, 10, 10)); if (!line.startsWith("#")) {
for (int i = 0; i < this.mRow; i++) layout.mLines.add(line);
{ layout.mRow++;
for (int j = 0; j < this.mColumn; j++) layout.mColumn = Math.max(layout.mColumn, line.length());
{ }
if (this.mElements[i][j] != null) { /* get the next line */
ledPanel.add(this.mElements[i][j]); line = br.readLine();
} }
}
}
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() { /* parse each line */
this.mElements = new Element[this.mRow][this.mColumn]; layout.parse();
int row=0; layout.createAndDisplayGUI();
for (String line : this.mLines) { } finally {
for (int i = 0; i < line.length(); i++) { if (br != null) {
char c = line.charAt(i); br.close();
if ((('A' <= c) && (c <= 'Z')) || }
(('0' <= c) && (c <= '9')) || }
(c == 'Ä') || (c == 'Ö') || (c == 'Ü')) { } catch (IOException ioe) {
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 return layout;
*/ }
public Element() {
super(); private void createAndDisplayGUI() {
this.noText = true; setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setBackground(Color.BLACK);
} JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
/** contentPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
* Draw a character
* @param character to show JPanel ledPanel = new JPanel();
*/ ledPanel.setLayout(new GridLayout(this.mRow, this.mColumn, 10, 10));
public Element(char character) { for (int i = 0; i < this.mRow; i++) {
super(""+character); for (int j = 0; j < this.mColumn; j++) {
setFont(new Font("Dialog", Font.BOLD, 24)); if (this.mElements[i][j] != null) {
setHorizontalAlignment(CENTER); ledPanel.add(this.mElements[i][j]);
//FIXME: Background color is not updated: }
this.setBackground(Color.BLACK); }
} }
contentPane.add(ledPanel, BorderLayout.CENTER);
public void setColor(int red, int green, int blue) { JButton button = new JButton("Do something");
this.setForeground(new Color(red, green, blue)); button.setActionCommand("Do something");
//FIXME changing the color is not working button.addActionListener(new ActionListener() {
this.repaint(); public void actionPerformed(ActionEvent ae) {
System.out.println( this.toString()); JButton but = (JButton) ae.getSource();
} // FIXME some clever logic
}
@Override });
public String toString() { contentPane.add(button, BorderLayout.SOUTH);
StringBuilder sb = new StringBuilder();
if (noText) { setContentPane(contentPane);
sb.append(" "); pack();
} else { setLocationByPlatform(true);
sb.append("" + this.getText()); setVisible(true);
} }
sb.append("|" + Integer.toHexString(this.getForeground().getRed()) +
" " + Integer.toHexString(this.getForeground().getGreen()) + private void parse() {
" " + Integer.toHexString(this.getForeground().getBlue())); this.mElements = new Element[this.mRow][this.mColumn];
int row = 0;
return sb.toString(); 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);
}
}
}
} }