feat: added full support in USB (local) & ethernet (local or remote) of audio for Icom
This commit is contained in:
@@ -21,6 +21,8 @@ import {
|
||||
GetEmailSettings, SaveEmailSettings, TestEmail,
|
||||
QSLGetEmailTemplates, QSLSaveEmailTemplates,
|
||||
GetDVKMessages, SetDVKLabel, DVKStartRecord, DVKStopRecord, DVKPreview, DVKStop, GetDVKStatus,
|
||||
AudioStartMonitor, AudioStopMonitor, AudioMonitorActive,
|
||||
AudioStartTX, AudioStopTX, AudioTXActive,
|
||||
ListClusterServers, SaveClusterServer, DeleteClusterServer,
|
||||
GetClusterAutoConnect, SetClusterAutoConnect,
|
||||
ConnectClusterServer, DisconnectClusterServer,
|
||||
@@ -796,7 +798,7 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
const [modeDraft, setModeDraft] = useState('');
|
||||
const [catCfg, setCatCfg] = useState<CATSettings>({
|
||||
enabled: false, backend: 'omnirig', omnirig_rig: 1, flex_host: '', flex_port: 4992, flex_spots: false,
|
||||
icom_port: '', icom_baud: 115200, icom_addr: 0x98, icom_net_host: '', icom_net_user: '', icom_net_pass: '',
|
||||
icom_port: '', icom_baud: 115200, icom_addr: 0x98, icom_net_host: '', icom_net_user: '', icom_net_pass: '', icom_net_audio: false,
|
||||
tci_host: '', tci_port: 40001, tci_spots: false, poll_ms: 250, delay_ms: 0,
|
||||
digital_default: 'FT8',
|
||||
});
|
||||
@@ -863,6 +865,24 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
const [dvkMsgs, setDvkMsgs] = useState<DVKMsg[]>([]);
|
||||
const [dvkStat, setDvkStat] = useState<DVKStat>({ recording: false, playing: false, rec_slot: 0 });
|
||||
const [dvkErr, setDvkErr] = useState('');
|
||||
const [monitorOn, setMonitorOn] = useState(false);
|
||||
const [txOn, setTxOn] = useState(false);
|
||||
useEffect(() => {
|
||||
AudioMonitorActive().then(setMonitorOn).catch(() => {});
|
||||
AudioTXActive().then(setTxOn).catch(() => {});
|
||||
}, []);
|
||||
const toggleMonitor = async () => {
|
||||
try {
|
||||
if (monitorOn) { await AudioStopMonitor(); setMonitorOn(false); }
|
||||
else { await AudioStartMonitor(); setMonitorOn(true); }
|
||||
} catch (err: any) { setDvkErr(String(err?.message ?? err)); }
|
||||
};
|
||||
const toggleTX = async () => {
|
||||
try {
|
||||
if (txOn) { await AudioStopTX(); setTxOn(false); }
|
||||
else { await AudioStartTX(); setTxOn(true); }
|
||||
} catch (err: any) { setDvkErr(String(err?.message ?? err)); }
|
||||
};
|
||||
|
||||
// General behaviour prefs (mirrored to the DB so they travel with data/).
|
||||
const [autofocusWB, setAutofocusWB] = useState(() => localStorage.getItem('opslog.autofocusWB') !== '0');
|
||||
@@ -2065,6 +2085,14 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
onChange={(e) => setCatCfg((s) => ({ ...s, icom_net_pass: e.target.value }))} />
|
||||
</div>
|
||||
<p className="col-span-2 text-xs text-muted-foreground">{t('cat.icomNetHint')}</p>
|
||||
<label className="col-span-2 flex items-start gap-2 text-sm cursor-pointer">
|
||||
<Checkbox checked={!!(catCfg as any).icom_net_audio}
|
||||
onCheckedChange={(c) => setCatCfg((s) => ({ ...s, icom_net_audio: !!c } as any))} />
|
||||
<span>
|
||||
{t('cat.icomNetAudio')}
|
||||
<span className="block text-[11px] text-muted-foreground">{t('cat.icomNetAudioHint')}</span>
|
||||
</span>
|
||||
</label>
|
||||
</>
|
||||
)}
|
||||
{catCfg.backend === 'tci' && (
|
||||
@@ -3747,6 +3775,40 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
<strong>From Radio</strong> = what you receive (used by the QSO recorder).{' '}
|
||||
<strong>To Radio</strong> = where voice-keyer messages are transmitted.
|
||||
</p>
|
||||
<div className="flex items-center gap-3">
|
||||
<Button
|
||||
variant={monitorOn ? 'default' : 'outline'}
|
||||
size="sm"
|
||||
className="h-8"
|
||||
onClick={toggleMonitor}
|
||||
disabled={!monitorOn && !audioCfg.from_radio}
|
||||
title="Hear the rig's RX audio (From Radio) through your Listening device"
|
||||
>
|
||||
{monitorOn ? '■ Stop listening' : '▶ Listen to radio'}
|
||||
</Button>
|
||||
<span className="text-[11px] text-muted-foreground">
|
||||
{monitorOn
|
||||
? 'RX monitor running — From Radio → Listening device.'
|
||||
: 'Live-monitor the rig here (USB codec now; network audio later).'}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<Button
|
||||
variant={txOn ? 'destructive' : 'outline'}
|
||||
size="sm"
|
||||
className="h-8"
|
||||
onClick={toggleTX}
|
||||
disabled={!txOn && !audioCfg.to_radio}
|
||||
title="Key PTT and pipe your live mic into the rig (To Radio device)"
|
||||
>
|
||||
{txOn ? '■ Stop talking (TX)' : '🎙 Talk to radio (TX)'}
|
||||
</Button>
|
||||
<span className="text-[11px] text-muted-foreground">
|
||||
{txOn
|
||||
? 'TRANSMITTING — mic → To Radio, PTT keyed. Click to stop.'
|
||||
: 'Live mic → rig with PTT (USB now; network TX later).'}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="border-t border-border/60 pt-3 space-y-3 max-w-2xl">
|
||||
|
||||
Reference in New Issue
Block a user