changeset 28:e2c62db1e265

Started timer stuff
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Mon, 18 Feb 2013 11:45:05 +0000
parents ae4d2c3ce5e0
children fabb3a5cdfc9
files HelpViewController.mm QuestionnaireViewController.h QuestionnaireViewController.mm QuestionnaireViewController.xib eventLogger.h eventLogger.mm testApp.h testApp.mm
diffstat 8 files changed, 230 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HelpViewController.mm	Mon Feb 18 11:45:05 2013 +0000
@@ -0,0 +1,53 @@
+//
+//  HelpViewController.m
+//  sonicZoom
+//
+//  Created by Robert Tubb on 01/02/2013.
+//
+//
+
+#import "HelpViewController.h"
+#import "testApp.h"
+@interface HelpViewController ()
+
+@end
+
+@implementation HelpViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
+    }
+    return self;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    // Do any additional setup after loading the view from its nib.
+}
+
+- (void)didReceiveMemoryWarning
+{
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+- (void)setAppRef:(id)theOFApp{
+    self.theOFAppRef = theOFApp;
+    
+}
+-(IBAction)show:(id)sender{
+    self.view.hidden = NO;
+}
+
+- (IBAction)hide:(id)sender
+{
+    self.view.hidden = YES;
+    ((testApp *)self.theOFAppRef)->helpHidden();
+
+   
+}
+@end
--- a/QuestionnaireViewController.h	Wed Feb 13 17:03:56 2013 +0000
+++ b/QuestionnaireViewController.h	Mon Feb 18 11:45:05 2013 +0000
@@ -11,7 +11,7 @@
 #import "Question.h"
 
 @interface QuestionnaireViewController : UIViewController
-<UIPickerViewDelegate, UIPickerViewDataSource>
+<UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate>
 {
 
     UIPickerView       *picker;
@@ -26,6 +26,7 @@
 
 @property (strong, nonatomic) IBOutlet UIPickerView *picker;
 
+@property (retain, nonatomic) IBOutlet UITextView *commentText;
 
 //----------------------------------------------------------------
 -(IBAction)hide:(id)sender;
--- a/QuestionnaireViewController.mm	Wed Feb 13 17:03:56 2013 +0000
+++ b/QuestionnaireViewController.mm	Mon Feb 18 11:45:05 2013 +0000
@@ -60,7 +60,8 @@
     [self loadQuestion:self.currentQuestionIndex];
     
     self.previousButton.hidden = YES; // dont bother
-    
+    self.commentText.hidden = YES;
+    self.finishButton.hidden = YES;
 }
 //----------------------------------------------------------------
 - (void)didReceiveMemoryWarning
@@ -76,6 +77,7 @@
     [_finishButton release];
     [_nextButton release];
     [_previousButton release];
+    [_commentText release];
     [super dealloc];
 }
 //----------------------------------------------------------------
@@ -85,6 +87,7 @@
     [self setFinishButton:nil];
     [self setNextButton:nil];
     [self setPreviousButton:nil];
+    [self setCommentText:nil];
     [super viewDidUnload];
 }
 //----------------------------------------------------------------
@@ -101,10 +104,14 @@
         answersArray.push_back(q.answer);
         
     }
+    const char *userComments = [self.commentText.text cStringUsingEncoding: NSUTF8StringEncoding];
     
-    ((testApp *)self.theOFAppRef)->questionnaireHidden(answersArray);
+    ((testApp *)self.theOFAppRef)->questionnaireHidden(answersArray, userComments);
+    [self.commentText resignFirstResponder];
+    
 	self.view.hidden = YES;
 }
+
 //----------------------------------------------------------------
 -(IBAction)show:(id)sender{
 	self.view.hidden = NO;
@@ -143,10 +150,13 @@
     // hide selector
     self.picker.hidden = YES;
     self.previousButton.hidden = YES;
+    self.finishButton.hidden = NO;
     
     self.titleText.text = @"Thank you!";
     
-    self.questionText.text = @"Thanks for helping science help you. Visit the study website to keep abreast of exciting events.";
+    self.commentText.hidden = NO;
+    
+    self.questionText.text = @"Thanks for helping science help you. Feel free to add further comments in the text box below, and then press 'finish' to go back to the app.";
 }
 
 //----------------------------------------------------------------
@@ -238,7 +248,21 @@
     NSLog(@"Answer: %d",curQ.answer);
 
 }
-
+//----------------------------------------------------------------
+#pragma mark UITextViewDelegate functions
+/*
+ This answer was useful to me, but I was also looking for the callback function from the "Go" button, which I found is:
+ - (BOOL) textFieldShouldReturn:(UITextField *)textField { // Customer code return YES; }
+ 
+ You will need to send the UITextField delegate to your view controller for that to work.
+ 
+ */
+ - (BOOL) textFieldShouldReturn:(UITextField *)textField {
+     // Customer code
+     NSLog(@"RETURN DELEGATE");
+     [self hide:self ];
+     return NO;
+ }
 @end // end implementation
 //----------------------------------------------------------------
 //----------------------------------------------------------------
--- a/QuestionnaireViewController.xib	Wed Feb 13 17:03:56 2013 +0000
+++ b/QuestionnaireViewController.xib	Mon Feb 18 11:45:05 2013 +0000
@@ -15,6 +15,7 @@
 			<string>IBUIButton</string>
 			<string>IBUILabel</string>
 			<string>IBUIPickerView</string>
+			<string>IBUITextView</string>
 			<string>IBUIView</string>
 		</array>
 		<array key="IBDocument.PluginDependencies">
@@ -40,7 +41,7 @@
 					<object class="IBUIButton" id="871929113">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{627, 933}, {121, 44}}</string>
+						<string key="NSFrame">{{324, 706}, {121, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
@@ -141,7 +142,7 @@
 					<object class="IBUIButton" id="960474577">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{436, 706}, {121, 44}}</string>
+						<string key="NSFrame">{{425, 706}, {121, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="871929113"/>
@@ -164,7 +165,7 @@
 					<object class="IBUIButton" id="356964106">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{218, 706}, {157, 44}}</string>
+						<string key="NSFrame">{{212, 706}, {157, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="960474577"/>
@@ -191,11 +192,42 @@
 						<string key="NSFrame">{{212, 409}, {334, 216}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="356964106"/>
+						<reference key="NSNextKeyView" ref="960632081"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 						<bool key="IBUIShowsSelectionIndicator">YES</bool>
 					</object>
+					<object class="IBUITextView" id="960632081">
+						<reference key="NSNextResponder" ref="766721923"/>
+						<int key="NSvFlags">292</int>
+						<string key="NSFrame">{{212, 409}, {334, 230}}</string>
+						<reference key="NSSuperview" ref="766721923"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="356964106"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<object class="NSColor" key="IBUIBackgroundColor">
+							<int key="NSColorSpace">1</int>
+							<bytes key="NSRGB">MSAxIDEAA</bytes>
+						</object>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<bool key="IBUIMultipleTouchEnabled">YES</bool>
+						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+						<bool key="IBUIShowsHorizontalScrollIndicator">NO</bool>
+						<string key="IBUIText"/>
+						<object class="IBUITextInputTraits" key="IBUITextInputTraits">
+							<int key="IBUIAutocapitalizationType">2</int>
+							<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+						</object>
+						<object class="IBUIFontDescription" key="IBUIFontDescription">
+							<int key="type">1</int>
+							<double key="pointSize">14</double>
+						</object>
+						<object class="NSFont" key="IBUIFont">
+							<string key="NSName">Helvetica</string>
+							<double key="NSSize">14</double>
+							<int key="NSfFlags">16</int>
+						</object>
+					</object>
 				</array>
 				<string key="NSFrameSize">{768, 1024}</string>
 				<reference key="NSSuperview"/>
@@ -286,6 +318,14 @@
 					<int key="connectionID">60</int>
 				</object>
 				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">commentText</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="960632081"/>
+					</object>
+					<int key="connectionID">64</int>
+				</object>
+				<object class="IBConnectionRecord">
 					<object class="IBCocoaTouchEventConnection" key="connection">
 						<string key="label">nextQuestionPressed:</string>
 						<reference key="source" ref="960474577"/>
@@ -352,12 +392,13 @@
 						<int key="objectID">2</int>
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
-							<reference ref="871929113"/>
 							<reference ref="783180915"/>
 							<reference ref="838658605"/>
+							<reference ref="791686696"/>
+							<reference ref="960632081"/>
+							<reference ref="356964106"/>
 							<reference ref="960474577"/>
-							<reference ref="356964106"/>
-							<reference ref="791686696"/>
+							<reference ref="871929113"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -394,6 +435,11 @@
 						<reference key="object" ref="791686696"/>
 						<reference key="parent" ref="766721923"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">63</int>
+						<reference key="object" ref="960632081"/>
+						<reference key="parent" ref="766721923"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -406,6 +452,7 @@
 				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="55.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="63.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 			</dictionary>
@@ -413,7 +460,7 @@
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">61</int>
+			<int key="maxID">64</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -445,6 +492,7 @@
 						</object>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="commentText">UITextView</string>
 						<string key="finishButton">UIButton</string>
 						<string key="nextButton">UIButton</string>
 						<string key="picker">UIPickerView</string>
@@ -453,6 +501,10 @@
 						<string key="titleText">UILabel</string>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="commentText">
+							<string key="name">commentText</string>
+							<string key="candidateClassName">UITextView</string>
+						</object>
 						<object class="IBToOneOutletInfo" key="finishButton">
 							<string key="name">finishButton</string>
 							<string key="candidateClassName">UIButton</string>
--- a/eventLogger.h	Wed Feb 13 17:03:56 2013 +0000
+++ b/eventLogger.h	Mon Feb 18 11:45:05 2013 +0000
@@ -28,7 +28,7 @@
 
 
 
-
+#define EVENT_THIN_FACTOR 10
 #define EVENT_LOG_FILENAME "log.json"
 #define SERVER_URL "http://127.0.0.1:8080/testservice/"
 #define UPLOAD_CHUNK_SIZE 500
@@ -75,7 +75,7 @@
         val2 = v2;
         sliderID = sID;
         
-        double timemsd = [NSDate timeIntervalSinceReferenceDate];
+        double timemsd = [NSDate timeIntervalSinceReferenceDate]; // MILLISECONDS
         eventTime = (unsigned long long)(timemsd*1000) - APP_CREATION_TIME;
         
     }
@@ -146,7 +146,7 @@
     void setUsername(const char *u);
     void newUser();
     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);
+    void questionnaireAnswersObtained(vector<int> answers, const char* userComments);
     void urlResponse(ofHttpResponse & response);
 private:
     // what we need...
@@ -157,11 +157,13 @@
     int currentHTTPRequestID;
     vector<lEvent> theEvents;
     
+    void thinnedLogEvent(lEvent nextEvent);
     
     // values applicable to all events
 
     unsigned int nextUploadQty;
 
+    string questionnaireComments;
     
     ofxiPhoneDeviceType iOSdeviceType;
     
@@ -169,6 +171,7 @@
     vector<int> questionnaireAnswers;
     bool questionnaireCompleted;
     bool questionnaireUploaded;
+    int interfaceOrder;
 
     
     void checkLogFile();
--- a/eventLogger.mm	Wed Feb 13 17:03:56 2013 +0000
+++ b/eventLogger.mm	Mon Feb 18 11:45:05 2013 +0000
@@ -8,9 +8,10 @@
 
 //---------------------------------------------------------------------------
 #include "eventLogger.h"
+#include "timer.h"
 
 EventLogger eventLogger;
-
+extern Timer timer;
 //---------------------------------------------------------------------------
 EventLogger::EventLogger(){
     //QuestionnaireViewController * questionnaireViewController;
@@ -42,11 +43,11 @@
     logEvent(APP_STARTED);
 }
 //---------------------------------------------------------------------------
-void EventLogger::questionnaireAnswersObtained(vector<int> answers){
+void EventLogger::questionnaireAnswersObtained(vector<int> answers, const char* userComments){
     
     questionnaireCompleted = true;
     questionnaireAnswers = answers;
-    
+    questionnaireComments = userComments;
     uploadQuestionnaire();
     
 }
@@ -168,6 +169,7 @@
             cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
             serverConnectionOK = true;
         }else{
+            serverConnectionOK = false;
             cout << "server connection ERROR \n";
         }
     }
@@ -183,6 +185,8 @@
 
 }
 //---------------------------------------------------------------------------
+// this reads the persistent log file , checks if we've used the app before and
+// if we've answered questionnaire or not
 void EventLogger::readJsonToLog(const string &jsonFile){
     Json::Value root;
     Json::Reader reader;
@@ -224,18 +228,20 @@
     savedInteractionTime = root["savedInteractionTime"].asLargestInt();
     questionnaireCompleted = root["questionnaireCompleted"].asBool();
     questionnaireUploaded = root["questionnaireUploaded"].asBool();
-    
+    interfaceOrder = root["interfaceOrder"].asInt();
     
     if(questionnaireCompleted && !questionnaireUploaded){
         // then read it in and upload it
-        Json::Value JArray = root["questionnaireAnswers"];
+        Json::Value JQ = root["questionnaire"];
+        Json::Value JArray = JQ["qAnswers"];
         if(JArray.size() < 2){
             cout << "Error - status of questionnaire is wierd\n";
         }
         for ( unsigned int i = 0; i < JArray.size(); i++ )
         {
-            questionnaireAnswers.push_back(JArray[1].asInt());
+            questionnaireAnswers.push_back(JArray[i].asInt());
         }
+        questionnaireComments = JQ["comments"].toStyledString();
         uploadQuestionnaire();
     }
     
@@ -249,7 +255,9 @@
     }
     // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time!
     cout << "Total interaction time: " << savedInteractionTime << '\n';
-
+    
+    timer.setInteractionTime(savedInteractionTime);
+    timer.setOrderFromPrevious(interfaceOrder);
     
 }
 
@@ -257,6 +265,7 @@
 //---------------------------------------------------------------------------
 
 bool EventLogger::uploadEventLog(bool async){
+
     // show indicator
     logUploadInProgress = true;
     cout << "^^^^^^^^  ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n";
@@ -297,11 +306,15 @@
     consentGiven = false;
     
 }
+//---------------------------------------------------------------------------
+// only called when doing supervised tests
 void EventLogger::newUser(){
     cout<<"setup new user\n";
     nextUploadNumber = 0;
     deviceID = ofGetSystemTimeMicros();
     savedInteractionTime = 0;
+    totalInteractionTime = 0;
+    sessionStartTime = ofGetSystemTime();
     questionnaireCompleted = false;
     questionnaireUploaded = false;
     consentGiven = true; // other wise we wouldn't be doing this
@@ -312,9 +325,41 @@
 // called from alertView OK in iViewController
 void EventLogger::setUsername(const char *u){
     userName = u;
+    // start interaction clock
+    timer.startInteractionClock();
+}
+//---------------------------------------------------------------------------
+void EventLogger::thinnedLogEvent(lEvent newEvent){
+    static lEvent previousEvent(APP_STARTED); // initialised as whatever. hopefully won't log
+    static int eventCounter = 0;
+    
+    // if first event then log it. it won't be, but still.
+    if(theEvents.size() == 0){
+        theEvents.push_back(newEvent);
+        previousEvent = newEvent;
+        return;
+    }
+    
+    // if previous event is more than 300ms ago, or event type has changed, log both of them
+    int gap = newEvent.eventTime - previousEvent.eventTime;
+    if(gap > 300 || newEvent.eventType != previousEvent.eventType){
+        // if prev event not logged, log it
+        if((*theEvents.end()).eventTime != previousEvent.eventTime){
+            theEvents.push_back(previousEvent);
+        }
+        theEvents.push_back(newEvent);
 
+    }
+    
+    // otherwise only record every Nth event
+    if(eventCounter >= EVENT_THIN_FACTOR){
+        theEvents.push_back(newEvent);
+        eventCounter = 0;
+
+    }
+    eventCounter++;
+    previousEvent = newEvent;
 }
-
 //---------------------------------------------------------------------------
 // log zoom event
 void EventLogger::logEvent(const leventType& evtType,const TwoVector& centre, const double& scale, const int& sliderID, const double& sliderVal){
@@ -331,6 +376,17 @@
     // thinFactor
     if(!loggingEnabled) return;
     switch ( evtType ) {
+            // data thinning here
+        case SCROLL:
+            thinnedLogEvent(lEvent(evtType,centre.x,centre.y));
+            break;
+        case ZOOM:
+            thinnedLogEvent(lEvent(evtType,scale));
+            break;
+        case CHANGE_SLIDER:
+            thinnedLogEvent(lEvent(evtType,sliderVal , 0.0 , sliderID));
+            break;
+            
         case SAVE_PRESET:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             // Code
@@ -338,9 +394,7 @@
         case SAVE_DESET:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             break;
-        case SCROLL:
-            theEvents.push_back(lEvent(evtType,centre.x,centre.y));
-            break;
+
         case SCROLL_STOPPED:
             theEvents.push_back(lEvent(evtType,centre.x,centre.y));
             cout << "SCROLL STOPPED EVENT\n";
@@ -349,12 +403,6 @@
             theEvents.push_back(lEvent(evtType,centre.x,centre.y,sliderID));
             cout << "SCROLL STOPPED EVENT\n";
             break;
-        case ZOOM:
-            theEvents.push_back(lEvent(evtType,scale));
-            break;
-        case CHANGE_SLIDER:
-            theEvents.push_back(lEvent(evtType,sliderVal , 0.0 , sliderID));
-            break;
         case SWAP_VIEW:
             theEvents.push_back(lEvent(evtType,0.0 , 0.0 , sliderID)); // slider ID is which view
             break;
@@ -368,11 +416,8 @@
         uploadEventLog(true);
     }
     //sessionTime = (ofGetSystemTime() - sessionStartTime);
-    totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime);
-    if(totalInteractionTime > QUESTIONNAIRE_ENABLE_TIME){
-        TopButtonViewController *tbvc = ((testApp *)ofGetAppPtr())->topButtonViewController;
-        [tbvc enableQuestionButton];
-    }
+    totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime); // milliseconds
+
 }
 
 //---------------------------------------------------------------------------
@@ -419,7 +464,7 @@
     root["questionnaireCompleted"] = questionnaireCompleted;
     root["questionnaireUploaded"] = questionnaireUploaded;
     if(questionnaireCompleted && !questionnaireUploaded){
-        root["qAnswers"] = questionnaireToJson();
+        root["questionnaire"] = questionnaireToJson();
     }
     
     int i = 0;
@@ -446,8 +491,10 @@
         questionnaire[i] = (*aIter);
         i++;
     }
+    cout << questionnaireComments << "\n";
 
     root["qAnswers"] = questionnaire;
+    root["comments"] = questionnaireComments;
     root["userName"] = userName;
     root["deviceID"] = deviceID;
     root["iOSdeviceType"] = iOSdeviceType;
--- a/testApp.h	Wed Feb 13 17:03:56 2013 +0000
+++ b/testApp.h	Mon Feb 18 11:45:05 2013 +0000
@@ -109,7 +109,7 @@
     void lockSequencerPressed(bool locked);
     
     void showQuestionnaire();
-    void questionnaireHidden(vector<int> answers);
+    void questionnaireHidden(vector<int> answers,  const char* userComments);
     void showIntro();
     void introHidden(bool OK);
     void interfaceSelected(int which);
--- a/testApp.mm	Wed Feb 13 17:03:56 2013 +0000
+++ b/testApp.mm	Mon Feb 18 11:45:05 2013 +0000
@@ -25,7 +25,7 @@
 
 	// open an outgoing connection to HOST:PORT
 	sender.setup( HOST, PORT );
-    ofSetFrameRate(30);
+    ofSetFrameRate(50);
     // reciever
     lastMoveTime = ofGetSystemTimeMicros();
     prevTouchX = 0;
@@ -82,10 +82,9 @@
     [ofxiPhoneGetGLParentView() addSubview:bottomTabViewController.view];
 	
     [bottomTabViewController setAppRef:(id)this];
-    [bottomTabViewController show:(id)this];
-    
     bottomTabViewController.view.frame = CGRectMake(0,getHeight()-44,getWidth(),44);
     
+
     /////
     
     topButtonViewController	= [[TopButtonViewController alloc] initWithNibName:@"TopButtonViewController" bundle:nil];
@@ -115,6 +114,8 @@
     presetManager.startupLoadAll();
     eventLogger.init();
     
+    // timer.init();
+    
     whichInterfaceShowing = SLIDERS;
     setAllGUISliders(theGridView.getParams());
     // GO
@@ -210,16 +211,16 @@
 
 }
 //--------------------------------------------------------------
-void testApp::questionnaireHidden(vector<int> answers){
+void testApp::questionnaireHidden(vector<int> answers, const char* userComments){
     // send answers to server as json
-    eventLogger.questionnaireAnswersObtained(answers);
+    eventLogger.questionnaireAnswersObtained(answers, userComments);
     
     // set "we've done questionnaire" to true in event logger
     paused = false;
 
     whichInterfaceShowing = BOTH;
     // tell bottomtabviewcontroller
-    
+    [bottomTabViewController show:(id)this];
 }
 //--------------------------------------------------------------
 void testApp::showIntro(){
@@ -298,6 +299,7 @@
         ofxUISlider *slider;
         slider = (ofxUISlider *)sliderGUI->addWidgetDown(new ofxUISlider(length,dim,0.0,127,64,sliderParamNames[i-1]));
         slider->setDrawPadding(true);
+        slider->setDrawPaddingOutline(true);
         if(i <= 5){
             slider->setColorFill(ofColor(0,0,255));
             slider->setColorFillHighlight(ofColor(0,0,255));
@@ -428,7 +430,7 @@
 
         if(moveVel.norm() > 0.3){
             if(theGridView.snapped){
-                // stop it, send snap event
+                // stop it (snap check sends snap event)
                 moveVel.setCoord(0.0,0.0);
             }else{
                 theGridView.move(moveVel);
@@ -449,6 +451,7 @@
         }
 
     }
+    // ZOOM MOMENTUM
     // continiue to zoom at velocity
     if (numActiveTouches < 2 && abs(zoomVel)>0.001){
         theGridView.zoom(zoomVel + 1.0); // +1 because zoomVel factor is + or - , wheras zoom is a multiplier near 1