view eventLogger.h @ 24:a4908ad8c78e

Top and bottom toolbars. Intro page.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Fri, 01 Feb 2013 11:16:56 +0000
parents 8c0783739337
children f42a00e3f22d
line wrap: on
line source
//
//  eventLogger.h
//  oscSenderExample
//
//  Created by Robert Tubb on 05/11/2012.
//
//
// This class handle everything to do with loggin user actions,
// uploading logs to server, and storing locally if not uploaded

#ifndef __oscSenderExample__eventLogger__
#define __oscSenderExample__eventLogger__

#define EVENT_LOG_FILENAME "log.json"
#define SERVER_URL "http://127.0.0.1:8080/testservice/"

#include "ofMain.h"
#include "ofxiPhone.h"
#include "2dvector.h"
#include "ofxiPhoneExtras.h"
#include <sys/time.h>
#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include "2dvector.h"
#include "json.h"
#include "testApp.h"

#import "usernameAlertViewController.h"


// can add but don't change ordering - this will invalidate logs
#define PROGRAM_VERSION 1.0
enum leventType {SAVE_PRESET,
    SAVE_DESET,
    SCROLL,
    ZOOM,
    SCROLL_STOPPED,
    ZOOM_STOPPED,
    SNAPPED_TO_PRESET,
    CHANGE_SLIDER,
    SWAP_VIEW,
    SET_MIN_ZOOM,
    SET_MAX_ZOOM};

//---------------------------------------------------------------------------

class lEvent{
public:
    // try and make this as compact as possible.
    leventType eventType;
    double val1; // x coord, scale if zoom
    double val2; // y coord, 0 if zoom
    int sliderID;
    long long eventTime;
    lEvent(leventType eType, double v1 = 0.0, double v2 = 0.0,int sID = 0){
        eventType = eType;
        val1 = v1;
        val2 = v2;
        sliderID = sID;
        
        double timemsd = [NSDate timeIntervalSinceReferenceDate];
        eventTime = (unsigned long long)(timemsd*1000);
        
    }
    lEvent(const Json::Value &jevt){
    // constructor takes "jsonToEvent" readfile function role
        eventType = (leventType)jevt["eventType"].asInt();
        val1 = jevt["val1"].asFloat();
        val2 = jevt["val2"].asFloat();
        sliderID = jevt["sliderID"].asInt();
        eventTime = jevt["eventTime"].asLargestInt();
        
        // TODO what happens if we try to read one that isn't there?
        
    }
    Json::Value eventToJson(){
        Json::Value jevt;
        jevt["eventType"] = eventType;
        jevt["val1"] = val1;
        jevt["val2"] = val2;
        jevt["sliderID"] = sliderID;
        jevt["eventTime"] = eventTime;
        return jevt;
    }
};
//---------------------------------------------------------------------------
// streams no longer used
inline istream& operator>>(istream & is, lEvent& e){
    is.setf(ios_base::fixed,ios_base::floatfield);
    is.precision(1);
    
    char delim;
    int eType;

    is >> eType >> delim >> e.val1 >> delim >> e.val2 >> delim >> e.sliderID;
    
    e.eventType = (leventType)eType;
    
    return is;
}

//---------------------------------------------------------------------------
inline ostream& operator<<(ostream & os, const lEvent& e){
    os.setf(ios_base::fixed,ios_base::floatfield);
    os.precision(1);
    
    os << e.eventType << ',' << e.val1 << ',' << e.val2 << ',' << e.sliderID << '\n';
    
    return os;
}
 //---------------------------------------------------------------------------   

class EventLogger{
public:
    bool loggingEnabled;
    bool serverConnectionOK;
    unsigned int deviceID; // unique get something from hardware??
    unsigned int totalInteractionTime, sessionTime, sessionStartTime;
    string userName; // not unique
    
    EventLogger();
    void init();
    void exitAndSave();
    void setUsername(const char *u);
    void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0);
    void questionnaireAnswersObtained(vector<int> answers);
    
private:
    // what we need...
    /*
     time, type, value
     */

    
    vector<lEvent> theEvents;
    
    
    // values applicable to all events

    unsigned int nextUploadQty;

    
    ofxiPhoneDeviceType iOSdeviceType;
    
    bool testConnection();
    vector<int> questionnaireAnswers;
    bool questionnaireCompleted;
    bool questionnaireUploaded;

    void checkLogFile();
    bool uploadEventLog();
    void firstEverAppOpen();
    void readJsonToLog(const string &jsonFile);
    bool uploadQuestionnaire();
    bool sendToServer(string functionName, Json::Value jsonData);
    Json::Value logsToJson();
    Json::Value questionnaireToJson();
    void printAll(){
        cout << "ALL LOGGED EVENTS!: \n";
        vector<lEvent>::iterator evIter;
        for(evIter = theEvents.begin(); evIter < theEvents.end(); evIter++){
            cout << *evIter;
            
        }
    };
};


    //---------------------------------------------------------------------------
   

#endif /* defined(__oscSenderExample__eventLogger__) */