feature(settings): вкладка Calibration — детектор мощности/КСВ, V/A, S-метр

Паритет с Thetis-Enhanced (Det. Cal. / Volts&Amps правки):
- TCalibration в TGlobalSettings (JSON cal_*): модель детектора Alex-моста,
  per-band множитель FWD/REV 0.5..2.0, множитель напряжения, Voff/Sens
  датчика тока, офсет S-метра.
- AlexDetToWatts: константы Thetis computeAlexFwdPower/computeRefPower по
  моделям (ANAN-100 / 200D / 7000DLE-Anvelina Pro 3 / 8000DLE-Orion MkII,
  6m-спецкейс REV). Дефолт = прежняя формула ANAN-100 (поведение не меняется).
- OnHPStatus: FWD и REV через модельную формулу x множитель банда;
  КСВ = (1+p)/(1-p), p=sqrt(RevW/FwdW) (Thetis) вместо отношения сырых ADC;
  напряжение x SupplyVoltCal; ток с калибруемыми Voff/Sens.
- WDSPEngine.SMeterCalDB: офсет в GetSMeterDBm/GetSliceSMeter (главный
  S-метр, slice-флаги, web).
- Выбор модели в комбо подставляет модельные дефолты датчика тока
  (Anvelina Pro 3/7000DLE: 340 мВ / 88 мВ/А — Thetis GetDefaultVoltCalibration).
- Фиксы: гард FLoading при постройке вкладки (SetItemIndex стреляет OnChange
  на программном присвоении -> AV на nil-контролах), FPageCalib/FNavCalib
  в списках SelectPage (вкладка была невидимой).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 14:35:34 +03:00
co-authored by Claude Fable 5
parent a7e154b959
commit c645b0d1e6
6 changed files with 381 additions and 20 deletions
+65 -6
View File
@@ -400,7 +400,9 @@ function BoardSupportsSupplyCurrent(BoardType: Integer): Boolean;
// Convert raw ADC value to supply current in Amps (Board 5 / Orion MkII only)
// Uses UserADC1 (bytes 55-56). Returns -1 for unsupported boards.
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer): Double;
// VoffMV/SensMVA — калибровка датчика (Thetis AmpVoff/AmpSens, ACS712-style).
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer;
VoffMV: Double = 360.0; SensMVA: Double = 120.0): Double;
// Convert raw ADC value to RF power in Watts (ANAN-100)
function ADCToWatts100(RawADC: Word): Double;
@@ -408,6 +410,16 @@ function ADCToWatts100(RawADC: Word): Double;
// Convert raw ADC value to RF power in Watts (ANAN-10)
function ADCToWatts10(RawADC: Word): Double;
// Alex bridge FWD/REV detector → Watts, константы Thetis computeAlexFwdPower/
// computeRefPower по модели трансивера:
// 0 = ANAN-10/100/100B/100D (Vref 3.3V)
// 1 = ANAN-200D / Orion (Vref 5.0V)
// 2 = ANAN-7000DLE / Anvelina Pro 3 / G2 / Red Pitaya
// 3 = ANAN-8000DLE / Orion MkII
// IsRev — REV-детектор (свой bridge_volt/offset), Is6m — 6m-коррекция REV.
function AlexDetToWatts(RawADC: Word; DetModel: Integer;
IsRev, Is6m: Boolean): Double;
implementation
procedure PackU32BE(Value: LongWord; out B: array of Byte; Offset: Integer);
@@ -476,14 +488,15 @@ begin
Result := BoardType = 5;
end;
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer): Double;
function ADCToSupplyCurrent(RawADC: Word; BoardType: Integer;
VoffMV: Double; SensMVA: Double): Double;
begin
// Board 5 (Orion MkII): UserADC1, Vref=5V → mV = adc/4095*5000.
// Current sensor: Voff=360mV, Sens=120mV/A (Thetis defaults, ACS712-style).
// Formula: amps = (mV - Voff) / Sens.
if BoardType = 5 then
// Formula: amps = (mV - Voff) / Sens. Дефолты Voff=360мВ, Sens=120мВ/А
// (Thetis, ACS712-style); переопределяются калибровкой.
if (BoardType = 5) and (SensMVA > 0) then
begin
Result := ((RawADC / 4095.0) * 5000.0 - 360.0) / 120.0;
Result := ((RawADC / 4095.0) * 5000.0 - VoffMV) / SensMVA;
if Result < 0.0 then Result := 0.0;
end else
Result := -1.0;
@@ -507,4 +520,50 @@ begin
Result := (V * V) / 0.09;
end;
function AlexDetToWatts(RawADC: Word; DetModel: Integer;
IsRev, Is6m: Boolean): Double;
var
Bridge, Vref, V: Double;
CalOff: Integer;
begin
// Константы из Thetis (console.cs computeAlexFwdPower / computeRefPower).
// W = ((ADC - CalOff)/4095 * Vref)^2 / Bridge.
case DetModel of
1: begin // ANAN-200D / Orion
Vref := 5.0;
if IsRev then begin
Bridge := 0.108; if Is6m then Bridge := 0.5;
CalOff := 2;
end else begin
Bridge := 0.108; CalOff := 4;
end;
end;
2: begin // ANAN-7000DLE / Anvelina Pro 3 / G2 / Red Pitaya
Vref := 5.0;
if IsRev then begin
Bridge := 0.15; if Is6m then Bridge := 0.7;
CalOff := 28;
end else begin
Bridge := 0.12; CalOff := 32;
end;
end;
3: begin // ANAN-8000DLE / Orion MkII
Vref := 5.0; Bridge := 0.08;
if IsRev then CalOff := 16 else CalOff := 18;
end;
else begin // 0: ANAN-10/100/100B/100D
Vref := 3.3;
if IsRev then begin
Bridge := 0.095; if Is6m then Bridge := 0.5;
CalOff := 3;
end else begin
Bridge := 0.095; CalOff := 6;
end;
end;
end;
V := ((RawADC - CalOff) / 4095.0) * Vref;
if V < 0 then V := 0;
Result := (V * V) / Bridge;
end;
end.