annotate eventLogger.h @ 15:e45c3e631d20

View fiddling
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Thu, 17 Jan 2013 13:01:19 +0000
parents 6a9191f5b269
children fb2ef16dd013
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@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@14 28 #import "QuestionnaireViewController.h"
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@15 69 // TODO what happens if we try to read one that isn't there?
rt300@15 70
rt300@8 71 }
rt300@8 72 Json::Value eventToJson(){
rt300@8 73 Json::Value jevt;
rt300@8 74 jevt["eventType"] = eventType;
rt300@8 75 jevt["val1"] = val1;
rt300@8 76 jevt["val2"] = val2;
rt300@8 77 jevt["sliderID"] = sliderID;
rt300@9 78 jevt["eventTime"] = eventTime;
rt300@8 79 return jevt;
rt300@8 80 }
rt300@5 81 };
rt300@5 82 //---------------------------------------------------------------------------
rt300@8 83 // streams no longer used
rt300@5 84 inline istream& operator>>(istream & is, lEvent& e){
rt300@5 85 is.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 86 is.precision(1);
rt300@4 87
rt300@5 88 char delim;
rt300@5 89 int eType;
rt300@0 90
rt300@5 91 is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID;
rt300@5 92
rt300@5 93 e.eventType = (leventType)eType;
rt300@5 94
rt300@5 95 return is;
rt300@5 96 }
rt300@4 97
rt300@5 98 //---------------------------------------------------------------------------
rt300@5 99 inline ostream& operator<<(ostream & os, const lEvent& e){
rt300@5 100 os.setf(ios_base::fixed,ios_base::floatfield);
rt300@5 101 os.precision(1);
rt300@5 102
rt300@5 103 os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n';
rt300@5 104
rt300@5 105 return os;
rt300@7 106 }
rt300@5 107 //---------------------------------------------------------------------------
rt300@4 108
rt300@0 109 class EventLogger{
rt300@0 110 public:
rt300@14 111 bool loggingEnabled;
rt300@14 112 bool internetConnectionOK;
rt300@14 113 unsigned int deviceID; // unique get something from hardware??
rt300@14 114 unsigned int totalInteractionTime, sessionTime, sessionStartTime;
rt300@14 115 string userName; // not unique
rt300@14 116
rt300@14 117 EventLogger();
rt300@14 118 void init();
rt300@14 119 void exitAndSave();
rt300@14 120 void setUsername(const char *u);
rt300@14 121 void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0);
rt300@14 122
rt300@14 123
rt300@14 124 private:
rt300@0 125 // what we need...
rt300@0 126 /*
rt300@0 127 time, type, value
rt300@0 128 */
rt300@14 129
rt300@14 130
rt300@4 131 vector<lEvent> theEvents;
rt300@0 132
rt300@14 133 QuestionnaireViewController * questionnaireViewController;
rt300@14 134 // values applicable to all events
rt300@14 135
rt300@14 136 unsigned int nextUploadQty;
rt300@14 137
rt300@8 138
rt300@14 139
rt300@9 140 bool testConnection();
rt300@14 141
rt300@9 142
rt300@1 143 void sendHttp();
rt300@7 144 void checkLogFile();
rt300@8 145 bool attemptUpload();
rt300@7 146 void firstEverAppOpen();
rt300@8 147 void readJsonToLog(const string &jsonFile);
rt300@14 148
rt300@8 149 Json::Value logsToJson();
rt300@5 150 void printAll(){
rt300@5 151 cout << "ALL LOGGED EVENTS!: \n";
rt300@5 152 vector<lEvent>::iterator evIter;
rt300@5 153 for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){
rt300@5 154 cout << *evIter;
rt300@5 155
rt300@5 156 }
rt300@5 157 };
rt300@0 158 };
rt300@0 159
rt300@0 160
rt300@8 161 //---------------------------------------------------------------------------
rt300@8 162
rt300@5 163
rt300@0 164 #endif /* defined(__oscSenderExample__eventLogger__) */