sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include "t_perfdata.h" sl@0: #include "t_wservconsts.h" sl@0: sl@0: // Strings used when writing results to file to sl@0: // describe the values accordingly. sl@0: // e.g. KPerfDataFrameRate = 24 sl@0: // is the calculated frame rate for the measurements taken. sl@0: _LIT(KPerfDataTrimedMean, "KPerfDataTrimedMean"); sl@0: _LIT(KPerfDataMaxTime, "KPerfDataMaxTime"); sl@0: _LIT(KPerfDataMinTime, "KPerfDataMinTime"); sl@0: _LIT(KPerfDataFrameRate, "KPerfDataFrameRate"); sl@0: sl@0: EXPORT_C CTPerfData* CTPerfData::NewL() sl@0: { sl@0: CTPerfData* self = new(ELeave) CTPerfData(); sl@0: CleanupStack::PushL(self); sl@0: self->Construct(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C void CTPerfData::StartCounter() sl@0: { sl@0: iCounter = User::FastCounter(); sl@0: } sl@0: sl@0: EXPORT_C void CTPerfData::StopCounterL() sl@0: { sl@0: TUint32 counter = User::FastCounter(); sl@0: iResults.AppendL(counter-iCounter); sl@0: iCounter=counter; sl@0: } sl@0: sl@0: EXPORT_C void CTPerfData::WriteResultsL(const TDesC& aFileName) sl@0: { sl@0: AnalyseResultsL(); sl@0: sl@0: RFs myFs; sl@0: User::LeaveIfError(myFs.Connect()); sl@0: sl@0: RFileWriteStream writer; sl@0: writer.PushL(); // writer on cleanup stack sl@0: TInt err = myFs.MkDirAll(aFileName); sl@0: sl@0: if (err==KErrNone || err==KErrAlreadyExists) sl@0: { sl@0: User::LeaveIfError(writer.Replace(myFs, aFileName, EFileStreamText|EFileWrite)); sl@0: writer.CommitL(); sl@0: CleanupStack::PopAndDestroy(&writer); // writer sl@0: sl@0: CIniData* myData=CIniData::NewL(aFileName); sl@0: CleanupStack::PushL(myData); sl@0: sl@0: TBuf<255> tempStore; sl@0: _LIT(KIntData, "%d"); sl@0: tempStore.Format(KIntData,iTrimedMean); sl@0: User::LeaveIfError(myData->AddValue(KDefaultSectionName, KPerfDataTrimedMean, tempStore)); sl@0: tempStore.Format(KIntData,iMaxTime); sl@0: User::LeaveIfError(myData->AddValue(KDefaultSectionName, KPerfDataMaxTime, tempStore)); sl@0: tempStore.Format(KIntData,iMinTime); sl@0: User::LeaveIfError(myData->AddValue(KDefaultSectionName, KPerfDataMinTime, tempStore)); sl@0: _LIT(KRealData, "%4.0f"); sl@0: tempStore.Format(KRealData,iFrameRate); sl@0: User::LeaveIfError(myData->AddValue(KDefaultSectionName, KPerfDataFrameRate, tempStore)); sl@0: myData->WriteToFileL(); sl@0: sl@0: CleanupStack::PopAndDestroy(myData); sl@0: } sl@0: else sl@0: { sl@0: CleanupStack::PopAndDestroy(&writer); // writer sl@0: } sl@0: sl@0: myFs.Close(); sl@0: } sl@0: sl@0: void CTPerfData::Construct() sl@0: { sl@0: iResults.Reset(); sl@0: } sl@0: sl@0: CTPerfData::~CTPerfData() sl@0: { sl@0: iResults.Reset(); sl@0: } sl@0: sl@0: void CTPerfData::AnalyseResultsL() sl@0: { sl@0: TrimedMeanL(); sl@0: MaxTime(); sl@0: MinTime(); sl@0: FrameRateL(); sl@0: } sl@0: sl@0: void CTPerfData::TrimedMeanL() sl@0: { sl@0: TInt64 total = 0; sl@0: if (iResults.Count() <= 50) sl@0: { sl@0: RDebug::Print(_L("Not enough results for trimming - need more than 50, but got %d"), iResults.Count()); sl@0: iTrimedMean = 0; sl@0: } sl@0: else sl@0: { sl@0: TReal tempVar = iResults.Count() * 0.20; sl@0: TInt32 twentyPercentCount = 0; sl@0: User::LeaveIfError(Math::Int(twentyPercentCount, tempVar)); sl@0: sl@0: sl@0: sl@0: for (TInt count = twentyPercentCount; count < iResults.Count()-twentyPercentCount; count++) sl@0: { sl@0: total += iResults[count]; sl@0: } sl@0: sl@0: iTrimedMean = (static_cast(total/(iResults.Count()-(static_cast(twentyPercentCount)*2)))); sl@0: } sl@0: sl@0: RDebug::Print(_L("CTPerfData::TrimedMeanL - %d"), iTrimedMean); sl@0: } sl@0: sl@0: void CTPerfData::MaxTime() sl@0: { sl@0: TUint32 result = iResults[0]; sl@0: for(TInt i = 0; i < iResults.Count(); i++) sl@0: { sl@0: if(iResults[i] > result) sl@0: { sl@0: result = iResults[i]; sl@0: } sl@0: } sl@0: iMaxTime = result; sl@0: sl@0: RDebug::Print(_L("CTPerfData::MaxTime - %d"), iMaxTime); sl@0: } sl@0: sl@0: void CTPerfData::MinTime() sl@0: { sl@0: TUint32 result = iResults[0]; sl@0: for(TInt i = 0; i < iResults.Count(); i++) sl@0: { sl@0: if(iResults[i] < result) sl@0: { sl@0: result = iResults[i]; sl@0: } sl@0: } sl@0: iMinTime = result; sl@0: sl@0: RDebug::Print(_L("CTPerfData::MinTime - %d"), iMinTime); sl@0: } sl@0: sl@0: void CTPerfData::FrameRateL() sl@0: { sl@0: iFrameRate = 0; sl@0: if (iTrimedMean==0) sl@0: { sl@0: TrimedMeanL(); sl@0: } sl@0: TInt counterFreq = 1; sl@0: User::LeaveIfError(HAL::Get(HALData::EFastCounterFrequency, counterFreq)); sl@0: sl@0: if (iTrimedMean) sl@0: { sl@0: iFrameRate = static_cast(counterFreq)/iTrimedMean; sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrAbort); sl@0: } sl@0: sl@0: RDebug::Print(_L("CTPerfData::FrameRate - %4.0f"), iFrameRate); sl@0: }