#include "lua_wraper.h" void LuaDelegate::Stop() { } int LuaDelegate::DoString(std::string scr) { if (mVM != nullptr){ int ret = luaL_dostring(mVM,scr.c_str()); if (ret > 0){ printf("lua error"); PrintError(mVM); return -1; } } this->mScript = scr; return 0; } int LuaDelegate::UpdateScript(std::string scr) { if(nullptr != mVM){ lua_close(mVM); } free(mVM); mVM = luaL_newstate(); //打开lua if (nullptr != mVM) { return -1; } for (auto x : mFunc) { lua_register(mVM, x.first.c_str(), x.second); } mScript = scr; if (mVM != nullptr) { int ret = luaL_dostring(mVM,scr.c_str()); if (ret > 0){ printf("lua error"); PrintError(mVM); return -1; } } return 0; } void LuaDelegate::PrintError(lua_State *L) { std::cout<<"\nFATAL ERROR:%s\n\n"<< lua_tostring(L, -1); } int LuaDelegate::BindFunction(std::string name, lua_CFunction function) { if ((nullptr == function) || (name == "")) return -1; this->mFunc[name] = function; lua_register(mVM, "serial_send", function); return 0; } void LuaDelegate::OnSerialData(std::string data) { int i = lua_getglobal(mVM,"OnUartData"); if(i == 0){ std::cout << "OnSerialData not found\r\n"; return; } lua_pushstring(mVM,data.data()); lua_call(mVM,1,0); } void LuaDelegate::DumpStack() { static int count = 0; printf("begin dump lua stack:%d\n", count); int top = lua_gettop(mVM); for (int i = top; i > 0; --i) { int t = lua_type(mVM, i); switch (t) { case LUA_TSTRING: std::cout<<("%s\n", lua_tostring(mVM, i)); break; case LUA_TBOOLEAN: std::cout<<(lua_toboolean(mVM, i) ? "true\n" : "false\n"); break; case LUA_TNUMBER: std::cout<<("%g\n", lua_tonumber(mVM, i)); break; default: std::cout<<("%s\n", lua_typename(mVM, t)); break; } } ++count; } LuaDelegate::~LuaDelegate() { if(nullptr != mVM){ lua_close(mVM); } } LuaDelegate::LuaDelegate(): mVM(nullptr) { mVM = luaL_newstate(); //打开lua if(nullptr != mVM){ printf("shit is nullptr"); } luaL_openlibs(mVM); //打开标准库 } LuaDelegate::LuaDelegate(std::map maps) : mVM(nullptr) { mVM = luaL_newstate(); //打开lua if (nullptr != mVM) { printf("shit is nullptr"); } luaL_openlibs(mVM); //打开标准库 for (auto x : maps) { lua_register(mVM, x.first.c_str(), x.second); } mFunc = maps; } int LuaDelegate::DoFile(std::string path) { if(mVM != nullptr){ int ret = luaL_dofile(mVM, path.c_str()); if (ret > 0){ printf("lua error"); return -1; } } return 0; }