diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index bcf160ad5..9713d24b2 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -2249,6 +2249,17 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) case RIG_LEVEL_RF: /* XXX check level range */ + // KX2 and KX3 have range -190 to 250 + if (val.f > 1.0) return -RIG_EINVAL; + if (RIG_IS_KX2 || RIG_IS_KX3) { + val.f = val.f * (250.0 - 190.0) + 190; + } + else if (RIG_IS_K3 || RIG_IS_K3S) { + val.f = val.f * (250.0 / 100.0); + } + else { // other kenwood rigs + val.f = val.f * 255.0; + } snprintf(levelbuf, sizeof(levelbuf), "RG%03d", kenwood_val); break; @@ -2369,7 +2380,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) return kenwood_transaction(rig, levelbuf, NULL, 0); } -int get_kenwood_level(RIG *rig, const char *cmd, float *f) +int get_kenwood_level(RIG *rig, const char *cmd, value_t *val) { char lvlbuf[10]; int retval; @@ -2378,7 +2389,7 @@ int get_kenwood_level(RIG *rig, const char *cmd, float *f) rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - if (!f) + if (!val) { return -RIG_EINVAL; } @@ -2392,7 +2403,8 @@ int get_kenwood_level(RIG *rig, const char *cmd, float *f) /* 000..255 */ sscanf(lvlbuf + len, "%d", &lvl); - *f = lvl / 255.0; + val->i = lvl; // raw value + val->f = lvl / 255.0; // our default scaling of 0-255 return RIG_OK; }; @@ -2560,7 +2572,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) * which is val=1.0 on most rigs, but * get_kenwood_level maps 0...255 onto 0.0 ... 1.0 */ - ret = get_kenwood_level(rig, "PC", &val->f); + ret = get_kenwood_level(rig, "PC", val); val->f = val->f * (255.0 / 100.0); return ret; @@ -2626,15 +2638,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case 1: - return get_kenwood_level(rig, "AG", &val->f); + return get_kenwood_level(rig, "AG", val); break; case 2: - return get_kenwood_level(rig, "AG0", &val->f); + return get_kenwood_level(rig, "AG0", val); break; case 3: - return get_kenwood_level(rig, vfo == RIG_VFO_MAIN ? "AG0" : "AG1", &val->f); + return get_kenwood_level(rig, vfo == RIG_VFO_MAIN ? "AG0" : "AG1", val); break; default: @@ -2644,13 +2656,23 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) } case RIG_LEVEL_RF: - return get_kenwood_level(rig, "RG", &val->f); + retval = get_kenwood_level(rig, "RG", val); + if (retval != RIG_OK) return retval; + // KX2 and KX3 have range 190 to 250 + if (RIG_IS_KX2 || RIG_IS_KX3) { + val->f = (val->i - 190) / (250-190); + } + else if (RIG_IS_K3 || RIG_IS_K3S) { + val->f = val->i / 250.0; + } + // other kenwod rigs are the default 0-255 + return retval; case RIG_LEVEL_SQL: - return get_kenwood_level(rig, "SQ", &val->f); + return get_kenwood_level(rig, "SQ", val); case RIG_LEVEL_MICGAIN: - ret = get_kenwood_level(rig, "MG", &val->f); + ret = get_kenwood_level(rig, "MG", val); if (ret != RIG_OK) { @@ -2662,8 +2684,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return RIG_OK; case RIG_LEVEL_AGC: - ret = get_kenwood_level(rig, "GT", &val->f); - agclevel = 255 * val->f; + ret = get_kenwood_level(rig, "GT", val); + agclevel = val->i; if (agclevel == 0) { val->i = 0; } else if (agclevel < 85) { val->i = 1; } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 4dab795be..2c09a924e 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -27,7 +27,7 @@ #include #include "token.h" -#define BACKEND_VER "20200917" +#define BACKEND_VER "20200930" #define EOM_KEN ';' #define EOM_TH '\r' @@ -80,6 +80,9 @@ extern const struct confparams kenwood_cfg_params[]; #define RIG_IS_HPSDR (rig->caps->rig_model == RIG_MODEL_HPSDR) #define RIG_IS_K2 (rig->caps->rig_model == RIG_MODEL_K2) #define RIG_IS_K3 (rig->caps->rig_model == RIG_MODEL_K3) +#define RIG_IS_K3S (rig->caps->rig_model == RIG_MODEL_K3S) +#define RIG_IS_KX2 (rig->caps->rig_model == RIG_MODEL_KX2) +#define RIG_IS_KX3 (rig->caps->rig_model == RIG_MODEL_KX3) #define RIG_IS_THD7A (rig->caps->rig_model == RIG_MODEL_THD7A) #define RIG_IS_THD74 (rig->caps->rig_model == RIG_MODEL_THD74) #define RIG_IS_TS2000 (rig->caps->rig_model == RIG_MODEL_TS2000) @@ -204,7 +207,7 @@ int kenwood_set_trn(RIG *rig, int trn); int kenwood_get_trn(RIG *rig, int *trn); /* only use if returned string has length 6, e.g. 'SQ011;' */ -int get_kenwood_level(RIG *rig, const char *cmd, float *f); +int get_kenwood_level(RIG *rig, const char *cmd, value_t *val); int get_kenwood_func(RIG *rig, const char *cmd, int *status); extern const struct rig_caps ts950s_caps; diff --git a/rigs/kenwood/ts2000.c b/rigs/kenwood/ts2000.c index f36b012b9..7095b81a7 100644 --- a/rigs/kenwood/ts2000.c +++ b/rigs/kenwood/ts2000.c @@ -1066,7 +1066,7 @@ int ts2000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_AGC: /* FIX ME: ts2000 returns 0 -20 for AGC */ - ret = get_kenwood_level(rig, "GT", &val->f); + ret = get_kenwood_level(rig, "GT", val); agclevel = 255.0 * val->f; if (agclevel == 0) { val->i = 0; } diff --git a/rigs/kenwood/ts870s.c b/rigs/kenwood/ts870s.c index d14a3e111..16d4be682 100644 --- a/rigs/kenwood/ts870s.c +++ b/rigs/kenwood/ts870s.c @@ -481,19 +481,19 @@ static int ts870s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_AF: - return get_kenwood_level(rig, "AG", &val->f); + return get_kenwood_level(rig, "AG", val); case RIG_LEVEL_RF: - return get_kenwood_level(rig, "RG", &val->f); + return get_kenwood_level(rig, "RG", val); case RIG_LEVEL_SQL: - return get_kenwood_level(rig, "SQ", &val->f); + return get_kenwood_level(rig, "SQ", val); case RIG_LEVEL_MICGAIN: - return get_kenwood_level(rig, "MG", &val->f); + return get_kenwood_level(rig, "MG", val); case RIG_LEVEL_AGC: - ret = get_kenwood_level(rig, "GT", &val->f); + ret = get_kenwood_level(rig, "GT", val); agclevel = 255 * val->f; if (agclevel == 0) { val->i = 0; } diff --git a/rigs/kenwood/ts990s.c b/rigs/kenwood/ts990s.c index d13c42798..c3eb269ca 100644 --- a/rigs/kenwood/ts990s.c +++ b/rigs/kenwood/ts990s.c @@ -561,7 +561,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_MICGAIN: - retval = get_kenwood_level(rig, "MG", &val->f); + retval = get_kenwood_level(rig, "MG", val); if (retval != RIG_OK) { @@ -670,7 +670,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_VOXGAIN: - retval = get_kenwood_level(rig, "VG00", &val->f); + retval = get_kenwood_level(rig, "VG00", val); if (retval != RIG_OK) { @@ -680,7 +680,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_ANTIVOX: - retval = get_kenwood_level(rig, "VG00", &val->f); + retval = get_kenwood_level(rig, "VG00", val); if (retval != RIG_OK) { diff --git a/src/iofunc.c b/src/iofunc.c index 2aef03dc9..40621af90 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -665,7 +665,7 @@ int HAMLIB_API read_string(hamlib_port_t *p, struct timeval tv, tv_timeout, start_time, end_time, elapsed_time; int total_count = 0; - rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + rig_debug(RIG_DEBUG_TRACE, "%s called, rx_max=%ld\n", __func__, rxmax); if (!p || !rxbuffer) { @@ -766,6 +766,7 @@ int HAMLIB_API read_string(hamlib_port_t *p, } ++total_count; + rig_debug(RIG_DEBUG_TRACE, "%s: total_count=%d rxmax-1=%ld\n", __func__, total_count, rxmax-1); if (stopset && memchr(stopset, rxbuffer[total_count - 1], stopset_len)) { diff --git a/src/serial.c b/src/serial.c index 7104f4ec0..e507edce3 100644 --- a/src/serial.c +++ b/src/serial.c @@ -677,7 +677,16 @@ int ser_open(hamlib_port_t *p) /* * pathname is not uh_rig or uh_ptt: simply open() */ - ret = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY); + int i; + for(i=0, ret=-1;i<5 && ret < 0;++i) + { + ret = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY); + if (ret < 0) { + rig_debug(RIG_DEBUG_ERR, "%s: OPEN attempt#%d failed %d=%s\n", __func__, i+1, ret, strerror(errno)); + hl_usleep(100*1000); // 100ms between attempts + } + } + } } if (ret == -1)