Prune down surface manager. Interface bit moved to surfacemanager_api. Implementation bit moved to graphics.nokia
// Copyright (c) 1996-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:
// Keyboard repeat test
//
//
#include <e32std.h>
#include <e32svr.h>
#include "W32STD.H"
#include "../tlib/testbase.h"
#include "TMAN.H"
class CRKWindow;
class TKRepeatTest : public CTestBase
{
public:
TKRepeatTest();
~TKRepeatTest();
TestState DoTestL();
void ConstructL();
void TestKeyboardRepeatRateL(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
TBool CheckReportL();
public:
TBool iAbort;
private:
TTimeIntervalMicroSeconds32 iOldInitialTime;
TTimeIntervalMicroSeconds32 iOldTime;
CRKWindow *iWin;
TSize iWinSize;
TInt iState;
};
class CRKWindow : public CTWin
{
enum TRKStates {
EStateWaitingForKeyDown,
EStateWaitingForKeyCode,
EStateWaitingForFirstRepeat,
EStateWaitingForNthRepeat,
EStateWaitingForKeyUp,
EStateInactive,
EStateError,
};
public:
CRKWindow(TKRepeatTest *aTest);
void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
void SetState(TRKStates aState);
void SetKeyboardRepeatRate(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
void WinKeyL(const TKeyEvent &,const TTime &);
void KeyUpL(const TKeyEvent &aKey,const TTime &aTime);
void KeyDownL(const TKeyEvent &aKey,const TTime &aTime);
void Draw();
TDesC& Report();
TBool CheckResults();
protected:
TInt iConnIndex;
TKRepeatTest *iTest;
TRgb iBack;
TRKStates iState;
TInt iDownCode;
TInt iRepCount;
TTimeIntervalMicroSeconds32 iInitialRepeatSet;
TTimeIntervalMicroSeconds32 iRepeatSet;
TTime iPrevTime;
TTimeIntervalMicroSeconds32 iInitialGap;
TTimeIntervalMicroSeconds32 iTotalGap;
TTimeIntervalMicroSeconds32 iMinGap;
TTimeIntervalMicroSeconds32 iMaxGap;
TBuf<0x40> iReport;
};
GLDEF_C CTestBase *CreateKRepeatTest()
{
return(new(ELeave) TKRepeatTest());
}
//
// CRKWindow, class //
//
CRKWindow::CRKWindow(TKRepeatTest *aTest) : CTWin(), iTest(aTest)
{
}
void CRKWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
{
ConstructExtLD(*parent,pos,size);
iWin.SetBackgroundColor(TRgb::Gray256(230));
Activate();
AssignGC(aGc);
}
void CRKWindow::Draw()
{
iGc->Clear();
switch(iState)
{
case EStateWaitingForKeyDown:
iGc->DrawText(_L("Press and hold the space bar"), TPoint(10,20));
break;
case EStateWaitingForFirstRepeat:
case EStateWaitingForNthRepeat:
{
TBuf<0x40> buf;
buf.Format(TRefByValue<const TDesC>(_L("Keep space bar down (%d repeats so far)")),iRepCount);
iGc->DrawText(buf, TPoint(10,20));
}
break;
case EStateWaitingForKeyUp:
iGc->DrawText(_L("Release space bar"), TPoint(10,20));
default:
break;
}
}
void CRKWindow::SetState(TRKStates aState)
{
iState=aState;
DrawNow();
}
TBool CRKWindow::CheckResults()
{
//
// Checks repeat results, first convert everything to 10th's as that what is actually used
// for the timer in the window server.
//
// Return ETrue if the inacuracy in the average time is greater than 1/10th either way
// Allow initial 2/10ths either
// Allow min 2/10ths below
// Allow max 2/10ths above
//
if (iState!=EStateInactive)
return(ETrue);
TInt initial=iInitialGap.Int()/100000;
TInt initialX=iInitialRepeatSet.Int()/100000;
if (initialX==0)
initialX=1;
TInt average=(iTotalGap.Int()/100000)/(iRepCount-1);
TInt repeatX=iRepeatSet.Int()/100000;
if (repeatX==0)
repeatX=1;
TInt min=iMinGap.Int()/100000;
TInt max=iMaxGap.Int()/100000;
if (average>(repeatX+1) || average<(repeatX-1))
return(ETrue);
if (initial>(initialX+2) || initial<(initialX-2))
return(ETrue);
if (min>(repeatX+1) || min<(repeatX-2))
return(ETrue);
if (max>(repeatX+3) || max<repeatX)
return(ETrue);
return(EFalse);
}
TDesC& CRKWindow::Report()
{
if (iState!=EStateInactive)
{
iReport.Format(_L("Error, test not completed"));
}
else
{
TInt initial=iInitialGap.Int()/10000;
TInt initialX=iInitialRepeatSet.Int()/10000;
TInt average=(iTotalGap.Int()/10000/(iRepCount-1));
TInt repeatX=iRepeatSet.Int()/10000;
TInt min=iMinGap.Int()/10000;
TInt max=iMaxGap.Int()/10000;
iReport.Format(TRefByValue<const TDesC>(_L("Initial=%d [%d], Av=%d [%d], Min=%d, Max=%d")),initial,initialX,average,repeatX,min,max);
}
return(iReport);
}
void CRKWindow::KeyDownL(const TKeyEvent &aKey,const TTime &)
{
switch(iState)
{
case EStateWaitingForKeyDown:
SetState(EStateWaitingForKeyCode);
iDownCode=aKey.iScanCode;
break;
default:;
}
}
void CRKWindow::KeyUpL(const TKeyEvent &aKey,const TTime &)
{
if (aKey.iScanCode==iDownCode)
{
switch(iState)
{
case EStateWaitingForKeyUp:
SetState(EStateInactive);
break;
default:
SetState(EStateError);
break;
}
CActiveScheduler::Stop();
}
}
void CRKWindow::WinKeyL(const TKeyEvent &aKey,const TTime &aTime)
{
if (aKey.iCode==EKeyEscape)
{
CActiveScheduler::Stop();
iTest->iAbort=ETrue;
}
if (aKey.iCode==32)
{
switch(iState)
{
case EStateWaitingForKeyCode:
SetState(EStateWaitingForFirstRepeat);
iPrevTime=aTime;
break;
case EStateWaitingForFirstRepeat:
iRepCount=1;
iInitialGap = I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64());
SetState(EStateWaitingForNthRepeat);
break;
case EStateWaitingForNthRepeat:
if (iRepCount==5)
SetState(EStateWaitingForKeyUp);
else
{
TTimeIntervalMicroSeconds32 gap(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64()));
if (gap<iMinGap)
iMinGap=gap;
if (gap>iMaxGap)
iMaxGap=gap;
iTotalGap=iTotalGap.Int()+gap.Int(); // Horrible way to do a +=
iRepCount++;
SetState(EStateWaitingForNthRepeat);
}
case EStateWaitingForKeyUp: // Do nothing here
break;
default:
iTest->TestL(EFalse);
}
iPrevTime=aTime;
}
}
void CRKWindow::SetKeyboardRepeatRate(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime)
{
iInitialRepeatSet=aInitialTime;
iRepeatSet=aTime;
iMinGap=TTimeIntervalMicroSeconds32(100000000); // Any very big number will do
iMaxGap=TTimeIntervalMicroSeconds32(0);
iTotalGap=TTimeIntervalMicroSeconds32(0);
SetState(EStateWaitingForKeyDown);
Client()->iWs.Flush();
}
//
TKRepeatTest::TKRepeatTest() : CTestBase(_L("KRepeat"))
{}
TKRepeatTest::~TKRepeatTest()
{
CTWin::Delete(iWin);
Client()->iWs.SetKeyboardRepeatRate(iOldInitialTime, iOldTime);
}
void TKRepeatTest::ConstructL()
{
iWin=new(ELeave) CRKWindow(this);
TSize screenSize=Client()->iGroup->Size();
iWin->SetUpL(TPoint(5,5),TSize(screenSize.iWidth/2,screenSize.iHeight-10),Client()->iGroup,*Client()->iGc);
Client()->iGroup->SetCurrentWindow(iWin);
Client()->iWs.GetKeyboardRepeatRate(iOldInitialTime, iOldTime);
}
TInt TKRepeatTest::CheckReportL()
{
if (iWin->CheckResults())
{
CTDialog *dialog=new(ELeave) CTDialog();
dialog->SetTitle(_L("Keyboard repeat innacuracies"));
dialog->SetLine1(iWin->Report());
dialog->SetNumButtons(2);
dialog->SetButtonText(0,_L("Okay"));
dialog->SetButtonText(1,_L("Retest"));
dialog->SetButtonText(2,_L("Fail"));
dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
switch(dialog->Display())
{
case 0:
break;
case 1:
return(ETrue); // Redo test
case 2:
TestL(EFalse);
break;
}
}
return(EFalse);
}
void TKRepeatTest::TestKeyboardRepeatRateL(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime)
{
do
{
Client()->iWs.SetKeyboardRepeatRate(aInitialTime, aTime);
iWin->SetKeyboardRepeatRate(aInitialTime, aTime);
CActiveScheduler::Start();
if (iAbort)
AbortL();
} while(CheckReportL());
}
TestState TKRepeatTest::DoTestL()
{
switch(iState)
{
case 0:
LogSubTest(_L("Keyboard Repeat"),1);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(1000000), TTimeIntervalMicroSeconds32(500000));
LogSubTest(_L("Keyboard Repeat"),2);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(200000), TTimeIntervalMicroSeconds32(100000));
LogSubTest(_L("Keyboard Repeat"),3);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(0), TTimeIntervalMicroSeconds32(100000));
LogSubTest(_L("Keyboard Repeat"),4);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(100000), TTimeIntervalMicroSeconds32(100000));
iState++;
break;
default:
return(EFinished);
}
return(ENext);
}