Convert the main menu screen to lua lol
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set(EXTRA_COMPONENT_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../..)
|
||||
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
project(example-lua-custom-lib)
|
||||
@@ -0,0 +1,5 @@
|
||||
PROJECT_NAME := example-lua-custom-lib
|
||||
|
||||
EXTRA_COMPONENT_DIRS := $(CURDIR)/../..
|
||||
|
||||
include $(IDF_PATH)/make/project.mk
|
||||
@@ -0,0 +1,2 @@
|
||||
idf_component_register(SRC_DIRS "."
|
||||
INCLUDE_DIRS ".")
|
||||
@@ -0,0 +1,2 @@
|
||||
COMPONENT_ADD_INCLUDEDIRS = .
|
||||
COMPONENT_SRCDIRS = .
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "gpiolib.h"
|
||||
#include <driver/gpio.h>
|
||||
|
||||
static void lua_esp_check_err(lua_State *L, esp_err_t err)
|
||||
{
|
||||
if (err != ESP_OK)
|
||||
luaL_error(L, "Error: %s", esp_err_to_name(err));
|
||||
}
|
||||
|
||||
static int lgpio_reset_pin(lua_State *L)
|
||||
{
|
||||
gpio_num_t pin = luaL_checkinteger(L, 1);
|
||||
|
||||
lua_esp_check_err(L, gpio_reset_pin(pin));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgpio_set_level(lua_State *L)
|
||||
{
|
||||
gpio_num_t pin = luaL_checkinteger(L, 1);
|
||||
int level = luaL_checkinteger(L, 2);
|
||||
|
||||
lua_esp_check_err(L, gpio_set_level(pin, level));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lgpio_get_level(lua_State *L)
|
||||
{
|
||||
gpio_num_t pin = luaL_checkinteger(L, 1);
|
||||
lua_pushinteger(L, gpio_get_level(pin));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lgpio_set_direction(lua_State *L)
|
||||
{
|
||||
gpio_num_t pin = luaL_checkinteger(L, 1);
|
||||
int mode = luaL_checkinteger(L, 2);
|
||||
|
||||
lua_esp_check_err(L, gpio_set_direction(pin, mode));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct luaL_Reg lgpio_funcs[] = {
|
||||
{ "reset_pin", lgpio_reset_pin },
|
||||
{ "set_direction", lgpio_set_direction },
|
||||
{ "set_level", lgpio_set_level },
|
||||
{ "get_level", lgpio_get_level },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
int luaopen_lgpio(lua_State *L)
|
||||
{
|
||||
luaL_newlib(L, lgpio_funcs);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef MAIN_GPIOLIB_H_
|
||||
#define MAIN_GPIOLIB_H_
|
||||
|
||||
#include <lua/lua.h>
|
||||
#include <lua/lauxlib.h>
|
||||
|
||||
int luaopen_lgpio(lua_State *L);
|
||||
|
||||
#endif /* MAIN_GPIOLIB_H_ */
|
||||
@@ -0,0 +1,83 @@
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#include <string.h>
|
||||
#include <lua/lua.h>
|
||||
#include <lua/lauxlib.h>
|
||||
#include <lua/lualib.h>
|
||||
|
||||
#include "gpiolib.h"
|
||||
#include "rtoslib.h"
|
||||
|
||||
#define GPIO_PIN "5"
|
||||
|
||||
static void load_custom_libs(lua_State *L)
|
||||
{
|
||||
luaL_requiref(L, "gpio", luaopen_lgpio, 1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
luaL_requiref(L, "rtos", luaopen_lrtos, 1);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
static const char *prg =
|
||||
"gpio.set_direction(" GPIO_PIN ", 2)\n"
|
||||
"level = 1\n"
|
||||
"for i = 1, 100 do\n"
|
||||
" print(string.format(\"Iteration %d..., GPIO5=%d\", i, level))\n"
|
||||
" gpio.set_level(" GPIO_PIN ", level)\n"
|
||||
" level = 1 - level\n"
|
||||
" rtos.delay(500)\n"
|
||||
"end\n";
|
||||
|
||||
static void report(lua_State *L, int status)
|
||||
{
|
||||
if (status == LUA_OK)
|
||||
return;
|
||||
|
||||
const char *msg = lua_tostring(L, -1);
|
||||
printf("%s\n", msg);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
void test(void *arg)
|
||||
{
|
||||
printf("Program:\n%s\n", prg);
|
||||
|
||||
lua_State *L = luaL_newstate();
|
||||
if (!L)
|
||||
{
|
||||
printf("Could not create state\n");
|
||||
while (1) { vTaskDelay(1000); }
|
||||
}
|
||||
|
||||
luaL_openlibs(L);
|
||||
load_custom_libs(L);
|
||||
|
||||
int r = luaL_loadstring(L, prg);
|
||||
if (r)
|
||||
{
|
||||
report(L, r);
|
||||
while (1) { vTaskDelay(1000); }
|
||||
}
|
||||
|
||||
r = lua_pcall(L, 0, 0, 0);
|
||||
if (r)
|
||||
report(L, r);
|
||||
|
||||
lua_close(L);
|
||||
|
||||
printf("State closed, heap: %" PRIu32 "\n", xPortGetFreeHeapSize());
|
||||
while (1)
|
||||
{
|
||||
printf(".");
|
||||
fflush(stdout);
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
}
|
||||
|
||||
void app_main()
|
||||
{
|
||||
xTaskCreate(test, "test", 0x10000, NULL, 5, NULL);
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
#include "rtoslib.h"
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
|
||||
static int ldelay(lua_State *L)
|
||||
{
|
||||
int ms = luaL_checkinteger(L, 1);
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(ms));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct luaL_Reg lrtos_funcs[] = {
|
||||
{ "delay", ldelay },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
int luaopen_lrtos(lua_State *L)
|
||||
{
|
||||
luaL_newlib(L, lrtos_funcs);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef MAIN_RTOSLIB_H_
|
||||
#define MAIN_RTOSLIB_H_
|
||||
|
||||
#include <lua/lua.h>
|
||||
#include <lua/lauxlib.h>
|
||||
|
||||
int luaopen_lrtos(lua_State *L);
|
||||
|
||||
#endif /* MAIN_RTOSLIB_H_ */
|
||||
Reference in New Issue
Block a user