datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Utils/BTGPSModuleStatusHandler.cpp
changeset 36 b47902b73a93
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/bluetoothgpspositioningmodule/btgpspsy/src/Utils/BTGPSModuleStatusHandler.cpp	Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,245 @@
+// 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 <lbscommon.h>
+#include "BTGPSModuleStatusHandler.h"
+#include "BTGPSPsyConnectionManager.h"
+#include "BTGPSDeviceManager.h"
+#include "BTGPSRequestManager.h"
+#include "BTGPSFix.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::NewL
+// -----------------------------------------------------------------------------
+CBTGPSModuleStatusHandler* CBTGPSModuleStatusHandler::NewL(
+            CBTGPSPsyConnectionManager& aPsyConnectionManager,
+            CBTGPSDeviceManager& aDeviceManager,
+            CBTGPSRequestManager& aRequestManager)
+    {
+    CBTGPSModuleStatusHandler* self = new (ELeave) CBTGPSModuleStatusHandler(
+        aPsyConnectionManager,
+        aDeviceManager,
+        aRequestManager);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::~CBTGPSModuleStatusHandler
+// -----------------------------------------------------------------------------
+CBTGPSModuleStatusHandler::~CBTGPSModuleStatusHandler()
+    {
+    iPsyConnectionManager.RemoveListener(*this);
+    iRequestManager.RemoveListener(*this);
+    iDeviceManager.RemoveListener(*this);
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::ConstructL
+// -----------------------------------------------------------------------------
+void CBTGPSModuleStatusHandler::ConstructL()
+    {
+    iDeviceManager.AddListenerL(*this);
+    iRequestManager.AddListenerL(*this);
+    iPsyConnectionManager.AddListenerL(*this);
+    
+    //Set moudle status to not found
+    iModuleStatus.SetDataQualityStatus(TPositionModuleStatus::EDataQualityLoss);
+    iModuleStatus.SetDeviceStatus(TPositionModuleStatus::EDeviceUnknown);
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::CBTGPSModuleStatusHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CBTGPSModuleStatusHandler::CBTGPSModuleStatusHandler(
+            CBTGPSPsyConnectionManager& aPsyConnectionManager,
+            CBTGPSDeviceManager& aDeviceManager,
+            CBTGPSRequestManager& aRequestManager)
+    : iPsyConnectionManager(aPsyConnectionManager),
+      iDeviceManager(aDeviceManager),
+      iRequestManager(aRequestManager)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::HandlePsyConnectionChange
+// -----------------------------------------------------------------------------
+void CBTGPSModuleStatusHandler::HandlePsyConnectionChange()
+    {
+    TPositionModuleStatus::TDeviceStatus deviceStatus = GetDeviceStatus();
+    if(deviceStatus!=iModuleStatus.DeviceStatus())
+        {
+        iModuleStatus.SetDeviceStatus(deviceStatus);
+        iPsyConnectionManager.ReportStatus(iModuleStatus);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::BTDeviceStatusChanged
+// -----------------------------------------------------------------------------
+void CBTGPSModuleStatusHandler::BTDeviceStatusChanged(
+            TInt aConnectStatus, 
+            TInt aDeviceType,
+            TInt /*aErr*/)
+    {
+    //Check if device initialising procedure is completed
+    if(!iInitialized && 
+        (aDeviceType == EBTDeviceTypeNonNokGps || aDeviceType == EBTDeviceTypeNokGps))
+        {
+        iInitialized = ETrue;
+        }
+        
+    //Check device status
+    TPositionModuleStatus::TDeviceStatus deviceStatus = GetDeviceStatus();
+
+    //Check data quality
+    TPositionModuleStatus::TDataQualityStatus dataQualityStatus = 
+        iModuleStatus.DataQualityStatus();
+
+    if(!(aConnectStatus == EBTDeviceConnected &&
+        aDeviceType == EBTDeviceTypeNonNokGps || aDeviceType == EBTDeviceTypeNokGps))
+        {
+        dataQualityStatus =TPositionModuleStatus::EDataQualityLoss;
+        }
+
+    if(dataQualityStatus != iModuleStatus.DataQualityStatus() || 
+        deviceStatus != iModuleStatus.DeviceStatus())
+        {
+        iModuleStatus.SetDataQualityStatus(dataQualityStatus);
+        iModuleStatus.SetDeviceStatus(deviceStatus);
+        iPsyConnectionManager.ReportStatus(iModuleStatus);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::HandleLocationFixUpdate
+// -----------------------------------------------------------------------------
+void CBTGPSModuleStatusHandler::HandleLocationFixUpdate(
+            const CBTGPSFix& aFix)
+    {
+    if(!aFix.IfFullNmeaPatternReceived())
+        {
+        //if not full nmea pattern received, then not update data quality change
+        return;
+        }
+
+    TPositionModuleStatus::TDataQualityStatus dataQualityStatus
+        = TPositionModuleStatus::EDataQualityLoss;
+    switch(aFix.FixState())
+        {
+        case CBTGPSFix::EFixValid2D:
+            dataQualityStatus = TPositionModuleStatus::EDataQualityPartial;
+            break;
+        case CBTGPSFix::EFixValid3D:
+            dataQualityStatus = TPositionModuleStatus::EDataQualityNormal;
+            break;
+        case CBTGPSFix::EFixNotValid:
+            dataQualityStatus = TPositionModuleStatus::EDataQualityLoss;
+            break;
+        case CBTGPSFix::EFixValidityUnkown:
+        default:
+            //do nithing
+            break;
+        }
+    if(dataQualityStatus != iModuleStatus.DataQualityStatus())
+        {
+        iModuleStatus.SetDataQualityStatus(dataQualityStatus);
+        iPsyConnectionManager.ReportStatus(iModuleStatus);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBTGPSModuleStatusHandler::GetDeviceStatus
+// -----------------------------------------------------------------------------
+TPositionModuleStatus::TDeviceStatus CBTGPSModuleStatusHandler::GetDeviceStatus()
+    {
+    TPositionModuleStatus::TDeviceStatus deviceStatus = 
+        TPositionModuleStatus::EDeviceUnknown;
+    TInt connectStatus = iDeviceManager.DeviceConnectStatus();
+    TInt deviceType = iDeviceManager.DeviceType();
+    
+    if(!iInitialized)
+        {
+        if(connectStatus == EBTDeviceConnectError)
+            {
+            //in error case, this will not change 
+            //device status.
+            deviceStatus = TPositionModuleStatus::EDeviceError;
+            }
+        else
+            {
+            deviceStatus = TPositionModuleStatus::EDeviceInitialising;
+            }
+        }
+    else
+        {
+        switch (connectStatus)
+            {
+            case EBTDeviceDisconnected:
+            case EBTDeviceConnecting:
+            case EBTDeviceConnectError:
+                deviceStatus = TPositionModuleStatus::EDeviceStandBy;
+                break;
+            case EBTDeviceConnected:
+                if(iPsyConnectionManager.LocationRequestCount()>0 || 
+                    iPsyConnectionManager.TrackingSessionCount()>0)
+                    {
+                    deviceStatus = TPositionModuleStatus::EDeviceActive;
+                    }
+                else
+                    {
+                    deviceStatus = TPositionModuleStatus::EDeviceReady;
+                    }
+                break;
+            default:
+                break;
+            }
+        }
+    return deviceStatus;
+    }
+
+//  End of File
+
+
+