diff --git a/src/LuaArduino.cpp b/src/LuaArduino.cpp index 712f3b4..57ca590 100644 --- a/src/LuaArduino.cpp +++ b/src/LuaArduino.cpp @@ -1,5 +1,6 @@ #include "LuaArduino.h" #include "Arduino.h" +#include "lua/arduino_functions.h" // static class in and out objects Stream* Lua::in = nullptr; @@ -42,6 +43,18 @@ void Lua::initState() { // Clear the stack lua_settop(L, 0); + + //open Arduino libraries + luaopen_arduino(getState()); + + //Add Arduino variables + const char arduino_vars[] = + "LOW = 0\n" + "HIGH = 1\n" + "INPUT = 0\n" + "OUTPUT = 1\n" + "INPUT_PULLUP = 2\n"; + loadString(arduino_vars); } @@ -75,15 +88,15 @@ void Lua::loadString(const char lbuff[]) { } const char help_function[] = "function help ()\n" -" print('=== Lua Help =========================')\n" +" print('===== Lua Help ======')\n" " print()\n" " print('RAM Usage: ')\n" -" print(\" print(collectgarbage'count')\")\n" +" print(\"collectgarbage'count'\")\n" " print()\n" -" print('Force garbage collection: ')\n" -" print(\" collectgarbage'collect'\")\n" +" print('Garbage collection: ')\n" +" print(\"collectgarbage'collect'\")\n" " print()\n" -" print('Use EOT (Ctrl-D in miniterm.py) to exec code')\n" +" print('Ctrl-D to exec code')\n" " print()\n" "end\n"; diff --git a/src/lua/arduino_functions.h b/src/lua/arduino_functions.h new file mode 100644 index 0000000..822f4fe --- /dev/null +++ b/src/lua/arduino_functions.h @@ -0,0 +1,87 @@ +#include +#include +#include + +#ifndef arduino_functions_h +#define arduino_functions_h + +static int l_pinMode(lua_State *L) { + double pin = lua_tonumber(L, 1); + double mode = lua_tonumber(L, 2); + pinMode((int)pin, (int)mode); + return 0; +} + +static int l_digitalWrite(lua_State *L) { + double pin = lua_tonumber(L, 1); + double state = lua_tonumber(L, 2); + digitalWrite((int)pin, (int)state); + return 0; +} + +static int l_digitalRead(lua_State *L) { + double pin = lua_tonumber(L, 1); + lua_pushnumber(L, digitalRead((int)pin)); + return 1; +} + +static int l_analogRead(lua_State *L) { + double pin = lua_tonumber(L, 1); + lua_pushnumber(L, analogRead(pin)); + return 1; +} + +static int l_analogWrite(lua_State *L) { + double pin = lua_tonumber(L, 1); + double value = lua_tonumber(L, 2); + analogWrite((int)pin, (int)value); + return 0; +} + +static int l_millis(lua_State *L) { + lua_pushnumber(L, millis()); + return 1; +} + +static int l_delay(lua_State *L) { + double length = lua_tonumber(L, 1); + delay((long)length); + return 0; +} + +static int l_tone(lua_State *L) { + double pin = lua_tonumber(L,1); + double freq = lua_tonumber(L,2); + tone((int)pin, (int)freq); + return 0; +} + +static int l_noTone(lua_State *L) { + double pin = lua_tonumber(L, 1); + noTone((int)pin); + return 0; +} + +static const struct luaL_reg arduinolib [] = { + {"pinMode", l_pinMode}, + {"digitalWrite", l_digitalWrite}, + {"digitalRead", l_digitalRead}, + {"millis", l_millis}, + {"analogRead", l_analogRead}, + {"analogWrite", l_analogWrite}, + {NULL, NULL} /* sentinel */ +}; + +int luaopen_arduino(lua_State *L) { + lua_register(L, "pinMode", l_pinMode); + lua_register(L, "digitalWrite", l_digitalWrite); + lua_register(L, "digitalRead", l_digitalRead); + lua_register(L, "millis", l_millis); + lua_register(L, "analogRead", l_analogRead); + lua_register(L, "analogWrite", l_analogWrite); + lua_register(L, "delay", l_delay); + lua_register(L, "tone", l_tone); + lua_register(L, "noTone", l_noTone); +} + +#endif \ No newline at end of file