Changeset 0ab8242 in orbit


Ignore:
Timestamp:
08/01/13 08:33:40 (7 years ago)
Author:
Steve Castellotti <sc@…>
Branches:
master, RawEEG, Servo, Tab_Interface, pyramid
Children:
c1c6a1d
Parents:
4da9757 (diff), ce0a7ee (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'RawEEG', remote-tracking branch 'origin' into RawEEG

Files:
12 added
17 edited

Legend:

Unmodified
Added
Removed
  • iOS/Orbit/Orbit/AppDelegate.m

    r9015b1e rce0a7ee  
    2121{ 
    2222    // Override point for customization after application launch. 
    23     NSLog(@"didFinsihLaunching - signal convertor init"); 
    2423    signalConverter = [[SignalConverter alloc] init]; 
    25 //    [[TGAccessoryManager sharedTGAccessoryManager] setupManagerWithInterval:0.05]; 
    26 //    [[TGAccessoryManager sharedTGAccessoryManager] setDelegate:(ViewController *)self.window.rootViewController]; 
    2724    return YES; 
    2825} 
     
    3229    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    3330    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
    34 //    ViewController *rootController = (ViewController *)self.window.rootViewController; 
    35 //    [rootController appClosed]; 
    3631    [signalConverter appStopped]; 
    37     NSLog(@"Application will resign active - appClosed"); 
    3832} 
    3933 
     
    5751{ 
    5852    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    59     NSLog(@"Application will terminate - teardownManager"); 
    6053    [[TGAccessoryManager sharedTGAccessoryManager] teardownManager]; 
    6154} 
  • iOS/Orbit/Orbit/SignalConverter.h

    r9015b1e rce0a7ee  
    1212#import "TGAccessoryDelegate.h" 
    1313#import "SignalConverterDelegate.h" 
     14#import "AudioGenerator.h" 
    1415 
    1516@interface SignalConverter : NSObject <TGAccessoryDelegate> { 
    16     AVAudioPlayer *audioPlayer; 
     17    AudioGenerator *audioPlayer; 
    1718} 
    1819 
     
    2425 
    2526- (void) setValuesForAttention:(float) attention meditation:(float) meditation; 
    26 - (void) prepare; 
    2727- (BOOL) startProcessing; 
    2828- (void) stopProcessing; 
     
    3030- (BOOL) isBluetoothReady; 
    3131- (BOOL) isVolumeMax; 
     32- (void) setYaw:(int)y throttle:(int)t pitch:(int)p; 
    3233 
    3334@end 
  • iOS/Orbit/Orbit/SignalConverter.m

    r9015b1e rce0a7ee  
    2727     
    2828    int signalStrength, attentionLevel, meditationLevel; // the latest readings from the headset 
     29    int yaw, throttle, pitch; 
    2930} 
    3031 
     
    3940        [[TGAccessoryManager sharedTGAccessoryManager] setupManagerWithInterval:0.05]; 
    4041        [[TGAccessoryManager sharedTGAccessoryManager] setDelegate:self]; 
     42        audioPlayer = [[AudioGenerator alloc] init]; 
     43         
     44        // defaults 
     45        throttle = 80; 
     46        yaw = 78; 
     47        pitch = 31; 
    4148    } 
    4249    return self; 
     
    4855    meditationThreshold = meditation; 
    4956    [self calculatePowerValues]; 
    50 } 
    51  
    52 - (void) prepare 
    53 { 
    54     NSURL *audioFilePath = [[NSBundle mainBundle] URLForResource:AUDIO_FILE_NAME withExtension:nil]; 
    55     audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFilePath error:nil]; 
    56     if (audioPlayer) { 
    57         [audioPlayer prepareToPlay]; 
    58     } 
    5957} 
    6058 
     
    142140{ 
    143141    float volume = [[AVAudioSession sharedInstance] outputVolume]; 
    144 //    Float32 volume; 
    145 //    UInt32 dataSize = sizeof(Float32); 
    146 //     
    147 //    AudioSessionGetProperty ( 
    148 //                             kAudioSessionProperty_CurrentHardwareOutputVolume, 
    149 //                             &dataSize, 
    150 //                             &volume 
    151 //                             ); 
    152142    return volume == 1.0; 
    153143} 
     
    171161{ 
    172162    [self appStopped]; 
    173     [self prepare];     
    174163} 
    175164 
     
    187176} 
    188177 
     178- (void) setYaw:(int)y throttle:(int)t pitch:(int)p 
     179{ 
     180    yaw = y; 
     181    throttle = t; 
     182    pitch = p; 
     183} 
     184 
    189185- (void) playAudio 
    190186{ 
    191     //   audioPlayer.volume = [self currentPowerLevel]; 
    192187    if ([self currentPowerLevel] > 0) { 
    193         audioPlayer.volume = 1.0; 
    194         [audioPlayer play]; 
     188        [audioPlayer playWithThrottle:throttle yaw:yaw pitch:pitch]; 
    195189    } else { 
    196190        [audioPlayer stop]; 
    197         [self prepare]; 
    198191         
    199192    } 
     
    229222} 
    230223 
    231 // calculate the checksum for the generated code used to generate the WAV array 
    232 - (int) codeChecksum:(int)code 
    233 { 
    234     int checksum = 0; 
    235     for (int i = 0; i < 7; i++) { 
    236         checksum += (code >> 4*i) & 15; 
    237     } 
    238     return 16 - (checksum & 15); 
    239 } 
    240  
    241 // Generate the code used to create the WAV file based on the given throttle, yaw and pitch. 
    242 // Copied from AudioService.java in the Android app 
    243 // throttle: 0~127, nothing will happen if this value is below 30. 
    244 // yaw: 0~127, normally 78 will keep orbit from rotating. 
    245 // pitch: 0~63, normally 31 will stop the top propeller. 
    246 // channel: 1=Channel A, 0=Channel B 2= Channel C, depend on which channel you want to pair to the orbit. You can fly at most 3 orbit in a same room. 
    247 - (int) generateCodeFromThrottle: (int)throttle yaw: (int)yaw pitch: (int)pitch channel: (int)channel 
    248 { 
    249     int code = (throttle << 21) + 1048576 + (yaw << 12) + (pitch << 4) + (((channel >> 1) & 1) << 19) + ((channel & 1) << 11); 
    250     return code;// + codeChecksum(code); 
    251 } 
    252  
    253224@end 
  • iOS/Orbit/Orbit/controllers/AdvancedViewController.m

    rab9d63b rce0a7ee  
    88 
    99#import "AdvancedViewController.h" 
     10#import "SignalConverter.h" 
     11#import "AppDelegate.h" 
    1012 
    1113@interface AdvancedViewController () 
     
    1315@end 
    1416 
    15 @implementation AdvancedViewController 
     17@implementation AdvancedViewController { 
     18    SignalConverter *signalConverter; 
     19} 
    1620 
    1721@synthesize pitch, pitchPercent, yaw, yawPercent, throttle, throttlePercent; 
     22 
     23- (void)viewDidLoad 
     24{ 
     25    [super viewDidLoad]; 
     26    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     27    signalConverter = appDelegate.signalConverter; 
     28} 
    1829 
    1930- (IBAction) pitchChanged:(id) sender 
    2031{ 
    2132    pitchPercent.text = [self percentStringFromSlider:pitch]; 
     33    [self adjustValues]; 
    2234} 
    2335 
     
    2537{ 
    2638    yawPercent.text = [self percentStringFromSlider:yaw]; 
     39    [self adjustValues]; 
    2740} 
    2841 
     
    3043{ 
    3144    throttlePercent.text = [self percentStringFromSlider:throttle]; 
     45    [self adjustValues]; 
    3246} 
    3347 
     
    3751} 
    3852 
     53- (void) adjustValues 
     54{ 
     55     
     56} 
     57 
    3958@end 
  • iOS/Orbit/Orbit/controllers/FlightViewController.m

    r9015b1e rce0a7ee  
    2323@implementation FlightViewController { 
    2424    SignalConverter *signalConverter; 
    25     int deviceStatus; 
     25    int deviceStatus;     
    2626} 
    2727 
     
    3737    [self.attentionThreshold addTarget:self action:@selector(sliderChanged) forControlEvents:UIControlEventValueChanged]; 
    3838    [self.meditationThreshold addTarget:self action:@selector(sliderChanged) forControlEvents:UIControlEventValueChanged]; 
    39     [signalConverter prepare]; 
    4039} 
    4140 
     
    151150    } else if ([signalConverter startProcessing]) { 
    152151        [self logMessage:@"Searching for device"]; 
    153 //        [self updateStatusImage:STATUS_CONNECTING]; 
    154152        connectButton.title = @"Disconnect"; 
    155153    } else { 
  • iOS/Orbit/Orbit/controllers/SupportViewController.m

    rab9d63b rce0a7ee  
    3333} 
    3434 
    35 - (void)didReceiveMemoryWarning 
    36 { 
    37     [super didReceiveMemoryWarning]; 
    38     // Dispose of any resources that can be recreated. 
    39 } 
    40  
    4135#pragma mark UIWebViewDelegate methods 
    4236 
    43 - (void)webViewDidStartLoad:(UIWebView *)webView 
     37- (void)webViewDidFinishLoad:(UIWebView *)webView 
    4438{ 
    4539    retryButton.hidden = YES; 
  • iOS/Orbit/Orbit/controllers/TutorialViewController.m

    rab9d63b rce0a7ee  
    1111@implementation TutorialViewController 
    1212 
     13@synthesize webView; 
    1314 
    1415- (void)viewDidLoad 
    1516{ 
     17    NSString *file = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 
     18    NSString *html = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil]; 
     19    [webView loadHTMLString:html baseURL:nil]; 
    1620    [super viewDidLoad]; 
    17      
    1821} 
    1922@end 
  • iOS/Orbit/Orbit/en.lproj/MainStoryboard.storyboard

    r9015b1e rce0a7ee  
    4646                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 
    4747                    </view> 
    48                     <tabBarItem key="tabBarItem" title="Support" id="cac-uP-cgJ"/> 
     48                    <tabBarItem key="tabBarItem" title="Support" image="help.png" id="cac-uP-cgJ"/> 
    4949                    <connections> 
    5050                        <outlet property="retryButton" destination="ito-kx-zLv" id="yP6-IV-eHf"/> 
     
    195195                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> 
    196196                    </view> 
    197                     <tabBarItem key="tabBarItem" title="Advanced" id="cd7-uP-s8P"/> 
     197                    <tabBarItem key="tabBarItem" title="Advanced" image="advanced.png" id="cd7-uP-s8P"/> 
    198198                    <connections> 
    199199                        <outlet property="pitch" destination="pE4-wd-89x" id="Sbm-iD-GAE"/> 
     
    382382                        <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> 
    383383                    </view> 
    384                     <tabBarItem key="tabBarItem" title="Flight" id="ysb-Df-cyR"/> 
     384                    <tabBarItem key="tabBarItem" title="Flight" image="plane.png" id="ysb-Df-cyR"/> 
    385385                    <navigationItem key="navigationItem" id="iTN-dz-EXc"/> 
    386386                    <connections> 
     
    423423                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 
    424424                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> 
     425                                <dataDetectorType key="dataDetectorTypes"/> 
    425426                                <connections> 
    426427                                    <outlet property="delegate" destination="Wc6-MU-jew" id="cBE-hV-4Fe"/> 
     
    430431                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 
    431432                    </view> 
    432                     <tabBarItem key="tabBarItem" title="Tutorial" id="JJR-hA-hnf"/> 
     433                    <tabBarItem key="tabBarItem" title="Tutorial" image="tutorial.png" id="JJR-hA-hnf"/> 
     434                    <connections> 
     435                        <outlet property="webView" destination="yFF-oy-BYh" id="UOH-dC-3Mk"/> 
     436                    </connections> 
    433437                </viewController> 
    434438                <placeholder placeholderIdentifier="IBFirstResponder" id="phY-I4-vyg" userLabel="First Responder" sceneMemberID="firstResponder"/> 
     
    459463    </scenes> 
    460464    <resources> 
     465        <image name="advanced.png" width="20" height="20"/> 
     466        <image name="help.png" width="20" height="20"/> 
     467        <image name="plane.png" width="20" height="20"/> 
    461468        <image name="status_0.png" width="238" height="213"/> 
     469        <image name="tutorial.png" width="20" height="20"/> 
    462470    </resources> 
    463471    <classes> 
  • iOS/Orbit/orbit.xcodeproj/project.pbxproj

    r9015b1e rce0a7ee  
    88 
    99/* Begin PBXBuildFile section */ 
     10                280D2AB517A802DB002D6863 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 280D2AB417A802DB002D6863 /* index.html */; }; 
     11                280D2ABE17A81714002D6863 /* advanced.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2AB617A81714002D6863 /* advanced.png */; }; 
     12                280D2ABF17A81714002D6863 /* advanced@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2AB717A81714002D6863 /* advanced@2x.png */; }; 
     13                280D2AC017A81714002D6863 /* help.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2AB817A81714002D6863 /* help.png */; }; 
     14                280D2AC117A81714002D6863 /* help@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2AB917A81714002D6863 /* help@2x.png */; }; 
     15                280D2AC217A81714002D6863 /* plane.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2ABA17A81714002D6863 /* plane.png */; }; 
     16                280D2AC317A81714002D6863 /* plane@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2ABB17A81714002D6863 /* plane@2x.png */; }; 
     17                280D2AC417A81714002D6863 /* tutorial.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2ABC17A81714002D6863 /* tutorial.png */; }; 
     18                280D2AC517A81714002D6863 /* tutorial@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 280D2ABD17A81714002D6863 /* tutorial@2x.png */; }; 
    1019                2815BC0E167F42F500F7E6DA /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2815BC0C167F42F500F7E6DA /* Accelerate.framework */; }; 
    1120                2815BC0F167F42F500F7E6DA /* ExternalAccessory.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2815BC0D167F42F500F7E6DA /* ExternalAccessory.framework */; }; 
     
    2938                2843FE8F1790205900C79D56 /* status_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 2843FE871790205900C79D56 /* status_4.png */; }; 
    3039                2843FE901790205900C79D56 /* status_4@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2843FE881790205900C79D56 /* status_4@2x.png */; }; 
     40                286608E417A7D40F003FA806 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 286608E317A7D40F003FA806 /* AudioToolbox.framework */; }; 
    3141                288B4BC0178EB112007D588D /* status_0@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 288B4BBF178EB112007D588D /* status_0@2x.png */; }; 
    3242                288B4BC3178ECD0B007D588D /* AdvancedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 288B4BC2178ECD0B007D588D /* AdvancedViewController.m */; }; 
     
    3949                28C10EF1168760CA00ECFD59 /* HOW_TO_USE.txt in Resources */ = {isa = PBXBuildFile; fileRef = 28C10EF0168760CA00ECFD59 /* HOW_TO_USE.txt */; }; 
    4050                28F901301799436F003FB5ED /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28F9012F1799436F003FB5ED /* CoreBluetooth.framework */; }; 
     51                28F90133179973EC003FB5ED /* AudioGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 28F90132179973EC003FB5ED /* AudioGenerator.m */; }; 
    4152                52922BA817004D1400A39146 /* libCorePlot-CocoaTouch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 52922BA717004D1400A39146 /* libCorePlot-CocoaTouch.a */; }; 
    4253                52FA364416899B5D004C280A /* ic_launcher-57x57.png in Resources */ = {isa = PBXBuildFile; fileRef = 52FA364316899B5D004C280A /* ic_launcher-57x57.png */; }; 
     
    4657 
    4758/* Begin PBXFileReference section */ 
     59                280D2AB417A802DB002D6863 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; }; 
     60                280D2AB617A81714002D6863 /* advanced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = advanced.png; sourceTree = "<group>"; }; 
     61                280D2AB717A81714002D6863 /* advanced@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "advanced@2x.png"; sourceTree = "<group>"; }; 
     62                280D2AB817A81714002D6863 /* help.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = help.png; sourceTree = "<group>"; }; 
     63                280D2AB917A81714002D6863 /* help@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "help@2x.png"; sourceTree = "<group>"; }; 
     64                280D2ABA17A81714002D6863 /* plane.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = plane.png; sourceTree = "<group>"; }; 
     65                280D2ABB17A81714002D6863 /* plane@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "plane@2x.png"; sourceTree = "<group>"; }; 
     66                280D2ABC17A81714002D6863 /* tutorial.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tutorial.png; sourceTree = "<group>"; }; 
     67                280D2ABD17A81714002D6863 /* tutorial@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tutorial@2x.png"; sourceTree = "<group>"; }; 
    4868                2815BC0C167F42F500F7E6DA /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 
    4969                2815BC0D167F42F500F7E6DA /* ExternalAccessory.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExternalAccessory.framework; path = System/Library/Frameworks/ExternalAccessory.framework; sourceTree = SDKROOT; }; 
     
    7494                2843FE871790205900C79D56 /* status_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = status_4.png; sourceTree = "<group>"; }; 
    7595                2843FE881790205900C79D56 /* status_4@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "status_4@2x.png"; sourceTree = "<group>"; }; 
     96                286608E317A7D40F003FA806 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 
    7697                288B4BBF178EB112007D588D /* status_0@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "status_0@2x.png"; sourceTree = "<group>"; }; 
    7798                288B4BC1178ECD0A007D588D /* AdvancedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AdvancedViewController.h; path = controllers/AdvancedViewController.h; sourceTree = "<group>"; }; 
     
    90111                28C10EF0168760CA00ECFD59 /* HOW_TO_USE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HOW_TO_USE.txt; sourceTree = "<group>"; }; 
    91112                28F9012F1799436F003FB5ED /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; }; 
     113                28F90131179973EC003FB5ED /* AudioGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioGenerator.h; sourceTree = "<group>"; }; 
     114                28F90132179973EC003FB5ED /* AudioGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioGenerator.m; sourceTree = "<group>"; }; 
    92115                52922BA717004D1400A39146 /* libCorePlot-CocoaTouch.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libCorePlot-CocoaTouch.a"; sourceTree = "<group>"; }; 
    93116                52922BA917004D4400A39146 /* CorePlot-CocoaTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CorePlot-CocoaTouch.h"; sourceTree = "<group>"; }; 
     
    176199                        buildActionMask = 2147483647; 
    177200                        files = ( 
     201                                286608E417A7D40F003FA806 /* AudioToolbox.framework in Frameworks */, 
    178202                                28F901301799436F003FB5ED /* CoreBluetooth.framework in Frameworks */, 
    179203                                52922BA817004D1400A39146 /* libCorePlot-CocoaTouch.a in Frameworks */, 
     
    192216 
    193217/* Begin PBXGroup section */ 
     218                280D2AB317A802C7002D6863 /* Tutorial */ = { 
     219                        isa = PBXGroup; 
     220                        children = ( 
     221                                280D2AB417A802DB002D6863 /* index.html */, 
     222                        ); 
     223                        name = Tutorial; 
     224                        sourceTree = "<group>"; 
     225                }; 
    194226                2815BC08167F428B00F7E6DA /* Libraries */ = { 
    195227                        isa = PBXGroup; 
     
    208240                        isa = PBXGroup; 
    209241                        children = ( 
     242                                280D2AB317A802C7002D6863 /* Tutorial */, 
     243                                286608E317A7D40F003FA806 /* AudioToolbox.framework */, 
    210244                                28F9012F1799436F003FB5ED /* CoreBluetooth.framework */, 
    211245                                289C7D0F178D7A21005C08EC /* Images */, 
     
    263297                                288B4BC8178F016F007D588D /* SignalConverter.m */, 
    264298                                288B4BCA178F0842007D588D /* SignalConverterDelegate.h */, 
     299                                28F90131179973EC003FB5ED /* AudioGenerator.h */, 
     300                                28F90132179973EC003FB5ED /* AudioGenerator.m */, 
    265301                        ); 
    266302                        path = Orbit; 
     
    282318                        isa = PBXGroup; 
    283319                        children = ( 
     320                                280D2AB617A81714002D6863 /* advanced.png */, 
     321                                280D2AB717A81714002D6863 /* advanced@2x.png */, 
     322                                280D2AB817A81714002D6863 /* help.png */, 
     323                                280D2AB917A81714002D6863 /* help@2x.png */, 
     324                                280D2ABA17A81714002D6863 /* plane.png */, 
     325                                280D2ABB17A81714002D6863 /* plane@2x.png */, 
     326                                280D2ABC17A81714002D6863 /* tutorial.png */, 
     327                                280D2ABD17A81714002D6863 /* tutorial@2x.png */, 
    284328                                289C7D14178D7A34005C08EC /* status_0.png */, 
    285329                                288B4BBF178EB112007D588D /* status_0@2x.png */, 
     
    445489                                2843FE8F1790205900C79D56 /* status_4.png in Resources */, 
    446490                                2843FE901790205900C79D56 /* status_4@2x.png in Resources */, 
     491                                280D2AB517A802DB002D6863 /* index.html in Resources */, 
     492                                280D2ABE17A81714002D6863 /* advanced.png in Resources */, 
     493                                280D2ABF17A81714002D6863 /* advanced@2x.png in Resources */, 
     494                                280D2AC017A81714002D6863 /* help.png in Resources */, 
     495                                280D2AC117A81714002D6863 /* help@2x.png in Resources */, 
     496                                280D2AC217A81714002D6863 /* plane.png in Resources */, 
     497                                280D2AC317A81714002D6863 /* plane@2x.png in Resources */, 
     498                                280D2AC417A81714002D6863 /* tutorial.png in Resources */, 
     499                                280D2AC517A81714002D6863 /* tutorial@2x.png in Resources */, 
    447500                        ); 
    448501                        runOnlyForDeploymentPostprocessing = 0; 
     
    463516                                288B4BC6178ED362007D588D /* SupportViewController.m in Sources */, 
    464517                                288B4BC9178F016F007D588D /* SignalConverter.m in Sources */, 
     518                                28F90133179973EC003FB5ED /* AudioGenerator.m in Sources */, 
    465519                        ); 
    466520                        runOnlyForDeploymentPostprocessing = 0; 
  • android/.classpath

    rd6fbdfb r4f3fd92  
    88        <classpathentry kind="src" path="src"/> 
    99        <classpathentry kind="src" path="gen"/> 
     10        <classpathentry exported="true" kind="lib" path="libs/androidplot-core-0.6.0.jar"/> 
    1011        <classpathentry kind="output" path="bin/classes"/> 
    1112</classpath> 
  • android/AndroidManifest.xml

    rc298bcb r81fb7d8  
    22<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    33    package="info.puzzlebox.orbit" 
    4     android:versionCode="2" 
    5     android:versionName="1.2.0" > 
     4    android:versionCode="3" 
     5    android:versionName="1.2.2" > 
    66 
    77    <uses-sdk 
    88        android:minSdkVersion="8" 
    9         android:targetSdkVersion="15" /> 
     9        android:targetSdkVersion="17" /> 
    1010 
    1111    <uses-permission android:name="android.permission.BLUETOOTH" /> 
     
    1717        android:icon="@drawable/ic_launcher" 
    1818        android:label="@string/app_name" 
    19         android:theme="@style/AppTheme" > 
     19        android:theme="@style/AppTheme" 
     20        android:allowBackup="true" > 
     21         
    2022        <activity 
    2123            android:name=".OrbitActivity" 
  • android/res/layout-large/activity_main.xml

    r5c11ea9 r81fb7d8  
    4545        android:layout_height="wrap_content" 
    4646        android:max="100" 
    47         android:progress="82" 
     47        android:progress="0" 
    4848        android:progressDrawable="@xml/progress_drawable" 
    4949        android:thumb="@xml/thumb_drawable" /> 
     
    124124            android:text="@string/checkbox_advanced_options" /> 
    125125    </LinearLayout> 
     126 
     127    <com.androidplot.xy.XYPlot 
     128        android:id="@+id/eegRawHistoryPlot" 
     129        android:layout_width="fill_parent" 
     130        android:layout_height="200dp" 
     131        android:layout_marginLeft="0dp" 
     132        android:layout_marginRight="0dp" 
     133        android:layout_marginTop="0dp" 
     134        android:layout_weight="1" 
     135        title="EEG Raw Wave" /> 
    126136 
    127137    <LinearLayout 
  • android/res/layout-small/activity_main.xml

    r8358488 r81fb7d8  
    4545        android:layout_height="wrap_content" 
    4646        android:max="100" 
    47         android:progress="82" 
     47        android:progress="0" 
    4848        android:progressDrawable="@xml/progress_drawable" 
    4949        android:thumb="@xml/thumb_drawable" /> 
     
    127127            android:text="@string/checkbox_advanced_options" /> 
    128128    </LinearLayout> 
     129 
     130    <com.androidplot.xy.XYPlot 
     131        android:id="@+id/eegRawHistoryPlot" 
     132        android:layout_width="fill_parent" 
     133        android:layout_height="100dp" 
     134        android:layout_marginLeft="0dp" 
     135        android:layout_marginRight="0dp" 
     136        android:layout_marginTop="0dp" 
     137        android:layout_weight="1" 
     138        title="EEG Raw Wave" /> 
    129139 
    130140    <LinearLayout 
  • android/res/layout-xlarge/activity_main.xml

    r8358488 r81fb7d8  
    4545        android:layout_height="wrap_content" 
    4646        android:max="100" 
    47         android:progress="82" 
     47        android:progress="0" 
    4848        android:progressDrawable="@xml/progress_drawable" 
    4949        android:thumb="@xml/thumb_drawable" /> 
     
    124124            android:text="@string/checkbox_advanced_options" /> 
    125125    </LinearLayout> 
     126 
     127    <com.androidplot.xy.XYPlot 
     128        android:id="@+id/eegRawHistoryPlot" 
     129        android:layout_width="fill_parent" 
     130        android:layout_height="200dp" 
     131        android:layout_marginLeft="0dp" 
     132        android:layout_marginRight="0dp" 
     133        android:layout_marginTop="0dp" 
     134        android:layout_weight="1" 
     135        title="EEG Raw Wave" /> 
    126136 
    127137    <LinearLayout 
  • android/res/layout/activity_main.xml

    r5c11ea9 r81fb7d8  
    4545        android:layout_height="wrap_content" 
    4646        android:max="100" 
    47         android:progress="82" 
     47        android:progress="0" 
    4848        android:progressDrawable="@xml/progress_drawable" 
    4949        android:thumb="@xml/thumb_drawable" /> 
     
    127127            android:text="@string/checkbox_advanced_options" /> 
    128128    </LinearLayout> 
     129 
     130    <com.androidplot.xy.XYPlot 
     131        android:id="@+id/eegRawHistoryPlot" 
     132        android:layout_width="fill_parent" 
     133        android:layout_height="100dp" 
     134        android:layout_marginLeft="0dp" 
     135        android:layout_marginRight="0dp" 
     136        android:layout_marginTop="0dp" 
     137        android:layout_weight="1" 
     138        title="EEG Raw Wave" /> 
    129139 
    130140    <LinearLayout 
  • android/src/info/puzzlebox/orbit/OrbitActivity.java

    rd6fbdfb r4da9757  
    1414 *       all USB Serial support to OrbitUSBActivity. 
    1515 */ 
     16 
     17import java.text.DecimalFormat; 
     18import java.util.Arrays; 
    1619 
    1720import android.media.AudioManager; 
     
    5558import com.neurosky.thinkgear.TGDevice; 
    5659 
     60import com.androidplot.xy.*; 
     61 
    5762 
    5863public class OrbitActivity extends Activity implements SeekBar.OnSeekBarChangeListener { 
     
    6873        boolean eegConnecting = false; 
    6974        boolean demoFlightMode = false; 
     75        Number[] rawEEG = new Number[512]; 
     76        int arrayIndex = 0; 
    7077 
    7178 
     
    97104        int viewSpaceGenerateAudioWidth = 120; 
    98105 
     106        private static final int EEG_RAW_HISTORY_SIZE = 512;            // number of points to plot in EEG history 
     107        private XYPlot eegRawHistoryPlot = null; 
     108        private SimpleXYSeries eegRawHistorySeries = null; 
     109 
     110 
    99111        LinearLayout layoutControl; 
    100112        LinearLayout layoutAudioService; 
     
    154166        int maximumPower = 100; // maximum power for the helicopter throttle 
    155167        String currentCommand = "neutral"; 
    156         final boolean rawEnabled = false; 
     168        //      final boolean rawEnabled = false; 
     169        final boolean rawEnabled = true; 
    157170 
    158171 
     
    228241                progressBarPower.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal)); 
    229242 
     243 
     244                // setup the Raw EEG History plot 
     245                eegRawHistoryPlot = (XYPlot) findViewById(R.id.eegRawHistoryPlot); 
     246                eegRawHistorySeries = new SimpleXYSeries("Raw EEG"); 
     247 
     248                // Use index value as xVal, instead of explicit, user provided xVals. 
     249                //              eegRawHistorySeries.useImplicitXVals(); 
     250 
     251                // Setup the boundary mode, boundary values only applicable in FIXED mode. 
     252                eegRawHistoryPlot.setDomainBoundaries(0, EEG_RAW_HISTORY_SIZE, BoundaryMode.FIXED); 
     253                //              eegRawHistoryPlot.setDomainBoundaries(0, EEG_RAW_HISTORY_SIZE, BoundaryMode.AUTO); 
     254                //              eegRawHistoryPlot.setRangeBoundaries(-32767, 32767, BoundaryMode.FIXED); 
     255                //              eegRawHistoryPlot.setRangeBoundaries(-32767, 32767, BoundaryMode.AUTO); 
     256                eegRawHistoryPlot.setRangeBoundaries(-256, 256, BoundaryMode.GROW); 
     257 
     258                eegRawHistoryPlot.addSeries(eegRawHistorySeries, new LineAndPointFormatter(Color.rgb(200, 100, 100), Color.BLACK, null, null)); 
     259 
     260                // Thin out domain and range tick values so they don't overlap 
     261                eegRawHistoryPlot.setDomainStepValue(5); 
     262                eegRawHistoryPlot.setTicksPerRangeLabel(3); 
     263 
     264                //              eegRawHistoryPlot.setRangeLabel("Amplitude"); 
     265 
     266                // Sets the dimensions of the widget to exactly contain the text contents 
     267                eegRawHistoryPlot.getDomainLabelWidget().pack(); 
     268                eegRawHistoryPlot.getRangeLabelWidget().pack(); 
     269 
     270                // Only display whole numbers in labels 
     271                eegRawHistoryPlot.getGraphWidget().setDomainValueFormat(new DecimalFormat("0")); 
     272                eegRawHistoryPlot.getGraphWidget().setRangeValueFormat(new DecimalFormat("0")); 
     273 
     274                // Hide domain and range labels 
     275                eegRawHistoryPlot.getGraphWidget().setDomainLabelWidth(0); 
     276                eegRawHistoryPlot.getGraphWidget().setRangeLabelWidth(0); 
     277 
     278                // Hide legend 
     279                eegRawHistoryPlot.getLegendWidget().setVisible(false); 
     280 
     281                // setGridPadding(float left, float top, float right, float bottom)  
     282                eegRawHistoryPlot.getGraphWidget().setGridPadding(0, 0, 0, 0);  
     283 
     284                //              eegRawHistoryPlot.getGraphWidget().setDrawMarkersEnabled(false); 
     285 
     286                //              final PlotStatistics histStats = new PlotStatistics(1000, false); 
     287                //              eegRawHistoryPlot.addListener(histStats); 
     288 
     289 
    230290                seekBarAttention = (SeekBar)findViewById(R.id.seekBarAttention); 
    231291                seekBarAttention.setOnSeekBarChangeListener(this); 
     
    266326                tv.setMovementMethod(new ScrollingMovementMethod()); 
    267327                tv.setText(""); 
    268                 appendTextAndScroll("Android version: " + Integer.valueOf(android.os.Build.VERSION.SDK) + "\n" ); 
     328                appendTextAndScroll("Android version: " + Integer.valueOf(android.os.Build.VERSION.SDK_INT) + "\n" ); 
    269329                appendTextAndScroll("Remember to set volume at maximum!\n"); 
    270330 
     
    445505                //              viewSpaceGenerateAudioWidth = LayoutParams.MATCH_PARENT; 
    446506 
     507                @SuppressWarnings("deprecation") 
    447508                int width = getWindowManager().getDefaultDisplay().getWidth(); 
    448                 int height = getWindowManager().getDefaultDisplay().getHeight(); 
     509                //              int height = getWindowManager().getDefaultDisplay().getHeight(); 
    449510 
    450511                viewSpaceGenerateAudioWidth = width / 4; // approximate center of screen 
     
    487548 
    488549                        if (checkBoxGenerateAudio.isChecked()) { 
     550 
    489551                                layoutAudioService.setVisibility(View.VISIBLE); 
    490552                                layoutInvertControlSignal.setVisibility(View.VISIBLE); 
     
    496558 
    497559                        } else { 
     560 
    498561                                layoutAudioService.setVisibility(View.GONE); 
    499562                                layoutInvertControlSignal.setVisibility(View.GONE); 
     
    506569                        } 
    507570 
     571                        eegRawHistoryPlot.setVisibility(View.VISIBLE); 
    508572                        layoutAdvancedOptions.setVisibility(View.VISIBLE); 
     573                        imageViewStatus.setVisibility(View.GONE); 
    509574                        tv.setVisibility(View.VISIBLE); 
    510575 
    511576                } else { 
    512577 
     578                        eegRawHistoryPlot.setVisibility(View.GONE); 
    513579                        layoutAudioService.setVisibility(View.GONE); 
    514580                        layoutAdvancedOptions.setVisibility(View.GONE); 
     581                        imageViewStatus.setVisibility(View.VISIBLE); 
    515582                        tv.setVisibility(View.GONE); 
    516583 
     
    689756                                break; 
    690757                        case TGDevice.MSG_RAW_DATA: 
    691                                 //raw1 = msg.arg1; 
    692                                 //tv.append("Got raw: " + msg.arg1 + "\n"); 
     758 
     759                                rawEEG[arrayIndex] = msg.arg1; 
     760                                arrayIndex = arrayIndex + 1; 
     761 
     762                                if (arrayIndex == EEG_RAW_HISTORY_SIZE - 1) 
     763                                        updateEEGRawHistory(); 
     764 
    693765                                break; 
    694766                        case TGDevice.MSG_HEART_RATE: 
     
    9381010                 * which is used to fly the helicopter 
    9391011                 */ 
    940                  
    941         // Set Attention and Meditation to zero if we've lost signal 
    942         if (eegSignal < 100) { 
    943                 eegAttention = 0; 
    944                 eegMeditation = 0; 
    945                 progressBarAttention.setProgress(eegAttention); 
    946                 progressBarMeditation.setProgress(eegMeditation); 
    947         } 
     1012 
     1013                // Set Attention and Meditation to zero if we've lost signal 
     1014                if (eegSignal < 100) { 
     1015                        eegAttention = 0; 
     1016                        eegMeditation = 0; 
     1017                        progressBarAttention.setProgress(eegAttention); 
     1018                        progressBarMeditation.setProgress(eegMeditation); 
     1019                } 
    9481020 
    9491021                eegPower = calculateSpeed(); 
     
    9761048 
    9771049        } // updatePower 
     1050 
     1051 
     1052        // ################################################################ 
     1053 
     1054        public void updateEEGRawHistory() { 
     1055 
     1056                eegRawHistoryPlot.removeSeries(eegRawHistorySeries); 
     1057 
     1058                eegRawHistorySeries = new SimpleXYSeries(Arrays.asList(rawEEG), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Raw EEG"); 
     1059 
     1060                //              LineAndPointFormatter format = new LineAndPointFormatter(Color.rgb(200, 100, 100), Color.BLACK, null, null); 
     1061                //              LineAndPointFormatter format = new LineAndPointFormatter(Color.rgb(200, 100, 100), Color.TRANSPARENT, null, null); 
     1062                LineAndPointFormatter format = new LineAndPointFormatter(Color.rgb(0, 0, 0), Color.TRANSPARENT, null, null); 
     1063 
     1064                //              format.getFillPaint().setAlpha(220); 
     1065 
     1066                eegRawHistoryPlot.addSeries(eegRawHistorySeries, format); 
     1067 
     1068 
     1069                // redraw the Plots: 
     1070                eegRawHistoryPlot.redraw(); 
     1071 
     1072                rawEEG = new Number[512]; 
     1073                arrayIndex = 0; 
     1074 
     1075        } 
    9781076 
    9791077 
Note: See TracChangeset for help on using the changeset viewer.