sl@0: // Copyright (c) 1997-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 the License "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: // e32test\system\t_tock.cpp sl@0: // Overview: sl@0: // Test tick-based timers sl@0: // API Information: sl@0: // RTimer sl@0: // Details: sl@0: // - Create a number of periodic timers, start each and change the time sl@0: // offset via TLocale::SetUniversalTimeOffset(). Print the results. sl@0: // - Create a number of periodic timers, start each and change the system sl@0: // time. Print the results. sl@0: // - Create a number of periodic timers, start each and change the system sl@0: // time in a second thread. Print the results. sl@0: // - Create a number of periodic timers, start each along with a background sl@0: // timer. Print the results. sl@0: // - Create a number of periodic timers, start each and change the system sl@0: // time and tick delay. Print the results. sl@0: // Platforms/Drives/Compatibility: sl@0: // All. sl@0: // Assumptions/Requirement/Pre-requisites: sl@0: // Failures and causes: sl@0: // Base Port information: sl@0: // sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "d_tick.h" sl@0: sl@0: RTest test(_L("T_TOCK")); sl@0: RTickTest ticktest; sl@0: TInt ActiveCount; sl@0: TInt ErrorCount; sl@0: sl@0: TBool PauseOnError = 0; sl@0: #define GETCH() (PauseOnError&&test.Getch()) sl@0: sl@0: #define TEST(c) ((void)((c)||(test.Printf(_L("Failed at line %d\n"),__LINE__),GETCH(),test(0),0))) sl@0: #define CHECK(c) ((void)(((c)==0)||(test.Printf(_L("Error %d at line %d\n"),(c),__LINE__),GETCH(),test(0),0))) sl@0: sl@0: const TPtrC KLddFileName=_L("D_TICK.LDD"); sl@0: sl@0: class CTickTest : public CActive sl@0: { sl@0: public: sl@0: CTickTest(TInt aPriority, TInt aId, RTickTest aLdd); sl@0: ~CTickTest(); sl@0: virtual void RunL(); sl@0: virtual void DoCancel(); sl@0: public: sl@0: void StartPeriodic(TInt aInterval, TInt aCount); sl@0: void StartNShotRel(TInt aMin, TInt aRange, TInt aCount); sl@0: void StartNShotAbs(TInt aMin, TInt aRange, TInt aCount); sl@0: void StartNShotDelay(TInt aPeriod, TInt aDelay, TInt aCount); sl@0: void GetInfo(STickTestInfo& aInfo); sl@0: public: sl@0: TInt iId; sl@0: TInt iCount; sl@0: TInt iMin; sl@0: TInt iRange; sl@0: TInt64 iErrorAcc; sl@0: RTickTest iLdd; sl@0: STickTestInfo iInfo; sl@0: }; sl@0: sl@0: class CBackgroundTimer : public CActive sl@0: { sl@0: public: sl@0: static CBackgroundTimer* NewL(TInt aPriority); sl@0: CBackgroundTimer(TInt aPriority); sl@0: ~CBackgroundTimer(); sl@0: virtual void RunL(); sl@0: virtual void DoCancel(); sl@0: void Start(); sl@0: public: sl@0: RTimer iShort; sl@0: RTimer iLong; sl@0: TRequestStatus iLongStatus; sl@0: }; sl@0: sl@0: CTickTest* TickTest[KMaxTimers]; sl@0: CIdle* Idler; sl@0: CBackgroundTimer* BackgroundTimer; sl@0: sl@0: CTickTest::CTickTest(TInt aPriority, TInt aId, RTickTest aLdd) sl@0: : CActive(aPriority), sl@0: iId(aId), sl@0: iLdd(aLdd) sl@0: { sl@0: } sl@0: sl@0: CTickTest::~CTickTest() sl@0: { sl@0: Cancel(); sl@0: iLdd.SetHandle(0); sl@0: } sl@0: sl@0: void CTickTest::StartPeriodic(TInt aInterval, TInt aCount) sl@0: { sl@0: TInt r=iLdd.StartPeriodic(iStatus,iId,aInterval,aCount); sl@0: if (r!=KErrNone) sl@0: { sl@0: TRequestStatus* pS=&iStatus; sl@0: User::RequestComplete(pS,r); sl@0: } sl@0: SetActive(); sl@0: } sl@0: sl@0: void CTickTest::StartNShotRel(TInt aMin, TInt aRange, TInt aCount) sl@0: { sl@0: TInt c=aCount; sl@0: if (aCount<0) sl@0: { sl@0: iCount=-aCount; sl@0: c=1; sl@0: } sl@0: iMin=aMin; sl@0: iRange=aRange; sl@0: iErrorAcc=0; sl@0: iInfo.iMinErr=KMaxTInt; sl@0: iInfo.iMaxErr=KMinTInt; sl@0: iInfo.iCount=0; sl@0: iInfo.iRequestedCount=iCount; sl@0: iInfo.iTotalTime=0; sl@0: TInt r=iLdd.StartNShotRel(iStatus,iId,aMin,aRange,c); sl@0: if (r!=KErrNone) sl@0: { sl@0: TRequestStatus* pS=&iStatus; sl@0: User::RequestComplete(pS,r); sl@0: } sl@0: SetActive(); sl@0: } sl@0: sl@0: void CTickTest::StartNShotAbs(TInt aMin, TInt aRange, TInt aCount) sl@0: { sl@0: TInt r=iLdd.StartNShotAbs(iStatus,iId,aMin,aRange,aCount); sl@0: if (r!=KErrNone) sl@0: { sl@0: TRequestStatus* pS=&iStatus; sl@0: User::RequestComplete(pS,r); sl@0: } sl@0: SetActive(); sl@0: } sl@0: sl@0: void CTickTest::StartNShotDelay(TInt aPeriod, TInt aDelay, TInt aCount) sl@0: { sl@0: iCount=0; sl@0: TInt r=iLdd.StartNShotDelay(iStatus,iId,aPeriod,aDelay,aCount); sl@0: if (r!=KErrNone) sl@0: { sl@0: TRequestStatus* pS=&iStatus; sl@0: User::RequestComplete(pS,r); sl@0: } sl@0: SetActive(); sl@0: } sl@0: sl@0: void CTickTest::GetInfo(STickTestInfo& aInfo) sl@0: { sl@0: iLdd.GetInfo(iId,aInfo); sl@0: } sl@0: sl@0: void CTickTest::RunL() sl@0: { sl@0: if (iStatus!=KErrNone) sl@0: { sl@0: test.Printf(_L("Timer %d error %d\n"),iId,iStatus.Int()); sl@0: ++ErrorCount; sl@0: CActiveScheduler::Stop(); sl@0: return; sl@0: } sl@0: if (iCount==0) sl@0: GetInfo(iInfo); sl@0: else sl@0: { sl@0: STickTestInfo info; sl@0: iLdd.GetInfo(iId,info); sl@0: TInt err=info.iMinErr; sl@0: if (erriInfo.iMaxErr) sl@0: iInfo.iMaxErr=err; sl@0: ++iInfo.iCount; sl@0: iErrorAcc+=err; sl@0: if (--iCount) sl@0: { sl@0: TInt r=iLdd.StartNShotRel(iStatus,iId,iMin,iRange,1); sl@0: if (r!=KErrNone) sl@0: { sl@0: TRequestStatus* pS=&iStatus; sl@0: User::RequestComplete(pS,r); sl@0: } sl@0: SetActive(); sl@0: return; sl@0: } sl@0: iInfo.iAvgErr=I64INT(iErrorAcc/TInt64(iInfo.iCount)); sl@0: } sl@0: test.Printf(_L("Timer %d\n"),iId); sl@0: if (!--ActiveCount) sl@0: CActiveScheduler::Stop(); sl@0: } sl@0: sl@0: void CTickTest::DoCancel() sl@0: { sl@0: iLdd.Stop(iId); sl@0: } sl@0: sl@0: CBackgroundTimer::CBackgroundTimer(TInt aPriority) sl@0: : CActive(aPriority) sl@0: { sl@0: } sl@0: sl@0: CBackgroundTimer::~CBackgroundTimer() sl@0: { sl@0: iShort.Close(); sl@0: iLong.Close(); sl@0: } sl@0: sl@0: void CBackgroundTimer::Start() sl@0: { sl@0: iLong.After(iLongStatus, 100000); sl@0: iShort.After(iStatus, 20000); sl@0: SetActive(); sl@0: } sl@0: sl@0: void CBackgroundTimer::RunL() sl@0: { sl@0: iLong.Cancel(); sl@0: User::WaitForRequest(iLongStatus); sl@0: Start(); sl@0: } sl@0: sl@0: void CBackgroundTimer::DoCancel() sl@0: { sl@0: iShort.Cancel(); sl@0: iLong.Cancel(); sl@0: User::WaitForRequest(iLongStatus); sl@0: } sl@0: sl@0: CBackgroundTimer* CBackgroundTimer::NewL(TInt aPriority) sl@0: { sl@0: CBackgroundTimer* pB=new (ELeave) CBackgroundTimer(aPriority); sl@0: TInt r=pB->iShort.CreateLocal(); sl@0: if (r==KErrNone) sl@0: r=pB->iLong.CreateLocal(); sl@0: if (r!=KErrNone) sl@0: { sl@0: delete pB; sl@0: pB=NULL; sl@0: } sl@0: return pB; sl@0: } sl@0: sl@0: void InitialiseL() sl@0: { sl@0: CActiveScheduler* pS=new (ELeave) CActiveScheduler; sl@0: CActiveScheduler::Install(pS); sl@0: TInt i; sl@0: for (i=0; iiInfo); sl@0: } sl@0: sl@0: void PrintInfo() sl@0: { sl@0: TInt i; sl@0: for (i=0; iStartPeriodic(3,1000); sl@0: TickTest[1]->StartPeriodic(5,600); sl@0: TickTest[2]->StartPeriodic(7,400); sl@0: TickTest[3]->StartPeriodic(11,300); sl@0: TickTest[4]->StartPeriodic(13,30); sl@0: TickTest[5]->StartPeriodic(19,30); sl@0: TickTest[6]->StartPeriodic(23,30); sl@0: TickTest[7]->StartPeriodic(37,30); sl@0: Idler->Start(TCallBack(ChangeOffset,NULL)); sl@0: ActiveCount=8; sl@0: ErrorCount=0; sl@0: CActiveScheduler::Start(); sl@0: Idler->Cancel(); sl@0: PrintInfo(); sl@0: sl@0: test.Next(_L("Periodics with changing system time")); sl@0: TickTest[0]->StartPeriodic(3,1000); sl@0: TickTest[1]->StartPeriodic(5,600); sl@0: TickTest[2]->StartPeriodic(7,400); sl@0: TickTest[3]->StartPeriodic(11,300); sl@0: TickTest[4]->StartPeriodic(13,30); sl@0: TickTest[5]->StartPeriodic(19,30); sl@0: TickTest[6]->StartPeriodic(23,30); sl@0: TickTest[7]->StartPeriodic(37,30); sl@0: Idler->Start(TCallBack(ChangeTime,NULL)); sl@0: ActiveCount=8; sl@0: ErrorCount=0; sl@0: CActiveScheduler::Start(); sl@0: Idler->Cancel(); sl@0: PrintInfo(); sl@0: sl@0: test.Next(_L("Periodics with changing system time in second thread")); sl@0: RThread t; sl@0: r=t.Create(KNullDesC(),ChangeTimeThread,0x1000,NULL,NULL); sl@0: CHECK(r); sl@0: t.SetPriority(EPriorityMore); sl@0: TickTest[0]->StartPeriodic(3,1000); sl@0: TickTest[1]->StartPeriodic(5,600); sl@0: TickTest[2]->StartPeriodic(7,400); sl@0: TickTest[3]->StartPeriodic(11,300); sl@0: TickTest[4]->StartPeriodic(13,30); sl@0: TickTest[5]->StartPeriodic(19,30); sl@0: TickTest[6]->StartPeriodic(23,30); sl@0: TickTest[7]->StartPeriodic(37,30); sl@0: Idler->Start(TCallBack(ChangeTime,NULL)); sl@0: ActiveCount=8; sl@0: ErrorCount=0; sl@0: t.Resume(); sl@0: CActiveScheduler::Start(); sl@0: Idler->Cancel(); sl@0: TRequestStatus s; sl@0: t.Logon(s); sl@0: t.Kill(0); sl@0: User::WaitForRequest(s); sl@0: test(t.ExitType()==EExitKill); sl@0: test(t.ExitReason()==0); sl@0: test(s==0); sl@0: CLOSE_AND_WAIT(t); sl@0: PrintInfo(); sl@0: sl@0: test.Next(_L("Periodics with background timer")); sl@0: TickTest[0]->StartPeriodic(3,1000); sl@0: TickTest[1]->StartPeriodic(5,600); sl@0: TickTest[2]->StartPeriodic(7,400); sl@0: TickTest[3]->StartPeriodic(11,300); sl@0: TickTest[4]->StartPeriodic(13,30); sl@0: TickTest[5]->StartPeriodic(19,30); sl@0: TickTest[6]->StartPeriodic(23,30); sl@0: TickTest[7]->StartPeriodic(37,30); sl@0: BackgroundTimer->Start(); sl@0: ActiveCount=8; sl@0: ErrorCount=0; sl@0: CActiveScheduler::Start(); sl@0: BackgroundTimer->Cancel(); sl@0: PrintInfo(); sl@0: sl@0: test.Next(_L("Periodics with changing system time and tick delay")); sl@0: TickTest[0]->StartPeriodic(3,1000); sl@0: TickTest[1]->StartPeriodic(5,600); sl@0: TickTest[2]->StartPeriodic(7,400); sl@0: TickTest[3]->StartPeriodic(11,300); sl@0: TickTest[4]->StartPeriodic(13,30); sl@0: TickTest[5]->StartPeriodic(19,30); sl@0: TickTest[6]->StartPeriodic(23,30); sl@0: TickTest[7]->StartNShotDelay(17,30,200); sl@0: Idler->Start(TCallBack(ChangeTime,NULL)); sl@0: ActiveCount=8; sl@0: ErrorCount=0; sl@0: CActiveScheduler::Start(); sl@0: Idler->Cancel(); sl@0: PrintInfo(); sl@0: sl@0: ticktest.Close(); sl@0: test.End(); sl@0: return(KErrNone); sl@0: } sl@0: