]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/agilent-dmm/sched.c
agilent-dmm: split DIOD recv_conf into model specific functions
[libsigrok.git] / src / hardware / agilent-dmm / sched.c
index 2db3b74877f6af8685a2b352f1ae3389054eb27b..f2793fe79f49f94430c0eb0f79217035c66ede66 100644 (file)
@@ -17,6 +17,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <glib.h>
 #include <stdlib.h>
 #include <string.h>
@@ -120,8 +121,8 @@ SR_PRIV int agdmm_receive_data(int fd, int revents, void *cb_data)
 
        dispatch(sdi);
 
-       if (devc->limit_samples && devc->num_samples >= devc->limit_samples)
-               sdi->driver->dev_acquisition_stop(sdi, cb_data);
+       if (sr_sw_limits_check(&devc->limits))
+               sdi->driver->dev_acquisition_stop(sdi);
 
        return TRUE;
 }
@@ -264,6 +265,9 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match)
        struct dev_context *devc;
        struct sr_datafeed_packet packet;
        struct sr_datafeed_analog analog;
+       struct sr_analog_encoding encoding;
+       struct sr_analog_meaning meaning;
+       struct sr_analog_spec spec;
        float fvalue;
        const char *s;
        char *mstr;
@@ -291,22 +295,22 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match)
                        return SR_ERR;
                }
                g_free(mstr);
-               if (devc->cur_divider > 0)
-                       fvalue /= devc->cur_divider;
+               if (devc->cur_exponent != 0)
+                       fvalue *= powf(10, devc->cur_exponent);
        }
 
-       memset(&analog, 0, sizeof(struct sr_datafeed_analog));
-       analog.mq = devc->cur_mq;
-       analog.unit = devc->cur_unit;
-       analog.mqflags = devc->cur_mqflags;
-       analog.channels = sdi->channels;
+       sr_analog_init(&analog, &encoding, &meaning, &spec, 0);
+       analog.meaning->mq = devc->cur_mq;
+       analog.meaning->unit = devc->cur_unit;
+       analog.meaning->mqflags = devc->cur_mqflags;
+       analog.meaning->channels = sdi->channels;
        analog.num_samples = 1;
        analog.data = &fvalue;
        packet.type = SR_DF_ANALOG;
        packet.payload = &analog;
-       sr_session_send(devc->cb_data, &packet);
+       sr_session_send(sdi, &packet);
 
-       devc->num_samples++;
+       sr_sw_limits_update_samples_read(&devc->limits, 1);
 
        return SR_OK;
 }
@@ -328,7 +332,7 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                devc->cur_mq = SR_MQ_VOLTAGE;
                devc->cur_unit = SR_UNIT_VOLT;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "MV")) {
                if (devc->mode_tempaux) {
                        devc->cur_mq = SR_MQ_TEMPERATURE;
@@ -336,28 +340,28 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                         * is used, so we'll just default to Celsius. */
                        devc->cur_unit = SR_UNIT_CELSIUS;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
                } else {
                        devc->cur_mq = SR_MQ_VOLTAGE;
                        devc->cur_unit = SR_UNIT_VOLT;
                        devc->cur_mqflags = 0;
-                       devc->cur_divider = 1000;
+                       devc->cur_exponent = -3;
                }
        } else if (!strcmp(mstr, "A")) {
                devc->cur_mq = SR_MQ_CURRENT;
                devc->cur_unit = SR_UNIT_AMPERE;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "UA")) {
                devc->cur_mq = SR_MQ_CURRENT;
                devc->cur_unit = SR_UNIT_AMPERE;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 1000000;
+               devc->cur_exponent = -6;
        } else if (!strcmp(mstr, "FREQ")) {
                devc->cur_mq = SR_MQ_FREQUENCY;
                devc->cur_unit = SR_UNIT_HERTZ;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "RES")) {
                if (devc->mode_continuity) {
                        devc->cur_mq = SR_MQ_CONTINUITY;
@@ -367,12 +371,17 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                        devc->cur_unit = SR_UNIT_OHM;
                }
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
+       } else if (!strcmp(mstr, "DIOD")) {
+               devc->cur_mq = SR_MQ_VOLTAGE;
+               devc->cur_unit = SR_UNIT_VOLT;
+               devc->cur_mqflags = SR_MQFLAG_DIODE;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "CAP")) {
                devc->cur_mq = SR_MQ_CAPACITANCE;
                devc->cur_unit = SR_UNIT_FARAD;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else
                sr_dbg("Unknown first argument.");
        g_free(mstr);
@@ -408,7 +417,7 @@ static int recv_conf_u124x_5x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                devc->cur_mq = SR_MQ_VOLTAGE;
                devc->cur_unit = SR_UNIT_VOLT;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
                if (mstr[4] == ':') {
                        if (!strncmp(mstr + 5, "AC", 2)) {
                                devc->cur_mqflags |= SR_MQFLAG_AC | SR_MQFLAG_RMS;
@@ -426,27 +435,32 @@ static int recv_conf_u124x_5x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                devc->cur_mq = SR_MQ_CURRENT;
                devc->cur_unit = SR_UNIT_AMPERE;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "RES")) {
                devc->cur_mq = SR_MQ_RESISTANCE;
                devc->cur_unit = SR_UNIT_OHM;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "CAP")) {
                devc->cur_mq = SR_MQ_CAPACITANCE;
                devc->cur_unit = SR_UNIT_FARAD;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "FREQ")) {
                devc->cur_mq = SR_MQ_FREQUENCY;
                devc->cur_unit = SR_UNIT_HERTZ;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "CONT")) {
                devc->cur_mq = SR_MQ_CONTINUITY;
                devc->cur_unit = SR_UNIT_BOOLEAN;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
+       } else if (!strcmp(mstr, "DIOD")) {
+               devc->cur_mq = SR_MQ_VOLTAGE;
+               devc->cur_unit = SR_UNIT_VOLT;
+               devc->cur_mqflags = SR_MQFLAG_DIODE;
+               devc->cur_exponent = 0;
        } else if (!strncmp(mstr, "T1", 2) || !strncmp(mstr, "T2", 2)) {
                devc->cur_mq = SR_MQ_TEMPERATURE;
                m2 = g_match_info_fetch(match, 2);
@@ -456,7 +470,7 @@ static int recv_conf_u124x_5x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                        devc->cur_unit = SR_UNIT_CELSIUS;
                g_free(m2);
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else if (!strcmp(mstr, "SCOU")) {
                /*
                 * Switch counter, not supported. Not sure what values
@@ -467,7 +481,7 @@ static int recv_conf_u124x_5x(const struct sr_dev_inst *sdi, GMatchInfo *match)
                devc->cur_mq = SR_MQ_CURRENT;
                devc->cur_unit = SR_UNIT_PERCENTAGE;
                devc->cur_mqflags = 0;
-               devc->cur_divider = 0;
+               devc->cur_exponent = 0;
        } else {
                sr_dbg("Unknown first argument '%s'.", mstr);
        }
@@ -476,26 +490,6 @@ static int recv_conf_u124x_5x(const struct sr_dev_inst *sdi, GMatchInfo *match)
        return SR_OK;
 }
 
-static int recv_conf(const struct sr_dev_inst *sdi, GMatchInfo *match)
-{
-       struct dev_context *devc;
-       char *mstr;
-
-       sr_spew("CONF? response '%s'.", g_match_info_get_string(match));
-       devc = sdi->priv;
-       mstr = g_match_info_fetch(match, 1);
-       if (!strcmp(mstr, "DIOD")) {
-               devc->cur_mq = SR_MQ_VOLTAGE;
-               devc->cur_unit = SR_UNIT_VOLT;
-               devc->cur_mqflags = SR_MQFLAG_DIODE;
-               devc->cur_divider = 0;
-       } else
-               sr_dbg("Unknown single argument.");
-       g_free(mstr);
-
-       return SR_OK;
-}
-
 /* This comes in whenever the rotary switch is changed to a new position.
  * We could use it to determine the major measurement mode, but we already
  * have the output of CONF? for that, which is more detailed. However
@@ -514,7 +508,7 @@ SR_PRIV const struct agdmm_job agdmm_jobs_u12xx[] = {
        { 143, send_stat },
        { 1000, send_conf },
        { 143, send_fetc },
-       { 0, NULL }
+       ALL_ZERO
 };
 
 SR_PRIV const struct agdmm_recv agdmm_recvs_u123x[] = {
@@ -523,8 +517,8 @@ SR_PRIV const struct agdmm_recv agdmm_recvs_u123x[] = {
        { "^([-+][0-9]\\.[0-9]{8}E[-+][0-9]{2})$", recv_fetc },
        { "^\"(V|MV|A|UA|FREQ),(\\d),(AC|DC)\"$", recv_conf_u123x },
        { "^\"(RES|CAP),(\\d)\"$", recv_conf_u123x},
-       { "^\"(DIOD)\"$", recv_conf },
-       { NULL, NULL }
+       { "^\"(DIOD)\"$", recv_conf_u123x },
+       ALL_ZERO
 };
 
 SR_PRIV const struct agdmm_recv agdmm_recvs_u124x[] = {
@@ -535,8 +529,8 @@ SR_PRIV const struct agdmm_recv agdmm_recvs_u124x[] = {
        { "^\"(VOLT:[ACD]+) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)\"$", recv_conf_u124x_5x },
        { "^\"(CPER:[40]-20mA) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)\"$", recv_conf_u124x_5x },
        { "^\"(T[0-9]:[A-Z]+) ([A-Z]+)\"$", recv_conf_u124x_5x },
-       { "^\"(DIOD)\"$", recv_conf },
-       { NULL, NULL }
+       { "^\"(DIOD)\"$", recv_conf_u124x_5x },
+       ALL_ZERO
 };
 
 SR_PRIV const struct agdmm_recv agdmm_recvs_u125x[] = {
@@ -547,6 +541,6 @@ SR_PRIV const struct agdmm_recv agdmm_recvs_u125x[] = {
        { "^\"(VOLT:[ACD]+) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)\"$", recv_conf_u124x_5x },
        { "^\"(CPER:[40]-20mA) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)\"$", recv_conf_u124x_5x },
        { "^\"(T[0-9]:[A-Z]+) ([A-Z]+)\"$", recv_conf_u124x_5x },
-       { "^\"(DIOD)\"$", recv_conf },
-       { NULL, NULL }
+       { "^\"(DIOD)\"$", recv_conf_u124x_5x },
+       ALL_ZERO
 };