cbsref/csyrefplugins/csy27010/src/ChannelMgrBase.cpp
author hgs
Tue, 22 Jun 2010 11:02:32 +0100
changeset 44 8b72faa1200f
permissions -rw-r--r--
201024_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     1
//
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     2
// * Copyright 2004 Neusoft America Inc.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     3
// * All rights reserved.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     4
// * This component and the accompanying materials are made available
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     5
// * under the terms of the Eclipse Public License v1.0
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     6
// * which accompanies this distribution, and is available
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     7
// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     8
// *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
     9
// * Contributors:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    10
// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    11
// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    12
// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    13
// *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    14
// * Description:  The CChannelMgrBase class defines a single 3GPP 27.010 based logical channel
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    15
// *               called DLC. This base class is inherited by derived control and data channel
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    16
// *               classes which add specific channel type behavior.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    17
//
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    18
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    19
// ChannelMgrBase.cpp
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    20
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    21
/** @file ChannelMgrBase.cpp
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    22
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    23
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    24
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    25
#include "ChannelMgrBase.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    26
#include "CsyMsgBufBpFrame.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    27
#include "PortC32Interface.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    28
#include "Mux0710Protocol.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    29
#include "CsyDebugLogger.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    30
#include "CommFrameWriterAo.h"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    31
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    32
CChannelMgrBase::CChannelMgrBase(const TUint8 aDlcNum,
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    33
								 CPortFactory& aPortFactory,
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    34
								 CMux0710Protocol& aMux0710Protocol)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    35
: iV24Signals(0x0D),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    36
  iDlcNum(aDlcNum),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    37
#ifndef __CSY_PROTOTYPE__
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    38
  iChannelState(ECsyChannelStateDisconnected),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    39
#else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    40
  iChannelState(ECsyChannelStateConnected),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    41
#endif
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    42
  iPortFactory(aPortFactory),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    43
  iPortC32Interface(NULL),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    44
#ifndef __CSY_PROTOTYPE__
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    45
  iMux0710Protocol(aMux0710Protocol),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    46
#else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    47
  iMux0710Protocol(aMux0710Protocol),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    48
  iChannelReady(ETrue),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    49
  iInitFinished(ETrue),
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    50
#endif
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    51
  iModemAllowedToSendFrames(EFlowControlOff)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    52
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    53
 * Constructor.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    54
 * @param aDlcNum - DLC number for the channel
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    55
 * @param aPortFactory - Reference to port factory
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    56
 * @param aMux0710Protocol - Reference to the Mux 27.010 object
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    57
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    58
 	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    59
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    60
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    61
CChannelMgrBase::~CChannelMgrBase()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    62
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    63
 * Destructor. Delete all resources and memory allocated by this object.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    64
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    65
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    66
	_LOG_L4C1("CChannelMgrBase::~CChannelMgrBase");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    67
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    68
	delete iChannelObserverAo;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    69
	delete iTimeouter;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    70
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    71
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    72
void CChannelMgrBase::ConstructL()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    73
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    74
 * Create any instances and allocate any memory used by this object.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    75
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    76
 	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    77
	_LOG_L4C1("CChannelMgrBase::ConstructL");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    78
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    79
	iChannelObserverAo = CChannelObserverAo::NewL();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    80
	CActiveScheduler::Add(iChannelObserverAo); 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    81
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    82
	iTimeouter = CActiveTimeouter::NewL(*this);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    83
	iTimeoutVal = KOneSecond;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    84
	iTxCountLimit = 10;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    85
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    86
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    87
TDes8& CChannelMgrBase::RefToMsgBuffer()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    88
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    89
 * This method returns a pointer to the message buffer to use
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    90
 * to format a message to send to the baseband.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    91
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    92
 * @return pointer
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    93
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    94
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    95
	// only one buffer is available for messages to the baseband
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    96
	return iDataToSendToModem;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    97
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    98
8b72faa1200f 201024_02
hgs
parents:
diff changeset
    99
void CChannelMgrBase::ProcessRecvFrame(CCsyMsgBufBpFrame* aBpFrame)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   100
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   101
 * This method is called to process a frame that was received
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   102
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   103
 * @param aBpFrame - Pointer to the frame buffer
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   104
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   105
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   106
	if (aBpFrame->GetFrameType() != KCsy0710CTLUIH)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   107
		ProcessNonUihRecvFrame(aBpFrame);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   108
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   109
		ProcessRecvUihFrame(aBpFrame);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   110
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   111
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   112
TInt CChannelMgrBase::PlaceOnOutboundQueue()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   113
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   114
 * This method is called to process the "to baseband Message Q" event
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   115
 * for the channel. This event indicates that there is a message
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   116
 * that needs to be sent to the baseband.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   117
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   118
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   119
	_LOG_L4C2(">>CChannelMgrBase::PlaceOnOutboundQueue [iDlcNum=%d]",iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   120
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   121
	TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   122
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   123
	if (iCsyAllowedToSendFrames == EFlowControlOn)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   124
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   125
		_LOG_L4C1("Csy -> modem flow control = ON");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   126
		iDelayedWriteToModem = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   127
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   128
		// We cannot fragment and place it on the write queue yet since
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   129
		// flow control in the direction of Csy to modem is set to ON.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   130
		
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   131
		_LOG_L4C1("<<CChannelMgrBase::PlaceOnOutboundQueue - write delayed");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   132
		return KErrNone;	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   133
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   134
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   135
	if (iChannelState != ECsyChannelStateConnected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   136
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   137
		// this should not happen (should be caught by flow control above)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   138
		// MAF __ASSERT_DEBUG(EFalse,PANIC(KPanicIllegalState));
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   139
		_LOG_L4C1("<<CChannelMgrBase::PlaceOnOutboundQueue - write ignored");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   140
		return KErrNone;	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   141
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   142
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   143
	ret = iMux0710Protocol.Create0710DataFrames(iDataToSendToModem, iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   144
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   145
	_LOG_L4C2("<<CChannelMgrBase::PlaceOnOutboundQueue [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   146
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   147
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   148
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   149
void CChannelMgrBase::WriteCancel()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   150
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   151
 * The client has requested the write by this DLC be cancelled.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   152
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   153
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   154
	_LOG_L4C1(">>CChannelMgrBase::WriteCancel");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   155
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   156
	if (iDelayedWriteToModem)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   157
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   158
		_LOG_L4C1("Delayed write has been cancelled");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   159
		iDelayedWriteToModem = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   160
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   161
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   162
	_LOG_L4C1("Remove any frames on write queue");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   163
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   164
	// remove any frames (if any exist) from the writer Ao and
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   165
	// place them on the free queue
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   166
	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   167
	CCommFrameWriterAo* writer = iPortFactory.GetCommWriterAo();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   168
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   169
	writer->RemoveAnyDlcFramesOnWriteList(iDlcNum, EFalse);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   170
	writer->RemoveAnyDlcFramesFromWaitList(iDlcNum, EFalse);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   171
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   172
	_LOG_L4C1("<<CChannelMgrBase::WriteCancel");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   173
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   174
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   175
TInt CChannelMgrBase::Connect()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   176
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   177
 * Request to connect the channel. If the channel state is not "Connected"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   178
 * then issue a SABM frame and change the channel state to "Connecting".
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   179
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   180
 * @return KErrNone or KErrGeneral
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   181
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   182
    {
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   183
    _LOG_L4C3(">>CChannelMgrBase::Connect [iDlcNum=%d,iChannelState=%d]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   184
		iDlcNum,iChannelState);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   185
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   186
	TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   187
	if (iChannelState != ECsyChannelStateConnected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   188
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   189
		_LOG_L4C1("Dlc is not currently connected");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   190
		ret = iMux0710Protocol.Create0710ControlFrame(CMux0710Protocol::ESABM, iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   191
		if (ret == KErrNone)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   192
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   193
			iChannelState = ECsyChannelStateConnecting;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   194
			iInitFinished = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   195
			iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   196
			iTimeouter->Start(iTimeoutVal);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   197
			iTxCount = iTxCountLimit;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   198
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   199
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   200
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   201
			_LOG_L1C1("** Cannot send SABM **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   202
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   203
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   204
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   205
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   206
		_LOG_L2C1("** Ignored Connect **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   207
		ret = KErrGeneral;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   208
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   209
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   210
    _LOG_L4C2("<<CChannelMgrBase::Connect [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   211
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   212
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   213
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   214
TInt CChannelMgrBase::ParameterNegotiate()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   215
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   216
 * Request to parameter negotiation for the channel. If the channel state is not 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   217
 * "Connected" then issue a UIH frame and with the parameter negotiation.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   218
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   219
 * @return KErrNone or KErrGeneral
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   220
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   221
    {
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   222
    _LOG_L4C3(">>CChannelMgrBase::ParameterNegotiate [iDlcNum=%d,iChannelState=%d]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   223
		iDlcNum,iChannelState);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   224
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   225
	TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   226
	if (iChannelState != ECsyChannelStateConnected) 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   227
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   228
		_LOG_L4C1("Dlc is not currently connected");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   229
		if (iMux0710Protocol.Create0710ControlFrame(CMux0710Protocol::EUIH, iDlcNum) == KErrNone)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   230
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   231
			iChannelState = ECsyChannelStateParameterNegotiating;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   232
			iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   233
			iTimeouter->Start(iTimeoutVal);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   234
			iTxCount = iTxCountLimit;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   235
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   236
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   237
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   238
			_LOG_L1C1("** Cannot send EUIH Param Neg. **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   239
			ret = KErrGeneral;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   240
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   241
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   242
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   243
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   244
		_LOG_L2C1("** Ignored ParameterNegotiate **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   245
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   246
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   247
    _LOG_L4C2("<<CChannelMgrBase::ParameterNegotiate [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   248
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   249
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   250
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   251
TInt CChannelMgrBase::Disconnect()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   252
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   253
 * Request to disconnect the channel. If the channel is not "Disconnected"
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   254
 * then issue a DISC frame and change the channel state to "Disconnecting".
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   255
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   256
 * @return KErrNone or error code
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   257
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   258
    {
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   259
    _LOG_L4C3(">>CChannelMgrBase::Disconnect [iDlcNum=%d,iChannelState=%d]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   260
		iDlcNum,iChannelState);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   261
		
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   262
	TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   263
	if (iChannelState == ECsyChannelStateConnected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   264
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   265
		_LOG_L4C1("Dlc is currently connected");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   266
		if (iMux0710Protocol.Create0710ControlFrame(CMux0710Protocol::EDISC, iDlcNum) == KErrNone)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   267
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   268
			iChannelState = ECsyChannelStateDisconnecting;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   269
			_LOG_L1C2("** Setting Channel Ready to False for DLC %d **",iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   270
			iChannelReady = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   271
			iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   272
			
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   273
			// Allow time for the channel to disconnect...
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   274
			User::After(1);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   275
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   276
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   277
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   278
			_LOG_L1C1("** Cannot send EDISC **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   279
			ret = KErrGeneral;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   280
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   281
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   282
	else if (iChannelState == ECsyChannelStateTransmitError)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   283
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   284
		_LOG_L2C1("** Disconnect request for channel with transmit error **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   285
		ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   286
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   287
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   288
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   289
		_LOG_L2C1("** Ignored disconnect **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   290
		ret = KErrGeneral;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   291
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   292
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   293
    _LOG_L4C2("<<CChannelMgrBase::Disconnect [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   294
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   295
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   296
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   297
void CChannelMgrBase::ProcessNonUihRecvFrame(CCsyMsgBufBpFrame* aBpFrame)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   298
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   299
 * This method is called to process a Non-UIH frame which the channel
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   300
 * has received from the baseband for the channel.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   301
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   302
 * @param aBpFrame - Pointer to the received Non-UIH frame
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   303
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   304
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   305
	_LOG_L4C2(">>CChannelMgrBase::ProcessNonUihRecvFrame [iDlcNum=%d]", iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   306
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   307
	TUint8 frameType = aBpFrame->GetFrameType();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   308
	iMux0710Protocol.AddFrameFreeQ(aBpFrame);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   309
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   310
	switch (frameType)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   311
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   312
	case KCsy0710CTLSABM:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   313
		_LOG_L4C1("SABM");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   314
		// MAF we should respond to this
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   315
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   316
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   317
	case KCsy0710CTLUA:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   318
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   319
		_LOG_L4C1("UA");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   320
		iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   321
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   322
		if (iChannelState == ECsyChannelStateConnecting)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   323
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   324
			_LOG_L4C1("SABM received by remote end - send MSC command");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   325
			if (SendMscCommand(iV24Signals) == KErrNone)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   326
				iChannelState = ECsyChannelStateMSCsent;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   327
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   328
		else if (iChannelState == ECsyChannelStateDisconnecting)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   329
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   330
			_LOG_L4C2("Channel disconnected %d", iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   331
			iChannelState = ECsyChannelStateDisconnected;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   332
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   333
			if (iPortFactory.DecrementNumOfOpenPorts())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   334
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   335
				NotifyChannelReady();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   336
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   337
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   338
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   339
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   340
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   341
	case KCsy0710CTLDM:    // 0x0F
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   342
		_LOG_L4C1("DM");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   343
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   344
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   345
	case KCsy0710CTLDISC:  // 0x43
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   346
		_LOG_L4C1("DISC");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   347
		// MAF we should respond to this
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   348
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   349
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   350
	case KCsy0710CTLUIH:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   351
	case KCsy0710CTLUI:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   352
		// MAF __ASSERT_DEBUG(EFalse,PANIC(KPanicIllegalState)); here
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   353
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   354
	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   355
	default:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   356
		_LOG_L1C2("** Unknown FrameType = 0x%02x **", frameType);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   357
		break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   358
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   359
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   360
	_LOG_L4C1("<<CChannelMgrBase::ProcessNonUihRecvFrame");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   361
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   362
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   363
TInt CChannelMgrBase::SendMscCommand(TUint8 aV24Signals)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   364
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   365
 * Sends an MSC command
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   366
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   367
 * @param aV24Signals
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   368
 * @return error if failed to send
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   369
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   370
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   371
	_LOG_L4C2(">>CChannelMgrBase::SendMscCommand [aV24Signals=0x%02x]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   372
		aV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   373
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   374
	if (iMscReplyExpected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   375
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   376
		_LOG_L4C1("<<CChannelMgrBase::SendMscCommand - already doing MSC");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   377
		return KErrNotReady;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   378
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   379
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   380
	// Keep the signals in case of resend
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   381
	iV24Signals = aV24Signals;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   382
	TInt ret = iMux0710Protocol.Create0710ControlFrame(
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   383
		CMux0710Protocol::EUIH, iDlcNum, CMux0710Protocol::EMSC, iV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   384
	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   385
	if (ret != KErrNone)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   386
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   387
		_LOG_L1C1("** Could not send MSC command **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   388
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   389
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   390
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   391
		iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   392
		iTimeouter->Start(iTimeoutVal);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   393
		iTxCount = iTxCountLimit;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   394
		iMscReplyExpected = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   395
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   396
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   397
	_LOG_L4C2("<<CChannelMgrBase::SendMscCommand [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   398
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   399
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   400
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   401
void CChannelMgrBase::MscReceived(TUint8 aV24Signals)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   402
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   403
 * Processes a received MSC command
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   404
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   405
 * @param aV24Signals
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   406
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   407
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   408
	_LOG_L4C2(">>CChannelMgrBase::MscReceived [aV24Signals=0x%x]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   409
		aV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   410
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   411
	if (!iMscReplyExpected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   412
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   413
		_LOG_L2C1("*** Not expecting MscReceived? ***");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   414
		return;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   415
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   416
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   417
	iMscReplyExpected = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   418
	iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   419
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   420
	if (iChannelState == ECsyChannelStateMSCsent)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   421
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   422
		_LOG_L4C1("MSC cmd part of start up sequence");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   423
		iChannelState = ECsyChannelStateWaitingForChannelReady;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   424
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   425
		//different type of channel may need different init process.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   426
		if (iPortC32Interface)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   427
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   428
#ifdef _27010ADVANCEOPTION
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   429
			if (iPortC32Interface->GetClientType() == CPortFactory::EC32ClientIpNif)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   430
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   431
				_LOG_L4C1(" IpNif Channel Initialized");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   432
				// Don't need to wait for AT command interpreter ready since not AT
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   433
				iChannelState = ECsyChannelStateConnected;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   434
				NotifyChannelReady();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   435
				ModemAndCsyToClientFlowCtrl(EFlowControlOff);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   436
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   437
#endif
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   438
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   439
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   440
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   441
			// Command channel
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   442
			iChannelState = ECsyChannelStateConnected;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   443
			NotifyChannelReady();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   444
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   445
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   446
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   447
	if ((iDlcNum)&&(iV24Signals != aV24Signals))
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   448
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   449
		_LOG_L4C3("Data Dlc - Response different to sent [%x != %x]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   450
			iV24Signals, aV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   451
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   452
		ReceivedV24Signals(aV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   453
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   454
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   455
	_LOG_L4C1("<<CChannelMgrBase::MscReceived");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   456
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   457
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   458
void CChannelMgrBase::ModemAndCsyToClientFlowCtrl(const TFlowControl aFlowControl)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   459
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   460
 * Set the channel's flow control to the specified value.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   461
 * Update the associate port object's flow control if the port object 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   462
 * exists.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   463
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   464
 * @param aFlowControl - New flow control state
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   465
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   466
 	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   467
	_LOG_L4C3(">>CChannelMgrBase::ModemAndCsyToClientFlowCtrl [aFlowControl=%d,iDlcNum=%d]", 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   468
		aFlowControl,iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   469
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   470
	iCsyAllowedToSendFrames = aFlowControl;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   471
	if ((aFlowControl == EFlowControlOff)&&(iDelayedWriteToModem))
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   472
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   473
		_LOG_L4C1("Flow control now OFF - delayed frame to send");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   474
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   475
		TInt ret = iMux0710Protocol.Create0710DataFrames(iDataToSendToModem, iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   476
		if (ret)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   477
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   478
			_LOG_L1C2("** Fragmentation failed [ret=%d] **",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   479
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   480
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   481
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   482
			_LOG_L4C1("Delayed write placed on write queue");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   483
			iDelayedWriteToModem = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   484
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   485
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   486
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   487
	CPortC32InterfaceBase* port = GetC32Port();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   488
	if (port)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   489
		port->ModemAndCsyToClientFlowCtrl(aFlowControl);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   490
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   491
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   492
		_LOG_L2C1("** GetC32Port() returned NULL **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   493
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   494
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   495
	_LOG_L4C1("<<CChannelMgrBase::ModemAndCsyToClientFlowCtrl");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   496
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   497
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   498
void CChannelMgrBase::ReceivedV24Signals(const TUint8 aV24Signals)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   499
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   500
 * Set the channel's signals to the specified value.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   501
 * Update the associate port object's flow control if the port object 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   502
 * exists.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   503
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   504
 * @param aSignals - new signal state
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   505
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   506
 	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   507
	_LOG_L4C3(">>CChannelMgrBase::ReceivedV24Signals [aV24Signals=0x%x,iDlcNum=%d]", 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   508
		aV24Signals,iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   509
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   510
	CPortC32InterfaceBase* port = GetC32Port();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   511
	if (port)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   512
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   513
		// Flow control
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   514
		TFlowControl flowControl = EFlowControlOff;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   515
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   516
		// FC (bit 2)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   517
		if (aV24Signals & 0x02)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   518
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   519
			_LOG_L4C2("FC=1 - modem dlc %d unable to accept frames",iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   520
			flowControl = EFlowControlOn;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   521
			_LOG_L4C1("flowControl On  (i.e stop flow)");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   522
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   523
			// move frames for this dlc from write list to wait list
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   524
			iPortFactory.GetCommWriterAo()->RemoveAnyDlcFramesOnWriteList(iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   525
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   526
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   527
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   528
			// move any frames for this dlc from wait to write list
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   529
			iPortFactory.GetCommWriterAo()->RemoveAnyDlcFramesFromWaitList(iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   530
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   531
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   532
		ModemAndCsyToClientFlowCtrl(flowControl);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   533
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   534
		port->ReceivedV24Signals(aV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   535
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   536
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   537
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   538
		_LOG_L2C1("** GetC32Port() returned NULL **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   539
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   540
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   541
	_LOG_L4C1("<<CChannelMgrBase::ReceivedV24Signals");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   542
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   543
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   544
void CChannelMgrBase::WaitForChannelReady()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   545
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   546
 * This method starts an active object and waits for the channel ready
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   547
 * call back signal.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   548
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   549
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   550
	_LOG_L4C1(">>CChannelMgrBase::WaitForChannelReady");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   551
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   552
	if (iMux0710Protocol.MaxRetriesReached())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   553
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   554
		_LOG_L4C1("Mux Max Retries reached - so skip Channel Ready");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   555
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   556
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   557
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   558
		// kick off an active object and wait for channel ready call back
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   559
		if (iChannelReady)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   560
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   561
			_LOG_L4C2("iChannelReady=%d",iChannelReady);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   562
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   563
		else if (!iChannelObserverAo->IsActive())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   564
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   565
			// start the active object. CSY will wait here until channel is ready
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   566
			// nest active scheduler is used here as we did not want to block whole thread (reading/writing)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   567
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   568
			iChannelObserverAo->StartWait();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   569
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   570
			// start a nested scheduling; blocks until CActiveScheduler::Stop() 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   571
			// is called in DoCancel()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   572
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   573
			// MAF look at use CActiveSchedulerWait instead of this
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   574
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   575
			// One basic assumption here is that CSY will process port open request one by one
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   576
			// (although there may be mutiple port open requests from clients, c32 will call PortFactory::NewPortL
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   577
			// one by one.) This assumption should be valid as it is only one thread for c32
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   578
			// if this assumption does not hold, headache follows.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   579
			_LOG_L4C1("Start wait for channel ready");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   580
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   581
			CActiveScheduler::Start();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   582
			_LOG_L4C1("End wait for channel ready");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   583
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   584
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   585
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   586
			_LOG_L4C1("We are here only when others are already waiting");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   587
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   588
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   589
	_LOG_L4C1("<<CChannelMgrBase::WaitForChannelReady");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   590
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   591
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   592
void CChannelMgrBase::TimedOut()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   593
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   594
 * This method will be called when we have a timeout During receive a reply.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   595
 * It will retransmit if needed.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   596
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   597
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   598
	_LOG_L4C1(">>CChannelMgrBase::TimedOut");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   599
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   600
	iTxCount--;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   601
	if (iTxCount > 0)  // retransmit
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   602
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   603
		_LOG_L4C2("iTxCount=%d",iTxCount);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   604
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   605
		TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   606
		if (iMscReplyExpected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   607
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   608
			iMscReplyExpected = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   609
			ret = SendMscCommand(iV24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   610
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   611
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   612
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   613
			switch(iChannelState)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   614
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   615
			case ECsyChannelStateParameterNegotiating:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   616
				ret = iMux0710Protocol.Create0710ControlFrame(
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   617
					CMux0710Protocol::EUIH, iDlcNum, CMux0710Protocol::EParamNeg);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   618
				break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   619
			case ECsyChannelStateConnecting:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   620
				ret = iMux0710Protocol.Create0710ControlFrame(
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   621
					CMux0710Protocol::ESABM, iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   622
				break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   623
			case ECsyChannelStateDisconnecting:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   624
				ret = iMux0710Protocol.Create0710ControlFrame(
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   625
					CMux0710Protocol::EDISC, iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   626
				break;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   627
			default:
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   628
				// should never reach here
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   629
				_LOG_L1C1("** unexpected receiving timeout **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   630
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   631
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   632
		if (ret)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   633
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   634
			// Error sending - we shall just wait until the timeout and try again
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   635
			_LOG_L1C2("** Error sending on dlc 0 [ret=%d] **",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   636
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   637
		iTimeouter->Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   638
		iTimeouter->Start(iTimeoutVal);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   639
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   640
	else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   641
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   642
		_LOG_L1C1("** Retries expired **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   643
		if (iMscReplyExpected)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   644
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   645
			_LOG_L1C1("** Retries expired for MSC command **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   646
			iMscReplyExpected = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   647
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   648
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   649
		// we have problem communication, may need to reset?
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   650
		iChannelState = ECsyChannelStateTransmitError;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   651
		NotifyChannelReady();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   652
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   653
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   654
	_LOG_L4C1("<<CChannelMgrBase::TimedOut");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   655
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   656
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   657
void CChannelMgrBase::NotifyChannelReady()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   658
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   659
 * This method stops the waiting for a channel.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   660
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   661
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   662
	_LOG_L4C1("CChannelMgrBase::NotifyChannelReady");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   663
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   664
	iChannelReady = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   665
	iInitFinished = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   666
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   667
	// complete the active object if it is running
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   668
	if (iChannelObserverAo->IsActive())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   669
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   670
		iChannelObserverAo->ChannelReady();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   671
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   672
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   673
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   674
TInt CChannelMgrBase::SetCsyToModemFlowControl(TFlowControl aFlowControl)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   675
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   676
 * 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   677
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   678
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   679
	_LOG_L4C3(">>CChannelMgrBase::SetCsyToModemFlowControl [aFlowControl=%d,iDlcNum=%d]",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   680
		aFlowControl,iDlcNum);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   681
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   682
	TInt ret = KErrNone;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   683
	if (aFlowControl != iModemAllowedToSendFrames)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   684
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   685
		TUint8 v24Signals = iV24Signals;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   686
		TBool sendCommand = EFalse;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   687
		if (aFlowControl == EFlowControlOn)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   688
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   689
			_LOG_L4C1("aFlowControl = ON");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   690
			if (v24Signals & 0x02)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   691
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   692
				_LOG_L4C1("** Flow control already set **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   693
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   694
			else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   695
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   696
				v24Signals |= 0x02;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   697
				sendCommand = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   698
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   699
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   700
		else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   701
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   702
			_LOG_L4C1("aFlowControl = OFF");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   703
			if (v24Signals & 0x02)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   704
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   705
				v24Signals ^= 0x02;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   706
				sendCommand = ETrue;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   707
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   708
			else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   709
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   710
				_LOG_L4C1("Flow control already off");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   711
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   712
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   713
		if (sendCommand)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   714
			{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   715
			ret = SendMscCommand(v24Signals);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   716
			if (ret)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   717
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   718
				_LOG_L4C1("SendMscCommand failed");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   719
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   720
			else
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   721
				{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   722
				_LOG_L4C3("Csy to modem flow control changed %d -> %d",
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   723
					iModemAllowedToSendFrames,aFlowControl);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   724
				iModemAllowedToSendFrames = aFlowControl;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   725
				}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   726
			}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   727
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   728
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   729
	_LOG_L4C2("<<CChannelMgrBase::SetCsyToModemFlowControl [ret=%d]",ret);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   730
	return ret;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   731
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   732
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   733
//
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   734
// class CChannelObserverAo
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   735
//
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   736
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   737
CChannelObserverAo::CChannelObserverAo()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   738
: CActive(CActive::EPriorityStandard)
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   739
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   740
 * Constructor.  Pass priority of active object to base class.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   741
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   742
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   743
	{}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   744
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   745
CChannelObserverAo* CChannelObserverAo::NewL()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   746
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   747
 * This method uses two phase construction and the cleanup stack
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   748
 * to create an instance of class CChannelObserverAo.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   749
 *
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   750
 * @return Pointer to the created instance
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   751
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   752
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   753
	_LOG_L4C1("CChannelObserverAo::NewL");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   754
	return new (ELeave) CChannelObserverAo();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   755
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   756
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   757
CChannelObserverAo::~CChannelObserverAo()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   758
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   759
 * Destructor. Cancel any outstanding request.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   760
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   761
	{	
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   762
	if (IsActive())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   763
		Cancel();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   764
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   765
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   766
void CChannelObserverAo::RunL()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   767
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   768
 * This method should not be called. Request of this 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   769
 * active object will only be canceled.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   770
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   771
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   772
	// MAF __ASSERT_DEBUG(EFalse,PANIC(KPanicIllegalState));
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   773
	_LOG_L1C1("** CChannelObserverAo::RunL() - should not be called **");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   774
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   775
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   776
void CChannelObserverAo::DoCancel()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   777
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   778
 * Cancel an outstanding request. This will complete request
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   779
 * with KErrCancel and stop waiting.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   780
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   781
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   782
	_LOG_L4C1("CChannelObserverAo::DoCancel");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   783
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   784
	iStatus = KErrCancel;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   785
	TRequestStatus* temp = &iStatus;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   786
	User::RequestComplete(temp, KErrCancel);
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   787
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   788
	_LOG_L4C1("CChannelObserverAo stop scheduler");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   789
	CActiveScheduler::Stop();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   790
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   791
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   792
void CChannelObserverAo::StartWait()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   793
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   794
 * Set active and start waiting.
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   795
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   796
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   797
	_LOG_L4C1("CChannelObserverAo::StartWait");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   798
	if (!IsActive())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   799
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   800
		iStatus = KRequestPending;
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   801
		SetActive();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   802
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   803
	}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   804
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   805
void CChannelObserverAo::ChannelReady()
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   806
/**
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   807
 * Called when expected event occured to stop waiting. 
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   808
 */
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   809
	{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   810
	_LOG_L4C1("CChannelObserverAo::ChannelReady");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   811
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   812
	// complete current request
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   813
	if (IsActive())
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   814
		{
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   815
		_LOG_L4C1("CChannelObserverAo Active");
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   816
		Cancel();
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   817
		}
8b72faa1200f 201024_02
hgs
parents:
diff changeset
   818
	}