--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/systemswstubs/ssyreference/src/ssyreferencechanneldataprovider.cpp Mon Jan 18 20:06:52 2010 +0200
@@ -0,0 +1,303 @@
+/*
+* Copyright (c) 2006-2008 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: Reference implementation of SSY Channel Data Provider interface
+*
+*/
+
+
+#include "ssyreferencechanneldataprovider.h"
+#include "ssyreferencetrace.h"
+#include "ssyreferencechannel.h"
+#include "ssyreferencecontrol.h"
+#include "ssyreferencecmdhandler.h"
+#include "ssycallback.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider C++ constructor
+// ---------------------------------------------------------------------------
+//
+CSsyReferenceChannelDataProvider::CSsyReferenceChannelDataProvider( CSsyReferenceChannel& aChannel ) :
+ iChannel( aChannel )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::CSsyReferenceChannelDataProvider()" ) ) );
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::CSsyReferenceChannelDataProvider() - return" ) ) );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::ConstructL()
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ConstructL()" ) ) );
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ConstructL() - return" ) ) );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::NewL
+// ---------------------------------------------------------------------------
+//
+CSsyReferenceChannelDataProvider* CSsyReferenceChannelDataProvider::NewL( CSsyReferenceChannel& aChannel )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::NewL()" ) ) );
+ CSsyReferenceChannelDataProvider* self = new ( ELeave ) CSsyReferenceChannelDataProvider( aChannel );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::NewL() - return" ) ) );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSsyReferenceChannelDataProvider::~CSsyReferenceChannelDataProvider()
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::~CSsyReferenceChannelDataProvider()" ) ) );
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::~CSsyReferenceChannelDataProvider() - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::StartChannelDataL
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::StartChannelDataL(
+ const TSensrvChannelId aChannelId,
+ TUint8* aBuffer,
+ TInt aCount )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::StartChannelDataL()" ) ) );
+
+ if ( iChannel.ChannelId() != aChannelId )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // Store buffer pointer
+ iDataBuffer = aBuffer;
+ iMaxCount = aCount;
+ iDataCount = 0;
+
+ // Udpate channel state
+ iChannel.UpdateState( CSsyReferenceChannel::ESsyReferenceChannelReceiving );
+
+ // Start receiving
+ iChannel.CommandHandler().ProcessCommand( TSsyReferenceMsg( aChannelId, ESsyReferenceStartChannelData ) );
+
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::StartChannelDataL() - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::StopChannelDataL
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::StopChannelDataL( const TSensrvChannelId aChannelId )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::StopChannelDataL()" ) ) );
+
+ // Leave if wrong channel
+ if ( iChannel.ChannelId() != aChannelId )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // Udpate channel state
+ iChannel.UpdateState( CSsyReferenceChannel::ESsyReferenceChannelOpen );
+
+ // Stop receiving
+ iChannel.CommandHandler().ProcessCommand( TSsyReferenceMsg( aChannelId, ESsyReferenceStopChannelData ) );
+
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::StopChannelDataL() - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::ForceBufferFilledL
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::ForceBufferFilledL( const TSensrvChannelId aChannelId )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ForceBufferFilledL()" ) ) );
+
+ // Leave if wrong channel
+ if ( iChannel.ChannelId() != aChannelId )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ // Send current buffer. Channel keeps receiveing
+ SendBufferFilled();
+
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ForceBufferFilledL() - return" ) ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CSensrvTestCases::GetChannelDataProviderInterfaceL
+// -----------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::GetChannelDataProviderInterfaceL( TUid aInterfaceUid,
+ TAny*& aInterface )
+ {
+ aInterface = NULL;
+
+ if ( aInterfaceUid.iUid == KSsyChannelDataProviderInterface1.iUid )
+ {
+ aInterface = reinterpret_cast<TAny*>(
+ static_cast<MSsyChannelDataProvider*>( this ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::ChannelDataReceived
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::ChannelDataReceivedL( TSsyReferenceMsg* aMessage )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ChannelDataReceived()" ) ) );
+
+ // Get base class from message
+ TSsyRefChannelDataBase* dataItemBase = aMessage->DataItem();
+
+ if ( !dataItemBase )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // get size of the object
+ TInt size( dataItemBase->Size() );
+
+ // First, resolve data item type
+ switch ( dataItemBase->ChannelDataType() )
+ {
+ case TSsyRefChannelDataBase::ESsyRefChannelTypeTapping:
+ {
+ // Cast data item base to tapping data item
+ TSsyRefChannelDataTapping* tappingData = static_cast<TSsyRefChannelDataTapping*>( dataItemBase );
+ TSensrvTappingData senSrvTapping;
+ senSrvTapping.iTimeStamp = tappingData->Timestamp();
+ senSrvTapping.iDirection = tappingData->Direction();
+
+ // Add mapped data item into buffer
+ AddDataToBuffer( reinterpret_cast<TUint8*>( &senSrvTapping ), size );
+ break;
+ }
+ case TSsyRefChannelDataBase::ESsyRefChannelTypeAxis:
+ {
+ // Cast data item base to Axis data item
+ TSsyRefChannelDataAxis* axisData = static_cast<TSsyRefChannelDataAxis*>( dataItemBase );
+ TSensrvAccelerometerAxisData senSrvAxis;
+ senSrvAxis.iTimeStamp = axisData->Timestamp();
+ senSrvAxis.iAxisX = axisData->XAxis();
+ senSrvAxis.iAxisY = axisData->YAxis();
+ senSrvAxis.iAxisZ = axisData->ZAxis();
+
+ // Add data to buffer
+ AddDataToBuffer( reinterpret_cast<TUint8*>( &senSrvAxis ), size );
+ break;
+ }
+ case TSsyRefChannelDataBase::ESsyRefChannelTypeProximity:
+ {
+ // Cast data item base to tapping data item
+ TSsyRefChannelDataProximity* proximityData = static_cast<TSsyRefChannelDataProximity*>( dataItemBase );
+ TSensrvProximityData senSrvProximity;
+ senSrvProximity.iProximityState = ( TSensrvProximityData::TProximityState ) proximityData->ProximityState();
+
+ // Add mapped data item into buffer
+ AddDataToBuffer( reinterpret_cast<TUint8*>( &senSrvProximity ), size );
+ break;
+ }
+ case TSsyRefChannelDataBase::ESsyRefChannelTypeAmbientLight:
+ {
+ // Cast data item base to tapping data item
+ TSsyRefChannelDataAmbientLight* ambientLightData = static_cast<TSsyRefChannelDataAmbientLight*>( dataItemBase );
+ TSensrvAmbientLightData senSrvAmbientLight;
+ senSrvAmbientLight.iAmbientLight = ambientLightData->AmbientLightState();
+
+ // Add mapped data item into buffer
+ AddDataToBuffer( reinterpret_cast<TUint8*>( &senSrvAmbientLight ), size );
+ break;
+ }
+ case TSsyRefChannelDataBase::ESsyRefChannelTypeMagneticAxis:
+ {
+ // Cast data item base to Axis data item
+ TSsyRefChannelDataMagneticAxis* axisData = static_cast<TSsyRefChannelDataMagneticAxis*>( dataItemBase );
+ TSensrvMagnetometerAxisData senSrvAxis;
+ senSrvAxis.iTimeStamp = axisData->Timestamp();
+ senSrvAxis.iAxisXRaw = axisData->XAxis();
+ senSrvAxis.iAxisYRaw = axisData->YAxis();
+ senSrvAxis.iAxisZRaw = axisData->ZAxis();
+ senSrvAxis.iAxisXCalibrated = axisData->XAxisCalib();
+ senSrvAxis.iAxisYCalibrated = axisData->YAxisCalib();
+ senSrvAxis.iAxisZCalibrated = axisData->ZAxisCalib();
+
+ // Add data to buffer
+ AddDataToBuffer( reinterpret_cast<TUint8*>( &senSrvAxis ), size );
+ break;
+ }
+ default:
+ {
+ // Unknown data item -> Leave
+ User::Leave( KErrUnknown );
+ }
+ }
+
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::ChannelDataReceived() - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::AddDataToBuffer
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::AddDataToBuffer( TUint8* aData, const TInt aSize )
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::AddDataToBuffer()" ) ) );
+ // Write data to buffer. If buffer is full, send notification to SensorServer
+
+ // Write data bytes one by one to buffer pointer. The actual buffer is in Sensor Server
+ for ( TInt i = 0; i < aSize; i++ )
+ {
+ *iDataBuffer++ = *aData++;
+ }
+
+ // Increase number of items count
+ iDataCount++;
+
+ // Check is maximum data count received
+ if ( iDataCount == iMaxCount )
+ {
+ // Send BufferFilled notification to Sensor server
+ SendBufferFilled();
+ }
+
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::AddDataToBuffer() - return" ) ) );
+ }
+
+// ---------------------------------------------------------------------------
+// CSsyReferenceChannelDataProvider::SendBufferFilled
+// ---------------------------------------------------------------------------
+//
+void CSsyReferenceChannelDataProvider::SendBufferFilled()
+ {
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::SendBufferFilled()" ) ) );
+ // Send BufferFilled notification to Sensor server
+ iChannel.SsyControl().SsyCallback().BufferFilled( iChannel.ChannelId(), iDataCount, iDataBuffer, iMaxCount );
+ iDataCount = 0;
+ COMPONENT_TRACE( ( _L( "SSY Reference Plugin - CSsyReferenceChannelDataProvider::SendBufferFilled() - return" ) ) );
+ }
+
+// End of file