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

📄 dataformatter.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 CPP
字号:
//---------------------------------------------------------------------------


#pragma hdrstop

#include "DataFormatter.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//---------------------------------------------------------------------------

void __fastcall DataFormatter::LoadNextBufferPacket(unsigned char * cp, int size,int type_of_packet)
{
        gSettings.TXNumOfPkts++;
        switch(type_of_packet)
        {
                case ptUdp:
                        gSettings.TXNumOfUDPPkts++;
                break;
                case ptUnReal:
                        gSettings.TXNumOfUnrealPkts++;
                break;
                case ptRs232:
                        gSettings.TXNumOfRS232Pkts++;
                break;
                case ptWeb:
                        gSettings.TXNumOfWebPkts++;
                break;
        };
int checksum=0;
dataformattercriticalsection->Acquire();
        if(GetCountOfFreeSpaceInCharBuf()<size){gSettings.TXNumOfBadPkts++;GotAnOverFlowEvent=true;return;}
        for(register int i=0;i<size;i++)
        {
                buff[buffptrnextfreepos]=(int)cp[i];
                checksum+=buff[buffptrnextfreepos];
                buffptrnextfreepos++;buffptrnextfreepos%=buffsize;
                buffnumberofcharsinque++;
        }
        buff[buffptrnextfreepos]=((checksum&31)<<3)|type_of_packet; //send type of packet with checksum
        buffptrnextfreepos++;buffptrnextfreepos%=buffsize;
        buffnumberofcharsinque++;
        buff[buffptrnextfreepos]=-1; //send end of packet symbol
        buffptrnextfreepos++;buffptrnextfreepos%=buffsize;
        buffnumberofcharsinque++;
dataformattercriticalsection->Release();
}

DataFormatter::DataFormatter()
{

        pfastCrc=new FastCrc(0x04c11db7);

        buff.resize(TX_CHAR_BUFF_SIZE);
        buffsize=TX_CHAR_BUFF_SIZE;
        for(int i=0;i<buffsize;i++)buff[i]=0;

        dataformattercriticalsection=new TCriticalSection;
        bs.GetNextChar=&GetNextChar;   //set callback

        gSettings.ModMajorAddCallBackNotificationFuction(SettingsHaveChanged);
        SettingsHaveChanged(CH_ANYTHING);


}

DataFormatter::~DataFormatter()
{
        gSettings.ModMajorRemoveCallBackNotificationFunction(SettingsHaveChanged);
        if(dataformattercriticalsection)delete dataformattercriticalsection;
        delete pfastCrc;
}

int __fastcall DataFormatter::GetNextChar()
{
        //for web sending idling
        //if((gSettings.ModMajor.Active)&&(gSettings.ModMinor.Webserveron)&&(!gSettings.ModMinor.WEBSenderTimerEnabled)&&(gSettings.ModMinor.CM_SENDNEXTWEBPACKET_is_handled)&&(buffnumberofcharsinque<(gSettings.ModMinor.IdleThreshold)))
        if((gSettings.ModMajor.Active)&&(gSettings.ModMinor.Webserveron)&&(gSettings.ModMinor.CM_SENDNEXTWEBPACKET_is_handled)&&(buffnumberofcharsinque<(gSettings.ModMinor.IdleThreshold)))
        {
                gSettings.ModMinor.CM_SENDNEXTWEBPACKET_is_handled=false;
                PostMessage(gSettings.Handle,CM_SENDNEXTWEBPACKET, 0,0);
        }
        //

        int ichar=-1;



        if(buffnumberofcharsinque>0)
        {
                ichar=buff[buffptrnextpostosend];
                buffnumberofcharsinque--;
                buffptrnextpostosend++;buffptrnextpostosend%=buffsize;
        }


        return ichar;

}




int __fastcall DataFormatter::GetCountOfFreeSpaceInCharBuf()
{
        int n=buffsize-buffnumberofcharsinque-2;
        return n;
}

//---------------------------------------------------------------------------


int __fastcall DataFormatter::GetNextSymbol(void)
{
        int i;

        if(bc.DataAvailable)
        {
                bc.GetNextSymbol();
                i=bc.Result;
                i=tcm.Encode(i);
                return i;
        }

        while(rs.NeedCharToEncode)rs.LoadCharToEncode(bs.Update());
        if(rs.GotEncodedChar)
        {
                if(Cnt<0)
                {
                        if(Cnt==-10)
                        {
                                Scram.Reset();
                                FrameBuf[0]=163;
                                FrameBuf[1]=(gSettings.ModMajor.RSErrorPercent&63);
                                FrameBuf[2]=(gSettings.ModMajor.FramePriod>>4)&255;
                                FrameBuf[3]=((gSettings.ModMajor.FramePriod<<4)&240)|((gSettings.ModMajor.InterleavingLength>>6)&15);
                                FrameBuf[4]=((gSettings.ModMajor.InterleavingLength<<2)&252)|((Aleaver.delaylineptr>>8)&3);
                                FrameBuf[5]=(Aleaver.delaylineptr&255);
                                long unsigned CalcCRC32=pfastCrc->CalcCRC32(FrameBuf,6);
                                FrameBuf[9]=CalcCRC32;
                                FrameBuf[8]=(CalcCRC32>>8);
                                FrameBuf[7]=(CalcCRC32>>16);
                                FrameBuf[6]=(CalcCRC32>>24);
                        }
                        i=(int)FrameBuf[-1-Cnt];

                }
                 else
                 {
                        i=rs.GetEncodedChar();
                        i=Aleaver.InterleaveUpdate(i);
                        i=Scram.Update(i);
                 }

                bc.LoadSymbol(i);
                bc.GetNextSymbol();
                i=bc.Result;
                i=tcm.Encode(i);

                Cnt++;
                if(Cnt==CntSize)
                {
                        InterleaverRSSyncFrameCounter++;
                        if(InterleaverRSSyncFrameCounter==InterleaverRSSyncFrameCounterSize)
                        {
                                InterleaverRSSyncFrameCounter=0;
                                Cnt=-10;
                        }
                         else Cnt=0;
                }

        }
         else return 0;
        return i;
}

void __fastcall DataFormatter::SetParams(int InterLeaverLen, int RSBlockLen, int RSParityLen, int RSBlocksPerRSLeaverSync)
{
        Aleaver.Init(InterLeaverLen,1);
        Aleaver.ResetInterleaverPtr();
        //oh yeah, this was pesky. here we predict the future
        Cnt=RSBlockLen;
        while(Cnt<(InterLeaverLen*(InterLeaverLen-1)))Cnt+=RSBlockLen;
        Cnt-=(InterLeaverLen*(InterLeaverLen-1));
        //
        CntSize=RSBlockLen;
        rs.SetNumberOfParityBytes(RSParityLen);
        rs.SetEnCodedTotalBlockSize(RSBlockLen);
        InterleaverRSSyncFrameCounter=0;
        InterleaverRSSyncFrameCounterSize=RSBlocksPerRSLeaverSync;
}

void __fastcall DataFormatter::SettingsHaveChanged(NotificationEventType WhatHasChanged)
{

        //SetParams(int InterLeaverLen, int RSBlockLen, int RSParityLen, int RSBlocksPerRSLeaverSync)
        //SetParams(120,255,64,400);
        int i=((gSettings.ModMajor.RSErrorPercent)*255)/100;
        if(i<2)i=2;if(i>=255)i=254;if((2*(i/2))!=i)i++;
        SetParams(gSettings.ModMajor.InterleavingLength,255,i,gSettings.ModMajor.FramePriod);

        bc.InNumberOfBits=8;
        if(gSettings.ModMajor.ConstalationSize==16)bc.OutNumberOfBits=3;
         else bc.OutNumberOfBits=5;



        GotAnOverFlowEvent=false;

        for(int i=0;i<buffsize;i++)buff[i]=0;
        buffptrnextfreepos=0;
        buffptrnextpostosend=0;
        buffnumberofcharsinque=0;


}


⌨️ 快捷键说明

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