--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/akntouchgesturefw/src/akntouchgesturefwutils.cpp Wed Sep 01 12:16:19 2010 +0100
@@ -0,0 +1,476 @@
+/*
+* 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: Touch gesture framework utility functions.
+*
+*/
+
+#include <akntouchgesturefwevents.h>
+
+#include "akntouchgesturefwutils.h"
+#include "akntouchgesturefwdefs.h"
+
+using namespace AknTouchGestureFw;
+
+_LIT(KAknTouchPointerEventDown, "[GFW] IN P%d DOWN (%d, %d) %S");
+_LIT(KAknTouchPointerEventDrag, "[GFW] IN P%d DRAG (%d, %d) %S");
+_LIT(KAknTouchPointerEventUp, "[GFW] IN P%d UP (%d, %d) %S");
+_LIT(KAknTouchPointerEventHw, "HW");
+_LIT(KAknTouchPointerEventSimulated, "SM");
+_LIT(KAknTouchGestureGeneric, "[GFW] OUT S:%d G:%x T:%x %%:%d");
+_LIT(KAknTouchGesturePointer,
+ "[GFW] ... %d: SP:(%d,%d) CP:(%d,%d) PP:(%d,%d) S:(%d,%d)");
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// TPointerEventData::TPointerEventData
+// ---------------------------------------------------------------------------
+//
+AknTouchGestureFw::TPointerEventData::TPointerEventData(
+ TPointerEvent& aPointerEvent,
+ TInt aPointerNumber,
+ const TTime& aTimeStamp,
+ TBool aSimulated,
+ TBool aTargetedToControl )
+ : iPointerEvent( aPointerEvent ),
+ iPointerNumber( aPointerNumber ),
+ iTimeStamp( aTimeStamp ),
+ iSimulated( aSimulated ),
+ iTargetedToControl( aTargetedToControl )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TPointEntry::TPointEntry
+// ---------------------------------------------------------------------------
+//
+TPointEntry::TPointEntry( const TPoint& aPos, const TTime& aTime )
+ : iPos( aPos ), iTime( aTime )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TPointEntry::TPointEntry
+// ---------------------------------------------------------------------------
+//
+TPointEntry::TPointEntry()
+ : iPos( TPoint() ), iTime( TTime() )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TVector::TVector
+// ---------------------------------------------------------------------------
+//
+TVector::TVector( const TPoint& aFrom, const TPoint& aTo )
+ : iX( aTo.iX - aFrom.iX ),
+ iY( aTo.iY - aFrom.iY )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TVector::TVector
+// ---------------------------------------------------------------------------
+//
+TVector::TVector( TReal aDeltaX, TReal aDeltaY )
+ : iX( aDeltaX ), iY( aDeltaY )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TVector::TVector
+// ---------------------------------------------------------------------------
+//
+TVector::TVector()
+ : iX( 0 ), iY( 0 )
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// TVector::Angle
+// ---------------------------------------------------------------------------
+//
+TInt TVector::Angle() const
+ {
+ TReal angle = 0;
+ TReal length = Length();
+ if ( Abs( length ) > KEpsilon )
+ {
+ Math::ACos( angle, iX / length );
+ if ( iY < 0 )
+ {
+ angle = 2 * KPi - angle;
+ }
+ }
+
+ return Degrees( angle );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TVector::Length
+// ---------------------------------------------------------------------------
+//
+TReal TVector::Length() const
+ {
+ TReal length = 0;
+ Math::Sqrt( length, iX * iX + iY * iY );
+ return length;
+ }
+
+
+// ---------------------------------------------------------------------------
+// static TVector::Degrees
+// ---------------------------------------------------------------------------
+//
+TInt TVector::Degrees( TReal aRadians )
+ {
+ return aRadians * 180 / KPi;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::TThresholdArea
+// ---------------------------------------------------------------------------
+//
+TThresholdArea::TThresholdArea()
+ : iInitialPosition(), iActive( EFalse )
+ {
+ Reset();
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::Reset
+// ---------------------------------------------------------------------------
+//
+void TThresholdArea::Reset()
+ {
+ iInitialPosition = TPoint();
+ iActive = EFalse;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::IsActive
+// ---------------------------------------------------------------------------
+//
+TBool TThresholdArea::IsActive() const
+ {
+ return iActive;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::InitialPosition
+// ---------------------------------------------------------------------------
+//
+TPoint TThresholdArea::InitialPosition() const
+ {
+ TPoint position;
+ if ( iActive )
+ {
+ position = iInitialPosition;
+ }
+ return position;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::Start
+// ---------------------------------------------------------------------------
+//
+void TThresholdArea::Start( const TPoint& aInitialPosition )
+ {
+ iInitialPosition = aInitialPosition;
+ iActive = ETrue;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TThresholdArea::Check
+// ---------------------------------------------------------------------------
+//
+TBool TThresholdArea::Check( const TPoint& aNewPosition, TInt aMargin ) const
+ {
+ TBool crossed = EFalse;
+ if ( iActive )
+ {
+ TInt deltaX = aNewPosition.iX - iInitialPosition.iX;
+ TInt deltaY = aNewPosition.iY - iInitialPosition.iY;
+ deltaX = Abs( deltaX );
+ deltaY = Abs( deltaY );
+ crossed = deltaX > aMargin || deltaY > aMargin;
+ }
+ return crossed;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Dumps pointer event data to the debug output.
+// ---------------------------------------------------------------------------
+//
+void AknTouchGestureFwUtils::DumpPointerEvent( const TPointerEvent& aEvent,
+ TBool aSimulated )
+ {
+ TInt pointerNumber = 0;
+
+ if ( aEvent.IsAdvancedPointerEvent() )
+ {
+ pointerNumber = aEvent.AdvancedPointerEvent()->PointerNumber();
+ }
+
+ const TDesC* source;
+ if ( aSimulated )
+ {
+ source = &KAknTouchPointerEventSimulated;
+ }
+ else
+ {
+ source = &KAknTouchPointerEventHw;
+ }
+
+ switch ( aEvent.iType )
+ {
+ case TPointerEvent::EButton1Down:
+ RDebug::Print(KAknTouchPointerEventDown, pointerNumber,
+ aEvent.iPosition.iX, aEvent.iPosition.iY, source);
+ break;
+
+ case TPointerEvent::EDrag:
+ RDebug::Print(KAknTouchPointerEventDrag, pointerNumber,
+ aEvent.iPosition.iX, aEvent.iPosition.iY, source);
+ break;
+
+ case TPointerEvent::EButton1Up:
+ RDebug::Print(KAknTouchPointerEventUp, pointerNumber,
+ aEvent.iPosition.iX, aEvent.iPosition.iY, source);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Dumps gesture event data to the debug output.
+// ---------------------------------------------------------------------------
+//
+void AknTouchGestureFwUtils::DumpGestureEvent(
+ MAknTouchGestureFwEvent& aEvent )
+ {
+ TInt movement( 0 );
+ TPoint startPos;
+ TPoint currentPos;
+ TPoint previousPos;
+ TPoint speed;
+ TAknTouchGestureFwState state( EAknTouchGestureFwOn );
+
+ switch ( aEvent.Group() )
+ {
+ case EAknTouchGestureFwGroupTap:
+ {
+ MAknTouchGestureFwTapEvent* tap =
+ static_cast<MAknTouchGestureFwTapEvent*>( &aEvent );
+ startPos = tap->Position();
+ }
+ break;
+
+ case EAknTouchGestureFwGroupFlick:
+ {
+ MAknTouchGestureFwFlickEvent* flick =
+ static_cast<MAknTouchGestureFwFlickEvent*>( &aEvent );
+ startPos = flick->Position();
+ speed = flick->Speed();
+ }
+ break;
+
+ case EAknTouchGestureFwGroupDrag:
+ {
+ MAknTouchGestureFwDragEvent* drag =
+ static_cast<MAknTouchGestureFwDragEvent*>( &aEvent );
+ startPos = drag->StartPosition();
+ currentPos = drag->CurrentPosition();
+ previousPos = drag->PreviousPosition();
+ state = drag->State();
+ }
+ break;
+
+ case EAknTouchGestureFwGroupPinch:
+ {
+ MAknTouchGestureFwPinchEvent* pinch =
+ static_cast<MAknTouchGestureFwPinchEvent*>( &aEvent );
+ movement = pinch->Movement();
+ state = pinch->State();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ RDebug::Print( KAknTouchGestureGeneric,
+ state, aEvent.Group(),
+ aEvent.Type(), movement );
+ RDebug::Print(KAknTouchGesturePointer, 0,
+ startPos.iX, startPos.iY, currentPos.iX, currentPos.iY,
+ previousPos.iX, previousPos.iY, speed.iX, speed.iY );
+ }
+
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::TDirectionTracer
+// ---------------------------------------------------------------------------
+//
+TDirectionTracer::TDirectionTracer()
+ : iDirection( EDirectionNeutral ), iDirectionChanged( EFalse ),
+ iChangeDirection( EDirectionNeutral ), iChangeCounter( 0 )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::Reset
+// ---------------------------------------------------------------------------
+//
+void TDirectionTracer::Reset()
+ {
+ iDirection = EDirectionNeutral;
+ iDirectionChanged = EFalse;
+ iChangeDirection = EDirectionNeutral;
+ iChangeCounter = 0;
+ }
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::Update
+// ---------------------------------------------------------------------------
+//
+void TDirectionTracer::Update( TInt aDelta, TInt aSensitivity )
+ {
+ iDirectionChanged = EFalse;
+
+ if ( !aDelta )
+ {
+ return; // no change, cannot determine direction
+ }
+
+ if ( iDirection == EDirectionNeutral )
+ {
+ TDirection direction = EDirectionNeutral;
+ if ( aDelta > 0 )
+ {
+ direction = EDirectionPositive;
+ }
+ else
+ {
+ direction = EDirectionNegative;
+ }
+
+ if ( direction == iChangeDirection )
+ {
+ iChangeCounter++;
+
+ if ( iChangeCounter >= aSensitivity )
+ {
+ iDirection = iChangeDirection;
+ iDirectionChanged = ETrue;
+ iChangeCounter = 0;
+ }
+ }
+ else
+ {
+ iChangeDirection = direction;
+ iChangeCounter = 0;
+ iChangeCounter++;
+ }
+ }
+ else if ( iDirection == EDirectionPositive )
+ {
+ // Subsequent direction changes require a couple of movement
+ // to same direction
+
+ if ( CheckDirectionChange( -aDelta, aSensitivity, iChangeCounter ) )
+ {
+ iDirection = EDirectionNegative;
+ iDirectionChanged = ETrue;
+ }
+ }
+ else // iDirection == EDirectionNegative
+ {
+ // Subsequent direction changes require a couple of movement
+ // to same direction
+
+ if ( CheckDirectionChange( aDelta, aSensitivity, iChangeCounter ) )
+ {
+ iDirection = EDirectionPositive;
+ iDirectionChanged = ETrue;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::IsDirectionChanged
+// ---------------------------------------------------------------------------
+//
+TBool TDirectionTracer::IsDirectionChanged() const
+ {
+ return iDirectionChanged;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::Direction
+// ---------------------------------------------------------------------------
+//
+TDirectionTracer::TDirection TDirectionTracer::Direction() const
+ {
+ return iDirection;
+ }
+
+
+// ---------------------------------------------------------------------------
+// TDirectionTracer::CheckDirectionChange
+// ---------------------------------------------------------------------------
+//
+TBool TDirectionTracer::CheckDirectionChange(
+ TInt aDelta, TInt aSensitivity, TInt& aCounter)
+ {
+ TBool directionChanged = EFalse;
+
+ if ( aDelta > 0 )
+ {
+ aCounter++;
+ }
+ else
+ {
+ aCounter = 0;
+ }
+
+ if ( aCounter >= aSensitivity )
+ {
+ aCounter = 0;
+ directionChanged = ETrue;
+ }
+
+ return directionChanged;
+ }
+
+// End of File