Changeset 544a7a5 in orbit


Ignore:
Timestamp:
01/17/15 14:56:43 (7 years ago)
Author:
Steve Castellotti <sc@…>
Branches:
master
Children:
0dfbfdb
Parents:
d98642d
Message:
  • initial Puzzlebox Bloom support added
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • iOS/Orbit/Orbit/controllers/AdvancedViewController.h

    rc1a500d r544a7a5  
    1313 
    1414#if TARGET_IPHONE_SIMULATOR 
    15    Boolean CORE_MOTION = false; 
     15    #import <CoreMotion/CoreMotion.h> 
     16    Boolean CORE_MOTION = false; 
    1617#else 
    17    #import <CoreMotion/CoreMotion.h> 
    18    #define __CORE_MOTION__ 
    19    Boolean CORE_MOTION = true; 
     18    #import <CoreMotion/CoreMotion.h> 
     19    #define __CORE_MOTION__ 
     20    Boolean CORE_MOTION = true; 
    2021#endif 
    2122 
     
    6566- (IBAction) changeSwitchTiltSensorControlThrottle:(id)sender; 
    6667 
    67 #ifdef __CORE_MOTION__ 
    68    @property (strong, nonatomic) CMMotionManager *motionManager; 
    69 #endif 
     68//#ifdef __CORE_MOTION__ 
     69@property (strong, nonatomic) CMMotionManager *motionManager; 
     70//#endif 
    7071 
    7172@end 
  • iOS/Orbit/Orbit/controllers/AdvancedViewController.m

    r52de6cb r544a7a5  
    1616 
    1717@implementation AdvancedViewController { 
    18    SignalConverter *signalConverter; 
     18    SignalConverter *signalConverter; 
    1919} 
    2020 
     
    2323- (void)viewDidLoad 
    2424{ 
    25    [super viewDidLoad]; 
    26    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    27    signalConverter = appDelegate.signalConverter; 
    28     
    29    //   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Help Wanted" message:@"Please join our Open Source development community to help us port this feature! See link to Forums under Support tab" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    30    //   [alert show]; 
    31     
    32    // Core Motion 
    33    @try { 
    34       self.motionManager = [[CMMotionManager alloc] init]; 
    35       self.motionManager.accelerometerUpdateInterval = .2; 
    36       self.motionManager.gyroUpdateInterval = .2; 
    37       //   self.motionManager.accelerometerUpdateInterval = .1; 
    38       //   self.motionManager.gyroUpdateInterval = .1; 
    39        
    40       [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
    41                                                withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
    42                                                   [self outputAccelertionData:accelerometerData.acceleration]; 
    43                                                   if(error){ 
    44                                                      NSLog(@"%@", error); 
    45                                                   } 
    46                                                }]; 
    47        
    48       [self.motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] 
    49                                       withHandler:^(CMGyroData *gyroData, NSError *error) { 
    50                                          [self outputRotationData:gyroData.rotationRate]; 
    51                                       }]; 
    52    } 
    53    @catch (NSException * e) { 
    54       NSLog(@"Exception: %@", e); 
    55    } 
    56  
    57        
     25    [super viewDidLoad]; 
     26    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     27    signalConverter = appDelegate.signalConverter; 
     28     
     29    //   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Help Wanted" message:@"Please join our Open Source development community to help us port this feature! See link to Forums under Support tab" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
     30    //   [alert show]; 
     31     
     32    // Core Motion 
     33    if (CORE_MOTION) { 
     34        @try { 
     35            self.motionManager = [[CMMotionManager alloc] init]; 
     36            self.motionManager.accelerometerUpdateInterval = .2; 
     37            self.motionManager.gyroUpdateInterval = .2; 
     38            //   self.motionManager.accelerometerUpdateInterval = .1; 
     39            //   self.motionManager.gyroUpdateInterval = .1; 
     40             
     41            [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 
     42                                                     withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
     43                                                         [self outputAccelertionData:accelerometerData.acceleration]; 
     44                                                         if(error){ 
     45                                                             NSLog(@"%@", error); 
     46                                                         } 
     47                                                     }]; 
     48             
     49            [self.motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue] 
     50                                            withHandler:^(CMGyroData *gyroData, NSError *error) { 
     51                                                [self outputRotationData:gyroData.rotationRate]; 
     52                                            }]; 
     53        } 
     54        @catch (NSException * e) { 
     55            NSLog(@"Exception: %@", e); 
     56        } 
     57    } 
     58     
    5859} 
    5960 
    6061- (void) resetValues:(id) sender 
    6162{ 
    62    pitch.value = defaultControlPitch; 
    63    yaw.value = defaultControlYaw; 
    64    throttle.value = defaultControlThrottle; 
    65    NSString *zero = @"0%"; 
    66    throttlePercent.text = zero; 
    67    yawPercent.text = zero; 
    68    pitchPercent.text = zero; 
    69    [self adjustValues]; 
     63    pitch.value = defaultControlPitch; 
     64    yaw.value = defaultControlYaw; 
     65    throttle.value = defaultControlThrottle; 
     66    NSString *zero = @"0%"; 
     67    throttlePercent.text = zero; 
     68    yawPercent.text = zero; 
     69    pitchPercent.text = zero; 
     70    [self adjustValues]; 
    7071} 
    7172 
    7273- (IBAction) resetButtonPressed:(id) button 
    7374{ 
    74    [self resetValues:(button)]; 
     75    [self resetValues:(button)]; 
    7576} 
    7677 
    7778- (IBAction) pitchChanged:(id) sender 
    7879{ 
    79    pitchPercent.text = [self percentStringFromSlider:pitch]; 
    80    [self adjustValues]; 
     80    pitchPercent.text = [self percentStringFromSlider:pitch]; 
     81    [self adjustValues]; 
    8182} 
    8283 
    8384- (IBAction) yawChanged:(id) sender 
    8485{ 
    85    yawPercent.text = [self percentStringFromSlider:yaw]; 
    86    [self adjustValues]; 
     86    yawPercent.text = [self percentStringFromSlider:yaw]; 
     87    [self adjustValues]; 
    8788} 
    8889 
    8990- (IBAction) throttleChanged:(id) sender 
    9091{ 
    91    throttlePercent.text = [self percentStringFromSlider:throttle]; 
    92    [self adjustValues]; 
     92    throttlePercent.text = [self percentStringFromSlider:throttle]; 
     93    [self adjustValues]; 
    9394} 
    9495 
    9596- (NSString *) percentStringFromSlider:(UISlider *) slider 
    9697{ 
    97    return [NSString stringWithFormat:@"%i%%", (int)((slider.value - 0.5) * 200)]; // between -100% and 100% 
     98    return [NSString stringWithFormat:@"%i%%", (int)((slider.value - 0.5) * 200)]; // between -100% and 100% 
    9899} 
    99100 
    100101- (void) adjustValues 
    101102{ 
    102    [signalConverter setControlSettings:[self yawValue]throttle:[self throttleValue] pitch:[self pitchValue]]; 
     103    [signalConverter setControlSettings:[self yawValue]throttle:[self throttleValue] pitch:[self pitchValue]]; 
    103104} 
    104105 
    105106- (int) yawValue 
    106107{ 
    107    // We subtract the current Yaw position from the maximum slider value 
    108    // because smaller values instruct the helicopter to spin to the right 
    109    // (clockwise if looking down from above) whereas intuitively moving 
    110    // the slider to the left should cause it to spin left 
    111     
    112    return round((yaw.maximumValue - yaw.value) * 100); 
     108    // We subtract the current Yaw position from the maximum slider value 
     109    // because smaller values instruct the helicopter to spin to the right 
     110    // (clockwise if looking down from above) whereas intuitively moving 
     111    // the slider to the left should cause it to spin left 
     112     
     113    return round((yaw.maximumValue - yaw.value) * 100); 
    113114} 
    114115 
    115116- (int) pitchValue 
    116117{ 
    117    return round(pitch.value * 100); 
     118    return round(pitch.value * 100); 
    118119} 
    119120 
    120121- (int) throttleValue 
    121122{ 
    122    return round(throttle.value * 100); 
     123    return round(throttle.value * 100); 
    123124} 
    124125 
    125126- (IBAction) hoverButtonPressed:(id)sender { 
    126    [self resetValues:(sender)]; 
    127     
     127    [self resetValues:(sender)]; 
     128     
    128129} 
    129130 
    130131- (IBAction) forwardButtonPressed:(id)sender { 
    131    throttle.value = defaultControlThrottle; 
    132    pitch.value = defaultControlPitch + 0.2; 
    133    yaw.value = defaultControlYaw; 
    134    [self adjustValues]; 
    135     
     132    throttle.value = defaultControlThrottle; 
     133    pitch.value = defaultControlPitch + 0.2; 
     134    yaw.value = defaultControlYaw; 
     135    [self adjustValues]; 
     136     
    136137} 
    137138 
    138139- (IBAction) leftButtonPressed:(id)sender { 
    139    throttle.value = defaultControlThrottle; 
    140    pitch.value = defaultControlPitch; 
    141    yaw.value = defaultControlYaw - 0.5; 
    142    [self adjustValues]; 
    143     
     140    throttle.value = defaultControlThrottle; 
     141    pitch.value = defaultControlPitch; 
     142    yaw.value = defaultControlYaw - 0.5; 
     143    [self adjustValues]; 
     144     
    144145} 
    145146 
    146147- (IBAction) rightButtonPressed:(id)sender { 
    147    throttle.value = defaultControlThrottle; 
    148    pitch.value = defaultControlPitch; 
    149    yaw.value = defaultControlYaw + 0.3; 
    150    [self adjustValues]; 
    151     
     148    throttle.value = defaultControlThrottle; 
     149    pitch.value = defaultControlPitch; 
     150    yaw.value = defaultControlYaw + 0.3; 
     151    [self adjustValues]; 
     152     
    152153} 
    153154 
    154155- (IBAction)changeSwitchTiltSensorControl:(id)sender{ 
    155     
    156    // With thanks to Kyro Apps 
    157    // http://kyroapps.weebly.com/xcode-tutorial-452---uiswitch.html 
    158     
    159    if([sender isOn]){ 
    160       //      NSLog(@"DEBUG: Tilt Sensor Enabled"); 
    161       [_switchTiltSensorControlThrottle setEnabled:YES]; 
    162    } else{ 
    163       //      NSLog(@"DEBUG: Tilt Sensor Disabled"); 
    164       [_switchTiltSensorControlThrottle setOn:NO animated:YES]; 
    165       [_switchTiltSensorControlThrottle setEnabled:NO]; 
    166       referenceTiltX = 0; 
    167                 referenceTiltY = 0; 
    168    } 
    169     
     156     
     157    // With thanks to Kyro Apps 
     158    // http://kyroapps.weebly.com/xcode-tutorial-452---uiswitch.html 
     159     
     160    if([sender isOn]){ 
     161        //      NSLog(@"DEBUG: Tilt Sensor Enabled"); 
     162        [_switchTiltSensorControlThrottle setEnabled:YES]; 
     163    } else{ 
     164        //      NSLog(@"DEBUG: Tilt Sensor Disabled"); 
     165        [_switchTiltSensorControlThrottle setOn:NO animated:YES]; 
     166        [_switchTiltSensorControlThrottle setEnabled:NO]; 
     167        referenceTiltX = 0; 
     168        referenceTiltY = 0; 
     169    } 
     170     
    170171} 
    171172 
    172173- (IBAction)changeSwitchTiltSensorControlThrottle:(id)sender{ 
    173     
    174    if([sender isOn]){ 
    175       //      NSLog(@"DEBUG: Throttle Tilt Sensor Enabled"); 
    176       referenceTiltY = 0; 
    177    } else{ 
    178       //      NSLog(@"DEBUG: Throttle Tilt Sensor Disabled"); 
    179       referenceTiltX = 0; 
    180                 referenceTiltY = 0; 
    181    } 
    182     
     174     
     175    if([sender isOn]){ 
     176        //      NSLog(@"DEBUG: Throttle Tilt Sensor Enabled"); 
     177        referenceTiltY = 0; 
     178    } else{ 
     179        //      NSLog(@"DEBUG: Throttle Tilt Sensor Disabled"); 
     180        referenceTiltX = 0; 
     181        referenceTiltY = 0; 
     182    } 
     183     
    183184} 
    184185 
    185186-(void)outputAccelertionData:(CMAcceleration)acceleration 
    186187{ 
    187    // With thanks to NSCookbook 
    188    // http://nscookbook.com/2013/03/ios-programming-recipe-19-using-core-motion-to-access-gyro-and-accelerometer/ 
    189     
    190     
    191    if ([_switchTiltSensorControl isOn]) { 
    192        
    193       if (! [_switchTiltSensorControlThrottle isOn]) { 
    194           
    195          // Pitch/Yaw Tilt Control 
    196           
    197          double tiltX = acceleration.x; 
    198          double tiltY = acceleration.y * -1;  // invert the Y axis so that negative values equal left 
    199           
    200          //   NSLog(@"DEBUG: tiltX:%f tiltY:%f", tiltX, tiltY); 
    201           
    202          if (referenceTiltX == 0) { 
    203             referenceTiltX = tiltX; 
    204             referenceTiltY = tiltY; 
    205          } 
    206           
    207          double newYaw = defaultControlYaw + (tiltX - referenceTiltX); 
    208          double newPitch = defaultControlPitch - (tiltY - referenceTiltY); 
    209           
    210          //   NSLog(@"DEBUG: yaw:%f pitch:%f", yaw.value, pitch.value); 
    211          //   NSLog(@"DEBUG: newYaw:%f newPitch:%f", newYaw, newPitch); 
    212           
    213          // Filter changes below titleSensorMinimumThreshold 
    214          if (((newYaw > yaw.value) && (newYaw - yaw.value > titleSensorMinimumThreshold)) || 
    215              ((newYaw < yaw.value) && (yaw.value - newYaw > titleSensorMinimumThreshold))) { 
    216              
    217             yaw.value = newYaw; 
    218          } 
    219           
    220          if (((newPitch > pitch.value) && (newPitch - pitch.value > titleSensorMinimumThreshold)) || 
    221              ((newPitch < pitch.value) && (pitch.value - newPitch > titleSensorMinimumThreshold))) { 
    222             pitch.value = newPitch; 
    223          } 
    224           
    225       } // Pitch/Yaw Tilt Control 
    226        
    227       else { 
    228           
    229          // Throttle Tilt Control 
    230           
    231          double tiltY = acceleration.y * 1;  // invert the Y axis so that negative values equal forward 
    232           
    233          if (referenceTiltY == 0) { 
    234             referenceTiltY = tiltY; 
    235          } 
    236           
    237          double newThrottle = defaultControlThrottle - (tiltY - referenceTiltY); 
    238           
    239          if (((newThrottle > throttle.value) && (newThrottle - throttle.value > titleSensorMinimumThreshold)) || 
    240              ((newThrottle < throttle.value) && (throttle.value - newThrottle > titleSensorMinimumThreshold))) { 
    241             throttle.value = newThrottle; 
    242          } 
    243           
    244       } // Throttle Tilt Control 
    245        
    246        
    247       [self adjustValues]; 
    248        
    249    } 
    250     
     188    // With thanks to NSCookbook 
     189    // http://nscookbook.com/2013/03/ios-programming-recipe-19-using-core-motion-to-access-gyro-and-accelerometer/ 
     190     
     191     
     192    if ([_switchTiltSensorControl isOn]) { 
     193         
     194        if (! [_switchTiltSensorControlThrottle isOn]) { 
     195             
     196            // Pitch/Yaw Tilt Control 
     197             
     198            double tiltX = acceleration.x; 
     199            double tiltY = acceleration.y * -1;  // invert the Y axis so that negative values equal left 
     200             
     201            //   NSLog(@"DEBUG: tiltX:%f tiltY:%f", tiltX, tiltY); 
     202             
     203            if (referenceTiltX == 0) { 
     204                referenceTiltX = tiltX; 
     205                referenceTiltY = tiltY; 
     206            } 
     207             
     208            double newYaw = defaultControlYaw + (tiltX - referenceTiltX); 
     209            double newPitch = defaultControlPitch - (tiltY - referenceTiltY); 
     210             
     211            //   NSLog(@"DEBUG: yaw:%f pitch:%f", yaw.value, pitch.value); 
     212            //   NSLog(@"DEBUG: newYaw:%f newPitch:%f", newYaw, newPitch); 
     213             
     214            // Filter changes below titleSensorMinimumThreshold 
     215            if (((newYaw > yaw.value) && (newYaw - yaw.value > titleSensorMinimumThreshold)) || 
     216                ((newYaw < yaw.value) && (yaw.value - newYaw > titleSensorMinimumThreshold))) { 
     217                 
     218                yaw.value = newYaw; 
     219            } 
     220             
     221            if (((newPitch > pitch.value) && (newPitch - pitch.value > titleSensorMinimumThreshold)) || 
     222                ((newPitch < pitch.value) && (pitch.value - newPitch > titleSensorMinimumThreshold))) { 
     223                pitch.value = newPitch; 
     224            } 
     225             
     226        } // Pitch/Yaw Tilt Control 
     227         
     228        else { 
     229             
     230            // Throttle Tilt Control 
     231             
     232            double tiltY = acceleration.y * 1;  // invert the Y axis so that negative values equal forward 
     233             
     234            if (referenceTiltY == 0) { 
     235                referenceTiltY = tiltY; 
     236            } 
     237             
     238            double newThrottle = defaultControlThrottle - (tiltY - referenceTiltY); 
     239             
     240            if (((newThrottle > throttle.value) && (newThrottle - throttle.value > titleSensorMinimumThreshold)) || 
     241                ((newThrottle < throttle.value) && (throttle.value - newThrottle > titleSensorMinimumThreshold))) { 
     242                throttle.value = newThrottle; 
     243            } 
     244             
     245        } // Throttle Tilt Control 
     246         
     247         
     248        [self adjustValues]; 
     249         
     250    } 
     251     
    251252} 
    252253 
    253254-(void)outputRotationData:(CMRotationRate)rotation 
    254255{ 
    255     
     256     
    256257} 
    257258 
    258259- (void)didReceiveMemoryWarning 
    259260{ 
    260    [super didReceiveMemoryWarning]; 
    261    // Dispose of any resources that can be recreated. 
     261    [super didReceiveMemoryWarning]; 
     262    // Dispose of any resources that can be recreated. 
    262263} 
    263264 
  • python/Puzzlebox/Orbit/Design_Plugin_Orbit.py

    r0d06822 r544a7a5  
    466466                self.comboBoxInfraredModelName.addItem("") 
    467467                self.comboBoxInfraredModelName.addItem("") 
     468                self.comboBoxInfraredModelName.addItem("") 
    468469                self.verticalLayoutSessionProfile.addWidget(self.comboBoxInfraredModelName) 
    469470                self.comboBoxInfraredPortSelect = QtGui.QComboBox(self.horizontalLayoutWidget) 
     
    563564                self.comboBoxInfraredModelName.setItemText(1, QtGui.QApplication.translate("Form", "Audio Infrared Dongle", None, QtGui.QApplication.UnicodeUTF8)) 
    564565                self.comboBoxInfraredModelName.setItemText(2, QtGui.QApplication.translate("Form", "Arduino Infrared Circuit", None, QtGui.QApplication.UnicodeUTF8)) 
     566                #self.comboBoxInfraredModelName.setItemText(3, QtGui.QApplication.translate("Form", "Mindfulness, Inc. Lotus", None, QtGui.QApplication.UnicodeUTF8)) 
     567                self.comboBoxInfraredModelName.setItemText(3, QtGui.QApplication.translate("Form", "Puzzlebox Bloom", None, QtGui.QApplication.UnicodeUTF8)) 
    565568                self.comboBoxInfraredPortSelect.setItemText(0, QtGui.QApplication.translate("Form", "Select Port", None, QtGui.QApplication.UnicodeUTF8)) 
    566569                self.pushButtonInfraredConnect.setText(QtGui.QApplication.translate("Form", "Connect", None, QtGui.QApplication.UnicodeUTF8)) 
  • python/Puzzlebox/Orbit/Plugin_Orbit.py

    rd98642d r544a7a5  
    419419                elif infraredDevice == 'Arduino Infrared Circuit': 
    420420                        mode = 'arduino' 
     421                #if infraredDevice == 'Mindfulness, Inc. Lotus': 
     422                        #mode = 'pyramid' 
     423                if infraredDevice == 'Puzzlebox Bloom': 
     424                        mode = 'bloom' 
    421425                 
    422426                self.protocol = protocol_orbit.puzzlebox_jigsaw_protocol_orbit( \ 
     
    567571                        if os.path.exists('/dev/tty.usbmodemfd1222'): 
    568572                                devices.append('/dev/tty.usbmodemfd1222') 
     573                        if os.path.exists('/dev/tty.usbmodem1411'): 
     574                                devices.append('/dev/tty.usbmodem1411') 
     575                        if os.path.exists('/dev/tty.usbmodem14231'): 
     576                                devices.append('/dev/tty.usbmodem14231') 
     577                                 
    569578                         
    570579                        #if os.path.exists('/dev/tty.usbserial-A602050J'): 
     
    821830                                        self.protocol.land() 
    822831                 
     832                        elif infraredDevice == 'Mindfulness, Inc. Lotus': 
     833                                 
     834                                if self.protocol != None: 
     835                                        self.protocol.setLotus(power) 
     836                         
     837                        elif infraredDevice == 'Puzzlebox Bloom': 
     838                                 
     839                                if self.protocol != None: 
     840                                        self.protocol.setBloom(power) 
    823841                 
    824842                else: 
     
    851869                                        self.protocol.setPitch(self.pitch) 
    852870         
     871                        #elif infraredDevice == 'Mindfulness, Inc. Lotus': 
     872                                 
     873                                #if self.protocol != None: 
     874                                         
     875                                        #self.protocol.setLotus(power) 
     876                                         
     877         
     878                        elif infraredDevice == 'Puzzlebox Bloom': 
     879                                 
     880                                if self.protocol != None: 
     881                                         
     882                                        self.protocol.setBloom(power) 
     883 
    853884         
    854885        ################################################################## 
  • python/Puzzlebox/Orbit/Protocol_Orbit.py

    r1ad2c9e r544a7a5  
    5050DEFAULT_ARDUINO_BAUD_RATE = 9600 
    5151DEFAULT_PYRAMID_BAUD_RATE = 115200 
     52DEFAULT_BLOOM_BAUD_RATE = 57600 
    5253 
    5354ARDUINO_INITIALIZATION_TIME = 2 
     
    111112                if self.mode == 'pyramid': 
    112113                        baudrate = DEFAULT_PYRAMID_BAUD_RATE 
     114                        rts_cts_flow_control = 'f' 
     115                elif self.mode == 'bloom': 
     116                        baudrate = DEFAULT_BLOOM_BAUD_RATE 
    113117                        rts_cts_flow_control = 'f' 
    114118                else: 
     
    184188                 
    185189                 
    186                 self.land() 
     190                if self.mode != 'bloom': 
     191                        self.land() 
    187192                 
    188193                time.sleep(ARDUINO_INITIALIZATION_TIME) 
     
    354359                self.command_queue.append(command) 
    355360                #self.device.write(command) 
    356                  
    357                  
     361         
     362         
     363        ################################################################## 
     364         
     365        #def setLotus(self, power): 
     366        def setBloom(self, power): 
     367                 
     368                value = self.padValue( str(power) ) 
     369                 
     370                command = 'S%s' % value 
     371                 
     372                if self.DEBUG: 
     373                        print "--> [Protocol:Orbit] Sending Bloom Command:", 
     374                        print command 
     375                 
     376                self.command_queue.append(command) 
     377         
     378         
    358379        ################################################################## 
    359380         
Note: See TracChangeset for help on using the changeset viewer.