X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fhwdriver.c;h=342abeb9ef780f4d7b3040de8555dc03cc5a1478;hb=1838d9f13fe8b253895f8a19a0c53c9e3056cf65;hp=cad75e13b0800246f35f9ecfcdebdb5f22c5bb0e;hpb=9e411f4be85302b9623e597c142f11268745812e;p=libsigrok.git diff --git a/src/hwdriver.c b/src/hwdriver.c index cad75e13..342abeb9 100644 --- a/src/hwdriver.c +++ b/src/hwdriver.c @@ -81,14 +81,20 @@ static struct sr_key_info sr_key_info_config[] = { "Pattern", NULL}, {SR_CONF_RLE, SR_T_BOOL, "rle", "Run length encoding", NULL}, + {SR_CONF_TRIGGER_SOURCE, SR_T_STRING, "triggersource", + "Trigger source", NULL}, {SR_CONF_TRIGGER_SLOPE, SR_T_STRING, "triggerslope", "Trigger slope", NULL}, + {SR_CONF_TRIGGER_PATTERN, SR_T_STRING, "triggerpattern", + "Trigger pattern", NULL}, + {SR_CONF_HIGH_RESOLUTION, SR_T_BOOL, "highresolution", + "High resolution", NULL}, + {SR_CONF_PEAK_DETECTION, SR_T_BOOL, "peakdetection", + "Peak detection", NULL}, {SR_CONF_AVERAGING, SR_T_BOOL, "averaging", "Averaging", NULL}, {SR_CONF_AVG_SAMPLES, SR_T_UINT64, "avg_samples", "Number of samples to average over", NULL}, - {SR_CONF_TRIGGER_SOURCE, SR_T_STRING, "triggersource", - "Trigger source", NULL}, {SR_CONF_HORIZ_TRIGGERPOS, SR_T_FLOAT, "horiz_triggerpos", "Horizontal trigger position", NULL}, {SR_CONF_BUFFERSIZE, SR_T_UINT64, "buffersize", @@ -121,6 +127,10 @@ static struct sr_key_info sr_key_info_config[] = { "Hold min", NULL}, {SR_CONF_VOLTAGE_THRESHOLD, SR_T_DOUBLE_RANGE, "voltage_threshold", "Voltage threshold", NULL }, + {SR_CONF_LOGIC_THRESHOLD, SR_T_STRING, "logic_threshold", + "Logic threshold (predefined)", NULL}, + {SR_CONF_LOGIC_THRESHOLD_CUSTOM, SR_T_FLOAT, "logic_threshold_custom", + "Logic threshold (custom)", NULL}, {SR_CONF_EXTERNAL_CLOCK, SR_T_BOOL, "external_clock", "External clock mode", NULL}, {SR_CONF_SWAP, SR_T_BOOL, "swap", @@ -177,8 +187,14 @@ static struct sr_key_info sr_key_info_config[] = { "Under-voltage condition", NULL}, {SR_CONF_UNDER_VOLTAGE_CONDITION_ACTIVE, SR_T_BOOL, "uvc_active", "Under-voltage condition active", NULL}, + {SR_CONF_UNDER_VOLTAGE_CONDITION_THRESHOLD, SR_T_FLOAT, "uvc_threshold", + "Under-voltage condition threshold", NULL}, {SR_CONF_TRIGGER_LEVEL, SR_T_FLOAT, "triggerlevel", "Trigger level", NULL}, + {SR_CONF_EXTERNAL_CLOCK_SOURCE, SR_T_STRING, "external_clock_source", + "External clock source", NULL}, + {SR_CONF_OFFSET, SR_T_FLOAT, "offset", + "Offset", NULL}, /* Special stuff */ {SR_CONF_SESSIONFILE, SR_T_STRING, "sessionfile", @@ -565,6 +581,12 @@ SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx) * * A floating reference can be passed in for data. * + * @param key The config key to use. + * @param data The GVariant data to use. + * + * @return The newly allocated struct sr_config. This function is assumed + * to never fail. + * * @private */ SR_PRIV struct sr_config *sr_config_new(uint32_t key, GVariant *data) @@ -633,7 +655,8 @@ SR_PRIV int sr_dev_acquisition_stop(struct sr_dev_inst *sdi) } static void log_key(const struct sr_dev_inst *sdi, - const struct sr_channel_group *cg, uint32_t key, int op, GVariant *data) + const struct sr_channel_group *cg, uint32_t key, unsigned int op, + GVariant *data) { const char *opstr; const struct sr_key_info *srci; @@ -655,7 +678,7 @@ static void log_key(const struct sr_dev_inst *sdi, static int check_key(const struct sr_dev_driver *driver, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg, - uint32_t key, int op, GVariant *data) + uint32_t key, unsigned int op, GVariant *data) { const struct sr_key_info *srci; gsize num_opts, i; @@ -666,9 +689,9 @@ static int check_key(const struct sr_dev_driver *driver, const char *opstr; if (sdi && cg) - suffix = " for this device and channel group"; + suffix = " for this device instance and channel group"; else if (sdi) - suffix = " for this device"; + suffix = " for this device instance"; else suffix = ""; @@ -690,6 +713,15 @@ static int check_key(const struct sr_dev_driver *driver, return SR_ERR_ARG; } break; + case SR_CONF_CAPTURE_RATIO: + /* Capture ratio must always be between 0 and 100. */ + if (op != SR_CONF_SET || !data) + break; + if (g_variant_get_uint64(data) > 100) { + sr_err("Capture ratio must be 0..100."); + return SR_ERR_ARG; + } + break; } if (sr_config_list(driver, sdi, cg, SR_CONF_DEVICE_OPTIONS, &gvar_opts) != SR_OK) { @@ -772,6 +804,10 @@ SR_API int sr_config_get(const struct sr_dev_driver *driver, g_variant_ref_sink(*data); } + if (ret == SR_ERR_CHANNEL_GROUP) + sr_err("%s: No channel group specified.", + (sdi) ? sdi->driver->name : "unknown"); + return ret; }