From: Bert Vermeulen Date: Sun, 9 Sep 2012 23:00:48 +0000 (+0200) Subject: agilent-dmm: tentative support for all U123x and U125x models X-Git-Tag: dsupstream~699 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=8c0152f29b7892bb3f131e92c55ecd60a29ece5a;p=libsigrok.git agilent-dmm: tentative support for all U123x and U125x models Only tested on U1233A, but it just might work. The U125x protocol decoding only supports voltage, current, resistance, capacitance and diode measurements for now. --- diff --git a/hardware/agilent-dmm/api.c b/hardware/agilent-dmm/api.c index 06d2ba04..3d6c3350 100644 --- a/hardware/agilent-dmm/api.c +++ b/hardware/agilent-dmm/api.c @@ -47,11 +47,18 @@ static const char *probe_names[] = { NULL, }; -extern const struct agdmm_job agdmm_u123x_jobs[]; -extern const struct agdmm_recv agdmm_recvs[]; +extern const struct agdmm_job agdmm_jobs_u123x[]; +extern const struct agdmm_recv agdmm_recvs_u123x[]; +extern const struct agdmm_job agdmm_jobs_u125x[]; +extern const struct agdmm_recv agdmm_recvs_u125x[]; static const struct agdmm_profile supported_agdmm[] = { - { AGILENT_U1232A, "U1232A", 9600, agdmm_u123x_jobs, agdmm_recvs }, + { AGILENT_U1232A, "U1231A", 9600, agdmm_jobs_u123x, agdmm_recvs_u123x }, + { AGILENT_U1232A, "U1232A", 9600, agdmm_jobs_u123x, agdmm_recvs_u123x }, + { AGILENT_U1232A, "U1233A", 9600, agdmm_jobs_u123x, agdmm_recvs_u123x }, + { AGILENT_U1232A, "U1251A", 9600, agdmm_jobs_u125x, agdmm_recvs_u125x }, + { AGILENT_U1232A, "U1252A", 9600, agdmm_jobs_u125x, agdmm_recvs_u125x }, + { AGILENT_U1232A, "U1253A", 9600, agdmm_jobs_u125x, agdmm_recvs_u125x }, { 0, NULL, 0, NULL, NULL } }; diff --git a/hardware/agilent-dmm/sched.c b/hardware/agilent-dmm/sched.c index b59e5091..151b8fce 100644 --- a/hardware/agilent-dmm/sched.c +++ b/hardware/agilent-dmm/sched.c @@ -153,7 +153,7 @@ 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; @@ -197,6 +197,32 @@ static int recv_stat(const struct sr_dev_inst *sdi, GMatchInfo *match) return SR_OK; } +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("agilent-dmm: 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) { @@ -335,6 +361,52 @@ 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("agilent-dmm: 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("agilent-dmm: 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) { @@ -349,7 +421,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("agilent-dmm: unknown single argument"); g_free(mstr); return SR_OK; @@ -370,15 +443,15 @@ static int recv_switch(const struct sr_dev_inst *sdi, GMatchInfo *match) } -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 +460,21 @@ 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 } +}; +