Changed lua monitoring calls. Support for threading.

This commit is contained in:
emb
2015-11-20 22:49:56 -06:00
parent d1b8fcb0d9
commit 34e59adb1d
13 changed files with 160 additions and 39 deletions

View File

@@ -3,9 +3,10 @@ syntax: glob
*.suo *.suo
.git .git
Build/ Build/
Documentation/**
Documentation/Documentation/* Documentation/Documentation/*
Documentation/Artifacts/* Documentation/Artifacts/*
Documentation/Manual/_build/* Documentation/Manual/**
Configuration/Configuration/bin/** Configuration/Configuration/bin/**
Configuration/Configuration/obj/** Configuration/Configuration/obj/**
Artifacts/** Artifacts/**

View File

@@ -91,12 +91,19 @@ if(NOT WIN32)
endif() endif()
set(RETROFE_HEADERS set(RETROFE_HEADERS
"${RETROFE_DIR}/Source/Collection/CollectionInfo.h"
"${RETROFE_DIR}/Source/Collection/CollectionInfoBuilder.h"
"${RETROFE_DIR}/Source/Collection/Item.h"
"${RETROFE_DIR}/Source/Database/Configuration.h" "${RETROFE_DIR}/Source/Database/Configuration.h"
"${RETROFE_DIR}/Source/Database/DB.h"
"${RETROFE_DIR}/Source/Database/Metadata.h"
"${RETROFE_DIR}/Source/Database/MetadataDatabase.h"
"${RETROFE_DIR}/Source/Graphics/Component/Image.h" "${RETROFE_DIR}/Source/Graphics/Component/Image.h"
"${RETROFE_DIR}/Source/Graphics/Component/Component.h" "${RETROFE_DIR}/Source/Graphics/Component/Component.h"
"${RETROFE_DIR}/Source/Graphics/Component/ComponentData.h" "${RETROFE_DIR}/Source/Graphics/Component/ComponentData.h"
"${RETROFE_DIR}/Source/Graphics/Component/ComponentFactory.h" "${RETROFE_DIR}/Source/Graphics/Component/ComponentFactory.h"
"${RETROFE_DIR}/Source/Lua/Lua.h" "${RETROFE_DIR}/Source/Lua/Lua.h"
"${RETROFE_DIR}/Source/Lua/LuaCollection.h"
"${RETROFE_DIR}/Source/Lua/LuaDisplay.h" "${RETROFE_DIR}/Source/Lua/LuaDisplay.h"
"${RETROFE_DIR}/Source/Lua/LuaEvent.h" "${RETROFE_DIR}/Source/Lua/LuaEvent.h"
"${RETROFE_DIR}/Source/Lua/LuaImage.h" "${RETROFE_DIR}/Source/Lua/LuaImage.h"
@@ -108,7 +115,12 @@ set(RETROFE_HEADERS
) )
set(RETROFE_SOURCES set(RETROFE_SOURCES
"${RETROFE_DIR}/Source/Collection/CollectionInfo.cpp"
"${RETROFE_DIR}/Source/Collection/CollectionInfoBuilder.cpp"
"${RETROFE_DIR}/Source/Collection/Item.cpp"
"${RETROFE_DIR}/Source/Database/Configuration.cpp" "${RETROFE_DIR}/Source/Database/Configuration.cpp"
"${RETROFE_DIR}/Source/Database/DB.cpp"
"${RETROFE_DIR}/Source/Database/MetadataDatabase.cpp"
"${RETROFE_DIR}/Source/Graphics/Component/Image.cpp" "${RETROFE_DIR}/Source/Graphics/Component/Image.cpp"
"${RETROFE_DIR}/Source/Graphics/Component/Component.cpp" "${RETROFE_DIR}/Source/Graphics/Component/Component.cpp"
"${RETROFE_DIR}/Source/Graphics/Component/ComponentFactory.cpp" "${RETROFE_DIR}/Source/Graphics/Component/ComponentFactory.cpp"
@@ -117,6 +129,7 @@ set(RETROFE_SOURCES
"${RETROFE_DIR}/Source/Lua/Lua.cpp" "${RETROFE_DIR}/Source/Lua/Lua.cpp"
"${RETROFE_DIR}/Source/Lua/LuaDisplay.cpp" "${RETROFE_DIR}/Source/Lua/LuaDisplay.cpp"
"${RETROFE_DIR}/Source/Lua/LuaImage.cpp" "${RETROFE_DIR}/Source/Lua/LuaImage.cpp"
"${RETROFE_DIR}/Source/Lua/LuaCollection.cpp"
"${RETROFE_DIR}/Source/Lua/LuaEvent.cpp" "${RETROFE_DIR}/Source/Lua/LuaEvent.cpp"
"${RETROFE_DIR}/Source/Lua/LuaLog.cpp" "${RETROFE_DIR}/Source/Lua/LuaLog.cpp"
"${RETROFE_DIR}/Source/Main.cpp" "${RETROFE_DIR}/Source/Main.cpp"
@@ -124,6 +137,7 @@ set(RETROFE_SOURCES
"${RETROFE_DIR}/Source/StateMachine.cpp" "${RETROFE_DIR}/Source/StateMachine.cpp"
"${RETROFE_DIR}/Source/SDL.cpp" "${RETROFE_DIR}/Source/SDL.cpp"
"${RETROFE_DIR}/Source/Version.cpp" "${RETROFE_DIR}/Source/Version.cpp"
"${SQLITE3_ROOT}/sqlite3.c"
) )

View File

@@ -21,6 +21,7 @@
#include "../Database/DB.h" #include "../Database/DB.h"
#include "../Utility/Log.h" #include "../Utility/Log.h"
#include "../Utility/Utils.h" #include "../Utility/Utils.h"
#include "SDL2/SDL_thread.h"
#include <dirent.h> #include <dirent.h>
#ifdef __linux #ifdef __linux
@@ -142,6 +143,35 @@ bool CollectionInfoBuilder::createCollectionDirectory(std::string name)
return true; return true;
} }
struct CIBCallbackInfo {
std::string collectionName;
void (*callback)(void *);
void *context;
CollectionInfoBuilder *cib;
};
int CollectionInfoBuilder::buildCollectionThread(void *context)
{
CIBCallbackInfo *info = (CIBCallbackInfo *)context;
info->cib->buildCollection(info->collectionName);
info->callback(info->context);
delete info;
return 0;
}
void CollectionInfoBuilder::buildCollection(std::string collectionName, void (*callback)(void *), void *context)
{
CIBCallbackInfo *data = new CIBCallbackInfo();
data->collectionName = collectionName;
data->callback = callback;
data->context = context;
data->cib = this;
SDL_Thread *thread = SDL_CreateThread(buildCollectionThread, "buildCollection", (void *)data);
}
CollectionInfo *CollectionInfoBuilder::buildCollection(std::string name) CollectionInfo *CollectionInfoBuilder::buildCollection(std::string name)
{ {
return buildCollection(name, ""); return buildCollection(name, "");

View File

@@ -29,11 +29,13 @@ class CollectionInfoBuilder
public: public:
CollectionInfoBuilder(Configuration &c, MetadataDatabase &mdb); CollectionInfoBuilder(Configuration &c, MetadataDatabase &mdb);
virtual ~CollectionInfoBuilder(); virtual ~CollectionInfoBuilder();
void buildCollection(std::string collectionName, void (*callback)(void *), void *context);
CollectionInfo *buildCollection(std::string collectionName); CollectionInfo *buildCollection(std::string collectionName);
CollectionInfo *buildCollection(std::string collectionName, std::string mergedCollectionName); CollectionInfo *buildCollection(std::string collectionName, std::string mergedCollectionName);
static bool createCollectionDirectory(std::string collectionName); static bool createCollectionDirectory(std::string collectionName);
private: private:
static int buildCollectionThread(void *context);
Configuration &conf_; Configuration &conf_;
MetadataDatabase &metaDB_; MetadataDatabase &metaDB_;
bool ImportBasicList(CollectionInfo *info, std::string file, std::map<std::string, Item *> &list); bool ImportBasicList(CollectionInfo *info, std::string file, std::map<std::string, Item *> &list);

View File

@@ -0,0 +1,29 @@
#include "LuaCollection.h"
#include "../Collection/CollectionInfo.h"
#include <string>
#include "../Collection/Item.h"
Configuration *config;
CollectionInfoBuilder *cib;
LuaEvent *events;
void LuaCollection::initialize(Configuration *c, CollectionInfoBuilder *b, LuaEvent *e)
{
config = c;
cib = b;
events = e;
}
int LuaCollection::load(lua_State *l)
{
std::string collection = luaL_checkstring(l, 1);
cib->buildCollection(collection, loadCallback, (void *)l);
return 0;
}
void LuaCollection::loadCallback(void *context)
{
lua_State *l = (lua_State *)context;
events->trigger(l, "onCollectionLoaded");
}

View File

@@ -0,0 +1,13 @@
#pragma once
#include "Lua.h"
#include "LuaEvent.h"
#include "../Collection/CollectionInfoBuilder.h"
#include "../Database/Configuration.h"
namespace LuaCollection
{
void initialize(Configuration *c, CollectionInfoBuilder *b, LuaEvent *e);
int load(lua_State *l);
void loadCallback(void *context);
};

View File

@@ -1,27 +1,21 @@
#include "LuaEvent.h" #include "LuaEvent.h"
void LuaEvent::registerCallback(std::string type, std::string functionName, std::string complete)
{
callbacks_[type] = functionName;
completeCallbacks_[type] = complete;
}
void LuaEvent::trigger(lua_State *l, std::string type) void LuaEvent::trigger(lua_State *l, std::string type)
{ {
lua_getglobal(l, callbacks_[type].c_str()); lua_getglobal(l, type.c_str());
lua_call(l, 0, 0);
lua_pcall(l, 0, 0, 0);
} }
bool LuaEvent::isComplete(lua_State *l, std::string type) bool LuaEvent::isBusy(lua_State *l, std::string type)
{ {
bool retval = true; bool retval = true;
lua_getglobal(l, callbacks_[type].c_str()); lua_getglobal(l, type.c_str());
if(lua_pcall(l, 0, 1, 0) == 0) if(lua_pcall(l, 0, 1, 0) == 0)
{ {
if(!lua_isnil(l, 1)) if(lua_isboolean(l, -1))
{ {
if(!lua_toboolean(l, 1)) if(!lua_toboolean(l, -1))
{ {
retval = false; retval = false;
} }

View File

@@ -5,10 +5,6 @@
class LuaEvent { class LuaEvent {
public: public:
void registerCallback(std::string type, std::string functionName, std::string complete);
void trigger(lua_State *l, std::string type); void trigger(lua_State *l, std::string type);
bool isComplete(lua_State *l, std::string type); bool isBusy(lua_State *l, std::string type);
private:
std::map<std::string, std::string> callbacks_;
std::map<std::string, std::string> completeCallbacks_;
}; };

View File

@@ -20,7 +20,7 @@ int LuaImage::create(lua_State *l)
int LuaImage::destroy(lua_State *l) int LuaImage::destroy(lua_State *l)
{ {
Image *i = (Image *)luaL_checkinteger(l, 1); Image *i = (Image *)luaL_checkinteger(l, 1);
delete i; factory->deleteComponent(i);
return 0; return 0;
} }

View File

@@ -21,6 +21,7 @@
#include "SDL.h" #include "SDL.h"
#include "Graphics/Component/Image.h" #include "Graphics/Component/Image.h"
#include "Graphics/Component/Component.h" #include "Graphics/Component/Component.h"
#include "Lua/LuaCollection.h"
#include "Lua/LuaDisplay.h" #include "Lua/LuaDisplay.h"
#include "Lua/LuaImage.h" #include "Lua/LuaImage.h"
#include "Lua/LuaLog.h" #include "Lua/LuaLog.h"
@@ -79,6 +80,11 @@ const luaL_Reg RetroFE::luaImageFuncs[] = {
{NULL, NULL} {NULL, NULL}
}; };
const luaL_Reg RetroFE::luaCollectionFuncs[] = {
{"load", LuaCollection::load},
{NULL, NULL}
};
const luaL_Reg RetroFE::luaDisplayFuncs[] = { const luaL_Reg RetroFE::luaDisplayFuncs[] = {
{"getCenter", LuaDisplay::getCenter}, {"getCenter", LuaDisplay::getCenter},
{"getDimensions", LuaDisplay::getDimensions}, {"getDimensions", LuaDisplay::getDimensions},
@@ -98,6 +104,12 @@ void RetroFE::initializeLua()
{ {
lua_.initialize(); lua_.initialize();
LuaImage::initialize(factory_); LuaImage::initialize(factory_);
LuaCollection::initialize(&config_, cib_, &luaEvent_);
lua_newtable(lua_.state);
luaL_setfuncs (lua_.state, luaCollectionFuncs, 0);
lua_pushvalue(lua_.state, -1);
lua_setglobal(lua_.state, "collection");
lua_newtable(lua_.state); lua_newtable(lua_.state);
luaL_setfuncs (lua_.state, luaDisplayFuncs, 0); luaL_setfuncs (lua_.state, luaDisplayFuncs, 0);
@@ -122,17 +134,20 @@ void RetroFE::reloadLuaScripts()
luaL_loadfile(lua_.state, path.c_str()); luaL_loadfile(lua_.state, path.c_str());
lua_pcall(lua_.state, 0, LUA_MULTRET, 0); lua_pcall(lua_.state, 0, LUA_MULTRET, 0);
luaEvent_.registerCallback("onInitEnter", "onInitEnter", "onInitEnterComplete");
luaEvent_.registerCallback("onInitExit", "onInitExit", "onInitExitComplete");
} }
RetroFE::RetroFE(Configuration &c) RetroFE::RetroFE(Configuration &c)
: config_(c) : config_(c)
, db_(c.absolutePath + "/meta.db")
, mdb_(NULL)
, cib_(NULL)
{ {
} }
RetroFE::~RetroFE() RetroFE::~RetroFE()
{ {
if(cib_) delete cib_;
if(mdb_) delete mdb_;
} }
@@ -140,7 +155,11 @@ RetroFE::~RetroFE()
void RetroFE::run() void RetroFE::run()
{ {
if(!SDL::initialize(config_)) return; if(!SDL::initialize(config_)) return;
db_.initialize();
mdb_ = new MetadataDatabase(db_, config_);
cib_ = new CollectionInfoBuilder(config_, *mdb_);
mdb_->initialize();
initializeLua(); initializeLua();
StateMachine state(lua_.state, &luaEvent_); StateMachine state(lua_.state, &luaEvent_);

View File

@@ -15,9 +15,12 @@
*/ */
#pragma once #pragma once
#include "Collection/CollectionInfoBuilder.h"
#include "Database/DB.h"
#include "Database/Configuration.h"
#include "Database/MetadataDatabase.h"
#include "Lua/Lua.h" #include "Lua/Lua.h"
#include "Lua/LuaEvent.h" #include "Lua/LuaEvent.h"
#include "Database/Configuration.h"
#include "Graphics/Component/ComponentFactory.h" #include "Graphics/Component/ComponentFactory.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <vector> #include <vector>
@@ -38,4 +41,8 @@ private:
static const luaL_Reg luaDisplayFuncs[]; static const luaL_Reg luaDisplayFuncs[];
static const luaL_Reg luaLogFuncs[]; static const luaL_Reg luaLogFuncs[];
static const luaL_Reg luaImageFuncs[]; static const luaL_Reg luaImageFuncs[];
static const luaL_Reg luaCollectionFuncs[];
DB db_;
MetadataDatabase *mdb_;
CollectionInfoBuilder *cib_;
}; };

View File

@@ -3,28 +3,36 @@
StateMachine::StateMachine(lua_State *l, LuaEvent *e) StateMachine::StateMachine(lua_State *l, LuaEvent *e)
: luaState_(l) : luaState_(l)
, luaEvent_(e) , luaEvent_(e)
, state_(ON_INIT_ENTER) , state_(ON_STARTUP_ENTER)
{ {
} }
void StateMachine::update(float dt) void StateMachine::update(float dt)
{ {
switch(state_) { switch(state_) {
case ON_INIT_ENTER: case ON_STARTUP_ENTER:
luaEvent_->trigger(luaState_, "onInitEnter"); luaEvent_->trigger(luaState_, "startuponEnter");
state_ = ON_INIT_ENTER_WAIT; state_ = ON_STARTUP_UPDATE;
break; break;
case ON_INIT_ENTER_WAIT: case ON_STARTUP_UPDATE:
if(luaEvent_->isComplete(luaState_, "onInitEnter")) { //todo: only do it if the main system is not busy
state_ = ON_INIT_EXIT; luaEvent_->trigger(luaState_, "startuponUpdate");
if(!luaEvent_->isBusy(luaState_, "startupisBusy")) {
state_ = ON_STARTUP_EXIT;
} }
break; break;
case ON_INIT_EXIT: case ON_STARTUP_EXIT:
luaEvent_->trigger(luaState_, "onInitExit"); luaEvent_->trigger(luaState_, "startuponExit");
state_ = ON_INIT_EXIT_WAIT; state_ = ON_STARTUP_EXIT_WAIT;
break;
case ON_STARTUP_EXIT_WAIT:
if(!luaEvent_->isBusy(luaState_, "startupisBusy")) {
state_ = ON_IDLE_ENTER;
}
break; break;
} }
} }

View File

@@ -15,9 +15,17 @@ private:
LuaEvent *luaEvent_; LuaEvent *luaEvent_;
enum { enum {
ON_INIT_ENTER, ON_STARTUP_ENTER,
ON_INIT_ENTER_WAIT, ON_STARTUP_UPDATE,
ON_INIT_EXIT, ON_STARTUP_EXIT,
ON_INIT_EXIT_WAIT, ON_STARTUP_EXIT_WAIT,
ON_COLLECTION_ENTER,
ON_COLLECTION_UPDATE,
ON_COLLECTION_EXIT,
ON_COLLECTION_EXIT_WAIT,
ON_STARTUP_EXIT_DONE,
ON_IDLE_ENTER
} state_; } state_;
}; };