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