Mercurial > hg > soniczoomios
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;