From e5441be0636f4fe7f7eff2b9cff9080b2f780875 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Sun, 8 Mar 2026 23:51:56 +0300 Subject: [PATCH] fix s-meter --- MainForm.pas | 44 +++++++++++++++++++++++++++----------------- WebPageHtml.pas | 18 ++++++++++-------- hpsdr_settings.json | 4 ++-- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index 3b5dc11..5df19bc 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -1980,17 +1980,17 @@ procedure TMainForm.DrawSMeterWide(ACanvas: TCanvas; R: TRect; out ZX1, ZX2, ZY1, ZY2: Integer); const DB_MIN = -127.0; // левый край шкалы - DB_MAX = -0.0; // правый край + DB_MAX = -13.0; // правый край шкалы (S9+60) DB_S9 = -73.0; // граница S9 (зелёная/оранжевая) DB_OVR = -43.0; // граница "красной" зоны (+30 over S9) - // dBm верхняя шкала: 7 меток - DBM_MARKS: array[0..6] of Double = (-120,-100,-80,-60,-40,-20,0); - DBM_LABELS: array[0..6] of string = ('-120','-100','-80','-60','-40','-20','0'); + // dBm верхняя шкала + DBM_MARKS: array[0..5] of Double = (-120,-100,-80,-60,-40,-20); + DBM_LABELS: array[0..5] of string = ('-120','-100','-80','-60','-40','-20'); - // S-шкала нижняя: 9 меток - S_MARKS_DBM: array[0..8] of Double = (-121,-115,-109,-103,-93,-83,-73,-53,-33); - S_MARKS_LBL: array[0..8] of string = ('S1','S3','S5','S7','S9','+10','+20','+40','+60'); + // S-шкала нижняя: как в VfoOverlay + S_MARKS_DBM: array[0..7] of Double = (-121,-109,-97,-85,-73,-53,-33,-13); + S_MARKS_LBL: array[0..7] of string = ('S1','S3','S5','S7','S9','+20','+40','+60'); // Цвета (BGR в TColor) CLR_SMETER_BG = TColor($00181818); // фон = CLR_PANEL @@ -2029,6 +2029,7 @@ var i, X, TW: Integer; Lbl: string; SNum: Integer; + Over: Integer; function DBtoX(dB: Double): Integer; inline; begin @@ -2142,7 +2143,7 @@ begin ACanvas.Font.Style := []; ACanvas.Brush.Style:= bsClear; - for i := 0 to 6 do + for i := 0 to High(DBM_MARKS) do begin X := DBtoX(DBM_MARKS[i]); // Длинный тик вверх от полосы @@ -2156,7 +2157,7 @@ begin // Мелкие тики каждые 10 dB между основными (каждые 5) i := -125; - while i < 0 do + while i < -13 do begin X := DBtoX(i); VLine(X, Y_BAR_TOP - TICK_MED, Y_BAR_TOP - 1, CLR_TICK_GREEN); @@ -2166,7 +2167,7 @@ begin // ================================================================ // НИЖНЯЯ ШКАЛА — S1..S9..+60 // ================================================================ - for i := 0 to 8 do + for i := 0 to High(S_MARKS_DBM) do begin X := DBtoX(S_MARKS_DBM[i]); // Тик вниз от полосы @@ -2204,17 +2205,26 @@ begin ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_S; - if Value < -93.0 then + if Value >= -73.0 then begin - SNum := Round((Value - (-127.0)) / 6.0); - if SNum < 1 then SNum := 1; - if SNum > 9 then SNum := 9; - Lbl := Format('S%d', [SNum]); + Over := Round(Value - (-73.0)); + if Over < 5 then + Lbl := 'S9' + else + begin + Over := ((Over + 5) div 10) * 10; + if Over = 0 then Over := 10; + Lbl := Format('S9+%d', [Over]); + end; end + else if Value <= -121.0 then + Lbl := 'S1' else begin - SNum := Round(Value - (-93.0)); - Lbl := Format('S9+%d', [SNum]); + Lbl := 'S1'; + for SNum := 1 to 8 do + if Value >= (-121.0 + (SNum - 1) * 6.0) then + Lbl := 'S' + IntToStr(SNum); end; ACanvas.TextOut(R.Left + 1, Y_BAR_BOT + TICK_LONG + 1, Lbl); end; diff --git a/WebPageHtml.pas b/WebPageHtml.pas index 108df19..9cfc18d 100644 --- a/WebPageHtml.pas +++ b/WebPageHtml.pas @@ -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=-73;' + '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.fillText(dbm.toFixed(1).padStart(6," "),1,12);' + '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;}' + - 'else sLbl="S9+"+Math.round(dbm+93);' + + 'let sLbl;' + + '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);}' + // pendingCmds: команды в пути — не перезаписываем эти поля из server state diff --git a/hpsdr_settings.json b/hpsdr_settings.json index 31c0bfd..7c5bffb 100644 --- a/hpsdr_settings.json +++ b/hpsdr_settings.json @@ -285,7 +285,7 @@ "span_hz" : 1.9200000000000000E+005 }, "1" : { - "vfo_a" : 3.6870000000000000E+006, + "vfo_a" : 3.6630000000000000E+006, "vfo_b" : 3.7500000000000000E+006, "mode" : 0, "filter_idx" : 5, @@ -307,7 +307,7 @@ "span_hz" : 1.9200000000000000E+005 }, "3" : { - "vfo_a" : 7.1410000000000000E+006, + "vfo_a" : 7.1100000000000000E+006, "vfo_b" : 7.1000000000000000E+006, "mode" : 0, "filter_idx" : 5,