bluetooth/btexample/example/afhsetter/AFHSetter.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btexample/example/afhsetter/AFHSetter.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,399 @@
+// Copyright (c) 2005-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 <e32base.h>
+#include <e32std.h>
+#include <e32test.h>
+#include <c32comm.h>
+#include <f32file.h>
+#include <bt_subscribe.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <bt_subscribe_partner.h>
+#endif
+
+#include <bt_sock.h>
+#include "AFHSetter.h"
+#if defined (__WINS__)
+#define PDD_NAME _L("ECDRV")
+#define LDD_NAME _L("ECOMM")
+#else  // __GCC32__
+#define PDD_NAME _L("EUART1")
+#define LDD_NAME _L("ECOMM")
+// #define ETNA_PDD_NAME _L("EUART2") // for debugging over com2
+#endif
+
+_LIT(KInstructions, "ffffffffffffffffffff allows all frequencies.\nYou will either be instructed to type in a new number\nor to enter individual bad channels by choosing a sequence\nof numbers in [0, 78]");
+
+inline void __BTDEBUGGER()
+// needed to call __DEBUGGER inside an __ASSERT
+	{
+	__DEBUGGER()
+	}
+
+GLDEF_D RTest test(_L("AFH Setter App"));
+
+void LoadLDD_PDD()
+	{
+	TInt r;
+#ifdef __EPOC32__
+	r=StartC32();
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else
+		test.Printf(_L("Started C32\n"));
+#endif
+	test.Printf(_L("Loading PDD\n"));
+	r=User::LoadPhysicalDevice(PDD_NAME);
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else 
+		test.Printf(_L("Loaded LDD\n"));
+	test.Printf(_L("Loading LDD\n"));
+	r=User::LoadLogicalDevice(LDD_NAME);
+	if (r!=KErrNone && r!=KErrAlreadyExists)
+		{
+		test.Printf(_L("Failed %d!\n\r"),r);
+		test(r==KErrNone);
+		}
+	else
+		test.Printf(_L("Loaded PDD\n"));
+	}
+
+
+void TestL()
+	{
+	test.Printf(_L("%S\n"), &KInstructions);
+
+	// This function is essential!
+	LoadLDD_PDD();
+	// For some reason, you have to do the following to
+	// ensure that the file server behaves properly.
+
+
+//	File session
+	RFs fs;
+	fs.Connect();
+	fs.Close();
+	
+	CAFHSetter* AFHsetter = CAFHSetter::NewL(test);
+	//Subscriber* AFHSubscriber = CAFHSubscriber::NewL(test);
+
+	CActiveScheduler::Start();
+	
+	//delete AFHSubscriber;
+	delete AFHsetter;
+	}
+
+
+CAFHSetter* CAFHSetter::NewL(RTest& aTest)
+	{
+	CAFHSetter* s = new(ELeave) CAFHSetter(aTest);
+	CleanupStack::PushL(s);
+	s->ConstructL();
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CAFHSetter::CAFHSetter(RTest& aTest)
+: CActive(EPriorityStandard), iTest(aTest)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CAFHSetter::~CAFHSetter()
+	{
+	Cancel();
+	iTimer.Close();
+	iSS.Close();
+	}
+
+void CAFHSetter::ConstructL()
+	{
+	//start timer
+	iTimer.CreateLocal();
+	//start bluetooth
+	iSS.Connect();
+	TRequestStatus status;
+    //iSS.StartProtocol(KBTAddrFamily,KSockSeqPacket,KBTLinkManager,status);
+    iSS.StartProtocol(KBTAddrFamily,KSockSeqPacket,KL2CAP,status);
+    User::WaitForRequest(status);
+	
+	//start publish and subscribe
+	_LIT_SECURITY_POLICY_PASS(KPassPolicy);
+	TInt err;
+	err=iProperty.Define(KPropertyUidBluetoothCategory,
+						 KPropertyKeyBluetoothSetAFHHostChannelClassification,
+						 RProperty::EByteArray,
+						 KPassPolicy,
+						 KPassPolicy);
+	err=iProperty.Define(KPropertyUidBluetoothCategory,
+						 KPropertyKeyBluetoothSetAFHChannelAssessmentMode,
+						 RProperty::EInt,
+						 KPassPolicy,
+						 KPassPolicy);
+	__ASSERT_DEBUG(err==0, __BTDEBUGGER());
+	
+	if (err) test.Printf(_L("Error %d defining property, continuing anyway\n"),err);
+
+
+	Start();
+	}
+
+void CAFHSetter::Start()
+	{
+	iTest.Console()->ClearScreen();
+	SendBluetoothAFHHostChannelClassification(); //send classification as kick off
+	GetClassificationBySettingBadChannels();
+	iTimer.After(iStatus,1);
+	SetActive();
+	}
+
+TInt CAFHSetter::SendBluetoothAFHHostChannelClassification()
+	{
+	//Set channels 3,4,5,6,7,8,9,10,12 and 15 as busy - not to be used by 
+	//Bluetooth Adaptive Frequency Hopping.
+	RProperty property;
+	TBTAFHHostChannelClassification channelClassification;
+	_LIT_SECURITY_POLICY_PASS(KPassPolicy);
+	TInt ret = KErrNone;
+	ret=property.Define(KPropertyUidBluetoothCategory,
+				        KPropertyKeyBluetoothSetAFHHostChannelClassification,
+				        RProperty::EByteArray,
+						KPassPolicy,
+						KPassPolicy);
+	if(ret!=KErrNone)
+			{
+			return ret;
+			}
+	ret = channelClassification.SetChannelRangeBad(3, 10);
+	if(ret!=KErrNone)
+		{
+		return ret;
+		}
+	ret = channelClassification.SetChannelBad(12);
+	if(ret!=KErrNone)
+		{
+		return ret;
+		}
+	ret = channelClassification.SetChannelBad(15);
+	if(ret!=KErrNone)
+		{
+		return ret;
+		}
+	ret = property.Set(KPropertyUidBluetoothCategory,  
+					   KPropertyKeyBluetoothSetAFHHostChannelClassification, 
+					   channelClassification);
+	property.Delete(KPropertyUidBluetoothCategory,
+			 KPropertyKeyBluetoothSetAFHHostChannelClassification);
+	return ret;
+	}
+
+TInt CAFHSetter::GetNextChannelNum()
+    {
+	TKeyCode code;
+	TBuf8<2> character;
+	TUint8 byte;
+	character.SetLength(0);
+
+	FOREVER
+		{
+		code = iTest.Console()->Getch();
+		iState &= ~KSetChannelsBad;
+	
+		// If <CR> finish editing string
+		if (code == 0x0d)
+			{
+			return KSendHCC;
+			}
+
+		else if (code == 'r' || code == 'R')
+			{
+			iTest.Console()->Printf(_L("Taking ranges...\n"));
+			iState |= KPairs;
+			iState &= ~KLast;
+			character.SetLength(0);
+			}
+		
+		else if (code == 's' || code == 'S')
+			{
+			iTest.Console()->Printf(_L("Taking singles...\n"));
+			iState &= ~KPairs;
+			iState |= KLast;
+			character.SetLength(0);
+			}
+		
+		// if <BS> remove last character
+		else if (code == 0x08)
+			{
+			character.SetLength(0);
+			}
+
+		else
+			{
+			if (character.Length() == 0)
+				{
+				character.Append(code);
+				}
+			else
+				{
+				character.Append(code);
+				TLex8 lex(character);
+				character.SetLength(0);
+				TInt err = lex.Val(byte, EDecimal);
+				if(!err)
+					{
+					iTest.Console()->Printf(_L("%02d"),byte);
+					if(iState & KLast)
+						{
+						iTest.Console()->Printf(_L("\n"));
+						iChannel2 = byte;
+						if(iState & KPairs)
+							{
+							iState &= ~KLast;
+							}
+						iState |= KSetChannelsBad;
+						}
+					else
+						{
+						iTest.Console()->Printf(_L(", "));
+						iChannel1 = byte;
+						iState |= KLast;
+						}
+					return KErrNone;
+					}
+				else
+					{
+					__BTDEBUGGER();
+					return err;
+					}
+				}
+			}
+		}
+    }
+
+void CAFHSetter::GetClassificationBySettingBadChannels()
+    {
+	test.Printf(_L("Please enter a sequence of bad channels [0, 78]\n"));
+	test.Printf(_L("Please type 'r' to CHANGE to enter bad channels as RANGES...\n"));
+	test.Printf(_L(".... type 's' to CHANGE to enter bad channels SINGLY (default)...\n"));
+	test.Printf(_L("Press return to finish\n\n"));
+	
+	iHCC.Reset();
+
+	for(TUint8 i=0; i<KHCIAFHHostChannelClassificationSize; ++i)
+		{
+		__ASSERT_DEBUG(iHCC[i] == 0xff, __BTDEBUGGER());
+		}
+	
+	iState = 0;
+	iState |= KLast;
+
+	FOREVER
+		{
+		TInt ret = GetNextChannelNum();
+		if(ret==KSendHCC)
+			{
+			return;
+			}
+		
+		else if(ret!=KErrNone)
+			{
+			__BTDEBUGGER();
+			}
+			
+		else if(ret==KErrNone && iState&KSetChannelsBad)
+			{
+			if(iState & KPairs)
+				{
+				ret = iHCC.SetChannelRangeBad(iChannel1, iChannel2);
+				}
+			else
+				{
+				ret = iHCC.SetChannelBad(iChannel2);
+				}
+				
+			if(ret!=KErrNone)
+				{
+				__BTDEBUGGER();
+				}
+			}
+		else
+			{
+			__ASSERT_DEBUG(!(iState&KSetChannelsBad), __BTDEBUGGER());
+			}
+		}
+    }
+
+void CAFHSetter::DoCancel()
+	{
+	iTest.Console()->ReadCancel();
+	}
+
+void CAFHSetter::RunL()
+	{
+	if(TInt err = iStatus.Int()!=KErrNone)
+		{
+		__BTDEBUGGER();
+		}
+	TInt ret = iProperty.Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetAFHHostChannelClassification, iHCC);
+	__ASSERT_DEBUG(ret==0, __BTDEBUGGER());
+	//second request
+	/**/
+	ret = iProperty.Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetAFHHostChannelClassification, iHCC);
+	__ASSERT_DEBUG(ret==0, __BTDEBUGGER());
+	/**/
+	test.Printf(_L("\n\nContinue?\n"));
+	TKeyCode code;
+	code = iTest.Console()->Getch();
+	switch(code)
+		{
+		case 'n':
+		case 'N':
+		case 27:
+			CActiveScheduler::Stop();
+			return;
+		default:
+			;//continue
+		}
+
+	Start();
+	}
+
+
+
+//....
+TInt E32Main()
+	{
+	CTrapCleanup* cleanupStack=CTrapCleanup::New();
+	CActiveScheduler::Install(new CActiveScheduler);
+
+	TRAPD(err,TestL());	//	Ignore err
+
+	if (err != KErrNone)
+		{
+		test.Printf(_L("Error %d"), err);
+		test.Getch();
+		}
+
+	delete cleanupStack;
+	return err;
+	}