chore: release v0.20.8

This commit is contained in:
2026-07-21 21:48:23 +02:00
parent 1b5b0c2e90
commit 968da5488c
15 changed files with 393 additions and 55 deletions
+13 -12
View File
@@ -43,7 +43,7 @@ import {
GetAwardDefs,
GetUIPref, GetActiveProfile, QuitApp,
ReportLiveActivity, LiveLastQSOAgeSec,
GetPGXLSettings, GetPGXLStatus, GetSPEStatus, GetACOMStatus, SPESetOperate, ACOMSetOperate,
GetPGXLSettings, GetPGXLStatus, GetSPEStatus, GetACOMStatus, SPESetOperate, ACOMSetOperate, PGXLSetOperate,
} from '../wailsjs/go/main/App';
import { Combobox } from '@/components/ui/combobox';
import { applyAwardRefs } from '@/lib/awardRefs';
@@ -5145,30 +5145,31 @@ export default function App() {
onClick={() => { setSettingsSection('rotator'); setShowSettings(true); }}
/>
{/* Amplifier chip: green = OPERATE, orange = STANDBY, red = offline.
CLICK toggles OPERATE STANDBY (SPE/ACOM; optimistic flip, the 2s
poll reconciles). The PGXL has no standby command here its chip
opens Settings instead, and shows green when connected. */}
CLICK toggles OPERATE STANDBY on every backend (PGXL included
its direct TCP link takes operate=0/1); optimistic flip, the 2s
poll reconciles. Offline click opens the settings instead. */}
{ampCfg.enabled && (() => {
const isPGXL = ampCfg.type === 'pgxl';
const name = isPGXL ? 'PGXL'
: ampCfg.type.startsWith('acom') ? `ACOM ${ampSt.model || ''}`.trim()
: `SPE ${ampSt.model || ''}`.trim();
const dot = !ampSt.connected ? 'bg-danger' : (isPGXL || ampSt.operate) ? 'bg-success' : 'bg-warning';
const state = !ampSt.connected ? (ampSt.last_error || 'offline') : (isPGXL ? (ampSt.state || 'connected') : ampSt.operate ? 'OPERATE' : 'STANDBY');
const dot = !ampSt.connected ? 'bg-danger' : ampSt.operate ? 'bg-success' : 'bg-warning';
const state = !ampSt.connected ? (ampSt.last_error || 'offline') : ampSt.operate ? 'OPERATE' : 'STANDBY';
const toggle = () => {
if (isPGXL) { setSettingsSection('pgxl'); setShowSettings(true); return; }
// Offline — nothing to command; open the settings to fix the link.
if (!ampSt.connected) { setSettingsSection('pgxl'); setShowSettings(true); return; }
const want = !ampSt.operate;
setAmpSt((s: any) => ({ ...s, operate: want }));
(ampCfg.type.startsWith('acom') ? ACOMSetOperate(want) : SPESetOperate(want)).catch(() => {});
(isPGXL ? PGXLSetOperate(want)
: ampCfg.type.startsWith('acom') ? ACOMSetOperate(want)
: SPESetOperate(want)).catch(() => {});
};
return (
<button
type="button"
disabled={!isPGXL && !ampSt.connected}
title={`${name}: ${state}${!isPGXL && ampSt.connected ? (ampSt.operate ? ' — click for STANDBY' : ' — click for OPERATE') : ''}`}
title={`${name}: ${state}${ampSt.connected ? (ampSt.operate ? ' — click for STANDBY' : ' — click for OPERATE') : ' — click for settings'}`}
onClick={toggle}
className={cn('inline-flex items-center gap-1.5 px-2 h-5 rounded border text-[11px] transition-colors',
(!isPGXL && !ampSt.connected) ? 'opacity-60 cursor-default border-border' : 'border-border hover:bg-muted cursor-pointer')}
className="inline-flex items-center gap-1.5 px-2 h-5 rounded border text-[11px] transition-colors border-border hover:bg-muted cursor-pointer"
>
<span className={cn('size-2 rounded-full', dot)} />
{name}