annotate eventLogger.h @ 24:a4908ad8c78e

Top and bottom toolbars. Intro page.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Fri, 01 Feb 2013 11:16:56 +0000
parents 8c0783739337
children f42a00e3f22d
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@8 14 #define EVENT_LOG_FILENAME "log.json"
rt300@22 15 #define SERVER_URL "http://127.0.0.1:8080/testservice/"
rt300@1 16
rt300@4 17 #include "ofMain.h"
rt300@4 18 #include "ofxiPhone.h"
rt300@4 19 #include "2dvector.h"
rt300@4 20 #include "ofxiPhoneExtras.h"
rt300@4 21 #include <sys/time.h>
rt300@4 22 #include <iostream>
rt300@4 23 #include <string>
rt300@22 24 #include <cstring>
rt300@4 25 #include <map>
rt300@4 26 #include "2dvector.h"
rt300@8 27 #include "json.h"
rt300@24 28 #include "testApp.h"
rt300@8 29
rt300@16 30 #import "usernameAlertViewController.h"
rt300@16 31
rt300@8 32
rt300@9 33 // can add but don't change ordering - this will invalidate logs
rt300@22 34 #define PROGRAM_VERSION 1.0
rt300@9 35 enum leventType {SAVE_PRESET,
rt300@9 36 SAVE_DESET,
rt300@9 37 SCROLL,
rt300@22 38 ZOOM,
rt300@9 39 SCROLL_STOPPED,
rt300@22 40 ZOOM_STOPPED,
rt300@22 41 SNAPPED_TO_PRESET,
rt300@9 42 CHANGE_SLIDER,
rt300@9 43 SWAP_VIEW,
rt300@9 44 SET_MIN_ZOOM,
rt300@9 45 SET_MAX_ZOOM};
rt300@1 46
rt300@8 47 //---------------------------------------------------------------------------
rt300@8 48
rt300@4 49 class lEvent{
rt300@5 50 public:
rt300@1 51 // try and make this as compact as possible.
rt300@4 52 leventType eventType;
rt300@1 53 double val1; // x coord, scale if zoom
rt300@1 54 double val2; // y coord, 0 if zoom
rt300@4 55 int sliderID;
rt300@9 56 long long eventTime;
rt300@8 57 lEvent(leventType eType, double v1 = 0.0, double v2 = 0.0,int sID = 0){
rt300@5 58 eventType = eType;
rt300@5 59 val1 = v1;
rt300@5 60 val2 = v2;
rt300@5 61 sliderID = sID;
rt300@9 62
rt300@9 63 double timemsd = [NSDate timeIntervalSinceReferenceDate];
rt300@9 64 eventTime = (unsigned long long)(timemsd*1000);
rt300@9 65
rt300@5 66 }
rt300@8 67 lEvent(const Json::Value &jevt){
rt300@9 68 // constructor takes "jsonToEvent" readfile function role
rt300@8 69 eventType = (leventType)jevt["eventType"].asInt();
rt300@8 70 val1 = jevt["val1"].asFloat();
rt300@8 71 val2 = jevt["val2"].asFloat();
rt300@8 72 sliderID = jevt["sliderID"].asInt();
rt300@9 73 eventTime = jevt["eventTime"].asLargestInt();
rt300@9 74
rt300@15 75 // TODO what happens if we try to read one that isn't there?
rt300@15 76
rt300@8 77 }
rt300@8 78 Json::Value eventToJson(){
rt300@8 79 Json::Value jevt;
rt300@8 80 jevt["eventType"] = eventType;
rt300@8 81 jevt["val1"] = val1;
rt300@8 82 jevt["val2"] = val2;
rt300@8 83 jevt["sliderID"] = sliderID;
rt300@9 84 jevt["eventTime"] = eventTime;
rt300@8 85 return jevt;
rt300@8 86 }
rt300@5 87 };
rt300@5 88 //---------------------------------------------------------------------------
rt300@8 89 // streams no longer used
rt300@5 90 inline istream& operator>>(istream & is, lEvent& e){
rt300@5 91 is.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 92 is.precision(1);
rt300@4 93
rt300@5 94 char delim;
rt300@5 95 int eType;
rt300@0 96
rt300@5 97 is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID;
rt300@5 98
rt300@5 99 e.eventType = (leventType)eType;
rt300@5 100
rt300@5 101 return is;
rt300@5 102 }
rt300@4 103
rt300@5 104 //---------------------------------------------------------------------------
rt300@5 105 inline ostream& operator<<(ostream & os, const lEvent& e){
rt300@5 106 os.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 107 os.precision(1);
rt300@5 108
rt300@5 109 os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n';
rt300@5 110
rt300@5 111 return os;
rt300@7 112 }
rt300@5 113 //---------------------------------------------------------------------------
rt300@4 114
rt300@0 115 class EventLogger{
rt300@0 116 public:
rt300@14 117 bool loggingEnabled;
rt300@22 118 bool serverConnectionOK;
rt300@14 119 unsigned int deviceID; // unique get something from hardware??
rt300@14 120 unsigned int totalInteractionTime, sessionTime, sessionStartTime;
rt300@14 121 string userName; // not unique
rt300@14 122
rt300@14 123 EventLogger();
rt300@14 124 void init();
rt300@14 125 void exitAndSave();
rt300@14 126 void setUsername(const char *u);
rt300@14 127 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 128 void questionnaireAnswersObtained(vector<int> answers);
rt300@14 129
rt300@14 130 private:
rt300@0 131 // what we need...
rt300@0 132 /*
rt300@0 133 time, type, value
rt300@0 134 */
rt300@14 135
rt300@14 136
rt300@4 137 vector<lEvent> theEvents;
rt300@0 138
rt300@16 139
rt300@14 140 // values applicable to all events
rt300@14 141
rt300@14 142 unsigned int nextUploadQty;
rt300@14 143
rt300@8 144
rt300@22 145 ofxiPhoneDeviceType iOSdeviceType;
rt300@14 146
rt300@9 147 bool testConnection();
rt300@22 148 vector<int> questionnaireAnswers;
rt300@22 149 bool questionnaireCompleted;
rt300@22 150 bool questionnaireUploaded;
rt300@9 151
rt300@7 152 void checkLogFile();
rt300@22 153 bool uploadEventLog();
rt300@7 154 void firstEverAppOpen();
rt300@8 155 void readJsonToLog(const string &jsonFile);
rt300@22 156 bool uploadQuestionnaire();
rt300@22 157 bool sendToServer(string functionName, Json::Value jsonData);
rt300@8 158 Json::Value logsToJson();
rt300@22 159 Json::Value questionnaireToJson();
rt300@5 160 void printAll(){
rt300@5 161 cout << "ALL LOGGED EVENTS!: \n";
rt300@5 162 vector<lEvent>::iterator evIter;
rt300@5 163 for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){
rt300@5 164 cout << *evIter;
rt300@5 165
rt300@5 166 }
rt300@5 167 };
rt300@0 168 };
rt300@0 169
rt300@0 170
rt300@8 171 //---------------------------------------------------------------------------
rt300@8 172
rt300@5 173
rt300@0 174 #endif /* defined(__oscSenderExample__eventLogger__) */