cbsref/csyrefplugins/csy27010/inc/Mux0710Protocol.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:23:08 +0300
branchRCL_3
changeset 19 630d2f34d719
permissions -rw-r--r--
Revision: 201035 Kit: 201035

//
// * Copyright 2004 Neusoft America Inc.
// * All rights reserved.
// * This component and the accompanying materials are made available
// * under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available
// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
// *
// * Contributors:
// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
// *
// * Description:  This file defines the CMux0710Protocol class.  This class
//                 performs the 3GPP2 protocol specific behavior for 27.010.
//                 This file also includes CRC table.
//

// CMux0710Protocol.h

/** @file CMux0710Protocol.h
 *
 */

#ifndef _MUX0710PROTOCOL_H_
#define _MUX0710PROTOCOL_H_

#include <e32base.h>
#include "CsyGlobals.h"
#include "timeouter.h"


class CCsyMsgBufBase;
class CCsyMsgBufFrame;
class CPortFactory;
class CCsyMsgBufBpFrame;
class CCommFrameWriterAo;
class CCommFrameReaderAo;

class CMux0710Protocol : public CBase, public MTimeoutObserver
	{
public:

	// Frame Types used in 27.010 Protocol
	enum TCsyFrameType
		{
		ESABM, // Set asynchronous balanced mode
		EUA,   // Unnumbered Acknowledgement
		EDM,   // Disconnected Mode
		EDISC, // Disconnect
		EUIH,  // Unnumbered information with header check
		EUI,   // Unnumberd information
		EUNKNOWN 
		};

	enum TCsyCtrlCommand
		{
		EParamNeg, // Parameter Negotiation
		EMSC	   // Modem status command
		};

public:
	static CMux0710Protocol* NewL(CPortFactory& aPortFactory);
	virtual ~CMux0710Protocol();

	void SetCommWriter(CCommFrameWriterAo* aCommWriter);

	TBool IsMuxModeEnabled() const;
	TInt SwitchToMuxMode();
	TInt ParseATResponse(TDes8& aResp);

	CCsyMsgBufBpFrame* GetFreeFrameBuf(TBool aCheckFlowControlThresholds = ETrue);
	void AddFrameFreeQ(CCsyMsgBufBpFrame* aBpFrame);

    TInt Create0710DataFrames(TDesC8& aMsgBuf, const TUint8 aDlcNum);
	TInt Create0710ControlFrame(TCsyFrameType aFrameType, TUint8 aDlcNum,
		TCsyCtrlCommand aType = EParamNeg, TUint8 aV24Signals = 0);

	inline TUint8 PreviousNegotiateDlcNum() const;
    inline TBool MaxRetriesReached() const;
    
public:// from MTimeoutObserver
	void TimedOut();

private:
	enum TCsyMuxMgrState
		{
		ECsyWaitingForAttentionResp,
		ECsyWaitingForEchoDisableResp,
		ECsyWaitingForCmuxResp,
		ECsyMuxEnabled,
		ECsyWaitingForFlushResp,
#ifdef USE_TI_CONDAT_STACK
		ECsyWaitingForResetResp,
		ECsyWaitingForSleepResp
#endif
		};
	
private:
	CMux0710Protocol(CPortFactory& aPortFactory);
	void ConstructL();

	void Create0710UIHFrameFromMsg(TDesC8& aMsgBuf, TInt aOffset,
								   CCsyMsgBufBpFrame* aFrameBuf,
								   TInt aLength, TUint8 aDlcNum);

	void Create0710UIHLayer4FrameFromMsg(TDesC8& aMsgBuf, 
										 TInt aOffset, 
										 CCsyMsgBufBpFrame* aFrameBuf, 
										 TInt aLength, TUint8 aDlcNum, 
										 TBool aLayer4Begin, 
										 TBool aLayer4End);

	void ProcessControlChannelRecvUihFrame(CCsyMsgBufBpFrame* aBpFrame);

	TUint8 CalcFCS(TUint8* aBuffer, TInt aLen);

	void DumpFrame(CCsyMsgBufBpFrame* aFrameBuf);

private:
	CActiveTimeouter*               iTimeouter;

	CPortFactory&                   iPortFactory;

	TCsyMuxMgrState                 iMuxMgrState;

	CCommFrameWriterAo*             iCommWriter;

	// Free Frame Buf List
	TSglQue<CCsyMsgBufBpFrame>      iFreeFrameBufList;
	TSglQueIter<CCsyMsgBufBpFrame>  iFreeFrameBufIter;
	TUint                           iFreeFrameCount;

	TBool iEnforcingFlowControl;

	TBool iModemRequestedToStop;

	TUint8 iParamNegotiateDlcNum;

	TUint8 iAtResponseTimeout;

	TBool iMaxRetriesReached;
	TBuf8<100> iResponseStr; 
	TInt iRetryCount;
	};

// inline methods

/**
Set the comm writer to the specified object pointer.

@param aCommWriter Pointer to the comm writer
*/
inline void CMux0710Protocol::SetCommWriter(CCommFrameWriterAo* aCommWriter)
	{
	iCommWriter = aCommWriter;
	}

/**
Return True if multiplexing mode is enabled, else return False.
*/
inline TBool CMux0710Protocol::IsMuxModeEnabled() const
	{
	if (iMuxMgrState == ECsyMuxEnabled)
		{
		return (ETrue);
		}
	else
		{
		return (EFalse);
		}
	}

/**
Return dlc that parameter negotiate command was sent for.
*/
inline TUint8 CMux0710Protocol::PreviousNegotiateDlcNum() const
	{
	return iParamNegotiateDlcNum;
	}

/**
Return whether the max connection retries has been reached.
*/
inline TBool CMux0710Protocol::MaxRetriesReached() const
	{
	return iMaxRetriesReached;
	}

#endif // _MUX0710PROTOCOL_H_