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__) */
|