--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/systemswstubs/ssyreference/inc/ssyreferenceconfig.h Mon Jan 18 20:06:52 2010 +0200
@@ -0,0 +1,598 @@
+/*
+* Copyright (c) 2006 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: Contains SSY Reference's channel configuration data
+*
+*/
+
+
+
+
+#ifndef SSYREFERENCECONFIG_H
+#define SSYREFERENCECONFIG_H
+
+// INCLUDES
+#include <e32base.h>
+#include <f32file.h>
+#include <sensrvtypes.h>
+#include <sensrvchannelinfo.h>
+#include <gmxmlparser.h>
+#include <sensrvchanneldatatypes.h>
+#include <sensrvproximitysensor.h>
+#include <sensrvilluminationsensor.h>
+
+// CONSTANTS
+// Data item sizes
+const TInt KSsyRefAxisDataItemSize = sizeof( TSensrvAccelerometerAxisData );
+const TInt KSsyRefTappingDataItemSize = sizeof( TSensrvTappingData );
+const TInt KSsyRefProximityDataItemSize = sizeof( TSensrvProximityData );
+const TInt KSsyRefAmbientLightDataItemSize = sizeof( TSensrvAmbientLightData );
+const TInt KSsyRefMagneticAxisDataItemSize = sizeof( TSensrvMagnetometerAxisData );
+
+// ENUMS
+enum TSsyReferenceFunctions
+ {
+ ESsyReferenceOpenChannel,
+ ESsyReferenceOpenChannelResp,
+ ESsyReferenceDataItemReceived,
+ ESsyReferenceCloseChannel,
+ ESsyReferenceCloseChannelResp,
+ ESsyReferenceStartChannelData,
+ ESsyReferenceStopChannelData
+ };
+
+/**
+ * Base class for Channel data types. Contains iChannelDataType which is set
+ * by derived classes on construction.
+ */
+class TSsyRefChannelDataBase
+ {
+ public:
+ /**
+ * Enumeration for possible channel data types
+ */
+ enum TSsyRefChannelDataType
+ {
+ ESsyRefChannelTypeTapping = 5000,
+ ESsyRefChannelTypeAxis,
+ ESsyRefChannelTypeProximity,
+ ESsyRefChannelTypeAmbientLight,
+ ESsyRefChannelTypeMagneticAxis
+ };
+
+ TInt ChannelDataType() const { return iChannelDataType; }
+ TInt Interval() const { return iInterval; }
+
+ void SetTimestamp( const TTime aTimestamp ) { iTimestamp = aTimestamp; }
+ TTime Timestamp() const { return iTimestamp; }
+
+ TInt Size() const { return iSize; }
+
+ protected:
+
+ /**
+ * Protected constructor as this class is not supposed to be instantiate
+ * directly.
+ */
+ TSsyRefChannelDataBase() {}
+
+ protected: // data
+
+ /**
+ * Identifies the type of data type class derived from this base class
+ */
+ TInt iChannelDataType;
+
+ /**
+ * Interval. Indicates time in ms from previous item until next item is produced
+ */
+ TInt iInterval;
+
+ /**
+ * Timestamp. Time when this data item is generated.
+ */
+ TTime iTimestamp;
+
+ /**
+ * Size of one data item. This is filled by derived class
+ */
+ TInt iSize;
+
+ /**
+ * Axis data item values.
+ * Accessible from TSsyRefChannelDataAxis/TSsyRefChannelDataMagneticAxis classes
+ */
+ TInt iXAxis;
+ TInt iYAxis;
+ TInt iZAxis;
+ /**
+ * Axis data calibrated values.
+ * Accessible from TSsyRefChannelDataMagneticAxis classes
+ */
+ TInt iXAxisCalib;
+ TInt iYAxisCalib;
+ TInt iZAxisCalib;
+
+
+ /**
+ * Proximity data item values.
+ * Accessible only from TSsyRefChannelProximity class
+ */
+ TInt iProximityState;
+
+ /**
+ * AmbientLight data item values.
+ * Accessible only from TSsyRefChannelAmbientLight class
+ */
+ TInt iAmbientLightState;
+
+ /**
+ * Tapping data item values. Difrection of the tapping.
+ * Accessible only from TSsyRefChannelDataTapping class
+ */
+ TInt iDirection;
+ };
+
+// Type definition array for Data item base class
+typedef RArray<TSsyRefChannelDataBase> TSsyRefDataItemArray;
+
+/**
+ * Message item for SSY <--> Sensor communications
+ * Contains Channel ID for which the message belongs to,
+ * Function ID that identifies the command and
+ * error for error cases.
+ */
+class TSsyReferenceMsg
+ {
+ public:
+
+ /**
+ * Constructor of the TSsyReferenceMsg
+ *
+ * @since S60 5.0
+ * @param[in] aChannelId Channel identifier
+ * @param[in] aFunction See TSsyReferenceFunctions
+ */
+ TSsyReferenceMsg( TInt aChannelId, TInt aFunction ) :
+ iChannelId( aChannelId ),
+ iFunction( aFunction ),
+ iError( KErrNone )
+ {}
+
+ /**
+ * Copy constructor of the TSsyReferenceMsg
+ *
+ * @since S60 5.0
+ * @param[in] aMsg Object to be copied to constructed object
+ */
+ TSsyReferenceMsg( const TSsyReferenceMsg& aMsg ) :
+ iChannelId( aMsg.iChannelId ),
+ iFunction( aMsg.iFunction ),
+ iError( aMsg.iError )
+ {}
+
+ TInt ChannelId() { return iChannelId; }
+
+ void SetFunction( TInt aFunction ) { iFunction = aFunction; }
+ TInt Function() { return iFunction; }
+
+ void SetError( TInt aError ) { iError = aError; }
+ TInt Error() { return iError; }
+
+ void SetDataItem( TSsyRefChannelDataBase* aDataItem ) { iDataItem = aDataItem; }
+ TSsyRefChannelDataBase* DataItem() const { return iDataItem; }
+
+ private: // data
+
+ TInt iChannelId; // Identifies the channel
+ TInt iFunction; // Identifies the command
+ TInt iError; // Error is passed to response handler
+
+ // Data item for received data. This is casted to correct data item
+ // class implementation according to ChannelDataType
+ TSsyRefChannelDataBase* iDataItem;
+ };
+
+/**
+ * Tapping data type class implementation.
+ */
+class TSsyRefChannelDataTapping : public TSsyRefChannelDataBase
+ {
+ public:
+
+ TSsyRefChannelDataTapping( TInt aDirection, TInt aInterval )
+ {
+ iChannelDataType = ESsyRefChannelTypeTapping;
+ iSize = KSsyRefTappingDataItemSize;
+ iInterval = aInterval;
+ iDirection = aDirection;
+ }
+
+ TInt Direction() const { return iDirection; }
+ };
+
+/**
+ * XYZ Axis data type class implementation.
+ */
+class TSsyRefChannelDataAxis : public TSsyRefChannelDataBase
+ {
+ public:
+
+ TSsyRefChannelDataAxis( TInt aXAxis, TInt aYAxis, TInt aZAxis,
+ TInt aInterval )
+ {
+ iChannelDataType = ESsyRefChannelTypeAxis;
+ iSize = KSsyRefAxisDataItemSize;
+ iInterval = aInterval;
+ iXAxis = aXAxis;
+ iYAxis = aYAxis;
+ iZAxis = aZAxis;
+ }
+
+ TInt XAxis() const { return iXAxis; }
+ TInt YAxis() const { return iYAxis; }
+ TInt ZAxis() const { return iZAxis; }
+ };
+
+
+/**
+ * Proximity data type class implementation.
+ */
+class TSsyRefChannelDataProximity : public TSsyRefChannelDataBase
+ {
+ public:
+
+ TSsyRefChannelDataProximity( TInt aProximityState, TInt aInterval )
+ {
+ iChannelDataType = ESsyRefChannelTypeProximity;
+ iSize = KSsyRefProximityDataItemSize;
+ iInterval = aInterval;
+ iProximityState = aProximityState;
+ }
+
+ TInt ProximityState() const { return iProximityState; }
+ };
+
+/**
+ * AmbientLight data type class implementation.
+ */
+class TSsyRefChannelDataAmbientLight : public TSsyRefChannelDataBase
+ {
+ public:
+
+ TSsyRefChannelDataAmbientLight( TInt aAmbientLightState, TInt aInterval )
+ {
+ iChannelDataType = ESsyRefChannelTypeAmbientLight;
+ iSize = KSsyRefAmbientLightDataItemSize;
+ iInterval = aInterval;
+ iAmbientLightState = aAmbientLightState;
+ }
+
+ TInt AmbientLightState() const { return iAmbientLightState; }
+ };
+
+/**
+ * XYZ Axis data type class implementation.
+ */
+class TSsyRefChannelDataMagneticAxis : public TSsyRefChannelDataBase
+ {
+ public:
+
+ TSsyRefChannelDataMagneticAxis( TInt aXAxis, TInt aYAxis, TInt aZAxis,
+ TInt aXAxisCalib, TInt aYAxisCalib, TInt aZAxisCalib, TInt aInterval )
+ {
+ iChannelDataType = ESsyRefChannelTypeMagneticAxis;
+ iSize = KSsyRefMagneticAxisDataItemSize;
+ iInterval = aInterval;
+ iXAxis = aXAxis;
+ iYAxis = aYAxis;
+ iZAxis = aZAxis;
+ iXAxisCalib = aXAxisCalib;
+ iYAxisCalib = aYAxisCalib;
+ iZAxisCalib = aZAxisCalib;
+ }
+
+ TInt XAxis() const { return iXAxis; }
+ TInt YAxis() const { return iYAxis; }
+ TInt ZAxis() const { return iZAxis; }
+ TInt XAxisCalib() const { return iXAxisCalib; }
+ TInt YAxisCalib() const { return iYAxisCalib; }
+ TInt ZAxisCalib() const { return iZAxisCalib; }
+ };
+
+/**
+ * Channel ID pair class for pairing config file channel id and
+ * Sensor Server generated channel ID.
+ *
+ */
+class TSsyRefChannelIdPair
+ {
+ public:
+ /**
+ * Constructor of the TSsyRefChannelIdPair
+ *
+ * @since S60 5.0
+ * @param[in] aConfigChannelId Channel identifier from config file
+ */
+ TSsyRefChannelIdPair( TInt aConfigChannelId ) :
+ iConfigChannelId( aConfigChannelId )
+ {}
+
+ TInt ConfigId() const { return iConfigChannelId; }
+ TInt ServerId() const { return iSrvChannelId; }
+
+ void SetServerId( const TInt aSrvId ) { iSrvChannelId = aSrvId; }
+
+ private: // data
+
+ TInt iConfigChannelId; // Config file ID of the channel
+ TInt iSrvChannelId; // Sensor server assigned ID of the channel
+ };
+
+typedef RArray<TSsyRefChannelIdPair> TSsyRefChannelIdArray;
+
+
+// CONSTANTS
+
+/**
+ * Configuration class for SSY reference plugin. Generates configured SSY channel information.
+ * This keeps reference SSY implementation independent from 'sensor' it uses. This class is fully
+ * modifiable regarding to the needs of this SSY. It may be for example accelerometer sensor
+ * without any changes in the SSY reference implementation. Only this class is modified.
+ *
+ * @lib ssyreferenceplugin.lib
+ * @since S60 5.0
+ */
+class CSsyReferenceConfig : public CActive, public MMDXMLParserObserver
+ {
+
+public:
+
+ /**
+ * Two-phase constructor
+ *
+ * @since S60 5.0
+ * @return CSsyReferenceConfig* Pointer to created CSsyReferenceControl object
+ */
+ static CSsyReferenceConfig* NewL();
+
+ /**
+ * Virtual destructor
+ *
+ * @since S60 5.0
+ */
+ virtual ~CSsyReferenceConfig();
+
+ /**
+ * From CActive
+ */
+ void RunL();
+
+ /**
+ * From CActive
+ */
+ void DoCancel();
+
+ /**
+ * From CActive
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * From MMDXMLParserObserver
+ *
+ * Call back function used to inform a client of the Parser when a parsing operation completes.
+ * @since S60 5.0
+ */
+ void ParseFileCompleteL();
+
+ /**
+ * Starts parsing config file. This function blocks until file is parsed
+ * @since S60 5.0
+ */
+ void InitConfigL();
+
+ /**
+ * Total number of channels this SSY provides
+ *
+ * @since S60 5.0
+ * @return TInt Count of channels this SSY is configured to provide
+ */
+ TInt ChannelCount();
+
+ /**
+ * Generates channels this SSY is configured to provide
+ *
+ * @since S60 5.0
+ * @param[in,out] aChannnelList Filled with generated channels by this configurator
+ */
+ void GenerateChannels( RSensrvChannelInfoList& aChannelList );
+
+ /**
+ * Updates Sensor server's generated channel Ids
+ *
+ * @since S60 5.0
+ * @param[in] aChannnelList Same list as GenerateChannels produces but
+ * this contains channel identifiers
+ */
+ void UpdateChannelIds( RSensrvChannelInfoList aChannelList );
+
+ /**
+ * Reads all channel data information from config file and fills
+ * parameters with information
+ *
+ * @since S60 5.0
+ * @param[in] aSrvChannelId Sensor server generated channel id of the target channel
+ * @param[in,out] aDataItemList Contains data item objects defined in config file. Each
+ * Data item is presented as Data Item class derived from TSsyRefChannelDataBase.
+ * List can contain only one type of derived channel data items
+ * @param[in,out] aStartInterval Contains start interval to start producing data items
+ */
+ void GetChannelDataInformationL( const TInt aSrvChannelId,
+ TSsyRefDataItemArray& aDataItemList,
+ TInt& aStartInterval );
+
+ /**
+ * Reads sensor properties from config file and adds them to list
+ *
+ * @since S60 5.0
+ * @param[out] aPropertyList List where to append properties
+ */
+ void GetSensorPropertiesL( RSensrvPropertyList& aPropertyList );
+
+ /**
+ * Reads channel properties from config file and adds them to list
+ *
+ * @since S60 5.0
+ * @param[in] aSenSrvChannelId Sensor server generated channel id
+ * @param[out] aPropertyList List where to append properties
+ */
+ void GetChannelPropertiesL( const TInt aSrvChannelId,
+ RSensrvPropertyList& aPropertyList );
+
+private:
+
+ /**
+ * C++ constructor.
+ */
+ CSsyReferenceConfig();
+
+ /**
+ * Symbian 2nd phase constructor.
+ */
+ void ConstructL();
+
+ /**
+ * Makes synchronous calls asynchronous
+ */
+ void IssueRequest( TInt aError = KErrNone );
+
+ /**
+ * Reads attribute value from element and casts it into TInt value
+ *
+ * @since S60 5.0
+ * @param[in] aElement Element from where to read attribute
+ * @param[in] aAttrib Attribute name which to read
+ * @return TInt Integer value of read value
+ */
+ TInt GetAttributeIntValue( CMDXMLElement& aElement, const TDesC& aAttrib );
+
+ /**
+ * Reads attribute value from element and casts it into literal value
+ *
+ * @since S60 5.0
+ * @param[in] aElement Element from where to read attribute
+ * @param[in] aAttrib Attribute name which to read
+ * @param[in/out] aTarget Target descriptor where to copy read literal
+ */
+ void GetAttributeStrValue( CMDXMLElement& aElement, const TDesC& aAttrib, TDes8& aTarget );
+
+ /**
+ * Reads attribute value from element and casts it into TReal value
+ *
+ * @since S60 5.0
+ * @param[in] aElement Element from where to read attribute
+ * @param[in] aAttrib Attribute name which to read
+ * @return TReal value of the attribute
+ */
+ TReal GetAttributeRealValue( CMDXMLElement& aElement, const TDesC& aAttrib );
+
+ /**
+ * Reads Hexadesimal attribute value from element and casts it into Integer value
+ *
+ * @since S60 5.0
+ * @param[in] aElement Element from where to read attribute
+ * @param[in] aAttrib Attribute name which to read
+ * @return TUint Unsigned integer value of read Hexadesimal value
+ */
+ TUint GetAttributeHexValue( CMDXMLElement& aElement, const TDesC& aAttrib );
+
+ /**
+ * Compares Sensor server generated channel IDs and return corresponding
+ * ConfigFile channel id
+ *
+ * @since S60 5.0
+ * @param[in] aSrvChannelId SenServer generated channel ID for which pair is needed
+ * @return TInt ConfigFile channel ID that is paired with aSrvChannelId
+ */
+ TInt ConfigChannelId( const TInt aSrvChannelId ) const;
+
+ /**
+ * Searches channel element for given SensorServer generated channel ID
+ *
+ * @since S60 5.0
+ * @param[in] aSrvChannelId SenServer generated channel ID identifying wanted channel element
+ * @return CMDXMLElement Pointer to found channel element or NULL if not found
+ */
+ CMDXMLElement* ChannelElement( const TInt aSrvChannelId );
+
+ /**
+ * Reads properties from given element and adds them to list.
+ * Element can be either 'SsyGenealInformation' or 'ChannelItem'
+ *
+ * @since S60 5.0
+ * @param[in] aElement Element from where to read properties
+ * @param[out] aPropertyList List where to append properties
+ */
+ void GetElementPropertiesL( CMDXMLElement& aElement, RSensrvPropertyList& aPropertyList );
+
+
+private: // data
+
+ /**
+ * Pointer of the config xml-file parser
+ */
+ CMDXMLParser* iConfigParser;
+
+ /**
+ * Contains Ssy general information element and all of its childs
+ */
+ CMDXMLElement* iGenralInfoElement;
+
+ /**
+ * Contains Ssy Channel information group element and all of its childs
+ * including each channel information and channel data for testing purpose
+ */
+ CMDXMLElement* iChannelGroupElement;
+
+ /**
+ * Number of channels defined in config file
+ */
+ TInt iChannelCount;
+
+ /**
+ * Active scheduler wait for blocking construction until config file is parsed
+ */
+ CActiveSchedulerWait iSchedulerWait;
+
+ /**
+ * Indicates is config file parsed
+ */
+ TBool iConfigFileParsed;
+
+ /**
+ * Channel ID pair array
+ */
+ TSsyRefChannelIdArray iChannelPairArray;
+
+ /**
+ * Elements of the config file. These needs to be stored
+ */
+ CMDXMLDocument* iConfigFile;
+ CMDXMLElement* iSsyReferenceConfig; // Root of the config
+
+ };
+
+#endif //SSYREFERENCECONFIG_H
+
+// End of file