Skip to content

Staging#706

Merged
accius merged 71 commits intomainfrom
Staging
Mar 10, 2026
Merged

Staging#706
accius merged 71 commits intomainfrom
Staging

Conversation

@accius
Copy link
Copy Markdown
Owner

@accius accius commented Mar 10, 2026

What does this PR do?

Type of change

  • Bug fix
  • New feature
  • Performance improvement
  • Refactor / code cleanup
  • Documentation
  • Translation
  • Map layer plugin

How to test

Checklist

  • App loads without console errors
  • Tested in Dark, Light, and Retro themes
  • Responsive at different screen sizes (desktop + mobile)
  • If touching server.js: caches have TTLs and size caps (we serve 2,000+ concurrent users)
  • If adding an API route: includes caching and error handling
  • If adding a panel: wired into Modern, Classic, and Dockable layouts
  • No hardcoded colors — uses CSS variables (var(--accent-cyan), etc.)
  • No .bak, .old, console.log debug lines, or test scripts included

Screenshots (if visual change)

DigitalFeonix and others added 30 commits March 3, 2026 00:35
- converts incoming timestamp from nanoseconds to milliseconds
- adjusts displays to use timestamp instead of age
- removes the now unused age from strike objects
- adjust time limit to a constant 30 minutes to match panel text

The memory imposed limit should be on the size of the array, not the age.
Integrates TCI (Transceiver Control Interface) as a first-class rig-bridge
plugin, enabling direct WebSocket connection to SDR applications such as
Thetis (Hermes Lite 2 / ANAN), ExpertSDR (SunSDR2), and SmartSDR (Flex).

## New plugin: rig-bridge/plugins/tci.js

- Ported TCI protocol from rig-listener, restructured as a plugin descriptor
- Push-based — no polling; frequency, mode, PTT and filter width arrive
  automatically after sending `start;`
- Supports: vfo, modulation, trx, rx_filter_band messages
- Full TCI_MODES / TCI_MODES_REV maps for all 12 TCI modulation types
- Auto-reconnects every 5 s on connection drop
- setFreq / setMode / setPTT send correct TCI commands
- WebSocket resolved via require('ws') with fallback to globalThis.WebSocket
  so the plugin works both with the ws npm package and Node 21+ built-in WS
- All event bindings use addEventListener (not .on()) — avoids the
  "tciSocket.on is not a function" crash when running under Node 21+ without
  the ws npm package (W3C EventTarget has no EventEmitter .on() method)

## Config (rig-bridge/core/config.js)

- Added tci section to DEFAULT_CONFIG: host, port (40001), trx (0), vfo (0)
- Updated radio.type comment to include 'tci'
- Extended loadConfig() merge to include tci section

## Registry (rig-bridge/core/plugin-registry.js)

- Added 'tci' to the registerBuiltins() plugin loop

## Web config UI (rig-bridge/core/server.js)

- Added "SDR Radios (TCI)" optgroup with TCI option to the radio type dropdown
- Added TCI form section: host, port (min 1 / max 65535), TRX index
  (min 0 / max 7), VFO index (min 0 / max 1)
- onTypeChange() toggles .tci-opts.show to show/hide the TCI section
- populateForm() loads tci config values into TCI fields
- saveAndConnect() collects TCI fields with validation:
  - host cannot be empty
  - port must be 1–65535
  - trx/vfo clamped to 0 minimum via Math.max(0, ...)
- POST /api/config merges newConfig.tci into config.tci before reconnect

## Dependencies (rig-bridge/package.json)

- Added ws ^8.14.2 (was missing; rig-bridge previously had no WebSocket dep)

## Version bump

- package.json and rig-bridge.js: 1.1.0 → 1.2.0

## Documentation (rig-bridge/README.md)

- Added "SDR Radios via TCI (WebSocket)" supported-radios table
- Added full TCI setup section: per-app enable instructions, config JSON
  example, field reference table, expected log output
- Added 3 TCI troubleshooting rows (connection refused, no freq updates,
  remote SDR host)
- Updated project structure tree to include plugins/tci.js

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add +/− buttons on the right side of the DXNewsTicker banner that let
users resize the scrolling text in real time. Button and bar height scale
proportionally with the text. The chosen scale (0.7×–2.0×) is persisted
in localStorage so it survives page reloads.

- Extract base font-size constants (BASE_LABEL_SIZE, BASE_TEXT_SIZE,
  BASE_HEIGHT) and multiply by textScale throughout the component
- Add textScale to the animation-duration useEffect deps so scroll speed
  recalculates after a resize
- Add i18n keys app.dxNews.increaseTextSize / decreaseTextSize to all
  15 language files (English fallback for non-English locales)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…able, but "spot.ref - spot.name" in the title (which is displayed in mouse-over).
Add a hot key (/) to toggle the DE and DX labels
docs: clarify contributor setup and staging PR workflow, Fixes #663
Add TCI/SDR plugin to rig-bridge + bump to v1.2.0
feat: add inline text size controls to DX News ticker
[BUG 660] POTA & SOTA panels truncate information
Add DXCC target selector for DX Target panel
lightning to work with new draggable panels; refactored muf map to use
theme colors and align with code in other layers
.

Found an issue with the panel header not using the correct cursors due
to multiple elements being set as drag handles, fixed issue between
addMinimizeToggle.js and makeDraggable.js conflicts, moved styles to
main.css as appropriate and replaced hard-coded colors
Feature 634 - Map Widgets Alignment
- Warn explicitly when ws npm package is missing and native WebSocket fallback activates
- Log which WebSocket implementation (ws npm vs native) is selected at startup
- Disable perMessageDeflate on ws connections for compatibility with non-standard TCI servers (e.g. Thetis)
- Add specific error branch for Sec-WebSocket-Accept handshake failures with actionable guidance

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… as otehr code (eg PSKFilterManager) relies on it.
… error

electron-winstaller's postinstall tries to copy vendor/7z-arm.exe on ARM
Linux, which fails because the file doesn't exist for Linux targets. Added
--ignore-scripts to npm install and ELECTRON_SKIP_BINARY_DOWNLOAD=1 to
prevent these Windows-only lifecycle hooks from running on Raspberry Pi.
Also added npm prune --omit=dev after build to reclaim ~500 MB of disk space.

Fixes: #<electron-winstaller ENOENT on Bullseye/ARM>

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
[BUG 673] PSKReporter Always Uses FN31 as Grid Square
Improve TCI plugin diagnostics and Thetis compatibility
alanhargreaves and others added 29 commits March 8, 2026 22:29
…than just km.

All comparisons are still done in km, but we display in the appropriate unit.

I also had to update the panel header to list the strike radius in both units, in order to have this fit, i had to override the font size down to 11px.
Enables the WSJT-X relay to join a UDP multicast group so multiple
applications on the same machine or LAN can receive WSJT-X packets
simultaneously, rather than competing for a single unicast socket.

Changes:
- core/config.js: Add three new defaults to DEFAULT_CONFIG.wsjtxRelay:
    multicast (bool, default false), multicastGroup ('224.0.0.1'),
    multicastInterface ('' = OS picks NIC). Deep-merge in loadConfig()
    picks these up automatically with no structural changes.

- plugins/wsjtx-relay.js:
    · Derive mcEnabled / mcGroup / mcInterface constants at create() time
    · In the 'listening' handler, call socket.addMembership() after bind
      completes (the only valid moment per the Node.js dgram API).
      Wrapped in try/catch — failure logs a clear error and degrades
      gracefully to unicast; the plugin keeps running.
    · In disconnect(), call socket.dropMembership() before socket.close()
      to cleanly release the IGMP membership. Failure is non-fatal and
      logged but does not block socket teardown.
    · getStatus() now exposes multicast and multicastGroup for the
      status API and any future UI status display.

- core/server.js (Integrations tab UI):
    · Multicast checkbox with onchange toggle handler
    · Collapsible wsjtxMulticastOpts div containing Multicast Group and
      Multicast Interface text inputs, shown only when checkbox is checked
    · populateIntegrations() populates all three new fields on load
    · saveIntegrations() collects and POSTs the new values; the existing
      POST /api/config handler merges and restarts the plugin automatically

- rig-bridge-config.example.json: Add multicast, multicastGroup,
  multicastInterface fields (all at their default/off values)

- README.md: Extend wsjtxRelay config JSON example and field table with
  the three new options; add 'Multicast Mode' subsection explaining when
  and how to use it (WSJT-X UDP server change, multicastInterface for
  multi-homed systems, link-local scope note); add troubleshooting row.

Feature is strictly opt-in (multicast: false by default) — zero impact
on existing unicast configurations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
[BUG 685] Add full multicast support for WSJT-X, so that multiple apps can listen
…-arm

Fix/setup pi electron winstaller arm
Feature/tci rig bridge plugin wsjtx multicast
a new left border tabset using FlexLayout. This panel can collapse.
The lock layout control can not be deleted from the border space.
removed styling from JSX, added selectors for border overrides in CSS
added update for stored layout data to add border container,
set the lock layout to not be removable, removed empty div
class to the lock button, added locked state styling to the button
[FEATURE] Relocate Layout Lock Button so it's not consuming vertical screen space
Add optional fixed DX cluster spotter coordinates via env vars
[BUG 695] Lightning layer is not using settable distance units
security fixes
@accius accius merged commit a5ed008 into main Mar 10, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants