From 19b4efea6b53fc6dc8932b2a222a3c805efe220a Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Fri, 6 Mar 2026 00:29:16 +0300 Subject: [PATCH] fix chnage mode web --- WebPageHtml.pas | 25 +++++++++++++++++-------- WebUtils.pas | 7 +++++-- hpsdr_settings.json | 4 ++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/WebPageHtml.pas b/WebPageHtml.pas index ce7c73e..108df19 100644 --- a/WebPageHtml.pas +++ b/WebPageHtml.pas @@ -15,6 +15,14 @@ unit WebPageHtml; - Opus: opQueue буферизует пакеты пока WASM не готов - Opus: AudioContext создаётся только по user gesture (оверлей) - SPANS: только 48K..1536K + - (Mode fix) modTglBtn теперь отображает ТЕКУЩИЙ активный режим + (LSB/USB, CWL/CWU, AM/SAM, FM), а не следующий. При клике + переключает на парный режим внутри группы. + - (Mode fix) cwBtn удалён — его роль выполняет modTglBtn при CW группе. + - (Mode fix) syncModGrp + updModTglLabel корректно синхронизируют UI + из server state: выпадающий список и кнопка отражают десктоп. + - (Mode fix) modGrpSel.onchange при смене группы сразу отправляет + команду mode с дефолтным режимом группы (LSB, CWL, FM, AM). } {$IFDEF FPC} @@ -140,7 +148,6 @@ begin '
' + '' + '
' + - '' + '' + '' + '' + @@ -181,13 +188,14 @@ begin 'const MODE_N=["LSB","USB","DSB","CWL","CWU","FM","AM","SAM"];' + 'const GRP_MAP={ssb:[0,1],cw:[3,4],fm:[5,5],am:[6,7]};' + + 'const MODE_TO_GRP=["ssb","ssb","ssb","cw","cw","fm","am","am"];' + + 'function modGrpFromMode(m){return MODE_TO_GRP[m]||"ssb";}' + 'function modGrp(){return q("modGrpSel").value||"ssb";}' + - 'function modTglTarget(){const grp=GRP_MAP[modGrp()];const cur_m=cur.mode||0;return(cur_m===grp[0])?grp[1]:grp[0];}' + - 'function updModTglLabel(){const b=q("modTglBtn");if(!b)return;b.textContent=MODE_N[modTglTarget()];}' + - 'function syncModGrp(m){const g=m<=1?"ssb":m<=4?"cw":m===5?"fm":"am";const s=q("modGrpSel");if(s&&s.value!==g)s.value=g;}' + - 'q("modGrpSel").onchange=function(){updModTglLabel();};' + - 'q("modTglBtn").onclick=function(){audioKick();pend("mode");ws2({cmd:"mode",mode:modTglTarget()});};' + - 'q("cwBtn").onclick=function(){audioKick();pend("mode");ws2({cmd:"mode",mode:cur.mode===3?4:3});};' + + 'function modTglTarget(){const grp=GRP_MAP[modGrp()];const m=cur.mode||0;return(m===grp[0])?grp[1]:grp[0];}' + + 'function updModTglLabel(){const b=q("modTglBtn");if(!b)return;const grp=GRP_MAP[modGrp()];const m=cur.mode||0;const show=(m===grp[0]||m===grp[1])?m:grp[0];b.textContent=MODE_N[show];}' + + 'function syncModGrp(m){const g=MODE_TO_GRP[m]||"ssb";const s=q("modGrpSel");if(s&&s.value!==g)s.value=g;updModTglLabel();}' + + 'q("modGrpSel").onchange=function(){const grp=GRP_MAP[modGrp()];const defaultMode=grp[0];cur.mode=defaultMode;updModTglLabel();pend("mode");ws2({cmd:"mode",mode:defaultMode});};' + + 'q("modTglBtn").onclick=function(){audioKick();const next=modTglTarget();cur.mode=next;updModTglLabel();pend("mode");ws2({cmd:"mode",mode:next});};' + 'q("agcSel").onchange=function(e){pend("agc");ws2({cmd:"agc",mode:+e.target.value});};' + 'q("volSl").oninput=function(e){ws2({cmd:"volume",v:+e.target.value});var v=q("volVal");if(v)v.textContent=e.target.value;};' + @@ -331,7 +339,8 @@ begin 'if(!isPending("nb"))sw("nbBtn",!!cur.nb);' + 'if(!isPending("anf"))sw("anfBtn",!!cur.anf);' + 'if(!isPending("run"))updRunBtn(!!cur.running);' + - 'if(!isPending("mode")){syncModGrp(cur.mode||0);updModTglLabel();}' + + // syncModGrp syncs dropdown AND calls updModTglLabel internally + 'if(!isPending("mode")){syncModGrp(cur.mode||0);}' + 'updBand(cur.vfo_a_hz||0);updSpan(cur.span_hz||192000);' + 'paintSM(Number(cur.smeter_dbm||-130));' + 'const mn=cur.mode_name||(MODE_N[cur.mode||0]||"?");' + diff --git a/WebUtils.pas b/WebUtils.pas index d9111e6..86a53c7 100644 --- a/WebUtils.pas +++ b/WebUtils.pas @@ -269,11 +269,14 @@ var K: string; begin Result := ''; - K := '"' + Key + '"'; + // Ищем "key": — с двоеточием, чтобы не совпасть с "key" внутри значения + // Например в {"cmd":"mode","mode":1} поиск "mode": не найдёт "mode" как значение cmd + K := '"' + Key + '":'; P := System.Pos(K, Json); if P = 0 then Exit; Inc(P, Length(K)); - while (P <= Length(Json)) and (Json[P] in [' ', ':']) do Inc(P); + // Пропускаем пробелы после двоеточия + while (P <= Length(Json)) and (Json[P] = ' ') do Inc(P); if P > Length(Json) then Exit; if Json[P] = '"' then begin diff --git a/hpsdr_settings.json b/hpsdr_settings.json index 431ca3c..565d17b 100644 --- a/hpsdr_settings.json +++ b/hpsdr_settings.json @@ -285,7 +285,7 @@ "span_hz" : 1.9200000000000000E+005 }, "1" : { - "vfo_a" : 3.6400000000000000E+006, + "vfo_a" : 3.6210000000000000E+006, "vfo_b" : 3.7500000000000000E+006, "mode" : 0, "filter_idx" : 5, @@ -307,7 +307,7 @@ "span_hz" : 1.9200000000000000E+005 }, "3" : { - "vfo_a" : 7.1470000000000000E+006, + "vfo_a" : 7.1620000000000000E+006, "vfo_b" : 7.1000000000000000E+006, "mode" : 0, "filter_idx" : 5,