📄 cfprach.cpp
字号:
#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 + -