diff -r 000000000000 -r 39ab869ed429 htiui/HtiServicePlugins/HtiKeyEventServicePlugin/src/MultiTouchPointerEventHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/htiui/HtiServicePlugins/HtiKeyEventServicePlugin/src/MultiTouchPointerEventHandler.cpp Wed Aug 25 15:45:01 2010 +0300 @@ -0,0 +1,286 @@ +/* +* 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 advanced pointer multitouch service +* +*/ + +// INCLUDE FILES +#include "HtiKeyEventServicePlugin.h" +#include "MultiTouchPointerEventHandler.h" +#include "MultiTouchPointerEvent.h" + +#include +#include + +// CONSTANTS + + +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::NewL() +// ---------------------------------------------------------------------------- +CMultiTouchPointerEventHandler* CMultiTouchPointerEventHandler::NewL(MHtiMultiTouchObserver& aObserver) + { + HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::NewL" ); + CMultiTouchPointerEventHandler* self = new (ELeave) CMultiTouchPointerEventHandler(aObserver); + CleanupStack::PushL ( self ); + self->ConstructL(); + CleanupStack::Pop(); + HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::NewL" ); + return self; + } + +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::CMultiTouchPointerEventHandler() +// ---------------------------------------------------------------------------- +CMultiTouchPointerEventHandler::CMultiTouchPointerEventHandler(MHtiMultiTouchObserver& aObserver) + :iFinishedCount(0), iObserver(aObserver) + { + HTI_LOG_TEXT( "CMultiTouchPointerEventHandler constructor" ); + } + +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::~CMultiTouchPointerEventHandler() +// ---------------------------------------------------------------------------- +CMultiTouchPointerEventHandler::~CMultiTouchPointerEventHandler() + { + HTI_LOG_TEXT( "CMultiTouchPointerEventHandler destructor" ); + Clear(); + iWsSession.Close(); + } + +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::ConstructL() +// ---------------------------------------------------------------------------- +void CMultiTouchPointerEventHandler::ConstructL() + { + HTI_LOG_TEXT( "CMultiTouchPointerEventHandler::ConstructL" ); + User::LeaveIfError( iWsSession.Connect() ); + } +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::Clear() +// ---------------------------------------------------------------------------- +void CMultiTouchPointerEventHandler::Clear() + { + HTI_LOG_TEXT( "CMultiTouchPointerEventHandler::Clear" ); + iTouchPointerArray.ResetAndDestroy(); + iFinishedCount=0; + } +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::NotifyTouchComplete() +// ---------------------------------------------------------------------------- +void CMultiTouchPointerEventHandler::NotifyTouchComplete(TUint8 aTouchNumber) + { + HTI_LOG_FUNC_IN("CMultiTouchPointerEventHandler::NotifyTouchComplete"); + + iFinishedCount++; + HTI_LOG_FORMAT( "touch number %d finished", aTouchNumber); + HTI_LOG_FORMAT( "%d touch finished", iFinishedCount); + + if(iTouchPointerArray.Count() == iFinishedCount) + { + // notify observer + iObserver.NotifyMultiTouchComplete(); + } + + HTI_LOG_FUNC_OUT("CMultiTouchPointerEventHandler::NotifyTouchComplete"); + } +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::ParsePoint() +// ---------------------------------------------------------------------------- +TBool CMultiTouchPointerEventHandler::ParsePoint( const TDesC8& aData, TInt& aoffset, + TInt& aX, TInt& aY, TInt& aZ, + TTimeIntervalMicroSeconds32& aWait, TTimeIntervalMicroSeconds32& aHold ) + { + HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::ParsePoint" ); + + TInt dataLength = aData.Length(); + if ( dataLength-aoffset < 14 ) + return EFalse ; + + aX = aData[aoffset] + ( aData[aoffset+1] << 8 ); + aoffset += 2; + + aY = aData[aoffset] + ( aData[aoffset+1] << 8 ); + aoffset += 2; + + aZ = aData[aoffset] + ( aData[aoffset+1] << 8 ); + aoffset += 2; + + aWait = (aData[aoffset] + ( aData[aoffset+1] << 8 ) + + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000; + aoffset += 4; + + aHold = ( aData[aoffset] + ( aData[aoffset+1] << 8 ) + + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000; + aoffset += 4; + + HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::ParsePoint" ); + return ETrue; + } +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::ParseMove() +// ---------------------------------------------------------------------------- +TBool CMultiTouchPointerEventHandler::ParseMove( const TDesC8& aData, TInt& aoffset, + TTimeIntervalMicroSeconds32& aDragTime, TInt& aStepCount ) + { + HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::ParseMove" ); + + TInt dataLength = aData.Length(); + if ( dataLength-aoffset < 6 ) + return EFalse ; + + aDragTime = ( aData[aoffset] + ( aData[aoffset+1] << 8 ) + + ( aData[aoffset+2] << 16 ) + (aData[aoffset+3] << 24) ) * 1000; + aoffset += 4; + + aStepCount = aData[aoffset] + ( aData[aoffset+1] << 8 ); + aoffset += 2; + + HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::ParseMove" ); + return ETrue; + } +// ---------------------------------------------------------------------------- +// CMultiTouchPointerEventHandler::HandleMultiTouchL() +// ---------------------------------------------------------------------------- +TBool CMultiTouchPointerEventHandler::HandleMultiTouchL( const TDesC8& aData ) + { + HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::HandleMultiTouchL" ); + TBool validparameter=EFalse; + + TInt dataLength = aData.Length(); + if ( dataLength < 1 ) + return validparameter; + + // Parse the parameters - correct length is already verified + TInt offset = 0; + + TInt touchCount = aData[offset]; + offset += 1; + HTI_LOG_FORMAT( "Number of touches: %d", touchCount ); + if (touchCount<=0) + return validparameter; + + for(TInt i=0; iInterpolatePointL(lastX, lastY, lastZ,X1,Y1,Z1,dragTime,stepCount); + } + + // set last point + lastX=X1; + lastY=Y1; + lastZ=Z1; + + // wait event + touch->AddPointL(waitTime,X1,Y1,Z1,TRawEvent::EButton1Down); + + // hold event + touch->AddPointL(holdTime, X1,Y1,Z1,TRawEvent::EPointerMove); + + if (j!=pointerCount-1) + { + // not last point + if (!ParseMove(aData, offset, dragTime, stepCount)) + return validparameter; + if (dragTime.Int() < 0 || stepCount <= 0) + return validparameter; + } + else + { + // last point + touch->AddPointL(0,X1,Y1,Z1,TRawEvent::EButton1Up); + } + } + + touch->PrintInfo(); + + } + + + for (TInt i=0;iStartTouch(); + + validparameter=ETrue; + + HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::HandleMultiTouchL" ); + return validparameter; + } + +void CMultiTouchPointerEventHandler::SimulateEvent(TUint8 aTouchNumber, + TInt aX, TInt aY, TInt aZ, TRawEvent::TType aEventType) + { + HTI_LOG_FUNC_IN( "CMultiTouchPointerEventHandler::SimulateEvent" ); + + TRawEvent rawEvent; + rawEvent.SetPointerNumber( aTouchNumber ); + rawEvent.Set( aEventType, aX, aY, aZ); + + HTI_LOG_FORMAT( "SimulatePointer touch number=%d ", aTouchNumber ); + HTI_LOG_FORMAT( "SimulatePointer event=%d ", aEventType ); + HTI_LOG_FORMAT( "SimulatePointer X=%d ", aX ); + HTI_LOG_FORMAT( "SimulatePointer Y=%d ", aY ); + HTI_LOG_FORMAT( "SimulatePointer Z=%d", aZ ); + + iWsSession.SimulateRawEvent( rawEvent ); + iWsSession.Flush(); + + HTI_LOG_FUNC_OUT( "CMultiTouchPointerEventHandler::SimulateEvent" ); + + } + +// End of file