X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fscpi-pps%2Fprotocol.h;h=279977f1d3de106b94d3787a126258f0f87bc071;hp=7a06093fb3ad2d8079c49cb9e0f42325b89c8ccd;hb=5433907ed99c40e948b8350f55845dd88a5cbbe6;hpb=4a471029c230a7e2e0b15528d22bf30fb7cf2472 diff --git a/src/hardware/scpi-pps/protocol.h b/src/hardware/scpi-pps/protocol.h index 7a06093f..279977f1 100644 --- a/src/hardware/scpi-pps/protocol.h +++ b/src/hardware/scpi-pps/protocol.h @@ -2,6 +2,7 @@ * This file is part of the libsigrok project. * * Copyright (C) 2014 Bert Vermeulen + * Copyright (C) 2017,2019 Frank Stettner * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,13 +23,14 @@ #include #include -#include "libsigrok.h" +#include #include "libsigrok-internal.h" +#include "scpi.h" #define LOG_PREFIX "scpi-pps" enum pps_scpi_cmds { - SCPI_CMD_REMOTE, + SCPI_CMD_REMOTE = 1, SCPI_CMD_LOCAL, SCPI_CMD_BEEPER, SCPI_CMD_BEEPER_ENABLE, @@ -37,8 +39,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, @@ -48,6 +53,7 @@ enum pps_scpi_cmds { SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION, SCPI_CMD_SET_OVER_TEMPERATURE_PROTECTION_ENABLE, SCPI_CMD_SET_OVER_TEMPERATURE_PROTECTION_DISABLE, + SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION_ACTIVE, SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ENABLED, SCPI_CMD_SET_OVER_VOLTAGE_PROTECTION_ENABLE, SCPI_CMD_SET_OVER_VOLTAGE_PROTECTION_DISABLE, @@ -62,6 +68,15 @@ enum pps_scpi_cmds { SCPI_CMD_SET_OVER_CURRENT_PROTECTION_THRESHOLD, }; +/* Defines the SCPI dialect */ +enum pps_scpi_dialect { + SCPI_DIALECT_UNKNOWN = 1, + SCPI_DIALECT_HP_COMP, + SCPI_DIALECT_HP_66XXB, + SCPI_DIALECT_PHILIPS, + SCPI_DIALECT_HMP, +}; + /* * These are bit values denoting features a device can have either globally, * in scpi_pps.features, or on a per-channel-group basis in @@ -77,52 +92,57 @@ enum pps_features { }; struct scpi_pps { - char *vendor; - char *model; + const char *vendor; + const char *model; + const enum pps_scpi_dialect dialect; uint64_t features; const uint32_t *devopts; unsigned int num_devopts; const uint32_t *devopts_cg; unsigned int num_devopts_cg; - struct channel_spec *channels; + const struct channel_spec *channels; unsigned int num_channels; - struct channel_group_spec *channel_groups; + const struct channel_group_spec *channel_groups; unsigned int num_channel_groups; - struct scpi_command *commands; - unsigned int num_commands; + const struct scpi_command *commands; int (*probe_channels) (struct sr_dev_inst *sdi, struct sr_scpi_hw_info *hwinfo, struct channel_spec **channels, unsigned int *num_channels, struct channel_group_spec **channel_groups, unsigned int *num_channel_groups); + int (*init_acquisition) (const struct sr_dev_inst *sdi); + int (*update_status) (const struct sr_dev_inst *sdi); }; struct channel_spec { - char *name; - /* Min, max, programming resolution. */ - float voltage[3]; - float current[3]; -}; - -struct scpi_command { - int command; - char *string; + const char *name; + /* Min, max, programming resolution, spec digits, encoding digits. */ + double voltage[5]; + double current[5]; + double power[5]; + double frequency[5]; + double ovp[5]; + double ocp[5]; }; struct channel_group_spec { - char *name; + const char *name; uint64_t channel_index_mask; uint64_t features; + /* The mqflags will only be applied to voltage and current channels! */ + enum sr_mqflag mqflags; }; struct pps_channel { - int mq; + enum sr_mq mq; + enum sr_mqflag mqflags; unsigned int hw_output_idx; - char *hwname; + const char *hwname; + int digits; }; struct pps_channel_instance { - int mq; + enum sr_mq mq; int command; - char *prefix; + const char *prefix; }; struct pps_channel_group { @@ -135,31 +155,21 @@ enum acq_states { STATE_STOP, }; -/** Private, per-device-instance driver context. */ struct dev_context { - /* Model-specific information */ const struct scpi_pps *device; - /* Acquisition settings */ - void *cb_data; - - /* Operational state */ gboolean beeper_was_set; struct channel_spec *channels; struct channel_group_spec *channel_groups; - /* Temporary state across callbacks */ - struct sr_channel *cur_channel; + struct sr_channel *cur_acquisition_channel; + struct sr_sw_limits limits; }; -const char *get_vendor(const char *raw_vendor); -SR_PRIV char *scpi_cmd_get(const struct sr_dev_inst *sdi, int command); -SR_PRIV int scpi_cmd(const struct sr_dev_inst *sdi, int command, ...); -SR_PRIV int scpi_cmd_resp(const struct sr_dev_inst *sdi, GVariant **gvar, - const GVariantType *gvtype, int command, ...); +SR_PRIV extern unsigned int num_pps_profiles; +SR_PRIV extern const struct scpi_pps pps_profiles[]; + SR_PRIV int select_channel(const struct sr_dev_inst *sdi, struct sr_channel *ch); -SR_PRIV struct sr_channel *next_enabled_channel(const struct sr_dev_inst *sdi, - struct sr_channel *cur_channel); SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data); #endif