package de.c3ma.ollo.mockup;
import java.util.HashMap;
import javax.swing.SwingUtilities;
import org.luaj.vm2.LuaString;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.OneArgFunction;
import org.luaj.vm2.lib.TwoArgFunction;
import org.luaj.vm2.lib.VarArgFunction;
/**
* created at 18.03.2021 - 21:09:03
* creator: ollo
* project: Esp8266 GPIO Emulation
* $Id: $
* @author ollo
*/
public class ESP8266Gpio extends TwoArgFunction {
private static final String DIRECTION_INPUT = "input";
private HashMap mInputs = new HashMap();
@Override
public LuaValue call(LuaValue modname, LuaValue env) {
env.checkglobals();
final LuaTable gpio = new LuaTable();
gpio.set("mode", new Mode(this));
gpio.set("read", new Read(this));
gpio.set("INPUT", DIRECTION_INPUT);
env.set("gpio", gpio);
env.get("package").get("loaded").set("gpio", gpio);
return gpio;
}
private class Mode extends VarArgFunction {
private ESP8266Gpio gpio;
public Mode(ESP8266Gpio a) {
this.gpio = a;
}
public Varargs invoke(Varargs varargs) {
if (varargs.narg() == 2) {
final int pin = varargs.arg(1).toint();
final LuaString lsDirection = varargs.arg(2).checkstring();
String direction = lsDirection.toString();
if (direction.equals(DIRECTION_INPUT)) {
gpio.mInputs.put(pin, -1);
}
System.out.println("[GPIO] PIN" + pin +" as " + direction);
return LuaValue.valueOf(true);
} else {
return LuaValue.NIL;
}
}
}
private class Read extends OneArgFunction {
private ESP8266Gpio gpio;
public Read(ESP8266Gpio a) {
this.gpio = a;
}
@Override
public LuaValue call(LuaValue arg) {
int pin = arg.toint();
if (mInputs.containsKey(pin)) {
return LuaValue.valueOf(mInputs.get(pin));
} else {
System.out.println("[GPIO] pin" + pin + " not defined (gpio.mode missing)");
return LuaValue.NIL;
}
}
}
public void setPin(int pin, int newValue) {
if (mInputs.containsKey(pin)) {
mInputs.put(pin, newValue);
} else {
System.out.println("[GPIO] PIN" + pin +" not defined (missing gpio.mode)");
}
}
}