feat(omnirig): say which of its two CW bits means CW on this rig
Reported on an IC-7610 shared through OmniRig: clicking a CW spot put the radio in CW-R every time, and the only way out was to edit the OmniRig rig file by hand. OmniRig's model has two CW modes, PM_CW_U and PM_CW_L, and nothing in it says which one an .ini calls plain CW. Icom rig files disagree with each other — on some PM_CW_U is CI-V mode 0x03 (CW), on others 0x07 (CW-R) — so asking for "CW" is a question with two right answers and OpsLog was only ever giving one of them. Settings ▸ CAT ▸ OmniRig now carries the answer for THIS rig, and it is pushed to a radio that is already connected rather than waiting for a reconnect: which bit a mode maps to is not worth dropping the link, and with it WSJT-X's rigctl session. Same shape as the Yaesu RTTY sideband, for the same reason. Nothing changes for anyone whose rig file already agrees with us. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
@@ -1859,7 +1859,7 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
||||
// IC-7610 the moment they chose Other.
|
||||
const [icomCustom, setIcomCustom] = useState(false);
|
||||
const [catCfg, setCatCfg] = useState<CATSettings>({
|
||||
enabled: false, backend: 'omnirig', omnirig_rig: 1, omnirig_vfo: '', flex_host: '', flex_port: 4992, flex_spots: false, flex_decode_spots: false, flex_decode_secs: 120, flex_dvk_dax: false,
|
||||
enabled: false, backend: 'omnirig', omnirig_rig: 1, omnirig_vfo: '', omnirig_cw_lower: false, flex_host: '', flex_port: 4992, flex_spots: false, flex_decode_spots: false, flex_decode_secs: 120, flex_dvk_dax: false,
|
||||
yaesu_port: '', yaesu_baud: 38400, yaesu_low_lines: false, yaesu_rtty_usb: false, kenwood_low_lines: false, kenwood_port: '', kenwood_baud: 9600, kenwood_host: '', kenwood_link: 'usb', kenwood_data_mode: 'usb', xiegu_port: '', xiegu_baud: 19200, xiegu_addr: 0x70, xiegu_ptt_line: '',
|
||||
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, offset_on: false, offset_hz: 0,
|
||||
@@ -3640,6 +3640,16 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged
|
||||
<p className="text-[10px] text-muted-foreground">{t('cat.omnirigVfoHint')}</p>
|
||||
</div>
|
||||
)}
|
||||
{catCfg.backend === 'omnirig' && (
|
||||
<div className="space-y-1 col-span-2">
|
||||
<label className="flex items-start gap-2 text-sm cursor-pointer">
|
||||
<Checkbox className="mt-0.5" checked={!!catCfg.omnirig_cw_lower}
|
||||
onCheckedChange={(c) => setCatCfg((s) => ({ ...s, omnirig_cw_lower: !!c }))} />
|
||||
<span>{t('cat.omnirigCwLower')}</span>
|
||||
</label>
|
||||
<p className="text-[10px] text-muted-foreground">{t('cat.omnirigCwLowerHint')}</p>
|
||||
</div>
|
||||
)}
|
||||
{catCfg.backend === 'flex' && (
|
||||
<>
|
||||
<div className="space-y-1">
|
||||
|
||||
@@ -421,7 +421,7 @@ const en: Dict = {
|
||||
'cat.icomNetHint': "Connects to the rig's built-in LAN server directly — no RS-BA1 or Remote Utility needed (close them first). Use the Network User1 ID/Password set in the rig's Network menu. A rig in standby is powered on automatically.",
|
||||
'cat.icomNetListen': 'Play it through the speakers', 'cat.icomNetListenHint': 'Untick to keep the stream silent — recordings and the voice keyer still work. Same switch as the speaker button on the Icom console.', 'cat.icomNetAudio': 'Stream RX audio over the network (experimental)',
|
||||
'cat.icomNetAudioHint': 'Play the rig’s received audio through your Listening device (Settings → Audio) over the 50003 stream. Experimental — the audio framing is pending on-rig verification; leave off if control misbehaves.',
|
||||
'cat.omnirigRig': 'OmniRig rig slot', 'cat.omnirigVfo': 'VFO to read', 'cat.omnirigVfoAuto': 'As reported by the rig file', 'cat.omnirigVfoA': 'Always VFO A (main)', 'cat.omnirigVfoB': 'Always VFO B (sub)', 'cat.omnirigVfoHint': 'OmniRig reports the active VFO from the rig file, and some files get it wrong — the frequency then follows the other VFO and appears frozen. Force one here if that happens.', 'cat.flexIp': 'FlexRadio IP', 'cat.port': 'Port', 'cat.flexSpots': 'Show cluster spots on the panadapter', 'cat.flexSpotsHint': "(spots from OpsLog's DX cluster appear on the radio, auto-expire after 30 min)", 'cat.flexDecodeSpots': 'Show WSJT-X decodes on the panadapter', 'cat.flexDecodeSpotsHint': '(heard FT8/FT4 stations from your WSJT-X/JTDX UDP feed, one spot per call)', 'cat.flexDecodeSecs': 'Display for', 'cat.flexDecodeSecsHint': 'seconds before a station is removed',
|
||||
'cat.omnirigRig': 'OmniRig rig slot', 'cat.omnirigVfo': 'VFO to read', 'cat.omnirigVfoAuto': 'As reported by the rig file', 'cat.omnirigVfoA': 'Always VFO A (main)', 'cat.omnirigVfoB': 'Always VFO B (sub)', 'cat.omnirigCwLower': 'This rig file calls CW “PM_CW_L” — tick if clicking a CW spot lands the radio in CW-R', 'cat.omnirigCwLowerHint': 'OmniRig has two CW modes and nothing says which one a rig file calls plain CW: some Icom files map PM_CW_U to CW, others to CW-R. Tick this and OpsLog asks for the other one. Applied at once — the radio does not have to reconnect.', 'cat.omnirigVfoHint': 'OmniRig reports the active VFO from the rig file, and some files get it wrong — the frequency then follows the other VFO and appears frozen. Force one here if that happens.', 'cat.flexIp': 'FlexRadio IP', 'cat.port': 'Port', 'cat.flexSpots': 'Show cluster spots on the panadapter', 'cat.flexSpotsHint': "(spots from OpsLog's DX cluster appear on the radio, auto-expire after 30 min)", 'cat.flexDecodeSpots': 'Show WSJT-X decodes on the panadapter', 'cat.flexDecodeSpotsHint': '(heard FT8/FT4 stations from your WSJT-X/JTDX UDP feed, one spot per call)', 'cat.flexDecodeSecs': 'Display for', 'cat.flexDecodeSecsHint': 'seconds before a station is removed',
|
||||
'cat.flexOptions': 'What OpsLog does with the radio', 'flexzoom.title': 'Zoom the panadapter on a spot click', 'flexzoom.enable': 'Resize the panadapter when a spot is clicked', 'flexzoom.cw': 'CW', 'flexzoom.ssb': 'Phone', 'flexzoom.digi': 'Digital', 'flexzoom.centre': 'Re-centre on the spot as well', 'flexzoom.centreHint': '(off keeps your window where you put it and only changes its width)', 'spotcol.title': 'Spot colours on the panadapter', 'spotcol.enable': 'Colour spots by status', 'spotcol.reset': 'restore defaults', 'spotcol.send': 'Send this status to the panadapter', 'spotcol.text': 'Text colour', 'spotcol.bg': 'Background colour', 'spotcol.s_new': 'Entity never worked', 'spotcol.s_new-band-mode': 'Entity new on this band AND mode', 'spotcol.s_new-band': 'Entity new on this band', 'spotcol.s_new-mode': 'Entity new in this mode', 'spotcol.s_new-slot': 'New slot', 'spotcol.s_new-pota': 'New POTA park', 'spotcol.s_new-county': 'New US county', 'spotcol.s_new-pfx': 'New WPX prefix', 'spotcol.s_my-call': 'My own callsign', 'spotcol.s_worked': 'Callsign already worked', 'spotcol.s_none': 'Nothing new', 'cat.flexDvkDax': 'Switch transmit audio to DAX for voice messages',
|
||||
'cat.flexDvkDaxHint': '(pressed while a DVK message or a QSO recording goes out, and put back afterwards so your microphone works again)',
|
||||
'cat.icomPort': 'Icom CI-V port', 'cat.selectCom': 'Select COM port', 'cat.noPorts': 'No ports found', 'cat.baud': 'Baud rate', 'cat.icomModel': 'Rig model', 'cat.icomModelOther': 'Other (custom address)', 'cat.civAddr': 'CI-V address (hex)', 'cat.civHint': 'Pick your model to set the CI-V address automatically (or choose "Other" and type it). Set "CI-V USB Echo Back" OFF and CI-V baud to match on the rig.',
|
||||
@@ -1030,7 +1030,7 @@ const fr: Dict = {
|
||||
'cat.icomNetHint': "Se connecte directement au serveur LAN intégré du poste — sans RS-BA1 ni Remote Utility (ferme-les d'abord). Utilise l'ID/mot de passe Network User1 configurés dans le menu Network du poste. Un poste en veille est allumé automatiquement.",
|
||||
'cat.icomNetListen': 'Écouter dans les enceintes', 'cat.icomNetListenHint': 'Décochez pour garder le flux silencieux — enregistrements et voice keyer fonctionnent toujours. Même interrupteur que le bouton haut-parleur de la console Icom.', 'cat.icomNetAudio': 'Diffuser l’audio RX par le réseau (expérimental)',
|
||||
'cat.icomNetAudioHint': 'Écoute l’audio reçu du poste sur ton périphérique d’écoute (Réglages → Audio) via le flux 50003. Expérimental — le format audio reste à vérifier sur le poste ; laisse désactivé si le contrôle se comporte mal.',
|
||||
'cat.omnirigRig': 'Slot OmniRig', 'cat.omnirigVfo': 'VFO à lire', 'cat.omnirigVfoAuto': 'Selon le fichier radio', 'cat.omnirigVfoA': 'Toujours le VFO A (principal)', 'cat.omnirigVfoB': 'Toujours le VFO B (secondaire)', 'cat.omnirigVfoHint': "OmniRig indique le VFO actif d'après le fichier radio, et certains fichiers se trompent — la fréquence suit alors l'autre VFO et paraît figée. Forcez-en un ici le cas échéant.", 'cat.flexIp': 'IP FlexRadio', 'cat.port': 'Port', 'cat.flexSpots': 'Afficher les spots cluster sur le panadapter', 'cat.flexSpotsHint': "(les spots du cluster DX d'OpsLog apparaissent sur la radio, expirent après 30 min)", 'cat.flexDecodeSpots': 'Afficher les décodes WSJT-X sur le panadapter', 'cat.flexDecodeSpotsHint': '(stations FT8/FT4 entendues via ton flux UDP WSJT-X/JTDX, un spot par station)', 'cat.flexDecodeSecs': 'Affichage pendant', 'cat.flexDecodeSecsHint': 'secondes avant retrait d\'une station',
|
||||
'cat.omnirigRig': 'Slot OmniRig', 'cat.omnirigVfo': 'VFO à lire', 'cat.omnirigVfoAuto': 'Selon le fichier radio', 'cat.omnirigVfoA': 'Toujours le VFO A (principal)', 'cat.omnirigVfoB': 'Toujours le VFO B (secondaire)', 'cat.omnirigCwLower': 'Ce fichier de rig appelle la CW « PM_CW_L » — cocher si un clic sur un spot CW met la radio en CW-R', 'cat.omnirigCwLowerHint': 'OmniRig a deux modes CW et rien ne dit lequel un fichier de rig appelle CW tout court : certains fichiers Icom associent PM_CW_U à CW, d’autres à CW-R. Cochez et OpsLog demande l’autre. Appliqué aussitôt — la radio n’a pas besoin de se reconnecter.', 'cat.omnirigVfoHint': "OmniRig indique le VFO actif d'après le fichier radio, et certains fichiers se trompent — la fréquence suit alors l'autre VFO et paraît figée. Forcez-en un ici le cas échéant.", 'cat.flexIp': 'IP FlexRadio', 'cat.port': 'Port', 'cat.flexSpots': 'Afficher les spots cluster sur le panadapter', 'cat.flexSpotsHint': "(les spots du cluster DX d'OpsLog apparaissent sur la radio, expirent après 30 min)", 'cat.flexDecodeSpots': 'Afficher les décodes WSJT-X sur le panadapter', 'cat.flexDecodeSpotsHint': '(stations FT8/FT4 entendues via ton flux UDP WSJT-X/JTDX, un spot par station)', 'cat.flexDecodeSecs': 'Affichage pendant', 'cat.flexDecodeSecsHint': 'secondes avant retrait d\'une station',
|
||||
'cat.flexOptions': "Ce qu’OpsLog fait avec la radio", 'flexzoom.title': 'Zoomer le panadapter au clic sur un spot', 'flexzoom.enable': 'Redimensionner le panadapter au clic sur un spot', 'flexzoom.cw': 'CW', 'flexzoom.ssb': 'Phonie', 'flexzoom.digi': 'Numérique', 'flexzoom.centre': 'Recentrer aussi sur le spot', 'flexzoom.centreHint': '(décoché, ta fenêtre reste où tu l’as mise et seule sa largeur change)', 'spotcol.title': 'Couleurs des spots sur le panadapter', 'spotcol.enable': 'Colorer les spots selon leur statut', 'spotcol.reset': 'valeurs par défaut', 'spotcol.send': 'Envoyer ce statut au panadapter', 'spotcol.text': 'Couleur du texte', 'spotcol.bg': 'Couleur de fond', 'spotcol.s_new': 'Entité jamais contactée', 'spotcol.s_new-band-mode': 'Entité nouvelle sur cette bande ET ce mode', 'spotcol.s_new-band': 'Entité nouvelle sur cette bande', 'spotcol.s_new-mode': 'Entité nouvelle dans ce mode', 'spotcol.s_new-slot': 'Nouveau slot', 'spotcol.s_new-pota': 'Nouveau parc POTA', 'spotcol.s_new-county': 'Nouveau comté US', 'spotcol.s_new-pfx': 'Nouveau préfixe WPX', 'spotcol.s_my-call': 'Mon propre indicatif', 'spotcol.s_worked': 'Indicatif déjà contacté', 'spotcol.s_none': 'Rien de neuf',
|
||||
'cat.flexDvkDax': "Basculer l'audio d'émission sur DAX pour les messages vocaux",
|
||||
'cat.flexDvkDaxHint': "(enfoncé le temps d'un message DVK ou d'un enregistrement de QSO, puis remis comme avant pour retrouver ton micro)",
|
||||
|
||||
@@ -2360,6 +2360,7 @@ export namespace main {
|
||||
backend: string;
|
||||
omnirig_rig: number;
|
||||
omnirig_vfo: string;
|
||||
omnirig_cw_lower: boolean;
|
||||
digi_as_usb: boolean;
|
||||
flex_host: string;
|
||||
flex_port: number;
|
||||
@@ -2414,6 +2415,7 @@ export namespace main {
|
||||
this.backend = source["backend"];
|
||||
this.omnirig_rig = source["omnirig_rig"];
|
||||
this.omnirig_vfo = source["omnirig_vfo"];
|
||||
this.omnirig_cw_lower = source["omnirig_cw_lower"];
|
||||
this.digi_as_usb = source["digi_as_usb"];
|
||||
this.flex_host = source["flex_host"];
|
||||
this.flex_port = source["flex_port"];
|
||||
|
||||
Reference in New Issue
Block a user