fix s-meter

This commit is contained in:
2026-03-08 23:51:56 +03:00
parent d347a26d6d
commit e5441be063
3 changed files with 39 additions and 27 deletions
+27 -17
View File
@@ -1980,17 +1980,17 @@ procedure TMainForm.DrawSMeterWide(ACanvas: TCanvas; R: TRect;
out ZX1, ZX2, ZY1, ZY2: Integer); out ZX1, ZX2, ZY1, ZY2: Integer);
const const
DB_MIN = -127.0; // левый край шкалы DB_MIN = -127.0; // левый край шкалы
DB_MAX = -0.0; // правый край DB_MAX = -13.0; // правый край шкалы (S9+60)
DB_S9 = -73.0; // граница S9 (зелёная/оранжевая) DB_S9 = -73.0; // граница S9 (зелёная/оранжевая)
DB_OVR = -43.0; // граница "красной" зоны (+30 over S9) DB_OVR = -43.0; // граница "красной" зоны (+30 over S9)
// dBm верхняя шкала: 7 меток // dBm верхняя шкала
DBM_MARKS: array[0..6] of Double = (-120,-100,-80,-60,-40,-20,0); DBM_MARKS: array[0..5] of Double = (-120,-100,-80,-60,-40,-20);
DBM_LABELS: array[0..6] of string = ('-120','-100','-80','-60','-40','-20','0'); DBM_LABELS: array[0..5] of string = ('-120','-100','-80','-60','-40','-20');
// S-шкала нижняя: 9 меток // S-шкала нижняя: как в VfoOverlay
S_MARKS_DBM: array[0..8] of Double = (-121,-115,-109,-103,-93,-83,-73,-53,-33); S_MARKS_DBM: array[0..7] of Double = (-121,-109,-97,-85,-73,-53,-33,-13);
S_MARKS_LBL: array[0..8] of string = ('S1','S3','S5','S7','S9','+10','+20','+40','+60'); S_MARKS_LBL: array[0..7] of string = ('S1','S3','S5','S7','S9','+20','+40','+60');
// Цвета (BGR в TColor) // Цвета (BGR в TColor)
CLR_SMETER_BG = TColor($00181818); // фон = CLR_PANEL CLR_SMETER_BG = TColor($00181818); // фон = CLR_PANEL
@@ -2029,6 +2029,7 @@ var
i, X, TW: Integer; i, X, TW: Integer;
Lbl: string; Lbl: string;
SNum: Integer; SNum: Integer;
Over: Integer;
function DBtoX(dB: Double): Integer; inline; function DBtoX(dB: Double): Integer; inline;
begin begin
@@ -2142,7 +2143,7 @@ begin
ACanvas.Font.Style := []; ACanvas.Font.Style := [];
ACanvas.Brush.Style:= bsClear; ACanvas.Brush.Style:= bsClear;
for i := 0 to 6 do for i := 0 to High(DBM_MARKS) do
begin begin
X := DBtoX(DBM_MARKS[i]); X := DBtoX(DBM_MARKS[i]);
// Длинный тик вверх от полосы // Длинный тик вверх от полосы
@@ -2156,7 +2157,7 @@ begin
// Мелкие тики каждые 10 dB между основными (каждые 5) // Мелкие тики каждые 10 dB между основными (каждые 5)
i := -125; i := -125;
while i < 0 do while i < -13 do
begin begin
X := DBtoX(i); X := DBtoX(i);
VLine(X, Y_BAR_TOP - TICK_MED, Y_BAR_TOP - 1, CLR_TICK_GREEN); VLine(X, Y_BAR_TOP - TICK_MED, Y_BAR_TOP - 1, CLR_TICK_GREEN);
@@ -2166,7 +2167,7 @@ begin
// ================================================================ // ================================================================
// НИЖНЯЯ ШКАЛА — S1..S9..+60 // НИЖНЯЯ ШКАЛА — S1..S9..+60
// ================================================================ // ================================================================
for i := 0 to 8 do for i := 0 to High(S_MARKS_DBM) do
begin begin
X := DBtoX(S_MARKS_DBM[i]); X := DBtoX(S_MARKS_DBM[i]);
// Тик вниз от полосы // Тик вниз от полосы
@@ -2204,17 +2205,26 @@ begin
ACanvas.Font.Size := 8; ACanvas.Font.Size := 8;
ACanvas.Font.Style := [fsBold]; ACanvas.Font.Style := [fsBold];
ACanvas.Font.Color := CLR_LABEL_S; ACanvas.Font.Color := CLR_LABEL_S;
if Value < -93.0 then if Value >= -73.0 then
begin begin
SNum := Round((Value - (-127.0)) / 6.0); Over := Round(Value - (-73.0));
if SNum < 1 then SNum := 1; if Over < 5 then
if SNum > 9 then SNum := 9; Lbl := 'S9'
Lbl := Format('S%d', [SNum]); else
begin
Over := ((Over + 5) div 10) * 10;
if Over = 0 then Over := 10;
Lbl := Format('S9+%d', [Over]);
end;
end end
else if Value <= -121.0 then
Lbl := 'S1'
else else
begin begin
SNum := Round(Value - (-93.0)); Lbl := 'S1';
Lbl := Format('S9+%d', [SNum]); for SNum := 1 to 8 do
if Value >= (-121.0 + (SNum - 1) * 6.0) then
Lbl := 'S' + IntToStr(SNum);
end; end;
ACanvas.TextOut(R.Left + 1, Y_BAR_BOT + TICK_LONG + 1, Lbl); ACanvas.TextOut(R.Left + 1, Y_BAR_BOT + TICK_LONG + 1, Lbl);
end; end;
+10 -8
View File
@@ -268,14 +268,14 @@ begin
'function updBand(vfo){let bi=0,bd=1e15;BAND_F.forEach((f,i)=>{const d=Math.abs((vfo||0)-f);if(d<bd){bd=d;bi=i;}});q("bandSel").value=bi;}' + 'function updBand(vfo){let bi=0,bd=1e15;BAND_F.forEach((f,i)=>{const d=Math.abs((vfo||0)-f);if(d<bd){bd=d;bi=i;}});q("bandSel").value=bi;}' +
'let smAvg=-130,smPeak=-130,smMin=-130;' + 'let smAvg=-130,smPeak=-130,smMin=-130;' +
'function dbToX(db,bx,bw){return Math.max(bx,Math.min(bx+bw,Math.round(bx+(db+127)/127*bw)));}' + 'function dbToX(db,bx,bw){const DB_MIN=-127,DB_MAX=-13;return Math.max(bx,Math.min(bx+bw,Math.round(bx+(db-DB_MIN)/(DB_MAX-DB_MIN)*bw)));}' +
'function paintSM(dbm){' + 'function paintSM(dbm){' +
'const w=smCv.clientWidth||340,h=smCv.clientHeight||64;' + 'const w=smCv.clientWidth||340,h=smCv.clientHeight||64;' +
'const AVG_ALPHA=0.40,ZONE_DB=6,PEAK_BASE=0.12,MIN_BASE=0.12,ACCEL=0.030,MAX_A=0.92;' + 'const AVG_ALPHA=0.40,ZONE_DB=6,PEAK_BASE=0.12,MIN_BASE=0.12,ACCEL=0.030,MAX_A=0.92;' +
'const DBM_MARKS=[-120,-100,-80,-60,-40,-20,0];' + 'const DBM_MARKS=[-120,-100,-80,-60,-40,-20];' +
'const DBM_LABELS=["-120","-100","-80","-60","-40","-20","0"];' + 'const DBM_LABELS=["-120","-100","-80","-60","-40","-20"];' +
'const S_MARKS_DBM=[-121,-115,-109,-103,-93,-83,-73,-53,-33];' + 'const S_MARKS_DBM=[-121,-109,-97,-85,-73,-53,-33,-13];' +
'const S_MARKS_LBL=["S1","S3","S5","S7","S9","+10","+20","+40","+60"];' + 'const S_MARKS_LBL=["S1","S3","S5","S7","S9","+20","+40","+60"];' +
'const TICK_LONG=5,TICK_MED=3;' + 'const TICK_LONG=5,TICK_MED=3;' +
'smAvg=smAvg*(1-AVG_ALPHA)+dbm*AVG_ALPHA;' + 'smAvg=smAvg*(1-AVG_ALPHA)+dbm*AVG_ALPHA;' +
'const pTarget=Math.max(dbm,smAvg+ZONE_DB),mTarget=Math.min(dbm,smAvg-ZONE_DB);' + 'const pTarget=Math.max(dbm,smAvg+ZONE_DB),mTarget=Math.min(dbm,smAvg-ZONE_DB);' +
@@ -303,7 +303,7 @@ begin
'mctx.strokeStyle="#DCE0E0";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YT-TICK_LONG);mctx.lineTo(x,YT-1);mctx.stroke();' + 'mctx.strokeStyle="#DCE0E0";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YT-TICK_LONG);mctx.lineTo(x,YT-1);mctx.stroke();' +
'const t=DBM_LABELS[i],tw=mctx.measureText(t).width;' + 'const t=DBM_LABELS[i],tw=mctx.measureText(t).width;' +
'mctx.fillStyle="#DCDCD0";mctx.fillText(t,Math.round(x-tw/2),YT-TICK_LONG-1);}' + 'mctx.fillStyle="#DCDCD0";mctx.fillText(t,Math.round(x-tw/2),YT-TICK_LONG-1);}' +
'for(let d=-125;d<0;d+=5){const x=dbToX(d,BX,BW);' + 'for(let d=-125;d<-13;d+=5){const x=dbToX(d,BX,BW);' +
'mctx.strokeStyle="#708070";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YT-TICK_MED);mctx.lineTo(x,YT-1);mctx.stroke();}' + 'mctx.strokeStyle="#708070";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YT-TICK_MED);mctx.lineTo(x,YT-1);mctx.stroke();}' +
'for(let i=0;i<S_MARKS_DBM.length;i++){const x=dbToX(S_MARKS_DBM[i],BX,BW),ov=S_MARKS_DBM[i]>=-73;' + 'for(let i=0;i<S_MARKS_DBM.length;i++){const x=dbToX(S_MARKS_DBM[i],BX,BW),ov=S_MARKS_DBM[i]>=-73;' +
'mctx.strokeStyle=ov?"#70A090":"#708070";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YB+1);mctx.lineTo(x,YB+TICK_LONG);mctx.stroke();' + 'mctx.strokeStyle=ov?"#70A090":"#708070";mctx.lineWidth=1;mctx.beginPath();mctx.moveTo(x,YB+1);mctx.lineTo(x,YB+TICK_LONG);mctx.stroke();' +
@@ -312,8 +312,10 @@ begin
'mctx.fillStyle="#DCD896";mctx.font="bold 12px Courier New";' + 'mctx.fillStyle="#DCD896";mctx.font="bold 12px Courier New";' +
'mctx.fillText(dbm.toFixed(1).padStart(6," "),1,12);' + 'mctx.fillText(dbm.toFixed(1).padStart(6," "),1,12);' +
'mctx.fillStyle="#707050";mctx.font="10px Courier New";mctx.fillText("dBm",1,YT-2);' + 'mctx.fillStyle="#707050";mctx.font="10px Courier New";mctx.fillText("dBm",1,YT-2);' +
'let sLbl;if(dbm<-93){let sv=Math.round((dbm+127)/6);if(sv<1)sv=1;if(sv>9)sv=9;sLbl="S"+sv;}' + 'let sLbl;' +
'else sLbl="S9+"+Math.round(dbm+93);' + 'if(dbm>=-73){let over=Math.round(dbm+73);if(over<5)sLbl="S9";else{over=Math.round((over+5)/10)*10;if(over===0)over=10;sLbl="S9+"+over;}}' +
'else if(dbm<=-121){sLbl="S1";}' +
'else{sLbl="S1";for(let i=1;i<=8;i++){if(dbm>=(-121+(i-1)*6))sLbl="S"+i;}}' +
'mctx.fillStyle="#F0F0F0";mctx.font="bold 12px Courier New";mctx.fillText(sLbl,1,YB+TICK_LONG+10);}' + 'mctx.fillStyle="#F0F0F0";mctx.font="bold 12px Courier New";mctx.fillText(sLbl,1,YB+TICK_LONG+10);}' +
// pendingCmds: команды в пути — не перезаписываем эти поля из server state // pendingCmds: команды в пути — не перезаписываем эти поля из server state
+2 -2
View File
@@ -285,7 +285,7 @@
"span_hz" : 1.9200000000000000E+005 "span_hz" : 1.9200000000000000E+005
}, },
"1" : { "1" : {
"vfo_a" : 3.6870000000000000E+006, "vfo_a" : 3.6630000000000000E+006,
"vfo_b" : 3.7500000000000000E+006, "vfo_b" : 3.7500000000000000E+006,
"mode" : 0, "mode" : 0,
"filter_idx" : 5, "filter_idx" : 5,
@@ -307,7 +307,7 @@
"span_hz" : 1.9200000000000000E+005 "span_hz" : 1.9200000000000000E+005
}, },
"3" : { "3" : {
"vfo_a" : 7.1410000000000000E+006, "vfo_a" : 7.1100000000000000E+006,
"vfo_b" : 7.1000000000000000E+006, "vfo_b" : 7.1000000000000000E+006,
"mode" : 0, "mode" : 0,
"filter_idx" : 5, "filter_idx" : 5,