X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fscpi-pps%2Fprotocol.c;h=b6049dc3f75c925e141db3e46c2e1924b3244c6d;hp=1572a3eadd06e9ce3fe9f709c421007c5b7f6334;hb=9e45cd41fd1618238c8a3afc56d4031c984bc3c5;hpb=a1eaa9e066ff8d86db8a1fba6615204d442c53d7 diff --git a/src/hardware/scpi-pps/protocol.c b/src/hardware/scpi-pps/protocol.c index 1572a3ea..b6049dc3 100644 --- a/src/hardware/scpi-pps/protocol.c +++ b/src/hardware/scpi-pps/protocol.c @@ -17,14 +17,52 @@ * along with this program. If not, see . */ +#include +#include #include "protocol.h" +SR_PRIV int scpi_cmd(const struct sr_dev_inst *sdi, int command, ...) +{ + va_list args; + struct dev_context *devc; + struct sr_scpi_dev_inst *scpi; + unsigned int i; + int ret; + char *cmd; + + devc = sdi->priv; + cmd = NULL; + for (i = 0; i < devc->device->num_commands; i++) { + if (devc->device->commands[i].command == command) { + cmd = devc->device->commands[i].string; + break; + } + } + if (!cmd) { + /* Device does not implement this command, that's OK. */ + return SR_OK_CONTINUE; + } + + scpi = sdi->conn; + va_start(args, command); + ret = sr_scpi_send_variadic(scpi, cmd, args); + va_end(args); + + return ret; +} + SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data) { - const struct sr_dev_inst *sdi; struct dev_context *devc; + struct sr_datafeed_packet packet; + struct sr_datafeed_analog analog; + const struct sr_dev_inst *sdi; + struct sr_scpi_dev_inst *scpi; + GSList *l; + float f; (void)fd; + (void)revents; if (!(sdi = cb_data)) return TRUE; @@ -32,8 +70,50 @@ SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data) if (!(devc = sdi->priv)) return TRUE; - if (revents == G_IO_IN) { - /* TODO */ + if (devc->state == STATE_STOP) + return TRUE; + + scpi = sdi->conn; + + /* Retrieve requested value for this state. */ + if (sr_scpi_get_float(scpi, NULL, &f) == SR_OK) { + packet.type = SR_DF_ANALOG; + packet.payload = &analog; + analog.channels = g_slist_append(NULL, devc->cur_channel); + analog.num_samples = 1; + if (devc->state == STATE_VOLTAGE) { + analog.mq = SR_MQ_VOLTAGE; + analog.unit = SR_UNIT_VOLT; + } else { + analog.mq = SR_MQ_CURRENT; + analog.unit = SR_UNIT_AMPERE; + } + analog.mqflags = SR_MQFLAG_DC; + analog.data = &f; + sr_session_send(sdi, &packet); + g_slist_free(analog.channels); + } + + if (devc->state == STATE_VOLTAGE) { + /* Just got voltage, request current for this channel. */ + devc->state = STATE_CURRENT; + scpi_cmd(sdi, SCPI_CMD_GET_MEAS_CURRENT, devc->cur_channel->name); + } else if (devc->state == STATE_CURRENT) { + /* + * Done with voltage and current for this channel, switch to + * the next enabled channel. + */ + do { + l = g_slist_find(sdi->channels, devc->cur_channel); + if (l->next) + devc->cur_channel = l->next->data; + else + devc->cur_channel = sdi->channels->data; + } while (!devc->cur_channel->enabled); + + /* Request voltage. */ + devc->state = STATE_VOLTAGE; + scpi_cmd(sdi, SCPI_CMD_GET_MEAS_VOLTAGE, devc->cur_channel->name); } return TRUE;