]> sigrok.org Git - libsigrok.git/blobdiff - hardware/serial-dmm/api.c
serial-dmm: Add Tecpel DMM-8061 support.
[libsigrok.git] / hardware / serial-dmm / api.c
index cb741f936f10bc63a238a6de49127ca0815c526c..b63d3fc9e5db6e314baeba0bee3592fce02efec3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * This file is part of the sigrok project.
+ * This file is part of the libsigrok project.
  *
  * Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
  * Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
@@ -53,8 +53,10 @@ SR_PRIV struct sr_dev_driver pce_pce_dm32_driver_info;
 SR_PRIV struct sr_dev_driver radioshack_22_168_driver_info;
 SR_PRIV struct sr_dev_driver radioshack_22_805_driver_info;
 SR_PRIV struct sr_dev_driver radioshack_22_812_driver_info;
+SR_PRIV struct sr_dev_driver tecpel_dmm_8061_ser_driver_info;
 SR_PRIV struct sr_dev_driver voltcraft_vc820_ser_driver_info;
 SR_PRIV struct sr_dev_driver voltcraft_vc840_ser_driver_info;
+SR_PRIV struct sr_dev_driver uni_t_ut61d_ser_driver_info;
 SR_PRIV struct sr_dev_driver uni_t_ut61e_ser_driver_info;
 
 SR_PRIV struct dmm_info dmms[] = {
@@ -62,14 +64,14 @@ SR_PRIV struct dmm_info dmms[] = {
                "Digitek", "DT4000ZC", "2400/8n1", 2400,
                FS9721_PACKET_SIZE, NULL,
                sr_fs9721_packet_valid, sr_fs9721_parse,
-               dmm_details_dt4000zc,
+               sr_fs9721_10_temp_c,
                &digitek_dt4000zc_driver_info, receive_data_DIGITEK_DT4000ZC,
        },
        {
                "TekPower", "TP4000ZC", "2400/8n1", 2400,
                FS9721_PACKET_SIZE, NULL,
                sr_fs9721_packet_valid, sr_fs9721_parse,
-               dmm_details_tp4000zc,
+               sr_fs9721_10_temp_c,
                &tekpower_tp4000zc_driver_info, receive_data_TEKPOWER_TP4000ZC,
        },
        {
@@ -97,7 +99,7 @@ SR_PRIV struct dmm_info dmms[] = {
                "V&A", "VA18B", "2400/8n1", 2400,
                FS9721_PACKET_SIZE, NULL,
                sr_fs9721_packet_valid, sr_fs9721_parse,
-               dmm_details_va18b,
+               sr_fs9721_01_temp_c,
                &va_va18b_driver_info, receive_data_VA_VA18B,
        },
        {
@@ -118,7 +120,7 @@ SR_PRIV struct dmm_info dmms[] = {
                "PCE", "PCE-DM32", "2400/8n1", 2400,
                FS9721_PACKET_SIZE, NULL,
                sr_fs9721_packet_valid, sr_fs9721_parse,
-               dmm_details_pce_dm32,
+               sr_fs9721_01_10_temp_f_c,
                &pce_pce_dm32_driver_info, receive_data_PCE_PCE_DM32,
        },
        {
@@ -142,6 +144,14 @@ SR_PRIV struct dmm_info dmms[] = {
                NULL,
                &radioshack_22_812_driver_info, receive_data_RADIOSHACK_22_812,
        },
+       {
+               "Tecpel", "DMM-8061 (UT-D02 cable)", "2400/8n1/rts=0/dtr=1",
+               2400, FS9721_PACKET_SIZE, NULL,
+               sr_fs9721_packet_valid, sr_fs9721_parse,
+               sr_fs9721_00_temp_c,
+               &tecpel_dmm_8061_ser_driver_info,
+               receive_data_TECPEL_DMM_8061_SER,
+       },
        {
                "Voltcraft", "VC-820 (UT-D02 cable)", "2400/8n1/rts=0/dtr=1",
                2400, FS9721_PACKET_SIZE, NULL,
@@ -154,10 +164,16 @@ SR_PRIV struct dmm_info dmms[] = {
                "Voltcraft", "VC-840 (UT-D02 cable)", "2400/8n1/rts=0/dtr=1",
                2400, FS9721_PACKET_SIZE, NULL,
                sr_fs9721_packet_valid, sr_fs9721_parse,
-               NULL,
+               sr_fs9721_00_temp_c,
                &voltcraft_vc840_ser_driver_info,
                receive_data_VOLTCRAFT_VC840_SER,
        },
+       {
+               "UNI-T", "UT61D (UT-D02 cable)", "2400/8n1/rts=0/dtr=1",
+               2400, FS9922_PACKET_SIZE, NULL,
+               sr_fs9922_packet_valid, sr_fs9922_parse, NULL,
+               &uni_t_ut61d_ser_driver_info, receive_data_UNI_T_UT61D_SER,
+       },
        {
                /* Note: ES51922 baudrate is actually 19230! */
                "UNI-T", "UT61E (UT-D02 cable)", "19200/7o1/rts=0/dtr=1",
@@ -173,6 +189,7 @@ static int clear_instances(int dmm)
        struct sr_dev_inst *sdi;
        struct drv_context *drvc;
        struct dev_context *devc;
+       struct sr_serial_dev_inst *serial;
        GSList *l;
        struct sr_dev_driver *di;
 
@@ -187,7 +204,8 @@ static int clear_instances(int dmm)
                        continue;
                if (!(devc = sdi->priv))
                        continue;
-               sr_serial_dev_inst_free(devc->serial);
+               serial = sdi->conn;
+               sr_serial_dev_inst_free(serial);
                sr_dev_inst_free(sdi);
        }
        g_slist_free(drvc->instances);
@@ -271,7 +289,8 @@ static GSList *scan(const char *conn, const char *serialcomm, int dmm)
                goto scan_cleanup;
        }
 
-       devc->serial = serial;
+       sdi->inst_type = SR_INST_SERIAL;
+       sdi->conn = serial;
 
        sdi->priv = devc;
        sdi->driver = dmms[dmm].di;
@@ -326,14 +345,10 @@ static GSList *hw_dev_list(int dmm)
 
 static int hw_dev_open(struct sr_dev_inst *sdi)
 {
-       struct dev_context *devc;
-
-       if (!(devc = sdi->priv)) {
-               sr_err("sdi->priv was NULL.");
-               return SR_ERR_BUG;
-       }
+       struct sr_serial_dev_inst *serial;
 
-       if (serial_open(devc->serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
+       serial = sdi->conn;
+       if (serial_open(serial, SERIAL_RDWR | SERIAL_NONBLOCK) != SR_OK)
                return SR_ERR;
 
        sdi->status = SR_ST_ACTIVE;
@@ -343,12 +358,11 @@ static int hw_dev_open(struct sr_dev_inst *sdi)
 
 static int hw_dev_close(struct sr_dev_inst *sdi)
 {
-       struct dev_context *devc;
-
-       devc = sdi->priv;
+       struct sr_serial_dev_inst *serial;
 
-       if (devc->serial && devc->serial->fd != -1) {
-               serial_close(devc->serial);
+       serial = sdi->conn;
+       if (serial && serial->fd != -1) {
+               serial_close(serial);
                sdi->status = SR_ST_INACTIVE;
        }
 
@@ -367,7 +381,7 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
        struct dev_context *devc;
 
        if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR;
+               return SR_ERR_DEV_CLOSED;
 
        if (!(devc = sdi->priv)) {
                sr_err("sdi->priv was NULL.");
@@ -386,9 +400,7 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
                       devc->limit_msec);
                break;
        default:
-               sr_err("Unknown capability: %d.", id);
-               return SR_ERR;
-               break;
+               return SR_ERR_NA;
        }
 
        return SR_OK;
@@ -409,7 +421,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi)
                                hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t));
                break;
        default:
-               return SR_ERR_ARG;
+               return SR_ERR_NA;
        }
 
        return SR_OK;
@@ -419,6 +431,10 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
                                    void *cb_data, int dmm)
 {
        struct dev_context *devc;
+       struct sr_serial_dev_inst *serial;
+
+       if (sdi->status != SR_ST_ACTIVE)
+               return SR_ERR_DEV_CLOSED;
 
        if (!(devc = sdi->priv)) {
                sr_err("sdi->priv was NULL.");
@@ -439,7 +455,8 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
        std_session_send_df_header(cb_data, DRIVER_LOG_DOMAIN);
 
        /* Poll every 50ms, or whenever some data comes in. */
-       sr_source_add(devc->serial->fd, G_IO_IN, 50,
+       serial = sdi->conn;
+       sr_source_add(serial->fd, G_IO_IN, 50,
                      dmms[dmm].receive_data, (void *)sdi);
 
        return SR_OK;
@@ -448,7 +465,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
 static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
 {
        return std_hw_dev_acquisition_stop_serial(sdi, cb_data, hw_dev_close,
-              ((struct dev_context *)(sdi->priv))->serial, DRIVER_LOG_DOMAIN);
+                                                 sdi->conn, DRIVER_LOG_DOMAIN);
 }
 
 /* Driver-specific API function wrappers */
@@ -505,6 +522,8 @@ DRV(pce_pce_dm32, PCE_PCE_DM32, "pce-pce-dm32", "PCE PCE-DM32")
 DRV(radioshack_22_168, RADIOSHACK_22_168, "radioshack-22-168", "RadioShack 22-168")
 DRV(radioshack_22_805, RADIOSHACK_22_805, "radioshack-22-805", "RadioShack 22-805")
 DRV(radioshack_22_812, RADIOSHACK_22_812, "radioshack-22-812", "RadioShack 22-812")
+DRV(tecpel_dmm_8061_ser, TECPEL_DMM_8061_SER, "tecpel-dmm-8061-ser", "Tecpel DMM-8061 (UT-D02 cable)")
 DRV(voltcraft_vc820_ser, VOLTCRAFT_VC820_SER, "voltcraft-vc820-ser", "Voltcraft VC-820 (UT-D02 cable)")
 DRV(voltcraft_vc840_ser, VOLTCRAFT_VC840_SER, "voltcraft-vc840-ser", "Voltcraft VC-840 (UT-D02 cable)")
+DRV(uni_t_ut61d_ser, UNI_T_UT61D_SER, "uni-t-ut61d-ser", "UNI-T UT61D (UT-D02 cable)")
 DRV(uni_t_ut61e_ser, UNI_T_UT61E_SER, "uni-t-ut61e-ser", "UNI-T UT61E (UT-D02 cable)")