X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhwdriver.c;h=3348b759562593746bce2792b8a282e49241e5ae;hb=64bc73f5282ec0e7da6e00a8d078191e5375dc5c;hp=148ea8a230470eeafbc757bb2679a464f556c80b;hpb=dcd438ee3523098201c7937e75e55775da3b506f;p=libsigrok.git diff --git a/src/hwdriver.c b/src/hwdriver.c index 148ea8a2..3348b759 100644 --- a/src/hwdriver.c +++ b/src/hwdriver.c @@ -24,15 +24,13 @@ #include #include #include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */ -#include "libsigrok.h" +#include #include "libsigrok-internal.h" /** @cond PRIVATE */ #define LOG_PREFIX "hwdriver" /** @endcond */ -extern SR_PRIV struct sr_dev_driver **drivers_lists[]; - /** * @file * @@ -67,6 +65,8 @@ static struct sr_config_info sr_config_info_data[] = { "Connection", NULL}, {SR_CONF_SERIALCOMM, SR_T_STRING, "serialcomm", "Serial communication", NULL}, + {SR_CONF_MODBUSADDR, SR_T_UINT64, "modbusaddr", + "Modbus slave address", NULL}, /* Device (or channel group) configuration */ {SR_CONF_SAMPLERATE, SR_T_UINT64, "samplerate", @@ -127,18 +127,18 @@ static struct sr_config_info sr_config_info_data[] = { "Number of logic channels", NULL}, {SR_CONF_NUM_ANALOG_CHANNELS, SR_T_INT32, "analog_channels", "Number of analog channels", NULL}, - {SR_CONF_OUTPUT_VOLTAGE, SR_T_FLOAT, "output_voltage", - "Current output voltage", NULL}, - {SR_CONF_OUTPUT_VOLTAGE_TARGET, SR_T_FLOAT, "output_voltage_target", - "Output voltage target", NULL}, - {SR_CONF_OUTPUT_CURRENT, SR_T_FLOAT, "output_current", - "Current output current", NULL}, - {SR_CONF_OUTPUT_CURRENT_LIMIT, SR_T_FLOAT, "output_current_limit", - "Output current limit", NULL}, - {SR_CONF_OUTPUT_ENABLED, SR_T_BOOL, "output_enabled", - "Output enabled", NULL}, - {SR_CONF_OUTPUT_CHANNEL_CONFIG, SR_T_STRING, "output_channel_config", - "Output channel modes", NULL}, + {SR_CONF_VOLTAGE, SR_T_FLOAT, "voltage", + "Current voltage", NULL}, + {SR_CONF_VOLTAGE_TARGET, SR_T_FLOAT, "voltage_target", + "Voltage target", NULL}, + {SR_CONF_CURRENT, SR_T_FLOAT, "current", + "Current current", NULL}, + {SR_CONF_CURRENT_LIMIT, SR_T_FLOAT, "current_limit", + "Current limit", NULL}, + {SR_CONF_ENABLED, SR_T_BOOL, "enabled", + "Channel enabled", NULL}, + {SR_CONF_CHANNEL_CONFIG, SR_T_STRING, "channel_config", + "Channel modes", NULL}, {SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED, SR_T_BOOL, "ovp_enabled", "Over-voltage protection enabled", NULL}, {SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE, SR_T_BOOL, "ovp_active", @@ -155,18 +155,22 @@ static struct sr_config_info sr_config_info_data[] = { "Clock edge", NULL}, {SR_CONF_AMPLITUDE, SR_T_FLOAT, "amplitude", "Amplitude", NULL}, - {SR_CONF_OUTPUT_REGULATION, SR_T_STRING, "output_regulation", - "Output channel regulation", NULL}, + {SR_CONF_REGULATION, SR_T_STRING, "regulation", + "Channel regulation", NULL}, {SR_CONF_OVER_TEMPERATURE_PROTECTION, SR_T_BOOL, "otp", "Over-temperature protection", NULL}, - {SR_CONF_OUTPUT_FREQUENCY, SR_T_UINT64, "output_frequency", + {SR_CONF_OUTPUT_FREQUENCY, SR_T_FLOAT, "output_frequency", "Output frequency", NULL}, + {SR_CONF_OUTPUT_FREQUENCY_TARGET, SR_T_FLOAT, "output_frequency_target", + "Output frequency target", NULL}, {SR_CONF_MEASURED_QUANTITY, SR_T_STRING, "measured_quantity", "Measured quantity", NULL}, {SR_CONF_MEASURED_2ND_QUANTITY, SR_T_STRING, "measured_2nd_quantity", "Measured secondary quantity", NULL}, {SR_CONF_EQUIV_CIRCUIT_MODEL, SR_T_STRING, "equiv_circuit_model", "Equivalent circuit model", NULL}, + {SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE, SR_T_BOOL, "otp_active", + "Over-temperature protection active", NULL}, /* Special stuff */ {SR_CONF_SCAN_OPTIONS, SR_T_STRING, "scan_options", @@ -259,27 +263,20 @@ SR_PRIV int sr_variant_type_check(uint32_t key, GVariant *value) /** * Return the list of supported hardware drivers. * - * @return Pointer to the NULL-terminated list of hardware driver pointers. + * @param[in] ctx Pointer to a libsigrok context struct. Must not be NULL. + * + * @retval NULL The ctx argument was NULL, or there are no supported drivers. + * @retval Other Pointer to the NULL-terminated list of hardware drivers. + * The user should NOT g_free() this list, sr_exit() will do that. * - * @since 0.1.0 + * @since 0.4.0 */ -SR_API struct sr_dev_driver **sr_driver_list(void) +SR_API struct sr_dev_driver **sr_driver_list(const struct sr_context *ctx) { - static struct sr_dev_driver **combined_list = NULL; - struct sr_dev_driver ***lists, **drivers; - GArray *array; - - if (combined_list) - return combined_list; - - array = g_array_new(TRUE, FALSE, sizeof(struct sr_dev_driver *)); - for (lists = drivers_lists; *lists; lists++) - for (drivers = *lists; *drivers; drivers++) - g_array_append_val(array, *drivers); - combined_list = (struct sr_dev_driver **)array->data; - g_array_free(array, FALSE); + if (!ctx) + return NULL; - return combined_list; + return ctx->driver_list; } /** @@ -400,7 +397,7 @@ SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options) return NULL; } - if (!driver->priv) { + if (!driver->context) { sr_err("Driver not initialized, can't scan for devices."); return NULL; } @@ -418,18 +415,26 @@ SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options) return l; } -/** Call driver cleanup function for all drivers. - * @private */ -SR_PRIV void sr_hw_cleanup_all(void) +/** + * Call driver cleanup function for all drivers. + * + * @param[in] ctx Pointer to a libsigrok context struct. Must not be NULL. + * + * @private + */ +SR_PRIV void sr_hw_cleanup_all(const struct sr_context *ctx) { int i; struct sr_dev_driver **drivers; - drivers = sr_driver_list(); + if (!ctx) + return; + + drivers = sr_driver_list(ctx); for (i = 0; drivers[i]; i++) { if (drivers[i]->cleanup) drivers[i]->cleanup(drivers[i]); - drivers[i]->priv = NULL; + drivers[i]->context = NULL; } }