]> sigrok.org Git - libsigrok.git/commitdiff
kecheng-kc-330b: Check device status before acquisition
authorBert Vermeulen <redacted>
Tue, 25 Jun 2013 20:00:29 +0000 (22:00 +0200)
committerBert Vermeulen <redacted>
Tue, 16 Jul 2013 14:08:38 +0000 (16:08 +0200)
Can't really count on it either way though, the device is just
too flaky to conclude whether it's going to work or not, regardless
of the status returned.

hardware/kecheng-kc-330b/api.c
hardware/kecheng-kc-330b/protocol.c
hardware/kecheng-kc-330b/protocol.h

index 1555ac4872721252bfa2e943fd80680e1399d612..66984e9a2af51f65b2202f5b113edc6772c31d15 100644 (file)
@@ -431,6 +431,19 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi,
        devc->cb_data = cb_data;
        devc->num_samples = 0;
 
+       if (devc->data_source == DATA_SOURCE_LIVE) {
+               if (kecheng_kc_330b_status_get(sdi, &ret) != SR_OK)
+                       return SR_ERR;
+               sr_dbg("st %s", ret == DEVICE_ACTIVE ? "act" : "deact");
+               if (ret != DEVICE_ACTIVE) {
+                       sr_err("Device is inactive");
+                       /* Still continue though, since the device will
+                        * just return 30.0 until the user hits the button
+                        * on the device -- and then start feeding good
+                        * samples back. */
+               }
+       }
+
        if (!(devc->xfer = libusb_alloc_transfer(0)))
                return SR_ERR;
 
index 5133783e6c69dc23a3546a170d80434e220d2d1b..9eca15c0599c80840e7dcc91c43cee8231060a6b 100644 (file)
@@ -225,7 +225,41 @@ SR_PRIV int kecheng_kc_330b_set_date_time(struct sr_dev_inst *sdi)
                return SR_ERR;
        }
 
+       return SR_OK;
+}
+
+SR_PRIV int kecheng_kc_330b_status_get(const struct sr_dev_inst *sdi,
+               int *status)
+{
+       struct sr_usb_dev_inst *usb;
+       int len, ret;
+       unsigned char buf;
+
+       sr_dbg("Getting device status.");
+
+       usb = sdi->conn;
+       buf = CMD_GET_STATUS;
+       ret = libusb_bulk_transfer(usb->devhdl, EP_OUT, &buf, 1, &len, 5);
+       if (ret != 0 || len != 1) {
+               sr_dbg("Failed to get status: %s", libusb_error_name(ret));
+               return SR_ERR;
+       }
+
+       ret = libusb_bulk_transfer(usb->devhdl, EP_IN, &buf, 1, &len, 10);
+       if (ret != 0 || len != 1) {
+               sr_dbg("Failed to get status (no ack): %s", libusb_error_name(ret));
+               return SR_ERR;
+       }
+       /* Need either 0x84 or 0xa4. */
+       if (buf != (CMD_GET_STATUS | 0x80) && buf != (CMD_GET_STATUS | 0xa0)) {
+               sr_dbg("Failed to get status: invalid response 0x%2.x", buf);
+               return SR_ERR;
+       }
 
+       if (buf & 0x20)
+               *status = DEVICE_INACTIVE;
+       else
+               *status = DEVICE_ACTIVE;
 
        return SR_OK;
 }
index 1ec64e3ed63ed682b38503809e02cdd085829e59..f872676e314ee40f5016846ee18524272103e1d5 100644 (file)
@@ -55,6 +55,7 @@ enum {
        CMD_CONFIGURE = 0x01,
        CMD_IDENTIFY = 0x02,
        CMD_SET_DATE_TIME = 0x03,
+       CMD_GET_STATUS = 0x04,
        CMD_GET_LIVE_SPL = 0x08,
 };
 
@@ -63,6 +64,11 @@ enum {
        DATA_SOURCE_MEMORY,
 };
 
+enum {
+       DEVICE_ACTIVE,
+       DEVICE_INACTIVE,
+};
+
 /** Private, per-device-instance driver context. */
 struct dev_context {
        /* Acquisition settings */
@@ -92,5 +98,7 @@ SR_PRIV int kecheng_kc_330b_configure(const struct sr_dev_inst *sdi);
 SR_PRIV int kecheng_kc_330b_set_date_time(struct sr_dev_inst *sdi);
 SR_PRIV int kecheng_kc_330b_recording_get(const struct sr_dev_inst *sdi,
                gboolean *tmp);
+SR_PRIV int kecheng_kc_330b_status_get(const struct sr_dev_inst *sdi,
+               int *status);
 
 #endif