X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsigrok.c;h=28adfbd11b73a08ca9d2de733697b195aab32f05;hb=fd66afbbfddb5fb57bf484be725c4ca2b5cff097;hp=d6900436128b47bfbd170142cfcc806bd96250ee;hpb=f295a5c9440195885c76e9904ac8b1dd6a3c2b0d;p=collectd.git diff --git a/src/sigrok.c b/src/sigrok.c index d6900436..28adfbd1 100644 --- a/src/sigrok.c +++ b/src/sigrok.c @@ -36,7 +36,6 @@ static pthread_t sr_thread; static int sr_thread_running = FALSE; GSList *config_devices; -static struct sr_session *session = NULL; static int num_devices; static int loglevel = SR_LOG_WARN; static struct sr_context *sr_ctx; @@ -52,8 +51,8 @@ struct config_device { }; -static int cd_logger(void *cb_data, int msg_loglevel, const char *format, - va_list args) +static int sigrok_log_callback(void*cb_data __attribute__((unused)), + int msg_loglevel, const char *format, va_list args) { char s[512]; @@ -67,26 +66,27 @@ static int cd_logger(void *cb_data, int msg_loglevel, const char *format, static int sigrok_config_device(oconfig_item_t *ci) { - oconfig_item_t *item; struct config_device *cfdev; int i; if (!(cfdev = malloc(sizeof(struct config_device)))) { ERROR("malloc() failed."); - return 1; + return -1; } - memset(cfdev, 0, sizeof(struct config_device)); + memset(cfdev, 0, sizeof(*cfdev)); if (cf_util_get_string(ci, &cfdev->name)) { + free(cfdev); WARNING("Invalid device name."); - return 1; + return -1; } cfdev->min_dispatch_interval = DEFAULT_MIN_DISPATCH_INTERVAL; for (i = 0; i < ci->children_num; i++) { - item = ci->children + i; + oconfig_item_t *item = ci->children + i; if (item->values_num != 1) { + free(cfdev); WARNING("Missing value for '%s'.", item->key); - return 1; + return -1; } if (!strcasecmp(item->key, "driver")) cf_util_get_string(item, &cfdev->driver); @@ -107,11 +107,10 @@ static int sigrok_config_device(oconfig_item_t *ci) static int sigrok_config(oconfig_item_t *ci) { - oconfig_item_t *item; int tmp, i; for (i = 0; i < ci->children_num; i++) { - item = ci->children + i; + oconfig_item_t *item = ci->children + i; if (!strcasecmp(item->key, "loglevel")) { if (cf_util_get_int(item, &tmp) || tmp < 0 || tmp > 5) { ERROR("Invalid loglevel"); @@ -127,27 +126,14 @@ static int sigrok_config(oconfig_item_t *ci) return 0; } -static void free_drvopts(struct sr_config *src) -{ - g_variant_unref(src->data); - g_free(src); -} - static void sigrok_feed_callback(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *packet, void *cb_data) { const struct sr_datafeed_analog *analog; struct config_device *cfdev; GSList *l; - value_t *values; + value_t value; value_list_t vl = VALUE_LIST_INIT; - int num_probes, s, p; - - if (packet->type == SR_DF_END) { - /* TODO: try to restart acquisition after a delay? */ - INFO("oops! ended"); - return; - } /* Find this device's configuration. */ cfdev = NULL; @@ -164,33 +150,38 @@ static void sigrok_feed_callback(const struct sr_dev_inst *sdi, return; } - if (packet->type == SR_DF_ANALOG) { - if (cdtime() - cfdev->last_dispatch < cfdev->min_dispatch_interval) - return; - - analog = packet->payload; - num_probes = g_slist_length(analog->probes); - if (!(values = malloc(sizeof(value_t) * num_probes))) { - ERROR("malloc() failed."); - return; - } - for (s = 0; s < analog->num_samples; s++) { - for (p = 0; p < num_probes; p++) { - values[s + p].gauge = analog->data[s + p]; - } - } - vl.values = values; - vl.values_len = num_probes; - sstrncpy(vl.host, hostname_g, sizeof(vl.host)); - sstrncpy(vl.plugin, "sigrok", sizeof(vl.plugin)); - ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), - "%s", cfdev->name); - sstrncpy(vl.type, "gauge", sizeof(vl.type)); - plugin_dispatch_values(&vl); - - cfdev->last_dispatch = cdtime(); + if (packet->type == SR_DF_END) { + /* TODO: try to restart acquisition after a delay? */ + WARNING("sigrok: acquisition for '%s' ended.", cfdev->name); + return; } + if (packet->type != SR_DF_ANALOG) + return; + + if (cdtime() - cfdev->last_dispatch < cfdev->min_dispatch_interval) + return; + + /* Ignore all but the first sample on the first probe. */ + analog = packet->payload; + value.gauge = analog->data[0]; + vl.values = &value; + vl.values_len = 1; + sstrncpy(vl.host, hostname_g, sizeof(vl.host)); + sstrncpy(vl.plugin, "sigrok", sizeof(vl.plugin)); + ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), + "%s", cfdev->name); + sstrncpy(vl.type, "gauge", sizeof(vl.type)); + plugin_dispatch_values(&vl); + + cfdev->last_dispatch = cdtime(); + +} + +static void free_drvopts(struct sr_config *src) +{ + g_variant_unref(src->data); + g_free(src); } static int sigrok_init_driver(struct config_device *cfdev, @@ -221,9 +212,11 @@ static int sigrok_init_driver(struct config_device *cfdev, } devlist = sr_driver_scan(drv, drvopts); g_slist_free_full(drvopts, (GDestroyNotify)free_drvopts); - if (!devlist) - /* No devices found for this driver, not an error. */ + if (!devlist) { + /* Not an error, but the user should know about it. */ + WARNING("No device found for '%s'.", cfdev->name); return 0; + } if (g_slist_length(devlist) > 1) { INFO("sigrok: %d sigrok devices for device entry '%s': must be 1.", @@ -247,14 +240,14 @@ static int sigrok_init_driver(struct config_device *cfdev, return 1; } -static void *thread_init(void *arg __attribute__((unused))) +static void *sigrok_read_thread(void *arg __attribute__((unused))) { struct sr_dev_driver *drv, **drvlist; GSList *l; struct config_device *cfdev; int ret, i; - sr_log_callback_set(cd_logger, NULL); + sr_log_callback_set(sigrok_log_callback, NULL); sr_log_loglevel_set(loglevel); if ((ret = sr_init(&sr_ctx)) != SR_OK) { @@ -262,7 +255,7 @@ static void *thread_init(void *arg __attribute__((unused))) return NULL; } - if (!(session = sr_session_new())) + if (!sr_session_new()) return NULL; num_devices = 0; @@ -323,7 +316,8 @@ static int sigrok_init(void) return -1; } - if ((status = plugin_thread_create(&sr_thread, NULL, thread_init, NULL)) != 0) { + if ((status = plugin_thread_create(&sr_thread, NULL, sigrok_read_thread, + NULL)) != 0) { ERROR("sigrok: Failed to create thread: %s.", strerror(status)); return -1; }