Commit Graph
385 Commits
Author SHA1 Message Date
ew8bakandClaude Sonnet 4.6 b00c0d02a0 Fix Alex XVTR DDC In: block bits 8+11 when transverter not active
CalcAlex0: Alex.RxOnly[band]=3 (XVTR checkbox in Antenna tab) now sets
XVTR DDC In only when XvtrActive=True (FXvtrEnable). Matches Thetis
Alex.cs behaviour: "do not use XVTR ant port if not using transverter".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 21:00:20 +03:00
ew8bakandClaude Sonnet 4.6 09d250ae45 Fix TX sequencing: PTT after Alex relay, SEQ error on startup
- Separate FPTTActive from FIsTransmitting so PTT bit in HP packet
  can be sent as a second packet after Alex bit27 (T/R relay) is set,
  matching Thetis behaviour: relay switches first, then PTT=1
- On TX stop: PTT=0 first, then Alex switches back to RX
- Add SendPTT(Active) method to THPSDRNetwork
- Reset FSeqHP to 0 in SetRunAndFreq(Run=True) to eliminate HP SEQ
  ERROR caused by intermediate SendFullHP calls before Run=1 packet
- RebuildXvtrButtons: use dynamic BtnH/RowH/MaxBottom instead of
  hardcoded px values so XVTR buttons scale correctly on HiDPI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 22:09:54 +03:00
ew8bakandClaude Sonnet 4.6 81714d982e Reduce TOP_SMETER_GAP: hide VFO block only when S-meter is adjacent
Was 72px, causing VFO to disappear while there was still visible space
between it and the S-meter. Now 8px — just enough visual breathing room.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 20:25:24 +03:00
ew8bakandClaude Sonnet 4.6 0dd7c6f34f Fix HiDPI layout: ruler height, left panel overlap, VFO button clipping
- RelayoutBelowBands: replace hardcoded Inc(Y,76) with actual panel
  heights so Mode/Filter/RX panels don't overlap at scaled DPI
- ResizeSpectrumPanels, SplitterMouseMove/Up: make RULER_H dynamic
  via MulDiv(18, Screen.PixelsPerInch, 96) so frequency ruler is tall
  enough to fit text at 125%/150% DPI
- LayoutTopVfoBlock: use BtnTopVfoASelect.Width / BtnTopVfoBSelect.Width
  instead of constant VFO_BTN_W so FreqDisp doesn't clip the A/TX buttons

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 19:13:07 +03:00
ew8bakandClaude Sonnet 4.6 66608da938 Redesign left panel layout: TX block on top, dynamic Band panel height
- Move PanelTX above PanelBands; DRV slider now below MOX/TUN buttons
- MOX/TUN resized to match standard button style (54×24, BTN_SM)
- PanelBands default height reduced to 74 (no reserved XVTR space)
- RebuildXvtrButtons dynamically resizes PanelBands (+27px per XVTR row)
  and calls RelayoutBelowBands to reposition Mode/Filter/CTUN/RX panels

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 15:15:10 +03:00
ew8bakandClaude Sonnet 4.6 88ceee824d Move WF AGC/NF from main form buttons to Settings → Waterfall checkboxes
Replaced the WF AGC and WF NF toggle buttons in the main panel with
"Waterfall AGC" and "Waterfall NF" checkboxes in the Settings form
Waterfall tab (AGC & Noise Floor group). Settings are global, defaults
remain AGC=on, NF=off.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 14:59:10 +03:00
ew8bakandClaude Sonnet 4.6 e8561dcc18 TX meter: add minor tick marks between main scale labels
Power bar: minor ticks every 5% (between 0/25/50/75/100% main marks)
SWR bar: minor ticks at integer values 2,3,4,6,7,8,9 (between 1/2.5/5/10)
Applied to both desktop (SpectrumView) and web (paintTXMeter JS)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 14:27:00 +03:00
ew8bakandClaude Sonnet 4.6 76e5c5514a Web TX meter: show power/SWR in S-meter canvas during transmit
- WebServer: add fwd_w, swr, pa_max_power to state JSON and PushSpectrum
- MainForm: pass FLastFwdW, FLastSWR, FPAMaxPower to PushSpectrum
- Web UI: paintSM switches to paintTXMeter when transmitting/tuning;
  same layout as desktop — two sub-bars at 44-58% height, power ticks
  above, SWR ticks below, SWR>2.5 turns red with "SWR High" label

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 14:14:52 +03:00
ew8bakandClaude Sonnet 4.6 96b0ccb2c7 TX meter: show power and SWR in S-meter panel during transmit
- S-meter panel switches to TX mode when transmitting: single bar splits
  into two sub-bars (power top, SWR bottom) at the same position/size
- Power bar: 0..PAMaxPower W, green; SWR bar: 1..10, amber/red past 2.5
- SWR > 2.5: red border, red label, "SWR High" warning text
- Remove PWR/SWR bars and labels from TX panel (left column)
- Remove FWD/SWR from status bar; remove frequency from RUNNING status

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 14:10:04 +03:00
ew8bakandClaude Sonnet 4.6 efc21b92e6 Add configurable VFO frequency range with GHz support
- Settings > Display: new "VFO Display" control to select max frequency
  range (999 MHz / 9.999 GHz / 99.999 GHz), persisted as freq_mhz_digits
- FreqDisplay: extend digit map [0..10] to support up to 11 digit positions;
  keyboard navigation adapts to MinMhzDigits dynamically
- MainForm/LayoutTopVfoBlock: VFO panel width scales automatically with
  selected digit count using dynamic text measurement
- Web VFO: fix broken HTML (class attr not closed before data-s — wheel and
  hover were completely non-functional); rewrite fmtVfo to use variable MHz
  digit count synced from server state; fix missing </span> for .vfo-hz
- WebServer: publish freq_mhz_digits in state JSON; updated from
  ApplyFreqMhzDigits so desktop and web stay in sync
- Fix Int32 overflow on frequencies above ~2.15 GHz: CATEngine.Pad V param
  Int64, FormatFreq/FormatFreqSV Mhz var Int64 (Mhz*1000000 overflowed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 13:13:52 +03:00
ew8bak 5ac7ddc976 Match web S-meter to desktop style 2026-05-14 21:28:38 +03:00
ew8bak 4164097893 Improve mobile web remote layout 2026-05-14 21:17:54 +03:00
ew8bak bf9f1f86e0 Polish transverter settings layout 2026-05-14 21:01:33 +03:00
ew8bak 020b9422e0 add trancverter 2026-05-14 20:24:50 +03:00
ew8bak aea9f02df8 add Alex setup 2026-05-14 18:52:50 +03:00
ew8bak ec596bb0c8 fix connect 2026-05-11 18:57:26 +03:00
ew8bakandClaude Sonnet 4.6 604fd836ba fix TUN tone frequency sign for LSB/CWL modes
gen1 (TXA PostGen) sits after all modulators and the bandpass filter,
so a positive frequency always produces a tone above the carrier.
For LSB and CWL the tone must appear below the carrier — negate the
frequency for those modes. Also re-apply the tone when mode is switched
while TUN is active.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 17:02:43 +03:00
ew8bakandClaude Sonnet 4.6 7a0b778114 fix Windows locale: force decimal dot in JSON state message
Format() used the system locale decimal separator, so on Russian/Eastern
European Windows smeter_dbm and float fields got commas ("−87,5"), producing
invalid JSON that JS silently dropped — breaking S-meter and frequency display.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-10 16:43:34 +03:00
ew8bakandClaude Sonnet 4.6 2ab90e8855 add browser mic TX: Opus-encoded mic audio from web client to WDSP TX chain
- Browser: AudioWorklet accumulates 960-sample frames, AudioEncoder encodes
  to Opus, sends binary WS frame 'M' + raw Opus packet
- Server: opcode $02 handler decodes Opus via libopus, calls OnWebMic callback
- MainForm: WebOnMic converts PSingle→Double, pushes to PushTXMicSamplesD;
  ApplyMOX switches mic source to txmsWeb when web client active, restores on TX-off
- WDSPEngine: added txmsWeb to TTXMicSource enum

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 21:49:51 +03:00
ew8bakandClaude Sonnet 4.6 3d25f837af fix WebSocket deadlock on slow client + mobile TX controls visibility
Deadlock: BroadcastBinary held FClientLock during blocking SockSend;
slow/stalled client caused Stop() to wait forever. Fix: set SO_SNDTIMEO=1s
on each accepted socket so SockSend returns error instead of hanging,
mark client wsClosed on send failure so subsequent ticks skip it.

Mobile: move TONE/TX-slider/MOX to front of toolbar via CSS order so
they are immediately visible without horizontal scroll on phones.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 16:39:43 +03:00
ew8bakandClaude Sonnet 4.6 9662d3d090 web: red filter passband overlay during TX/TUN
Change filter passband fill from blue/white to semi-transparent red
on both spectrum and waterfall when transmitting or tuning, matching
the desktop behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 16:16:59 +03:00
ew8bakandClaude Sonnet 4.6 22e01a6e3f fix web TX spectrum position in CTUN mode
Add 'dup' field to state JSON (FDisplayDuplex). In CTUN+non-DUP TX,
use vfo_a_hz as spectrum center so the TX signal renders at the VFO
position instead of the display center. In CTUN+DUP TX, keep center_hz
so the RX spectrum stays correctly positioned at the filter.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 16:15:34 +03:00
ew8bakandClaude Sonnet 4.6 9ae77ddeb4 fix web wheel: filter slides smoothly without passing through center
Track wheelActiveTs on each wheel tick; suppress server center_hz
overwrites for 300ms after last wheel event so localCenter stays at
the current VFO position instead of snapping back to screen center.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 16:02:56 +03:00
ew8bakandClaude Sonnet 4.6 0e738e1967 web: fix filter passband position on click and VFO wheel tuning
Click on spectrum/waterfall no longer sets localCenter immediately.
The filter passband now appears exactly at the clicked pixel instead of
jumping to screen center. Server's center_hz (arrives ~200ms later)
naturally re-centers the display once fresh spectrum data is ready.

VFO display wheel (vDispA/vDispB) now updates localCenter when tuning
the active VFO. Previously localCenter lagged behind, causing applyState
to teleport the filter back to center every 200ms (the "passes through
center" oscillation).

Spectrum canvas wheel (doWheel) is unchanged: user expects the spectrum
to scroll when wheel-scrolling over it, filter stays at center — correct.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 15:12:52 +03:00
ew8bakandClaude Sonnet 4.6 154b6eccba web: fix A=B/SWAP VFO ops, wire attenuator, TUN button, FNP filter overlay
- Add freq_a command: sets VFO A regardless of active VFO; fixes A=B and
  SWAP when VFO B is active (prev. sent freq_b which overwrote wrong VFO)
- Add pend("freq") to B=A / A=B / SWAP to guard local display during round-trip
- RX step attenuator: HPSDRNetwork.SetStepAtten → bytes 1442/1443 in HP packet;
  WebServer attn command; MainForm FAtten + SyncWebAttn; attSel.onchange in JS
- TUN mode: set_tun WebSocket command wired to ApplyTUN(); toneBtn toggles
  with on/off highlight and pending protection; tuning field in state JSON
- FNP button opens semi-transparent filter overlay (10 buttons, 5×2 grid)
  with mode-appropriate widths (SSB/CW/AM/FM); active filter highlighted;
  cur.filter_bw updated immediately on click so passband redraws within 50ms

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-09 15:04:23 +03:00
ew8bakandClaude Opus 4.7 9f208006aa fix RX leak after TX→RX: drop IQ during TX in non-DUP, Windows post-TX hold
В non-DUP при MOX/TUN на возврате слышен и виден на водопаде хвост
своего сигнала. Во время TX RX-IQ оседал в RXA pipeline / FFT-истории
RX-анализатора и «выстреливал» при открытии гейта.

  - WDSPEngine: KeepRXDuringTX (DUP-флаг). В non-DUP TX PushIQItemToDSP
    дропает пакеты на входе DSP-потока — RXA и анализатор не кормятся.
  - Windows-only post-TX hold (250 мс): дропаем И входящие RX-IQ, И аудио
    в окне после MOX-off, чтобы скрыть «хвост» от FPGA TX-buffer/PA
    slew-down радио. На Linux код-путь не активируется (буфер OS мелкий).
  - Network: ClearDUCIQQueue + IsTransmitting guard в DUC sender thread,
    чтобы недопереданные TX-IQ пакеты не уходили после MOX-off.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 13:39:45 +03:00
ew8bak 28859d3e16 fix flush 2026-05-07 22:49:52 +03:00
ew8bak 6067aae3dc Fix DUC IQ pacing for TX tune 2026-05-07 22:42:13 +03:00
ew8bak c59c6c8bcc Revert "fix TX clicks в TUN: 1 ProcessTXBlock на тик вместо 2-3"
This reverts commit e813ada6b2.
2026-05-07 17:32:27 +03:00
ew8bakandClaude Opus 4.7 e813ada6b2 fix TX clicks в TUN: 1 ProcessTXBlock на тик вместо 2-3
Причина щелчков (особенно слышных в TUN с непрерывной несущей):
TX-поток ждал FTXMicSem с таймаутом PeriodMs (auto-reset event), а
PushTXMicSamples* сигналили семафор каждый push. PullSoundCardMic
зовётся из самого TX-потока → сем сигналится → следующий WaitFor
возвращается немедленно. Плюс bottom-check всегда фигачил silence-блок,
если Avail<BufSize (а это всегда так после inner loop).

В итоге на один реальный период радио (≈21мс @ 1024/48k):
  Wake1 (timeout): pull → voice block + silence block
  Wake2 (immediate, sem был set): pull N=0 → silence block
= 3 блока IQ × 4096 пар = 12288 пар вместо 4096. На 192k DUC это
≈585k sps вместо 192k → FIFO радио переполняется → щелчки.

Фикс:
- PushTXMicSamples* больше не сигналят семафор (TX-поток сам себя
  будил через них). Сем оставлен только для будилки на shutdown.
- TX-поток тикает строго по таймеру, ProcessedAny-флаг гарантирует
  silence-блок только когда в этом тике ни одного реального не было.

Per-tick теперь: ровно 1 блок IQ — точно соответствует темпу радио.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 10:25:16 +03:00
ew8bakandClaude Opus 4.7 617b1b840b fix TX треск: SoundCard mic не подменять тишиной + DUC packetizer с переносом хвоста
Два источника искажений при передаче с микрофона компьютера:

1. SoundCard mic путь в TX-потоке (WDSPEngine.pas) при неполном блоке
   подменял голосовой хвост в кольце тишиной. PortAudio отдаёт по 128
   сэмплов, в кольце часто < FAudioBufSize → ProcessTXBlock уходил в
   else-ветку и слал блок нулей, оставляя голос на следующий тик.
   Результат: чередование «голос/тишина» = треск ≈50–100 Гц.
   Теперь подмена тишиной только при Avail=0; иначе ждём следующий тик.
   Добавлен PushTXMicSamplesD — батч-пуш с одной будилкой семафора.

2. DUC IQ packetizer (MainForm.pas/OnTXIQReady) добивал последний
   неполный пакет нулями. FTXOutBufSize не кратен 240 (4096 mod 240=16),
   из-за чего в каждом TX-блоке возникал провал ≈1.16 мс каждые ≈21 мс
   ≈ 47 Гц гул. Теперь хвост переносится в следующий вызов через
   FDUCPendingI/Q/Count; шлются только полные пакеты по 240 пар.

Дополнительно: ScaleIQ24 клампит результат в [-2^23, 2^23-1] чтобы
пики от EQ/компрессора (V чуть >1.0) не оборачивались через 24-bit
wrap → щелчки на громких сэмплах.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-07 10:06:59 +03:00
ew8bak 9bf21f6971 fix TX meter readout: правильная SWR-формула + EMA + троттлинг UI
- SWR: было 1+sqrt(Pr/Pf) — теперь (1+ρ)/(1-ρ). Считается только при
  FwdW>=1W и HPS_PTT=1, иначе 1.0. Cap 9.9.
- На RX FwdW=0 (ADC даёт шум).
- EMA-сглаживание (α=0.30/0.20/0.05) в DoUpdateStatus на UI-потоке.
- LblFwdPwr/LblSWRVal и StatusBar Supply/FWD/SWR обновляются из
  MeterTimerTick (10 Гц), а не на rate HP Status (~150/с).
- PbFwdPower/PbSWR теперь Invalidate в таймере — бары двигаются.
2026-05-06 19:34:57 +03:00
ew8bak 006cf772b8 TUN button — Thetis-style тон через WDSP PostGen
- BtnTUN рядом с MOX. Включает SetTXAPostGenRun(TXA, 1) с тоном
  (mode=0, mag=1.0, freq из настроек) и активирует MOX. PTT/HW
  игнорируются во время tune.
- Drive в режиме TUN использует FTXSettings.TUNLevel вместо слайдера,
  per-band калибровка FPABandCal применяется одинаково.
- Settings → Transmit → Tune (TUN): TUNLevel 0..100% (def 10),
  TUNFreq 100..5000 Hz (def 750). Live-обновление во время tune.
2026-05-06 19:16:27 +03:00
ew8bak 88687b4e70 DUP (display duplex) + ATT on TX
- DUP: локальный режим отображения, при TX данные RX1, поверх рисуется
  TX-фильтр. Кнопка на левой панели рядом с CTUN. Аппаратной командой
  не является. Отдельный SetDisplaySourceTX в WDSPEngine, разделение
  TXMode (data) и TXOverlay (filter band) в SpectrumView.
- ATT on TX: 0..31 dB, default 31 (Thetis-style). UI на вкладке Transmit
  в группе Microphone. Передаётся в DUC Specific bytes 57/58/59
  (StepAtten0/1/2). Перепосылается при изменении.
2026-05-06 15:51:33 +03:00
ew8bakandClaude Opus 4.7 96d7e0c759 TX: фиксированный sample rate, per-device grid, CTUN-aware overlay, alpha-blend filter bands
Декаплинг TX от RX sample rate (как в Thetis):
- WDSPEngine.pas: константа TX_SAMPLE_RATE=192000, поля FTXSampleRate/FTXOutBufSize.
  TXA OpenChannel теперь использует FTXSampleRate как out_rate, TX-анализатор
  через SetDisplaySampleRate(TX_DISP_ID, FTXSampleRate). ProcessTXBlock работает
  с FTXOutBufSize вместо FBufSize. Public TXSampleRate для MainForm.
- MainForm.SendDUCSpecificFromSettings: DUC0Rate теперь берётся из
  FDSPEngine.TXSampleRate, а не из RX-настроек — TX всегда 192k независимо от
  выбранного RX-rate (48/96/192/384k).

DUC Specific cache + keepalive resend (HPSDRNetwork.pas):
- FCachedDUCSpec/FCachedDUCValid параллельно DDC-кэшу.
- KeepAlive thread в первые 5s после Run=1 переотправляет и DDC, и DUC
  Specific — устраняет гонку, когда DUC настройки терялись железом.
- Disconnect сбрасывает оба valid-флага.

Per-device TX grid settings (Thetis-style):
- Settings.pas: TXSpecRefLevel/TXSpecRange/TXSpecGridStep в TTXSettings
  (defaults 0.0/80.0/10.0). LoadTX/SaveTX — ключи tx_spec_ref_level/range/grid_step.
- SettingsForm.pas: новая группа \"TX Grid\" во вкладке Transmit
  (RefLevel edit, Range edit, GridStep combo). CollectTXFromUI читает значения,
  LoadTXSettings заполняет UI.
- MainForm.pas: поля FTXSpecRefLevel/Range/GridStep, ApplySpecViewGridFromState
  пушит в FSpecView либо TX, либо RX параметры в зависимости от FTransmitting.
  ApplyGridParams (RX-путь) уважает FTransmitting и не перебивает TX-grid.
  OnTXSettingsChange при активном TX моментально применяет новый grid.

TX-aware spectrum/waterfall с CTUN-выравниванием (SpectrumView.pas):
- Поля FTXMode/FTXFreq/FTXSpanHz/FTXVfoIndex. TXSpanHz=192000 при создании.
- DrawSpectrum/DrawWaterfall в FTXMode мапят данные TX-анализатора (192k вокруг
  FTXFreq) в RX-координаты FCenterFreq/FSpanHz. Формула:
    freq = FCenterFreq - FSpanHz/2 + x*FSpanHz/W
    idx  = (freq-FTXFreq + TXSpanHz/2)/TXSpanHz * (SrcCount-1)
  Вне диапазона — спектр уходит в -200 dB; водопад копирует пиксель из
  предыдущей строки (FWfPixels[X+W]) — вместо чёрной полосы продолжает
  скроллиться старая RX-картинка.
- Эффект: при CTUN ON TX-сигнал рисуется на полосе фильтра (на VFO), а не в
  центре. При RX rate ≠ 192k частотная сетка совпадает между RX и TX
  автоматически (ruler всегда в RX-координатах).
- MainForm.SyncSpecViewFreq/ApplyMOX обновляют TXFreq/TXVfoIndex/TXMode при
  каждом PTT и смене VFO; учитывается split (FSplitTxB → TXVfoIndex=1).

Alpha-blended filter bands (визуальный feedback TX/RX):
- SpectrumView: PixelFormat:=pf32bit, процедура BlendBand через ScanLine[Y]
  внутри BeginUpdate/EndUpdate. Альфа-смешение по формуле
  (a*src + (255-a)*dst) / 255 для каждого канала BGR.
- В FTXMode полоса фильтра становится полупрозрачно красной. Если split
  (FTXVfoIndex<>FActiveVfo): на RX-частоте полоса зелёная, на TX-частоте —
  красная (CalcFilterBandX вычисляет границы для произвольной VFO-freq).
- При FTXMode=False — старое поведение (сплошная заливка SpecFilter).

Build: lazbuild --ws=qt6 ewsdr.lpi — clean, 0 errors.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 14:17:49 +03:00
ew8bakandClaude Opus 4.7 ce97ee486c WIP: TX implementation — per-device settings, separate analyzer, sound-card mic
- Settings: TTXSettings record + LoadTX/SaveTX, JSON section "tx" per MAC
- WDSPEngine: separate TX_DISP_ID analyzer with own FFT/Window/Det/Avg
  parameters, ApplyTXAnalyzerSettings + setters
- WDSPEngine: full TX chain setters (Filter/Compressor/Leveler/ALC/
  PhaseRot/EQ/AMCarrier/FM/CTCSS) + ApplyTXChainSettings
- WDSPEngine: ProcessTXBlock now feeds TX analyzer in DISPLAY_BLOCK_SIZE
  chunks (was passing whole FTXOut → analyzer ignored most of it)
- WDSPEngine: ActiveDisplayID switches RX/TX in UpdateSpectrum
- WDSPEngine: RX audio muted while TX active to avoid local feedback
- WDSPEngine: default EQ frequencies in Create (zero freqs broke TX chain)
- WDSPEngine: PushTXMicSampleD + OnPullMicSamples for sound-card path
- AudioInput: Available counter for non-blocking pull
- MainForm: PullSoundCardMic, BuildMicLineSelectByte, SendDUCSpecific
  with mic bias/boost/line/PTT bits, OnTXSettingsChange
- MainForm: auto-switch MicSource on TX device select, TX diagnostic
  in StatusBar panel [5]
- SettingsForm: new Transmit nav page with Microphone, Filter, Dynamic
  processing, EQ, AM/FM/CTCSS, TX Display sections

NOT YET WORKING: sound-card mic produces ring activity but signal still
not visible on TX spectrum/waterfall — needs further investigation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 08:06:58 +03:00
ew8bakandClaude Sonnet 4.6 fa38e433e1 fix waterfall init color to match surrounding panel
Empty waterfall now fills with FTheme.Panel (same color as PanelRight)
instead of FTheme.BG, so there's no visible seam before stream starts.
Correct TColor→BGRA conversion (R/B swap) applied.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 21:48:12 +03:00
ew8bakandClaude Sonnet 4.6 d5000ac99f light theme: waterfall palette + VFO hover colors + global theme fix
- SpectrumView: WaterfallLightTheme() — кремовый→зелень→бирюза→индиго
- FreqDisplay: ColorHoverBG свойство, убран хардкод фона hover
- AppTheme: FreqHover/FreqHoverBG/FreqDimDot для обеих тем
- Settings: SaveTheme/LoadTheme в корневой секции preferences
- MainForm: тема загружается при старте, сохраняется при изменении

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:21:07 +03:00
ew8bakandClaude Sonnet 4.6 eaece17940 fix VFO hover colors for light theme
FreqDisplay: добавлено свойство ColorHoverBG вместо хардкода $182838
AppTheme: FreqHover, FreqHoverBG, FreqDimDot для обеих тем
UpdateVfoDisplay: выставляет hover-цвета из текущей темы

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:18:29 +03:00
ew8bakandClaude Sonnet 4.6 d9a2157719 add light/dark theme with global persistence
- AppTheme.pas: новый файл, TAppTheme record + DarkTheme()/LightTheme()
- FlatSlider: цвета через SetThemeColors вместо хардкода
- SpectrumView: все цвета из TAppTheme (SetTheme)
- SettingsForm: ApplyTheme(T) с рекурсивным обходом контролов
- DeviceForm: SetTheme(T) — перекраска всех элементов включая TEdit
- Settings: SaveTheme/LoadTheme в корневой секции preferences (не привязано к устройству)
- MainForm: тема загружается при старте, сохраняется при изменении

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 19:00:45 +03:00
ew8bak f89b15730e add FlatSlider 2026-05-02 13:52:05 +03:00
ew8bak 0480c73f3f fix build on windows 2026-05-02 13:39:46 +03:00
ew8bak e9d6b70de9 fix 2026-04-30 10:47:11 +03:00
ew8bak fdc48266eb vfo center 2026-04-30 10:37:11 +03:00
ew8bak ece5a70041 new layout 2026-04-30 10:24:10 +03:00
ew8bak 1b2fbfe2c8 Stabilize top VFO frequency spacing 2026-04-28 22:22:31 +03:00
ew8bak 37de08ec82 Align top VFO frequency displays 2026-04-28 22:13:25 +03:00
ew8bak 5befe50d37 Refine top VFO layout 2026-04-28 22:10:38 +03:00
ew8bak 634b53ea54 Move VFO A to top layout 2026-04-28 21:51:29 +03:00
ew8bak d70c4a96ae Fix S-meter top layout 2026-04-28 21:42:12 +03:00