Mercurial > hg > soniczoomios
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(){