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

📄 settings.cpp

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


#pragma hdrstop

#include "Settings.h"

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

#pragma package(smart_init)

SettingsClass gSettings;

__fastcall SettingsClass::SettingsClass()
{
        SoundCardDevs=new TStringList;
        RS232Ports=new TStringList;

        NumOfBadPkts=0ui64;
        NumOfPkts=0ui64;

        DemodMajorCriticalsection=new TCriticalSection;
        ModMajorCriticalsection=new TCriticalSection;
        
        ModMajor.Active=false;
        DemodMajor.Active=false;

        //--load wavetables (trig)
        Trig.SinWT.resize(WTSIZE);
        Trig.CosWT.resize(WTSIZE);
        Trig.CosINV.resize(WTSIZE);
        int cosine,i;
        for(i=0;i<WTSIZE;i++){Trig.SinWT[i]=(sin(2*M_PI*((double)i)/WTSIZE));}
        for(i=0;i<WTSIZE;i++){Trig.CosWT[i]=(sin(M_PI_2+2*M_PI*((double)i)/WTSIZE));}
        for(i=0;i<WTSIZE;i++)
        {
                cosine=(2.0*((double)i)/(WTSIZE-1.0))-1.0;
                if (cosine>1)cosine=1;
                 else if(cosine<-1)cosine=-1;
                Trig.CosINV[i]=acos(cosine);
        }
        //--

        //--load common
        Common.Samplerate=96000.0;
        //--

        //--load default demod settings
        DemodMinor.SlowLock=false;
        DemodMinor.Locked=false;
        DemodMinor.Ama=false;
        DemodMinor.DCD=false;
        DemodMinor.Status="";
        DemodMinor.StatusChanged=true;
        DemodMinor.Acquisitionstage=(AcquisitionStage)0;
        DemodMinor.Unrealon=false;


        DemodMajor.Active=false;
        DemodMajor.ConstalationSize=64;
        DemodMajor.Alpha=1.0;
        DemodMajor.Gamma=1.0;
        DemodMajor.Firsize=20;
        DemodMajor.Freq=9600.0;
        DemodMajor.Symbol_Freq=DemodMajor.Freq/DemodMajor.Gamma;
        //--

        //--load default mod settings
        ModMinor.Webserveron=false;
        ModMinor.Unrealon=false;
        ModMinor.CM_SENDNEXTWEBPACKET_is_handled=false;
        ModMinor.IdleThreshold=10;

        ModMajor.Active=false;
        ModMajor.ConstalationSize=64;
        ModMajor.Alpha=1.0;
        ModMajor.Gamma=1.0;
        ModMajor.Firsize=20;
        ModMajor.Freq=9600.0;
        ModMajor.Symbol_Freq=ModMajor.Freq/ModMajor.Gamma;
        //--

}

void __fastcall SettingsClass::SetDemodMajor
(
                bool Active,
                int ConstalationSize,
                double Alpha,
                double Gamma,
                int Firsize,
                double Freq,
                int InterleavingLength,
                int RSErrorPercent,
                int FramePriod
)
{
        DemodMajorCriticalsection->Acquire();

        NotificationEventType nt=CH_ANYTHING;
        if(DemodMajor.ConstalationSize!=ConstalationSize)nt=nt|CH_CONSTELATIONSIZE;
        if((DemodMajor.Freq!=Freq)||(DemodMajor.Gamma!=Gamma))nt=nt|CH_FREQ;

        if((Firsize%2)!=0)Firsize-=1;
        DemodMajor.Active=Active;
        DemodMajor.ConstalationSize=ConstalationSize;
        DemodMajor.Alpha=Alpha;
        DemodMajor.Gamma=Gamma;
        DemodMajor.Firsize=Firsize;
        DemodMajor.Freq=Freq;
        DemodMajor.Symbol_Freq=DemodMajor.Freq/DemodMajor.Gamma;

        DemodMajor.InterleavingLength=InterleavingLength;
        DemodMajor.RSErrorPercent=RSErrorPercent;
        DemodMajor.FramePriod=FramePriod;

        //--load constelation maps
        int lch;
        int uch;
        DemodMajor.Cmap.resize(ConstalationSize);
        switch (ConstalationSize)
        {
                case 64:
                        DemodMajor.CMapQAMAmpsSize=8;
                        DemodMajor.CMapQAMAmps.resize(DemodMajor.CMapQAMAmpsSize);
                        for(int i=0;i<8;i++)DemodMajor.CMapQAMAmps[i]=(-1.0+2.0/7.0*((double)i))/sqrt(2);
                        for(int i=0;i<64;i++)
                        {
                                lch=i%8;
                                uch=(int)(i/8);
                                DemodMajor.Cmap[i].re=(-1.0+2.0/7.0*((double)lch))/sqrt(2);
                                DemodMajor.Cmap[i].im=(-1.0+2.0/7.0*((double)uch))/sqrt(2);
                        }
                        DemodMajor.BetaSquared=0.380333951;
                break;
                case 16:
                        DemodMajor.CMapQAMAmpsSize=4;
                        DemodMajor.CMapQAMAmps.resize(DemodMajor.CMapQAMAmpsSize);
                        for(int i=0;i<4;i++)DemodMajor.CMapQAMAmps[i]=(-1.0+2.0/3.0*((double)i))/sqrt(2);
                        for(int i=0;i<16;i++)
                        {
                                lch=i%4;
                                uch=(int)(i/4);
                                DemodMajor.Cmap[i].re=(-1.0+2.0/3.0*((double)lch))/sqrt(2);
                                DemodMajor.Cmap[i].im=(-1.0+2.0/3.0*((double)uch))/sqrt(2);
                        }
                        DemodMajor.BetaSquared=0.455555555;
                break;
        }
        //--end load

        DemodMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(nt);

        DemodMajorCriticalsection->Release();
}

void __fastcall SettingsClass::SetModMajor
(
                bool Active,
                int ConstalationSize,
                double Alpha,
                double Gamma,
                int Firsize,
                double Freq,
                int InterleavingLength,
                int RSErrorPercent,
                int FramePriod
)
{
        ModMajorCriticalsection->Acquire();

        NotificationEventType nt=CH_ANYTHING;
        if(ModMajor.ConstalationSize!=ConstalationSize)nt=nt|CH_CONSTELATIONSIZE;
        if((ModMajor.Freq!=Freq)||(ModMajor.Gamma!=Gamma))nt=nt|CH_FREQ;
        if((ModMajor.InterleavingLength!=InterleavingLength)||(ModMajor.RSErrorPercent!=RSErrorPercent)||(ModMajor.FramePriod!=FramePriod))nt=nt|CH_FRAME_SETTINGS;

        if((Firsize%2)!=0)Firsize-=1;
        ModMajor.Active=Active;
        ModMajor.ConstalationSize=ConstalationSize;
        ModMajor.Alpha=Alpha;
        ModMajor.Gamma=Gamma;
        ModMajor.Firsize=Firsize;
        ModMajor.Freq=Freq;
        ModMajor.Symbol_Freq=ModMajor.Freq/ModMajor.Gamma;

        ModMajor.InterleavingLength=InterleavingLength;
        ModMajor.RSErrorPercent=RSErrorPercent;
        ModMajor.FramePriod=FramePriod;

        //--load constelation maps
        int lch;
        int uch;
        ModMajor.Cmap.resize(ConstalationSize);
        switch (ConstalationSize)
        {
                case 64:
                        ModMajor.CMapQAMAmpsSize=8;
                        ModMajor.CMapQAMAmps.resize(ModMajor.CMapQAMAmpsSize);
                        for(int i=0;i<8;i++)ModMajor.CMapQAMAmps[i]=(-1.0+2.0/7.0*((double)i))/sqrt(2);
                        for(int i=0;i<64;i++)
                        {
                                lch=i%8;
                                uch=(int)(i/8);
                                ModMajor.Cmap[i].re=(-1.0+2.0/7.0*((double)lch))/sqrt(2);
                                ModMajor.Cmap[i].im=(-1.0+2.0/7.0*((double)uch))/sqrt(2);
                        }
                        ModMajor.BetaSquared=0.380333951;
                break;
                case 16:
                        ModMajor.CMapQAMAmpsSize=4;
                        ModMajor.CMapQAMAmps.resize(ModMajor.CMapQAMAmpsSize);
                        for(int i=0;i<4;i++)ModMajor.CMapQAMAmps[i]=(-1.0+2.0/3.0*((double)i))/sqrt(2);
                        for(int i=0;i<16;i++)
                        {
                                lch=i%4;
                                uch=(int)(i/4);
                                ModMajor.Cmap[i].re=(-1.0+2.0/3.0*((double)lch))/sqrt(2);
                                ModMajor.Cmap[i].im=(-1.0+2.0/3.0*((double)uch))/sqrt(2);
                        }
                        ModMajor.BetaSquared=0.455555555;
                break;
        }
        //--end load

        ModMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(nt);

        ModMajorCriticalsection->Release();
}

void __fastcall SettingsClass::DemodMajorAddCallBackNotificationFuction(void (__closure __fastcall *CallBack)(NotificationEventType WhatHasChanged))
{
        DemodMajorCriticalsection->Acquire();
        NotificationCallBack CallBackToAdd;
        CallBackToAdd.CallBack=CallBack;
        DemodMajorCallBackNotificationOfChangeFunctions.push_back(CallBackToAdd);
        DemodMajorCriticalsection->Release();
}

void __fastcall SettingsClass::DemodMajorRemoveCallBackNotificationFunction(void (__closure __fastcall *CallBack)(NotificationEventType WhatHasChanged))
{
        DemodMajorCriticalsection->Acquire();
        for(unsigned int i=0;i<(DemodMajorCallBackNotificationOfChangeFunctions.size());i++)
        {
                if(DemodMajorCallBackNotificationOfChangeFunctions[i].CallBack==CallBack)
                {
                        DemodMajorCallBackNotificationOfChangeFunctions.erase(DemodMajorCallBackNotificationOfChangeFunctions.begin()+i);
                        break;
                }
        }
        DemodMajorCriticalsection->Release();
}

void __fastcall SettingsClass::DemodMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(NotificationEventType WhatHasChanged)
{
        //DemodMajorCriticalsection->Acquire();
        for(unsigned int i=0;i<(DemodMajorCallBackNotificationOfChangeFunctions.size());i++)
        {
                DemodMajorCallBackNotificationOfChangeFunctions[i].CallBack(WhatHasChanged);
        }
        //DemodMajorCriticalsection->Release();
}

void __fastcall SettingsClass::ModMajorAddCallBackNotificationFuction(void (__closure __fastcall *CallBack)(NotificationEventType WhatHasChanged))
{
        ModMajorCriticalsection->Acquire();
        NotificationCallBack CallBackToAdd;
        CallBackToAdd.CallBack=CallBack;
        ModMajorCallBackNotificationOfChangeFunctions.push_back(CallBackToAdd);
        ModMajorCriticalsection->Release();
}

void __fastcall SettingsClass::ModMajorRemoveCallBackNotificationFunction(void (__closure __fastcall *CallBack)(NotificationEventType WhatHasChanged))
{
        ModMajorCriticalsection->Acquire();
        for(unsigned int i=0;i<(ModMajorCallBackNotificationOfChangeFunctions.size());i++)
        {
                if(ModMajorCallBackNotificationOfChangeFunctions[i].CallBack==CallBack)
                {
                        ModMajorCallBackNotificationOfChangeFunctions.erase(ModMajorCallBackNotificationOfChangeFunctions.begin()+i);
                        break;
                }
        }
        ModMajorCriticalsection->Release();
}

void __fastcall SettingsClass::ModMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(NotificationEventType WhatHasChanged)
{
       //ModMajorCriticalsection->Acquire();
       for(unsigned int i=0;i<(ModMajorCallBackNotificationOfChangeFunctions.size());i++)
       {
                ModMajorCallBackNotificationOfChangeFunctions[i].CallBack(WhatHasChanged);
       }
       //ModMajorCriticalsection->Release();
}

__fastcall SettingsClass::~SettingsClass()
{
        delete DemodMajorCriticalsection;
        delete ModMajorCriticalsection;
        delete SoundCardDevs;
        delete RS232Ports;
}

bool __fastcall SettingsClass::IsEmpty(void)
{
        if((ModMajorCallBackNotificationOfChangeFunctions.size()==0)&&(DemodMajorCallBackNotificationOfChangeFunctions.size()==0)) return true;
        return false;
}

int  __fastcall SettingsClass::DemodCallBackCount(void)
{
        return DemodMajorCallBackNotificationOfChangeFunctions.size();
}

int  __fastcall SettingsClass::ModCallBackCount(void)
{
        return ModMajorCallBackNotificationOfChangeFunctions.size();
}



void __fastcall SettingsClass::SetSampleRate(double SampleRate)
{
        ModMajorCriticalsection->Acquire();
        DemodMajorCriticalsection->Acquire();
        Common.Samplerate=SampleRate;
        DemodMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(CH_ANYTHING|CH_SAMPLERATE);
        ModMajorNotifyAllPeopleThatWantNotificationWhenSettingsAreChanged(CH_ANYTHING|CH_SAMPLERATE);
        DemodMajorCriticalsection->Release();
        ModMajorCriticalsection->Release();
}


⌨️ 快捷键说明

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