scpi-pps: Add infrastructure for controlling output frequency

This patch only adds the needed infrastructure to control output
frequency in the same manner as output voltage or current limit. This
does require a new field in the channel_spec struct, for the sake of
symmetry.
This commit is contained in:
Alexandru Gagniuc 2015-04-29 17:26:47 -07:00 committed by Uwe Hermann
parent a77585d4ae
commit 4264f1c03b
4 changed files with 42 additions and 10 deletions

View File

@ -38,6 +38,7 @@ static const struct pps_channel_instance pci[] = {
{ SR_MQ_VOLTAGE, SCPI_CMD_GET_MEAS_VOLTAGE, "V" },
{ SR_MQ_CURRENT, SCPI_CMD_GET_MEAS_CURRENT, "I" },
{ SR_MQ_POWER, SCPI_CMD_GET_MEAS_POWER, "P" },
{ SR_MQ_FREQUENCY, SCPI_CMD_GET_MEAS_FREQUENCY, "F" },
};
static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
@ -300,6 +301,14 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
gvtype = G_VARIANT_TYPE_DOUBLE;
cmd = SCPI_CMD_GET_VOLTAGE_TARGET;
break;
case SR_CONF_OUTPUT_FREQUENCY:
gvtype = G_VARIANT_TYPE_DOUBLE;
cmd = SCPI_CMD_GET_MEAS_FREQUENCY;
break;
case SR_CONF_OUTPUT_FREQUENCY_TARGET:
gvtype = G_VARIANT_TYPE_DOUBLE;
cmd = SCPI_CMD_GET_FREQUENCY_TARGET;
break;
case SR_CONF_OUTPUT_CURRENT:
gvtype = G_VARIANT_TYPE_DOUBLE;
cmd = SCPI_CMD_GET_MEAS_CURRENT;
@ -378,6 +387,10 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd
d = g_variant_get_double(data);
ret = scpi_cmd(sdi, SCPI_CMD_SET_VOLTAGE_TARGET, d);
break;
case SR_CONF_OUTPUT_FREQUENCY_TARGET:
d = g_variant_get_double(data);
ret = scpi_cmd(sdi, SCPI_CMD_SET_FREQUENCY_TARGET, d);
break;
case SR_CONF_OUTPUT_CURRENT_LIMIT:
d = g_variant_get_double(data);
ret = scpi_cmd(sdi, SCPI_CMD_SET_CURRENT_LIMIT, d);
@ -497,6 +510,16 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *
}
*data = g_variant_builder_end(&gvb);
break;
case SR_CONF_OUTPUT_FREQUENCY_TARGET:
ch_spec = &(devc->device->channels[ch->index]);
g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
/* Min, max, write resolution. */
for (i = 0; i < 3; i++) {
gvar = g_variant_new_double(ch_spec->frequency[i]);
g_variant_builder_add_value(&gvb, gvar);
}
*data = g_variant_builder_end(&gvb);
break;
case SR_CONF_OUTPUT_CURRENT_LIMIT:
g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
/* Min, max, step. */
@ -543,6 +566,8 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi,
return ret;
if (pch->mq == SR_MQ_VOLTAGE)
cmd = SCPI_CMD_GET_MEAS_VOLTAGE;
else if (pch->mq == SR_MQ_FREQUENCY)
cmd = SCPI_CMD_GET_MEAS_FREQUENCY;
else if (pch->mq == SR_MQ_CURRENT)
cmd = SCPI_CMD_GET_MEAS_CURRENT;
else if (pch->mq == SR_MQ_POWER)

View File

@ -24,6 +24,7 @@
#include "protocol.h"
#define CH_IDX(x) (1 << x)
#define FREQ_DC_ONLY {0, 0, 0}
const char *pps_vendors[][2] = {
{ "RIGOL TECHNOLOGIES", "Rigol" },
@ -61,7 +62,7 @@ static const uint32_t chroma_61604_devopts_cg[] = {
};
const struct channel_spec chroma_61604_ch[] = {
{ "1", { 0, 300, 0.1 }, { 0, 16, 0.1 } },
{ "1", { 0, 300, 0.1 }, { 0, 16, 0.1 }, FREQ_DC_ONLY },
};
const struct channel_group_spec chroma_61604_cg[] = {
@ -108,20 +109,20 @@ static const uint32_t rigol_dp800_devopts_cg[] = {
};
const struct channel_spec rigol_dp821a_ch[] = {
{ "1", { 0, 60, 0.001 }, { 0, 1, 0.0001 } },
{ "2", { 0, 8, 0.001 }, { 0, 10, 0.001 } },
{ "1", { 0, 60, 0.001 }, { 0, 1, 0.0001 }, FREQ_DC_ONLY },
{ "2", { 0, 8, 0.001 }, { 0, 10, 0.001 }, FREQ_DC_ONLY },
};
const struct channel_spec rigol_dp831_ch[] = {
{ "1", { 0, 8, 0.001 }, { 0, 5, 0.0003 } },
{ "2", { 0, 30, 0.001 }, { 0, 2, 0.0001 } },
{ "3", { 0, -30, 0.001 }, { 0, 2, 0.0001 } },
{ "1", { 0, 8, 0.001 }, { 0, 5, 0.0003 }, FREQ_DC_ONLY },
{ "2", { 0, 30, 0.001 }, { 0, 2, 0.0001 }, FREQ_DC_ONLY },
{ "3", { 0, -30, 0.001 }, { 0, 2, 0.0001 }, FREQ_DC_ONLY },
};
const struct channel_spec rigol_dp832_ch[] = {
{ "1", { 0, 30, 0.001 }, { 0, 3, 0.001 } },
{ "2", { 0, 30, 0.001 }, { 0, 3, 0.001 } },
{ "3", { 0, 5, 0.001 }, { 0, 3, 0.001 } },
{ "1", { 0, 30, 0.001 }, { 0, 3, 0.001 }, FREQ_DC_ONLY },
{ "2", { 0, 30, 0.001 }, { 0, 3, 0.001 }, FREQ_DC_ONLY },
{ "3", { 0, 5, 0.001 }, { 0, 3, 0.001 }, FREQ_DC_ONLY },
};
const struct channel_group_spec rigol_dp820_cg[] = {
@ -181,7 +182,7 @@ static const uint32_t hp_6632b_devopts[] = {
};
const struct channel_spec hp_6632b_ch[] = {
{ "1", { 0, 20.475, 0.005 }, { 0, 5.1188, 0.00132 } },
{ "1", { 0, 20.475, 0.005 }, { 0, 5.1188, 0.00132 }, FREQ_DC_ONLY },
};
const struct channel_group_spec hp_6632b_cg[] = {

View File

@ -227,6 +227,8 @@ SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data)
pch = devc->cur_channel->priv;
if (pch->mq == SR_MQ_VOLTAGE)
cmd = SCPI_CMD_GET_MEAS_VOLTAGE;
else if (pch->mq == SR_MQ_FREQUENCY)
cmd = SCPI_CMD_GET_MEAS_FREQUENCY;
else if (pch->mq == SR_MQ_CURRENT)
cmd = SCPI_CMD_GET_MEAS_CURRENT;
else if (pch->mq == SR_MQ_POWER)

View File

@ -37,8 +37,11 @@ enum pps_scpi_cmds {
SCPI_CMD_GET_MEAS_VOLTAGE,
SCPI_CMD_GET_MEAS_CURRENT,
SCPI_CMD_GET_MEAS_POWER,
SCPI_CMD_GET_MEAS_FREQUENCY,
SCPI_CMD_GET_VOLTAGE_TARGET,
SCPI_CMD_SET_VOLTAGE_TARGET,
SCPI_CMD_GET_FREQUENCY_TARGET,
SCPI_CMD_SET_FREQUENCY_TARGET,
SCPI_CMD_GET_CURRENT_LIMIT,
SCPI_CMD_SET_CURRENT_LIMIT,
SCPI_CMD_GET_OUTPUT_ENABLED,
@ -100,6 +103,7 @@ struct channel_spec {
/* Min, max, programming resolution. */
float voltage[3];
float current[3];
float frequency[3];
};
struct scpi_command {