]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/scpi-pps/api.c
scpi-pps: Optimize channel selection.
[libsigrok.git] / src / hardware / scpi-pps / api.c
index e02515296b5afc529a60a2acc6f5cf73f4239100..813bf7f375aeeffefdc044a4220696430e1fe4f0 100644 (file)
@@ -153,7 +153,9 @@ static int dev_clear(void)
 
 static int dev_open(struct sr_dev_inst *sdi)
 {
+       struct dev_context *devc;
        struct sr_scpi_dev_inst *scpi;
+       GVariant *beeper;
 
        if (sdi->status != SR_ST_ACTIVE)
                return SR_ERR;
@@ -165,6 +167,15 @@ static int dev_open(struct sr_dev_inst *sdi)
        sdi->status = SR_ST_ACTIVE;
 
        scpi_cmd(sdi, SCPI_CMD_REMOTE);
+       devc = sdi->priv;
+       devc->beeper_was_set = FALSE;
+       if (scpi_cmd_resp(sdi, &beeper, G_VARIANT_TYPE_BOOLEAN, SCPI_CMD_BEEPER) == SR_OK) {
+               if (g_variant_get_boolean(beeper)) {
+                       devc->beeper_was_set = TRUE;
+                       scpi_cmd(sdi, SCPI_CMD_BEEPER_DISABLE);
+               }
+               g_variant_unref(beeper);
+       }
 
        return SR_OK;
 }
@@ -172,12 +183,16 @@ static int dev_open(struct sr_dev_inst *sdi)
 static int dev_close(struct sr_dev_inst *sdi)
 {
        struct sr_scpi_dev_inst *scpi;
+       struct dev_context *devc;
 
        if (sdi->status != SR_ST_ACTIVE)
                return SR_ERR_DEV_CLOSED;
 
+       devc = sdi->priv;
        scpi = sdi->conn;
        if (scpi) {
+               if (devc->beeper_was_set)
+                       scpi_cmd(sdi, SCPI_CMD_BEEPER_ENABLE);
                scpi_cmd(sdi, SCPI_CMD_LOCAL);
                sr_scpi_close(scpi);
                sdi->status = SR_ST_INACTIVE;
@@ -188,7 +203,7 @@ static int dev_close(struct sr_dev_inst *sdi)
 
 static int cleanup(void)
 {
-       return SR_OK;
+       return std_dev_clear(di, NULL);
 }
 
 static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
@@ -510,6 +525,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi,
 
 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
 {
+       struct sr_datafeed_packet packet;
        struct sr_scpi_dev_inst *scpi;
        float f;
 
@@ -528,6 +544,9 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
        sr_scpi_get_float(scpi, NULL, &f);
        sr_scpi_source_remove(sdi->session, scpi);
 
+       packet.type = SR_DF_END;
+       sr_session_send(sdi, &packet);
+
        return SR_OK;
 }