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

📄 main.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        }



        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 + -