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

📄 datadeformatter.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 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 + -