From 50512b4bf9a60c769ef3a95e6f6c8bc275010448 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Fri, 15 Oct 2021 12:05:46 -0500 Subject: [PATCH] Fix Elecraft K4 set_mode to work with VFOB https://github.com/Hamlib/Hamlib/issues/825 --- rigs/kenwood/k3.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index a131de3ff..aea35157f 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -484,7 +484,7 @@ const struct rig_caps k4_caps = RIG_MODEL(RIG_MODEL_K4), .model_name = "K4", .mfg_name = "Elecraft", - .version = BACKEND_VER ".14", + .version = BACKEND_VER ".15", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1088,9 +1088,11 @@ int k3_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) int k3_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { int err; - char cmd_m[4]; + char cmd_m[5]; char buf[KENWOOD_MAX_BUF_LEN]; + char *dtcmd; struct kenwood_priv_caps *caps = kenwood_caps(rig); + struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -1112,40 +1114,46 @@ int k3_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else { rig_debug(RIG_DEBUG_TRACE, - "%s(%d): changing mode=%s, oldmode=%s, width=%ld, oldwidth=%ld\n", __FILE__, + "%s(%d): changing oldmode=%s, to mode=%s, oldwidth=%ld, to width=%ld\n", __FILE__, __LINE__, rig_strrmode(tmode), rig_strrmode(mode), twidth, width); } + dtcmd = "DT"; + if ((priv->is_k4 || priv->is_k4d || priv->is_k4hd) && vfo == RIG_VFO_B) + { + dtcmd = "DT$"; + } + switch (mode) { case RIG_MODE_PKTLSB: mode = RIG_MODE_RTTYR; // in "DT0" Subband RIG_MODE_RTTYR = USB and RIG_MODE_RTTY = LSB snprintf(cmd_m, sizeof(cmd_m), - "DT0"); /* DATA A mode - DATA (REV) on LSB optimized for HF Packet, VFO dial is suppressed carrier QRG */ + "%s0", dtcmd); /* DATA A mode - DATA (REV) on LSB optimized for HF Packet, VFO dial is suppressed carrier QRG */ break; case RIG_MODE_PKTUSB: mode = RIG_MODE_RTTY; // in "DT0" Subband RIG_MODE_RTTYR = USB and RIG_MODE_RTTY = LSB snprintf(cmd_m, sizeof(cmd_m), - "DT0"); /* DATA A mode - DATA on USB general, VFO dial is suppressed carrier QRG */ + "%s0", dtcmd); /* DATA A mode - DATA on USB general, VFO dial is suppressed carrier QRG */ break; case RIG_MODE_RTTY: mode = RIG_MODE_RTTY; // in "DT1" Subband RIG_MODE_RTTY = LSB and RIG_MODE_RTTYR = USB snprintf(cmd_m, sizeof(cmd_m), - "DT2"); /* FSK D mode - direct FSK on LSB optimized for RTTY, VFO dial is MARK */ + "%s2", dtcmd); /* FSK D mode - direct FSK on LSB optimized for RTTY, VFO dial is MARK */ break; case RIG_MODE_RTTYR: mode = RIG_MODE_RTTYR; // in "DT2" Subband RIG_MODE_RTTY = LSB and RIG_MODE_RTTYR = USB snprintf(cmd_m, sizeof(cmd_m), - "DT1"); /* FSK D mode - direct FSK keying, LSB is "normal", VFO dial is MARK */ + "%s1", dtcmd); /* FSK D mode - direct FSK keying, LSB is "normal", VFO dial is MARK */ break; case RIG_MODE_PSK: mode = RIG_MODE_PSK; // in "DT3" subband RIG_MODE_PSK = USB # kenwood.c mode but may need kenwwod.c mode table review. snprintf(cmd_m, sizeof(cmd_m), - "DT3"); /* PSK D Mode - direct PSK keying, USB is "normal", VFO dial is MARK */ + "%s3", dtcmd); /* PSK D Mode - direct PSK keying, USB is "normal", VFO dial is MARK */ break; default: