annotate eventLogger.h @ 27:ae4d2c3ce5e0

Details. Zoom trailing finger move sorted. Qs rephrased.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 13 Feb 2013 17:03:56 +0000
parents f42a00e3f22d
children e2c62db1e265
rev   line source
rt300@0 1 //
rt300@0 2 // eventLogger.h
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@0 8 // This class handle everything to do with loggin user actions,
rt300@0 9 // uploading logs to server, and storing locally if not uploaded
rt300@0 10
rt300@0 11 #ifndef __oscSenderExample__eventLogger__
rt300@0 12 #define __oscSenderExample__eventLogger__
rt300@0 13
rt300@1 14
rt300@4 15 #include "ofMain.h"
rt300@4 16 #include "ofxiPhone.h"
rt300@4 17 #include "2dvector.h"
rt300@4 18 #include "ofxiPhoneExtras.h"
rt300@4 19 #include <sys/time.h>
rt300@4 20 #include <iostream>
rt300@4 21 #include <string>
rt300@22 22 #include <cstring>
rt300@4 23 #include <map>
rt300@4 24 #include "2dvector.h"
rt300@8 25 #include "json.h"
rt300@24 26 #include "testApp.h"
rt300@8 27
rt300@16 28
rt300@8 29
rt300@25 30
rt300@25 31
rt300@25 32 #define EVENT_LOG_FILENAME "log.json"
rt300@25 33 #define SERVER_URL "http://127.0.0.1:8080/testservice/"
rt300@25 34 #define UPLOAD_CHUNK_SIZE 500
rt300@25 35 #define QUESTIONNAIRE_ENABLE_TIME 100000 // milliseconds
rt300@25 36 #define APP_CREATION_TIME 381429000000 // milliseconds to the time i wrote this wee blighter
rt300@25 37
rt300@25 38 #define PROGRAM_VERSION 1.0 // IMPORTANT TOCHNAGE!
rt300@25 39
rt300@9 40 // can add but don't change ordering - this will invalidate logs
rt300@25 41 enum leventType {SAVE_PRESET, // 0
rt300@25 42 SAVE_DESET, // 1
rt300@25 43 SCROLL, // 2
rt300@25 44 ZOOM, // 3
rt300@25 45 SCROLL_STOPPED, // 4
rt300@25 46 ZOOM_STOPPED, // 5
rt300@25 47 SNAPPED_TO_PRESET, // 6
rt300@25 48 CHANGE_SLIDER, // 7
rt300@25 49 SWAP_VIEW, // 8
rt300@25 50 SET_MIN_ZOOM, // 9
rt300@25 51 SET_MAX_ZOOM, // 10
rt300@25 52 RANDOMISE, // 11
rt300@25 53 APP_STARTED, // 12
rt300@25 54 APP_EXITED, // 13
rt300@25 55 CONSENT_DENIED, // 14
rt300@25 56 SEQ_LOCKED, // 15
rt300@25 57 SYNTH_LOCKED, // 16
rt300@25 58 PLAY_PRESSED, // 17
rt300@27 59 PAUSE_PRESSED, // 18
rt300@27 60 HELP_PRESSED}; // 19
rt300@1 61
rt300@8 62 //---------------------------------------------------------------------------
rt300@8 63
rt300@4 64 class lEvent{
rt300@5 65 public:
rt300@1 66 // try and make this as compact as possible.
rt300@4 67 leventType eventType;
rt300@1 68 double val1; // x coord, scale if zoom
rt300@1 69 double val2; // y coord, 0 if zoom
rt300@25 70 int sliderID; // xtra int
rt300@9 71 long long eventTime;
rt300@8 72 lEvent(leventType eType, double v1 = 0.0, double v2 = 0.0,int sID = 0){
rt300@5 73 eventType = eType;
rt300@5 74 val1 = v1;
rt300@5 75 val2 = v2;
rt300@5 76 sliderID = sID;
rt300@9 77
rt300@9 78 double timemsd = [NSDate timeIntervalSinceReferenceDate];
rt300@25 79 eventTime = (unsigned long long)(timemsd*1000) - APP_CREATION_TIME;
rt300@9 80
rt300@5 81 }
rt300@25 82
rt300@8 83 lEvent(const Json::Value &jevt){
rt300@9 84 // constructor takes "jsonToEvent" readfile function role
rt300@25 85 eventType = (leventType)jevt["eType"].asInt();
rt300@25 86 val1 = jevt["v1"].asDouble();
rt300@25 87 val2 = jevt["v2"].asDouble();
rt300@25 88 sliderID = jevt["sID"].asInt();
rt300@25 89 eventTime = jevt["eTime"].asLargestInt();
rt300@9 90
rt300@15 91 // TODO what happens if we try to read one that isn't there?
rt300@15 92
rt300@8 93 }
rt300@8 94 Json::Value eventToJson(){
rt300@8 95 Json::Value jevt;
rt300@25 96 jevt["eType"] = eventType;
rt300@25 97 // here: should give a certain number of sig figs?
rt300@25 98 jevt["v1"] = val1;
rt300@25 99 jevt["v2"] = val2;
rt300@25 100 jevt["sID"] = sliderID;
rt300@25 101 jevt["eTime"] = eventTime;
rt300@8 102 return jevt;
rt300@8 103 }
rt300@5 104 };
rt300@5 105 //---------------------------------------------------------------------------
rt300@8 106 // streams no longer used
rt300@5 107 inline istream& operator>>(istream & is, lEvent& e){
rt300@5 108 is.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 109 is.precision(1);
rt300@4 110
rt300@5 111 char delim;
rt300@5 112 int eType;
rt300@0 113
rt300@5 114 is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID;
rt300@5 115
rt300@5 116 e.eventType = (leventType)eType;
rt300@5 117
rt300@5 118 return is;
rt300@5 119 }
rt300@4 120
rt300@5 121 //---------------------------------------------------------------------------
rt300@5 122 inline ostream& operator<<(ostream & os, const lEvent& e){
rt300@5 123 os.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 124 os.precision(1);
rt300@5 125
rt300@5 126 os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n';
rt300@5 127
rt300@5 128 return os;
rt300@7 129 }
rt300@5 130 //---------------------------------------------------------------------------
rt300@4 131
rt300@0 132 class EventLogger{
rt300@0 133 public:
rt300@25 134 int nextUploadNumber;
rt300@14 135 bool loggingEnabled;
rt300@27 136 bool logUploadInProgress;
rt300@22 137 bool serverConnectionOK;
rt300@25 138 bool consentGiven;
rt300@14 139 unsigned int deviceID; // unique get something from hardware??
rt300@25 140 unsigned int totalInteractionTime, savedInteractionTime, sessionTime, sessionStartTime;
rt300@14 141 string userName; // not unique
rt300@27 142
rt300@14 143 EventLogger();
rt300@14 144 void init();
rt300@14 145 void exitAndSave();
rt300@14 146 void setUsername(const char *u);
rt300@27 147 void newUser();
rt300@14 148 void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0);
rt300@22 149 void questionnaireAnswersObtained(vector<int> answers);
rt300@27 150 void urlResponse(ofHttpResponse & response);
rt300@14 151 private:
rt300@0 152 // what we need...
rt300@0 153 /*
rt300@0 154 time, type, value
rt300@0 155 */
rt300@14 156
rt300@27 157 int currentHTTPRequestID;
rt300@4 158 vector<lEvent> theEvents;
rt300@0 159
rt300@16 160
rt300@14 161 // values applicable to all events
rt300@14 162
rt300@14 163 unsigned int nextUploadQty;
rt300@14 164
rt300@8 165
rt300@22 166 ofxiPhoneDeviceType iOSdeviceType;
rt300@14 167
rt300@9 168 bool testConnection();
rt300@22 169 vector<int> questionnaireAnswers;
rt300@22 170 bool questionnaireCompleted;
rt300@22 171 bool questionnaireUploaded;
rt300@9 172
rt300@27 173
rt300@7 174 void checkLogFile();
rt300@27 175 bool uploadEventLog(bool async);
rt300@7 176 void firstEverAppOpen();
rt300@8 177 void readJsonToLog(const string &jsonFile);
rt300@27 178 void uploadQuestionnaire();
rt300@27 179 bool sendToServer(string functionName, Json::Value jsonData, bool async);
rt300@8 180 Json::Value logsToJson();
rt300@22 181 Json::Value questionnaireToJson();
rt300@5 182 void printAll(){
rt300@5 183 cout << "ALL LOGGED EVENTS!: \n";
rt300@5 184 vector<lEvent>::iterator evIter;
rt300@5 185 for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){
rt300@5 186 cout << *evIter;
rt300@5 187
rt300@5 188 }
rt300@5 189 };
rt300@0 190 };
rt300@0 191
rt300@0 192
rt300@8 193 //---------------------------------------------------------------------------
rt300@8 194
rt300@5 195
rt300@0 196 #endif /* defined(__oscSenderExample__eventLogger__) */