]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/atten-pps3xxx/api.c
drivers: Add and use STD_CONFIG_LIST().
[libsigrok.git] / src / hardware / atten-pps3xxx / api.c
index e0e38389652a60b615bdd4f653a34666f7381229..c88914f9139aca7bd077abcf4eee83b062219170 100644 (file)
@@ -78,13 +78,12 @@ static const struct pps_model models[] = {
 static GSList *scan(struct sr_dev_driver *di, GSList *options, int modelid)
 {
        struct sr_dev_inst *sdi;
-       struct drv_context *drvc;
        struct dev_context *devc;
        struct sr_config *src;
        struct sr_channel *ch;
        struct sr_channel_group *cg;
        struct sr_serial_dev_inst *serial;
-       GSList *l, *devices;
+       GSList *l;
        const struct pps_model *model;
        uint8_t packet[PACKET_SIZE];
        unsigned int i;
@@ -92,10 +91,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options, int modelid)
        const char *conn, *serialcomm;
        char channel[10];
 
-       devices = NULL;
-       drvc = di->context;
-       drvc->instances = NULL;
-
        conn = serialcomm = NULL;
        for (l = options; l; l = l->next) {
                src = l->data;
@@ -159,7 +154,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options, int modelid)
        sdi->status = SR_ST_INACTIVE;
        sdi->vendor = g_strdup("Atten");
        sdi->model = g_strdup(model->name);
-       sdi->driver = di;
        sdi->inst_type = SR_INST_SERIAL;
        sdi->conn = serial;
        for (i = 0; i < MAX_CHANNELS; i++) {
@@ -177,14 +171,10 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options, int modelid)
        devc->config = g_malloc0(sizeof(struct per_channel_config) * model->num_channels);
        devc->delay_ms = delay_ms;
        sdi->priv = devc;
-       drvc->instances = g_slist_append(drvc->instances, sdi);
-       devices = g_slist_append(devices, sdi);
 
        serial_close(serial);
-       if (!devices)
-               sr_serial_dev_inst_free(serial);
 
-       return devices;
+       return std_scan_complete(di, g_slist_append(NULL, sdi));
 }
 
 static GSList *scan_3203(struct sr_dev_driver *di, GSList *options)
@@ -197,14 +187,13 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
 {
        struct dev_context *devc;
        struct sr_channel *ch;
-       int channel, ret;
+       int channel;
 
        if (!sdi)
                return SR_ERR_ARG;
 
        devc = sdi->priv;
 
-       ret = SR_OK;
        if (!cg) {
                /* No channel group: global options. */
                switch (key) {
@@ -243,7 +232,7 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
                }
        }
 
-       return ret;
+       return SR_OK;
 }
 
 static int find_str(const char *str, const char **strings, int array_size)
@@ -271,9 +260,6 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd
        const char *sval;
        gboolean bval;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        ret = SR_OK;
        devc = sdi->priv;
        if (!cg) {
@@ -351,33 +337,16 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *
        struct sr_channel *ch;
        GVariant *gvar;
        GVariantBuilder gvb;
-       int channel, ret, i;
+       int channel, i;
 
-       /* Always available. */
-       if (key == SR_CONF_SCAN_OPTIONS) {
-               *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                               scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
-               return SR_OK;
-       }
-
-       if (key == SR_CONF_DEVICE_OPTIONS && !sdi) {
-               *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                               drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t));
-               return SR_OK;
-       }
-
-       if (!sdi)
-               return SR_ERR_ARG;
+       devc = (sdi) ? sdi->priv : NULL;
 
-       devc = sdi->priv;
-       ret = SR_OK;
        if (!cg) {
                /* No channel group: global options. */
                switch (key) {
+               case SR_CONF_SCAN_OPTIONS:
                case SR_CONF_DEVICE_OPTIONS:
-                       *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                                       devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
-                       break;
+                       return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
                case SR_CONF_CHANNEL_CONFIG:
                        if (devc->model->channel_modes == CHANMODE_INDEPENDENT) {
                                /* The 1-channel models. */
@@ -392,8 +361,7 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *
                }
        } else {
                /* Channel group specified: per-channel options. */
-               if (!sdi)
-                       return SR_ERR_ARG;
+
                /* We only ever have one channel per channel group in this driver. */
                ch = cg->channels->data;
                channel = ch->index;
@@ -426,7 +394,7 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *
                }
        }
 
-       return ret;
+       return SR_OK;
 }
 
 static int dev_close(struct sr_dev_inst *sdi)
@@ -434,6 +402,7 @@ static int dev_close(struct sr_dev_inst *sdi)
        struct dev_context *devc;
 
        devc = sdi->priv;
+
        if (devc->config_dirty)
                /* Some configuration changes were queued up but didn't
                 * get sent to the device, likely because we were never
@@ -449,9 +418,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        struct sr_serial_dev_inst *serial;
        uint8_t packet[PACKET_SIZE];
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        devc = sdi->priv;
        memset(devc->packet, 0x44, PACKET_SIZE);
        devc->packet_size = 0;
@@ -461,7 +427,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        serial = sdi->conn;
        serial_source_add(sdi->session, serial, G_IO_IN, 50,
                        atten_pps3xxx_receive_data, (void *)sdi);
-       std_session_send_df_header(sdi, LOG_PREFIX);
+       std_session_send_df_header(sdi);
 
        /* Send a "channel" configuration packet now. */
        memset(packet, 0, PACKET_SIZE);
@@ -476,16 +442,13 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
 {
        struct dev_context *devc;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        devc = sdi->priv;
        devc->acquisition_running = FALSE;
 
        return SR_OK;
 }
 
-SR_PRIV struct sr_dev_driver atten_pps3203_driver_info = {
+static struct sr_dev_driver atten_pps3203_driver_info = {
        .name = "atten-pps3203",
        .longname = "Atten PPS3203T-3S",
        .api_version = 1,
@@ -493,7 +456,7 @@ SR_PRIV struct sr_dev_driver atten_pps3203_driver_info = {
        .cleanup = std_cleanup,
        .scan = scan_3203,
        .dev_list = std_dev_list,
-       .dev_clear = NULL,
+       .dev_clear = std_dev_clear,
        .config_get = config_get,
        .config_set = config_set,
        .config_list = config_list,
@@ -503,3 +466,4 @@ SR_PRIV struct sr_dev_driver atten_pps3203_driver_info = {
        .dev_acquisition_stop = dev_acquisition_stop,
        .context = NULL,
 };
+SR_REGISTER_DEV_DRIVER(atten_pps3203_driver_info);