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@1
|
15
|
rt300@4
|
16 #include "ofMain.h"
|
rt300@4
|
17 #include "ofxiPhone.h"
|
rt300@4
|
18 #include "2dvector.h"
|
rt300@4
|
19 #include "ofxiPhoneExtras.h"
|
rt300@4
|
20 #include <sys/time.h>
|
rt300@4
|
21 #include <iostream>
|
rt300@4
|
22 #include <string>
|
rt300@4
|
23 #include <map>
|
rt300@4
|
24 #include "2dvector.h"
|
rt300@8
|
25 #include "json.h"
|
rt300@8
|
26
|
rt300@8
|
27 #import "iViewController.h"
|
rt300@8
|
28
|
rt300@8
|
29
|
rt300@9
|
30 // can add but don't change ordering - this will invalidate logs
|
rt300@9
|
31 enum leventType {SAVE_PRESET,
|
rt300@9
|
32 SAVE_DESET,
|
rt300@9
|
33 SCROLL,
|
rt300@9
|
34 SCROLL_STOPPED,
|
rt300@9
|
35 ZOOM,
|
rt300@9
|
36 CHANGE_SLIDER,
|
rt300@9
|
37 SWAP_VIEW,
|
rt300@9
|
38 SET_MIN_ZOOM,
|
rt300@9
|
39 SET_MAX_ZOOM};
|
rt300@1
|
40
|
rt300@8
|
41 //---------------------------------------------------------------------------
|
rt300@8
|
42
|
rt300@4
|
43 class lEvent{
|
rt300@5
|
44 public:
|
rt300@1
|
45 // try and make this as compact as possible.
|
rt300@4
|
46 leventType eventType;
|
rt300@1
|
47 double val1; // x coord, scale if zoom
|
rt300@1
|
48 double val2; // y coord, 0 if zoom
|
rt300@4
|
49 int sliderID;
|
rt300@9
|
50 long long eventTime;
|
rt300@8
|
51 lEvent(leventType eType, double v1 = 0.0, double v2 = 0.0,int sID = 0){
|
rt300@5
|
52 eventType = eType;
|
rt300@5
|
53 val1 = v1;
|
rt300@5
|
54 val2 = v2;
|
rt300@5
|
55 sliderID = sID;
|
rt300@9
|
56
|
rt300@9
|
57 double timemsd = [NSDate timeIntervalSinceReferenceDate];
|
rt300@9
|
58 eventTime = (unsigned long long)(timemsd*1000);
|
rt300@9
|
59
|
rt300@5
|
60 }
|
rt300@8
|
61 lEvent(const Json::Value &jevt){
|
rt300@9
|
62 // constructor takes "jsonToEvent" readfile function role
|
rt300@8
|
63 eventType = (leventType)jevt["eventType"].asInt();
|
rt300@8
|
64 val1 = jevt["val1"].asFloat();
|
rt300@8
|
65 val2 = jevt["val2"].asFloat();
|
rt300@8
|
66 sliderID = jevt["sliderID"].asInt();
|
rt300@9
|
67 eventTime = jevt["eventTime"].asLargestInt();
|
rt300@9
|
68
|
rt300@8
|
69 }
|
rt300@8
|
70 Json::Value eventToJson(){
|
rt300@8
|
71 Json::Value jevt;
|
rt300@8
|
72 jevt["eventType"] = eventType;
|
rt300@8
|
73 jevt["val1"] = val1;
|
rt300@8
|
74 jevt["val2"] = val2;
|
rt300@8
|
75 jevt["sliderID"] = sliderID;
|
rt300@9
|
76 jevt["eventTime"] = eventTime;
|
rt300@8
|
77 return jevt;
|
rt300@8
|
78 }
|
rt300@5
|
79 };
|
rt300@5
|
80 //---------------------------------------------------------------------------
|
rt300@8
|
81 // streams no longer used
|
rt300@5
|
82 inline istream& operator>>(istream & is, lEvent& e){
|
rt300@5
|
83 is.setf(ios_base::fixed,ios_base::floatfield);
|
rt300@5
|
84 is.precision(1);
|
rt300@4
|
85
|
rt300@5
|
86 char delim;
|
rt300@5
|
87 int eType;
|
rt300@0
|
88
|
rt300@5
|
89 is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID;
|
rt300@5
|
90
|
rt300@5
|
91 e.eventType = (leventType)eType;
|
rt300@5
|
92
|
rt300@5
|
93 return is;
|
rt300@5
|
94 }
|
rt300@4
|
95
|
rt300@5
|
96 //---------------------------------------------------------------------------
|
rt300@5
|
97 inline ostream& operator<<(ostream & os, const lEvent& e){
|
rt300@5
|
98 os.setf(ios_base::fixed,ios_base::floatfield);
|
rt300@5
|
99 os.precision(1);
|
rt300@5
|
100
|
rt300@5
|
101 os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n';
|
rt300@5
|
102
|
rt300@5
|
103 return os;
|
rt300@7
|
104 }
|
rt300@5
|
105 //---------------------------------------------------------------------------
|
rt300@4
|
106
|
rt300@0
|
107 class EventLogger{
|
rt300@0
|
108 public:
|
rt300@0
|
109 // what we need...
|
rt300@0
|
110 /*
|
rt300@0
|
111 time, type, value
|
rt300@0
|
112 */
|
rt300@5
|
113 bool loggingEnabled;
|
rt300@9
|
114 bool internetConnectionOK;
|
rt300@4
|
115 vector<lEvent> theEvents;
|
rt300@0
|
116
|
rt300@8
|
117
|
rt300@8
|
118 // values applicable to all events
|
rt300@8
|
119 unsigned int deviceID; // unique get something from hardware??
|
rt300@7
|
120 unsigned int totalInteractionTime, sessionTime, sessionStartTime;
|
rt300@8
|
121 string userName; // not unique
|
rt300@8
|
122 unsigned int nextUploadQty;
|
rt300@1
|
123 EventLogger();
|
rt300@7
|
124 void init();
|
rt300@9
|
125 bool testConnection();
|
rt300@8
|
126 void setUsername(const char *u);
|
rt300@5
|
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@9
|
128
|
rt300@1
|
129 void sendHttp();
|
rt300@7
|
130 void checkLogFile();
|
rt300@8
|
131 bool attemptUpload();
|
rt300@7
|
132 void firstEverAppOpen();
|
rt300@8
|
133 void readJsonToLog(const string &jsonFile);
|
rt300@7
|
134 void exitAndSave();
|
rt300@8
|
135 Json::Value logsToJson();
|
rt300@5
|
136 void printAll(){
|
rt300@5
|
137 cout << "ALL LOGGED EVENTS!: \n";
|
rt300@5
|
138 vector<lEvent>::iterator evIter;
|
rt300@5
|
139 for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){
|
rt300@5
|
140 cout << *evIter;
|
rt300@5
|
141
|
rt300@5
|
142 }
|
rt300@5
|
143 };
|
rt300@0
|
144 };
|
rt300@0
|
145
|
rt300@0
|
146
|
rt300@8
|
147 //---------------------------------------------------------------------------
|
rt300@8
|
148
|
rt300@5
|
149
|
rt300@0
|
150 #endif /* defined(__oscSenderExample__eventLogger__) */
|