kopia lustrzana https://github.com/Hamlib/Hamlib
Fix K3/K3S/KX2/KX3 RFPOWER set/get for band specific power levels
rodzic
614627d8ba
commit
3f94e66c9f
|
@ -94,8 +94,9 @@ int elecraft_get_firmware_revision_level(RIG *rig, const char *cmd,
|
||||||
int elecraft_open(RIG *rig)
|
int elecraft_open(RIG *rig)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
char id[KENWOOD_MAX_BUF_LEN];
|
char buf[KENWOOD_MAX_BUF_LEN];
|
||||||
struct kenwood_priv_data *priv = rig->state.priv;
|
struct kenwood_priv_data *priv = rig->state.priv;
|
||||||
|
char *model = "Unknown";
|
||||||
|
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called, rig version=%s\n", __func__,
|
rig_debug(RIG_DEBUG_VERBOSE, "%s called, rig version=%s\n", __func__,
|
||||||
|
@ -134,7 +135,7 @@ int elecraft_open(RIG *rig)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = read_string(&rs->rigport, id, sizeof(id), ";", 1);
|
err = read_string(&rs->rigport, buf, sizeof(buf), ";", 1);
|
||||||
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +143,7 @@ int elecraft_open(RIG *rig)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: id=%s\n", __func__, id);
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: id=%s\n", __func__, buf);
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
if (err != RIG_OK)
|
if (err != RIG_OK)
|
||||||
|
@ -155,7 +156,7 @@ int elecraft_open(RIG *rig)
|
||||||
}
|
}
|
||||||
else // Standard Kenwood
|
else // Standard Kenwood
|
||||||
{
|
{
|
||||||
err = verify_kenwood_id(rig, id);
|
err = verify_kenwood_id(rig, buf);
|
||||||
|
|
||||||
if (err != RIG_OK)
|
if (err != RIG_OK)
|
||||||
{
|
{
|
||||||
|
@ -182,6 +183,32 @@ int elecraft_open(RIG *rig)
|
||||||
case RIG_MODEL_K3S:
|
case RIG_MODEL_K3S:
|
||||||
case RIG_MODEL_KX2:
|
case RIG_MODEL_KX2:
|
||||||
case RIG_MODEL_KX3:
|
case RIG_MODEL_KX3:
|
||||||
|
// we need to know what's hooked up for PC command max levels
|
||||||
|
err = kenwood_safe_transaction(rig, "OM", buf, KENWOOD_MAX_BUF_LEN, 15);
|
||||||
|
if (err != RIG_OK) { return err; }
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: OM=%s\n", __func__, buf);
|
||||||
|
priv->has_kpa3 = 0;
|
||||||
|
if (strstr(buf,"P")) priv->has_kpa3 = 1;
|
||||||
|
if (buf[13] == '0') // then we have a KX3 or KX2
|
||||||
|
{
|
||||||
|
char modelnum;
|
||||||
|
modelnum = buf[14];
|
||||||
|
switch (modelnum)
|
||||||
|
{
|
||||||
|
case '1': model = "KX2";break;
|
||||||
|
case '2': model = "KX3";break;
|
||||||
|
default:
|
||||||
|
rig_debug(RIG_DEBUG_ERR, "%s: Unknown Elecraft modelnum=%c, expected 1 or 2\n", __func__, modelnum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strstr(buf,"P")) priv->has_kpa100 = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
model = "K3";
|
||||||
|
if (strstr(buf,"R")) model = "K3S";
|
||||||
|
}
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: model=%s, kpa3%d\n", __func__, model, priv->has_kpa3);
|
||||||
|
|
||||||
err = elecraft_get_extension_level(rig, "K2", &priv->k2_ext_lvl);
|
err = elecraft_get_extension_level(rig, "K2", &priv->k2_ext_lvl);
|
||||||
|
|
||||||
if (err != RIG_OK)
|
if (err != RIG_OK)
|
||||||
|
|
|
@ -1579,6 +1579,48 @@ int k3_get_split_mode(RIG *rig, vfo_t vfo, rmode_t *tx_mode,
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int k3_get_maxpower(RIG *rig)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
int maxpower = 12; // K3 default power level
|
||||||
|
char levelbuf[16];
|
||||||
|
struct kenwood_priv_data *priv = rig->state.priv;
|
||||||
|
// default range is 0-12 if there is no KPA3 installed
|
||||||
|
if (priv->has_kpa3 || priv->has_kpa100) maxpower = 110;
|
||||||
|
if (RIG_IS_KX2 || RIG_IS_KX3) {
|
||||||
|
|
||||||
|
int bandnum = -1;
|
||||||
|
retval = kenwood_safe_transaction(rig, "BN", levelbuf, KENWOOD_MAX_BUF_LEN, 4);
|
||||||
|
if (retval != RIG_OK) { return retval; }
|
||||||
|
sscanf(levelbuf,"BN%d", &bandnum);
|
||||||
|
switch(bandnum)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
maxpower = 15;
|
||||||
|
break;
|
||||||
|
case 0: // 160M
|
||||||
|
case 6: // 17M
|
||||||
|
case 7: // 15M
|
||||||
|
case 8: // 12M
|
||||||
|
case 9: // 10M
|
||||||
|
maxpower = 12;
|
||||||
|
break;
|
||||||
|
case 10: // 6M
|
||||||
|
maxpower = 10;
|
||||||
|
break;
|
||||||
|
default: // are transverters all limited to 3W??
|
||||||
|
maxpower = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: maxpower=%d\n", __func__, maxpower);
|
||||||
|
return maxpower;
|
||||||
|
}
|
||||||
|
|
||||||
int k3_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
int k3_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
||||||
{
|
{
|
||||||
char levelbuf[16];
|
char levelbuf[16];
|
||||||
|
@ -1682,8 +1724,7 @@ int k3_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RIG_LEVEL_RFPOWER:
|
case RIG_LEVEL_RFPOWER:
|
||||||
// range is 0-12 if there is no KPA3 installed
|
snprintf(levelbuf, sizeof(levelbuf), "PC%03d", (int)(val.f * k3_get_maxpower(rig)));
|
||||||
snprintf(levelbuf, sizeof(levelbuf), "PC%03d", (int)(val.f * 12.0f));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1957,6 +1998,17 @@ int k3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
sscanf(levelbuf + 2, "%d", &lvl);
|
sscanf(levelbuf + 2, "%d", &lvl);
|
||||||
val->f = (float) lvl / 60.0f;
|
val->f = (float) lvl / 60.0f;
|
||||||
break;
|
break;
|
||||||
|
case RIG_LEVEL_RFPOWER:
|
||||||
|
retval = kenwood_safe_transaction(rig, "PC", levelbuf, sizeof(levelbuf), 5);
|
||||||
|
|
||||||
|
if (retval != RIG_OK)
|
||||||
|
{
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
sscanf(levelbuf + 2, "%d", &lvl);
|
||||||
|
val->f = (float) lvl / k3_get_maxpower(rig);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return kenwood_get_level(rig, vfo, level, val);
|
return kenwood_get_level(rig, vfo, level, val);
|
||||||
|
|
|
@ -117,6 +117,8 @@ struct kenwood_priv_data
|
||||||
int k2_ext_lvl; /* Initial K2 extension level */
|
int k2_ext_lvl; /* Initial K2 extension level */
|
||||||
int k3_ext_lvl; /* Initial K3 extension level */
|
int k3_ext_lvl; /* Initial K3 extension level */
|
||||||
int k2_md_rtty; /* K2 RTTY mode available flag, 1 = RTTY, 0 = N/A */
|
int k2_md_rtty; /* K2 RTTY mode available flag, 1 = RTTY, 0 = N/A */
|
||||||
|
int has_kpa3; /* Elecraft K3 has k3pa for PC command */
|
||||||
|
int has_kpa100; /* Elecraft KX3/KX2 has kpa100 for PC command */
|
||||||
char *fw_rev; /* firmware revision level */
|
char *fw_rev; /* firmware revision level */
|
||||||
int trn_state; /* AI state discovered at startup */
|
int trn_state; /* AI state discovered at startup */
|
||||||
unsigned fw_rev_uint; /* firmware revision as a number 1.07 -> 107 */
|
unsigned fw_rev_uint; /* firmware revision as a number 1.07 -> 107 */
|
||||||
|
|
Ładowanie…
Reference in New Issue