diff -r 000000000000 -r d6fe6244b863 loadgen/src/loadgen_photocapture.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadgen/src/loadgen_photocapture.cpp Tue Feb 02 00:17:27 2010 +0200 @@ -0,0 +1,389 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDE FILES +#include "loadgen_photocapture.h" +#include "loadgen_model.h" +#include "loadgen.hrh" +#include "loadgen_traces.h" +#include +#include +#include +#include +#include + +_LIT(KThreadName, "PhotoCapture %d"); + +const TInt KDefaultStart = 50; +const TInt KDefaultPeriod = 5000000; + +//TInt CPhotoCapture::iImagesReady = 0; + +// ===================================== MEMBER FUNCTIONS ===================================== + +CPhotoCapture* CPhotoCapture::NewL(TPhotoCaptureAttributes& aAttributes, TInt aReferenceNumber) + { + CPhotoCapture* self = new(ELeave) CPhotoCapture(aAttributes, aReferenceNumber); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// -------------------------------------------------------------------------------------------- + +CPhotoCapture::~CPhotoCapture() + { + Close(); + } + +// -------------------------------------------------------------------------------------------- + +CPhotoCapture::CPhotoCapture(TPhotoCaptureAttributes& aAttributes, TInt aReferenceNumber) : iAttributes(aAttributes) + { + iAttributes.iId = aReferenceNumber; + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::ConstructL() + { + CLoadBase::ConstructL(); + + iType = ELoadGenCmdNewLoadPhotoCaptures; + + TBuf<64> threadName; + threadName.Format(KThreadName, iAttributes.iId); + + // create a thread + User::LeaveIfError(iThread.Create(threadName, ThreadFunction, KDefaultStackSize*2, KMinHeapSize, 1024*KMinHeapSize, (TAny*) &iAttributes )); + + // set priority of the thread + SetPriority(); + } + +// -------------------------------------------------------------------------------------------- + +TInt CPhotoCapture::ThreadFunction(TAny* aThreadArg) + { + TInt err = KErrNone; + + CTrapCleanup* pC = CTrapCleanup::New(); + CActiveScheduler* pS = new CActiveScheduler; + CActiveScheduler::Install(pS); + + // start generating load, pass pointer to arguments + GenerateLoad(*((TPhotoCaptureAttributes*) aThreadArg)); + + delete pS; + delete pC; + + return err; + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::GenerateLoad(TPhotoCaptureAttributes& aAttributes) + { + CCameraManager* cameraManager = 0; + TRAPD(err, cameraManager = CCameraManager::NewL(aAttributes)); + if (err == KErrNone) CActiveScheduler::Start(); + delete cameraManager; + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::Resume() + { + CLoadBase::Resume(); + iThread.Resume(); + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::Suspend() + { + CLoadBase::Suspend(); + iThread.Suspend(); + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::SetPriority() + { + CLoadBase::SetPriority(); + iThread.SetPriority(CLoadGenModel::SettingItemToThreadPriority(iAttributes.iPriority)); + } + +// -------------------------------------------------------------------------------------------- + +void CPhotoCapture::Close() + { + CLoadBase::Close(); + + // kill the thread immediately + iThread.Kill(0); + + iThread.Close(); + } + +// -------------------------------------------------------------------------------------------- + +TPtrC CPhotoCapture::Description() + { + TBuf<256> buf; + TBuf<16> prioBuf; + CLoadGenModel::SettingItemToThreadDescription(iAttributes.iPriority, prioBuf); + + _LIT(KPhotoCaptureEntry, "[%d] PhotoCapture camera=%d prio=%S idle=%dms random=%d%%"); + buf.Format(KPhotoCaptureEntry, iAttributes.iId, iAttributes.iCamera, &prioBuf, iAttributes.iIdle, iAttributes.iRandomVariance); + + return TPtrC(buf); + } + +// -------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------- +CCameraManager* CCameraManager::NewL(TPhotoCaptureAttributes& aAttrs) + { + CCameraManager* self = new (ELeave) CCameraManager(aAttrs); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// -------------------------------------------------------------------------------------------- +CCameraManager::~CCameraManager() + { + delete iCamera; + if (iPeriodicTimer) + { + iPeriodicTimer->Cancel(); + delete iPeriodicTimer; + } + } + +// -------------------------------------------------------------------------------------------- +CCameraManager::CCameraManager(TPhotoCaptureAttributes& aAttrs) +: +CActive(EPriorityStandard), +iAttributes(aAttrs) + { + iState = ENotReady; + iNumOfPics = 0; + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::ConstructL() + { + CActiveScheduler::Add(this); + // set the status as pending + iStatus = KRequestPending; + SetActive(); + + // set the death status pointer point to the request status of this ao + iAttributes.iDeathStatus = &iStatus; + + // start timer + iPeriodicTimer = CPeriodic::NewL(CActive::EPriorityStandard); + iPeriodicTimer->Start(KDefaultStart, KDefaultPeriod, TCallBack(PeriodicTimerCallBack, this)); + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::DoCancel() + { + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::RunL() + { + // request status has completed by the main thread meaning that we need to stop now + CActiveScheduler::Stop(); + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::ReserveCameraL() + { + LOGSTRING2("LoadGen: CCameraManager::ReserveCameraL() - Using Camera %d", iAttributes.iCamera); + if( iCamera ) + { + iCamera->Release(); + } + delete iCamera; + iCamera = 0; + TRAPD( err, iCamera = CCamera::NewL(*this, iAttributes.iCamera)); + iCurrentCamera = iAttributes.iCamera; + if(err != KErrNone) + { + LOGSTRING2("LoadGen: CCamera::NewL leaves with error: %d", err); + User::Leave(err); + } + iCamera->CameraInfo(iCameraInfo); + iCamera->Reserve(); + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::ReserveComplete(TInt aError) + { + if( aError != KErrNone ) + LOGSTRING2("LoadGen: CCameraManager::ReserveComplete() - Error: %d", aError); + + if( aError == KErrNone ) + { + iState = ECameraReserved; + iCamera->PowerOn(); + } + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::PowerOnComplete(TInt aError) + { + if( aError != KErrNone ) + { + LOGSTRING2("LoadGen: CCameraManager::PowerOnComplete() - Error: %d", aError); + return; + } + + // Define image format, try JPEG images first: + CCamera::TFormat format = CCamera::EFormatExif; + + if(iCameraInfo.iImageFormatsSupported & CCamera::EFormatExif) + { + LOGSTRING("LoadGen: CCameraManager::PowerOnComplete() - EXIF JPEG supported"); + format = CCamera::EFormatExif; + } + else if( iCameraInfo.iImageFormatsSupported & CCamera::EFormatJpeg ) + { + LOGSTRING("LoadGen: CCameraManager::PowerOnComplete() - JFIF JPEG supported"); + format = CCamera::EFormatJpeg; + } + else if( iCameraInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor4K ) + { + LOGSTRING("LoadGen: CCameraManager::PowerOnComplete() - Bitmap 4K Color supported"); + format = CCamera::EFormatFbsBitmapColor4K; + } + else if( iCameraInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor64K ) + { + LOGSTRING("LoadGen: CCameraManager::PowerOnComplete() - Bitmap 64K Color supported"); + format = CCamera::EFormatFbsBitmapColor64K; + } + else if( iCameraInfo.iImageFormatsSupported & CCamera::EFormatFbsBitmapColor16M ) + { + LOGSTRING("LoadGen: CCameraManager::PowerOnComplete() - Bitmap 16M Color supported"); + format = CCamera::EFormatFbsBitmapColor16M; + } + else + { + LOGSTRING2("LoadGen: CCameraManager::PowerOnComplete() - JPEGs not supported, trying \"User defined\" (Supported formats: %d)", iCameraInfo.iImageFormatsSupported); + format = CCamera::EFormatUserDefined; + } + const TInt KImageSizeIndex = 0; // Largest image size + TRAPD( err, iCamera->PrepareImageCaptureL(format, KImageSizeIndex)); + if( err != KErrNone ) + { + LOGSTRING2("LoadGen: CCameraManager::PowerOnComplete() - Error while preparing camera: %d", err); + } + // Camera ready: + iState = EIdle; + // Take photo: + TRAP(err, CapturePhotoL()); + if( err != KErrNone ) + { + LOGSTRING2("LoadGen: CCameraManager::PowerOnComplete() - Photo capture error: %d", err); + } + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::ViewFinderFrameReady(CFbsBitmap& /*aFrame*/) + { + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::ImageReady(CFbsBitmap* aBitmap, HBufC8* aData, TInt aError) + { + if( aError != KErrNone ) + { + LOGSTRING2("LoadGen: CCameraManager::ImageReady() - Error: %d", aError); + } + else + { + iNumOfPics++; + LOGSTRING2("LoadGen: CCameraManager::ImageReady() - Images successfully captured: %d", iNumOfPics); + } + delete aBitmap; + delete aData; + iState = EIdle; + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::FrameBufferReady(MFrameBuffer* /*aFrameBuffer*/, TInt aError) + { + if( aError != KErrNone ) + LOGSTRING2("LoadGen: CCameraManager::FrameBufferReady() - Error: %d", aError); + } + +// -------------------------------------------------------------------------------------------- +void CCameraManager::CapturePhotoL() + { + // Camera Manager must be in idle state when taking a photo + if( iState == ENotReady ) + { + // Not ready, camera must be reserved: + ReserveCameraL(); + } + else if (iState == EIdle) + { + if( iCurrentCamera != iAttributes.iCamera ) + { + LOGSTRING3("LoadGen: CCameraManager::CapturePhotoL() - Switching from Camera %d to Camera %d", iCurrentCamera, iAttributes.iCamera); + ReserveCameraL(); + } + else + { + iState = ECapture; + if( iCameraInfo.iFlashModesSupported & CCamera::EFlashForced) + { + iCamera->SetFlashL(CCamera::EFlashForced); + } + iCamera->CaptureImage(); + iPeriodicTimer->Start( CLoadGenModel::MilliSecondsToMicroSeconds( iAttributes.iIdle, + iAttributes.iRandomVariance ), KDefaultPeriod, + TCallBack( PeriodicTimerCallBack, this ) ); + } + } + else + { + iPeriodicTimer->Start( CLoadGenModel::MilliSecondsToMicroSeconds( iAttributes.iIdle, + iAttributes.iRandomVariance ), KDefaultPeriod, + TCallBack( PeriodicTimerCallBack, this ) ); + } + } + +// -------------------------------------------------------------------------------------------- + +TInt CCameraManager::PeriodicTimerCallBack(TAny* aAny) + { + CCameraManager* self = static_cast( aAny ); + self->iPeriodicTimer->Cancel(); + TRAP_IGNORE(self->CapturePhotoL()); + return KErrNone; + } + +// End of File