⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfprach.cpp

📁 3G中FP协议的DCH和RACH解码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "CfpFp.h"//#include "CFpRach.h"

CFpRach::CFpRach()
{
	pMsgHead=NULL;
}

CFpRach::~CFpRach()		// 雒江涛 2006-3-28	
{
	
	CFp *p;			
	CFpRlc *pr;	
	
	int fp_num = CFPPduArray.GetCount();	
	int rlc_num = RLCPduArray.GetCount();
	
	for(int i = 0;i<fp_num;i++)
	{
		p=CFPPduArray.GetHead();
		CFPPduArray.RemoveHead(); 
		delete p;
	}
	
	for(int j=0;j<rlc_num;j++)
	{
		pr=RLCPduArray.GetHead();
		RLCPduArray.RemoveHead();
		delete pr;
	}

}

WORD CFpRach::Initial(FPPARA_ARRAY  &FpConfigInf)
{
	int Num=FpConfigInf.GetSize();
	if(Num>0)
	{
	
	ConfigInf=FpConfigInf[0];//这里主控仍然传入一个FPPARA_ARRAY类型的配置信息数组。但是在没有协同的情况下,该数组只有一个元素。

    
	int k;
	k=ConfigInf.m_MapLChSet.GetSize();
	for(int i=0;i<k;i++)

	{   
		CFpRlc *p = new CFpRlc;
		p->SetDir(ConfigInf.nDirection);
		p->SetTrCh(ConfigInf.eTrChType);
		RLCPduArray.AddToRear(p);
	}
	mac.Initialize(ConfigInf.m_MapLChSet);
	mac.SetTrCh(ConfigInf.eTrChType);
	mac.SetDir(ConfigInf.nDirection);
	}
	cfp.SetDir(ConfigInf.nDirection);
	return 0;
}

WORD CFpRach::Decode(CString &res)
{
    pMsgHead = GetHeadPointer();
    PduLength=GetBitLength();
    FTbyte  *pFTbyteSruct;
	pFTbyteSruct=(FTbyte *)pMsgHead;
	if ((*pFTbyteSruct).FT==1)//控制桢
	{//1
		CCHControlFrameDecode(pMsgHead,PduLength,res);
		return 0;
	}//1
	else//传输桢
	{//2    
		    WORD DecodeState;
            DecodeState=CCHRACHDecode(pMsgHead,PduLength,res);
			if(DecodeState==0)
			{
			
			WORD TBNumber;//一个传输信道内的TB块数量
			TBNumber=CHTBStruct.TBSByteLength/CHTBStruct.TBByteLenth;
			DWORD nBitLength;
			nBitLength=CHTBStruct.TBbitLength;
			BYTE *pPduData;
			pPduData=(BYTE *)CHTBStruct.pFirstTB;
			for(int i=0;i<RLCPduArray.GetCount();i++)
			{//2.1.1
				RLCPduArray.GetAt(i)-> SetTBSeg(TBNumber);
			}//2.1.1
			int j=1;
			for(;TBNumber>=1;)
			{//2.1.2
				mac.Create(nBitLength, pPduData);
				BYTE CHid;
				WORD MacDecodeState;
CString str;//
                str.Format(_T("⑴Transport Block"));//
	            res+=str;//增加新的格式  2006年4月12日
				MacDecodeState=mac .Decode(res, CHid);
				if (MacDecodeState!=0)//3月16日程序完备性
				{
				return 1;
				}
				mac .GetSdu(*RLCPduArray.GetAt(CHid));
				WORD RLCDecodeState;
				RLCDecodeState=RLCPduArray.GetAt(CHid)->Decode(res);
                if (RLCDecodeState!=0)//3月16日程序完备性
				{
				return 1;
				}
				WORD rrcpduState=2;//rrcpduState先定义值为2,目的是进入下边for循环内。
				
				for(;(rrcpduState!=1)&&(rrcpduState!=0);)
				{//2.1.2.1
             
					rrcpduState=RLCPduArray.GetAt(CHid)->GetSdu(cfp);
					if (rrcpduState!=1) 
					{//2.1.2.1.1
						CFp *pCFP=new CFp;
						*pCFP=cfp;
						CFPPduArray.AddToRear(pCFP);			  
					}//2.1.2.1.1
				}//2.1.2.1
//				str.Format(_T("⑴Padding"));//
//				res+=Pad;
				res+=PadStr[j];
				j++;
//				
				TBNumber--;
				pPduData= pPduData+ CHTBStruct.TBByteLenth;//指针移到下一个TB块开始位置。		  
			   
			}//2.1.2
res+=TrailStr;//4.13新的输出格式
TrailStr.Empty();
			return 0;
			}
			else
			{
				return 1;
			}
	}//2
	return 0;
}
DWORD CFpRach::CiteMacGetUEID()
{
	DWORD UEID;
	UEID=mac.GetUEID();
	return UEID;
}
DWORD CFpRach::CiteMacGetUEIDType()
{
    DWORD UEIDType;
	UEIDType=mac.GetUEIDType();
	return UEIDType;
}

WORD CFpRach::GetSdu(CFp &sdu)
{
	int n;
	n=CFPPduArray.GetCount();
    if(n>0)
	{
		CFp *k;
		k = CFPPduArray.GetHead();
		sdu =  *k;
//		k->Destroy();
		delete k;
		CFPPduArray.RemoveHead();
			
		if (n==1) 
		{
			return 0;
		}
		else
		{
			return 2;
		}
	}
	else
	{
		return 1;
	}
}
/*{
	int n;
	n=CFPPduArray.GetCount();
	CFp *k = CFPPduArray.GetHead();
	sdu = *k;
	CFPPduArray.RemoveHead();
    delete k;		
	if (n==1) 
	{
		return 0;
	}
	else
	{
		return 2;
	}
}*/

WORD CFpRach::CCHRACHDecode(BYTE *pMsg, WORD Length, CString &res)
{
	CString str;
	BYTE *temp=pMsg;
	for(int i=0;i<50;i++)
	{
		PadStr[i].Empty();
	}

	WORD PDULength;//3月15日晚间修改
	PDULength=GetBitLength();//3月15日晚间修改
	int PDUByteLength;
    PDUByteLength=PDULength/8;
//  PDUByteLength=PDUByteLength-4-(ConfigInf.wCrcBitSize/8);//如果PDULength在减去FP帧的帧头和帧尾以后小于0,那么不解码,返回解码错误信息。
	PDUByteLength=PDUByteLength-4;
	if(PDUByteLength>0)
    {//1 3月15日,修改增加程序健壮性。
	

	str.Format(_T("#FP RACH: Data"));// Modify on 4/12 by QiYing
	res+=str;
		
		
	str.Format(_T("⑴Header"));
	res+=str;

	str.Format(_T("@FT(Frame Type)|%X|数据帧"),*temp&0x01);
	res+=str;

	str.Format(_T("@Header CRC|%X|帧头CRC"),(*temp&0xfe)>>1);
	res+=str;
	
	temp++;
	
	str.Format(_T("@CFN(Connection Frame Number)|%X|连接帧号"),*temp);
	res+=str;
	temp++;
	
	BYTE value=*temp&0x1f;
	str.Format(_T("@TFI(Transport Format Indicator)|%X|传输格式指示"),value);
	res+=str;
	
	temp++;
	
	str.Format(_T("@Received SYNC UL Timing Deviation|%X|收到的SYNC UL时间偏移"),*temp);
	res+=str;
	temp++;

	WORD j;//TBbitLength  3月15日,修改增加程序健壮性。
	WORD k;//TBByteLenth  3月15日,修改增加程序健壮性。
    WORD m;//TBSByteLength 3月15日,修改增加程序健壮性。
	
	if(ConfigInf.m_Tfs[value].wNumOfTb!=0)
	{
	
	j=ConfigInf.m_Tfs[value].wTbsSize/ConfigInf.m_Tfs[value].wNumOfTb;//3月15日,修改增加程序健壮性。
	if(j%8)//3月15日,修改增加程序健壮性。
		k=j/8+1;//3月15日,修改增加程序健壮性。
	else//3月15日,修改增加程序健壮性。
		k=j/8;//3月15日,修改增加程序健壮性。
	
	m=ConfigInf.m_Tfs[value].wNumOfTb*k;// 3月15日,修改增加程序健壮性。
    }
	else
	{
		str.Format(_T("@TB块个数为0!"));
		res+=str;
		m=0;
	}
	PDUByteLength=PDUByteLength-m;// 3月15日,修改增加程序健壮性。
	if(PDUByteLength>=0)//判断数据中实际的TB长度减去TFI指示的传输格式长度是否大于或等于0(因为考虑到CRCI的存在所以条件为大于等于0),符合的话进行TB块解码,否则报错返回。
    {//4 3月15日,修改增加程序健壮性。
	
	TBSstruct *tempstruct;
	tempstruct=new TBSstruct;
	tempstruct->pFirstTB=temp;
	tempstruct->TFIvalue=value;	
	tempstruct->TBbitLength=ConfigInf.m_Tfs[tempstruct->TFIvalue].wTbsSize/ConfigInf.m_Tfs[tempstruct->TFIvalue].wNumOfTb;
	if(tempstruct->TBbitLength%8)
	{
		int c;
		tempstruct->TBByteLenth=tempstruct->TBbitLength/8+1;
		tempstruct->TBSByteLength=tempstruct->TBByteLenth*ConfigInf.m_Tfs[tempstruct->TFIvalue].wNumOfTb;
		for(int n=1;n<=ConfigInf.m_Tfs[tempstruct->TFIvalue].wNumOfTb;n++)
		{
			c=tempstruct->TBbitLength%8;
			temp+=tempstruct->TBByteLenth-1;//pointing to the last byte of the current TB
			int b[50];
			b[n]=*temp&(255>>c);
			temp++;
//			PadStr[n].Format(_T("@Padding|%X|填充"),b[n]);
			str.Format(_T("⑴Padding"));
			PadStr[n]+=str;
			str.Format(_T("@Padding|%X|填充"),b[n]);
			PadStr[n]+=str;
		}
		
	}
	else
	{
		tempstruct->TBByteLenth=tempstruct->TBbitLength/8;
		tempstruct->TBSByteLength=tempstruct->TBByteLenth*ConfigInf.m_Tfs[tempstruct->TFIvalue].wNumOfTb;
		temp+=tempstruct->TBSByteLength;
	}
	
	CHTBStruct=*tempstruct;

	if(PDUByteLength>0)//?????????????
	{
		str.Format(_T("⑴Trailer"));
		TrailStr+=str;
		int n=ConfigInf.m_Tfs[tempstruct->TFIvalue].wNumOfTb;
		if(n==0)
		{
			str.Format(_T("@not exist"));
			res+=str;
		}
		else
		{
			for(int i=1;i<=n;i++)
			{
				if(i<=8)
				{
					BYTE m=8-i;
					BYTE k=128>>(i-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,((*temp)&k)>>m);
					TrailStr+=str;
					if(((*temp)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=16)
				{
					BYTE m=16-i;
					BYTE k=128>>(i-8-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+1)&k)>>m);
					TrailStr+=str;
					if((*(temp+1)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=24)
				{
					BYTE m=24-i;
					BYTE k=128>>(i-16-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+2)&k)>>m);
					TrailStr+=str;
					if((*(temp+2)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=32)
				{
					BYTE m=32-i;
					BYTE k=128>>(i-24-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+3)&k)>>m);
					TrailStr+=str;
					if((*(temp+3)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=40)
				{
					BYTE m=40-i;
					BYTE k=128>>(i-32-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+4)&k)>>m);
					TrailStr+=str;
					if((*(temp+4)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=48)
				{
					BYTE m=48-i;
					BYTE k=128>>(i-40-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+5)&k)>>m);
					TrailStr+=str;
					if((*(temp+5)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=56)
				{
					BYTE m=56-i;
					BYTE k=128>>(i-48-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+6)&k)>>m);
					TrailStr+=str;
					if((*(temp+6)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else if(i<=64)
				{
					BYTE m=64-i;
					BYTE k=128>>(i-56-1);		
					str.Format(_T("@TB %d CRCI|%X|"),i,(*(temp+7)&k)>>m);
					TrailStr+=str;
					if((*(temp+7)&k)>>m)
						str.Format(_T("错误"));
					else
						str.Format(_T("正确"));
					TrailStr+=str;
				}
				else
				{
					str.Format(_T("@not exist"));
					TrailStr+=str;
				}
			}
		}
		
		if(n%8)
		{
			temp+=n/8;
			int d;
			d=(*temp)&(255>>(n%8));
			str.Format(_T("@Padding|%X|填充"),d);
			TrailStr+=str;
			temp++;
			PDUByteLength-=n/8+1;
		}
		else
		{
			temp+=n/8;	
			PDUByteLength-=n/8;
		}
		
		if(PDUByteLength>0)
		{
			str.Format(_T("@Payload CRC|%s|净荷CRC"),ConvertToHexStr(temp,2,TRUE));
			TrailStr+=str;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -