используя iPhone 4 / 4s как передатчик Морзе - PullRequest
3 голосов
/ 22 января 2012

Я видел сообщение об использовании вспышки iPhone 4 / 4s в качестве фонарика.Я нашел это очень полезным, я попытался использовать его для быстрого включения / выключения светодиода, чтобы использовать его как передатчик Морзе, но он не работает.Это слишком медленно для этого использования, следуя коду, который я использую:

-(void)toggleTorch
{
    AVCaptureDevice *_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // check if the device has the torch
    if([_device hasTorch] && [_device hasFlash])
    {
        if (_device.torchMode == AVCaptureTorchModeOff) 
        {            
            // we want to turn the torch on
            AVCaptureDeviceInput *_flashInput = [AVCaptureDeviceInput deviceInputWithDevice:_device error:nil];
            AVCaptureVideoDataOutput *_output = [[AVCaptureVideoDataOutput alloc] init];

            AVCaptureSession *_session = [[AVCaptureSession alloc] init];
            [_session beginConfiguration];
            [_device lockForConfiguration:nil];

             [_session addInput:_flashInput];
             [_session addOutput:_output];

            [_device unlockForConfiguration];

            //[_output release];
            [_session commitConfiguration];
            [_session startRunning];

            [self setTorchSession:_session];
        }
        else 
        {            
            [self.torchSession stopRunning];
        }
    }
}

// turn the torch on/off
-(IBAction)toggleTorch:(id)sender
{
    AVCaptureDevice *_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // check if the device has the torch
    if([_device hasTorch] && [_device hasFlash])
    {
        if (_device.torchMode == AVCaptureTorchModeOff) 
        {
            [self switchTorchON];
        }
        else 
        {
            [self switchTorchOFF];
        }
    }
}

-(void)switchTorchON
{
    [NSThread detachNewThreadSelector:@selector(changeSwitchImage) 
                             toTarget:self 
                           withObject:nil];

    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {

        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        [device lockForConfiguration:nil];

        [device setTorchMode:AVCaptureTorchModeOn];
        [device setFlashMode:AVCaptureFlashModeOn];

        [device unlockForConfiguration];

    }
}
-(void)switchTorchOFF
{
    [NSThread detachNewThreadSelector:@selector(changeSwitchImage) 
                             toTarget:self 
                           withObject:nil];
    // test if this class even exists to ensure flashlight is turned on ONLY for iOS 4 and above
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {

        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        [device lockForConfiguration:nil];

        [device setTorchMode:AVCaptureTorchModeOff];
        [device setFlashMode:AVCaptureFlashModeOff];

        [device unlockForConfiguration];

    }   
}

-(IBAction)toggleSOS:(id)sender
{
    // morse SOS: ...---...
    [self switchTorchON];
    [self switchTorchOFF];

    [self switchTorchON];
    [self switchTorchOFF];

    [self switchTorchON];
    [self switchTorchOFF];

}

, когда я нажимаю кнопку SOS, я вижу только вспышку.Кто-нибудь может мне помочь?

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Метод, который вы используете, действительно очень медленный. Вместо этого используйте метод, найденный в этой ссылке Stackoverflow.

Фактический код включения / выключения:

[self.myDevice lockForConfiguration:nil];
[self.myDevice setTorchMode:AVCaptureTorchModeOn];
[self.myDevice setFlashMode:AVCaptureFlashModeOn];
[self.myDevice unlockForConfiguration];

Но убедитесь, что myDevice инициализирован (см. Ссылку)

Реализуйте его с помощью NStimer, чтобы создать длину вспышки любой длины.

EDIT:

Извините, я предположил, что вы пытаетесь собрать введенный азбукой Морзе код, а затем указываете вспышке переключаться между NSTimer.

Попробуйте использовать NSTimer или переведите нить в спящий режим, чтобы увеличить время между интервалами мигания. Возможно, он выполняется слишком быстро для фактического флэш-компонента. Попробуйте это на метод SOS для простоты тестирования.

2 голосов
/ 28 января 2012

Я пытался с NSTimer, но это не сработало.
Наконец я решил использовать performSelector:withObject:afterDelay:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...