diff --git a/kenwood/pihpsdr.c b/kenwood/pihpsdr.c index 1d7819daf..b4b1e8410 100644 --- a/kenwood/pihpsdr.c +++ b/kenwood/pihpsdr.c @@ -62,6 +62,7 @@ /* prototypes */ static int pihpsdr_open(RIG *rig); static int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); +static int pihpsdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); static int pihspdr_get_channel(RIG *rig, channel_t *chan); static int pihspdr_set_channel(RIG *rig, const channel_t *chan); @@ -268,7 +269,7 @@ const struct rig_caps pihpsdr_caps = { .get_dcd = kenwood_get_dcd, .set_func = kenwood_set_func, .get_func = kenwood_get_func, -.set_level = kenwood_set_level, +.set_level = pihpsdr_set_level, .get_level = pihpsdr_get_level, .set_ant = kenwood_set_ant, .get_ant = kenwood_get_ant, @@ -638,6 +639,115 @@ int pihspdr_set_channel(RIG *rig, const channel_t *chan) return err; } +int pihpsdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) +{ + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + + if (!rig) + return -RIG_EINVAL; + + char levelbuf[16]; + int i, kenwood_val; + + if (RIG_LEVEL_IS_FLOAT(level)) + kenwood_val = val.f * 255; + else + kenwood_val = val.i; + + switch (level) { + case RIG_LEVEL_RFPOWER: + /* XXX check level range */ + sprintf(levelbuf, "PC%03d", kenwood_val); + break; + + case RIG_LEVEL_AF: + sprintf(levelbuf, "AG%03d", kenwood_val); + break; + + case RIG_LEVEL_RF: + /* XXX check level range */ + sprintf(levelbuf, "RG%03d", kenwood_val); + break; + + case RIG_LEVEL_SQL: + sprintf(levelbuf, "SQ%03d", kenwood_val); + break; + + case RIG_LEVEL_AGC: + if (kenwood_val == RIG_AGC_OFF) kenwood_val = 0; + else if (kenwood_val == RIG_AGC_SUPERFAST) kenwood_val = 5; + else if (kenwood_val == RIG_AGC_FAST) kenwood_val = 10; + else if (kenwood_val == RIG_AGC_MEDIUM) kenwood_val = 15; + else if (kenwood_val == RIG_AGC_SLOW) kenwood_val =20; + sprintf(levelbuf, "GT%03d", kenwood_val); + break; + + case RIG_LEVEL_ATT: + /* set the attenuator if a correct value is entered */ + if (val.i == 0) + sprintf(levelbuf, "RA00"); + else { + for (i=0; istate.attenuator[i]; i++) { + if (val.i == rig->state.attenuator[i]) + { + sprintf(levelbuf, "RA%02d", i+1); + break; + } + } + if (val.i != rig->state.attenuator[i]) + return -RIG_EINVAL; + } + break; + + case RIG_LEVEL_PREAMP: + /* set the preamp if a correct value is entered */ + if (val.i == 0) + sprintf(levelbuf, "PA0"); + else { + for (i=0; istate.preamp[i]; i++) { + if (val.i == rig->state.preamp[i]) + { + sprintf(levelbuf, "PA%01d", i+1); + break; + } + } + if (val.i != rig->state.preamp[i]) + return -RIG_EINVAL; + } + break; + + case RIG_LEVEL_SLOPE_HIGH: + if(val.i>20 || val.i < 0) + return -RIG_EINVAL; + sprintf(levelbuf, "SH%02d",(val.i)); + break; + + case RIG_LEVEL_SLOPE_LOW: + if(val.i>20 || val.i < 0) + return -RIG_EINVAL; + sprintf(levelbuf, "SL%02d",(val.i)); + break; + + case RIG_LEVEL_CWPITCH: + if(val.i > 1000 || val.i < 400) + return -RIG_EINVAL; + sprintf(levelbuf, "PT%02d", (val.i / 50) - 8); + break; + + case RIG_LEVEL_KEYSPD: + if(val.i > 50 || val.i < 5) + return -RIG_EINVAL; + sprintf(levelbuf, "KS%03d", val.i); + break; + + default: + rig_debug(RIG_DEBUG_ERR, "Unsupported set_level %d", level); + return -RIG_EINVAL; + } + + return kenwood_transaction(rig, levelbuf, NULL, 0); +} + /* * pihpsdr_get_level * Assumes rig!=NULL, val!=NULL @@ -647,7 +757,7 @@ int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { char lvlbuf[50]; size_t lvl_len; - int lvl, retval, ret, agclevel; + int lvl, retval; lvl_len = 50; switch (level) { @@ -820,15 +930,22 @@ int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->f = lvl / 100.0; break; - - case RIG_LEVEL_AGC: /* FIX ME: ts2000 returns 0 -20 for AGC */ - ret = get_kenwood_level(rig, "GT", &val->f); - agclevel = 255.0 * val->f; - if (agclevel == 0) val->i = 0; - else if (agclevel < 85) val->i = 1; - else if (agclevel < 170) val->i = 2; - else if (agclevel <= 255) val->i = 3; - return ret; + case RIG_LEVEL_AGC: /* pihpsdr defines the range 0 -20 for AGC (based on TS-2000) */ + retval = kenwood_transaction (rig, "GT", lvlbuf, sizeof (lvlbuf)); + if (retval != RIG_OK) + return retval; + lvl_len = strlen (lvlbuf); + if (lvl_len != 5) { + rig_debug(RIG_DEBUG_ERR,"pihpsdr_get_level: " + "unexpected answer len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + sscanf(lvlbuf+2, "%d", &lvl); + if (lvl == 0) val->i = RIG_AGC_OFF; /*pihspdr: OFF */ + else if (lvl < 6) val->i = RIG_AGC_SUPERFAST; /*pihspdr: 001-005 = FAST */ + else if (lvl < 11) val->i = RIG_AGC_FAST; /*pihspdr: 006-010 = MEDIUM */ + else if (lvl < 16) val->i = RIG_AGC_MEDIUM; /*pihspdr: 011-015 = SLOW */ + else if (lvl <= 20) val->i = RIG_AGC_SLOW; /*pihspdr: 016-020 = LONG */ break; case RIG_LEVEL_BKINDL: