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 //---------------------------------------------------------------------------
|