--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/bredrcontrollerconfiguration.cpp Fri Apr 16 16:09:25 2010 +0300
@@ -0,0 +1,192 @@
+// Copyright (c) 2010 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 <bluetooth/logger.h>
+#include "debug.h"
+#include "linkutil.h"
+#include "bredrcontrollerconfiguration.h"
+#include <bt_subscribe.h>
+#include <bt_subscribe_partner.h>
+#include <bluetooth/hcicommandqueue.h>
+#include <bluetooth/hci/readpagescanactivitycommand.h>
+#include <bluetooth/hci/readpagescanactivitycompleteevent.h>
+#include <bluetooth/hci/readpagescantypecommand.h>
+#include <bluetooth/hci/readpagescantypecompleteevent.h>
+#include <bluetooth/hci/writepagescanactivitycommand.h>
+#include <bluetooth/hci/writepagescantypecommand.h>
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_LINKMGR);
+#endif
+
+const TInt KUnitializedParameters = -1;
+
+const TUint16 KDefaultPageScanInterval = 0x0800;
+const TUint16 KDefaultPageScanWindow = 0x0012;
+const TUint8 KDefaultPageScanType = 0x00;
+
+const TUint16 KFastConnectionPageScanInterval = 0x0024;
+const TUint16 KFastConnectionPageScanWindow = 0x0012;
+const TUint8 KFastConnectionPageScanType = 0x01;
+
+
+CBrEdrControllerConfiguration::CBrEdrControllerConfiguration(MHCICommandQueue& aCommandQueue,
+ CLinkMgrProtocol& aLinkMgrProtocol)
+ : iOriginalPageScanInterval(KDefaultPageScanInterval),
+ iOriginalPageScanWindow(KDefaultPageScanWindow),
+ iOriginalPageScanType(KDefaultPageScanType),
+ iPageScanParameters(KUnitializedParameters),
+ iCommandQueue(aCommandQueue),
+ iLinkMgrProtocol(aLinkMgrProtocol)
+ {
+ LOG_FUNC
+ }
+
+CBrEdrControllerConfiguration::~CBrEdrControllerConfiguration()
+ {
+ LOG_FUNC
+ }
+
+CBrEdrControllerConfiguration* CBrEdrControllerConfiguration::NewL(MHCICommandQueue& aCommandQueue,
+ CLinkMgrProtocol& aLinkMgrProtocol)
+ {
+ LOG_STATIC_FUNC
+ CBrEdrControllerConfiguration* self
+ = new (ELeave) CBrEdrControllerConfiguration(aCommandQueue, aLinkMgrProtocol);
+ return self;
+ }
+
+void CBrEdrControllerConfiguration::SetPageScanParametersL(TPageScanParameterSettings aPageScanParameters)
+ {
+ LOG_FUNC
+ if (iPageScanParameters == KUnitializedParameters)
+ {
+ // obtain the original Controller parameters
+ LOG(_L("obtaining the original Controller parameters"));
+
+ CReadPageScanActivityCommand* readPageScanActCmd = CReadPageScanActivityCommand::NewL();
+ // ownership of cmd transfered even if MhcqAddCommandL leaves
+ iCommandQueue.MhcqAddCommandL(readPageScanActCmd, *this);
+
+ CReadPageScanTypeCommand* readPageScanTypeCmd = CReadPageScanTypeCommand::NewL();
+ // ownership of cmd transfered even if MhcqAddCommandL leaves
+ iCommandQueue.MhcqAddCommandL(readPageScanTypeCmd, *this);
+
+ iPageScanParameters = EStandardPageScanParameters;
+
+ // if the original parameters are requested we don't do anything
+ if (aPageScanParameters == EStandardPageScanParameters)
+ return;
+ }
+
+ // store the settings to publish them later
+ iPageScanParameters = EStandardPageScanParameters;
+
+ TUint16 pageScanInterval = iOriginalPageScanInterval;
+ TUint16 pageScanWindow = iOriginalPageScanWindow;
+ TUint8 pageScanType = iOriginalPageScanType;
+
+ if (aPageScanParameters == EFastConnectionPageScanParameters)
+ {
+ // store the settings to publish them later
+ iPageScanParameters = EFastConnectionPageScanParameters;
+ pageScanInterval = KFastConnectionPageScanInterval;
+ pageScanWindow = KFastConnectionPageScanWindow;
+ pageScanType = KFastConnectionPageScanType;
+ }
+
+ LOG1(_L("Applying page scan parameter settings %d"), iPageScanParameters);
+
+ // apply the requested page scan parameters
+ CWritePageScanActivityCommand* writePageScanActCmd
+ = CWritePageScanActivityCommand::NewL(pageScanInterval, pageScanWindow);
+ // ownership of cmd transfered even if MhcqAddCommandL leaves
+ iCommandQueue.MhcqAddCommandL(writePageScanActCmd, *this);
+
+ CWritePageScanTypeCommand* writePageScanTypeCmd = CWritePageScanTypeCommand::NewL(pageScanType);
+ // ownership of cmd transfered even if MhcqAddCommandL leaves
+ iCommandQueue.MhcqAddCommandL(writePageScanTypeCmd, *this);
+ }
+
+void CBrEdrControllerConfiguration::MhcqcCommandEventReceived(const THCIEventBase& aEvent,
+ const CHCICommandBase* aRelatedCommand)
+ {
+ LOG_FUNC
+ LOG3(_L("Event 0x%02x (errorcode=%d) received for Command 0x%04x"), aEvent.EventCode(),
+ aEvent.ErrorCode(), aRelatedCommand->Opcode());
+ if (aEvent.EventCode() == ECommandCompleteEvent && aEvent.ErrorCode() == KErrNone)
+ {
+ switch (aRelatedCommand->Opcode())
+ {
+ case KReadPageScanActivityOpcode:
+ {
+ const TReadPageScanActivityCompleteEvent& readPageScanActivityCompleteEvent
+ = TReadPageScanActivityCompleteEvent::Cast(aEvent);
+ iOriginalPageScanInterval = readPageScanActivityCompleteEvent.PageScanInterval();
+ iOriginalPageScanWindow = readPageScanActivityCompleteEvent.PageScanwindow();
+ LOG2(_L("page scan activity parameters received (interval=0x%04x, window=0x%04x)"),
+ iOriginalPageScanInterval, iOriginalPageScanWindow);
+ break;
+ }
+ case KReadPageScanTypeOpcode:
+ {
+ const TReadPageScanTypeCompleteEvent& readPageScanTypeCompleteEvent
+ = TReadPageScanTypeCompleteEvent::Cast(aEvent);
+ iOriginalPageScanType = readPageScanTypeCompleteEvent.PageScanType();
+ LOG1(_L("page scan type received (=0x%02)"), iOriginalPageScanType);
+ break;
+ }
+ case KWritePageScanActivityOpcode:
+ // provide an indication that the requested parameters have been enabled
+ // as there is no way to indicate halfway success (one command sent succefully, another failed)
+ // page scan activity command status is the criteria for the whole operation
+ (void) RProperty::Set(KPropertyUidBluetoothCategory,
+ KPropertyKeyBluetoothGetPageScanParameters, iPageScanParameters);
+ LOG1(_L("Write Page Scan Activity command confirmed, page scan parameter settings %d applied"),
+ iPageScanParameters);
+ break;
+ case KWritePageScanTypeOpcode:
+ LOG(_L("Write Page Scan Type command confirmed"));
+ break;
+ default:
+ LOG1(_L("Warning!! Upexpected Command Complete Event Received (command opcode:0x%04x)"),
+ aRelatedCommand->Opcode());
+ __ASSERT_DEBUG(EFalse, Panic(EHCIUnexpectedEvent));
+ break;
+ }
+ }
+ }
+
+void CBrEdrControllerConfiguration::SetPageScanParameters(TPageScanParameterSettings aPageScanParameters)
+ {
+ LOG_FUNC
+ // errors handled by upper level component
+ // not updated in time the KPropertyKeyBluetoothGetPageScanParameters P&K key indicates an error situation
+ TRAPD(err, SetPageScanParametersL(aPageScanParameters));
+ if (err)
+ {
+ LOG1(_L("Warning!! SetPageScanParameters left with error %d"), err);
+ }
+ }
+
+void CBrEdrControllerConfiguration::MhcqcCommandErrored(TInt IF_FLOGGING(aErrorCode),
+ const CHCICommandBase* IF_FLOGGING(aCommand))
+ {
+ LOG_FUNC
+ // errors handled by upper level component
+ // not updated in time the KPropertyKeyBluetoothGetPageScanParameters P&K key indicates an error situation
+ LOG2(_L("Warning!! Command 0x%04x failed with error %d"), aCommand->Opcode(), aErrorCode);
+ }
+