int ts2000_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; lvl_len = 50; switch (level) { case RIG_LEVEL_PREAMP: retval = kenwood_transaction (rig, "PA", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if ((lvl_len != 4)){ /*TS-2000 returns 4 chars for PA; */ rig_debug(RIG_DEBUG_ERR,"%s: unexpected answer len=%d\n", __func__, lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); if (lvl < 10) /* just checking for main receiver preamp setting */ val->i = 0; if (lvl > 9) val->i = rig->state.preamp[0]; break; case RIG_LEVEL_ATT: retval = kenwood_transaction (rig, "RA", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if ((lvl_len != 6)){ /* TS-2000 returns 6 chars for RA; */ rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); if (lvl < 100) /* just checking main band attenuator */ val->i = 0; if (lvl > 99) val->i = rig->state.attenuator[0]; /* Since the TS-2000 only has one step on the attenuator */ break; case RIG_LEVEL_VOX: retval = kenwood_transaction (rig, "VD", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 6) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->i = lvl / 100; 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,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->f = lvl / 255.0; break; case RIG_LEVEL_RF: retval = kenwood_transaction (rig, "RG", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->f = lvl / 255.0; break; case RIG_LEVEL_SQL: retval = kenwood_transaction (rig, "SQ0", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 6) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+3, "%d", &lvl); val->f = lvl / 255.0; break; case RIG_LEVEL_CWPITCH: retval = kenwood_transaction (rig, "EX0310000", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 15) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d answer=%s\n", lvl_len, lvlbuf); return -RIG_ERJCTED; } sscanf(lvlbuf+8, "%d", &lvl); val->i = 400 + (50 * lvl); break; case RIG_LEVEL_RFPOWER: retval = kenwood_transaction (rig, "PC", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+3, "%d", &lvl); val->f = lvl / 100.0; /* FIXME: for 1.2GHZ need to divide by 10 */ break; case RIG_LEVEL_MICGAIN: retval = kenwood_transaction (rig, "MG", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->f = lvl / 100.0; break; case RIG_LEVEL_KEYSPD: retval = kenwood_transaction (rig, "KS", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->i = lvl; break; case RIG_LEVEL_NOTCHF: return -RIG_ENIMPL; break; case RIG_LEVEL_COMP: retval = kenwood_transaction (rig, "PL", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 8) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); lvl = lvl / 1000; 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; break; case RIG_LEVEL_BKINDL: retval = kenwood_transaction (rig, "SD", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 6) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->i = lvl / 100; break; case RIG_LEVEL_BALANCE: return -RIG_ENIMPL; break; case RIG_LEVEL_METER: retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 7) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->i = lvl / 10000; break; case RIG_LEVEL_VOXGAIN: retval = kenwood_transaction (rig, "VG", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5) { rig_debug(RIG_DEBUG_ERR,"ts2000_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); val->f = lvl / 9.0; break; case RIG_LEVEL_ANTIVOX: return -RIG_ENIMPL; break; case RIG_LEVEL_RAWSTR: case RIG_LEVEL_STRENGTH: retval = kenwood_transaction (rig, "SM0", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (( (lvl_len !=7)) || lvlbuf[1] != 'M') { /* TS-2000 returns 8 bytes for S meter level */ rig_debug(RIG_DEBUG_ERR,"%s: wrong answer len=%d\n", __func__, lvl_len); return -RIG_ERJCTED; } /* Frontend expects: -54 = S0, 0 = S9 */ sscanf(lvlbuf+3, "%d", &val->i); /* TS-2000 main receiver returns values from 0 - 30 */ /* so scale the value */ if (level == RIG_LEVEL_STRENGTH) val->i = (val->i * 3.6) - 54; break; default: rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level); return -RIG_EINVAL; } return RIG_OK; }
static int ts870s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { char lvlbuf[50]; size_t lvl_len; int lvl, retval; int i, ret, agclevel; switch (level) { case RIG_LEVEL_STRENGTH: retval = kenwood_transaction (rig, "SM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 6 || lvlbuf[1] != 'M') { rig_debug(RIG_DEBUG_ERR,"ts870s_get_level: " "wrong answer len=%d\n", lvl_len); return -RIG_ERJCTED; } /* Frontend expects: -54 = S0, 0 = S9 */ sscanf(lvlbuf+2, "%d", &val->i); val->i = (val->i * 3.6) - 54; break; case RIG_LEVEL_SWR: retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; /* set meter to SWR if needed */ if (lvlbuf[2] != '1') { retval = kenwood_transaction (rig, "RM1", NULL, 0); if (retval != RIG_OK) return retval; retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; } i=atoi(&lvlbuf[3]); if(i == 30) val->f = 150.0; /* infinity :-) */ else val->f = 60.0/(30.0-(float)i)-1.0; break; case RIG_LEVEL_COMP: retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; /* set meter to COMP if needed */ if (lvlbuf[2] != '2') { retval = kenwood_transaction (rig, "RM2", NULL, 0); if (retval != RIG_OK) return retval; retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; } val->f=(float)atoi(&lvlbuf[3])/30.0; break; case RIG_LEVEL_ALC: retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; /* set meter to ALC if needed */ if (lvlbuf[2] != '3') { retval = kenwood_transaction (rig, "RM3", NULL, 0); if (retval != RIG_OK) return retval; retval = kenwood_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; } val->f=(float)atoi(&lvlbuf[3])/30.0; break; case RIG_LEVEL_ATT: retval = kenwood_transaction (rig, "RA", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 4) { rig_debug(RIG_DEBUG_ERR,"ts870s_get_level: " "unexpected answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf(lvlbuf+2, "%d", &lvl); if (lvl == 0) { val->i = 0; } else { for (i=0; i<lvl && i<MAXDBLSTSIZ; i++) if (rig->state.attenuator[i] == 0) { rig_debug(RIG_DEBUG_ERR,"ts870s_get_level: " "unexpected att level %d\n", lvl); return -RIG_EPROTO; } if (i != lvl) return -RIG_EINTERNAL; val->i = rig->state.attenuator[i-1]; } break; case RIG_LEVEL_RFPOWER: /* RFPOWER is 0..100 and not 0..255 like all the other levels*/ retval = kenwood_transaction (rig, "PC", lvlbuf, sizeof (lvlbuf)); if (retval != RIG_OK) return retval; lvl_len = strlen (lvlbuf); if (lvl_len != 5 || lvlbuf[1] != 'C') { rig_debug(RIG_DEBUG_ERR,"ts870s_get_level: " "wrong answer len=%d\n", lvl_len); return -RIG_ERJCTED; } sscanf (lvlbuf + 2, "%d", &lvl); val->f = lvl/100.; break; case RIG_LEVEL_AF: return get_kenwood_level(rig, "AG", 2, &val->f); case RIG_LEVEL_RF: return get_kenwood_level(rig, "RG", 2, &val->f); case RIG_LEVEL_SQL: return get_kenwood_level(rig, "SQ", 2, &val->f); case RIG_LEVEL_MICGAIN: return get_kenwood_level(rig, "MG", 2, &val->f); case RIG_LEVEL_AGC: ret = get_kenwood_level(rig, "GT", 2, &val->f); agclevel = 255 * 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_IF: case RIG_LEVEL_APF: case RIG_LEVEL_NR: case RIG_LEVEL_PBT_IN: case RIG_LEVEL_PBT_OUT: case RIG_LEVEL_CWPITCH: case RIG_LEVEL_KEYSPD: case RIG_LEVEL_NOTCHF: case RIG_LEVEL_BKINDL: case RIG_LEVEL_BALANCE: return -RIG_ENIMPL; case RIG_LEVEL_PREAMP: return -RIG_ENAVAIL; default: rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level); return -RIG_EINVAL; } return RIG_OK; }
int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { char lvlbuf[50]; int lvl, retval = RIG_OK; if (RIG_VFO_CURR == vfo || RIG_VFO_VFO == vfo) { if (RIG_OK != (retval = kenwood_get_vfo_main_sub (rig, &vfo))) { return retval; } } switch (level) { case RIG_LEVEL_PREAMP: retval = kenwood_safe_transaction (rig, "PA", lvlbuf, sizeof (lvlbuf), 4); if (retval != RIG_OK) return retval; switch (vfo) { case RIG_VFO_MAIN: val->i = '1' == lvlbuf[2] ? rig->state.preamp[0] : 0; break; case RIG_VFO_SUB: val->i = '1' == lvlbuf[3] ? rig->state.preamp[0] : 0; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } break; case RIG_LEVEL_ATT: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "RA%c", v); retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 4); if (retval != RIG_OK) return retval; if ('0' == lvlbuf[3]) { val->i = 0; } else { val->i = rig->state.attenuator[lvlbuf[3] - '1']; } } break; case RIG_LEVEL_VOX: retval = kenwood_safe_transaction (rig, "VD0", lvlbuf, sizeof (lvlbuf), 6); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 3, "%d", &lvl); val->i = lvl * 3 / 2; /* 150ms units converted to 100ms units */ break; case RIG_LEVEL_AF: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "AG%c", v); retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 6); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 3, "%d", &lvl); val->f = lvl / 255.0; } break; case RIG_LEVEL_RF: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "RG%c", v); retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 6); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 3, "%d", &lvl); val->f = lvl / 255.0; } break; case RIG_LEVEL_SQL: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "SQ%c", v); retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 6); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 3, "%d", &lvl); val->f = lvl / 255.0; } break; case RIG_LEVEL_CWPITCH: retval = kenwood_safe_transaction (rig, "PT", lvlbuf, sizeof (lvlbuf), 5); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 2, "%d", &lvl); val->i = 300 + lvl * 10; break; case RIG_LEVEL_RFPOWER: retval = kenwood_safe_transaction (rig, "PC", lvlbuf, sizeof (lvlbuf), 5); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 2, "%d", &lvl); val->f = lvl / 200.0; /* TODO: should we detect AM and scale? */ break; case RIG_LEVEL_MICGAIN: retval = get_kenwood_level (rig, "MG", &val->f); if (retval != RIG_OK) return retval; break; case RIG_LEVEL_KEYSPD: retval = kenwood_safe_transaction (rig, "KS", lvlbuf, sizeof (lvlbuf), 5); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 2, "%d", &lvl); val->i = lvl; break; case RIG_LEVEL_COMP: retval = kenwood_safe_transaction (rig, "PL", lvlbuf, sizeof (lvlbuf), 8); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 2, "%d", &lvl); lvl = lvl / 1000; /* report input level */ val->f = lvl / 255.0; break; case RIG_LEVEL_AGC: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "GC%c", v); if (RIG_OK != (retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 4))) { return retval; } switch (lvlbuf[3]) { case '0': val->i = RIG_AGC_OFF; break; case '1': val->i = RIG_AGC_SLOW; break; case '2': val->i = RIG_AGC_MEDIUM; break; case '3': val->i = RIG_AGC_FAST; break; } } break; case RIG_LEVEL_BKINDL: retval = kenwood_safe_transaction (rig, "SD", lvlbuf, sizeof (lvlbuf), 6); if (retval != RIG_OK) return retval; sscanf(lvlbuf + 2, "%d", &lvl); val->i = lvl / 100; break; case RIG_LEVEL_METER: retval = kenwood_safe_transaction (rig, "RM", lvlbuf, sizeof (lvlbuf), 7); if (retval != RIG_OK) return retval; switch (lvlbuf[2]) { case '1': val->i = RIG_METER_ALC; break; case '2': val->i = RIG_METER_SWR; break; case '3': val->i = RIG_METER_COMP; break; case '4': val->i = RIG_METER_IC; break; case '5': val->i = RIG_METER_VDD; break; default: val->i = RIG_METER_NONE; break; } break; case RIG_LEVEL_VOXGAIN: retval = get_kenwood_level (rig, "VG00", &val->f); if (retval != RIG_OK) return retval; break; case RIG_LEVEL_ANTIVOX: retval = get_kenwood_level (rig, "VG00", &val->f); if (retval != RIG_OK) return retval; val->f = val->f * 255. / 20.; break; case RIG_LEVEL_RAWSTR: case RIG_LEVEL_STRENGTH: { char v; char cmd[4]; switch (vfo) { case RIG_VFO_MAIN: v = '0'; break; case RIG_VFO_SUB: v = '1'; break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %d\n", __func__, vfo); return -RIG_EINVAL; } sprintf (cmd, "SM%c", v); retval = kenwood_safe_transaction (rig, cmd, lvlbuf, sizeof (lvlbuf), 7); if (retval != RIG_OK) return retval; /* Frontend expects: -54 = S0, 0 = S9 */ sscanf(lvlbuf + 3, "%d", &val->i); /* TS-990s returns values from 0 - 70 */ /* so scale the value */ if (level == RIG_LEVEL_STRENGTH) val->i = (val->i * 54. / 70.) - 54; } break; default: rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d", level); return -RIG_EINVAL; } return retval; }