--- /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 <e32std.h>
+#include <bt_sock.h>
+#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
+
+
+