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; }
/* * 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; }
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; }
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; }
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; }
/* * 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; }