diff eventLogger.mm @ 28:e2c62db1e265

Started timer stuff
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Mon, 18 Feb 2013 11:45:05 +0000
parents ae4d2c3ce5e0
children fabb3a5cdfc9
line wrap: on
line diff
--- a/eventLogger.mm	Wed Feb 13 17:03:56 2013 +0000
+++ b/eventLogger.mm	Mon Feb 18 11:45:05 2013 +0000
@@ -8,9 +8,10 @@
 
 //---------------------------------------------------------------------------
 #include "eventLogger.h"
+#include "timer.h"
 
 EventLogger eventLogger;
-
+extern Timer timer;
 //---------------------------------------------------------------------------
 EventLogger::EventLogger(){
     //QuestionnaireViewController * questionnaireViewController;
@@ -42,11 +43,11 @@
     logEvent(APP_STARTED);
 }
 //---------------------------------------------------------------------------
-void EventLogger::questionnaireAnswersObtained(vector<int> answers){
+void EventLogger::questionnaireAnswersObtained(vector<int> answers, const char* userComments){
     
     questionnaireCompleted = true;
     questionnaireAnswers = answers;
-    
+    questionnaireComments = userComments;
     uploadQuestionnaire();
     
 }
@@ -168,6 +169,7 @@
             cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
             serverConnectionOK = true;
         }else{
+            serverConnectionOK = false;
             cout << "server connection ERROR \n";
         }
     }
@@ -183,6 +185,8 @@
 
 }
 //---------------------------------------------------------------------------
+// this reads the persistent log file , checks if we've used the app before and
+// if we've answered questionnaire or not
 void EventLogger::readJsonToLog(const string &jsonFile){
     Json::Value root;
     Json::Reader reader;
@@ -224,18 +228,20 @@
     savedInteractionTime = root["savedInteractionTime"].asLargestInt();
     questionnaireCompleted = root["questionnaireCompleted"].asBool();
     questionnaireUploaded = root["questionnaireUploaded"].asBool();
-    
+    interfaceOrder = root["interfaceOrder"].asInt();
     
     if(questionnaireCompleted && !questionnaireUploaded){
         // then read it in and upload it
-        Json::Value JArray = root["questionnaireAnswers"];
+        Json::Value JQ = root["questionnaire"];
+        Json::Value JArray = JQ["qAnswers"];
         if(JArray.size() < 2){
             cout << "Error - status of questionnaire is wierd\n";
         }
         for ( unsigned int i = 0; i < JArray.size(); i++ )
         {
-            questionnaireAnswers.push_back(JArray[1].asInt());
+            questionnaireAnswers.push_back(JArray[i].asInt());
         }
+        questionnaireComments = JQ["comments"].toStyledString();
         uploadQuestionnaire();
     }
     
@@ -249,7 +255,9 @@
     }
     // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time!
     cout << "Total interaction time: " << savedInteractionTime << '\n';
-
+    
+    timer.setInteractionTime(savedInteractionTime);
+    timer.setOrderFromPrevious(interfaceOrder);
     
 }
 
@@ -257,6 +265,7 @@
 //---------------------------------------------------------------------------
 
 bool EventLogger::uploadEventLog(bool async){
+
     // show indicator
     logUploadInProgress = true;
     cout << "^^^^^^^^  ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n";
@@ -297,11 +306,15 @@
     consentGiven = false;
     
 }
+//---------------------------------------------------------------------------
+// only called when doing supervised tests
 void EventLogger::newUser(){
     cout<<"setup new user\n";
     nextUploadNumber = 0;
     deviceID = ofGetSystemTimeMicros();
     savedInteractionTime = 0;
+    totalInteractionTime = 0;
+    sessionStartTime = ofGetSystemTime();
     questionnaireCompleted = false;
     questionnaireUploaded = false;
     consentGiven = true; // other wise we wouldn't be doing this
@@ -312,9 +325,41 @@
 // called from alertView OK in iViewController
 void EventLogger::setUsername(const char *u){
     userName = u;
+    // start interaction clock
+    timer.startInteractionClock();
+}
+//---------------------------------------------------------------------------
+void EventLogger::thinnedLogEvent(lEvent newEvent){
+    static lEvent previousEvent(APP_STARTED); // initialised as whatever. hopefully won't log
+    static int eventCounter = 0;
+    
+    // if first event then log it. it won't be, but still.
+    if(theEvents.size() == 0){
+        theEvents.push_back(newEvent);
+        previousEvent = newEvent;
+        return;
+    }
+    
+    // if previous event is more than 300ms ago, or event type has changed, log both of them
+    int gap = newEvent.eventTime - previousEvent.eventTime;
+    if(gap > 300 || newEvent.eventType != previousEvent.eventType){
+        // if prev event not logged, log it
+        if((*theEvents.end()).eventTime != previousEvent.eventTime){
+            theEvents.push_back(previousEvent);
+        }
+        theEvents.push_back(newEvent);
 
+    }
+    
+    // otherwise only record every Nth event
+    if(eventCounter >= EVENT_THIN_FACTOR){
+        theEvents.push_back(newEvent);
+        eventCounter = 0;
+
+    }
+    eventCounter++;
+    previousEvent = newEvent;
 }
-
 //---------------------------------------------------------------------------
 // log zoom event
 void EventLogger::logEvent(const leventType& evtType,const TwoVector& centre, const double& scale, const int& sliderID, const double& sliderVal){
@@ -331,6 +376,17 @@
     // thinFactor
     if(!loggingEnabled) return;
     switch ( evtType ) {
+            // data thinning here
+        case SCROLL:
+            thinnedLogEvent(lEvent(evtType,centre.x,centre.y));
+            break;
+        case ZOOM:
+            thinnedLogEvent(lEvent(evtType,scale));
+            break;
+        case CHANGE_SLIDER:
+            thinnedLogEvent(lEvent(evtType,sliderVal , 0.0 , sliderID));
+            break;
+            
         case SAVE_PRESET:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             // Code
@@ -338,9 +394,7 @@
         case SAVE_DESET:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             break;
-        case SCROLL:
-            theEvents.push_back(lEvent(evtType,centre.x,centre.y));
-            break;
+
         case SCROLL_STOPPED:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             cout << "SCROLL STOPPED EVENT\n";
@@ -349,12 +403,6 @@
             theEvents.push_back(lEvent(evtType,centre.x,centre.y,sliderID));
             cout << "SCROLL STOPPED EVENT\n";
             break;
-        case ZOOM:
-            theEvents.push_back(lEvent(evtType,scale));
-            break;
-        case CHANGE_SLIDER:
-            theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID));
-            break;
         case SWAP_VIEW:
             theEvents.push_back(lEvent(evtType,0.0 , 0.0 , sliderID)); // slider ID is which view
             break;
@@ -368,11 +416,8 @@
         uploadEventLog(true);
     }
     //sessionTime = (ofGetSystemTime() - sessionStartTime);
-    totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime);
-    if(totalInteractionTime > QUESTIONNAIRE_ENABLE_TIME){
-        TopButtonViewController *tbvc = ((testApp *)ofGetAppPtr())->topButtonViewController;
-        [tbvc enableQuestionButton];
-    }
+    totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime); // milliseconds
+
 }
 
 //---------------------------------------------------------------------------
@@ -419,7 +464,7 @@
     root["questionnaireCompleted"] = questionnaireCompleted;
     root["questionnaireUploaded"] = questionnaireUploaded;
     if(questionnaireCompleted && !questionnaireUploaded){
-        root["qAnswers"] = questionnaireToJson();
+        root["questionnaire"] = questionnaireToJson();
     }
     
     int i = 0;
@@ -446,8 +491,10 @@
         questionnaire[i] = (*aIter);
         i++;
     }
+    cout << questionnaireComments << "\n";
 
     root["qAnswers"] = questionnaire;
+    root["comments"] = questionnaireComments;
     root["userName"] = userName;
     root["deviceID"] = deviceID;
     root["iOSdeviceType"] = iOSdeviceType;