feat(icom): PTT and offset split at the operator's hand

The MOX and SPLIT controls lived at the bottom of the Transmit card, below
the fold on most layouts — a console whose PTT needs scrolling is not a
console. A strip under the mode row now carries the PTT and Split as
OFF/+1k/+5k/+10k, DXpedition style, on a new SetIcomSplitOffset that takes
the chosen TX offset (0 keeps the old CW/SSB convention). The mode-alignment
from the previous fix rides along on every engage.
This commit is contained in:
2026-08-30 02:15:16 +02:00
parent 392b93f089
commit f98e95fe9e
7 changed files with 59 additions and 9 deletions
+24 -1
View File
@@ -5,7 +5,7 @@ import {
IcomSetAFGain, IcomSetRFGain, IcomSetNB, IcomSetNBLevel, IcomSetNR, IcomSetNRLevel,
IcomSetANF, IcomSetAPF, IcomSetAGC, IcomSetPreamp, IcomSetAtt, IcomSetFilter,
AudioMonitorActive, AudioStartMonitor, AudioStopMonitor,
IcomSetRFPower, IcomSetMicGain, IcomSetSplit, IcomTune, IcomSetPTT,
IcomSetRFPower, IcomSetMicGain, IcomSetSplit, IcomSetSplitOffset, IcomTune, IcomSetPTT,
IcomSetScope, IcomScopeData, IcomSetScopeMode, IcomSetScopeEdges, GetCATState, SetCATFrequency, SetCATMode,
IcomSetRIT, IcomSetRITOn, IcomSetXITOn,
IcomSetAntenna, IcomSetPBTInner, IcomSetPBTOuter, IcomSetManualNotch, IcomSetNotchPos,
@@ -786,6 +786,29 @@ export function IcomPanel({ onReportRST, isNetwork = false }: { onReportRST?: (r
);
})}
</div>
{/* PTT + split, at the operator's hand under the dial — the Transmit
card lower down kept these below the fold, and a console whose PTT
needs scrolling is not a console. */}
<div className="flex items-center gap-1.5 border-t border-border/60 px-2 py-1.5">
<button type="button" onClick={toggleMox}
className={cn('flex-1 px-3 py-1.5 rounded-md text-xs font-black tracking-wider border transition-colors',
tx ? 'bg-destructive border-destructive text-destructive-foreground animate-pulse' : 'bg-card text-foreground border-border hover:bg-muted')}>
{tx ? 'TX ON' : 'PTT'}
</button>
<span className="text-[10px] font-bold uppercase tracking-wider text-muted-foreground pl-1">Split</span>
<button type="button" onClick={() => set({ split: false }, () => IcomSetSplit(false))}
className={cn('px-2 py-1.5 rounded-md text-[11px] font-bold border transition-colors',
!st.split ? 'bg-primary text-primary-foreground border-primary' : 'bg-card text-muted-foreground border-border hover:bg-muted')}>
OFF
</button>
{[1, 5, 10].map((k) => (
<button key={k} type="button" onClick={() => set({ split: true }, () => IcomSetSplitOffset(k * 1000))}
className={cn('px-2 py-1.5 rounded-md text-[11px] font-bold border transition-colors',
st.split ? 'bg-card text-foreground border-border hover:bg-muted' : 'bg-card text-muted-foreground border-border hover:bg-muted')}>
+{k}k
</button>
))}
</div>
</div>
{/* Live meters — always visible: S (RX, click → RST), Po in watts, SWR. */}
+2
View File
@@ -704,6 +704,8 @@ export function IcomSetScopeMode(arg1:boolean):Promise<void>;
export function IcomSetSplit(arg1:boolean):Promise<void>;
export function IcomSetSplitOffset(arg1:number):Promise<void>;
export function IcomSetSquelch(arg1:number):Promise<void>;
export function IcomSetVOX(arg1:boolean):Promise<void>;
+4
View File
@@ -1346,6 +1346,10 @@ export function IcomSetSplit(arg1) {
return window['go']['main']['App']['IcomSetSplit'](arg1);
}
export function IcomSetSplitOffset(arg1) {
return window['go']['main']['App']['IcomSetSplitOffset'](arg1);
}
export function IcomSetSquelch(arg1) {
return window['go']['main']['App']['IcomSetSquelch'](arg1);
}