Commit Graph
100 Commits
Author SHA1 Message Date
ew8bakandClaude Sonnet 4.6 ebca3b4137 Fix TX mic DUC starvation: add 512-sample staging buffer
Opus decodes 960 samples per frame; the TX DSP thread consumes
512-sample blocks. 960 mod 512 = 448, so the ring always kept a
sub-threshold tail, causing TTXDSPThread to skip ticks and starve
the DUC hardware every ~20 ms.

FlushMicToCallback accumulates samples in FMicStageBuf and calls
FOnWebMic only when a full 512-sample block is ready. The remainder
stays in the buffer until the next Opus frame arrives. This ensures
FTXMicRing always receives data in multiples of 512, eliminating
the 0 < Avail < 512 dead-zone entirely.

FMicStageLen is reset together with FMicPreRollPos on new TX session
to prevent stale samples from a previous session mixing in.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:51:21 +03:00
ew8bakandClaude Sonnet 4.6 cd9e504e8f Optimize web audio mic path: remove redundant copy and heap alloc
WebOnMic: drop intermediate Singles[] array, read PSingle directly.
PushAudio: replace per-frame SetLength/array of Byte with pre-allocated
FWsAudioBuf field — eliminates heap allocation from the DSP thread.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:31:48 +03:00
ew8bak 960cadd4b0 add alert ADC overload 2026-05-21 15:42:59 +03:00
ew8bak b5103bf474 add alert overlay 2026-05-21 15:38:56 +03:00
ew8bak 5800e9ec35 Improve radio status bar 2026-05-21 15:19:43 +03:00
ew8bak 343735389e Polish device dialog layout 2026-05-21 14:23:08 +03:00
ew8bak a0019493b6 Add compact web layout for medium screens 2026-05-20 20:56:33 +03:00
ew8bak 1b39bc6746 Improve settings layout and TX equalizer 2026-05-20 14:35:53 +03:00
ew8bak ad02fa3f77 fix .gitignore 2026-05-20 10:01:41 +03:00
ew8bakandClaude Sonnet 4.6 6932022177 Mic settings: auto PTT source, Mic In/Line In, Line In gain, Tip/Ring
- Remove manual "Mic Source" (Radio/SoundCard) setting from UI and storage;
  source is now determined automatically in ApplyMOX: HW PTT → txmsRadio,
  MOX button/CAT → txmsSoundCard if audio device configured, else txmsRadio
- Replace "Line in" checkbox with "Mic jack" combo (Mic In / Line In);
  when Line In is selected, Mic Boost is hidden and Line In Gain (-34.5..+12 dB,
  step 1.5 dB) is shown and sent as DUC Specific byte 51
- Add Tip/Ring connector selector (Orion/OrionMkII boards 4/5 only, byte 50 bit 3);
  control is hidden for other board types
- Fix byte 50 bit 1 (Mic Boost) suppressed when Line In is active
- Fix byte 51 comment polarity (was reversed: 0=+12dB; correct: 0=-34.5dB)
- New JSON fields: mic_line_in, mic_tip_ring, line_in_gain_db; mic_source removed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 20:32:19 +03:00
ew8bak 1016fa7a05 fix HW PTT release 2026-05-19 17:11:10 +03:00
ew8bakandClaude Opus 4.7 922d5e20b2 Web TX mic: gain slider, jitter buffer, Opus PLC, user-gesture fixes
WebPageHtml.pas:
- Add MIC gain slider (0..300%) with localStorage persistence; inserts
  Web Audio GainNode between MediaStreamSource and Opus encoder.
- Disable autoGainControl in getUserMedia so the manual gain actually works.
- Pre-create+resume AudioContext synchronously inside the MOX click handler
  (before any await) so user-gesture context isn't lost during getUserMedia
  on macOS/Android.
- Call startTXMic() from the click handler too — the call from applyState
  runs in a WS-message context which mobile browsers reject.
- Re-resume txMicACtx on every MOX→TX (Android can suspend it between
  cycles) and reuse the existing context instead of recreating per session.
- stopTXMic now a no-op: the previous flag reset created a race that spun
  up duplicate pipelines on rapid RX→TX toggles.

WebServer.pas:
- Pre-roll cushion: hold first 40ms of decoded mic samples before flushing
  to FTXMicRing, raising steady-state ring depth from ~9ms to ~50ms so
  WiFi jitter no longer drains the buffer into silence ("robotic" voice).
- Wall-clock-based Opus PLC: synthesize up to 5 frames via
  opus_decode_float(NULL) when packet gap exceeds expected 20ms cadence.
- A gap > 200ms is treated as a new TX session: pre-roll resets, PLC
  is skipped (no useful decoder state).
- Local (non-web) mic paths are untouched — they bypass WebOnMic entirely.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-19 16:59:42 +03:00
ew8bakandClaude Sonnet 4.6 d8050576a9 Add supply current display for Orion MkII (Board 5)
UserADC1 (bytes 55-56) carries current sensor data on the ANAN-8000DLE.
Formula from Thetis: amps = ((adc/4095 * 5000) - 360) / 120 (Voff=360mV,
Sens=120mV/A). Status bar now shows "Supply: 13.8V / 2.3A | PLL OK"
when current is available.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 12:29:45 +03:00
ew8bakandClaude Sonnet 4.6 d823106366 Add VHF XVTR PA calibration; fix TX drive formula and stale FDriveLevel
PA calibration per band (HF and VHF):
- Add VHFBandCal[0..7] in TGlobalSettings (saved as vhf_cal_0..7 in JSON)
- Default HF cal updated to Thetis HERMES defaults (38.8-41.3 dB per band)
- Default VHF cal = 56.2 dB (Thetis HERMES XVTR default)
- SettingsForm: second group in PA tab "VHF Calibration (Transverters)" with
  8 spinboxes VHF0..VHF7; labels dynamically show XVTR slot ButtonText
  when LoadXvtrSettings is called (e.g. "VHF0 (2m):")

TX drive formula (CalcDriveByte) rewritten to match Thetis exactly:
  drive_byte = min(sqrt(10^((10*log10(pwr_W*1000) - Cal)/10) * 0.05) / 0.8, 1.0) * 1.02 * 255
  Cal = PA gain in dB (not a percentage); matches Thetis verified output
  (Cal=63.1 + slider=100% + PAMax=100W → drive_byte=16, verified against Thetis)
  Old formula Pos/100*Cal/100*255 was wrong: treated dB gain as linear percent

Fix stale FDriveLevel not updated on band/XVTR switch:
- Startup: FCurrentBand must be set before CalcDriveByte (was reversed)
- RestoreBand: recalculate FDriveLevel before ApplyVfoA network update
- ActivateXvtrBand: recalculate after FCurrentXvtr changes
- ApplyVfoA: recalculate when VFO crosses HF band boundary
- FreqDispBChanged: same for VFO-B band changes
- ApplyMOX(True): safety recalculate at PTT engage time

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 11:49:12 +03:00
ew8bakandClaude Sonnet 4.6 203d9d0f05 Fix FM step change from web UI; add FM grid to web spectrum/ruler
Web UI: stepSel.onchange now sends fm_step command to server when in FM
mode; option values stay in Hz so tuneStep works unchanged.
WebServer: add fm_step command handler and OnFMStep callback.
MainForm: wire WebOnFMStep -> SyncWebFMStep -> SetFMStep + SaveCurrentBand.

Web spectrum/ruler: vertical FM-step grid lines in drawSpec; FM-aligned
ticks and labels in drawRuler with auto label-density (short ticks between
labeled lines, measureText-based labelMult to prevent overlap).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:52:33 +03:00
ew8bakandClaude Sonnet 4.6 7b4ea733a2 Align spectrum grid and ruler to FM tuning step
When FM mode is active, vertical grid lines and frequency labels snap to
FM channel boundaries (FM_STEP_HZ) instead of the fixed 8-division layout.
Grid and label density auto-adapt: lines thinner than 4px are thinned,
labels are spaced so they never overlap (short tick shown between labeled
lines). Grid cache invalidates on center-freq, step, or span changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:44:32 +03:00
ew8bakandClaude Sonnet 4.6 a59501f2c4 Save/restore CTun, AGC, FM step per XVTR slot; add FM step to web
- Add LastCTun, LastAGCMode, LastAGCTop to TXvtrEntry; SaveCurrentBand
  now captures all three in the XVTR branch; ActivateXvtrBand restores
  them on slot switch/startup (previously CTun was always reset to False
  and AGC was never saved/restored for XVTR)
- WebServer: expose fmstep_idx in state JSON so web clients sync the
  FM step from desktop state
- WebPageHtml: swap stepSel options to FM steps (6.25k/12.5k/20k/25k)
  when mode=FM, restore HF steps when leaving FM; syncs fmstep_idx
  from server on connect and mode change

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:27:14 +03:00
ew8bakandClaude Sonnet 4.6 c4cd8afb06 Fix XVTR/FM frequency, mode and step persistence
- Fix web spectrum scroll resetting freq to XVTR minimum (same root
  cause as desktop: hardcoded 60 MHz clamp; now delegates to server)
- Save/restore FM mode, NFM/WFM filter, squelch, CTCSS per XVTR slot
  and per HF band (CTCSSOn/ToneIdx added to TBandSettings; full state
  added to TXvtrEntry; ActivateXvtrBand restores all on slot switch)
- Fix UpdateFilterButtons always resetting NFM/WFM to default on
  mode restore; now preserves saved filter index
- Add FM Step tuning: panel with STEP toggle + 6.25/12.5/20/25 kHz
  selector (popup); mouse wheel uses selected step in FM mode;
  state saved per band and XVTR slot

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:08:11 +03:00
ew8bakandClaude Sonnet 4.6 87f449c737 Standardize filter widths per mode; fix FM web filter/deviation
- LSB/USB: 5.0k–1.0k (unchanged)
- DSB: split into own group 16k–2.4k (was sharing AM filters)
- CWL/CWU: 1.0k 800 600 500 400 250 150 100 50 25 (removed 750, added 150)
- AM/SAM: 20k–5.0k (new wider range)
- Web FNP FM: now shows NFM/FM only (11k/16k), matching desktop
- Fix SyncWebFilter: FM array out-of-bounds; FFMDeviation now set on web filter select
- VfoOverlay: DSB separated from SSB with own quick-select values

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 21:14:29 +03:00
ew8bakandClaude Sonnet 4.6 68d05657e6 Add FM mode improvements: NFM/FM filters, CTCSS, squelch; ADC and web settings
FM modulation:
- Replace 10 generic FM filter buttons with NFM (2.5kHz dev/11kHz BW) and FM
  (5.0kHz dev/16kHz BW); deviation applied to both RX and TX via WDSP
- Add FM squelch panel (SQL toggle + slider 0..100, per-band save/restore)
  with WDSP SetRXAFMSQRun/SetRXAFMSQThreshold (threshold = level/200.0)
- Add CTCSS panel with on/off toggle and custom flat-button tone picker popup
  (38 standard tones 67.0..250.3 Hz, default 67.0); tone selection and enable
  state saved per band via SetTXACTCSS*
- FM panels (SQL, CTCSS) shown only in FM mode, layout via RelayoutBelowBands
- PanelFilter height shrinks in FM mode so panels sit tight below filters
- FlatButton: handle CMTextChanged to invalidate on Caption change

ADC settings (Dither/Random):
- Add DitherEnabled/RandomEnabled to TGlobalSettings (default true)
- Pass as bitmask to ConfigureDDCs DDC Specific packet bytes 5/6
- Exposed in Settings → Advanced tab with live apply via ApplyADCSettings

Web server settings:
- Add TWebSettings (enabled, port, bind_addr, user, pass) stored globally
- WebServer: configurable port/bind IP via ParseIPv4; Reconfigure method
- Exposed in Settings → Advanced tab with live apply via ApplyWebSettings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 19:01:17 +03:00
ew8bakandClaude Sonnet 4.6 1368f249c4 Remove XVTR RF checkbox; fix XVTR Enable bit to match Thetis
XVTR RF (xvtr_rf in Thetis) is dead code — GetXVTRRF() is never called.
Remove the field, UI column, save/load from TXvtrEntry. UseDDCIn is now
always True when in XVTR mode (previous default behaviour, XVTRRF=False).

Byte 1400 bit 0 (XVTR Enable / VHF T/R relay output) now follows Thetis:
  - XVTR mode: set only when DisablePA=True (external T/R relay needed)
  - HF mode:   set when Alex.EnableXvtrHf is checked (Antenna tab)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 22:05:08 +03:00
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
ew8bakandClaude Sonnet 4.6 a5d08fe3d6 Fix supply voltage: apply PCB voltage dividers and read correct ADC source
Protocol Appendix A documents only the ADC reference voltage constant;
the PCB voltage divider must also be applied (from Thetis source):
- Boards 1-3 (Hermes/Angelia): ×(4.7+0.82)/0.82 ≈ 6.73, Vref=3.3V
- Board 5 (Orion MkII): ×(22+1)/1.1 ≈ 20.9, Vref=5.0V

For board type 5, supply voltage is measured via UserADC0 (bytes 57-58),
not the supply_volts field (bytes 49-50), matching Thetis behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 19:00:19 +03:00
ew8bak 1502e6ab83 Refactor VFO-B top panel layout 2026-04-28 16:16:51 +03:00
ew8bak 22832a1163 Rework S-meter left label zone and bar layout 2026-04-28 15:01:25 +03:00
ew8bakandClaude Sonnet 4.6 055873a43a Fix IQ data flow: send HP Run=1 before DDC/DUC Specific packets
The emulator (and real hardware) creates ddc_specific_thread (port 1025),
duc_specific_thread (port 1026), and rx_thread[0..3] (ports 1035+) only
after receiving HP Run=1. Previously ConfigureDDCs and SendDUCSpecific
were sent before SetRunAndFreq(True), so both packets arrived at closed
ports and were silently dropped — ddcenable remained -1, rx_thread slept
forever, no IQ data ever arrived, and the 5-second timeout fired Run=0.

Fix: reorder DoConnectDevice to send Run=1 first, then DDC/DUC Specific.
Also add keepalive resend of the cached DDC Specific packet every 500 ms
for the first 5 seconds after start, to handle thread-startup races on
real hardware over the network.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 13:31:39 +03:00
ew8bakandClaude Sonnet 4.6 cd0cf21876 Fix supply voltage display: correct constant per board type, hide on unsupported boards
Per Appendix A of openHPSDR Ethernet Protocol v4.3:
- Boards 1,2,3 (Hermes/Angelia): V = ADC/4095 * 3.3 (was always using this)
- Boards 4,5 (Orion/Orion MkII): V = ADC/4095 * 5.0 (was wrong, showing ~66% of real value)
- Board 0 (Atlas) has no supply voltage measurement per protocol spec
  ("not Atlas bus systems")
- Boards 6 (Hermes Lite), 10 (Saturn): constant not documented, hide Supply field

ADCToSupplyVolts now takes BoardType and returns -1.0 for unsupported boards.
DoUpdateStatus omits the Supply field when -1.0 is returned.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 22:06:27 +03:00
ew8bakandClaude Sonnet 4.6 0b4a13d444 Fix CAT TCP server Stop: eliminate up-to-5s hang on shutdown
PurgeLoop used Sleep(5000) — Stop had to wait up to 5 seconds for the
purge thread to wake before it could proceed. Fix: add TEvent FStopEvent;
Stop signals it before waiting on threads so PurgeLoop exits immediately.
Also moved client Disconnect calls before WaitFor so all sockets are
unblocked in parallel rather than sequentially.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 22:01:12 +03:00
ew8bakandClaude Sonnet 4.6 bcd045a1be Fix CAT settings: load before connect, default TCP port 19090
- Settings.pas: add root-level SaveCATSettings/LoadCATSettings so CAT
  config is stored independently of device MAC.
- MainForm.pas FormCreate: initialize CAT defaults, load from saved
  'cat' JSON section, and apply immediately after InitCATEngine — so
  SettingsForm shows correct values before the transceiver connects.
- MainForm.pas OnCATSettingsChange: always save to root 'cat' section
  (not only when device is connected) so changes persist immediately.
- Default TCP CAT port changed from 4992 to 19090 everywhere.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 21:58:49 +03:00
ew8bakandClaude Sonnet 4.6 1a264b684e Fix demo spectrum at startup and frequency mismatch after STOP
- Remove FillDemoSpectrum from FormCreate: spectrum no longer shows
  fake signal data before the transceiver is connected.
- Add SaveStartupPreview to STOP path: startup.vfo_a now matches the
  device band cache so the display is consistent before and after
  clicking START on a fresh launch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 21:52:11 +03:00
ew8bakandClaude Sonnet 4.6 e2affbb440 Fix frequency reset to 7115 MHz after start/stop or restart
Save current band and global settings in the STOP path so the next
START restores the frequency the user was on, not the hardcoded default.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 21:38:23 +03:00
ew8bakandClaude Sonnet 4.6 ee9947acde Fix AGC lines not updating on spectrum
Three params were never synced to FSpecView after FormCreate:
- WDSPReady: now set every timer tick so the draw branch (real
  WDSP thresh/hang vs. static AGCTop) is always correct
- AGCThresh/AGCHangLevel: synced from FDSPEngine after
  UpdateAGCLines in SpectrumTimerTick
- AGCTop: synced in TrkAGCChange, RestoreBand and DoConnectDevice

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 21:33:29 +03:00
ew8bakandClaude Sonnet 4.6 a149b18435 Fix ruler not updating on sample rate change
Add FRulerLastSpan to ruler cache — previously only FCenterFreq
and ActiveVfoFreq were tracked, so span changes left the ruler
showing stale frequency step marks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 18:37:02 +03:00
ew8bakandClaude Sonnet 4.6 5421e57f9c Extract spectrum/waterfall rendering into SpectrumView.pas
- New unit SpectrumView.pas (TSpectrumView): encapsulates all
  spectrum, waterfall, ruler and S-meter rendering; ~900 lines
  removed from MainForm.pas
- Fix marker bug: FMarkerActive/FMarkerX were duplicated in
  MainForm and TSpectrumView — mouse handlers now write directly
  to FSpecView, stale MainForm fields removed
- Fix filter band and ruler not following VFO: add SyncSpecViewFreq
  helper called at every draw site and at top of SpectrumTimerTick
- Remove dead code: WFALL_PALETTE (34 lines), FSplitter, LblAGC,
  LblVol, WinFirewall/IntfGraphics/FPImage from uses
- Fix pre-existing bug: SidetoneFreqLo := 600 overflowed Byte,
  replaced with Hi(600)/Lo(600)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 18:28:20 +03:00
ew8bakandClaude Sonnet 4.6 36ae140cad Add full CAT support (serial + TCP)
New units: CATEngine (Kenwood + Thetis ZZ* commands), CATSerial
(up to 4 serial ports), CATTcp (multi-client TCP server on port 4992).
MainForm wired with TCATContext callbacks reusing existing WebOn* handlers.
SettingsForm gets a new CAT tab with 4 serial port groups and TCP section.
Settings.pas extended with CAT config fields (per-device, JSON-persisted).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 21:46:19 +03:00
ew8bak 537d288e1e refactoring SettingsForm 2026-04-25 14:50:52 +03:00
ew8bak 4c48f22447 Fix waterfall BGRA color pipeline 2026-04-22 22:27:06 +03:00
ew8bak 77d380acfd fix fft, waterfall 2026-04-22 22:09:42 +03:00
ew8bak ae532a33cd start work tx 2026-03-26 22:50:55 +03:00
ew8bak 7664907b3e add settingsForm 2026-03-24 21:21:30 +03:00
ew8bak a34d25bdba fix web 2026-03-11 22:14:30 +03:00
ew8bak 4407511d56 scroll freq 2026-03-11 22:06:37 +03:00
ew8bak 8d64bba6fc fix vfo on web 2026-03-11 21:58:23 +03:00
ew8bak 443da44e40 vix vfo-a/vfo-b 2026-03-11 21:43:37 +03:00
ew8bak 99463fa22f add splitter 2026-03-11 21:18:18 +03:00
ew8bak e131af9ae5 add gradient 2026-03-09 22:14:04 +03:00
ew8bak 01de71c60f add nb nr 2026-03-09 20:55:19 +03:00
ew8bak 35472b010f struct project 2026-03-09 18:48:24 +03:00
ew8bak f216277736 samplerate button 2026-03-09 00:07:51 +03:00
ew8bak e5441be063 fix s-meter 2026-03-08 23:51:56 +03:00
ew8bak d347a26d6d fix cpu 2026-03-08 22:34:18 +03:00