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:
@@ -228,6 +228,7 @@ const (
|
||||
keyWKEngine = "winkeyer.engine" // "winkeyer" | "serial" | "icom" | "flex" | "tci"
|
||||
keyWKEscClears = "winkeyer.esc_clears_call" // ESC also clears the callsign
|
||||
keyWKSendOnType = "winkeyer.send_on_type" // key characters live as typed
|
||||
keyWKEsm = "winkeyer.esm" // Enter-Sends-Message (N1MM-style CW flow)
|
||||
keyWKCWLine = "winkeyer.cw_key_line" // serial engine: "dtr" (CW) / "rts" (PTT) or swapped
|
||||
keyWKCWInvert = "winkeyer.cw_invert" // serial engine: invert line polarity (active-LOW)
|
||||
|
||||
@@ -13485,6 +13486,7 @@ type WinkeyerSettings struct {
|
||||
Engine string `json:"engine"` // keyer backend: "winkeyer" | "icom" (rig keyer via CI-V) | "tci"
|
||||
EscClearsCall bool `json:"esc_clears_call"` // ESC also resets the callsign
|
||||
SendOnType bool `json:"send_on_type"` // key chars live as typed
|
||||
Esm bool `json:"esm"` // Enter-Sends-Message: Enter fires F1/F2/F3 by QSO stage
|
||||
Macros []WKMacro `json:"macros"`
|
||||
}
|
||||
|
||||
@@ -13512,7 +13514,7 @@ func (a *App) GetWinkeyerSettings() (WinkeyerSettings, error) {
|
||||
keyWKEnabled, keyWKPort, keyWKBaud, keyWKWPM, keyWKWeight, keyWKLeadIn,
|
||||
keyWKTail, keyWKRatio, keyWKFarnsworth, keyWKSidetone, keyWKMode,
|
||||
keyWKSwap, keyWKAutoSpace, keyWKUsePTT, keyWKSerialEcho, keyWKMacros,
|
||||
keyWKEngine, keyWKEscClears, keyWKSendOnType, keyWKCWLine, keyWKCWInvert)
|
||||
keyWKEngine, keyWKEscClears, keyWKSendOnType, keyWKEsm, keyWKCWLine, keyWKCWInvert)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
@@ -13527,6 +13529,7 @@ func (a *App) GetWinkeyerSettings() (WinkeyerSettings, error) {
|
||||
out.EscClearsCall = v == "1"
|
||||
}
|
||||
out.SendOnType = m[keyWKSendOnType] == "1"
|
||||
out.Esm = m[keyWKEsm] == "1"
|
||||
out.Enabled = m[keyWKEnabled] == "1"
|
||||
if v := m[keyWKPort]; v != "" {
|
||||
out.Port = v
|
||||
@@ -13589,6 +13592,7 @@ func (a *App) SaveWinkeyerSettings(s WinkeyerSettings) error {
|
||||
keyWKEngine: strings.TrimSpace(s.Engine),
|
||||
keyWKEscClears: boolStr(s.EscClearsCall),
|
||||
keyWKSendOnType: boolStr(s.SendOnType),
|
||||
keyWKEsm: boolStr(s.Esm),
|
||||
keyWKCWLine: strings.TrimSpace(s.CWKeyLine),
|
||||
keyWKCWInvert: boolStr(s.CWInvert),
|
||||
} {
|
||||
|
||||
Reference in New Issue
Block a user