24 #include "libsigrok-internal.h"
27 #define LOG_PREFIX "device"
65 ch->
name = g_strdup(name);
67 sdi->channels = g_slist_append(sdi->channels, ch);
90 sr_err(
"%s: channel was NULL", __func__);
94 g_free(channel->
name);
95 channel->
name = g_strdup(name);
115 gboolean was_enabled;
116 struct sr_dev_inst *sdi;
122 was_enabled = channel->
enabled;
124 if (!state != !was_enabled && sdi->driver
125 && sdi->driver->config_channel_set) {
126 ret = sdi->driver->config_channel_set(
127 sdi, channel, SR_CHANNEL_SET_ENABLED);
143 next_channel = cur_channel;
145 l = g_slist_find(sdi->channels, next_channel);
147 next_channel = l->next->data;
149 next_channel = sdi->channels->data;
150 }
while (!next_channel->
enabled);
179 if (!sdi || !sdi->driver || !sdi->driver->config_list)
182 if (sdi->driver->config_list(SR_CONF_DEVICE_OPTIONS,
183 &gvar, sdi, NULL) !=
SR_OK)
187 devopts = g_variant_get_fixed_array(gvar, &num_opts,
sizeof(int32_t));
188 for (i = 0; i < num_opts; i++) {
189 if ((devopts[i] & SR_CONF_MASK) == key) {
194 g_variant_unref(gvar);
214 const struct sr_dev_driver *driver,
const struct sr_dev_inst *sdi,
218 const uint32_t *opts;
226 if (sdi && sdi->driver != driver)
232 opts = g_variant_get_fixed_array(gvar, &num_opts,
sizeof(uint32_t));
234 result = g_array_sized_new(FALSE, FALSE,
sizeof(uint32_t), num_opts);
236 for (i = 0; i < num_opts; i++) {
237 opt = opts[i] & SR_CONF_MASK;
238 g_array_insert_val(result, i, opt);
241 g_variant_unref(gvar);
272 if (!sdi || !sdi->driver || !sdi->driver->config_list)
275 if (sdi->driver->config_list(SR_CONF_DEVICE_OPTIONS,
276 &gvar, sdi, cg) !=
SR_OK)
280 devopts = g_variant_get_fixed_array(gvar, &num_opts,
sizeof(int32_t));
281 for (i = 0; i < num_opts; i++) {
282 if ((devopts[i] & SR_CONF_MASK) == key) {
283 ret = devopts[i] & ~SR_CONF_MASK;
287 g_variant_unref(gvar);
303 const char *model,
const char *version)
305 struct sr_dev_inst *sdi;
307 sdi = g_malloc0(
sizeof(
struct sr_dev_inst));
309 sdi->vendor = g_strdup(vendor);
310 sdi->model = g_strdup(model);
311 sdi->version = g_strdup(version);
322 if (!sdi || sdi->inst_type !=
SR_INST_USER || index < 0)
325 sr_channel_new(sdi, index, type, TRUE, name);
334 SR_PRIV void sr_dev_inst_free(
struct sr_dev_inst *sdi)
340 for (l = sdi->channels; l; l = l->next) {
346 g_slist_free(sdi->channels);
348 for (l = sdi->channel_groups; l; l = l->next) {
355 g_slist_free(sdi->channel_groups);
362 g_free(sdi->version);
363 g_free(sdi->serial_num);
364 g_free(sdi->connection_id);
368 #ifdef HAVE_LIBUSB_1_0
378 SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,
379 uint8_t address,
struct libusb_device_handle *hdl)
381 struct sr_usb_dev_inst *udi;
383 udi = g_malloc0(
sizeof(
struct sr_usb_dev_inst));
385 udi->address = address;
395 SR_PRIV void sr_usb_dev_inst_free(
struct sr_usb_dev_inst *usb)
402 #ifdef HAVE_LIBSERIALPORT
421 SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(
const char *port,
422 const char *serialcomm)
424 struct sr_serial_dev_inst *serial;
426 serial = g_malloc0(
sizeof(
struct sr_serial_dev_inst));
427 serial->port = g_strdup(port);
429 serial->serialcomm = g_strdup(serialcomm);
438 SR_PRIV void sr_serial_dev_inst_free(
struct sr_serial_dev_inst *serial)
440 g_free(serial->port);
441 g_free(serial->serialcomm);
447 SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(
const char *device)
449 struct sr_usbtmc_dev_inst *usbtmc;
451 usbtmc = g_malloc0(
sizeof(
struct sr_usbtmc_dev_inst));
452 usbtmc->device = g_strdup(device);
459 SR_PRIV void sr_usbtmc_dev_inst_free(
struct sr_usbtmc_dev_inst *usbtmc)
461 g_free(usbtmc->device);
499 sr_err(
"Invalid driver.");
506 ret = std_dev_clear(driver, NULL);
524 if (!sdi || !sdi->driver || !sdi->driver->dev_open)
527 ret = sdi->driver->dev_open(sdi);
545 if (!sdi || !sdi->driver || !sdi->driver->dev_close)
548 ret = sdi->driver->dev_close(sdi);
562 if (!sdi || !sdi->driver)
625 return sdi->serial_num;
638 #ifdef HAVE_LIBUSB_1_0
639 struct drv_context *drvc;
641 char connection_id[64];
642 struct sr_usb_dev_inst *usb;
643 struct libusb_device **devlist;
649 #ifdef HAVE_LIBSERIALPORT
650 struct sr_serial_dev_inst *serial;
652 if ((!sdi->connection_id) && (sdi->inst_type ==
SR_INST_SERIAL)) {
656 ((
struct sr_dev_inst *)sdi)->connection_id = g_strdup(serial->port);
660 #ifdef HAVE_LIBUSB_1_0
661 if ((!sdi->connection_id) && (sdi->inst_type ==
SR_INST_USB)) {
664 drvc = sdi->driver->context;
667 if ((cnt = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist)) < 0) {
668 sr_err(
"Failed to retrieve device list: %s.",
669 libusb_error_name(cnt));
673 for (i = 0; i < cnt; i++) {
675 b = libusb_get_bus_number(devlist[i]);
676 a = libusb_get_device_address(devlist[i]);
677 if (b != usb->bus || a != usb->address)
680 usb_get_port_path(devlist[i], connection_id,
sizeof(connection_id));
681 ((
struct sr_dev_inst *)sdi)->connection_id = g_strdup(connection_id);
685 libusb_free_device_list(devlist, 1);
689 return sdi->connection_id;
704 return sdi->channels;
719 return sdi->channel_groups;
Device instance type for USB devices.
int sr_dev_close(struct sr_dev_inst *sdi)
Close the specified device.
char * name
Name of the channel group.
GSList * sr_dev_inst_channels_get(const struct sr_dev_inst *sdi)
Queries a device instances' channel list.
The public libsigrok header file to be used by frontends.
int sr_dev_channel_enable(struct sr_channel *channel, gboolean state)
Enable or disable a channel.
const char * sr_dev_inst_sernum_get(const struct sr_dev_inst *sdi)
Queries a device instances' serial number.
int sr_dev_clear(const struct sr_dev_driver *driver)
Clear the list of device instances a driver knows about.
struct sr_dev_inst * sr_dev_inst_user_new(const char *vendor, const char *model, const char *version)
Allocate and init a new user-generated device instance.
Generic/unspecified error.
void * priv
Private data for driver use.
const char * sr_dev_inst_vendor_get(const struct sr_dev_inst *sdi)
Queries a device instances' vendor.
gboolean enabled
Is this channel enabled?
const char * sr_dev_inst_model_get(const struct sr_dev_inst *sdi)
Queries a device instances' model.
Structure for groups of channels that have common properties.
char * name
Name of channel.
const char * sr_dev_inst_version_get(const struct sr_dev_inst *sdi)
Queries a device instances' version.
int sr_dev_config_capabilities_list(const struct sr_dev_inst *sdi, const struct sr_channel_group *cg, const int key)
Enumerate the configuration capabilities supported by a device instance for a given configuration key...
GSList * sr_dev_list(const struct sr_dev_driver *driver)
Get the list of devices/instances of the specified driver.
GArray * sr_dev_options(const struct sr_dev_driver *driver, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
Enumerate the configuration options of the specified item.
int type
Channel type (SR_CHANNEL_LOGIC, ...)
Information on single channel.
struct sr_dev_driver * sr_dev_inst_driver_get(const struct sr_dev_inst *sdi)
Queries a device instances' driver.
GSList *(* dev_list)(const struct sr_dev_driver *driver)
Get list of device instances the driver knows about.
int sr_dev_channel_name_set(struct sr_channel *channel, const char *name)
Set the name of the specified channel.
const char * sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
Queries a device instances' connection identifier.
SR_PRIV struct sr_channel * sr_next_enabled_channel(const struct sr_dev_inst *sdi, struct sr_channel *cur_channel)
Device-instance type for user-created "devices".
GSList * channels
List of sr_channel structs of the channels belonging to this group.
void * priv
Private data for driver use.
int sr_dev_inst_channel_add(struct sr_dev_inst *sdi, int index, int type, const char *name)
Add a new channel to the specified device instance.
Device instance type for serial port devices.
int sr_session_dev_remove(struct sr_session *session, struct sr_dev_inst *sdi)
Remove a device instance from a session.
GSList * sr_dev_inst_channel_groups_get(const struct sr_dev_inst *sdi)
Queries a device instances' channel groups list.
gboolean sr_dev_has_option(const struct sr_dev_inst *sdi, int key)
Determine whether the specified device instance has the specified capability.
struct sr_dev_inst * sdi
The device this channel is attached to.
int index
The index of this channel, starting at 0.
int(* config_list)(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
List all possible values for a configuration key in a device instance.
int(* dev_clear)(const struct sr_dev_driver *driver)
Clear list of devices the driver knows about.
int sr_dev_open(struct sr_dev_inst *sdi)
Open the specified device.