diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 07702f14b..4d03aa3af 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -1584,7 +1584,7 @@ const struct rig_caps ic905_caps = { MHz(2300), MHz(2309.999999), IC705_ALL_TX_MODES, W(0.1), W(2), IC7300_VFOS, RIG_ANT_1, "EUR" }, { MHz(2390), MHz(2450), IC705_ALL_TX_MODES, W(0.1), W(2), IC7300_VFOS, RIG_ANT_1, "EUR" }, { MHz(5650), MHz(5925), IC705_ALL_TX_MODES, W(0.1), W(2), IC7300_VFOS, RIG_ANT_1, "EUR" }, - { MHz(10000), MHz(10500), IC705_ALL_TX_MODES, W(0.1), W(2), IC7300_VFOS, RIG_ANT_1, "USA" }, + { MHz(10000), MHz(10500), IC705_ALL_TX_MODES, W(0.1), W(2), IC7300_VFOS, RIG_ANT_1, "EUR" }, RIG_FRNG_END, }, @@ -2093,11 +2093,30 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) unsigned char ackbuf[MAXFRAMELEN]; int ack_len = sizeof(ackbuf), retval; - if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) + rig_debug(RIG_DEBUG_VERBOSE, "%s: vfo=%s\n", __func__, rig_strvfo(vfo)); + if (vfo == RIG_VFO_A) + { + retval = icom_transaction(rig, 0x07, 0x00, NULL, 0, ackbuf, &ack_len); + } + else if (vfo == RIG_VFO_B) + { + retval = icom_transaction(rig, 0x07, 0x01, NULL, 0, ackbuf, &ack_len); + } + else if (vfo == RIG_VFO_MAIN || vfo == RIG_VFO_MAIN_A || vfo == RIG_VFO_MAIN_B) { retval = icom_transaction(rig, 0x07, 0xd0, NULL, 0, ackbuf, &ack_len); + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: %s\n", __func__, rigerror(retval)); + return -retval; + } + if (vfo == RIG_VFO_MAIN_A || vfo == RIG_VFO_MAIN_B) + { + int subcmd = vfo == RIG_VFO_MAIN_A ? 0x00: 0x01; + retval = icom_transaction(rig, 0x07, subcmd, NULL, 0, ackbuf, &ack_len); + } } - else + else if (vfo == RIG_VFO_SUB || vfo == RIG_VFO_SUB_A || vfo == RIG_VFO_SUB_B) { if (rig->state.cache.satmode) { @@ -2105,7 +2124,19 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) // we return RIG_OK anyways as this should just be a bad request return RIG_OK; } + // first switch to sub retval = icom_transaction(rig, 0x07, 0xd1, NULL, 0, ackbuf, &ack_len); + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: %s\n", __func__, rigerror(retval)); + return -retval; + } + if (vfo == RIG_VFO_SUB_A || vfo == RIG_VFO_SUB_B) + { + HAMLIB_TRACE; + int subcmd = vfo == RIG_VFO_SUB_A ? 0x00: 0x01; + retval = icom_transaction(rig, 0x07, subcmd, NULL, 0, ackbuf, &ack_len); + } } if (retval != RIG_OK) diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 96b487255..1f863dc98 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1373,7 +1373,7 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) HAMLIB_TRACE; subcmd = 0x01; // get unselected VFO } - if (RIG_IS_IC7600) + if (RIG_IS_IC7600 || RIG_IS_IC9700) { // the 7600/7610 do it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too subcmd = 0; if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd = 1; @@ -1677,6 +1677,11 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) rig->caps->targetable_vfo = rig->state.targetable_vfo |= RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; } } + if (RIG_IS_IC9700) + { + subcmd2 = 0; + if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd2 = 1; + } retval = icom_transaction(rig, cmd2, subcmd2, NULL, 0, freqbuf, &freq_len); diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 57d25c19f..4652c32ad 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include #endif -#define BACKEND_VER "20230716" +#define BACKEND_VER "20230718" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) diff --git a/src/misc.c b/src/misc.c index 5180143c3..827c6b06c 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1940,7 +1940,8 @@ vfo_t HAMLIB_API vfo_fixup(RIG *rig, vfo_t vfo, split_t split) __func__, funcname, linenum, rig_strvfo(vfo), rig_strvfo(rig->state.current_vfo), split); - if (rig->caps->rig_model == RIG_MODEL_ID5100) + if (rig->caps->rig_model == RIG_MODEL_ID5100 + || rig->caps->rig_model == RIG_MODEL_IC9700) { return vfo; // no change to requested vfo }