From d817aefa3602f78ea2fa5d77bb69650107177ad1 Mon Sep 17 00:00:00 2001 From: Nate Bargmann Date: Tue, 15 Sep 2020 10:58:17 -0500 Subject: [PATCH 1/6] Removed TODO from Makefile.am With the TODO file removed, 'make dist' was failing. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index b5ebaaf51..0e6c93f28 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ aclocal_DATA = hamlib.m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = hamlib.pc -EXTRA_DIST = PLAN TODO LICENSE hamlib.m4 hamlib.pc.in README.developer \ +EXTRA_DIST = PLAN LICENSE hamlib.m4 hamlib.pc.in README.developer \ README.betatester README.win32 Android.mk doc_DATA = ChangeLog COPYING COPYING.LIB LICENSE \ From 2f143aa8991f42f6b265d34217642bc8350ef09d Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Wed, 16 Sep 2020 10:41:24 -0500 Subject: [PATCH 2/6] Make kenwood AG format determination automatically on first get_level call There are 3 formats supported, "AG" "AG0" and "AG0"/"AG1" This should work until Kenwood comes up with "AG2" or such https://github.com/Hamlib/Hamlib/issues/380 --- rigs/kenwood/kenwood.c | 112 ++++++++++++++++++++++++++++++++++++++--- rigs/kenwood/kenwood.h | 3 +- rigs/kenwood/pihpsdr.c | 20 +------- rigs/kenwood/ts2000.c | 20 +------- rigs/kenwood/ts480.c | 13 +---- 5 files changed, 111 insertions(+), 57 deletions(-) diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 09f4788dd..0e3b47df2 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -703,6 +703,8 @@ int kenwood_init(RIG *rig) caps->if_len = 37; } + priv->ag_format = -1; // force determination of AG format + rig_debug(RIG_DEBUG_TRACE, "%s: if_len = %d\n", __func__, caps->if_len); return RIG_OK; @@ -811,9 +813,9 @@ int kenwood_open(RIG *rig) if (!RIG_IS_XG3 && -RIG_ETIMEOUT == err) { + char buffer[KENWOOD_MAX_BUF_LEN]; /* Some Kenwood emulations have no ID command response :( * Try an FA command to see if anyone is listening */ - char buffer[KENWOOD_MAX_BUF_LEN]; err = kenwood_transaction(rig, "FA", buffer, sizeof(buffer)); if (RIG_OK != err) @@ -2181,6 +2183,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { char levelbuf[16]; int i, kenwood_val; + struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -2208,11 +2211,31 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) case RIG_LEVEL_AF: { - // some rigs only recognize 0 for vfo_set - // hopefully they are asking for VFOA or Main otherwise this might not work - // https://github.com/Hamlib/Hamlib/issues/304 int vfo_set = vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN ? 0 : 1; - snprintf(levelbuf, sizeof(levelbuf), "AG%1d%03d", vfo_set, kenwood_val); + + // some rigs only recognize 0 for vfo_set + // https://github.com/Hamlib/Hamlib/issues/304 + // This is now fixed for all rigs + // https://github.com/Hamlib/Hamlib/issues/380 + // ag_format is determined in kenwood_get_level + switch (priv->ag_format) + { + case 1: + snprintf(levelbuf, sizeof(levelbuf), "AG%03d", kenwood_val); + break; + + case 2: + snprintf(levelbuf, sizeof(levelbuf), "AG0%03d", kenwood_val); + break; + + case 3: + snprintf(levelbuf, sizeof(levelbuf), "AG%d%03d", vfo_set, kenwood_val); + break; + + default: + rig_debug(RIG_DEBUG_ERR, "%s: Unknown ag_format=%d\n", __func__, + priv->ag_format); + } } break; @@ -2376,6 +2399,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int retval; int lvl; int i, ret, agclevel, len; + struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -2533,7 +2557,83 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return ret; case RIG_LEVEL_AF: - return get_kenwood_level(rig, "AG", &val->f); + + // first time through we'll determine the AG format + // Can be "AG" "AG0" or "AG0/1" + // This could be done by rig but easy enough to make it automagic + if (priv->ag_format < 0) + { + rig_debug(RIG_DEBUG_TRACE, "%s: AF format check determination...\n", __func__); + // Determine AG format + // =-1 == Undetermine + // 0 == Unknown + // 1 == AG + // 2 == AG0 (fixed VFO) + // 3 == AG0/1 (with VFO arg) + char buffer[KENWOOD_MAX_BUF_LEN]; + int err = kenwood_transaction(rig, "AG", buffer, sizeof(buffer)); + + if (err == RIG_OK) + { + priv->ag_format = 1; + } + else + { + err = kenwood_transaction(rig, "AG1", buffer, sizeof(buffer)); + + if (err == RIG_OK) + { + priv->ag_format = 3; + } + else + { + err = kenwood_transaction(rig, "AG1", buffer, sizeof(buffer)); + + if (err == RIG_OK) + { + priv->ag_format = 2; + } + else + { + priv->ag_format = 0; // rats....can't figure it out + } + } + } + } + + rig_debug(RIG_DEBUG_TRACE, "%s: ag_format=%d\n", __func__, priv->ag_format); + + if (priv->ag_format == 0) + { + priv->ag_format = -1; // we'll keep trying next time + rig_debug(RIG_DEBUG_WARN, "%s: Unable to set AG format?\n", __func__); + return RIG_OK; // this is non-fatal for now + } + + switch (priv->ag_format) + { + case 0: + priv->ag_format = -1; // reset to try again + return RIG_OK; + break; + + case 1: + return get_kenwood_level(rig, "AG", &val->f); + break; + + case 2: + return get_kenwood_level(rig, "AG0", &val->f); + break; + + case 3: + return get_kenwood_level(rig, vfo == RIG_VFO_MAIN ? "AG0" : "AG1", &val->f); + break; + + default: + rig_debug(RIG_DEBUG_WARN, "%s: Invalid ag_format=%d?\n", __func__, + priv->ag_format); + return -RIG_EPROTO; + } case RIG_LEVEL_RF: return get_kenwood_level(rig, "RG", &val->f); diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index e6497802e..9949279c6 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -27,7 +27,7 @@ #include #include "token.h" -#define BACKEND_VER "20200901" +#define BACKEND_VER "20200916" #define EOM_KEN ';' #define EOM_TH '\r' @@ -125,6 +125,7 @@ struct kenwood_priv_data char last_if_response[KENWOOD_MAX_BUF_LEN]; int poweron; /* to avoid powering on more than once */ int has_rit2; /* rig has set 2 rit command */ + int ag_format; /* which AG command is being used...see LEVEL_AF in kenwood.c*/ }; diff --git a/rigs/kenwood/pihpsdr.c b/rigs/kenwood/pihpsdr.c index 5c1b38385..3b69a69bb 100644 --- a/rigs/kenwood/pihpsdr.c +++ b/rigs/kenwood/pihpsdr.c @@ -1033,25 +1033,7 @@ int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_AF: - retval = kenwood_transaction(rig, "AG0", lvlbuf, sizeof(lvlbuf)); - - if (retval != RIG_OK) - { - return retval; - } - - lvl_len = strlen(lvlbuf); - - if (lvl_len != 6) - { - rig_debug(RIG_DEBUG_ERR, "%s: unexpected answer len=%d\n", __func__, - (int)lvl_len); - return -RIG_ERJCTED; - } - - sscanf(lvlbuf + 2, "%d", &lvl); - val->f = lvl / 255.0; - break; + return kenwood_get_level(rig, vfo, level, val); case RIG_LEVEL_RF: retval = kenwood_transaction(rig, "RG", lvlbuf, sizeof(lvlbuf)); diff --git a/rigs/kenwood/ts2000.c b/rigs/kenwood/ts2000.c index 2cef024ca..f36b012b9 100644 --- a/rigs/kenwood/ts2000.c +++ b/rigs/kenwood/ts2000.c @@ -910,25 +910,7 @@ int ts2000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_AF: - retval = kenwood_transaction(rig, "AG0", lvlbuf, sizeof(lvlbuf)); - - if (retval != RIG_OK) - { - return retval; - } - - lvl_len = strlen(lvlbuf); - - if (lvl_len != 6) - { - rig_debug(RIG_DEBUG_ERR, "%s: unexpected answer len=%d\n", __func__, - (int)lvl_len); - return -RIG_ERJCTED; - } - - sscanf(lvlbuf + 2, "%d", &lvl); - val->f = lvl / 255.0; - break; + return kenwood_get_level(rig, vfo, level, val); case RIG_LEVEL_RF: retval = kenwood_transaction(rig, "RG", lvlbuf, sizeof(lvlbuf)); diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index c3b9cf36c..be13fc6d1 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -116,18 +116,7 @@ kenwood_ts480_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_AF: - kenwood_val = val.f * 255; /* possible values for TS480 are 000.. 255 */ - - if (rig->caps->rig_model == RIG_MODEL_TS890S) - { - sprintf(levelbuf, "AG%03d", kenwood_val); - } - else - { - sprintf(levelbuf, "AG0%03d", kenwood_val); - } - - break; + return kenwood_set_level(rig, vfo, level, val); case RIG_LEVEL_RF: if (rig->caps->rig_model == RIG_MODEL_TS890S) From 85981ed689b3b4d5068e8f142bd0dafc6d298373 Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Wed, 16 Sep 2020 11:22:06 -0500 Subject: [PATCH 3/6] Fix kenwood.c LEVEL_AF format 2 command --- rigs/kenwood/kenwood.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 0e3b47df2..a53eb5698 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -2587,7 +2587,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) } else { - err = kenwood_transaction(rig, "AG1", buffer, sizeof(buffer)); + err = kenwood_transaction(rig, "AG0", buffer, sizeof(buffer)); if (err == RIG_OK) { From 3c4bc6dbb19b11f5e2418ccb7c80fd60756a6e8d Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Wed, 16 Sep 2020 12:42:14 -0500 Subject: [PATCH 4/6] Fix ts590 LEVEL_AF --- rigs/kenwood/ts590.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 64f2b0887..ee29280fb 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -478,10 +478,9 @@ int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_CWPITCH: case RIG_LEVEL_RFPOWER: case RIG_LEVEL_RF: + case RIG_LEVEL_AF: return kenwood_get_level(rig, vfo, level, val); - case RIG_LEVEL_AF: - return get_kenwood_level(rig, "AG0", &val->f); case RIG_LEVEL_METER: retval = kenwood_transaction(rig, "RM0", lvlbuf, sizeof(lvlbuf)); From 37311b50353f513598283da3c725332060fcabaa Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Wed, 16 Sep 2020 13:03:05 -0500 Subject: [PATCH 5/6] Add MICGAIN to ts590.c --- rigs/kenwood/ts590.c | 1 + 1 file changed, 1 insertion(+) diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index ee29280fb..0149a190e 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -479,6 +479,7 @@ int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_RFPOWER: case RIG_LEVEL_RF: case RIG_LEVEL_AF: + case RIG_LEVEL_MICGAIN: return kenwood_get_level(rig, vfo, level, val); From 24b596c52b8b644ecbaf64ec25fd103c86d8a8b6 Mon Sep 17 00:00:00 2001 From: Michael Black W9MDB Date: Wed, 16 Sep 2020 14:24:52 -0500 Subject: [PATCH 6/6] Add MICGAIN to ts590 LEVEL set --- rigs/kenwood/ts590.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 0149a190e..e037c4265 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -43,7 +43,8 @@ int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); #define TS590_LEVEL_ALL (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|\ RIG_LEVEL_CWPITCH|RIG_LEVEL_METER|RIG_LEVEL_SWR|RIG_LEVEL_ALC|\ - RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_KEYSPD) + RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|\ + RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD) #define TS590_FUNC_ALL (RIG_FUNC_LOCK|RIG_FUNC_AIP|RIG_FUNC_TONE|\ RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC)