Beispiel #1
0
int sprintf_level_gran(char *str, setting_t level, const gran_t gran[])
{
    int i, len = 0;

    *str = '\0';

    if (level == RIG_LEVEL_NONE)
    {
        return 0;
    }

    for (i = 0; i < RIG_SETTING_MAX; i++)
    {
        const char *ms;

        if (!(level & rig_idx2setting(i)))
        {
            continue;
        }

        ms = rig_strlevel(level & rig_idx2setting(i));

        if (!ms || !ms[0])
        {
            if (level != DUMMY_ALL && level != RIG_LEVEL_SET(DUMMY_ALL))
            {
                rig_debug(RIG_DEBUG_BUG, "unknown level idx %d\n", i);
            }

            continue;
        }

        if (RIG_LEVEL_IS_FLOAT(rig_idx2setting(i)))
        {
            len += sprintf(str + len,
                           "%s(%g..%g/%g) ",
                           ms,
                           gran[i].min.f,
                           gran[i].max.f,
                           gran[i].step.f);
        }
        else
        {
            len += sprintf(str + len,
                           "%s(%d..%d/%d) ",
                           ms,
                           gran[i].min.i,
                           gran[i].max.i,
                           gran[i].step.i);
        }
    }

    return len;
}
Beispiel #2
0
/*
 * optoscan_set_level
 * Assumes rig!=NULL, rig->state.priv!=NULL
 */
int optoscan_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
{
	unsigned char lvlbuf[MAXFRAMELEN], ackbuf[MAXFRAMELEN];
	int ack_len;
	int lvl_cn, lvl_sc;		/* Command Number, Subcommand */
	int icom_val;
	int retval;

	memset(lvlbuf, 0, MAXFRAMELEN);

	/*
	 * So far, levels of float type are in [0.0..1.0] range
	 */
	if (RIG_LEVEL_IS_FLOAT(level))
		icom_val = val.f * 255;
	else
		icom_val = val.i;

	switch (level) {
	case RIG_LEVEL_AF:
		lvl_cn = C_CTL_MISC;

		if (icom_val == 0) {
			lvl_sc = S_OPTO_SPKROFF;
		} else {
			lvl_sc = S_OPTO_SPKRON;
		}

		break;

	default:
		rig_debug(RIG_DEBUG_ERR, "Unsupported set_level %d", level);
		return -RIG_EINVAL;
	}

	retval = icom_transaction(rig, lvl_cn, lvl_sc, lvlbuf, 0,
				  ackbuf, &ack_len);

	if (retval != RIG_OK)
		return retval;

	if (ack_len != 1 || ackbuf[0] != ACK) {
		rig_debug(RIG_DEBUG_ERR, "optoscan_set_level: ack NG (%#.2x), "
			  "len=%d\n", ackbuf[0], ack_len);
		return -RIG_ERJCTED;
	}

	return RIG_OK;
}
Beispiel #3
0
static int netrigctl_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{
  int ret, len;
  char cmd[CMD_MAX];
  char buf[BUF_MAX];

  rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __FUNCTION__);

  len = sprintf(cmd, "l %s\n", rig_strlevel(level));

  ret = netrigctl_transaction(rig, cmd, len, buf);
  if (ret <= 0)
	return (ret < 0) ? ret : -RIG_EPROTO;

  if (RIG_LEVEL_IS_FLOAT(level))
  	val->f = atof(buf);
  else
  	val->i = atoi(buf);

  return RIG_OK;
}
Beispiel #4
0
static int netrigctl_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
{
  int ret, len;
  char cmd[CMD_MAX];
  char buf[BUF_MAX];
  char lstr[32];

  rig_debug(RIG_DEBUG_VERBOSE,"%s called\n", __FUNCTION__);

  if (RIG_LEVEL_IS_FLOAT(level))
	sprintf(lstr, "%f", val.f);
  else
	sprintf(lstr, "%d", val.i);

  len = sprintf(cmd, "L %s %s\n", rig_strlevel(level), lstr);

  ret = netrigctl_transaction(rig, cmd, len, buf);
  if (ret > 0)
	return -RIG_EPROTO;
  else
  	return ret;

}
Beispiel #5
0
int
pcr_set_level(RIG * rig, vfo_t vfo, setting_t level, value_t val)
{
	int err = -RIG_ENIMPL;

	if (RIG_LEVEL_IS_FLOAT(level)) {
		rig_debug(RIG_DEBUG_VERBOSE, "%s: level = %d, val = %f\n",
				__func__, level, val.f);
	}
        else {
		rig_debug(RIG_DEBUG_VERBOSE, "%s: level = %d, val = %d\n",
				__func__, level, val.i);
	}

	switch (level) {
	case RIG_LEVEL_ATT:
		/* This is only on or off, but hamlib forces to use set level
		 * and pass as a float. Here we'll use 0 for off and 1 for on.
		 * If someone finds out how to set the ATT for the PCR in dB, let us
		 * know and the function can be changed to allow a true set level.
		 *
		 * Experiment shows it seems to have an effect, but unsure by how many db
		 */
		return pcr_set_attenuator(rig, vfo, val.i);

	case RIG_LEVEL_IF:
		return pcr_set_if_shift(rig, vfo, val.i);

	case RIG_LEVEL_CWPITCH: /* BFO */
		return pcr_set_bfo_shift(rig, vfo, val.i);

	case RIG_LEVEL_AGC:
		/* Only AGC on/off supported by PCR's */
		return pcr_set_agc(rig, vfo, val.i==RIG_AGC_OFF ? 0 : 1);

	/* floats */

	case RIG_LEVEL_AF:
		/* "val" can be 0.0 to 1.0 float which is 0 to 255 levels
		 * 0.3 seems to be ok in terms of loudness
		 */
		return pcr_set_volume(rig, vfo, val.f);

	case RIG_LEVEL_SQL:
		/* "val" can be 0.0 to 1.0 float
		 *      .... rig supports 0 to FF - look at function for
		 *      squelch "bands"
		 */
		return pcr_set_squelch(rig, vfo, val.f);

	case RIG_LEVEL_NR:
		/* This selectss the DSP unit - this isn't a level per se,
		 * but in the manual it says that we have to switch it on first
		 * we'll assume 1 is for the UT-106, and anything else as off
		 *
		 * Later on we can set if the DSP features are on or off in set_func
		 */
		/* return pcr_set_dsp(rig, vfo, (int) val.f); */
		return pcr_set_dsp_noise_reducer(rig, vfo, val.f);
	}

	return err;
}
Beispiel #6
0
/*
 * optoscan_get_level
 * Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL
 */
int optoscan_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{
	struct optostat status_block;
	unsigned char lvlbuf[MAXFRAMELEN];
	int lvl_len = 0;
	int lvl_cn, lvl_sc;		/* Command Number, Subcommand */
	int icom_val;
	int cmdhead;
	int retval;

	if (level != RIG_LEVEL_AF) {
		switch (level) {
		case RIG_LEVEL_RAWSTR:
			lvl_cn = C_RD_SQSM;
			lvl_sc = S_SML;
			break;

		default:
			rig_debug(RIG_DEBUG_ERR, "Unsupported get_level %d", level);
			return -RIG_EINVAL;
		}

		retval = icom_transaction(rig, lvl_cn, lvl_sc, NULL, 0,
					  lvlbuf, &lvl_len);

		if (retval != RIG_OK)
			return retval;

		/*
		 * strbuf should contain Cn,Sc,Data area
		 */
		cmdhead = (lvl_sc == -1) ? 1 : 2;
		lvl_len -= cmdhead;

		if (lvlbuf[0] != ACK && lvlbuf[0] != lvl_cn) {
			rig_debug(RIG_DEBUG_ERR, "optoscan_get_level: ack NG (%#.2x), "
				  "len=%d\n", lvlbuf[0], lvl_len);
			return -RIG_ERJCTED;
		}

		/*
		 * The result is a 3 digit BCD, but in *big endian* order: 0000..0255
		 * (from_bcd is little endian)
		 */
		icom_val = from_bcd_be(lvlbuf + cmdhead, lvl_len * 2);
	} else { /* level == RIG_LEVEL_AF */
		retval = optoscan_get_status_block(rig, &status_block);

		if (retval != RIG_OK)
			return retval;

		icom_val = 0;

		if (status_block.speaker_enabled == 1)
			icom_val = 255;
	}

	switch (level) {
	case RIG_LEVEL_RAWSTR:
		val->i = icom_val;
		break;

	default:
		if (RIG_LEVEL_IS_FLOAT(level))
			val->f = (float)icom_val / 255;
		else
			val->i = icom_val;
	}

	rig_debug(RIG_DEBUG_TRACE, "optoscan_get_level: %d %d %d %f\n", lvl_len,
		  icom_val, val->i, val->f);

	return RIG_OK;
}