]> sigrok.org Git - libsigrok.git/blobdiff - src/hwdriver.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / hwdriver.c
index 96b6cfac0d48b4d24c67c61e88cc8074599f5fe9..068a215ac5f6956a4968e46566d2c3e7ce11b9d7 100644 (file)
@@ -62,6 +62,8 @@ static struct sr_key_info sr_key_info_config[] = {
        {SR_CONF_ELECTRONIC_LOAD, SR_T_STRING, NULL, "Electronic load", NULL},
        {SR_CONF_SCALE, SR_T_STRING, NULL, "Scale", NULL},
        {SR_CONF_SIGNAL_GENERATOR, SR_T_STRING, NULL, "Signal generator", NULL},
+       {SR_CONF_POWERMETER, SR_T_STRING, NULL, "Power meter", NULL},
+       {SR_CONF_MULTIPLEXER, SR_T_STRING, NULL, "Multiplexer", NULL},
 
        /* Driver scan options */
        {SR_CONF_CONN, SR_T_STRING, "conn",
@@ -70,6 +72,10 @@ static struct sr_key_info sr_key_info_config[] = {
                "Serial communication", NULL},
        {SR_CONF_MODBUSADDR, SR_T_UINT64, "modbusaddr",
                "Modbus slave address", NULL},
+       {SR_CONF_FORCE_DETECT, SR_T_STRING, "force_detect",
+               "Forced detection", NULL},
+       {SR_CONF_PROBE_NAMES, SR_T_STRING, "probe_names",
+               "Names of device's probes", NULL},
 
        /* Device (or channel group) configuration */
        {SR_CONF_SAMPLERATE, SR_T_UINT64, "samplerate",
@@ -176,8 +182,40 @@ 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},
+       {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_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_RANGE, SR_T_STRING, "range",
+               "Range", NULL},
+       {SR_CONF_DIGITS, SR_T_STRING, "digits",
+               "Digits", NULL},
+       {SR_CONF_PHASE, SR_T_FLOAT, "phase",
+               "Phase", NULL},
+       {SR_CONF_DUTY_CYCLE, SR_T_FLOAT, "output_duty_cycle",
+               "Duty Cycle", NULL},
+       {SR_CONF_POWER, SR_T_FLOAT, "power",
+               "Power", NULL},
+       {SR_CONF_POWER_TARGET, SR_T_FLOAT, "power_target",
+               "Power Target", NULL},
+       {SR_CONF_RESISTANCE_TARGET, SR_T_FLOAT, "resistance_target",
+               "Resistance Target", NULL},
+       {SR_CONF_OVER_CURRENT_PROTECTION_DELAY, SR_T_FLOAT, "ocp_delay",
+               "Over-current protection delay", NULL},
 
        /* Special stuff */
        {SR_CONF_SESSIONFILE, SR_T_STRING, "sessionfile",
@@ -249,6 +287,8 @@ static struct sr_key_info sr_key_info_mq[] = {
        {SR_MQ_APPARENT_POWER, 0, "apparent_power", "Apparent power", NULL},
        {SR_MQ_MASS, 0, "mass", "Mass", NULL},
        {SR_MQ_HARMONIC_RATIO, 0, "harmonic_ratio", "Harmonic ratio", NULL},
+       {SR_MQ_ENERGY, 0, "energy", "Energy", NULL},
+       {SR_MQ_ELECTRIC_CHARGE, 0, "electric_charge", "Electric charge", NULL},
        ALL_ZERO
 };
 
@@ -293,6 +333,8 @@ SR_PRIV const GVariantType *sr_variant_type_get(int datatype)
        switch (datatype) {
        case SR_T_INT32:
                return G_VARIANT_TYPE_INT32;
+       case SR_T_UINT32:
+               return G_VARIANT_TYPE_UINT32;
        case SR_T_UINT64:
                return G_VARIANT_TYPE_UINT64;
        case SR_T_STRING:
@@ -564,6 +606,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)
@@ -632,7 +680,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;
@@ -654,7 +703,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;
@@ -665,9 +714,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 = "";
 
@@ -689,6 +738,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) {
@@ -771,6 +829,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;
 }
 
@@ -819,6 +881,10 @@ SR_API int sr_config_set(const struct sr_dev_inst *sdi,
 
        g_variant_unref(data);
 
+       if (ret == SR_ERR_CHANNEL_GROUP)
+               sr_err("%s: No channel group specified.",
+                       (sdi) ? sdi->driver->name : "unknown");
+
        return ret;
 }
 
@@ -860,6 +926,9 @@ SR_API int sr_config_commit(const struct sr_dev_inst *sdi)
  * @param[in] cg The channel group on the device instance for which to list
  *            the values, or NULL. If this device instance doesn't
  *            have channel groups, this must not be != NULL.
+ *            If cg is NULL, this function will return the "common" device
+ *            instance options that are channel-group independent. Otherwise
+ *            it will return the channel-group specific options.
  * @param[in] key The configuration key (SR_CONF_*).
  * @param[in,out] data A pointer to a GVariant where the list will be stored.
  *                The caller is given ownership of the GVariant and must thus