diff -r a2efdd544abf -r b47902b73a93 datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Settings/BTGPSNokDeviceHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Settings/BTGPSNokDeviceHandler.cpp Fri Jun 04 10:34:15 2010 +0100 @@ -0,0 +1,461 @@ +// Copyright (c) 2004-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: +// + + + +// INCLUDE FILES +#include +#include +#include "BTGPSNokDeviceHandler.h" +#include "BtGpsPsyPrivateCRKeys.h" +#include "BTGPSConnectManager.h" +#include "BTGPSSettingManager.h" +#include "BTGPSDeviceManager.h" +#include "BTGPSNmeaParser.h" +#include "BTGPSMessageDef.h" +#include "BTGPSConstantsManager.h" +#include "BTGPSNokNightModeHandler.h" +#include "BTGPSPanic.h" +#include "BTGPSLogging.h" +#include "btgpsdevicelistmanager.h" + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::NewL +// ----------------------------------------------------------------------------- +CBTGPSNokDeviceHandler* CBTGPSNokDeviceHandler::NewL( + CBTGPSConnectManager& aConnectManager, + CBTGPSSettingManager& aSettingManager, + CBTGPSConstantsManager& aConstantsManager, + CBTGPSDeviceManager& aDeviceManager, + CBTGPSDeviceListManager& aDeviceListManager) + { + CBTGPSNokDeviceHandler* self = new (ELeave) CBTGPSNokDeviceHandler( + aConnectManager, + aSettingManager, + aConstantsManager, + aDeviceManager, + aDeviceListManager); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::~CBTGPSNokDeviceHandler +// ----------------------------------------------------------------------------- +CBTGPSNokDeviceHandler::~CBTGPSNokDeviceHandler() + { + iConnectManager.RemoveMessageListener(*this); + iSettingManager.RemoveListener(*this); + iDeviceManager.RemoveListener(*this); + + delete iNightModeHandler; + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::ConstructL +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::ConstructL() + { + iConnectManager.AddMessageListenerL(*this); + iSettingManager.AddListenerL(*this); + iDeviceManager.AddListenerL(*this); + + iPreviousDeviceType = iDeviceManager.DeviceType(); + + //Get Night Mode setting + if(iSettingManager.GetNightModeSetting( + (TBTGPSSettingsApi::TNightModeState &)iNightModeSetting) != KErrNone) + { + //In error case, turn night mode off + iNightModeSetting = TBTGPSSettingsApi::ENightModeOff; + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::CBTGPSNokDeviceHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +CBTGPSNokDeviceHandler::CBTGPSNokDeviceHandler( + CBTGPSConnectManager& aConnectManager, + CBTGPSSettingManager& aSettingManager, + CBTGPSConstantsManager& aConstantsManager, + CBTGPSDeviceManager& aDeviceManager, + CBTGPSDeviceListManager& aDeviceListManager) + : iConnectManager(aConnectManager), + iSettingManager(aSettingManager), + iConstantsManager(aConstantsManager), + iDeviceManager(aDeviceManager), + iDeviceListManager(aDeviceListManager), + iNightModeSetting(TBTGPSSettingsApi::ENightModeNA), + iBattStatus(KErrNotFound), + iExtPowerStatus(KErrNotFound), + iExtAntennaStatus(KErrNotFound) + { + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::HandleMessage +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::HandleMessage(const TBTGPSNmeaParser& aParser) + { + TRACESTRING("CBTGPSNokDeviceHandler::HandleMessage start...") + TInt msgId = aParser.MessageId(); + TInt status(0); + + switch(msgId) + { + case ENmeaPNokPeriodicEvents: + //Handler PNok STAT message + HandleStatMessage(aParser); + break; + case ENmeaPNokNightMode: + if(aParser.GetFieldData(ENmeaFieldPNOKNightModeStatus, status)==KErrNone) + { + CheckNightModeStatus(status); + } + break; + case ENmeaPNokVersionInfo: + UpdateDeviceVersion(aParser); + break; + default: + //do nothing + break; + } + TRACESTRING("CBTGPSNokDeviceHandler::HandleMessage end") + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::HandleNightModeChange +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::HandleNightModeChange( + const TBTGPSSettingsApi::TNightModeState aSetting ) + { + TRACESTRING("CBTGPSNokDeviceHandler::HandleNightModeChange start...") + //Set night mode + UpdateNightMode(aSetting); + TRACESTRING("CBTGPSNokDeviceHandler::HandleNightModeChange end") + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::HandleStatMessage +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::HandleStatMessage(const TBTGPSNmeaParser& aParser) + { + TRACESTRING("CBTGPSNokDeviceHandler::HandleStatMessage start...") + TInt battStatus(KErrNotFound); + TInt battLevel(KErrNotFound); + TInt extPowStatus(KErrNotFound); + TInt extAntStatus(KErrNotFound); + + //Check battery status + if(aParser.GetFieldData(ENmeaFieldPNOKBatteryStatus, battStatus)==KErrNone) + { + //Tuning is needed after testing + if(battStatus != iBattStatus) + { + iBattStatus = battStatus; + } + } + + //Check ext power status + if(aParser.GetFieldData(ENmeaFieldPNOKExtPowerStatus, extPowStatus)==KErrNone) + { + iExtPowerStatus = extPowStatus; + } + + //Check ext antenna status + if(aParser.GetFieldData(ENmeaFieldPNOKExtAntennaStatus, extAntStatus)==KErrNone) + { + iExtAntennaStatus = extAntStatus; + } + + //Get battery level. Error ignored + aParser.GetFieldData(ENmeaFieldPNOKBatteryLevel, battLevel); + + // Update device status to setting manager + UpdateDeviceStatus(battLevel,battStatus, extPowStatus, extAntStatus); + TRACESTRING("CBTGPSNokDeviceHandler::HandleStatMessage end") + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::UpdateDeviceVersion +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::UpdateDeviceVersion(const TBTGPSNmeaParser& aParser) + { + TPtrC8 id; + TPtrC8 btHwVersion; + TPtrC8 btSwVersion; + TPtrC8 gpsHwVersion; + TPtrC8 gpsSwVersion; + + //all errors are ignored + aParser.GetFieldBlock(ENmeaFieldPNOKProductID, id); + aParser.GetFieldBlock(ENmeaFieldPNOKBTHWVersionNumber, btHwVersion); + aParser.GetFieldBlock(ENmeaFieldPNOKBTSWVersionNumber, btSwVersion); + aParser.GetFieldBlock(ENmeaFieldPNOKGPSHWVersionNumber, gpsHwVersion); + aParser.GetFieldBlock(ENmeaFieldPNOKGPSSWVersionNumber, gpsSwVersion); + + //Update settings in setting manager. Error ignored + iSettingManager.UpdateVersions( + id, + btHwVersion, + btSwVersion, + gpsHwVersion, + gpsSwVersion); + } + + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::UpdateDeviceStatus +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::UpdateDeviceStatus( + TInt aBattLevel, + TInt aBattStatus, + TInt aExtPowStatus, + TInt aExtAntStatus) + { + //Set batt level + TInt battLevel(0); + if(aBattLevel!=KErrNotFound) + { + battLevel = aBattLevel; + } + + //Set batt status + TBTGPSBatteryState battState(EBatteryStateNA); + switch(aBattStatus) + { + case KPNOKStatBattNormal: + battState = EBatteryStateNormal; + break; + case KPNOKStatBattFull: + battState = EBatteryStateFull; + break; + case KPNOKStatBattLow: + battState = EBatteryStateLow; + break; + default: + //do nothing + break; + } + + //Set ext power state + TBTGPSExtPowerState extPowState(EExtPowerNA); + switch (aExtPowStatus) + { + case KPNOKStatExtPowerConnected: + extPowState = EExtPowerOn; + break; + case KPNOKStatExtPowerNotConnected: + extPowState = EExtPowerOff; + break; + default: + //do nothing + break; + } + + //Set ext antenna state + TBTGPSExtAntennaState extAntState(EExtAntennaNA); + switch(aExtAntStatus) + { + case KPNOKStatExtAntennaNotConnected: + extAntState = EExtAntennaOff; + break; + case KPNOKStatExtAntennaConnected: + extAntState = EExtAntennaOn; + break; + default: + //do nothing + break; + } + + //Set device status to setting manager. Error is ignored + iSettingManager.UpdateDeviceStatus( + battLevel, + extPowState, + extAntState, + battState); + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::CheckNightModeStatus +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::CheckNightModeStatus(TInt aStatus) + { + if( iNightModeSetting == TBTGPSSettingsApi::ENightModeOn && + aStatus == KPNOKNightNightModeOn || + iNightModeSetting == TBTGPSSettingsApi::ENightModeOff && + aStatus == KPNOKNightNightModeOff) + { + //Correctly set + delete iNightModeHandler; + iNightModeHandler = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::UpdateNightMode +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::UpdateNightMode( + TBTGPSSettingsApi::TNightModeState aSetting) + { + if(iDeviceManager.DeviceType()!=EBTDeviceTypeNokGps) + { + return; + } + + delete iNightModeHandler; + iNightModeHandler = NULL; + + if(aSetting != TBTGPSSettingsApi::ENightModeNA) + { + //ignore error if night mode can't be set + TInt ignore(KErrNone); + TRAP(ignore, + iNightModeHandler = CBTGPSNokNightModeHandler::NewL( + iConnectManager, + aSetting)); + } + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::BTDeviceStatusChanged +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::BTDeviceStatusChanged( + TInt aConnectStatus, + TInt aDeviceType, + TInt /*aErr*/) + { + //Update night mode setting + if(aConnectStatus==EBTDeviceConnected && aDeviceType ==EBTDeviceTypeNokGps) + { + //Set night mode + TBTGPSSettingsApi::TNightModeState setting; + if(iSettingManager.GetNightModeSetting(setting) == KErrNone) + { + UpdateNightMode(setting); + } + } + else + { + //Cancel night mode setting + delete iNightModeHandler; + iNightModeHandler = NULL; + } + + //Update PSY state in setting + UpdatePsyState(aConnectStatus, aDeviceType); + + //Update connected device info in setting + UpdateBtDeviceInfo(aConnectStatus, aDeviceType); + + //Update previous bt device type + iPreviousDeviceType = aDeviceType; + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::UpdatePsyState +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::UpdatePsyState( + TInt aConnectStatus, + TInt aDeviceType) + { + TBTGPSPSYState psyState(EPSYLoaded); + + switch(aConnectStatus) + { + case EBTDeviceDisconnected: + if(aDeviceType==EBTDeviceTypeNonNokGps || + aDeviceType==EBTDeviceTypeNokGps) + { + psyState = EPSYInStandBy; + } + break; + case EBTDeviceConnected: + if(aDeviceType == EBTDeviceTypeNonNokGps) + { + psyState = EPSYLoadedAndPNOKNotSupportedBTGPSUsed; + } + else if(aDeviceType == EBTDeviceTypeNokGps) + { + psyState = EPSYLoadedAndPNOKSupportedBTGPSUsed; + } + else + { + //do nothing + } + break; + case EBTDeviceConnecting: + case EBTDeviceConnectError: + default: + //do nothing + break; + } + + //Update to setting manager + iSettingManager.UpdatePsyState(psyState); + } + +// ----------------------------------------------------------------------------- +// CBTGPSNokDeviceHandler::UpdateBtDeviceInfo +// ----------------------------------------------------------------------------- +void CBTGPSNokDeviceHandler::UpdateBtDeviceInfo( + TInt aConnectStatus, + TInt aDeviceType) + { + //Update bt device info when device type is changed from unkown or not GPS to + //NokGps or NonNokGps + if(aConnectStatus == EBTDeviceConnected && + aDeviceType != iPreviousDeviceType && + (aDeviceType == EBTDeviceTypeNonNokGps || + aDeviceType == EBTDeviceTypeNokGps)) + { + //Get bt sock address from device manager + TBTSockAddr btSockAddr; + iDeviceManager.BtSockAddr(btSockAddr); + +#ifdef SYMBIAN_LOCATION_BTGPSCONFIG + iDeviceListManager.SetDeviceInfo(aDeviceType, btSockAddr); +#else + //Determine if the device is valid + TInt valid = (aDeviceType==EBTDeviceTypeNonNokGps)? + TBTGPSSettingsApi::EBtDeviceNonNokGps : TBTGPSSettingsApi::EBtDeviceNokGps; + + //Update device info in setting manager + iSettingManager.UpdateBTDeviceInfo(valid, btSockAddr); +#endif + } +#ifdef SYMBIAN_LOCATION_BTGPSCONFIG + else if(aConnectStatus == EBTDeviceConnected) + { + //Device address and type has not changed,, but it needs to be moved to the top of the list + TBTSockAddr btSockAddr; + iDeviceManager.BtSockAddr(btSockAddr); + iDeviceListManager.SetDeviceInfo(aDeviceType, btSockAddr); + } +#endif + } + + +// End of File + + +