📄 dataformatter.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 + -