4diac的运行时本身支持Lua脚本文件解析,官方编译好的可执行程序是不支持的。在前面的章节讲解过怎么通过源码编译支持Lua脚本的运行时,这里不再赘述。在4diac的IDE里面可以新建基础功能块,算法语言选择Lua,IDE会把功能块的xml模型文件转换成Lua脚本下发给运行时,前面章节也讲解过怎么创建基础功能块,这里不再赘述。下面会先介绍forte源码与Lua相关的代码文件,再介绍怎么在里面新增供Lua调用的运行时内部接口函数。在forte源码目录src/core下面有个lua文件夹,里面的代码就是运行时操作Lua脚本的地方,其中比较重要的文件是luabfb.cpp,这个文件里的代码实现的Lua脚本里面获取运行时里的值,触发运行时执行事件,lua脚本里面设置运行时的值等重要功能。
int CLuaFB_index(lua_State *paLuaState) {
CLuaBFB* luaFB = CLuaEngine::luaGetObject<CLuaBFB>(paLuaState, 1);
TForteUInt32 id = static_cast<TForteUInt32>(luaL_checkinteger(paLuaState, 2));
CIEC_ANY* var = luaFB->getVariable(id);
CLuaEngine::luaPushAny(paLuaState, var);
return 1;
}
int CLuaFB_newindex(lua_State *paLuaState) {
CLuaBFB* luaFB = CLuaEngine::luaGetObject<CLuaBFB>(paLuaState, 1);
TForteUInt32 id = static_cast<TForteUInt32>(luaL_checkinteger(paLuaState, 2));
CIEC_ANY* var = luaFB->getVariable(id);
CLuaEngine::luaGetAny(paLuaState, var, 3);
return 0;
}
int CLuaFB_call(lua_State *paLuaState) {
CLuaBFB* luaFB = CLuaEngine::luaGetObject<CLuaBFB>(paLuaState, 1);
TForteUInt32 id = static_cast<TForteUInt32>(luaL_checkinteger(paLuaState, 2));
if((id & CLuaBFB::LUA_FB_AD_FLAG) != 0) {
luaFB->sendAdapterEvent((id >> 16) & CLuaBFB::LUA_AD_VAR_MAX, id & CLuaBFB::LUA_FB_VAR_MAX);
} else {
luaFB->sendOutputEvent(id);
}
return 0;
}
如果需要在运行时里面新增函数提供给Lua脚本调用,可以按照如下步骤执行:
- 在运行时里定义函数;
- 把运行时里的函数添加给Lua引擎;
- 在Lua脚本里面就可以调用了;