i saw the post about using the iPhone 4/4s flash led as a torch.
I found it very useful, i tried to use it for quickly turn on/off the led so to use it as a morse transmitter, but it doesn’t work.
It is too slow for this use, following the code i use:
-(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];
}
when i push on the sos button i see just a flash.
Anyone may help me?
The method you are using is indeed very slow. Use the method found in this Stackoverflow link instead.
The actual on/off code is:
But make sure
myDeviceis initialized (see the link)Implement it with
NStimerto create a flash length of however long you want.EDIT:
Sorry, I assumed that you were trying to gather the morse code input and then instructing the flash to toggle through
NSTimer.Try using
NSTimeror sleep the thread to increase the time in between the intervals of the flashing. It might be executing too fast for the actual flash component to handle. Try this on the SOS method for easiness of testing.