--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/loadgen/src/loadgen_photocapture.cpp Wed Sep 01 12:30:35 2010 +0100
@@ -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 <loadgen.rsg>
+#include <e32hal.h>
+#include <u32hal.h>
+#include <e32math.h>
+#include <eikenv.h>
+
+_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<CCameraManager*>( aAny );
+ self->iPeriodicTimer->Cancel();
+ TRAP_IGNORE(self->CapturePhotoL());
+ return KErrNone;
+ }
+
+// End of File