changeset 38:0dfe9e0c01aa

Evnt trails fit with uploads. Smooth button.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 10 Apr 2013 18:57:05 +0100
parents 8ed7522deaaa
children df7c08faf541
files BottomTabViewController.xib TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib eventLogger.h eventLogger.mm grid.h grid.mm presetManager.h presetManager.mm testApp.h testApp.mm
diffstat 12 files changed, 746 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/BottomTabViewController.xib	Tue Apr 09 17:14:31 2013 +0100
+++ b/BottomTabViewController.xib	Wed Apr 10 18:57:05 2013 +0100
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="8.00">
 	<data>
-		<int key="IBDocument.SystemTarget">1536</int>
+		<int key="IBDocument.SystemTarget">1552</int>
 		<string key="IBDocument.SystemVersion">11G63</string>
-		<string key="IBDocument.InterfaceBuilderVersion">2844</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
 		<string key="IBDocument.AppKitVersion">1138.51</string>
 		<string key="IBDocument.HIToolboxVersion">569.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
-			<string key="NS.object.0">1930</string>
+			<string key="NS.object.0">2083</string>
 		</object>
 		<array key="IBDocument.IntegratedClassDependencies">
 			<string>IBProxyObject</string>
@@ -40,6 +40,7 @@
 						<int key="NSvFlags">292</int>
 						<string key="NSFrameSize">{768, 44}</string>
 						<reference key="NSSuperview" ref="766721923"/>
+						<reference key="NSWindow"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -74,6 +75,7 @@
 				</array>
 				<string key="NSFrameSize">{768, 43}</string>
 				<reference key="NSSuperview"/>
+				<reference key="NSWindow"/>
 				<reference key="NSNextKeyView" ref="416841628"/>
 				<bool key="IBUIOpaque">NO</bool>
 				<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
@@ -162,11 +164,52 @@
 			<nil key="sourceID"/>
 			<int key="maxID">6</int>
 		</object>
-		<object class="IBClassDescriber" key="IBDocument.Classes"/>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">BottomTabViewController</string>
+					<string key="superclassName">UIViewController</string>
+					<dictionary class="NSMutableDictionary" key="actions">
+						<string key="interfaceSelected:">id</string>
+						<string key="show:">id</string>
+						<string key="show:withSelection:">id</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="actionInfosByName">
+						<object class="IBActionInfo" key="interfaceSelected:">
+							<string key="name">interfaceSelected:</string>
+							<string key="candidateClassName">id</string>
+						</object>
+						<object class="IBActionInfo" key="show:">
+							<string key="name">show:</string>
+							<string key="candidateClassName">id</string>
+						</object>
+						<object class="IBActionInfo" key="show:withSelection:">
+							<string key="name">show:withSelection:</string>
+							<string key="candidateClassName">id</string>
+						</object>
+					</dictionary>
+					<object class="NSMutableDictionary" key="outlets">
+						<string key="NS.key.0">interfaceSelector</string>
+						<string key="NS.object.0">UISegmentedControl</string>
+					</object>
+					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<string key="NS.key.0">interfaceSelector</string>
+						<object class="IBToOneOutletInfo" key="NS.object.0">
+							<string key="name">interfaceSelector</string>
+							<string key="candidateClassName">UISegmentedControl</string>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/BottomTabViewController.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
 		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
 		<int key="IBDocument.defaultPropertyAccessControl">3</int>
-		<string key="IBCocoaTouchPluginVersion">1930</string>
+		<string key="IBCocoaTouchPluginVersion">2083</string>
 	</data>
 </archive>
--- a/TopButtonViewController.h	Tue Apr 09 17:14:31 2013 +0100
+++ b/TopButtonViewController.h	Wed Apr 10 18:57:05 2013 +0100
@@ -11,13 +11,18 @@
 #define IS_SUPERVISED 1 // to set new user button
 @interface TopButtonViewController : UIViewController
 
+@property (retain, nonatomic) IBOutlet UILabel *smoothText;
+@property (retain, nonatomic) IBOutlet UISwitch *smoothToggle;
+@property (retain, nonatomic) IBOutlet UIBarButtonItem *smoothSwitch;
 @property (nonatomic, assign)       id theOFAppRef;
+@property (retain, nonatomic) IBOutlet UIBarButtonItem *savePresetButton;
 
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *playButton;
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *pauseButton;
 @property (retain, strong, nonatomic) IBOutlet UIBarButtonItem *qButton;
 @property (retain, strong,nonatomic) IBOutlet UIBarButtonItem *newUserButton;
 - (IBAction)nextSequence:(id)sender;
+- (IBAction)smoothSwitchChanged:(id)sender;
 
 -(IBAction)show:(id)sender;
 -(void)setAppRef:(id)theOFApp;
@@ -31,5 +36,6 @@
 - (IBAction)randomise:(id)sender;
 - (IBAction)helpPressed:(id)sender;
 - (IBAction)newUser:(id)sender;
+- (void)enableSmoothSwitch:(id)sender;
 
 @end
--- a/TopButtonViewController.mm	Tue Apr 09 17:14:31 2013 +0100
+++ b/TopButtonViewController.mm	Wed Apr 10 18:57:05 2013 +0100
@@ -134,12 +134,28 @@
     ((testApp *)self.theOFAppRef)->nextSequence();
 }
 
+- (IBAction)smoothSwitchChanged:(id)sender {
+    UISwitch * smoothswitch = (UISwitch *)sender;
+    NSLog(@"SMOOTH SWITCH %d", smoothswitch.on);
+    ((testApp *)self.theOFAppRef)->setInterp(smoothswitch.on);
+    
+    if(smoothswitch.on){
+        self.savePresetButton.enabled = NO;
+       
+    }else{
+        self.savePresetButton.enabled = YES;
+    }
+}
+
 - (IBAction)show:(id)sender
 {
     self.theOFAppRef = sender;
     self.view.hidden = NO;
 }
-
+- (void)enableSmoothSwitch:(id)sender{
+    self.smoothToggle.hidden = NO;
+    self.smoothText.hidden = NO;
+}
 /*
  helpViewController	= [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];
  [ofxiPhoneGetGLParentView() addSubview:helpViewController.view];
@@ -151,6 +167,10 @@
     [_qButton release];
 
     [_newUserButton release];
+    [_smoothText release];
+    [_smoothSwitch release];
+    [_smoothToggle release];
+    [_savePresetButton release];
     [super dealloc];
 }
 - (void)viewDidUnload {
@@ -158,6 +178,10 @@
     [self setPauseButton:nil];
     [self setQButton:nil];
     [self setNewUserButton:nil];
+    [self setSmoothText:nil];
+    [self setSmoothSwitch:nil];
+    [self setSmoothToggle:nil];
+    [self setSavePresetButton:nil];
     [super viewDidUnload];
 }
 @end
--- a/TopButtonViewController.xib	Tue Apr 09 17:14:31 2013 +0100
+++ b/TopButtonViewController.xib	Wed Apr 10 18:57:05 2013 +0100
@@ -13,6 +13,8 @@
 		<array key="IBDocument.IntegratedClassDependencies">
 			<string>IBProxyObject</string>
 			<string>IBUIBarButtonItem</string>
+			<string>IBUILabel</string>
+			<string>IBUISwitch</string>
 			<string>IBUIToolbar</string>
 			<string>IBUIView</string>
 		</array>
@@ -39,10 +41,25 @@
 					<object class="IBUIToolbar" id="358683122">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">266</int>
+						<array class="NSMutableArray" key="NSSubviews">
+							<object class="IBUISwitch" id="150228020">
+								<reference key="NSNextResponder" ref="358683122"/>
+								<int key="NSvFlags">-2147483356</int>
+								<string key="NSFrame">{{106, 9}, {94, 27}}</string>
+								<reference key="NSSuperview" ref="358683122"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="459236656"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<int key="IBUIContentHorizontalAlignment">0</int>
+								<int key="IBUIContentVerticalAlignment">0</int>
+							</object>
+						</array>
 						<string key="NSFrameSize">{768, 44}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView"/>
+						<reference key="NSNextKeyView" ref="150228020"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
@@ -59,8 +76,25 @@
 								<reference key="IBUIToolbar" ref="358683122"/>
 								<int key="IBUISystemItemIdentifier">5</int>
 							</object>
-							<object class="IBUIBarButtonItem" id="996249183">
-								<string key="IBUITitle">Save Preset</string>
+							<object class="IBUIBarButtonItem" id="1056681435">
+								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<reference key="IBUICustomView" ref="150228020"/>
+								<reference key="IBUIToolbar" ref="358683122"/>
+							</object>
+							<object class="IBUIBarButtonItem" id="180077124">
+								<string key="IBUITitle">Random</string>
+								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<int key="IBUIStyle">1</int>
+								<reference key="IBUIToolbar" ref="358683122"/>
+							</object>
+							<object class="IBUIBarButtonItem" id="189059998">
+								<string key="IBUITitle">Lock X</string>
+								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<int key="IBUIStyle">1</int>
+								<reference key="IBUIToolbar" ref="358683122"/>
+							</object>
+							<object class="IBUIBarButtonItem" id="597523981">
+								<string key="IBUITitle">Lock Y</string>
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
@@ -93,26 +127,45 @@
 								<reference key="IBUIToolbar" ref="358683122"/>
 								<int key="IBUISystemItemIdentifier">5</int>
 							</object>
-							<object class="IBUIBarButtonItem" id="180077124">
-								<string key="IBUITitle">Random</string>
-								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
-								<int key="IBUIStyle">1</int>
-								<reference key="IBUIToolbar" ref="358683122"/>
-							</object>
-							<object class="IBUIBarButtonItem" id="189059998">
-								<string key="IBUITitle">Lock X</string>
-								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
-								<int key="IBUIStyle">1</int>
-								<reference key="IBUIToolbar" ref="358683122"/>
-							</object>
-							<object class="IBUIBarButtonItem" id="597523981">
-								<string key="IBUITitle">Lock Y</string>
+							<object class="IBUIBarButtonItem" id="996249183">
+								<string key="IBUITitle">Save Preset</string>
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
 							</object>
 						</array>
 					</object>
+					<object class="IBUILabel" id="459236656">
+						<reference key="NSNextResponder" ref="766721923"/>
+						<int key="NSvFlags">-2147483356</int>
+						<string key="NSFrame">{{60, 11}, {59, 21}}</string>
+						<reference key="NSSuperview" ref="766721923"/>
+						<reference key="NSWindow"/>
+						<string key="NSReuseIdentifierKey">_NS:9</string>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">7</int>
+						<bool key="IBUIUserInteractionEnabled">NO</bool>
+						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+						<string key="IBUIText">Smooth</string>
+						<object class="NSColor" key="IBUITextColor">
+							<int key="NSColorSpace">1</int>
+							<bytes key="NSRGB">MCAwIDAAA</bytes>
+							<string key="IBUIColorCocoaTouchKeyPath">darkTextColor</string>
+						</object>
+						<nil key="IBUIHighlightedColor"/>
+						<int key="IBUIBaselineAdjustment">0</int>
+						<object class="IBUIFontDescription" key="IBUIFontDescription">
+							<int key="type">1</int>
+							<double key="pointSize">17</double>
+						</object>
+						<object class="NSFont" key="IBUIFont">
+							<string key="NSName">Helvetica</string>
+							<double key="NSSize">17</double>
+							<int key="NSfFlags">16</int>
+						</object>
+						<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+					</object>
 				</array>
 				<string key="NSFrameSize">{768, 44}</string>
 				<reference key="NSSuperview"/>
@@ -184,6 +237,38 @@
 					<int key="connectionID">39</int>
 				</object>
 				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">smoothText</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="459236656"/>
+					</object>
+					<int key="connectionID">48</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">smoothSwitch</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="1056681435"/>
+					</object>
+					<int key="connectionID">49</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">smoothToggle</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="150228020"/>
+					</object>
+					<int key="connectionID">50</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">savePresetButton</string>
+						<reference key="source" ref="841351856"/>
+						<reference key="destination" ref="996249183"/>
+					</object>
+					<int key="connectionID">51</int>
+				</object>
+				<object class="IBConnectionRecord">
 					<object class="IBCocoaTouchEventConnection" key="connection">
 						<string key="label">savePressed:</string>
 						<reference key="source" ref="996249183"/>
@@ -263,6 +348,15 @@
 					</object>
 					<int key="connectionID">42</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchEventConnection" key="connection">
+						<string key="label">smoothSwitchChanged:</string>
+						<reference key="source" ref="150228020"/>
+						<reference key="destination" ref="841351856"/>
+						<int key="IBEventType">13</int>
+					</object>
+					<int key="connectionID">47</int>
+				</object>
 			</array>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<array key="orderedObjects">
@@ -288,6 +382,7 @@
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
 							<reference ref="358683122"/>
+							<reference ref="459236656"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -295,17 +390,18 @@
 						<int key="objectID">4</int>
 						<reference key="object" ref="358683122"/>
 						<array class="NSMutableArray" key="children">
-							<reference ref="189059998"/>
-							<reference ref="597523981"/>
-							<reference ref="996249183"/>
 							<reference ref="680653375"/>
 							<reference ref="528026433"/>
 							<reference ref="898331149"/>
-							<reference ref="180077124"/>
 							<reference ref="924591997"/>
 							<reference ref="379344923"/>
+							<reference ref="180077124"/>
+							<reference ref="189059998"/>
+							<reference ref="597523981"/>
 							<reference ref="1052071507"/>
+							<reference ref="996249183"/>
 							<reference ref="552018169"/>
+							<reference ref="1056681435"/>
 						</array>
 						<reference key="parent" ref="766721923"/>
 					</object>
@@ -374,6 +470,24 @@
 						<reference key="object" ref="552018169"/>
 						<reference key="parent" ref="358683122"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">45</int>
+						<reference key="object" ref="1056681435"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="150228020"/>
+						</array>
+						<reference key="parent" ref="358683122"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">44</int>
+						<reference key="object" ref="150228020"/>
+						<reference key="parent" ref="1056681435"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">46</int>
+						<reference key="object" ref="459236656"/>
+						<reference key="parent" ref="766721923"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -394,6 +508,9 @@
 				<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="40.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="41.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="44.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="45.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="46.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 			</dictionary>
@@ -401,7 +518,7 @@
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">43</int>
+			<int key="maxID">51</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -420,6 +537,7 @@
 						<string key="randomise:">id</string>
 						<string key="savePressed:">id</string>
 						<string key="show:">id</string>
+						<string key="smoothSwitchChanged:">id</string>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="actionInfosByName">
 						<object class="IBActionInfo" key="helpPressed:">
@@ -466,12 +584,20 @@
 							<string key="name">show:</string>
 							<string key="candidateClassName">id</string>
 						</object>
+						<object class="IBActionInfo" key="smoothSwitchChanged:">
+							<string key="name">smoothSwitchChanged:</string>
+							<string key="candidateClassName">id</string>
+						</object>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="outlets">
 						<string key="newUserButton">UIBarButtonItem</string>
 						<string key="pauseButton">UIBarButtonItem</string>
 						<string key="playButton">UIBarButtonItem</string>
 						<string key="qButton">UIBarButtonItem</string>
+						<string key="savePresetButton">UIBarButtonItem</string>
+						<string key="smoothSwitch">UIBarButtonItem</string>
+						<string key="smoothText">UILabel</string>
+						<string key="smoothToggle">UISwitch</string>
 					</dictionary>
 					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
 						<object class="IBToOneOutletInfo" key="newUserButton">
@@ -490,6 +616,22 @@
 							<string key="name">qButton</string>
 							<string key="candidateClassName">UIBarButtonItem</string>
 						</object>
+						<object class="IBToOneOutletInfo" key="savePresetButton">
+							<string key="name">savePresetButton</string>
+							<string key="candidateClassName">UIBarButtonItem</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="smoothSwitch">
+							<string key="name">smoothSwitch</string>
+							<string key="candidateClassName">UIBarButtonItem</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="smoothText">
+							<string key="name">smoothText</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="smoothToggle">
+							<string key="name">smoothToggle</string>
+							<string key="candidateClassName">UISwitch</string>
+						</object>
 					</dictionary>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
--- a/eventLogger.h	Tue Apr 09 17:14:31 2013 +0100
+++ b/eventLogger.h	Wed Apr 10 18:57:05 2013 +0100
@@ -28,7 +28,7 @@
 #import "ServerComms.h"
 #include "grid.h"
 
-#define EVENT_THIN_FACTOR 15
+#define EVENT_THIN_FACTOR 12
 #define EVENT_LOG_FILENAME "log.json"
 #define UPLOAD_CHUNK_SIZE 100
 #define APP_CREATION_TIME 381429000000   // milliseconds to the time i wrote this wee blighter. saves digits
@@ -174,9 +174,12 @@
     void drawTrail(const TwoVector min, const TwoVector max);
     vector<lEvent> getDrawableEventsInRange(const TwoVector min, const TwoVector max);
     vector<TwoVector> getRecentPath(int numEvents);
+    
+    void clearTrail();
 private:
   
-    vector<lEvent> theEvents;
+    vector<lEvent> theEvents; // all logged but not uploaded events
+    deque<lEvent> eventsToDraw; // 200 or so drawable events, maybe uploaded maybe not
 
     void thinnedLogEvent(lEvent nextEvent);
     void thinnedScrollEvent(lEvent nextEvent);
@@ -186,7 +189,7 @@
     
     ofxiPhoneDeviceType iOSdeviceType;
     
-    bool testConnection();
+    void testConnection();
     vector<int> questionnaireAnswers;
     int interfaceOrder;
 
--- a/eventLogger.mm	Tue Apr 09 17:14:31 2013 +0100
+++ b/eventLogger.mm	Wed Apr 10 18:57:05 2013 +0100
@@ -66,7 +66,7 @@
 
 }
 //---------------------------------------------------------------------------
-bool EventLogger::testConnection(){
+void EventLogger::testConnection(){
     Json::Value root;
     root["x"] = "y";
     cout << "testConnection\n";
@@ -268,9 +268,7 @@
 //---------------------------------------------------------------------------
 
 bool EventLogger::uploadEventLog(bool async){
-    // COMMENT THIS OUTRT   !!!!!!!!
-    theEvents.clear();
-    return false;
+
     // show indicator
     logUploadInProgress = true;
     cout << "^^^^^^^^  ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n";
@@ -294,7 +292,7 @@
     }
 }
 //----------------------------------------------------------------------------
-bool eventWasInRegion(vector<lEvent>::iterator eiter, TwoVector regionTopLeft, TwoVector regionBottomRight){
+bool eventWasInRegion(deque<lEvent>::iterator eiter, TwoVector regionTopLeft, TwoVector regionBottomRight){
     if( ((*eiter).val1 > regionTopLeft.x ) && ((*eiter).val2 > regionTopLeft.y ) && ((*eiter).val1 < regionBottomRight.x ) && ((*eiter).val2 < regionBottomRight.y )){
         return true;
     }else{
@@ -303,16 +301,27 @@
     
 }
 //----------------------------------------------------------------------------
+void EventLogger::clearTrail(){
+    eventsToDraw.clear();
+}
+//----------------------------------------------------------------------------
 void EventLogger::drawTrail(const TwoVector min, const TwoVector max){
-    // horribly inefficient
-    vector<lEvent>::iterator eiter;
-    vector<lEvent>::iterator preveiter;
+    if(eventsToDraw.size() <= 0){
+        return;
+        
+    }
+    deque<lEvent>::iterator eiter;
+    deque<lEvent>::iterator preveiter;
     int i = 0;
     
     
+    preveiter = --eventsToDraw.end();
+    TwoVector start = TwoVector(ofGetWidth()*0.5,ofGetHeight()*0.5);
+    TwoVector end = theGridView.coordToPixel(TwoVector((*preveiter).val1,(*preveiter).val2));
+    ofSetColor(255,255,255,96);
+    ofLine(start.x,start.y, end.x, end.y);
     
-    preveiter = theEvents.begin();
-    for(eiter = --theEvents.end(); eiter > theEvents.begin(); eiter--){
+    for(eiter = --eventsToDraw.end(); eiter >= eventsToDraw.begin(); eiter--){
 
         //cout << i << '\n';
         if( (*eiter).eventType == SCROLL || (*eiter).eventType == EVALUATION_POINT){
@@ -322,20 +331,12 @@
             }
             if(eventWasInRegion(eiter, min, max) || eventWasInRegion(preveiter, min, max)){
                 // draw a line between prev and this
-                if(preveiter != theEvents.begin()){
+                if(eiter != eventsToDraw.begin()){
                     TwoVector start = theGridView.coordToPixel(TwoVector((*preveiter).val1,(*preveiter).val2));
                     TwoVector end = theGridView.coordToPixel(TwoVector((*eiter).val1,(*eiter).val2));
                     ofSetColor(255,255,255,96);
                     ofLine(start.x,start.y, end.x, end.y);
                 
-                }else{
-                    // draw line from listen point to last evt
-                    TwoVector start = TwoVector(ofGetWidth()*0.5,ofGetHeight()*0.5);
-                    TwoVector end = theGridView.coordToPixel(TwoVector((*eiter).val1,(*eiter).val2));
-                    ofSetColor(255,255,255,96);
-                    ofLine(start.x,start.y, end.x, end.y);
-                    // draw ever growing listen point
-                    
                 }
             
             }
@@ -398,13 +399,26 @@
     int gap = newEvent.eventTime - previousEvent.eventTime;
     if(gap > 300){
         // log previous event as a evaluation point MAYBE TODO if previous event was logged as scroll chuck it out?
-        theEvents.push_back(lEvent(EVALUATION_POINT, previousEvent.val1, previousEvent.val2, gap));
+        lEvent evalEvt(EVALUATION_POINT, previousEvent.val1, previousEvent.val2, gap);
+        theEvents.push_back(evalEvt);
+        eventsToDraw.push_back(evalEvt);
+        if(eventsToDraw.size() > SCROLL_TRAIL_LENGTH){
+            eventsToDraw.pop_front();
+        }
         // and now new event as scroll
         theEvents.push_back(newEvent);
+        eventsToDraw.push_back(newEvent);
+        if(eventsToDraw.size() > SCROLL_TRAIL_LENGTH){
+            eventsToDraw.pop_front();
+        }
         eventCounter = 0;
 
     }else if(eventCounter >= EVENT_THIN_FACTOR){ // otherwise only record every Nth event
         theEvents.push_back(newEvent);
+        eventsToDraw.push_back(newEvent);
+        if(eventsToDraw.size() > SCROLL_TRAIL_LENGTH){
+            eventsToDraw.pop_front();
+        }
         eventCounter = 0;
         
     }
--- a/grid.h	Tue Apr 09 17:14:31 2013 +0100
+++ b/grid.h	Wed Apr 10 18:57:05 2013 +0100
@@ -40,13 +40,13 @@
     void draw();  
     void drawGridLines();
     void update(); // change according to zoom
-    int interpLevel;
+    double interpLevel;
     int smallestGridSpacing; // number of pixels when small grid dissappears from view
     vector<int> getParams();
     TwoVector getCoord();
     void setMinZoom();
     void setMaxZoom();
-    
+    void setInterpolation(interpolateModeType mode);
     // HILBERT now does each coord for this
     vector<int> calculateParamsFromCoord(TwoVector coord);
     TwoVector calculateCoordFromParams(vector<int> params);
@@ -63,11 +63,7 @@
     const double minValue;    // smallest zoom
     int paramsPerDim; // no of parameters per dimension (
     int paramBitDepth; // number of bits for the parameter control data - i.e. always 7 for midi CC
-    /* HILBERT
-    
-    int codeLength; // the 1d size of the code, determines max extent of single tile, related to params per dim
-    
-    */
+
 
     
     TwoVector topLeft; // top left corner of view, surface coords GUI
@@ -82,30 +78,18 @@
     
     bool maxZoom, minZoom;
 
-    /* HILBERT
-    vector< vector<bool> > vcode; //
-    vector<int> icode;
-    vector<int> transSeq;
-     */
+
     
     int midiCC[10]; // the actual params SHOULD BE INITED FROM 2*paramsPerDim
     
 // private functions
     
-    // HILBERT void makeCode();
+    
     void checkLimits();
     void viewWasChanged();
     void checkConsistencies();
     
-    // HILBERT vector<bool> intToGray(int num, int dimToTravel=3) const;
-    // HILBERT vector<int> coordTobase32(double coord) const;
-    // HILBERT vector<int> grayToMidi(vector<vector <bool> > grayCodes) const;
-    
-    // the inverse stuff
-    // HILBERT int grayToInt(vector<bool>) const;
-    // HILBERT double base32toCoord(vector<int>) const;
-    // HILBERT vector<vector <bool> > midiToGray(vector<int>) const;
-    // HILBERT vector<int> codesToBase32(vector<vector<bool> >) const;
+
     
     vector<int> walkDiff(vector<bool> left, vector<bool> right); // not used... not worth it!
     
@@ -115,9 +99,30 @@
     void setCoord(TwoVector coord);
     void drawCrossHairs();
     
-    int calculateInterpolateLevel();
+    double calculateInterpolateLevel();
     vector<int> interpVector(vector<int> upper, vector<int> lower, float frac);
+    vector<int> interpHilbert(int bitlevel, TwoVector coord);
 
+    // the old stuff!!!!!!!!!!
+
+     int codeLength; // the 1d size of the code, determines max extent of single tile, related to params per dim
+
+    void makeCode();
+    vector< vector<bool> > vcode; //
+    vector<int> icode;
+    vector<int> transSeq;
+    
+    TwoVector calculateCoordFromParamsOld(vector<int> params) const;
+    vector<int> calculateParamsFromCoordOld(TwoVector coord) const;
+    vector<bool> intToGray(int num, int dimToTravel=3) const;
+    vector<int> coordTobase32(double coord) const;
+    vector<int> grayToMidi(vector<vector <bool> > grayCodes) const;
+    
+    // the inverse stuff
+    int grayToInt(vector<bool>) const;
+    double base32toCoord(vector<int>) const;
+    vector<vector <bool> > midiToGray(vector<int>) const;
+    vector<int> codesToBase32(vector<vector<bool> >) const;
 
     
 };
--- a/grid.mm	Tue Apr 09 17:14:31 2013 +0100
+++ b/grid.mm	Wed Apr 10 18:57:05 2013 +0100
@@ -26,7 +26,7 @@
 }
 void Grid::init(){
 
-    interpolateMode = INTERPOLATE_GRID;
+    interpolateMode = NO_INTERPOLATION;
     
     maxZoom = false;
     minZoom = false;
@@ -66,32 +66,27 @@
     return (T(0) < val) - (val < T(0));
 }
 //--------------------------------------------------------------
-int Grid::calculateInterpolateLevel(){
+double Grid::calculateInterpolateLevel(){
     if(interpolateMode == INTERPOLATE_GRID){
-        // calculate according to smallest gridlines
-        // exactly same algorithm as for drawing lines
-        // i.e. kinda duplicated code.
-        float markpow = pow(paramsPerDim,2.0);
-        for(int p = 0; p < paramBitDepth; p++){
-            
-            double gridSize = pow(markpow,p);
-            double divsr = size.x / gridSize;
-            
-            // return the spacing 
-            if( ofGetWidth()/divsr >= smallestGridSpacing){
-                interpLevel = p;
-                return p;
-            }
-        }
-        interpLevel = 0;
-        return 0;
+
+        // log_32 of scale times the pixel size we want to be the "integral" interp
+        int N = 1 << paramsPerDim;
+        interpLevel = log(scale*N*smallestGridSpacing)/log(N);
+
+        return interpLevel;
     }else{
         interpLevel = 0;
         return 0; // ???
     }
 }
 //--------------------------------------------------------------
-
+void Grid::setInterpolation(interpolateModeType mode){
+    interpolateMode = mode;
+    viewWasChanged();
+    calculateInterpolateLevel();
+    eventLogger.clearTrail();
+}
+//--------------------------------------------------------------
 void Grid::draw(){
     if(interpolateMode == NO_INTERPOLATION){
         drawGridLines();
@@ -416,8 +411,15 @@
 }
 //--------------------------------------------------------------
 void Grid::snapCheck(){
+    
+    if(interpolateMode == INTERPOLATE_GRID){
+        snapped = false;
+        closestPreset = NULL;
+        snapCentre = centre;
+        return;
+    } // no presets visible
+    
     // check environs for presets.
-   
     vector<Preset *> closePresets = presetManager.getPresetsInRange(centre - snapDist*scale, centre + snapDist*scale);
     if(closePresets.size() > 0){
         snapped = true;
@@ -647,24 +649,44 @@
 vector<int> Grid::calculateInterpolatedParamsFromCoord(TwoVector coord){
 
     vector<int> result;
-    // round by masking according to interpLevel
     
+    int interpLevelBigGrid = ceil(interpLevel);
+    int interpLevelSmallGrid = floor(interpLevel);
+    
+    if(interpLevelBigGrid >= paramBitDepth){
+        // maximum is bit-1 so don't do interp at all
+        vector<int> pSmallGrid = interpHilbert(interpLevelSmallGrid, coord);
+        return pSmallGrid;
+    }
+    double interpFrac = interpLevel - interpLevelSmallGrid;
+    
+    vector<int> pBigGrid = interpHilbert(interpLevelBigGrid, coord);
+    vector<int> pSmallGrid = interpHilbert(interpLevelSmallGrid, coord);
+// now we need to interpolate twixt these two aswell!
+    
+    result = interpVector(pBigGrid, pSmallGrid, interpFrac);
+    
+    return result;
+}
+//--------------------------------------------------------------
+vector<int> Grid::interpHilbert(int bitlevel, TwoVector coord){
+    vector<int> result;
     long long x = coord.x;
     long long y = coord.y;
-    cout << interpLevel << "\n";
-    int roundDigits = (paramsPerDim*interpLevel);
+    
+    int roundDigits = (paramsPerDim*bitlevel);
     // knock off last digits
     x = x >> roundDigits;
     x = x << roundDigits;
     float frac = (coord.x - x)/(1 << roundDigits);
     long long xlower = x;
     long long xupper = x + (1 << roundDigits);
-
+    
     vector<int> pupper = hilbert.calculateParamsFromIndex(xupper);
     vector<int> plower = hilbert.calculateParamsFromIndex(xlower);
     
     result = interpVector(pupper,plower,frac);
-// now Y
+    // now Y
     y = y >> roundDigits;
     y = y << roundDigits;
     frac = (coord.y - y)/(1 << roundDigits);
@@ -675,8 +697,9 @@
     plower = hilbert.calculateParamsFromIndex(ylower);
     
     vector<int> resultY = interpVector(pupper,plower,frac);
-// stickem together
+    // stickem together
     result.insert( result.end(), resultY.begin(), resultY.end() );
+    
     return result;
 }
 //--------------------------------------------------------------
@@ -720,4 +743,354 @@
 }
 //--------------------------------------------------------------
 //--------------------------------------------------------------
-//--------------------------------------------------------------
\ No newline at end of file
+//--------------------------------------------------------------
+
+
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+#pragma mark The old algorithm
+
+TwoVector Grid::calculateCoordFromParamsOld(vector<int> params) const{
+    
+    vector<int> ccValueX(paramsPerDim);
+    vector<int> ccValueY(paramsPerDim);
+    for(int i=0;i<paramsPerDim;i++){
+        ccValueX[i] = params[i];
+        ccValueY[i] = params[i+paramsPerDim];
+    }
+    vector<vector <bool> > codesX = midiToGray(ccValueX);
+    vector<vector <bool> > codesY = midiToGray(ccValueY);
+    
+    vector<int> base32X = codesToBase32(codesX);
+    vector<int> base32Y = codesToBase32(codesY);
+    
+    TwoVector result;
+    result.x = base32toCoord(base32X);
+    result.y = base32toCoord(base32Y);
+    return result;
+}
+
+//--------------------------------------------------------------
+vector<int> Grid::calculateParamsFromCoordOld(TwoVector coord) const{
+    // some arrays in reverse order of power from normal numbers!   1,2,4,
+    
+    // centre to base 32
+    if (coord.x > maxValue || coord.y > maxValue){
+        cout << "calculateParams Error: centre double value is too large" << "\n";
+        vector<int> empty;
+        return empty;
+    }
+    
+    //--------------------------
+    // X
+    vector<int> base32x = coordTobase32(coord.x); // 7 numbers from 0 to 31
+    vector<vector <bool> > grayCodesX;
+    
+    int size = base32x.size();
+    for(int i=0;i<size;i++){
+        grayCodesX.push_back(intToGray(base32x[i]));
+    }
+    
+    vector<int> result;
+    result = grayToMidi(grayCodesX);
+    //--------------------------
+    // AND FOR Y
+    vector<int> base32y = coordTobase32(coord.y);
+    vector<vector <bool> > grayCodesY;
+    
+    size = base32y.size();
+    for(int i=0;i<size;i++){
+        grayCodesY.push_back(intToGray(base32y[i]));
+    }
+    
+    vector<int> resultY;
+    resultY = grayToMidi(grayCodesY);
+    
+    // concatenate
+    result.insert( result.end(), resultY.begin(), resultY.end() );
+    return result;
+}
+//-------------------------------------------------------------------
+
+// for 1 dimension!!! i.e. call this twice
+vector<int> Grid::grayToMidi(vector<vector <bool> > grayCodes) const{
+    
+    // gray to midi CC values
+    // loop thru the scales to build up a CC number per dimension
+    int midiCCresult[paramsPerDim]; // TODO dims specific
+    for(int i=0;i<paramsPerDim;i++){
+        midiCCresult[i] = 0;
+    }
+    
+    int bin = 1;
+    bin = bin << grayCodes.size()-1;
+    
+    int midP = 0;
+    
+    vector<vector <bool> >::iterator piter = grayCodes.begin();
+    for(;piter < grayCodes.end();piter++){ // each lesser power of 2
+        midP = 0; // reset
+        vector<bool>::iterator diter = (*piter).begin();
+        for(; diter <= (*piter).end();diter++){ // each one is different dimension
+            int ig = int(*diter); // convert binary to int
+            //cout << "ig: " << ig;
+            midiCCresult[midP] += ig*bin; // mult by power of two
+            midP++;
+        }
+        bin = bin >> 1; // next power of 2 down
+        
+    }
+    
+    // put in vector
+    vector<int> result;
+    for(int i=0;i<paramsPerDim;i++){
+        result.push_back(midiCCresult[i]);
+    }
+    
+    return result;
+    
+    
+}
+
+
+//--------------------------------------------------------------
+
+vector<bool> Grid::intToGray(int num, int dimToTravel) const{
+    
+    // dimToTravel - this is the dimension that we want the walk to traverse, i.e. the last non zero digit of the code
+    // so swap it for 3 to produce correct orientation
+    
+    // just use look up table... until it gets huuuge.
+    vector<bool> grayCode = vcode[num];
+    grayCode[3] = vcode[num][dimToTravel];
+    grayCode[dimToTravel] = vcode[num][3];
+    return grayCode;
+}
+//--------------------------------------------------------------
+/*
+ breaks down float into a base 32 number (2^D)
+ each of these is converted to gray code
+ this is then converted to 10 parameters, where each 32-digit becomes separate power of 2
+ so "zoom" grid 32-patches are converted to 2-scales. 1,2,4,8,16,32,64,(128?) biggest number is 32^7
+ */
+vector<int> Grid::coordTobase32(double value) const{
+    //double base = 32.0;
+    if(value < 0.0){
+        cout << "coordTobase32 error: input value is negative\n";
+        value = 0.0;
+    }else if(value > maxValue){
+        cout << "coordTobase32 error: input value too big!\n";
+    }
+    double rem, divdr = 0.0;
+    int digit32;
+    
+    // what power of 32 to start at?
+    int maxpow = 7; // midi cc specific
+    vector<int> result;
+    
+    rem = value;
+    for(;maxpow >=0;maxpow--){
+        // repeatedly get digit and remainder. This is exactly what we're doing in draw !?... could put all this in one place?
+        divdr = pow((double)codeLength,(double)maxpow);
+        digit32 = floor(rem/divdr);
+        rem = rem - digit32*divdr;
+        result.push_back(digit32);  // array, biggest index is smallest power
+    }
+    // at this point rem should be fractional... use for interp?
+    
+    return result;
+}
+//--------------------------------------------------------------
+
+vector<int> Grid::codesToBase32(vector<vector<bool> > inCodes) const{
+    vector<int> result;
+    for(int i=0;i<paramBitDepth;i++){
+        result.push_back(grayToInt(inCodes[i]));
+    }
+    return result;
+}
+//--------------------------------------------------------------
+
+int Grid::grayToInt(vector<bool> incode) const{
+    // look for match in table
+    
+    int s = vcode.size();
+    
+    for(int i=0; i<s;i++){ // fill vector
+        if(vcode[i] == incode){
+            return i;
+        }
+        
+    }
+    cout << "grayToInt error: no matching code found!";
+    return -1;
+}
+//--------------------------------------------------------------
+double Grid::base32toCoord(vector<int> base32Digs) const{
+    // build up the big float from a base 32 number
+    double result = 0.0;
+    
+    // what power of 32 to start at?
+    int mpow = base32Digs.size() - 1; // should be 7...
+    
+    for(int p=0;p<=mpow;p++){ // biggest index is smallest power
+        result += ((double)base32Digs[p]) * pow(32.0, (double)mpow-p);
+        
+    }
+    return result;
+    
+}
+//--------------------------------------------------------------
+// for 1 dimension - takes in 5 cc params and outputs  7 codes
+vector<vector <bool> > Grid::midiToGray(vector<int> ccValue) const{
+    int pow2 = 1 << (paramBitDepth-1);
+    
+    vector<int> aCode(paramsPerDim);
+    vector<vector<int> > theXCodes(paramBitDepth,aCode);
+    
+    // build up binary gray code representations from the bits of the midi ccs
+    
+    vector<vector<bool> > theCodes(paramBitDepth, vector<bool>(paramsPerDim));
+    
+    // x
+    for(int p=0;p<paramBitDepth;p++){
+        
+        for(int i=0;i<paramsPerDim;i++){
+            
+            bool bit = (pow2 == (ccValue[i] & pow2));
+            theCodes[p][i] = bit;
+        }
+        pow2 = pow2 >> 1;
+        
+    }
+    return theCodes;
+}
+
+//--------------------------------------------------------------
+void Grid::makeCode(){
+    
+    ////////////////////////////////~~~,,,,,,,,.........
+    ////////// gray code generation
+    //////
+    ///
+    // TODO 5bit specific
+    // transition sequence.... what a palaver! only need to do once though.
+    
+    // max MRL
+    int trans[] = {0,1,2,3,0,4,2,1,0,3,2,1,0,4,2,3,0,1,2,3,0,4,2,1,0,3,2,1,0,4,2,3};
+    // balanced
+    int transB[] = {1,2,3,4,5,1,5,2,3,5,2,4,2,3,4,1,4,3,2,3,1,5,3,4,1,5,2,5,3,4,1,3};
+    for(int i = 0; i<codeLength; i++){
+        transB[i] = transB[i] - 1;
+    }
+    
+    int code[codeLength][paramsPerDim]; // start with normal array
+    
+    
+    
+    for(int j=0; j<paramsPerDim; j++){
+        code[0][j] = 0;
+    }
+    
+    for(int i=0; i < codeLength-1; i++){  // don't need last 3
+        transSeq.push_back(trans[i]); // member vector
+        for(int j=0; j<paramsPerDim; j++){
+            
+            if (j == abs(trans[i])){
+                code[i+1][j] = !code[i][j];
+            }else{
+                code[i+1][j] = code[i][j];
+            }
+        }
+        
+    }
+    
+    for(int i=0; i < codeLength; i++){ // fill vector
+        
+        vcode.push_back(vector<bool>());
+        
+        for(int j=0; j<paramsPerDim; j++){
+            vcode[i].push_back(code[i][j]);
+        }
+    }
+    /*
+     // now try with iterators to print...
+     vector< vector<bool> >::iterator cit;
+     //vector<bool>::iterator bit;
+     vector<bool>::iterator bit;
+     int i = 0;
+     for(cit=vcode.begin(); cit!=vcode.end() ; cit++){ // fill vector
+     i++;
+     cout << i << " = ";
+     bit = (*cit).begin();
+     for(bit=(*cit).begin(); bit!=(*cit).end() ; bit++){
+     
+     cout  << *bit;
+     }
+     cout << "\n";
+     
+     }
+     
+     // codeToInt unit test
+     vector<bool> aCode = vcode[12];
+     int result = grayToInt(aCode);
+     cout << "GRAY TO INT : " << result << "\n";
+     
+     cout << "-------------------------------\n";
+     
+     // base32toFloat unit test
+     
+     vector<int> test32 = coordTobase32(869437.0);
+     double cresult = base32toCoord(test32);
+     cout << "base32toCoord : " << cresult << "\n";
+     
+     cout << "-------------------------------\n";
+     
+     
+     
+     // midiToGray unit test
+     
+     vector<vector<bool> > incodes(paramBitDepth, vector<bool>(paramsPerDim));
+     for(int i=0;i<7;i++){
+     incodes[i] = vcode[i+5];
+     }
+     
+     vector<int> midiTest;
+     midiTest = grayToMidi(incodes);
+     vector<vector<bool> > outcodes = midiToGray(midiTest);
+     
+     vector< vector<bool> >::iterator cit1;
+     //vector<bool>::iterator bit;
+     vector<bool>::iterator bit1;
+     cout << "midiToGray Unit test\n";
+     for(int i=0;i<paramBitDepth;i++){ // fill vector
+     
+     for(int j=0;j<paramsPerDim;j++){
+     
+     cout  << (incodes[i][j] == outcodes[i][j]) << ",";
+     }
+     cout << "\n";
+     
+     }
+     cout << "-------------------------------\n";
+     
+     
+     // whole process unit test(?)
+     
+     TwoVector inCoord(888999777,777666555);
+     vector<int> checkParam;
+     checkParam = calculateParamsFromCoord(inCoord);
+     for(int i=0; i<2*paramsPerDim;i++){
+     cout << checkParam[i] << "_";
+     }
+     TwoVector outCoord = calculateCoordFromParams(checkParam);
+     cout << "Unit TEst coord = " << outCoord.x << "," << outCoord.y << "\n";
+     */
+    
+}
+//--------------------------------------------------------------
+//--------------------------------------------------------------
+//--------------------------------------------------------------
--- a/presetManager.h	Tue Apr 09 17:14:31 2013 +0100
+++ b/presetManager.h	Wed Apr 10 18:57:05 2013 +0100
@@ -39,6 +39,8 @@
     unsigned long long       creationTime; // datetime that preset was created milliseconds
     vector<ofColor> pixVals; // hmmm
     TwoVector       coordinates;  // position on grid
+    vector<int>     params;         // actual parameters???
+    // not so important - not uploaded
     
     // from save button press
     Preset(TwoVector acoord, string aname,int aID, string un, unsigned int uid){
@@ -104,7 +106,7 @@
     // find and return all(?) presets within a certain coordinate range
     vector<Preset *> thePresets; 
     
-    int addPreset(string name); 
+    int addPreset(string name);
     int loadPreset(const TwoVector coord, const string name, long long stime);
     
     TwoVector recallPreset(int presetID); // by name ? id?
--- a/presetManager.mm	Tue Apr 09 17:14:31 2013 +0100
+++ b/presetManager.mm	Wed Apr 10 18:57:05 2013 +0100
@@ -109,8 +109,11 @@
     
     int i = 0;
     for(presetIter = thePresets.begin(); presetIter < thePresets.end(); presetIter++){
-        root["presets"][i] = (*presetIter)->presetToJson();
-        i++;
+        // only save the preset to file if it was ours... (other users and defaults saved elewhere)
+        if((*presetIter)->creatorDeviceID == eventLogger.deviceID){
+            root["presets"][i] = (*presetIter)->presetToJson();
+            i++;
+        }
     }
 
     return root;
@@ -195,10 +198,13 @@
     }
      */
     // hmm shouldn't have to know about eventlogger and grid view...
-    // TODO get coord might be wrong if in interpolation mode
     
-    thePresets.push_back(new Preset(theGridView.getCoord(), name,nextID, eventLogger.userName, eventLogger.deviceID));
-    eventLogger.logEvent(SAVE_PRESET, theGridView.getCoord());
+    // get the preset coord from the grid
+    TwoVector coord = theGridView.getCoord();
+    
+    
+    thePresets.push_back(new Preset(coord, name,nextID, eventLogger.userName, eventLogger.deviceID));
+    eventLogger.logEvent(SAVE_PRESET, coord);
     // poke grid view to get it to show details
     theGridView.snapCheck();
     // if ok
--- a/testApp.h	Tue Apr 09 17:14:31 2013 +0100
+++ b/testApp.h	Wed Apr 10 18:57:05 2013 +0100
@@ -29,6 +29,10 @@
 #define OSC_HOST "169.254.1.1"
 #define OSC_PORT 12345
 
+#define SLIDER_GUI_WIDTH 720
+#define SLIDER_HEIGHT 256
+#define NUM_PARAMS 10
+
 typedef enum {SLIDERS,ZOOMER,BOTH,INTRO,QUESTIONNAIRE, HELP}interfaceType;
 
 class testApp : public ofxiPhoneApp , public ofxiPhoneExternalDisplay{
@@ -74,7 +78,7 @@
     
     int numActiveTouches;
     bool preventingMovePostScroll;
-
+    void setInterp(int state);
 
     //
     
--- a/testApp.mm	Tue Apr 09 17:14:31 2013 +0100
+++ b/testApp.mm	Wed Apr 10 18:57:05 2013 +0100
@@ -231,17 +231,29 @@
     eventLogger.questionnaireAnswersObtained(answers, userComments);
     
     // tell bottomtabviewcontroller to show and select both interface
-    interfaceSelected(BOTH);
+    interfaceSelected(1);
     [bottomTabViewController show:(id)this withSelection:1];
     
+    [topButtonViewController enableSmoothSwitch:(id)this];
     
 }
 //--------------------------------------------------------------
 // shortcut function for testing
 void testApp::justStart(){
-    interfaceSelected(BOTH);
+    interfaceSelected(1);
     [bottomTabViewController show:(id)this withSelection:1];
-    
+    [topButtonViewController enableSmoothSwitch:(id)this];
+}
+//--------------------------------------------------------------
+void testApp::setInterp(int state){
+    if(state == 0){
+        theGridView.setInterpolation(Grid::NO_INTERPOLATION);
+    }else if(state == 1){
+        theGridView.setInterpolation(Grid::INTERPOLATE_GRID);
+    }
+    // tell sliders and PD
+    setAllGUISliders(theGridView.getParams());
+    sendParametersToPD();
 }
 //--------------------------------------------------------------
 void testApp::showIntro(){