--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiServicePlugins/HtiKeyEventServicePlugin/src/MultiTouchPointerEvent.cpp Tue May 11 16:14:15 2010 +0300
@@ -0,0 +1,257 @@
+/*
+* 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: Functional implementation of one touch(pointer sequence) event service.
+*
+*/
+
+// INCLUDE FILES
+#include "HtiKeyEventServicePlugin.h"
+#include "MultiTouchPointerEvent.h"
+#include "MultiTouchPointerEventHandler.h"
+
+#include <HtiLogging.h>
+
+
+// CONSTANTS
+_LIT8( KErrorInternalFailure, "Internal pointer command failure" );
+_LIT (KPrintInfoString, "PrintInfo event id=%d time=%d type=%d X=%d Y=%d Z=%d");
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerUnit::NewL()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEvent* CMultiTouchPointerEvent::NewL(TUint8 aTouchNumber,
+ CMultiTouchPointerEventHandler* aEventHandler)
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::NewL" );
+ CMultiTouchPointerEvent* self = new (ELeave) CMultiTouchPointerEvent(aTouchNumber, aEventHandler);
+ CleanupStack::PushL ( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::NewL" );
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::CMultiTouchPointerEvent()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEvent::CMultiTouchPointerEvent(TUint8 aTouchNumber,
+ CMultiTouchPointerEventHandler *aEventHandler)
+ : CActive(CActive::EPriorityStandard),
+ iEventHandler(aEventHandler),
+ iTouchNumber(aTouchNumber)
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEvent constructor" );
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::~CMultiTouchPointerEvent()
+// ----------------------------------------------------------------------------
+CMultiTouchPointerEvent::~CMultiTouchPointerEvent()
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEvent destructor" );
+ Cancel();
+ iTimer.Close();
+
+ iTimeArray.ResetAndDestroy();
+ iAdvPointerArray.ResetAndDestroy();
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::ConstructL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::ConstructL()
+ {
+ HTI_LOG_TEXT( "CMultiTouchPointerEvent::ConstructL" );
+ iTimeArray.Reset();
+
+ User::LeaveIfError( iTimer.CreateLocal() );
+ CActiveScheduler::Add( this );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::StartTouch()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::StartTouch()
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::StartTouch" );
+ TBool bcontinue=ETrue;
+ while (iTimeArray.Count()>0 && bcontinue)
+ {
+ TTimeIntervalMicroSeconds32* time=iTimeArray[0];
+ iTimeArray.Remove(0);
+ HTI_LOG_FORMAT( "Event time=%d ", time->Int() );
+ if (time->Int()==0)
+ {
+ // execute immediately
+ SimulatePointerEvent();
+ }
+ else
+ {
+ // wait for specified time
+ iTimer.After( iStatus, *time );
+ SetActive();
+ bcontinue=EFalse;
+ }
+ delete time;
+ }
+
+ if (iTimeArray.Count()==0)
+ {
+ HTI_LOG_FORMAT( "Notify touch %d complete", iTouchNumber );
+ iEventHandler->NotifyTouchComplete(iTouchNumber);
+ }
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::StartTouch" );
+ }
+
+// ----------------------------------------------------------------------------
+// void CMultiTouchPointerEvent::InsertPointArrayL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::InsertPointArrayL(TInt aX,TInt aY,TInt aZ,TRawEvent::TType aEventType)
+ {
+
+ TAdvancedPointer* point = new (ELeave) TAdvancedPointer;
+ CleanupStack::PushL(point);
+ iAdvPointerArray.AppendL(point);
+ CleanupStack::Pop();
+
+ point->X=aX;
+ point->Y=aY;
+ point->Z=aZ;
+ point->EventType=aEventType;
+
+ }
+
+// ----------------------------------------------------------------------------
+// void CMultiTouchPointerEvent::InsertTimeArrayL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::InsertTimeArrayL(TTimeIntervalMicroSeconds32 aDelayTime)
+ {
+
+ TTimeIntervalMicroSeconds32* time=new (ELeave) TTimeIntervalMicroSeconds32(aDelayTime);
+ iTimeArray.AppendL(time);
+
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::InterpolatePointL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::InterpolatePointL(TInt aX1,TInt aY1, TInt aZ1,
+ TInt aX2,TInt aY2, TInt aZ2, TTimeIntervalMicroSeconds32 aDragTime, TInt aStepCount)
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::InterpolatePointL" );
+ TInt dx = (aX2-aX1)/aStepCount;
+ TInt dy = (aY2-aY1)/aStepCount;
+
+ TTimeIntervalMicroSeconds32 dt = aDragTime.Int()/aStepCount;
+ TInt X,Y,Z;
+ for (TInt i=1;i<=aStepCount;i++)
+ {
+ if (i<aStepCount)
+ {
+ X=aX1+i*dx;
+ Y=aY1+i*dy;
+ Z=aZ1;
+ }
+ else
+ {
+ X=aX2;
+ Y=aY2;
+ Z=aZ2;
+ }
+ AddPointL(dt,X,Y,Z,TRawEvent::EPointerMove);
+ }
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::InterpolatePointL" );
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::RunL()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::RunL()
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::RunL" );
+ SimulatePointerEvent();
+ StartTouch();
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::RunL" );
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::RunError()
+// ----------------------------------------------------------------------------
+TInt CMultiTouchPointerEvent::RunError( TInt aError )
+ {
+ HTI_LOG_FORMAT( "CMultiTouchPointerEvent::RunError %d", aError );
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::DoCancel()
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::DoCancel()
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::DoCancel" );
+ iTimer.Cancel();
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::DoCancel" );
+ }
+
+void CMultiTouchPointerEvent::PrintInfo()
+ {
+#ifdef __ENABLE_LOGGING__
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::PrintInfo" );
+
+ HTI_LOG_FORMAT( "PrintInfo touch number=%d ", iTouchNumber );
+
+ TInt size=iTimeArray.Count();
+ HTI_LOG_FORMAT( "PrintInfo event array=%d ", size );
+
+ TBuf<255> buf;
+
+ for (TInt i=0;i<size;i++)
+ {
+ buf.Format(KPrintInfoString,
+ i, iTimeArray[i]->Int(),iAdvPointerArray[i]->EventType ,
+ iAdvPointerArray[i]->X ,iAdvPointerArray[i]->Y, iAdvPointerArray[i]->Z );
+ HTI_LOG_DES(buf);
+ }
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::PrintInfo" );
+#endif
+ }
+// ----------------------------------------------------------------------------
+// CMultiTouchPointerEvent::SimulatePointerEvent()
+// Sends the pointer event as a raw event.
+// ----------------------------------------------------------------------------
+void CMultiTouchPointerEvent::SimulatePointerEvent()
+ {
+ HTI_LOG_FUNC_IN( "CMultiTouchPointerEvent::SimulatePointerEvent" );
+
+ if (iAdvPointerArray.Count()>0)
+ {
+ TAdvancedPointer* pointer = iAdvPointerArray[0];
+ iAdvPointerArray.Remove(0);
+
+ iEventHandler->SimulateEvent(iTouchNumber, pointer->X, pointer->Y, pointer->Z,pointer->EventType);
+ delete pointer;
+ }
+
+ HTI_LOG_FUNC_OUT( "CMultiTouchPointerEvent::SimulatePointerEvent" );
+
+ }
+void CMultiTouchPointerEvent::AddPointL(TTimeIntervalMicroSeconds32 aTime,
+ TInt aX, TInt aY, TInt aZ, TRawEvent::TType aEventType)
+ {
+ InsertPointArrayL( aX, aY, aZ,aEventType);
+ InsertTimeArrayL(aTime);
+ }
+// End of file