📄 datadeformatter.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "DataDeFormatter.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
int __fastcall DataDeFormatter::Update(PtComplex *r)
{
int Result;
int Value=tcm.Decode(*r);
if(gSettings.DemodMinor.Acquisitionstage==WaitingForCarrier) GotFrame=false;
if((!GotFrame)&&(gSettings.DemodMinor.Acquisitionstage==WaitingForFrame))
{
int j=Value;
for(int i=0;i<bc.InNumberOfBits;i++)
{
CRC32=(CRC32>>1)&(2147483647ui32);
CRC32|=(((unsigned __int32)LeaverPos)<<31)&(2147483648ui32);
LeaverPos=(LeaverPos>>1)&511;
LeaverPos|=(LeaverLen<<9)&512;
LeaverLen=(LeaverLen>>1)&511;
LeaverLen|=(FramePeriod<<9)&512;
FramePeriod=(FramePeriod>>1)&2047;
FramePeriod|=(RSPercent<<11)&2048;
RSPercent=(RSPercent>>1)&31;
RSPercent|=(FramePat<<5)&32;
FramePat=(FramePat>>1)&511;
FramePat|=(j<<9)&512;
j=j>>1;
bc.Reset();
bc.BuffPosPtr=bc.InNumberOfBits-i-1;
if((FramePat==652)&&(LeaverPos<=LeaverLen)&&(RSPercent<=50))
{
FrameBuf[0]=163;
FrameBuf[1]=(RSPercent&63);
FrameBuf[2]=(FramePeriod>>4)&255;
FrameBuf[3]=((FramePeriod<<4)&240)|((LeaverLen>>6)&15);
FrameBuf[4]=((LeaverLen<<2)&252)|((LeaverPos>>8)&3);
FrameBuf[5]=(LeaverPos&255);
unsigned long CalcCRC32=pfastCrc->CalcCRC32(FrameBuf,6);
if(CalcCRC32==CRC32)
{
//gSettings.DemodMinor.Status=(AnsiString)"RS="+RSPercent+" FramePeriod="+FramePeriod+" LeaverLen="+LeaverLen;
//gSettings.DemodMinor.StatusChanged=true;
gSettings.DemodMajor.RSErrorPercent=RSPercent;
gSettings.DemodMajor.FramePriod=FramePeriod;
gSettings.DemodMajor.InterleavingLength=LeaverLen;
int RSParityLen=((gSettings.DemodMajor.RSErrorPercent)*255)/100;
if(RSParityLen<2)RSParityLen=2;if(RSParityLen>=255)RSParityLen=254;if((2*(RSParityLen/2))!=RSParityLen)RSParityLen++;
rs.SetNumberOfParityBytes(RSParityLen);
Aleaver.Init(gSettings.DemodMajor.InterleavingLength,1);
InterleaverRSSyncFrameCounterSize=gSettings.DemodMajor.FramePriod;
Scram.Reset();
rs.ResetDeCodedDataBuffer();
Aleaver.delaylineptr=Aleaver.InterleaverLength-1-LeaverPos;
InterleaverRSSyncFrameCounter=0;
Cnt=0;
GotFrame=true;
return -888;
}
}
}
return -98;
}
if(!bc.LoadSymbol(Value)) return -6;
bc.GetNextSymbol();
Value=bc.Result;
if(Cnt>=0)
{
Value=Scram.Update(Value);
Value=Aleaver.DeInterleaveUpdate(Value);
rs.LoadCharToDecode(Value);
if(rs.GotDecodedChar)Result=ds.Update(rs.GetDecodedChar());
else Result=-4;
}
else Result=-3;
Cnt++;
if(Cnt==CntSize)
{
InterleaverRSSyncFrameCounter++;
if(InterleaverRSSyncFrameCounter==InterleaverRSSyncFrameCounterSize)
{
InterleaverRSSyncFrameCounter=0;
Cnt=-10;
Scram.Reset();
}
else Cnt=0;
}
return Result;
}
__fastcall DataDeFormatter::DataDeFormatter()
{
pfastCrc=new FastCrc(0x04c11db7);
gSettings.DemodMajorAddCallBackNotificationFuction(SettingsHaveChanged);
SettingsHaveChanged(CH_ANYTHING);
}
void __fastcall DataDeFormatter::SetParams(int InterLeaverLen, int RSBlockLen, int RSParityLen, int RSBlocksPerRSLeaverSync)
{
FramePat=0;
RSPercent=0;
FramePeriod=0;
LeaverLen=0;
LeaverPos=0;
CRC32=0ui32;
GotFrame=false;
Aleaver.Init(InterLeaverLen,1);
Aleaver.ResetInterleaverPtr();
rs.SetNumberOfParityBytes(RSParityLen);
rs.SetEnCodedTotalBlockSize(RSBlockLen);
InterleaverRSSyncFrameCounter=0;
InterleaverRSSyncFrameCounterSize=RSBlocksPerRSLeaverSync;
Cnt=0;
CntSize=RSBlockLen;
}
void __fastcall DataDeFormatter::SettingsHaveChanged(NotificationEventType WhatHasChanged)
{
//SetParams(int InterLeaverLen, int RSBlockLen, int RSParityLen, int RSBlocksPerRSLeaverSync)
//SetParams(120,255,64,400);
int i=((gSettings.DemodMajor.RSErrorPercent)*255)/100;
if(i<2)i=2;if(i>=255)i=254;if((2*(i/2))!=i)i++;
SetParams(gSettings.DemodMajor.InterleavingLength,255,i,gSettings.DemodMajor.FramePriod);
bc.OutNumberOfBits=8;
if(gSettings.DemodMajor.ConstalationSize==16)bc.InNumberOfBits=3;
else bc.InNumberOfBits=5;
}
__fastcall DataDeFormatter::~DataDeFormatter()
{
gSettings.DemodMajorRemoveCallBackNotificationFunction(SettingsHaveChanged);
delete pfastCrc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -