コード例 #1
0
ファイル: ts2000.c プロジェクト: mdblack98/hamlib
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;
}
コード例 #2
0
ファイル: ts870s.c プロジェクト: alexschultze/hamlib
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;
}
コード例 #3
0
ファイル: ts990s.c プロジェクト: mdblack98/hamlib
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;
}