]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/baylibre-acme/protocol.c
baylibre-acme: Dynamically check per probe config options.
[libsigrok.git] / src / hardware / baylibre-acme / protocol.c
index 66a22ad4ffe0e93b4f2f0bcd9017dc3c80e0a7f9..ca09eba069c51a0c017f851b53b31d5779346d58 100644 (file)
@@ -201,13 +201,12 @@ static void append_channel(struct sr_dev_inst *sdi, struct sr_channel_group *cg,
        cp->ch_type = type;
        cp->probe = cg->priv;
 
-       ch = sr_channel_new(devc->num_channels++,
+       ch = sr_channel_new(sdi, devc->num_channels++,
                            SR_CHANNEL_ANALOG, TRUE, name);
        g_free(name);
 
        ch->priv = cp;
        cg->channels = g_slist_append(cg->channels, ch);
-       sdi->channels = g_slist_append(sdi->channels, ch);
 }
 
 SR_PRIV gboolean bl_acme_register_probe(struct sr_dev_inst *sdi, int type,
@@ -246,6 +245,20 @@ SR_PRIV gboolean bl_acme_register_probe(struct sr_dev_inst *sdi, int type,
        return TRUE;
 }
 
+SR_PRIV int bl_acme_get_probe_type(const struct sr_channel_group *cg)
+{
+       struct channel_group_priv *cgp = cg->priv;
+
+       return cgp->probe_type;
+}
+
+SR_PRIV int bl_acme_probe_has_pws(const struct sr_channel_group *cg)
+{
+       struct channel_group_priv *cgp = cg->priv;
+
+       return sr_gpio_getval_export(pws_info_gpios[cgp->index]);
+}
+
 /*
  * Sets path to the hwmon attribute if this channel group
  * supports shunt resistance setting. The caller has to supply
@@ -329,16 +342,11 @@ SR_PRIV int bl_acme_set_shunt(const struct sr_channel_group *cg, uint64_t shunt)
        fd = g_fopen(path->str, "w");
        if (!fd) {
                sr_err("Error opening %s: %s", path->str, strerror(errno));
-               g_string_free(path, TRUE);
-               return SR_ERR_IO;
+               ret = SR_ERR_IO;
+               goto out;
        }
 
-       g_string_free(path, TRUE);
-       g_fprintf(fd, "%llu\n", MOHM_TO_UOHM(shunt));
-       /*
-        * XXX There's no g_fclose() in GLib. This seems to work,
-        * but is it safe?
-        */
+       g_fprintf(fd, "%" PRIu64 "\n", MOHM_TO_UOHM(shunt));
        fclose(fd);
 
 out:
@@ -354,8 +362,7 @@ SR_PRIV int bl_acme_read_power_state(const struct sr_channel_group *cg,
 
        cgp = cg->priv;
 
-       val = sr_gpio_getval_export(pws_info_gpios[cgp->index]);
-       if (val != 1) {
+       if (!bl_acme_probe_has_pws(cg)) {
                sr_err("Probe has no power-switch");
                return SR_ERR_ARG;
        }
@@ -374,8 +381,7 @@ SR_PRIV int bl_acme_set_power_off(const struct sr_channel_group *cg,
 
        cgp = cg->priv;
 
-       val = sr_gpio_getval_export(pws_info_gpios[cgp->index]);
-       if (val != 1) {
+       if (!bl_acme_probe_has_pws(cg)) {
                sr_err("Probe has no power-switch");
                return SR_ERR_ARG;
        }
@@ -508,7 +514,7 @@ SR_PRIV int bl_acme_receive_data(int fd, int revents, void *cb_data)
 
        packet.type = SR_DF_ANALOG;
        packet.payload = &analog;
-       memset(&analog, 0, sizeof(analog));
+       memset(&analog, 0, sizeof(struct sr_datafeed_analog));
        analog.data = &valf;
 
        /*