annotate eventLogger.mm @ 8:e2c6cfe8c6b7

JSON logs and presets.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Thu, 10 Jan 2013 18:24:26 +0000
parents 845ea04f8e33
children 346807b47860
rev   line source
rt300@0 1 //
rt300@0 2 // eventLogger.mm
rt300@0 3 // oscSenderExample
rt300@0 4 //
rt300@0 5 // Created by Robert Tubb on 05/11/2012.
rt300@0 6 //
rt300@0 7 //
rt300@4 8
rt300@8 9 //---------------------------------------------------------------------------
rt300@0 10 #include "eventLogger.h"
rt300@1 11
rt300@8 12
rt300@1 13 EventLogger eventLogger;
rt300@8 14 extern IViewController *iViewController;
rt300@1 15
rt300@8 16 //---------------------------------------------------------------------------
rt300@1 17 EventLogger::EventLogger(){
rt300@8 18
rt300@8 19 loggingEnabled = true;
rt300@8 20
rt300@8 21 }
rt300@8 22 //---------------------------------------------------------------------------
rt300@8 23 void EventLogger::init(){
rt300@4 24
rt300@8 25 readJsonToLog(ofxiPhoneGetDocumentsDirectory() + EVENT_LOG_FILENAME);
rt300@8 26 sessionStartTime = ofGetSystemTime();
rt300@7 27
rt300@8 28 }
rt300@8 29 //---------------------------------------------------------------------------
rt300@8 30 void EventLogger::readJsonToLog(const string &jsonFile){
rt300@8 31 Json::Value root;
rt300@8 32 Json::Reader reader;
rt300@5 33
rt300@5 34
rt300@8 35 ifstream theFile(jsonFile.c_str());
rt300@8 36 stringstream fileText;
rt300@8 37 string line;
rt300@8 38 if(!theFile){
rt300@8 39 cout<<"no event log file - first APP open\n";
rt300@8 40
rt300@8 41 firstEverAppOpen();
rt300@8 42
rt300@8 43 return;
rt300@8 44 }else{
rt300@8 45
rt300@8 46 while(theFile){
rt300@8 47 theFile >> line;
rt300@8 48 cout << line;
rt300@8 49 fileText << line;
rt300@8 50
rt300@8 51 }
rt300@8 52
rt300@8 53 theFile.close();
rt300@8 54 }
rt300@8 55
rt300@8 56 bool parsingSuccessful = reader.parse( fileText.str(), root );
rt300@8 57
rt300@8 58 if ( !parsingSuccessful )
rt300@8 59 {
rt300@8 60 // report to the user the failure and their locations in the document.
rt300@8 61 std::cout << "Failed to parse preset JSON\n"
rt300@8 62 << reader.getFormattedErrorMessages();
rt300@8 63 return;
rt300@8 64 }
rt300@8 65
rt300@8 66 // now put user deets into variables
rt300@8 67 userName = root["userName"].asString();
rt300@8 68 deviceID = root["deviceID"].asLargestInt();
rt300@8 69 totalInteractionTime = root["totalInteractionTime"].asLargestInt();
rt300@8 70
rt300@8 71 // check for unuploaded evts
rt300@8 72 const Json::Value jlogs = root["events"];
rt300@8 73
rt300@8 74 for ( int index = 0; index < jlogs.size(); ++index ) theEvents.push_back(lEvent(jlogs[index]));
rt300@8 75 if(theEvents.size() > 5000){
rt300@8 76 //try to upload
rt300@8 77 attemptUpload();
rt300@8 78 }
rt300@8 79 // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time!
rt300@8 80
rt300@8 81 // is there logged stuff that hasn't been uploaded yet?
rt300@8 82
rt300@8 83 // don't actually need to load old ones unless uploading? or saving...
rt300@8 84 //while(eventLogFile >> nextLine){
rt300@8 85
rt300@8 86 //}
rt300@8 87
rt300@8 88 //printAll();
rt300@8 89
rt300@1 90 }
rt300@1 91
rt300@8 92 //----------------------------------------------------------------------------
rt300@8 93
rt300@8 94 //---------------------------------------------------------------------------
rt300@8 95
rt300@8 96 void EventLogger::firstEverAppOpen(){
rt300@8 97 deviceID = ofGetSystemTimeMicros();
rt300@8 98
rt300@8 99 [iViewController showUserNamePrompt:23];
rt300@8 100
rt300@8 101 totalInteractionTime = 0;
rt300@8 102
rt300@8 103
rt300@8 104 }
rt300@8 105 //---------------------------------------------------------------------------
rt300@8 106 // called from alertView OK in iViewController
rt300@8 107 void EventLogger::setUsername(const char *u){
rt300@8 108 userName = u;
rt300@7 109
rt300@7 110 }
rt300@8 111
rt300@8 112 //---------------------------------------------------------------------------
rt300@8 113 // log zoom event
rt300@5 114 void EventLogger::logEvent(const leventType& evtType,const TwoVector& centre, const double& scale, const int& sliderID, const double& sliderVal){
rt300@3 115 //cout << "log: " << evtType << "\n";
rt300@1 116
rt300@1 117 // scroll has 2 double coords
rt300@1 118 // zoom has 1 double scale
rt300@1 119 // save preset has 2 coords
rt300@1 120 // switch view has view type
rt300@1 121 // slider change has int slider index and 1 int value
rt300@1 122
rt300@4 123 // get time for key index
rt300@4 124
rt300@5 125 // thinFactor
rt300@5 126 if(!loggingEnabled) return;
rt300@4 127 switch ( evtType ) {
rt300@4 128 case SAVE_PRESET:
rt300@5 129 theEvents.push_back(lEvent(evtType,centre.x,centre.y));
rt300@4 130 // Code
rt300@4 131 break;
rt300@4 132 case SAVE_DESET:
rt300@5 133 theEvents.push_back(lEvent(evtType,centre.x,centre.y));
rt300@4 134 break;
rt300@4 135 case SCROLL:
rt300@5 136 theEvents.push_back(lEvent(evtType,centre.x,centre.y));
rt300@5 137 break;
rt300@5 138 case SCROLL_STOPPED:
rt300@5 139 theEvents.push_back(lEvent(evtType,centre.x,centre.y));
rt300@4 140 break;
rt300@4 141 case ZOOM:
rt300@5 142 theEvents.push_back(lEvent(evtType,scale));
rt300@4 143 break;
rt300@4 144 case CHANGE_SLIDER:
rt300@5 145 theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID));
rt300@4 146 break;
rt300@4 147 default:
rt300@4 148 // Code
rt300@4 149 break;
rt300@1 150 }
rt300@8 151 if(theEvents.size() > nextUploadQty){
rt300@7 152 //try to upload
rt300@7 153 attemptUpload();
rt300@7 154 }
rt300@7 155 sessionTime = (ofGetSystemTime() - sessionStartTime);
rt300@7 156
rt300@1 157
rt300@1 158 }
rt300@8 159 //---------------------------------------------------------------------------
rt300@8 160 // log slider event
rt300@5 161 void EventLogger::logEvent(const leventType& evtType,const int& sliderID, const double& sliderVal){
rt300@5 162 if(!loggingEnabled) return;
rt300@5 163 // sliderThinFactor
rt300@5 164 switch ( evtType ) {
rt300@5 165 case CHANGE_SLIDER:
rt300@5 166 theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID));
rt300@5 167 break;
rt300@5 168 default:
rt300@5 169 // Code
rt300@5 170 break;
rt300@5 171 }
rt300@8 172 if(theEvents.size() > nextUploadQty){
rt300@7 173 //try to upload
rt300@8 174 bool uploaded = attemptUpload();
rt300@8 175
rt300@7 176 }
rt300@7 177 }
rt300@8 178 //---------------------------------------------------------------------------
rt300@8 179
rt300@8 180 bool EventLogger::attemptUpload(){
rt300@8 181 bool uploaded;
rt300@7 182
rt300@8 183 // do simple check of internet connection ?
rt300@8 184 // if not connected return
rt300@8 185
rt300@8 186 // if numlogs > 500000 show alert...
rt300@8 187
rt300@8 188 if(!uploaded){
rt300@7 189 // try later
rt300@8 190 nextUploadQty += 5000;
rt300@8 191 }else{
rt300@7 192
rt300@8 193 // if success - clear memory
rt300@8 194 theEvents.clear();
rt300@8 195 }
rt300@8 196 return uploaded;
rt300@8 197
rt300@5 198 }
rt300@8 199 //---------------------------------------------------------------------------
rt300@1 200 void EventLogger::sendHttp(){
rt300@1 201
rt300@5 202 string url = "http://www.rootnot.co.uk/cgi-bin/zoomlogs.cgi";
rt300@1 203 ofURLFileLoader fileLoader;
rt300@1 204 ofHttpResponse resp;
rt300@1 205 resp = fileLoader.get(url);
rt300@1 206 cout << "HTTP STATUS " << resp.status << "\n";
rt300@1 207 cout << "HTTP ERROR " << resp.error << "\n";
rt300@1 208 cout << "HTTP DATA " << resp.data << "\n";
rt300@7 209 }
rt300@7 210
rt300@7 211
rt300@7 212
rt300@8 213 //---------------------------------------------------------------------------
rt300@7 214
rt300@7 215 void EventLogger::exitAndSave(){
rt300@8 216 totalInteractionTime = totalInteractionTime + (ofGetSystemTime() - sessionStartTime);
rt300@7 217 // save user details
rt300@8 218 string fname = ofxiPhoneGetDocumentsDirectory() + EVENT_LOG_FILENAME;
rt300@8 219
rt300@8 220 Json::Value jlogs = logsToJson();
rt300@8 221 // try to upload
rt300@8 222 bool uploaded = attemptUpload();
rt300@7 223
rt300@8 224 // write to file
rt300@8 225
rt300@8 226 ofFile logFile(fname,ofFile::WriteOnly);
rt300@7 227
rt300@8 228 logFile << jlogs;
rt300@8 229
rt300@8 230 }
rt300@8 231 //---------------------------------------------------------------------------
rt300@8 232
rt300@8 233 Json::Value EventLogger::logsToJson(){
rt300@8 234 // put all logged events into Json formatted string
rt300@8 235 Json::Value root;
rt300@8 236
rt300@8 237 vector<lEvent>::iterator eventIter;
rt300@8 238
rt300@8 239 root["userName"] = userName;
rt300@8 240 root["deviceID"] = deviceID;
rt300@8 241 root["totalInteractionTime"] = totalInteractionTime;
rt300@8 242
rt300@8 243 int i = 0;
rt300@8 244 for(eventIter = theEvents.begin(); eventIter < theEvents.end(); eventIter++){
rt300@8 245 root["events"][i] = (*eventIter).eventToJson();
rt300@8 246 i++;
rt300@7 247 }
rt300@8 248
rt300@8 249 return root;
rt300@8 250 }
rt300@8 251 //---------------------------------------------------------------------------
rt300@8 252 //---------------------------------------------------------------------------
rt300@8 253 //---------------------------------------------------------------------------