toolsandutils/wintunnel/src_beech/d_comm.h
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolsandutils/wintunnel/src_beech/d_comm.h	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,302 @@
+// Copyright (c) 1995-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:
+//
+
+
+#if !defined(__D_COMM_H__)
+#define __D_COMM_H__
+#if !defined(__K32STD_H__)
+#include <k32std.h>
+#endif
+#if !defined(__D32COMM_H__)
+#include <d32comm.h>
+#endif
+#if !defined(__E32VER_H__)
+#include <e32ver.h>
+#endif
+//
+const TInt KCommsMajorVersionNumber=1;
+const TInt KCommsMinorVersionNumber=0;
+const TInt KCommsBuildVersionNumber=KE32BuildVersionNumber;
+//
+const TInt KDefaultRxBufferSize=0x400;
+const TInt KTxBufferSize=0x400;
+const TInt KMaxHighWaterMark=0x080;
+//
+const TUint KReceiveIsrParityError=0x10000000;
+const TUint KReceiveIsrFrameError=0x20000000;
+const TUint KReceiveIsrOverrunError=0x40000000;
+const TUint KReceiveIsrMaskError=0x70000000;
+//
+const TInt KTransmitIrqEmpty=KErrGeneral;
+//
+const TUint KReceiveIsrTermChar=0x80000000;
+const TUint KReceiveIsrMaskComplete=0xf0000000;
+const TUint KReceiveIsrShift=24;
+const TUint KReceiveIsrShiftedMask=0x0f;
+//
+//
+enum TStopMode {EStopNormal,EStopPwrDown,EStopEmergency};
+//
+//
+class DChannelComm;
+class DComm : public CBase
+	{
+public:
+	virtual TInt Start() =0;
+	virtual void Stop(TStopMode aMode) =0;
+	virtual void Break(TBool aState) =0;
+	virtual void EnableTransmit() =0;
+	virtual TUint Signals() const =0;
+	virtual void SetSignals(TUint aSetMask,TUint aClearMask) =0;
+	virtual TInt Validate(const TCommConfigV01 &aConfig) const =0;
+	virtual void Configure(TCommConfigV01 &aConfig) =0;
+	virtual void Caps(TDes8 &aCaps) const =0;
+	virtual void CheckConfig(TCommConfigV01& aConfig)=0;
+	virtual void EnableInterrupts() =0;
+	virtual void DisableInterrupts() =0;
+	virtual TInt CompleteSlowOpen(DThread *aThread,TRequestStatus *aReqStat) =0;
+	inline DChannelComm &Comm() {return(*iComm);}
+	inline void SetComm(DChannelComm *aComm) {iComm=aComm;}
+	virtual void SetTimer(const TUint aTimeOut) =0;
+	virtual void CancelTimer() =0;
+private:
+	DChannelComm *iComm;
+#ifdef _DEBUG_DEVCOMM
+public:
+	TInt iRxIntCount;
+	TInt iTxIntCount;
+	TInt iRxErrCount;
+	TInt iTxErrCount;
+#endif
+	};
+//
+// 32 bit sequence number space
+//
+class TCommSeqNum
+	{
+public:
+	inline TCommSeqNum& operator++();
+	inline TCommSeqNum& operator++(TInt);
+	inline TCommSeqNum& operator--();
+	inline TCommSeqNum& operator--(TInt);
+	inline TCommSeqNum& operator=(TUint aVal);
+	inline TCommSeqNum& operator=(const TCommSeqNum& aVal);
+	inline TCommSeqNum& operator+=(TInt aVal);
+	inline TCommSeqNum& operator-=(TInt aVal);
+	inline TBool operator==(const TCommSeqNum& aVal) const;
+	inline TBool operator!=(const TCommSeqNum& aVal) const;
+	inline TBool operator<(const TCommSeqNum& aVal) const;
+	inline TBool operator<=(const TCommSeqNum& aVal) const;
+	inline TBool operator>(const TCommSeqNum& aVal) const;
+	inline TBool operator>=(const TCommSeqNum& aVal) const;
+	inline TCommSeqNum operator+(TInt aVal);
+	inline TCommSeqNum operator-(TInt aVal);
+	inline TInt operator-(const TCommSeqNum& aVal);
+	inline TUint Int() const;
+private:
+	TUint iNum;
+	};
+//
+class CCommRxBuf : public CBase
+	{
+public:
+	CCommRxBuf();
+	~CCommRxBuf();
+	void SetLengthL(TInt aLength);
+	void Reset();
+	inline TInt Count() { return iCount; }
+	inline TInt Length()  { return iLength; }
+	TInt PutChar(TUint aChar);
+	TInt ClientWrite(TUint& aStatus, DComm* aDriver, DThread* aThread, const TAny* aPtr, TInt& aRxLength, TInt& aRxOffset, TInt aMode);
+	TInt TestTerm(TInt aCount, TInt aTermCount, TUint8* aTermList);
+	TBool RescanTerminators(DComm* aDriver, TInt aTermCount, TText8* aTermChars);
+public:
+	TInt iLength;
+	TInt iCount;
+	TInt iInsP;
+	TInt iRemP;
+	TUint8* iCharPtr;
+	TUint8* iInfoPtr;
+	TCommSeqNum iInsSeqNum;
+	TCommSeqNum iRemSeqNum;
+	TCommSeqNum iLastSeqNum;
+	};
+
+class CCommTxBuf : public CCirBuffer
+	{
+public:
+	CCommTxBuf();
+	TInt ClientRead(DComm* aDriver, DThread* aThread, const TAny* aPtr, TInt& aTxLength, TInt& aTxOffset, TInt aMode);
+	};
+
+//
+class DDeviceComm : public DLogicalDevice
+	{
+public:
+	DDeviceComm();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8 &aDes) const;
+	virtual DLogicalChannel *CreateL();
+	};
+//
+
+class DCommPowerHandler : public DPowerHandler
+	{
+public:
+	DCommPowerHandler(DChannelComm *aLdd);
+	void RequestComplete();
+	void RequestPending();
+	static void Timeout(TAny *, TInt);
+
+	virtual TInt DoPowerOn();
+	virtual void DoPowerStandby();
+	virtual void DoPowerEmergencyStandby();
+public:
+	DChannelComm *iLdd;
+	TTickLink iTimer;
+	};
+
+class DChannelComm : public DLogicalChannel
+	{
+public:
+	enum TState {ENotActive,EActive,EClosed};
+private:
+	enum TDfcRequestFlags
+		{
+		EFillTxBufferRequired=0x00000001,
+		EDrainRxBufferRequired=0x00000002,
+		ECompleteRead=0x00000008,
+		ECompleteWrite=0x00000010,
+		ECompleteBreak=0x00000020,
+		EEarlyCompleteWrite=0x00000040,
+		ECompleteEmergency=0x00000080,
+		ECompleteSignalChange=0x00000100,
+		ECompleteDataAvailable=0x00000200,
+		ETurnaroundTimerDfc=0x00000400
+		};
+public:
+	DChannelComm(DLogicalDevice *aDevice);
+	~DChannelComm();
+	virtual void ReceiveIsr(TUint aChar);
+	virtual TInt TransmitIsr();
+	virtual void StateIsr(TUint aStatus);
+	inline TBool IsPowerGood();
+	inline void SetStatus(TState aStatus);
+	inline void CompleteAllReqs(TInt aReason);
+	inline TBool IsReading() const;
+	inline TBool IsWriting() const;
+protected:
+	virtual void DoCreateL(TInt aUnit,CBase *aDriver,const TDesC *anInfo,const TVersion &aVer);
+	virtual void DoCancel(TInt aReqNo);
+	virtual void DoRequest(TInt aReqNo,TAny *a1,TAny *a2);
+	virtual TInt DoControl(TInt aFunction,TAny *a1,TAny *a2);
+	inline TBool AreAnyPending() const;
+	void Start();
+	void Stop(TStopMode aMode);
+	void BreakOn();
+	void BreakOff();
+	void EnableTransmit();
+	TInt SetRxBufferSize(TInt aSize);
+	void ResetBuffers();
+	TBool IsLineFail(TUint aHandshake);
+	void DoDrainRxBuffer();
+	void DoFillTxBuffer();
+	inline void DrainRxBuffer() {QueueDfc(EDrainRxBufferRequired);};
+	inline void FillTxBuffer() {QueueDfc(EFillTxBufferRequired);};
+	inline void CompleteWrite() {QueueDfc(ECompleteWrite);};
+	inline void EarlyCompleteWrite() {QueueDfc(EEarlyCompleteWrite);};
+	inline void CompleteSignalChange() {QueueDfc(ECompleteSignalChange);};
+	inline void CompleteDataAvailable() {QueueDfc(ECompleteDataAvailable);};
+//	void CompleteWrite(TInt anError=KErrNone);
+//	void CompleteRead(TInt anError=KErrNone);
+//	void DoCompleteWrite();
+//	void DoCompleteRead();
+public:
+	virtual void DoPowerDown();
+	virtual void DoEmergencyPowerDown();
+
+	TInt TurnaroundSet(TUint aNewTurnaroundMicroSeconds);
+	TInt TurnaroundClear();
+	void RestartTurnaroundTimer();
+	virtual void TurnaroundStartDfcImplementation();
+	void TurnaroundTimeoutImplementation();
+
+private:
+	static TInt CallDfc(TAny* aDChannelComm);
+	void DfcHandler();
+	void QueueDfc(TUint aRequestMask);
+	void ResetDevice();
+	void RestoreDtrRrs();
+public:
+	TCommConfigV02 iConfig;
+private:
+	DComm *iDriver;
+	DCommPowerHandler *iPowerHandler;
+	TState iStatus;
+	TUint iDfcRequest;
+	TDfc iDfc;
+	TInt iInputHeld;			// Receive suspended by signalling peer
+	TInt iOutputHeld;			// Transmit suspended by peer
+	TInt iReceiveError;
+	TInt iWriteError;
+	TInt iReceiveOneOrMore;
+	TInt iWriteZero;			// Awaiting ability to write
+	TInt iReceiveErrorLength;
+	TInt iReceiveLength;
+	TInt iReceiveOffset;
+	TInt iTransmitLength;
+	TInt iTransmitOffset;
+	TUint iFlags;
+	TUint iSignals;
+	TInt iLowWaterMark;
+	TInt iHighWaterMark;
+	TInt iHalfFullMark;
+	TUint8 *iReceivePtr;		// Client space pointer
+	TUint8 *iTransmitPtr;		// Client space pointer
+	CCommRxBuf *iRxBuf;
+	CCommTxBuf *iTxBuf;
+	TBool iIsReading;
+	TBool iIsWriting;
+	TBool iDrainingRxBuf;
+	TBool iFillingTxBuf;
+	TBool iRunningDfc;
+	TBool iIsClientWriting;
+	TBool iSignalChangeNotification;
+	TUint* iSignalChangePtr;
+	TUint iSignalMask;
+    TUint iSignalChangeInfo;
+	TBool iDataAvailableNotification;
+
+	// Min Turnaround time between Rx and Tx
+	TUint		iTurnaroundMinMicroSeconds;	// delay after a receive before transmission
+	TBool		iTurnaroundTimerRunning;	// a receive has started the timer
+	TBool		iTurnaroundTransmitDelayed;	// a transmission is held until time elapses after a receive
+	TAny*		iTurnaroundTxDesPtr;		// client descriptor awaiting transmission
+	TInt		iTurnaroundTxDesLength;		// initial size of tx descriptor
+
+#ifdef _DEBUG_DEVCOMM
+	TInt iDfcCount;
+	TInt iDfcReqSeq;
+	TInt iDfcHandlerSeq;
+	TInt iDoDrainSeq;
+	TInt iTxChars, iRxChars;
+	TInt iTxXon, iTxXoff, iRxXon, iRxXoff;
+#endif
+	friend class DCommPowerHandler;
+	};
+
+#include "d_comm.inl"
+
+#endif