fixed db playback
authorKevron Rees <tripzero.kev@gmail.com>
Sat, 4 May 2013 07:52:23 +0000 (00:52 -0700)
committerKevron Rees <tripzero.kev@gmail.com>
Sat, 4 May 2013 07:52:23 +0000 (00:52 -0700)
examples/storage
plugins/database/databasesink.cpp
plugins/database/databasesink.h

index e75b21b..65bd8a3 100644 (file)
Binary files a/examples/storage and b/examples/storage differ
index 67f06a3..fa28f2b 100644 (file)
@@ -78,6 +78,9 @@ int getNextEvent(gpointer data)
        if(!pbshared)
                throw std::runtime_error("failed to cast PlaybackShared object");
 
+       if(pbshared->stop)
+               return 0;
+
        auto itr = pbshared->playbackQueue.begin();
 
        if(itr == pbshared->playbackQueue.end())
@@ -104,10 +107,11 @@ int getNextEvent(gpointer data)
                if(t > 0)
                        g_timeout_add((t*1000) / pbshared->playBackMultiplier, getNextEvent, pbshared);
                else
-                       g_timeout_add(t, getNextEvent, pbshared);
+                       g_timeout_add(1, getNextEvent, pbshared);
        }
 
        pbshared->playbackQueue.remove(obj);
+       DebugOut()<<"playback Queue size: "<<pbshared->playbackQueue.size()<<endl;
        delete obj;
 
        return 0;
@@ -160,7 +164,7 @@ DatabaseSink::DatabaseSink(AbstractRoutingEngine *engine, map<std::string, std::
        {
                AsyncSetPropertyRequest request;
                request.property = DatabaseLoggingProperty;
-               request.value = new BasicPropertyType<bool>(true);
+               request.value = new DatabaseLoggingType(true);
 
                setProperty(request);
        }
@@ -172,7 +176,11 @@ DatabaseSink::DatabaseSink(AbstractRoutingEngine *engine, map<std::string, std::
 
        if(config.find("playbackOnLoad")!= config.end())
        {
-               startPlayback();
+               AsyncSetPropertyRequest request;
+               request.property = DatabasePlaybackProperty;
+               request.value = new DatabasePlaybackType(true);
+
+               setProperty(request);
        }
 
 
@@ -293,6 +301,10 @@ void DatabaseSink::startPlayback()
 
        vector<vector<string> > results = shared->db->select("SELECT * FROM "+tablename);
 
+       /// we are done with shared.  clean up:
+       delete shared;
+       shared = NULL;
+
        if(playbackShared)
        {
                delete playbackShared;
@@ -313,6 +325,9 @@ void DatabaseSink::startPlayback()
                obj->value = results[i][1];
                obj->source = results[i][2];
                obj->time = boost::lexical_cast<double>(results[i][3]);
+
+               /// TODO: figure out why sequence is broken:
+
 //             obj->sequence = boost::lexical_cast<int>(results[i][4]);
 
                playbackShared->playbackQueue.push_back(obj);
@@ -329,6 +344,24 @@ void DatabaseSink::initDb()
        shared->db->init(databaseName, tablename, tablecreate);
 }
 
+void DatabaseSink::setPlayback(bool v)
+{
+       AsyncSetPropertyRequest request;
+       request.property = DatabasePlaybackProperty;
+       request.value = new DatabasePlaybackType(v);
+
+       setProperty(request);
+}
+
+void DatabaseSink::setLogging(bool b)
+{
+       AsyncSetPropertyRequest request;
+       request.property = DatabaseLoggingProperty;
+       request.value = new DatabaseLoggingType(b);
+
+       setProperty(request);
+}
+
 void DatabaseSink::propertyChanged(VehicleProperty::Property property, AbstractPropertyType *value, std::string uuid)
 {
        if(!shared)
@@ -450,7 +483,7 @@ AsyncPropertyReply *DatabaseSink::setProperty(AsyncSetPropertyRequest request)
        {
                if(request.value->value<bool>())
                {
-                       ///TODO: start or stop logging thread
+                       setPlayback(false);
                        startDb();
                        reply->success = true;
                        BasicPropertyType<bool> temp(true);
@@ -481,19 +514,23 @@ AsyncPropertyReply *DatabaseSink::setProperty(AsyncSetPropertyRequest request)
        {
                if(request.value->value<bool>())
                {
+                       setLogging(false);
                        startPlayback();
 
-                       BasicPropertyType<bool> temp(true);
+                       BasicPropertyType<bool> temp(playback);
 
                        routingEngine->updateProperty(DatabasePlaybackProperty,&temp,uuid());
                }
                else
                {
-                       /// TODO: stop playback
+                       if(playbackShared)
+                               playbackShared->stop = true;
 
-                       BasicPropertyType<bool> temp(true);
+                       playback = false;
 
-                       routingEngine->updateProperty(DatabasePlaybackProperty,&temp,uuid());
+                       BasicPropertyType<bool> temp(playback);
+
+                       routingEngine->updateProperty(DatabasePlaybackProperty, &temp, uuid());
                }
 
                reply->success = true;
index aa88e82..6e22259 100644 (file)
@@ -119,7 +119,7 @@ class PlaybackShared
 {
 public:
        PlaybackShared(AbstractRoutingEngine* re, std::string u, uint playbackMult)
-               :routingEngine(re),uuid(u),playBackMultiplier(playbackMult) {}
+               :routingEngine(re),uuid(u),playBackMultiplier(playbackMult),stop(false) {}
        ~PlaybackShared()
        {
                for(auto itr = playbackQueue.begin(); itr != playbackQueue.end(); itr++)
@@ -136,6 +136,7 @@ public:
        std::list<DBObject*> playbackQueue;
        uint playBackMultiplier;
        std::string uuid;
+       bool stop;
 };
 
 class DatabaseSink : public AbstractSource
@@ -164,6 +165,8 @@ private: //methods:
        void startDb();
        void startPlayback();
        void initDb();
+       void setPlayback(bool v);
+       void setLogging(bool b);
 
 private:
        PropertyList mSubscriptions;