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