diff -r 000000000000 -r c316ab048e9d plugin/poi/landmarks/overlay/src/Magnetometer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/poi/landmarks/overlay/src/Magnetometer.cpp Fri Jun 25 12:50:05 2010 +0200 @@ -0,0 +1,155 @@ +/* + * Name : Magnetometer.cpp + * Description : Magnetometer helper class + * Project : This file is part of OpenMAR, an Open Mobile Augmented Reality browser + * Website : http://OpenMAR.org + * + * Copyright (c) 2010 David Caabeiro + * + * All rights reserved. This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 which accompanies this + * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html + * + */ + +#include "Magnetometer.h" + +#include + +#include +#include +#include +#include + +CMagnetometer* CMagnetometer::NewL() +{ + CMagnetometer* self = new(ELeave) CMagnetometer; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; +} + +CMagnetometer::~CMagnetometer() +{ + iSensorChannel->CloseChannel(); +} + +CMagnetometer::CMagnetometer() +{} + +void CMagnetometer::ConstructL() +{ + CSensrvChannelFinder* sensorChannelFinder = CSensrvChannelFinder::NewLC(); + + RSensrvChannelInfoList channelInfoList; + CleanupClosePushL(channelInfoList); + + TSensrvChannelInfo mySearchConditions; + mySearchConditions.iChannelType = KSensrvChannelTypeIdMagnetometerXYZAxisData; + + sensorChannelFinder->FindChannelsL(channelInfoList, mySearchConditions); + + TSensrvChannelInfo channelInfo; + + if (channelInfoList.Count() > 0) + channelInfo = channelInfoList[0]; + else + User::Leave(KErrNotFound); + + CleanupStack::PopAndDestroy(&channelInfoList); + CleanupStack::PopAndDestroy(sensorChannelFinder); + + iSensorChannel = CSensrvChannel::NewL(channelInfo); + iSensorChannel->OpenChannelL(); + + // Get current calibration value + TSensrvProperty property; + iSensorChannel->GetPropertyL(KSensrvPropCalibrationLevel, KSensrvItemIndexNone, property); + TInt calibration = 0; + property.GetValue(calibration); + + iCalibration = calibration == 0? ENone : + calibration == 1? ELow : + calibration == 2? EModerate : + calibration == 3? EHigh : ENone; + + iSensorChannel->SetPropertyListenerL(this); +} + +void CMagnetometer::StartL() +{ + iSensorChannel->StartDataListeningL(this, 1, 4, 0); +} + +void CMagnetometer::Stop() +{ + iSensorChannel->StopDataListening(); +} + +void CMagnetometer::DataReceived(CSensrvChannel& aChannel, TInt aCount, TInt aDataLost) +{ + if (aChannel.GetChannelInfo().iChannelType == KSensrvChannelTypeIdMagnetometerXYZAxisData) + { + TPckgBuf dataBuffer; + TSensrvMagnetometerAxisData data; + + for (TInt i = 0; i < aCount; ++i) + { + aChannel.GetData(dataBuffer); + + data = dataBuffer(); + // Do something with the date in data variable + // data.iTimeStamp + + // Compensate axis for landscape mode + TInt x = -data.iAxisYCalibrated; + TInt y = data.iAxisXCalibrated; + TInt z = data.iAxisZCalibrated; +#if 0 + TInt x = data.iAxisXCalibrated; + TInt y = data.iAxisYCalibrated; + TInt z = data.iAxisZCalibrated; +#endif + const TReal KPole = 0.85; + + iX = KPole * iX + (1.0 - KPole) * x; + iY = KPole * iY + (1.0 - KPole) * y; + iZ = KPole * iZ + (1.0 - KPole) * z; + } + } +} + +void CMagnetometer::DataError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError) +{ +} + +void CMagnetometer::GetDataListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface) +{} + +void CMagnetometer::PropertyChanged(CSensrvChannel& aChannel, const TSensrvProperty& aChangedProperty) +{ + TSensrvChannelInfo info = aChannel.GetChannelInfo(); + + if (info.iChannelType == KSensrvChannelTypeIdMagnetometerXYZAxisData && + aChangedProperty.GetPropertyId() == KSensrvPropCalibrationLevel) + { + TInt calibration = 0; + aChangedProperty.GetValue(calibration); + + iCalibration = calibration == 0? ENone : + calibration == 1? ELow : + calibration == 2? EModerate : + calibration == 3? EHigh : ENone; + } +} + +void CMagnetometer::PropertyError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError) +{} + +void CMagnetometer::SetPropertySuccessIndicationChanged(TSetPropertySuccessIndicator aIndication) +{} + +void CMagnetometer::GetPropertyListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface) +{}