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