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