From dcecacbf52121d6f8adf076d2cebaeec1e141339 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 23 Aug 2012 20:23:19 +0200 Subject: Implement automatic reset/reload when script file changes on disc. --- src/luascript.cc | 154 +++++++++++++++++++++---------------------------------- 1 file changed, 58 insertions(+), 96 deletions(-) (limited to 'src/luascript.cc') diff --git a/src/luascript.cc b/src/luascript.cc index 1699cdf..fb6a7db 100644 --- a/src/luascript.cc +++ b/src/luascript.cc @@ -27,6 +27,8 @@ */ #include "luascript.h" +#include + // For atoi #include @@ -69,6 +71,12 @@ static int _forward(lua_State *L) return 1; } + if(lua->lua_stop) { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } + lua->out->forward(x * 5); return 0; @@ -93,7 +101,13 @@ static int _turn(lua_State *L) return 1; } - lua->out->turn(-x); + if(lua->lua_stop) { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } + + lua->out->turn(-x * 10); return 0; } @@ -106,7 +120,7 @@ static int _reset(lua_State *L) */ printf("reset\n"); - + lua_getglobal(L, GLOBAL_POINTER); LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); @@ -116,24 +130,31 @@ static int _reset(lua_State *L) return 1; } + if(lua->lua_stop) { + lua_pushstring(L, "stop"); + lua_error(L); + } + lua->out->reset(); return 0; } -LUAScript::LUAScript(OutputWindow *o) +LUAScript::LUAScript(OutputWindow *o, QString f) { DEBUG(luascript, "LUAScript()\n"); + file = f; L = NULL; out = o; + + // Don't call init from here, it need to be done in the thread. + + lua_stop = false; + lua_stopped = true; } LUAScript::~LUAScript() { - if(L) { - free(L); - L = NULL; - } DEBUG(luascript, "~LUAScript()\n"); } @@ -157,58 +178,45 @@ void LUAScript::init() lua_register(L, "fremad", _forward); lua_register(L, "drej", _turn); lua_register(L, "reset", _reset); - - connect(&watcher, SIGNAL(fileChanged(const QString &)), - this, SLOT(reload())); } -void LUAScript::addFile(std::string src) +void LUAScript::cleanup() { - file = src.c_str(); - FILE *fp = fopen(src.c_str(), "r"); - if(fp) { - char buf[64]; - size_t sz; - std::string inc; - while((sz = fread(buf, 1, sizeof(buf), fp)) != 0) { - inc.append(buf, sz); - } - fclose(fp); - addCode(inc, src); + if(L) { + lua_close(L); + L = NULL; } - - watcher.addPath(file); -} - -void LUAScript::reload() -{ - printf("Reload\n"); - // luaL_error(L, "Terminated due to reload."); - // runScript(); -} - -void LUAScript::addCode(std::string c, std::string name) -{ - scripts.push_back(std::make_pair(c, name)); } void LUAScript::run() { - /* - while(true) { - printf("."); fflush(stdout); - } - */ + lua_stopped = false; try { + init(); runScript(); } catch(Exception &e) { printf("LUA Error: %s\n", e.msg.c_str()); } + cleanup(); + lua_stopped = true; + printf("LUA Thread Stopped!\n"); +} + +void LUAScript::stopScript() +{ + lua_stop = true; + while(!lua_stopped) { + wait(25); + qApp->processEvents(); + printf("!\n"); + } } void LUAScript::runScript() throw(Exception) { + lua_stop = false; + try { init(); } catch(Exception &e) { @@ -222,62 +230,16 @@ void LUAScript::runScript() top = lua_gettop(L); - std::vector >::iterator i = - scripts.begin(); - while(i != scripts.end()) { - std::string program = i->first; - std::string codename = name(); - if(i->second != "") codename += ": " + i->second; - - DEBUG(luascript, "Running %s: %s\n", codename.c_str(), program.c_str()); + // DEBUG(luascript, "Running %s\n", file); - if(luaL_loadbuffer(L, program.c_str(), program.size(), codename.c_str())) { - ERR(luascript, "loadbuffer: %s\n", lua_tostring(L, lua_gettop(L))); - throw Exception(lua_tostring(L, lua_gettop(L))); - } - - // Run the loaded code - if(lua_pcall(L, 0, LUA_MULTRET, 0)) { - ERR(luascript, "pcall: %s\n" , lua_tostring(L, lua_gettop(L))); - throw Exception(lua_tostring(L, lua_gettop(L))); - } - - i++; + if(luaL_loadfile(L, file.toStdString().c_str())) { + ERR(luascript, "loadbuffer: %s\n", lua_tostring(L, lua_gettop(L))); + throw Exception(lua_tostring(L, lua_gettop(L))); } -} - -std::string LUAScript::resultString() throw(Exception) -{ - if(top != lua_gettop(L) - 1) { - ERR(luascript, "Program did not return a single value.\n"); - throw Exception("Program did not return a single value."); - } - - if(lua_isstring(L, lua_gettop(L)) == false) { - ERR(luascript, "Program did not return a string value.\n"); - throw Exception("Program did not return a string value."); + + // Run the loaded code + if(lua_pcall(L, 0, LUA_MULTRET, 0)) { + ERR(luascript, "pcall: %s\n" , lua_tostring(L, lua_gettop(L))); + throw Exception(lua_tostring(L, lua_gettop(L))); } - - std::string res = lua_tostring(L, lua_gettop(L)); - lua_pop(L, 1); - - return res; } - -#ifdef TEST_LUASCRIPT -//Additional dependency files -//deps: -//Required cflags (autoconf vars may be used) -//cflags: -//Required link options (autoconf vars may be used) -//libs: -#include "test.h" - -TEST_BEGIN; - -// TODO: Put some testcode here (see test.h for usable macros). -TEST_TRUE(false, "No tests yet!"); - -TEST_END; - -#endif/*TEST_LUASCRIPT*/ -- cgit v1.2.3