diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btexample/example/afhsetter/AFHSetter.cpp --- /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 +#include +#include +#include +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +#include +#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 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 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; iReadCancel(); + } + +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; + }