Files
firmware-test/pc_firm/dr_lua/dr_lua.c
Charles Kwon b3adfd42e6 VesiScan BASIC origin: Piezo + IMU firmware initial code
- nRF52840 + SoftDevice S140 BLE firmware
- Piezo ultrasound TX driver (2MHz, 8ch MUX)
- ICM42670P IMU 6-axis driver
- Echo AFE chain (ADA2200 + ADC121S051)
- BLE NUS command parser (mpa/mpc/mdc/mec/maa/msp)
- FDS flash config storage
- pc_firm parser and ADC driver included

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 10:40:20 +09:00

106 lines
2.7 KiB
C

/*
* dr_lua.c
*
* Author : Charles KWON
*
* This module provides a simple and reusable interface layer
* between C firmware code and embedded Lua scripts.
* It is designed to make calling Lua functions from C firmware
* straightforward and safe.
*
* Example:
* Lua function: add3(x) = x + 3
* C function : dr_lua_add3(int num1)
*/
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
/* -------------------------------------------------
* External output function (UART / RTT, etc.)
* This function must be implemented by the project.
* ------------------------------------------------- */
extern void board_print(const char *s);
/* -------------------------------------------------
* Global Lua state
* ------------------------------------------------- */
static lua_State *g_L = NULL;
/* -------------------------------------------------
* Initialize Lua VM
* ------------------------------------------------- */
void dr_lua_init(void)
{
g_L = luaL_newstate();
/* Load base library only */
luaL_requiref(g_L, "_G", luaopen_base, 1);
lua_pop(g_L, 1);
}
/* -------------------------------------------------
* Load Lua script
* Defines:
* function add3(x)
* return x + 3
* end
* ------------------------------------------------- */
void dr_lua_load_script(void)
{
const char *lua_code =
"function add3(x)\n"
" return x + 3\n"
"end";
if (luaL_dostring(g_L, lua_code) != LUA_OK) {
const char *err = lua_tostring(g_L, -1);
board_print(err);
lua_pop(g_L, 1);
}
}
/* -------------------------------------------------
* Core interface function
* Calls Lua function add3 from C firmware
*
* @param num1 Input integer value
* @return Result of (num1 + 3)
* -1 if Lua function is not found
* -2 if Lua call fails
* ------------------------------------------------- */
int dr_lua_add3(int num1)
{
int result = 0;
/* 1. Get Lua function: add3 */
lua_getglobal(g_L, "add3");
if (!lua_isfunction(g_L, -1)) {
lua_pop(g_L, 1);
return -1; /* Function not found */
}
/* 2. Push argument */
lua_pushinteger(g_L, num1);
/* 3. Call Lua function (1 argument, 1 return value) */
if (lua_pcall(g_L, 1, 1, 0) != LUA_OK) {
const char *err = lua_tostring(g_L, -1);
board_print(err);
lua_pop(g_L, 1);
return -2; /* Call failed */
}
/* 4. Read return value */
if (lua_isinteger(g_L, -1)) {
result = (int)lua_tointeger(g_L, -1);
}
/* 5. Clean up Lua stack */
lua_pop(g_L, 1);
return result; /* num1 + 3 */
}