cbsref/csyrefplugins/csy27010/src/CommFrameWriterAo.cpp
branchRCL_3
changeset 20 07a122eea281
parent 19 630d2f34d719
child 21 4814c5a49428
equal deleted inserted replaced
19:630d2f34d719 20:07a122eea281
     1 //
       
     2 // * Copyright 2004 Neusoft America Inc.
       
     3 // * All rights reserved.
       
     4 // * This component and the accompanying materials are made available
       
     5 // * under the terms of the Eclipse Public License v1.0
       
     6 // * which accompanies this distribution, and is available
       
     7 // * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 // *
       
     9 // * Contributors:
       
    10 // * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
       
    11 // * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
       
    12 // * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
       
    13 // *
       
    14 // * Description:  This file contains the implemenation for the CCommFrameWriterAo class.
       
    15 // *               This class is used to handle the write operations to the serial port
       
    16 // *               logical device driver.
       
    17 //
       
    18 
       
    19 // CommFrameWriterAo.cpp
       
    20 
       
    21 /** @file CommFrameWriterAo.cpp
       
    22  *
       
    23  * This file contains the implemenation for the CCommFrameWriterAo class.
       
    24  * This class is used to handle the write operations to the serial port
       
    25  * logical device driver.
       
    26  */
       
    27 
       
    28 #include "CommFrameWriterAo.h"
       
    29 #include "CsyMsgBufBPFrame.h"
       
    30 #include "Mux0710Protocol.h"
       
    31 #include "CsyDebugLogger.h"
       
    32 #include "PortC32InterfaceBase.h"
       
    33 
       
    34 CCommFrameWriterAo* CCommFrameWriterAo::NewL(CPortFactory* aParent, CMux0710Protocol* aMux0710Protocol)
       
    35 /**
       
    36  * This method uses two phase construction and the cleanup stack to
       
    37  * create an instance of class CCommFrameWriterAo. 
       
    38  *
       
    39  * @param aParent - Pointer to the parent object
       
    40  * @param aMux0710Protocol - Pointer to mux protocol object
       
    41  * @return Pointer to new instance of CCommFrameWriterAo
       
    42  */
       
    43     {
       
    44 	_LOG_L4C1("CCommFrameWriterAo::NewL");
       
    45 
       
    46     CCommFrameWriterAo* obj = new (ELeave) CCommFrameWriterAo(aParent, aMux0710Protocol);
       
    47     CleanupStack::PushL(obj);
       
    48     obj->ConstructL();
       
    49     CleanupStack::Pop();
       
    50     return (obj);
       
    51     }
       
    52 
       
    53 
       
    54 CCommFrameWriterAo::~CCommFrameWriterAo()
       
    55 /**
       
    56  * Destructor.
       
    57  */
       
    58     {
       
    59 	_LOG_L4C1("CCommFrameWriterAo::~CCommFrameWriterAo");
       
    60 
       
    61     Cancel();
       
    62 
       
    63  	// Remove the frames in Write Buf List
       
    64 	CCsyMsgBufBpFrame* frame;
       
    65 	iWriteFrameBufIter.SetToFirst();
       
    66 	while ((frame = iWriteFrameBufIter++) != NULL)
       
    67 		{
       
    68 		iWriteFrameBufList.Remove(*frame);
       
    69 		delete frame;
       
    70 	 	}
       
    71 
       
    72  	// Remove the frames in waiting list
       
    73 	iWaitingForFcOffIter.SetToFirst();
       
    74 	while ((frame = iWaitingForFcOffIter++) != NULL)
       
    75 		{
       
    76 		iWaitingForFcOffList.Remove(*frame);
       
    77 		delete frame;
       
    78 	 	}
       
    79    }
       
    80 
       
    81 CCommFrameWriterAo::CCommFrameWriterAo(CPortFactory* aParent, CMux0710Protocol* aMux0710Protocol)
       
    82 /**
       
    83  * Constructor.
       
    84  * @param aParent - Pointer to the parent object
       
    85  * @param aMux0710Protocol - Pointer to mux protocol object
       
    86  */
       
    87 :	CCommReadWriteBaseAo(aParent, aMux0710Protocol, KFrameWriterAoPriority),
       
    88 	iWriteFrameBufList(_FOFF(CCsyMsgBufBpFrame, iMsgLink)),
       
    89 	iWriteFrameBufIter(iWriteFrameBufList),
       
    90 	iWaitingForFcOffList(_FOFF(CCsyMsgBufBpFrame, iMsgLink)),
       
    91 	iWaitingForFcOffIter(iWaitingForFcOffList)
       
    92 	{}
       
    93 
       
    94 
       
    95 void CCommFrameWriterAo::ConstructL()
       
    96 /**
       
    97  * Safe constructor
       
    98  */
       
    99     {
       
   100 	_LOG_L4C1("CCommFrameWriterAo::ConstructL");
       
   101 	SetBuffersL();
       
   102     }
       
   103 
       
   104 void CCommFrameWriterAo::RunL()
       
   105 /**
       
   106  * This method is called when a write to the LDD completes.
       
   107  */
       
   108 	{
       
   109 	_LOG_L4C1(" ");
       
   110 	_LOG_L4C2(">>CCommFrameWriterAo::RunL [iStatus=%d] - written to LDD",
       
   111 		iStatus.Int());
       
   112 
       
   113 	if (iStatus.Int())
       
   114 		{
       
   115 		_LOG_L1C2("** Error writing to LDD ** [iStatus=%d]",iStatus.Int());
       
   116 
       
   117 		if (!iCompleteWhenSent)
       
   118 			{
       
   119 			// The frame being sent was not the last or only one for this dlc, other
       
   120 			// frames exist
       
   121 
       
   122 			// go through list and remove other frames to send for this dlc
       
   123 			RemoveAnyDlcFramesOnWriteList(iDlcNum, EFalse);
       
   124 
       
   125 			iCompleteWhenSent = ETrue;
       
   126 			}
       
   127 		}
       
   128 
       
   129 	if (iCompleteWhenSent)
       
   130 		{
       
   131 		iCompleteWhenSent = EFalse;
       
   132 
       
   133 		_LOG_L3C2("Complete write [iDlcNum=%d]",iDlcNum);
       
   134 		CompleteWrite(iDlcNum,iStatus.Int());
       
   135 		}
       
   136 
       
   137 	// check for another message that needs to be sent to the baseband
       
   138 	CCsyMsgBufBpFrame* bpFrame = GetFrameToWrite();
       
   139 	if (bpFrame)
       
   140 		{
       
   141 		TInt ret = KErrNone;
       
   142 		do
       
   143 			{
       
   144 			ret = WriteFrame(bpFrame);
       
   145 			if (ret)
       
   146 				{
       
   147 				_LOG_L1C2("** Write frame failed [ret=%d] **",ret);
       
   148 				if (!iCompleteWhenSent)
       
   149 					{
       
   150 					// go through list and remove other frames to send for this dlc
       
   151 					RemoveAnyDlcFramesOnWriteList(iDlcNum, EFalse);
       
   152 					}
       
   153 				}
       
   154 
       
   155 			// Loop around if there is an error and try and send the next frame
       
   156 			}
       
   157 			while (ret);
       
   158 		}
       
   159 	else
       
   160 		{
       
   161 		_LOG_L3C1("Finished all writes - nothing more to send to LDD");
       
   162 		}
       
   163 
       
   164 	_LOG_L4C1("<<CCommFrameWriterAo::RunL");
       
   165 	_LOG_L3C1(" "); // please leave this separator in
       
   166 	}
       
   167 
       
   168 void CCommFrameWriterAo::DoCancel()
       
   169 /**
       
   170  * Cancel a pending write
       
   171  */
       
   172     {
       
   173 	_LOG_L4C1("CCommFrameWriterAo::DoCancel - cancelling LDD write");
       
   174 
       
   175 	iCommPort->WriteCancel();
       
   176 
       
   177  	// Remove the frames in Write Buf List
       
   178 	CCsyMsgBufBpFrame* frame;
       
   179 	iWriteFrameBufIter.SetToFirst();
       
   180 	while ((frame = iWriteFrameBufIter++) != NULL)
       
   181 		{
       
   182 		iWriteFrameBufList.Remove(*frame);
       
   183 		iMux0710Protocol->AddFrameFreeQ(frame);
       
   184 	 	}
       
   185 
       
   186  	// Remove the frames in waiting list
       
   187 	iWaitingForFcOffIter.SetToFirst();
       
   188 	while ((frame = iWaitingForFcOffIter++) != NULL)
       
   189 		{
       
   190 		iWaitingForFcOffList.Remove(*frame);
       
   191 		iMux0710Protocol->AddFrameFreeQ(frame);
       
   192 	 	}
       
   193     }
       
   194 
       
   195 TInt CCommFrameWriterAo::Write(CCsyMsgBufBpFrame* aBpFrame,
       
   196 							   TBool aHighPriority)
       
   197 /**
       
   198  * This method is called to transmit a frame to the baseband.
       
   199  *
       
   200  * @param aBpFrame - Pointer to frame
       
   201  * @param aHighPriority - Flag to indicate a high priority frame
       
   202  */
       
   203     {
       
   204 	_LOG_L4C3(">>CCommFrameWriterAo::Write [aBpFrame=0x%x, aHighPriority=%d]",
       
   205 		aBpFrame,aHighPriority);
       
   206 
       
   207 	TInt ret = KErrNone;
       
   208 
       
   209 	// 1st check if we are already transmitting a frame
       
   210 	if (!IsActive())
       
   211 		{
       
   212 		_LOG_L4C1("Not currently writing a frame");
       
   213 		ret = WriteFrame(aBpFrame);
       
   214 		}
       
   215 	else
       
   216 		{
       
   217 		// add frame to the list of frames that need to be sent to the BP
       
   218 		_LOG_L2C1("Already writing a frame - add to queue");
       
   219 		AddToWaitingToSendList(aBpFrame, aHighPriority);
       
   220 		}
       
   221 
       
   222 	_LOG_L4C2("<<CCommFrameWriterAo::Write [ret=%d]",ret);
       
   223 	return ret;
       
   224 	}
       
   225 
       
   226 TInt CCommFrameWriterAo::WriteFrame(CCsyMsgBufBpFrame* aBpFrame)
       
   227 /**
       
   228  * This method is called to transmit a frame to the baseband.
       
   229  *
       
   230  * @param aBpFrame - Pointer to frame
       
   231  */
       
   232     {
       
   233 	_LOG_L4C2(">>CCommFrameWriterAo::WriteFrame [aBpFrame=0x%x]",
       
   234 		aBpFrame);
       
   235 
       
   236 	TInt ret = KErrNone;
       
   237 
       
   238 	iDlcNum = aBpFrame->MsgDlc();
       
   239 	iCompleteWhenSent = aBpFrame->CompleteWhenSent();
       
   240 
       
   241 	if (iBuf == NULL)
       
   242 		{
       
   243 		_LOG_L1C1("** Failure to alloc iBuf **");
       
   244 
       
   245 		ret = KErrNoMemory;
       
   246 		_LOG_L4C2("<<CCommFrameWriterAo::WriteFrame [ret=%d]",ret);
       
   247 		return ret;
       
   248 		}
       
   249 
       
   250 //*********************************************************
       
   251 // MAF tidy up
       
   252 #ifdef _DEBUG
       
   253 	//log out frame
       
   254 	TInt len = aBpFrame->iMsg.Length();
       
   255 	_LOG_L3C3("[0x%02x] Tx Got Start dlc=%d", aBpFrame->iMsg[0], aBpFrame->MsgDlc());
       
   256 	for(TInt k = 1; k < len-1; k++)
       
   257 		{
       
   258 		_LOG_L3C2("[0x%02x]",aBpFrame->iMsg[k]);
       
   259 		}
       
   260 	_LOG_L3C2("[0x%02x] Tx Frame End", aBpFrame->iMsg[len-1]);
       
   261 	if (iMux0710Protocol->IsMuxModeEnabled())
       
   262 		{
       
   263 		if ((aBpFrame->iMsg[2] & 0xEF) == KCsy0710CTLUIH)
       
   264 			{
       
   265 #ifdef __DEBUGLOGFILE__
       
   266 			TBuf8<200> tt;
       
   267 #else
       
   268 			TBuf16<200> tt;
       
   269 #endif
       
   270 			tt.Copy(aBpFrame->iMsg);
       
   271 
       
   272 			TInt ttLength = tt.Length();
       
   273 			tt.SetLength(ttLength);
       
   274 #ifdef __LOGDEBUGLEVELMINOR__
       
   275 			_LOG_L3C3("Sent >>>> %d: %S", aBpFrame->iMsg[1] >> 2, &tt);
       
   276 #endif
       
   277 			}
       
   278 		}
       
   279 #endif
       
   280 //*********************************************************
       
   281 
       
   282 	// copy message to local buffer
       
   283 #ifdef _27010ADVANCEOPTION
       
   284 
       
   285 	if (iMux0710Protocol->IsMuxModeEnabled())
       
   286 		{
       
   287 		TInt length = aBpFrame->iMsg.Length() - 1;
       
   288 		TUint8 mask = 1<<5;
       
   289 
       
   290 		iBuf->Zero();
       
   291 
       
   292 		 // start flag
       
   293 		iBuf->Append(aBpFrame->iMsg[0]);
       
   294 
       
   295 		// check data for flag or escape character
       
   296 		for (TInt i=1; i < length; i++)
       
   297 			{
       
   298 			TUint8 tmp = aBpFrame->iMsg[i];
       
   299 			if ((tmp == KCsy0710StartEndFlag)||(tmp== KCsy0710EscapeByte))
       
   300 				{
       
   301 				_LOG_L3C1("Adding escape byte");
       
   302 				iBuf->Append(KCsy0710EscapeByte);
       
   303 				tmp = (TUint8) (tmp^mask);
       
   304 				}
       
   305 			iBuf->Append(tmp);
       
   306 			}
       
   307 
       
   308 		//ending flag
       
   309 		iBuf->Append(aBpFrame->iMsg[length]);  
       
   310 		}
       
   311 	else
       
   312 		iBuf->Copy(aBpFrame->iMsg);
       
   313 
       
   314 #else
       
   315 
       
   316 	// Basic option - no escape chars
       
   317 	iBuf->Copy(aBpFrame->iMsg);
       
   318 
       
   319 #endif
       
   320 
       
   321 	// free the caller's frame buffer
       
   322 	iMux0710Protocol->AddFrameFreeQ(aBpFrame);
       
   323 
       
   324 	// invoke LDD
       
   325 	_LOG_L3C1("Sending to LDD");
       
   326 	iStatus = KRequestPending; //MAF why is this being set to KRequestPending?
       
   327  	SetActive();
       
   328 	iCommPort->Write(iStatus, *iBuf, iBuf->Length());
       
   329 
       
   330 	_LOG_L4C2("<<CCommFrameWriterAo::WriteFrame [ret=%d]",ret);
       
   331 	return ret;
       
   332 	}
       
   333 
       
   334 void CCommFrameWriterAo::WriteCancel()
       
   335 /**
       
   336  * Cancel the current write operation.
       
   337  * @return void
       
   338  */
       
   339     {
       
   340     _LOG_L4C1("CCommFrameWriterAo::WriteCancel");
       
   341 	Cancel();
       
   342     }
       
   343 
       
   344 void CCommFrameWriterAo::AddToWaitingToSendList(CCsyMsgBufBpFrame* aBpFrame, TBool aHighPriority)
       
   345 /**
       
   346  * This method is called to by C32 Interface objects to add
       
   347  * the specified frame to the baseband queue.
       
   348  *
       
   349  * @param aBpFrame - Pointer to the frame buffer
       
   350  * @param aHighPriority - Flag to indicate a high priority frame
       
   351  */
       
   352 	{
       
   353 	_LOG_L4C3(">>CCommFrameWriterAo::AddToWaitingToSendList [aBpFrame=0x%x,aHighPriority=%d]",
       
   354 		aBpFrame, aHighPriority);
       
   355 
       
   356 	if (aHighPriority)
       
   357 		iWriteFrameBufList.AddFirst(*aBpFrame);
       
   358 	else
       
   359 		iWriteFrameBufList.AddLast(*aBpFrame);
       
   360 
       
   361 	_LOG_L4C1("<<CCommFrameWriterAo::AddToWaitingToSendList");
       
   362 	}
       
   363 
       
   364 CCsyMsgBufBpFrame* CCommFrameWriterAo::GetFrameToWrite()
       
   365 /**
       
   366  * This method checks the queue for a frame that needs to be sent
       
   367  * to the baseband.  If there is a message then deque it from the queue and
       
   368  * return a pointer to it, else return NULL.
       
   369  *
       
   370  * @return Pointer to the frame to be written or NULL
       
   371  */
       
   372 	{
       
   373 	_LOG_L4C1(">>CCommFrameWriterAo::GetFrameToWrite");
       
   374 
       
   375 	CCsyMsgBufBpFrame* frame = NULL;
       
   376 	if (!iWriteFrameBufList.IsEmpty())
       
   377 		{
       
   378 		frame = iWriteFrameBufList.First();
       
   379 		if (frame)
       
   380 			iWriteFrameBufList.Remove(*frame);
       
   381 		}
       
   382 
       
   383 	_LOG_L4C2("<<CCommFrameWriterAo::GetFrameToWrite [frame=0x%x]",frame);
       
   384 	return frame;
       
   385 	}
       
   386 
       
   387 void CCommFrameWriterAo::RemoveAnyDlcFramesOnWriteList(TUint8 aDlcNum, TBool aPlaceOnWaitList)
       
   388 /**
       
   389  * This method transfers any frames on the write list from the dlc specified
       
   390  * to the waiting list.
       
   391  *
       
   392  * @param aDlcNum is the dlc number of the frames to move to the waiting list
       
   393  * @param aPlaceOnWaitList indicates whether to free the frame or place onto the
       
   394  *        wait list.
       
   395  */
       
   396 	{
       
   397 	_LOG_L4C3(">>CCommFrameWriterAo::RemoveAnyDlcFramesOnWriteList [aDlcNum=%d, aPlaceOnWaitList=%d]",
       
   398 		aDlcNum,aPlaceOnWaitList);
       
   399 
       
   400 	if (iWriteFrameBufList.IsEmpty())
       
   401 		{
       
   402 		// No frames to transfer
       
   403 		_LOG_L4C1("No frames on write list");
       
   404 		}
       
   405 	else
       
   406 		{
       
   407 		CCsyMsgBufBpFrame* frame = NULL;
       
   408 		iWriteFrameBufIter.SetToFirst();
       
   409 		while ((frame = iWriteFrameBufIter++) != NULL)
       
   410 			{
       
   411 			if (frame->GetDlcNum() == aDlcNum)
       
   412 				{
       
   413 				iWriteFrameBufList.Remove(*frame);
       
   414 				if (aPlaceOnWaitList)
       
   415 					{
       
   416 					_LOG_L4C1("Transferring frame to wait list");
       
   417 					iWaitingForFcOffList.AddLast(*frame);
       
   418 					}
       
   419 				else
       
   420 					{
       
   421 					// Adding frame to the free list
       
   422 					iMux0710Protocol->AddFrameFreeQ(frame);
       
   423 					}
       
   424 				}
       
   425 			}
       
   426 		}
       
   427 
       
   428 	_LOG_L4C1("<<CCommFrameWriterAo::RemoveAnyDlcFramesOnWriteList");
       
   429 	}
       
   430 
       
   431 void CCommFrameWriterAo::RemoveAnyDlcFramesFromWaitList(TUint8 aDlcNum, TBool aPlaceOnWriteList)
       
   432 /**
       
   433  * This method transfers any frames on the waiting list from the dlc specified
       
   434  * to the write list.
       
   435  *
       
   436  * @param aDlcNum is the dlc number of the frames to move to the write list
       
   437  */
       
   438 	{
       
   439 	_LOG_L4C3(">>CCommFrameWriterAo::RemoveAnyDlcFramesFromWaitList [aDlcNum=%d,aPlaceOnWriteList=%d]",
       
   440 		aDlcNum,aPlaceOnWriteList);
       
   441 
       
   442 	if (iWaitingForFcOffList.IsEmpty())
       
   443 		{
       
   444 		// No frames to transfer
       
   445 		_LOG_L4C1("No frames on waiting list");
       
   446 		}
       
   447 	else
       
   448 		{
       
   449 		TBool writeQueueWasEmpty = iWriteFrameBufList.IsEmpty();
       
   450 
       
   451 		CCsyMsgBufBpFrame* frame = NULL;
       
   452 		iWaitingForFcOffIter.SetToFirst();
       
   453 		while ((frame = iWaitingForFcOffIter++) != NULL)
       
   454 			{
       
   455 			if (frame->GetDlcNum() == aDlcNum)
       
   456 				{
       
   457 				iWaitingForFcOffList.Remove(*frame);
       
   458 				if (aPlaceOnWriteList)
       
   459 					{
       
   460 					_LOG_L4C1("Transferring frame to write list");
       
   461 					iWriteFrameBufList.AddLast(*frame);
       
   462 					}
       
   463 				else
       
   464 					{
       
   465 					// Adding frame to the free list
       
   466 					iMux0710Protocol->AddFrameFreeQ(frame);
       
   467 					}
       
   468 				}
       
   469 			}
       
   470 
       
   471 		if ((!iWriteFrameBufList.IsEmpty())&&(writeQueueWasEmpty)&&(!IsActive()))
       
   472 			{
       
   473 			_LOG_L4C1("Write queue was empty and not active - triggering write");
       
   474 			frame = GetFrameToWrite();
       
   475 			TInt ret = WriteFrame(frame);
       
   476 			if (ret)
       
   477 				{
       
   478 				_LOG_L1C2("Write delayed frame failed [ret=%d]",ret);
       
   479 
       
   480 				// Place the failed frame back on the list.
       
   481 				iWriteFrameBufList.AddFirst(*frame);
       
   482 				}
       
   483 			}
       
   484 		}
       
   485 
       
   486 	_LOG_L4C1("<<CCommFrameWriterAo::RemoveAnyDlcFramesFromWaitList");
       
   487 	}
       
   488 
       
   489 void CCommFrameWriterAo::CompleteWrite(const TUint8 aDlcNum, TInt aStatus)
       
   490 /**
       
   491  * This method calls the DLC port interface to complete the write request.
       
   492  *
       
   493  * @param aDlcNum - DLC number of the port
       
   494  */
       
   495 	{
       
   496 	_LOG_L4C3(">>CCommFrameWriterAo::CompleteWrite [aDlcNum=%d,aStatus=%d]",
       
   497 		aDlcNum,aStatus);
       
   498 
       
   499 	if (aDlcNum)
       
   500 		{
       
   501 		CPortC32InterfaceBase* port = iParent->FindPortC32Interface(aDlcNum);
       
   502 		if (port)
       
   503 			port->CompleteWriteRequest(aStatus);
       
   504 		else
       
   505 			{
       
   506 			_LOG_L1C2("** Port does not exist for aDlcNum=%d **",
       
   507 				aDlcNum);
       
   508 			// MAF __ASSERT_DEBUG(EFalse,PANIC(KPanicIllegalState));
       
   509 			}
       
   510 		}
       
   511 	else
       
   512 		{
       
   513 		// MAF tell mux control channel of send result
       
   514 		}
       
   515 
       
   516 	_LOG_L4C1("<<CCommFrameWriterAo::CompleteWrite");
       
   517 	}
       
   518