mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix s-meter
This commit is contained in:
+27
-17
@@ -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
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user