--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bthci/hci2implementations/hctls/bcsp/inc/hctlbcspFrameQueue.h Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,167 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef HCTLBCSPFRAMEQUEUE_H
+#define HCTLBCSPFRAMEQUEUE_H
+
+#include <e32base.h>
+
+// To Turn on window debuggng #define _DEBUG_WINDOW
+#undef _DEBUG_WINDOW
+
+class CHCTLBcspSequencer;
+class CHCTLBcsp;
+class CTxHctlBcspFrame;
+
+NONSHARABLE_CLASS(CHCTLBcspWindow) : public CBase
+/**
+Window and associated functions to contain a queue of frames
+handles acknowledgement of a particular received frame and moves the window onwards
+within the scope of total number of sequence IDs
+
+Is only used by CHCTLBcspFrameQueue
+*/
+ {
+public:
+ static CHCTLBcspWindow *NewL(TInt aWindowSize, TInt aFrameSize, TInt aNumberOfSeqIds);
+ ~CHCTLBcspWindow();
+
+ TInt FreeFrames();
+
+ CTxHctlBcspFrame* WriteFrame(); // Gets the write frame and moves the WritePosn
+ CTxHctlBcspFrame* ReadFrame(); // Gets the read frame and moves the ReadPosn
+
+ TBool Acknowledged(TInt AckNo);
+ TInt StartOfWindow() const;
+ void Reset();
+
+private:
+ void ConstructL(TInt aFrameSize);
+ CHCTLBcspWindow(TInt aWindowSize, TInt aNumberOfSeqIds);
+
+ // Two simple inline private methods to reduce complexity of code whilst maintaining
+ // efficiency
+ TInt ToSeqId(TInt aIndex) const;
+ TInt ToWindowIndex(TInt aSeqId) const;
+ void IncrementSeqId(TInt &aSeqId) const;
+ CTxHctlBcspFrame *GetFrame(TInt aIndex);
+
+ // Internal consistency checking for the class
+ void __DbgTestInvariant() const;
+
+#ifdef _DEBUG_WINDOW
+ void TraceQueue();
+ void TraceWindowVars() const;
+#endif
+
+
+private:
+ TInt iStartOfWindow;
+ TInt iReadPosition;
+ TInt iHighReadPosition;
+ TInt iWritePosition;
+ TInt iEndOfWindow;
+ TInt iWindowSize;
+ TInt iNumberOfSeqIds;
+ TSglQue<CTxHctlBcspFrame> iFrameQue;
+
+ // This class stores most of its indices as SequneceIds, the only exception being
+ // iWindowSize which is used in the conversion between SequenceIds and WindowIndex.
+ //
+ // SequenceIds Window Index
+ // |
+ // iStartOfWindow + .
+ // | .
+ // iReadIndex | .
+ // | .
+ // iHighReadIndex | .
+ // | .
+ // iWriteIndex | .
+ // | .
+ // iEndOfWindow + iWindowSize
+ // |
+ // |
+ // |
+ // iNumberOfSeqIds |
+ };
+
+NONSHARABLE_CLASS(CHCTLBcspFrameQueue) : public CBase
+/**
+This is used by CHCTLBcsp to queue frames for transmission
+the frames queued are stored in CHCTLBcspWindow
+there are two windows used
+ one for reliable frames
+ one for unreliable frames
+*/
+ {
+public:
+ static CHCTLBcspFrameQueue* NewL(CHCTLBcsp &aBcsp);
+ ~CHCTLBcspFrameQueue();
+
+ void SetSequencer(CHCTLBcspSequencer& aSequencer);
+
+ // Methods called by sequencer
+ // Gets the next frame for sending
+ // (aFrame is the slip encoded frame
+ // returned by this method)
+ //
+ // returns: -
+ //
+ // KErrNone - all is fine
+ // KErrNothingToSend - nothing
+ // available to
+ // send
+ // KErrMaxRetries - exceeded max
+ // retries for a
+ // frame
+ TInt GetNextFrame(TDesC8* &aFrame, TBool& aIsReliable);
+
+ TBool AckReceived(TInt aAckValue); // Ack has been Received
+ void AckTimeout(); // Rx Ack Timer has expired
+
+ // Methods called by CHCTLBcsp
+ TInt AddReliableFrame (const TDesC8 &aData, TUint8 aProtocolId);
+ void AddUnreliableFrame(const TDesC8 &aData, TUint8 aProtocolId,
+ TUint8 aAck,
+ TBool aCRCEnabled);
+
+ void AddUnreliableFrame(TUint8 aProtocolId,
+ TUint8 aAck,
+ TBool aCRCEnabled);
+ void Reset();
+
+private:
+ void CanSend();
+ void ConstructL();
+ CHCTLBcspFrameQueue(CHCTLBcsp& aBcsp);
+
+private:
+ // Not owned by this class
+ CHCTLBcspSequencer* iSequencer; // For calls to Wakeup()
+ CHCTLBcsp& iBcsp; // For calls to CanSend()
+
+ // Owned by this class
+ CHCTLBcspWindow* iReliableQueue;
+ CHCTLBcspWindow* iUnreliableQueue;
+
+ HBufC8* iSlipEncodedFrame;
+ };
+
+#endif // HCTLBCSPFRAMEQUEUE_H