📄 main.cpp
字号:
}
Timer1->Enabled=true;
if(SettingsForm->JvXPCheckboxModOn->Checked)SoundOutThread=new SoundOut(mod,Sound,SettingsForm->JvValidateEditSoundCardBufferSize->Value,tpHighest);
if(SettingsForm->JvXPCheckboxDeModOn->Checked)SoundInThread=new SoundIn(demod,Sound,SettingsForm->JvValidateEditSoundCardBufferSize->Value,tpHighest);
gSettings.DemodMajor.Active=SettingsForm->JvXPCheckboxDeModOn->Checked;
gSettings.ModMajor.Active=SettingsForm->JvXPCheckboxModOn->Checked;
}
catch (Exception &e )
{
ShowMessage((AnsiString)"Error starting modem\n"+e.Message);
CritDestroy->Release();
busy=false;
return false;
}
catch (...)
{
ShowMessage("Error starting modem");
CritDestroy->Release();
busy=false;
return false;
}
CritDestroy->Release();
busy=false;
return true;
}
void __fastcall TQAMForm::Timer1Timer(TObject *Sender)
{
if(!Showing)return;
ModLED->Status=gSettings.ModMajor.Active;
DeModLED->Status=gSettings.DemodMajor.Active;
if(gSettings.DemodMajor.Active)
{
if((PosibleFrequenciesForm->Showing)&&(demod->fs.NoteForMain))
{
PosibleFrequenciesForm->ValueListEditor1->Strings->Clear();
for(int i=0;i<(demod->fs.PosibleFrequencySettingsPtr);i++)PosibleFrequenciesForm->ValueListEditor1->InsertRow(" "+FloatToStrF(SimpleRoundTo(demod->fs.PosibleFrequencySettings[i].Freq,-1), ffFixed, 10, 1)+"Hz"," "+FloatToStrF(SimpleRoundTo(demod->fs.PosibleFrequencySettings[i].Freq/demod->fs.PosibleFrequencySettings[i].Gamma,-1), ffFixed, 10, 1)+"Hz",true);
for(int i=(demod->fs.PosibleFrequencySettingsPtr);i<10;i++)PosibleFrequenciesForm->ValueListEditor1->InsertRow(" ","",true);
demod->fs.NoteForMain=false;
//for(int i=0;i<(demod->fs.CopyOfPosibleFrequencySettingsSize);i++)Display((AnsiString)"freq["+i+"]="+demod->fs.CopyOfPosibleFrequencySettings[i].Freq+" Gamma["+i+"]="+demod->fs.CopyOfPosibleFrequencySettings[i].Gamma+"Power["+i+"]="+demod->fs.CopyOfPosibleFrequencySettings[i].SignalPower+"\r");
//Display((AnsiString)"working-> freq="+demod->fs.WorkingSettings.Freq+" gamma="+demod->fs.WorkingSettings.Gamma+" power="+demod->fs.WorkingSettings.SignalPower+"\r---------------\r");
}
if(gSettings.DemodMinor.StatusChanged)
{
StatusBar1->Panels->Items[0]->Text=gSettings.DemodMinor.Status;
gSettings.DemodMinor.StatusChanged=false;
}
if(ConstelationForm->Showing)
{
constalationgraph.AttachPlot(demod->pd);
constalationgraph.DisplayGraph(ConstelationForm->ConstalationImage);
}
LevelBar->Position=(int)((demod->fs.SigLevel/3.2));
if(demod->Cliping){LevelBar->Position=100;LevelBar->BarColorTo=clRed;LevelBar->BarColorFrom=0x008080ff;demod->Cliping=false;}
else {LevelBar->BarColorTo=0x00adefad;LevelBar->BarColorFrom=0x0031d329;}
double Freq=gSettings.DemodMajor.Freq;
if(gSettings.DemodMinor.DCD)
{
if(gSettings.DemodMajor.ConstalationSize==16)JvLabelRXConstelationType->Caption="QAM16";
else JvLabelRXConstelationType->Caption="QAM64";
Freq=(gSettings.DemodMajor.Gamma)*(gSettings.DemodMajor.Freq)/((gSettings.DemodMajor.Gamma)-(demod->AdjSpeed));
JvLabelRXSymbolRate->Caption=FloatToStrF(Freq/(gSettings.DemodMajor.Gamma), ffFixed, 10, 3);
JvLabelRXFreq->Caption=FloatToStrF(Freq, ffFixed, 10, 3);
}
else
{
JvLabelRXConstelationType->Caption="";
JvLabelRXSymbolRate->Caption="";
JvLabelRXFreq->Caption="";
}
if(demod->datadeformatter->GotFrame)
{
JvLabelRXLostCnt->Caption=(AnsiString)gSettings.NumOfBadPkts;
JvLabelRXTotCnt->Caption=(AnsiString)gSettings.NumOfPkts;
JvLabelRXWebCnt->Caption=(AnsiString)gSettings.NumOfWebPkts;
JvLabelRXUnrealCnt->Caption=(AnsiString)gSettings.NumOfUnrealPkts;
JvLabelRXUDPCnt->Caption=(AnsiString)gSettings.NumOfUDPPkts;
JvLabelRXRS232Cnt->Caption=(AnsiString)gSettings.NumOfRS232Pkts;
JvLabelRXFreamePeriod->Caption=(AnsiString)gSettings.DemodMajor.FramePriod;
JvLabelRXInterleavingLength->Caption=(AnsiString)gSettings.DemodMajor.InterleavingLength;
JvLabelRXRSFEC->Caption=(AnsiString)gSettings.DemodMajor.RSErrorPercent+"%";
double datarate=(Freq/(gSettings.DemodMajor.Gamma))*((100.0-((double)gSettings.DemodMajor.RSErrorPercent))/100000.0);
if(gSettings.DemodMajor.ConstalationSize==16)datarate*=3.0;
else datarate*=5.0;
JvLabelRXDataRate->Caption=FloatToStrF(datarate, ffFixed, 10, 1)+"kb/s";
}
else
{
JvLabelRXFreamePeriod->Caption="";
JvLabelRXInterleavingLength->Caption="";
JvLabelRXRSFEC->Caption="";
JvLabelRXDataRate->Caption="";
JvLabelRXLostCnt->Caption="0";
JvLabelRXTotCnt->Caption="0";
JvLabelRXWebCnt->Caption="0";
JvLabelRXUnrealCnt->Caption="0";
JvLabelRXUDPCnt->Caption="0";
JvLabelRXRS232Cnt->Caption="0";
}
FRMLED->Status=demod->datadeformatter->GotFrame;
LKLED->Status=gSettings.DemodMinor.Locked;
AMALED->Status=gSettings.DemodMinor.Ama;
CDLED->Status=gSettings.DemodMinor.DCD;
if((gSettings.DemodMinor.Locked)&&(demod->datadeformatter->tcm.tcmmse>0.0))JvLabelMSE->Caption=FloatToStrF(demod->datadeformatter->tcm.tcmmse,ffFixed,10,0);
else JvLabelMSE->Caption="";
if(QAMUnRealHeaderGotIt)UnRealHeaderLED->Status=true;
else
{
UnRealHeaderLED->Status=false;
if(!(SocketUnRealTCPServerListner->State&wsClosed))
{
SocketUnRealTCPServerListner->Close();
SocketUnRealTCPServerListner->WaitForClose();
}
}
if(FClients->Count>0)UnRealServerLED->Status=true;
else UnRealServerLED->Status=false;
}
if(gSettings.ModMajor.Active)
{
JvLabelTXLostCnt->Caption=(AnsiString)gSettings.TXNumOfBadPkts;
JvLabelTXTotCnt->Caption=(AnsiString)gSettings.TXNumOfPkts;
JvLabelTXWebCnt->Caption=(AnsiString)gSettings.TXNumOfWebPkts;
JvLabelTXUnrealCnt->Caption=(AnsiString)gSettings.TXNumOfUnrealPkts;
JvLabelTXUDPCnt->Caption=(AnsiString)gSettings.TXNumOfUDPPkts;
JvLabelTXRS232Cnt->Caption=(AnsiString)gSettings.TXNumOfRS232Pkts;
if(mod->dataformatter->GotAnOverFlowEvent)
{
OverFlowLED->Status=true;
mod->dataformatter->GotAnOverFlowEvent=false;
}
else OverFlowLED->Status=false;
BufferLevXfer=0.98*BufferLevXfer+0.02*((double)mod->dataformatter->buffnumberofcharsinque)/((double)(mod->dataformatter->buffsize));
TXBufferLevel->Position=(int)(1000.0*BufferLevXfer);
}
}
//---------------------------------------------------------------------------
void __fastcall TQAMForm::PacketCallBackFunc(void)
{
demod->RXCharBuffPtr--;
int checksum=0;
for(register int i=0;i<demod->RXCharBuffPtr;i++)checksum+=demod->RXCharBuff[i];
if((checksum&31)==(((demod->RXCharBuff[demod->RXCharBuffPtr])>>3)&31)) //see if its a good packet
{
gSettings.NumOfPkts++;
switch((demod->RXCharBuff[demod->RXCharBuffPtr])&7)
{
case ptStationID:
if(CheckCRC32())
{
demod->RXCharBuff[demod->RXCharBuffPtr]=0;
if(StationIDRec!=(AnsiString)(char*)demod->RXCharBuff)
{
StationIDRec=(AnsiString)(char*)demod->RXCharBuff;
this->Perform(CM_STATIONIDCHANGED, 0, 0);
}
}
break;
case ptUdp:
gSettings.NumOfUDPPkts++;
demod->RXCharBuff[demod->RXCharBuffPtr]=0;
if(udp_sender_conneted)WSocketSender->Send(demod->RXCharBuff,demod->RXCharBuffPtr);
break;
case ptText:
demod->RXCharBuff[demod->RXCharBuffPtr]=0;
Display((AnsiString)(char*)demod->RXCharBuff);
break;
case ptUnReal:
gSettings.NumOfUnrealPkts++;
//Display("EOP ptUnRealUdp\r");
for(int i = 0; i < FClients->Count; i++)
{
try
{
if(((TWSocket *)(FClients->Items[i]))->State==wsConnected)((TWSocket *)(FClients->Items[i]))->Send(demod->RXCharBuff,demod->RXCharBuffPtr);
}
catch (...)
{
//like i now how to do exceptions
}
}
break;
case ptUnRealHeader:
if((demod->RXCharBuffPtr<1000)&&(CheckCRC32()))
{
QAMUnRealHeadersize=demod->RXCharBuffPtr;
for(int i=0;i<QAMUnRealHeadersize;i++)QAMUnRealHeader[i]=demod->RXCharBuff[i];
QAMUnRealHeaderGotIt=true;
if(SocketUnRealTCPServerListner->State&wsClosed)PostMessage(this->Handle,CM_STARTUNREALSERVER, 0,0);
}
break;
case ptRs232:
gSettings.NumOfRS232Pkts++;
if(CiaComPort1->Open)SendRs232(demod->RXCharBuff,demod->RXCharBuffPtr);
break;
case ptWeb:
gSettings.NumOfWebPkts++;
if((CheckCRC32())&&(StationIDRec!=""))
{
//AnsiString name=(AnsiString)(char*)demod->RXCharBuff;
//int pos=*((int*)&demod->RXCharBuff[name.Length()+9]);
//Display((AnsiString)name+" "+pos+"\r");
if((demod->RXCharBuffPtr+file_pkt_buffer_ptr_w+8)>=file_pkt_buffer_size)
{
*(int*)&file_pkt_buffer[file_pkt_buffer_ptr_w]=-1;
file_pkt_buffer_ptr_w=0;
}
if((demod->RXCharBuffPtr+8)>=file_pkt_buffer_size)break;
*(int*)&file_pkt_buffer[file_pkt_buffer_ptr_w]=demod->RXCharBuffPtr;
file_pkt_buffer_ptr_w+=4;
for(register int p=0;p<demod->RXCharBuffPtr;p++)
{
file_pkt_buffer[file_pkt_buffer_ptr_w]=demod->RXCharBuff[p];
file_pkt_buffer_ptr_w++;
}
this->Perform(CM_GOTFILEPACKETFORYOU, 0, 0);
}
break;
};
}
else
{
gSettings.NumOfPkts++;
gSettings.NumOfBadPkts++;
demod->NumOfBadPkts++;
}
demod->RXCharBuffPtr=0;
}
bool __fastcall TQAMForm::CheckCRC32()
{
if(demod->RXCharBuffPtr>=4)
{
unsigned long crc32,crc32rec;
FastCrc fastCrc (0x04c11db7);
for(int i=0;i<(demod->RXCharBuffPtr-4);i++)fastCrc.PutByte(demod->RXCharBuff[i]);
crc32=fastCrc.Done();
unsigned long *tp;
tp=(unsigned long *)&demod->RXCharBuff[demod->RXCharBuffPtr-4];
crc32rec=*tp;
//Display((AnsiString)"Rec crc32="+crc32rec+"\rOrg crc32="+crc32+"\r");
//Display("got header\r");
if(crc32rec==crc32)
{
demod->RXCharBuffPtr-=4;
return true;
}
else return false;
}
return false;
}
void __fastcall TQAMForm::AddCRC32(unsigned char *Buf,int *Size)
{
unsigned long crc32;
FastCrc fastCrc (0x04c11db7);
for(int i=0;i<(*Size);i++)fastCrc.PutByte(Buf[i]);
crc32=fastCrc.Done();
*((unsigned long *)&Buf[*Size])=crc32;
*Size+=4;
}
void __fastcall TQAMForm::CMMessageStartUnRealServer(TMessage &Msg)
{
SocketUnRealTCPServerListner->Addr="0.0.0.0";
SocketUnRealTCPServerListner->Port=(AnsiString)SettingsForm->JvValidateEditUnRealQAMTcpPort->Value;
SocketUnRealTCPServerListner->Proto="tcp";
SocketUnRealTCPServerListner->Listen();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -