Skip to content
Snippets Groups Projects
Commit 9621831e authored by danpetry's avatar danpetry
Browse files

examples/lua: added example Lua application

- Lua print() function is only supported function
- Lua script is parsed at compile time and run in example
parent 69888b5c
No related branches found
No related tags found
No related merge requests found
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)
### 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..
/*
* 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;
}
print("Hello world, this is lua!")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment