feat: ESM (Enter Sends Message) for CW keyers, N1MM-style
With ESM enabled (Settings → CW Keyer), the keyer active and mode CW, Enter in the entry strip fires a macro by QSO stage instead of logging: - callsign field empty → F1 (CQ) - callsign entered (in call field) → F2 (report), then focus jumps to RST-sent - Enter in RST-sent / RST-rcvd → F3 (TU), which logs via its own <LOGQSO> Works for every keyer engine (WinKeyer / serial DTR-RTS / Flex CWX / Icom CI-V) since it routes through the shared macro sender. Enter in other fields still logs normally, and ESM off keeps the classic Enter-to-log behaviour. Backend: new `esm` flag on WinkeyerSettings (winkeyer.esm). Frontend: esmHandleEnter state machine keyed off data-esm markers on the call/RST blocks, a Settings checkbox + hint, and i18n EN/FR.
This commit is contained in:
@@ -1076,14 +1076,14 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
// WinKeyer CW keyer settings + macro editor.
|
||||
type WKMac = { label: string; text: string };
|
||||
type WKSettings = {
|
||||
enabled: boolean; engine: string; esc_clears_call: boolean;
|
||||
enabled: boolean; engine: string; esc_clears_call: boolean; esm: boolean;
|
||||
port: string; baud: number; wpm: number; weight: number;
|
||||
lead_in_ms: number; tail_ms: number; ratio: number; farnsworth: number;
|
||||
sidetone_hz: number; mode: string; swap: boolean; autospace: boolean;
|
||||
use_ptt: boolean; serial_echo: boolean; cw_key_line: string; cw_invert: boolean; macros: WKMac[];
|
||||
};
|
||||
const [wk, setWk] = useState<WKSettings>({
|
||||
enabled: false, engine: 'winkeyer', esc_clears_call: true,
|
||||
enabled: false, engine: 'winkeyer', esc_clears_call: true, esm: false,
|
||||
port: '', baud: 1200, wpm: 25, weight: 50, lead_in_ms: 10,
|
||||
tail_ms: 50, ratio: 50, farnsworth: 0, sidetone_hz: 600, mode: 'iambic_b',
|
||||
swap: false, autospace: true, use_ptt: false, serial_echo: true, cw_key_line: 'dtr', cw_invert: false, macros: [],
|
||||
@@ -3106,6 +3106,13 @@ export function SettingsModal({ onClose, onSaved, initialSection, onMainPaneChan
|
||||
<Checkbox checked={wk.esc_clears_call} onCheckedChange={(c) => setWkField({ esc_clears_call: !!c })} />
|
||||
{t('wk.escClears')}
|
||||
</label>
|
||||
<label className="flex items-start gap-2 text-sm cursor-pointer col-span-3 pb-1.5">
|
||||
<Checkbox checked={wk.esm} onCheckedChange={(c) => setWkField({ esm: !!c })} className="mt-0.5" />
|
||||
<span>
|
||||
{t('wk.esm')}
|
||||
<span className="block text-xs text-muted-foreground">{t('wk.esmHint')}</span>
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{wk.engine === 'icom' ? (
|
||||
|
||||
Reference in New Issue
Block a user