From 9621831ede401377734e91f73fad4a93248aab48 Mon Sep 17 00:00:00 2001
From: danpetry <daniel.petry@fu-berlin.de>
Date: Tue, 22 May 2018 12:08:30 +0200
Subject: [PATCH] examples/lua: added example Lua application

- Lua print() function is only supported function
- Lua script is parsed at compile time and run in example
---
 examples/lua/Makefile  | 65 ++++++++++++++++++++++++++++++++++++++++++
 examples/lua/README.md | 22 ++++++++++++++
 examples/lua/main.c    | 55 +++++++++++++++++++++++++++++++++++
 examples/lua/main.lua  |  1 +
 4 files changed, 143 insertions(+)
 create mode 100644 examples/lua/Makefile
 create mode 100644 examples/lua/README.md
 create mode 100644 examples/lua/main.c
 create mode 100644 examples/lua/main.lua

diff --git a/examples/lua/Makefile b/examples/lua/Makefile
new file mode 100644
index 0000000000..030e7e3d95
--- /dev/null
+++ b/examples/lua/Makefile
@@ -0,0 +1,65 @@
+APPLICATION = lua
+
+# If no BOARD is found in the environment, use this default:
+BOARD ?= native
+
+# This has to be the absolute path to the RIOT base directory:
+RIOTBASE ?= $(CURDIR)/../..
+
+BOARD_INSUFFICIENT_MEMORY := bluepill calliope-mini cc2650-launchpad \
+	                     cc2650stk maple-mini microbit nrf51dongle \
+			     nucleo-f030r8 nucleo-f031k6 nucleo-f042k6 \
+			     nucleo-f070rb nucleo-f072rb nucleo-f103rb \
+			     nucleo-f302r8 nucleo-f303k8 nucleo-f334r8 \
+			     nucleo-f410rb nucleo-l031k6 nucleo-l053r8 \
+			     opencm904 spark-core stm32f0discovery
+
+BOARD_BLACKLIST := arduino-duemilanove arduino-mega2560 arduino-uno \
+                   chronos jiminy-mega256rfr2 mega-xplained mips-malta \
+		   msb-430 msb-430h pic32-clicker pic32-wifire telosb \
+		   waspmote-pro wsn430-v1_3b wsn430-v1_4 z1
+
+
+# Comment this out to disable code in RIOT that does safety checking
+# which is not needed in a production environment but helps in the
+# development process:
+DEVELHELP ?= 1
+
+# Change this to 0 show compiler invocation lines by default:
+QUIET ?= 1
+
+USEMODULE += ps
+
+ifneq ($(BOARD),native)
+  # This stack size is large enough to run Lua print() functions of
+  # various lengths. Other functions untested.
+  CFLAGS += -DTHREAD_STACKSIZE_MAIN=4096
+endif
+
+USEPKG += lua
+
+include $(RIOTBASE)/Makefile.include
+
+# The code below generates a header file from any .lua scripts in the
+# example directory. The header file contains a byte array of the
+# ASCII characters in the .lua script.
+
+LUA_PATH := $(BINDIR)/lua
+
+# add directory of generated *.lua.h files to include path
+CFLAGS += -I$(LUA_PATH)
+
+# generate .lua.h header files of .lua files
+LUA = $(wildcard *.lua)
+
+LUA_H := $(LUA:%.lua=$(LUA_PATH)/%.lua.h)
+
+$(LUA_PATH)/:
+	@mkdir -p $@
+
+$(LUA_H): | $(LUA_PATH)/
+$(LUA_H): $(LUA_PATH)/%.lua.h: %.lua
+
+	xxd -i $< | sed 's/^unsigned/const/g' > $@
+
+$(RIOTBUILD_CONFIG_HEADER_C): $(LUA_H)
diff --git a/examples/lua/README.md b/examples/lua/README.md
new file mode 100644
index 0000000000..15dd3488f0
--- /dev/null
+++ b/examples/lua/README.md
@@ -0,0 +1,22 @@
+### About
+
+This example shows how to write IoT applications using Lua.
+
+### Caveats
+
+Currently, the only actual function available is "print"
+
+### How to use
+
+Put your lua code into "main.lua" (check the example). The file will
+be included in your application as an ASCII byte array. This is done in the
+last 20 or so lines of the example's Makefile.
+
+The script will then be run immediately after RIOT has started up.
+
+### How to run
+
+Type `make flash term`
+
+Note: you may have to press `RESET` on the board (after the flash) if the board
+reboots faster than the terminal program can start..
diff --git a/examples/lua/main.c b/examples/lua/main.c
new file mode 100644
index 0000000000..22458153e0
--- /dev/null
+++ b/examples/lua/main.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2018 FU Berlin
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @ingroup     examples
+ * @{
+ *
+ * @file
+ * @brief       Basic lua example application
+ *
+ * @author      Daniel Petry <daniel.petry@fu-berlin.de>
+ *
+ * @}
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include "lauxlib.h"
+#include "lualib.h"
+
+#include "main.lua.h"
+
+int lua_run_script(const char *buffer, size_t buffer_len)
+{
+
+    lua_State *L = luaL_newstate();
+
+    if (L == NULL) {
+        puts("cannot create state: not enough memory");
+        return ENOMEM;
+    }
+
+    luaL_openlibs(L);
+    luaL_loadbuffer(L, buffer, buffer_len, "lua input script");
+
+    if (lua_pcall(L, 0, 0, 0) != LUA_OK){
+        puts("Lua script running failed");
+        return EINTR;
+    }
+
+    lua_close(L);
+    return 0;
+}
+
+int main(void)
+{
+    puts("Lua RIOT build");
+    lua_run_script(main_lua, main_lua_len);
+    return 0;
+}
diff --git a/examples/lua/main.lua b/examples/lua/main.lua
new file mode 100644
index 0000000000..9b7d28397f
--- /dev/null
+++ b/examples/lua/main.lua
@@ -0,0 +1 @@
+print("Hello world, this is lua!")
-- 
GitLab