Merge pull request #8847 from danpetry/lua_initial
Lua support - initial PR
This commit is contained in:
commit
2b08ea351c
65
examples/lua/Makefile
Normal file
65
examples/lua/Makefile
Normal file
@ -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)
|
||||
22
examples/lua/README.md
Normal file
22
examples/lua/README.md
Normal file
@ -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..
|
||||
55
examples/lua/main.c
Normal file
55
examples/lua/main.c
Normal file
@ -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;
|
||||
}
|
||||
1
examples/lua/main.lua
Normal file
1
examples/lua/main.lua
Normal file
@ -0,0 +1 @@
|
||||
print("Hello world, this is lua!")
|
||||
12
pkg/lua/Makefile
Normal file
12
pkg/lua/Makefile
Normal file
@ -0,0 +1,12 @@
|
||||
PKG_NAME=lua
|
||||
PKG_URL=https://github.com/lua/lua.git
|
||||
PKG_VERSION=e354c6355e7f48e087678ec49e340ca0696725b1
|
||||
PKG_LICENSE=MIT
|
||||
|
||||
.PHONY: all
|
||||
|
||||
all:
|
||||
@cp Makefile.lua $(PKG_BUILDDIR)
|
||||
"$(MAKE)" -C $(PKG_BUILDDIR) -f Makefile.lua
|
||||
|
||||
include $(RIOTBASE)/pkg/pkg.mk
|
||||
1
pkg/lua/Makefile.include
Normal file
1
pkg/lua/Makefile.include
Normal file
@ -0,0 +1 @@
|
||||
INCLUDES += -I$(PKGDIRBASE)/lua
|
||||
9
pkg/lua/Makefile.lua
Normal file
9
pkg/lua/Makefile.lua
Normal file
@ -0,0 +1,9 @@
|
||||
SRC := $(filter-out lua.c luac.c,$(wildcard *.c))
|
||||
|
||||
# This builds for native using POSIX system calls and some extra libraries, and
|
||||
# removes a compiler warning that warns against using tmpnam().
|
||||
ifeq ($(BOARD),native)
|
||||
CFLAGS += -DLUA_USE_LINUX
|
||||
endif
|
||||
|
||||
include $(RIOTBASE)/Makefile.base
|
||||
6
pkg/lua/doc.txt
Normal file
6
pkg/lua/doc.txt
Normal file
@ -0,0 +1,6 @@
|
||||
/**
|
||||
* @defgroup pkg_lua Lua ported to RIOT
|
||||
* @ingroup pkg
|
||||
* @brief Provides Lua support for RIOT
|
||||
* @see https://github.com/lua/lua
|
||||
*/
|
||||
@ -0,0 +1,62 @@
|
||||
From b681cb20ee6bfc31b8ba23ec321140aae6e53e9d Mon Sep 17 00:00:00 2001
|
||||
From: danpetry <daniel.petry@fu-berlin.de>
|
||||
Date: Wed, 23 May 2018 14:09:17 +0200
|
||||
Subject: [PATCH 1/1] Remove dependency on nonexistent RIOT syscalls
|
||||
|
||||
Os.rename and os.clock, in Lua, now always return an error message.
|
||||
Also, l_randomizePivot, which is used by table.sort, will always
|
||||
supply 0 rather than a pseudorandom number.
|
||||
---
|
||||
loslib.c | 7 ++-----
|
||||
ltablib.c | 4 +++-
|
||||
2 files changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/loslib.c b/loslib.c
|
||||
index dd2bb378..f9e5cbd2 100644
|
||||
--- a/loslib.c
|
||||
+++ b/loslib.c
|
||||
@@ -157,9 +157,7 @@ static int os_remove (lua_State *L) {
|
||||
|
||||
|
||||
static int os_rename (lua_State *L) {
|
||||
- const char *fromname = luaL_checkstring(L, 1);
|
||||
- const char *toname = luaL_checkstring(L, 2);
|
||||
- return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);
|
||||
+ return luaL_error(L, "This function is not implemented in RIOT yet");
|
||||
}
|
||||
|
||||
|
||||
@@ -181,8 +179,7 @@ static int os_getenv (lua_State *L) {
|
||||
|
||||
|
||||
static int os_clock (lua_State *L) {
|
||||
- lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);
|
||||
- return 1;
|
||||
+ return luaL_error(L, "This function is not implemented in RIOT yet");
|
||||
}
|
||||
|
||||
|
||||
diff --git a/ltablib.c b/ltablib.c
|
||||
index 588bf40d..8895b653 100644
|
||||
--- a/ltablib.c
|
||||
+++ b/ltablib.c
|
||||
@@ -235,13 +235,15 @@ static int unpack (lua_State *L) {
|
||||
/* type for array indices */
|
||||
typedef unsigned int IdxT;
|
||||
|
||||
-
|
||||
/*
|
||||
** Produce a "random" 'unsigned int' to randomize pivot choice. This
|
||||
** macro is used only when 'sort' detects a big imbalance in the result
|
||||
** of a partition. (If you don't want/need this "randomness", ~0 is a
|
||||
** good choice.)
|
||||
*/
|
||||
+
|
||||
+#define l_randomizePivot() 0
|
||||
+
|
||||
#if !defined(l_randomizePivot) /* { */
|
||||
|
||||
#include <time.h>
|
||||
--
|
||||
2.17.0
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user