X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fagilent-dmm%2Fsched.c;h=d7d720d3227af38c87efc2ffb9eaf46cb4a5350d;hb=0e94d524c19fe89c564243421d37c17818f87631;hp=b59e5091f4cde4ee5cbfbc99d05364f86ed5cf2e;hpb=a4394fb3d9362cc686d6f8a05d2bc0b219903069;p=libsigrok.git diff --git a/hardware/agilent-dmm/sched.c b/hardware/agilent-dmm/sched.c index b59e5091..d7d720d3 100644 --- a/hardware/agilent-dmm/sched.c +++ b/hardware/agilent-dmm/sched.c @@ -20,14 +20,12 @@ #include #include "libsigrok.h" #include "libsigrok-internal.h" -#include "config.h" #include "agilent-dmm.h" #include #include #include #include - static void dispatch(const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -40,12 +38,11 @@ static void dispatch(const struct sr_dev_inst *sdi) now = g_get_monotonic_time() / 1000; for (i = 0; (&jobs[i])->interval; i++) { if (now - devc->jobqueue[i] > (&jobs[i])->interval) { - sr_spew("agilent-dmm: running job %d", i); + sr_spew("Running job %d.", i); (&jobs[i])->send(sdi); devc->jobqueue[i] = now; } } - } static void receive_line(const struct sr_dev_inst *sdi) @@ -66,7 +63,7 @@ static void receive_line(const struct sr_dev_inst *sdi) else break; } - sr_spew("agilent-dmm: received '%s'", devc->buf); + sr_spew("Received '%s'.", devc->buf); recv = NULL; recvs = devc->profile->recvs; @@ -84,19 +81,20 @@ static void receive_line(const struct sr_dev_inst *sdi) g_match_info_unref(match); g_regex_unref(reg); } else - sr_dbg("agilent-dmm: unknown line '%s'", devc->buf); + sr_dbg("Unknown line '%s'.", devc->buf); /* Done with this. */ devc->buflen = 0; - } SR_PRIV int agdmm_receive_data(int fd, int revents, void *cb_data) { - const struct sr_dev_inst *sdi; + struct sr_dev_inst *sdi; struct dev_context *devc; int len; + (void)fd; + if (!(sdi = cb_data)) return TRUE; @@ -106,7 +104,7 @@ SR_PRIV int agdmm_receive_data(int fd, int revents, void *cb_data) if (revents == G_IO_IN) { /* Serial data arrived. */ while(AGDMM_BUFSIZE - devc->buflen - 1 > 0) { - len = serial_read(fd, devc->buf + devc->buflen, 1); + len = serial_read(devc->serial, devc->buf + devc->buflen, 1); if (len < 1) break; devc->buflen += len; @@ -121,7 +119,7 @@ SR_PRIV int agdmm_receive_data(int fd, int revents, void *cb_data) dispatch(sdi); - if (devc->num_samples >= devc->limit_samples) + if (devc->limit_samples && devc->num_samples >= devc->limit_samples) sdi->driver->dev_acquisition_stop(sdi, cb_data); return TRUE; @@ -133,14 +131,14 @@ static int agdmm_send(const struct sr_dev_inst *sdi, const char *cmd) char buf[32]; devc = sdi->priv; - sr_spew("agilent-dmm: sending '%s'", cmd); + sr_spew("Sending '%s'.", cmd); strncpy(buf, cmd, 28); if (!strncmp(buf, "*IDN?", 5)) strncat(buf, "\r\n", 32); else strncat(buf, "\n\r\n", 32); - if (serial_write(devc->serial->fd, buf, strlen(buf)) == -1) { - sr_err("agilent-dmm: failed to send: %s", strerror(errno)); + if (serial_write(devc->serial, buf, strlen(buf)) == -1) { + sr_err("Failed to send: %s.", strerror(errno)); return SR_ERR; } @@ -149,18 +147,17 @@ static int agdmm_send(const struct sr_dev_inst *sdi, const char *cmd) static int send_stat(const struct sr_dev_inst *sdi) { - return agdmm_send(sdi, "STAT?"); } -static int recv_stat(const struct sr_dev_inst *sdi, GMatchInfo *match) +static int recv_stat_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match) { struct dev_context *devc; char *s; devc = sdi->priv; s = g_match_info_fetch(match, 1); - sr_spew("agilent-dmm: STAT response '%s'", s); + sr_spew("STAT response '%s'.", s); /* Max, Min or Avg mode -- no way to tell which, so we'll * set both flags to denote it's not a normal measurement. */ @@ -186,7 +183,7 @@ static int recv_stat(const struct sr_dev_inst *sdi, GMatchInfo *match) else devc->mode_tempaux = FALSE; - /* Continuity mode. */ + /* Continuity mode. */ if (s[16] == '1') devc->mode_continuity = TRUE; else @@ -197,9 +194,34 @@ static int recv_stat(const struct sr_dev_inst *sdi, GMatchInfo *match) return SR_OK; } -static int send_fetc(const struct sr_dev_inst *sdi) +static int recv_stat_u125x(const struct sr_dev_inst *sdi, GMatchInfo *match) { + struct dev_context *devc; + char *s; + + devc = sdi->priv; + s = g_match_info_fetch(match, 1); + sr_spew("STAT response '%s'.", s); + + /* Peak hold mode. */ + if (s[4] == '1') + devc->cur_mqflags |= SR_MQFLAG_MAX; + else + devc->cur_mqflags &= ~SR_MQFLAG_MAX; + + /* Triggered hold mode. */ + if (s[7] == '1') + devc->cur_mqflags |= SR_MQFLAG_HOLD; + else + devc->cur_mqflags &= ~SR_MQFLAG_HOLD; + g_free(s); + + return SR_OK; +} + +static int send_fetc(const struct sr_dev_inst *sdi) +{ return agdmm_send(sdi, "FETC?"); } @@ -211,7 +233,7 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match) float fvalue; char *mstr, *eptr; - sr_spew("agilent-dmm: FETC reply '%s'", g_match_info_get_string(match)); + sr_spew("FETC reply '%s'.", g_match_info_get_string(match)); devc = sdi->priv; if (devc->cur_mq == -1) @@ -221,7 +243,7 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match) return SR_OK; if (!strcmp(g_match_info_get_string(match), "+9.90000000E+37")) { - /* An invalid measurement shows up on the display as "O.L, but + /* An invalid measurement shows up on the display as "O.L", but * comes through like this. Since comparing 38-digit floats * is rather problematic, we'll cut through this here. */ fvalue = NAN; @@ -230,7 +252,7 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match) fvalue = strtof(mstr, &eptr); g_free(mstr); if (fvalue == 0.0 && eptr == mstr) { - sr_err("agilent-dmm: invalid float"); + sr_err("Invalid float."); return SR_ERR; } if (devc->cur_divider > 0) @@ -241,6 +263,7 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match) analog.mq = devc->cur_mq; analog.unit = devc->cur_unit; analog.mqflags = devc->cur_mqflags; + analog.probes = sdi->probes; analog.num_samples = 1; analog.data = &fvalue; packet.type = SR_DF_ANALOG; @@ -254,7 +277,6 @@ static int recv_fetc(const struct sr_dev_inst *sdi, GMatchInfo *match) static int send_conf(const struct sr_dev_inst *sdi) { - return agdmm_send(sdi, "CONF?"); } @@ -263,7 +285,7 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match) struct dev_context *devc; char *mstr; - sr_spew("agilent-dmm: CONF? response '%s'", g_match_info_get_string(match)); + sr_spew("CONF? response '%s'.", g_match_info_get_string(match)); devc = sdi->priv; mstr = g_match_info_fetch(match, 1); if (!strcmp(mstr, "V")) { @@ -316,7 +338,7 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match) devc->cur_mqflags = 0; devc->cur_divider = 0; } else - sr_dbg("agilent-dmm: unknown first argument"); + sr_dbg("Unknown first argument."); g_free(mstr); if (g_match_info_get_match_count(match) == 4) { @@ -327,7 +349,7 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match) else if (!strcmp(mstr, "DC")) devc->cur_mqflags |= SR_MQFLAG_DC; else - sr_dbg("agilent-dmm: unknown third argument"); + sr_dbg("Unknown third argument."); g_free(mstr); } else devc->cur_mqflags &= ~(SR_MQFLAG_AC | SR_MQFLAG_DC); @@ -335,13 +357,58 @@ static int recv_conf_u123x(const struct sr_dev_inst *sdi, GMatchInfo *match) return SR_OK; } +static int recv_conf_u125x(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 (!strncmp(mstr, "VOLT", 4)) { + devc->cur_mq = SR_MQ_VOLTAGE; + devc->cur_unit = SR_UNIT_VOLT; + devc->cur_mqflags = 0; + devc->cur_divider = 0; + if (mstr[4] == ':') { + if (!strcmp(mstr + 4, "AC")) + devc->cur_mqflags |= SR_MQFLAG_AC; + else if (!strcmp(mstr + 4, "DC")) + devc->cur_mqflags |= SR_MQFLAG_DC; + else + /* "ACDC" appears as well, no idea what it means. */ + devc->cur_mqflags &= ~(SR_MQFLAG_AC | SR_MQFLAG_DC); + } else + devc->cur_mqflags &= ~(SR_MQFLAG_AC | SR_MQFLAG_DC); + } else if(!strcmp(mstr, "CURR")) { + devc->cur_mq = SR_MQ_CURRENT; + devc->cur_unit = SR_UNIT_AMPERE; + devc->cur_mqflags = 0; + devc->cur_divider = 0; + } else if(!strcmp(mstr, "RES")) { + if (devc->mode_continuity) { + devc->cur_mq = SR_MQ_CONTINUITY; + devc->cur_unit = SR_UNIT_BOOLEAN; + } else { + devc->cur_mq = SR_MQ_RESISTANCE; + devc->cur_unit = SR_UNIT_OHM; + } + devc->cur_mqflags = 0; + devc->cur_divider = 0; + } else + sr_dbg("Unknown first argument."); + g_free(mstr); + + return SR_OK; +} + /* At least the 123x and 125x appear to have this. */ static int recv_conf(const struct sr_dev_inst *sdi, GMatchInfo *match) { struct dev_context *devc; char *mstr; - sr_spew("agilent-dmm: CONF? response '%s'", g_match_info_get_string(match)); + 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")) { @@ -349,7 +416,8 @@ static int recv_conf(const struct sr_dev_inst *sdi, GMatchInfo *match) 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; @@ -361,24 +429,22 @@ static int recv_conf(const struct sr_dev_inst *sdi, GMatchInfo *match) * we do need to catch this here, or it'll show up in some other output. */ static int recv_switch(const struct sr_dev_inst *sdi, GMatchInfo *match) { - (void)sdi; - sr_spew("agilent-dmm: switch '%s'", g_match_info_get_string(match)); + sr_spew("Switch '%s'.", g_match_info_get_string(match)); return SR_OK; } - -SR_PRIV const struct agdmm_job agdmm_u123x_jobs[] = { +SR_PRIV const struct agdmm_job agdmm_jobs_u123x[] = { { 143, send_stat }, { 1000, send_conf }, { 143, send_fetc }, { 0, NULL } }; -SR_PRIV const struct agdmm_recv agdmm_recvs[] = { - { "^\"(\\d\\d.{18}\\d)\"$", recv_stat }, +SR_PRIV const struct agdmm_recv agdmm_recvs_u123x[] = { + { "^\"(\\d\\d.{18}\\d)\"$", recv_stat_u123x }, { "^\\*([0-9])$", recv_switch }, { "^([-+][0-9]\\.[0-9]{8}E[-+][0-9]{2})$", recv_fetc }, { "^\"(V|MV|A|UA|FREQ),(\\d),(AC|DC)\"$", recv_conf_u123x }, @@ -387,4 +453,19 @@ SR_PRIV const struct agdmm_recv agdmm_recvs[] = { { NULL, NULL } }; +SR_PRIV const struct agdmm_job agdmm_jobs_u125x[] = { + { 143, send_stat }, + { 1000, send_conf }, + { 143, send_fetc }, + { 0, NULL } +}; +SR_PRIV const struct agdmm_recv agdmm_recvs_u125x[] = { + { "^\"(\\d\\d.{18}\\d)\"$", recv_stat_u125x }, + { "^\\*([0-9])$", recv_switch }, + { "^([-+][0-9]\\.[0-9]{8}E[-+][0-9]{2})$", recv_fetc }, + { "^(VOLT|CURR|RES|CAP) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)$", recv_conf_u125x }, + { "^(VOLT:[ACD]+) ([-+][0-9\\.E\\-+]+),([-+][0-9\\.E\\-+]+)$", recv_conf_u125x }, + { "^\"(DIOD)\"$", recv_conf }, + { NULL, NULL } +};