mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
start work tx
This commit is contained in:
+115
-1
@@ -48,6 +48,32 @@ type
|
||||
WindowTop: Integer;
|
||||
WindowWidth: Integer;
|
||||
WindowHeight: Integer;
|
||||
// --- Display settings ---
|
||||
FFTSize: Integer; // 1024,2048,4096,8192,16384
|
||||
WindowType: Integer; // 0=Rect,1=BH4,2=Hann,3=FlatTop,4=Hamming,5=Kaiser,6=BH7
|
||||
SpecDetector: Integer; // 0=Peak,1=Rosenfell,2=Average,3=Sample,4=RMS
|
||||
SpecAvgMode: Integer; // 0=None,1=Recursive,2=TimeWindow,3=LogRecursive
|
||||
SpecAvgCount: Integer; // frames to average
|
||||
SpecBackmult: Double; // 0.0..1.0 recursive averaging multiplier
|
||||
WfDetector: Integer; // waterfall detector
|
||||
WfAvgMode: Integer; // waterfall average mode
|
||||
WfAvgCount: Integer; // waterfall average count
|
||||
WfBackmult: Double; // waterfall backmult
|
||||
SpecRefLevel: Double; // dBm reference (top of scale), e.g. -20
|
||||
SpecRange: Double; // dB range, e.g. 110 (bottom = ref - range)
|
||||
SpecGridStep: Double; // grid step in dB, e.g. 10
|
||||
// --- Audio settings ---
|
||||
AudioOutDevice: string; // PortAudio output device name ('' = default)
|
||||
AudioSampleRate: Integer; // PortAudio stream sample rate (e.g. 48000)
|
||||
AudioInDevice: string; // PortAudio input device name for TX mic ('' = none)
|
||||
// --- Visibility settings ---
|
||||
ShowSpectrum: Boolean; // True = draw spectrum on main form
|
||||
ShowWaterfall: Boolean; // True = draw waterfall on main form
|
||||
// --- Display FPS ---
|
||||
DisplayFPS: Integer; // spectrum/waterfall timer fps (5..30)
|
||||
// --- PA (Power Amplifier) settings ---
|
||||
PAMaxPower: Double; // максимальная выходная мощность, Вт (5..200)
|
||||
PABandCal: array[0..CFG_BAND_COUNT-1] of Double; // калибровка на диапазон 38.8..100.0
|
||||
end;
|
||||
|
||||
TSettingsManager = class
|
||||
@@ -61,9 +87,11 @@ type
|
||||
function JI(O: TJSONObject; const K: string; Def: Integer): Integer;
|
||||
function JD(O: TJSONObject; const K: string; Def: Double): Double;
|
||||
function JB(O: TJSONObject; const K: string; Def: Boolean): Boolean;
|
||||
function JS(O: TJSONObject; const K: string; const Def: string): string;
|
||||
procedure JW(O: TJSONObject; const K: string; V: Integer); overload;
|
||||
procedure JW(O: TJSONObject; const K: string; V: Double); overload;
|
||||
procedure JW(O: TJSONObject; const K: string; V: Boolean); overload;
|
||||
procedure JWS(O: TJSONObject; const K: string; const V: string);
|
||||
public
|
||||
constructor Create(const FilePath: string = SETTINGS_FILE);
|
||||
destructor Destroy; override;
|
||||
@@ -110,12 +138,35 @@ begin
|
||||
end;
|
||||
|
||||
class procedure TSettingsManager.DefaultGlobal(out G: TGlobalSettings);
|
||||
var i: Integer;
|
||||
begin
|
||||
FillChar(G, SizeOf(G), 0);
|
||||
G.Volume := 70; G.DriveLevel := 50; G.ActiveVfo := 0;
|
||||
G.NRMode := 0; G.NBMode := 0; G.SNBEnabled := False; G.ANFEnabled := False;
|
||||
G.AGCSlope := 0; G.AGCHangThreshold := 100; G.LastBand := 5;
|
||||
G.SampleRate := 192000;
|
||||
G.PAMaxPower := 100.0;
|
||||
for i := 0 to CFG_BAND_COUNT-1 do G.PABandCal[i] := 100.0;
|
||||
// Display defaults
|
||||
G.FFTSize := 4096;
|
||||
G.WindowType := 5; // Kaiser
|
||||
G.SpecDetector := 0; // Peak
|
||||
G.SpecAvgMode := 3; // Log Recursive
|
||||
G.SpecAvgCount := 2;
|
||||
G.SpecBackmult := 0.45;
|
||||
G.WfDetector := 2; // Average
|
||||
G.WfAvgMode := 3; // Log Recursive
|
||||
G.WfAvgCount := 2;
|
||||
G.WfBackmult := 0.45;
|
||||
G.SpecRefLevel := -20.0;
|
||||
G.SpecRange := 110.0;
|
||||
G.SpecGridStep := 10.0;
|
||||
G.AudioOutDevice := '';
|
||||
G.AudioSampleRate := 48000;
|
||||
G.AudioInDevice := '';
|
||||
G.ShowSpectrum := True;
|
||||
G.ShowWaterfall := True;
|
||||
G.DisplayFPS := 20;
|
||||
end;
|
||||
|
||||
constructor TSettingsManager.Create(const FilePath: string);
|
||||
@@ -226,6 +277,17 @@ begin
|
||||
O.Add(K, V);
|
||||
end;
|
||||
|
||||
function TSettingsManager.JS(O: TJSONObject; const K: string; const Def: string): string;
|
||||
var D: TJSONData;
|
||||
begin D := O.Find(K); if D<>nil then try Result:=D.AsString; except Result:=Def; end else Result:=Def; end;
|
||||
|
||||
procedure TSettingsManager.JWS(O: TJSONObject; const K: string; const V: string);
|
||||
var Idx: Integer;
|
||||
begin
|
||||
Idx := O.IndexOfName(K); if Idx >= 0 then O.Delete(Idx);
|
||||
O.Add(K, V);
|
||||
end;
|
||||
|
||||
function TSettingsManager.LoadDevice(const MAC: array of Byte;
|
||||
out G: TGlobalSettings;
|
||||
var Bands: array of TBandSettings): Boolean;
|
||||
@@ -249,6 +311,32 @@ begin
|
||||
G.WfNFEnabled := JB(GObj,'wf_nf_enabled',False);
|
||||
G.LastBand := JI(GObj,'last_band',5);
|
||||
G.SampleRate := JI(GObj,'sample_rate',192000);
|
||||
// Display settings
|
||||
G.FFTSize := JI(GObj,'fft_size',4096);
|
||||
G.WindowType := JI(GObj,'win_type',5);
|
||||
G.SpecDetector := JI(GObj,'spec_detector',0);
|
||||
G.SpecAvgMode := JI(GObj,'spec_avg_mode',3);
|
||||
G.SpecAvgCount := JI(GObj,'spec_avg_count',2);
|
||||
G.SpecBackmult := JD(GObj,'spec_backmult',0.45);
|
||||
G.WfDetector := JI(GObj,'wf_detector',2);
|
||||
G.WfAvgMode := JI(GObj,'wf_avg_mode',3);
|
||||
G.WfAvgCount := JI(GObj,'wf_avg_count',2);
|
||||
G.WfBackmult := JD(GObj,'wf_backmult',0.45);
|
||||
G.SpecRefLevel := JD(GObj,'spec_ref_level',-20.0);
|
||||
G.SpecRange := JD(GObj,'spec_range',110.0);
|
||||
G.SpecGridStep := JD(GObj,'spec_grid_step',10.0);
|
||||
// Audio settings
|
||||
G.AudioOutDevice := JS(GObj,'audio_out_device','');
|
||||
G.AudioSampleRate := JI(GObj,'audio_sample_rate',48000);
|
||||
G.AudioInDevice := JS(GObj,'audio_in_device','');
|
||||
// Visibility settings
|
||||
G.ShowSpectrum := JB(GObj,'show_spectrum',True);
|
||||
G.ShowWaterfall := JB(GObj,'show_waterfall',True);
|
||||
G.DisplayFPS := JI(GObj,'display_fps',20);
|
||||
// PA settings
|
||||
G.PAMaxPower := JD(GObj,'pa_max_power',100.0);
|
||||
for i := 0 to CFG_BAND_COUNT-1 do
|
||||
G.PABandCal[i] := JD(GObj,'pa_band_cal_'+IntToStr(i),100.0);
|
||||
|
||||
for i := 0 to CFG_BAND_COUNT-1 do
|
||||
begin
|
||||
@@ -268,7 +356,7 @@ end;
|
||||
|
||||
procedure TSettingsManager.SaveGlobal(const MAC: array of Byte;
|
||||
const G: TGlobalSettings);
|
||||
var O: TJSONObject;
|
||||
var O: TJSONObject; i: Integer;
|
||||
begin
|
||||
O := GetGlobalObj(GetDevObj(MacToStr(MAC)));
|
||||
JW(O,'volume',G.Volume); JW(O,'drive_level',G.DriveLevel);
|
||||
@@ -283,6 +371,32 @@ begin
|
||||
JW(O,'wf_nf_enabled',G.WfNFEnabled);
|
||||
JW(O,'last_band',G.LastBand);
|
||||
JW(O,'sample_rate',G.SampleRate);
|
||||
// Display settings
|
||||
JW(O,'fft_size',G.FFTSize);
|
||||
JW(O,'win_type',G.WindowType);
|
||||
JW(O,'spec_detector',G.SpecDetector);
|
||||
JW(O,'spec_avg_mode',G.SpecAvgMode);
|
||||
JW(O,'spec_avg_count',G.SpecAvgCount);
|
||||
JW(O,'spec_backmult',G.SpecBackmult);
|
||||
JW(O,'wf_detector',G.WfDetector);
|
||||
JW(O,'wf_avg_mode',G.WfAvgMode);
|
||||
JW(O,'wf_avg_count',G.WfAvgCount);
|
||||
JW(O,'wf_backmult',G.WfBackmult);
|
||||
JW(O,'spec_ref_level',G.SpecRefLevel);
|
||||
JW(O,'spec_range',G.SpecRange);
|
||||
JW(O,'spec_grid_step',G.SpecGridStep);
|
||||
// Audio settings
|
||||
JWS(O,'audio_out_device',G.AudioOutDevice);
|
||||
JW(O,'audio_sample_rate',G.AudioSampleRate);
|
||||
JWS(O,'audio_in_device',G.AudioInDevice);
|
||||
// Visibility settings
|
||||
JW(O,'show_spectrum',G.ShowSpectrum);
|
||||
JW(O,'show_waterfall',G.ShowWaterfall);
|
||||
JW(O,'display_fps',G.DisplayFPS);
|
||||
// PA settings
|
||||
JW(O,'pa_max_power',G.PAMaxPower);
|
||||
for i := 0 to CFG_BAND_COUNT-1 do
|
||||
JW(O,'pa_band_cal_'+IntToStr(i),G.PABandCal[i]);
|
||||
end;
|
||||
|
||||
procedure TSettingsManager.SaveBand(const MAC: array of Byte; BandIdx: Integer;
|
||||
|
||||
Reference in New Issue
Block a user