changeset 34:3af380769779

small fixes, logging now sensible.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 26 Nov 2014 14:04:05 +0000
parents 93317878abef
children 3b10a26da293
files ExpMessageOrganiser.mm MessageOrganiser.mm SequenceController.h SequenceController.mm TestController.h TrainingMessageOrganiser.mm TrainingScoreManager.h UI code/3DboxGL.h algorithms.h algorithms.mm eventLogger.h eventLogger.mm globalVariables.h testApp.mm
diffstat 14 files changed, 247 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/ExpMessageOrganiser.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/ExpMessageOrganiser.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -27,6 +27,7 @@
     controlPanel->showValueIndicators(true);
     
     okToGetMidi = true;
+    controlPanel->setActive(true); 
 }
 
 
--- a/MessageOrganiser.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/MessageOrganiser.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -39,6 +39,7 @@
     
     return mids;
 }
+//----------------------------------------------------------------------------------
 // could template for ui element type??
 void MessageOrganiser::mapButtonToAction(UIElement* control, int mappingID){
     UICallbackFunction callbackF;
@@ -47,25 +48,26 @@
     currentMapping.insert(std::pair<int,UIElement*>(mappingID,control));
 }
 
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setControlPanel(SliderPanel* p){ // a bit specific??
     controlPanel = p;
     
 };
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setBottomPanel(ButtonPanel * ntb){
     bottomPanel = ntb;
 };
-
+//----------------------------------------------------------------------------------
 
 void MessageOrganiser::setIconPanel(IconPanel * ip){
     presetIconPanel = ip;
 }
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setInstructionPanel(TextPanel * ip){
     instructionPanel = ip;
     instructionPanel->show();
 }
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setSeqNumPanel(TextPanel * snp){
     seqNumPanel = snp;
 }
@@ -91,13 +93,14 @@
     bottomPanel->hide();
     controlPanel->hide();
 }
+//----------------------------------------------------------------------------------
 void MessageOrganiser::showMyPanels(){
     presetIconPanel->show();
     instructionPanel->show();
     bottomPanel->show();
     controlPanel->show();
 }
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::triggerCandidateSound(){
     // log event
     sendSynthValuesAgain(); // TODO AAAARG too slow???
@@ -105,7 +108,7 @@
     eventLogger.logEvent(CANDIDATE_PLAYED);
 
 }
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::paramChangeCallback(int mappingID, int value){
     
     if(onlyChangeCandidateOnTrigger){
@@ -120,16 +123,18 @@
     
     eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
 };
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::sendSynthValuesAgain(){
     candidateSynth.sendAllParams();
     targetSynth.sendAllParams();
 };
-
+//----------------------------------------------------------------------------------
 
 void MessageOrganiser::setAllSlidersToValues(vector<int> values){
     controlPanel->setValues(values);
 }
+
+//----------------------------------------------------------------------------------
 // we want to set UI object
 void MessageOrganiser::setUIToParam(int index, int value){
     
@@ -154,7 +159,7 @@
     }
     
 };
-
+//----------------------------------------------------------------------------------
 
 void MessageOrganiser::mapControlToParam(UIElement* control, int mappingID){
     
@@ -198,7 +203,7 @@
     
     eventLogger.logEvent(CONTROL_LIST,typeListLog);
 };
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::mapXYToParams(ButtronXY* control, int mappingIDX, int mappingIDY){
     UICallbackFunction callback;
     
@@ -215,7 +220,7 @@
     control->setLabel(candidateSynth.getNameForMappingID(mappingIDX), candidateSynth.getNameForMappingID(mappingIDY));
     
 };
-
+//----------------------------------------------------------------------------------
 
 void MessageOrganiser::mapControlToParam(UIElement* control, string paramName){
     // get mapping ID from synth
@@ -223,12 +228,12 @@
     mapControlToParam(control, mappingID);
     control->setLabel(paramName);
 };
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::buttonPressCallback(int mappingID, int value){
     
 };
 
-
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setSlidersToTarget(){
     // this will actually show sliders with target vals - for "memorisation" purposes mwa heh heh
     // get target values
@@ -254,6 +259,7 @@
         
     }
 }
+//----------------------------------------------------------------------------------
 void MessageOrganiser::setCandidateAndSlidersToRandom(){
     vector<int> rands;
     for(int i = 0; i < candidateSynth.getNumParams(); i++){
@@ -265,10 +271,14 @@
     candidateSynth.setAllParams(rands);
     
 }
+//----------------------------------------------------------------------------------
 
 
 void MessageOrganiser::midiFromLeap(int ctl_num, int ctl_val){
-    
+    static long int howManyLogged;
+    static vector<int> lastLoggedVals = zeros<int>(6);
+    static vector<int> newVals = zeros<int>(6);
+    static long long lastLogTime;
     
     if (!okToGetMidi){
         return;
@@ -286,10 +296,24 @@
 
     setUIToParam(ctl_num, ctl_val);
     
-    vector<int> evtData;
-    evtData.push_back(mids[ctl_num]); // or just index?
-    evtData.push_back(ctl_val);
+    // wait for a certain distance travelled AND time then record?
+    newVals[ctl_num] = ctl_val;
+    long long newLogTime = ofGetSystemTime();
     
-    eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED, evtData);
+    if (euclideanDistance(newVals, lastLoggedVals) > MIN_LOG_DIST && newLogTime - lastLogTime > 20){
+        eventLogger.logEvent(CANDIDATE_PARAM_ADJUSTED_ALL, newVals);
+        
+        lastLoggedVals = newVals;
+        howManyLogged++;
+    }else{
+        cout << "skipped! so far logged " << howManyLogged << endl;
+    }
+
     
-}
\ No newline at end of file
+}
+
+
+//----------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------
+//----------------------------------------------------------------------------------
\ No newline at end of file
--- a/SequenceController.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/SequenceController.h	Wed Nov 26 14:04:05 2014 +0000
@@ -14,7 +14,7 @@
 #include "presetManager.h"
 #include "TrainingScoreManager.h"
 #define MIN_TARGETS_IN_SEQUENCE 1
-#define MAX_TARGETS_IN_SEQUENCE 2
+#define MAX_TARGETS_IN_SEQUENCE 7
 #define MIN_TEMPO   80
 #define MAX_TEMPO   400
 #define NUM_TEMPO_STEPS 12
@@ -128,6 +128,7 @@
     void generateSteps();
     void generateCountIn(int countInLength);
     void generateARun(int run, int numInSequence);
+    void generateAnEasyRun(int run, int numInSequence = 1);
     void generateASoundOnlyRun(int run, int numInSequence);
     vector<int> randomSequence(int numInSequence);
     vector<int> nonRandomSequence(int numInSequence);
--- a/SequenceController.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/SequenceController.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -202,6 +202,8 @@
         
         if (soundOnlyMode){
             generateASoundOnlyRun(run, numInSequence);
+        }else if(numInSequence == 1){
+            generateAnEasyRun(run);
         }else{
             generateARun(run, numInSequence);
         }
@@ -252,7 +254,154 @@
     
     return stepPresetIndices;
 }
+//-------------------------------------------------------------------
 
+void SequenceController::generateAnEasyRun(int run, int numInSequence){
+    float curTempo = MIN_TEMPO;
+    int seqNo = 0;
+    AnimStep nextStep;
+    for(int tempoLevel = 0; tempoLevel < NUM_TEMPO_STEPS; tempoLevel++){
+        
+        
+        
+        // first we have a preparation count in
+        nextStep.presetIndex = -1; // minus one means "blank"
+        nextStep.runNumber = run;
+        nextStep.seqNumber = seqNo;
+        nextStep.whichInSequence = 0;
+        nextStep.tempo = curTempo;
+        nextStep.showsGuides = true;
+        nextStep.type = AnimStep::PREVIEW_NEUTRAL_COUNT;
+        nextStep.showsResultsAtEnd = false;
+        steps.push_back(nextStep);
+        
+        // generate a sequence of random preset indices
+        vector<int> stepPresetIndices = randomSequence(numInSequence);
+        nextStep.thisSequence = stepPresetIndices;
+        
+        // MAKE PREVIEW
+        int n = 0;
+        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+            // put loader
+            
+            nextStep.presetIndex = *si;
+            nextStep.runNumber = run;
+            nextStep.seqNumber = seqNo;
+            nextStep.whichInSequence = n;
+            nextStep.tempo = curTempo;
+            nextStep.showsGuides = true;
+            nextStep.showsIcons = true;
+            nextStep.showsResultsAtEnd = false;
+            nextStep.type = AnimStep::PREVIEW_MOVE;
+            steps.push_back(nextStep);
+            
+            if (SPACER_BARS){
+                nextStep.type = AnimStep::PREVIEW_HIT;
+                steps.push_back(nextStep);
+            }
+            n++;
+        }
+        
+        // move back to neutral
+        nextStep.presetIndex = -1;
+        nextStep.type = AnimStep::PREVIEW_MOVE;
+        nextStep.showsResultsAtEnd = false;
+        steps.push_back(nextStep);
+        
+        // make GUIDED sequence (1)
+        n = 0;
+        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+            // put loader
+            
+            nextStep.presetIndex = *si;
+            nextStep.runNumber = run;
+            nextStep.seqNumber = seqNo;
+            nextStep.whichInSequence = n;
+            nextStep.tempo = curTempo;
+            nextStep.showsGuides = true;
+            nextStep.showsIcons = true;
+            nextStep.showsResultsAtEnd = true;
+            nextStep.type = AnimStep::GUIDED_MOVE;
+            steps.push_back(nextStep);
+            
+            if (SPACER_BARS){
+                nextStep.type = AnimStep::GUIDED_HIT;
+                steps.push_back(nextStep);
+            }
+            n++;
+        }
+        // move back to neutral
+        nextStep.presetIndex = -1;
+        nextStep.type = AnimStep::GUIDED_MOVE;
+        nextStep.showsResultsAtEnd = false;
+        steps.push_back(nextStep);
+        
+        // make GUIDED sequence (2)
+        n = 0;
+        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+            // put loader
+            
+            nextStep.presetIndex = *si;
+            nextStep.runNumber = run;
+            nextStep.seqNumber = seqNo;
+            nextStep.whichInSequence = n;
+            nextStep.tempo = curTempo;
+            nextStep.showsGuides = true;
+            nextStep.showsIcons = true;
+            nextStep.showsResultsAtEnd = true;
+            nextStep.type = AnimStep::GUIDED_MOVE;
+            steps.push_back(nextStep);
+            
+            if (SPACER_BARS){
+                nextStep.type = AnimStep::GUIDED_HIT;
+                steps.push_back(nextStep);
+            }
+            n++;
+        }
+        // move back to neutral
+        nextStep.presetIndex = -1;
+        nextStep.type = AnimStep::GUIDED_MOVE;
+        nextStep.showsResultsAtEnd = false;
+        steps.push_back(nextStep);
+        
+        // make matching sequence with icon seq help
+        n = 0;
+        for(auto si = stepPresetIndices.begin(); si < stepPresetIndices.end(); si++){
+            // put loader
+            
+            nextStep.presetIndex = *si;
+            nextStep.whichInSequence = n;
+            
+            nextStep.showsGuides = false;
+            nextStep.showsIcons = true;
+            nextStep.type = AnimStep::MATCHING_MOVE;
+            nextStep.showsResultsAtEnd = true;
+            steps.push_back(nextStep);
+            
+            if (SPACER_BARS){
+                nextStep.type = AnimStep::MATCHING_HIT;
+                steps.push_back(nextStep);
+                
+            }
+            n++;
+            
+        }
+        
+        nextStep.type = AnimStep::MATCHING_HIT;
+        nextStep.showsResultsAtEnd = false;
+        steps.push_back(nextStep);
+        
+        steps.back().isLastOfSeq = true;
+        curTempo += tempoInc;
+        seqNo++;
+        cout << endl;
+        
+    }
+    // ANIM nextStep.setAsBlankCounter();
+    nextStep.type = AnimStep::MATCHING_NEUTRAL_COUNT;
+    steps.push_back(nextStep);
+    
+}
 //-------------------------------------------------------------------
 void SequenceController::generateASoundOnlyRun(int run, int numInSequence){
     
--- a/TestController.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/TestController.h	Wed Nov 26 14:04:05 2014 +0000
@@ -150,22 +150,7 @@
     bool isPractice(){
         return !scored;
     };
-    float euclideanDistance(vector<int> v1, vector<int> v2) const{
-        if (v1.size() != v2.size()){
-            cout << "ERROR ERROR: vectors must be same length for Mr Euclid";
-            return 0.;
-        }
-        vector<float> diff;
-        
-        std::transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), difference<float>());
-        // sqr diff
-        
-        std::transform(v1.begin(), v1.end(), v1.begin(),squared<float>());
-        float ans = std::accumulate(v1.begin(),v1.end(),0.0);
-        
-        return sqrt(ans);
-        
-    };
+
     
     TestResult getScoreForAnswer(vector<int> answer, TimerMillisec timeTaken) const {
         TestResult result;
--- a/TrainingMessageOrganiser.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/TrainingMessageOrganiser.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -117,6 +117,7 @@
     bottomPanel->show();
     seqNumPanel->hide();
     eventLogger.logEvent(FINISHED_RUN);
+    eventLogger.saveSessionToFile();
 }
 void TrainingMessageOrganiser::lastOfAll(){
     candidateSynth.stopMetronome();
@@ -126,6 +127,7 @@
     middlePanel->setText("FINISHED BLOCK!");
     middlePanel->show();
     bottomPanel->show();
+    eventLogger.saveSessionToFile();
 }
 
 void TrainingMessageOrganiser::logNewStep(AnimStep newStep){
@@ -373,8 +375,7 @@
     }
 
     vector<int> newTargetValues = currentTargetPreset->getValues();
-    eventLogger.logEvent(NEW_TARGET, newTargetValues); // massively redundant info assuming we have saved presets...
-    
+  
     targetSynth.setAllParamsWithoutSend(newTargetValues);
     
     
@@ -519,10 +520,12 @@
                                                        Preset * targetPreset,
                                                        vector<int> startingPosition,
                                                        vector<int> currentPosition){
+    // targetParams, startPosition, answer, timeAllowed
     TrainingTestResult result =
-    trainingScoreManager.getScoreForAnswer(currentPosition,
+    
+    trainingScoreManager.getScoreForAnswer(targetPreset->getValues(),
                                            startingPosition,
-                                           targetPreset->getValues(),
+                                           currentPosition,
                                            newStep.getTimeBetweenTicks());
     
     sequenceController.saveResultForCurrentStep(result);
--- a/TrainingScoreManager.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/TrainingScoreManager.h	Wed Nov 26 14:04:05 2014 +0000
@@ -128,7 +128,10 @@
         details.push_back(result.score); // 10 x throughput
         
         eventLogger.logEvent(TRAINING_RESULT, details);
-        
+        details.clear();
+        details.insert(details.begin(), targetParams.begin(), targetParams.end());
+        details.insert(details.end(), answer.begin(), answer.end());
+        eventLogger.logEvent(TARGET_AND_MATCH, details);
         
         return result;
     }
@@ -150,22 +153,7 @@
         cout << "TP:  " << TP << endl;
         return TP;
     }
-    float euclideanDistance(vector<int> v1, vector<int> v2) const{
-        if (v1.size() != v2.size()){
-            cout << "ERROR ERROR: vectors must be same length for Mr Euclid";
-            return 0.;
-        }
-        vector<float> diff;
-        
-        std::transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), difference<float>());
-        // sqr diff
-        
-        std::transform(v1.begin(), v1.end(), v1.begin(),squared<float>());
-        float ans = std::accumulate(v1.begin(),v1.end(),0.0);
-        
-        return sqrt(ans);
-        
-    };
+
     int totalScored;
     
 };
--- a/UI code/3DboxGL.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/UI code/3DboxGL.h	Wed Nov 26 14:04:05 2014 +0000
@@ -12,12 +12,12 @@
 #include <iostream>
 #include "3Dbox.h"
 #include "UIElement.h"
-
+#include "algorithms.h"
 
 //Universal function which sets normals for the triangle meshvoid
 void setNormals( ofMesh &mesh );
 
-float euclideanDistance(vector<float> v1, vector<float> v2);
+//float euclideanDistance(vector<float> v1, vector<float> v2);
 
 class Leap3DBoxGL : public Leap3DBox {
 public:
--- a/algorithms.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/algorithms.h	Wed Nov 26 14:04:05 2014 +0000
@@ -64,3 +64,5 @@
         return a*a;
     };
 };
+
+float euclideanDistance(vector<int> v1, vector<int> v2);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/algorithms.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -0,0 +1,26 @@
+//
+//  algorithms.mm
+//  riftathon
+//
+//  Created by Robert Tubb on 26/11/2014.
+//
+//
+
+#include <stdio.h>
+#include "algorithms.h"
+float euclideanDistance(vector<int> v1, vector<int> v2) {
+    if (v1.size() != v2.size()){
+        cout << "ERROR ERROR: vectors must be same length for Mr Euclid";
+        return 0.;
+    }
+    vector<float> diff;
+    
+    std::transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), difference<float>());
+    // sqr diff
+    
+    std::transform(v1.begin(), v1.end(), v1.begin(),squared<float>());
+    float ans = std::accumulate(v1.begin(),v1.end(),0.0);
+    
+    return sqrt(ans);
+    
+};
\ No newline at end of file
--- a/eventLogger.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/eventLogger.h	Wed Nov 26 14:04:05 2014 +0000
@@ -31,7 +31,7 @@
 #define EVENT_THIN_FACTOR 30
 #define EVENT_LOG_FILENAME "log.json"
 #define UPLOAD_CHUNK_SIZE 1000
-#define SAVE_CHUNK_SIZE 10000
+#define SAVE_CHUNK_SIZE 30000 // this is "too big" and must be saved, usually run end will save
 #define APP_CREATION_TIME 0   // ignore this, pointless
 #define PROGRAM_NAME "RIFTATHON"
 #define PROGRAM_VERSION 0.1
@@ -80,6 +80,8 @@
                 NEW_START_POS,
                 FINISH_POS,
                 FINISHED_RUN,
+                CANDIDATE_PARAM_ADJUSTED_ALL,
+                TARGET_AND_MATCH,
     
     
 };
@@ -169,8 +171,8 @@
     bool questionnaireCompleted;
     bool questionnaireUploaded;
     
-    unsigned int deviceID;
-    unsigned int totalInteractionTime, savedInteractionTime, sessionTime, sessionStartTime;
+    unsigned long long deviceID;
+    unsigned long long totalInteractionTime, savedInteractionTime, sessionTime, sessionStartTime;
     string userName; // not unique
     string questionnaireComments;
 // constr
--- a/eventLogger.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/eventLogger.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -391,7 +391,7 @@
         //uploadEventLog(true);
     }
     
-    // new riftathon save as we go
+    // new riftathon save as we go NEVER REACHES HERE?
     if (theEvents.size() > SAVE_CHUNK_SIZE){
         saveSessionToFile();
     }
@@ -555,6 +555,7 @@
     logFile << jlogs;
     logFile.close();
     nextLogFileIndex++;
+    theEvents.clear();
 }
 
 string EventLogger::nextLogFileIndexString(){
--- a/globalVariables.h	Tue Nov 25 18:37:54 2014 +0000
+++ b/globalVariables.h	Wed Nov 26 14:04:05 2014 +0000
@@ -32,6 +32,7 @@
 
 #define TOTAL_NUM_PARAMS 6
 #define TARGET_SCORE_CC_BAND 7 // number of cc vals per target band in dartboard
+#define MIN_LOG_DIST 4  // how far we go before control adjustment is logged
 typedef enum {TOUCH_DOWN, TOUCH_MOVED, TOUCH_UP} touchType;
 typedef enum {INTRO,QUESTIONNAIRE, HELP, TEST_IN_PROGRESS, SCORE_AND_HINT, COUNT_DOWN, READY_FOR_NEXT} interfaceType;
 
--- a/testApp.mm	Tue Nov 25 18:37:54 2014 +0000
+++ b/testApp.mm	Wed Nov 26 14:04:05 2014 +0000
@@ -84,7 +84,7 @@
     
 	// open an outgoing connection to HOST:PORT for OSC
 	// sender.setup( OSC_HOST, OSC_PORT );
-    ofSetFrameRate(60);
+    ofSetFrameRate(40);
     props = new UIProps();
 
 }