* @param[in] enabled @copydoc sr_channel::enabled
* @param[in] name @copydoc sr_channel::name
*
- * @return NULL (failure) or new struct sr_channel*.
+ * @return A new struct sr_channel*.
*/
SR_PRIV struct sr_channel *sr_channel_new(int index, int type,
gboolean enabled, const char *name)
{
struct sr_channel *ch;
- if (!(ch = g_try_malloc0(sizeof(struct sr_channel)))) {
- sr_err("Channel malloc failed.");
- return NULL;
- }
-
+ ch = g_malloc0(sizeof(struct sr_channel));
ch->index = index;
ch->type = type;
ch->enabled = enabled;
return ret;
}
-/** @private
- * Allocate and init new device instance struct.
- * @param[in] index @copydoc sr_dev_inst::index
- * @param[in] status @copydoc sr_dev_inst::status
- * @param[in] vendor @copydoc sr_dev_inst::vendor
- * @param[in] model @copydoc sr_dev_inst::model
- * @param[in] version @copydoc sr_dev_inst::version
- *
- * @retval NULL Error
- * @retval struct sr_dev_inst *. Dynamically allocated, free using
- * sr_dev_inst_free().
+/**
+ * Allocate and init a new user-generated device instance.
+ *
+ * @param vendor Device vendor
+ * @param model Device model
+ * @param version Device version
+ *
+ * @retval struct sr_dev_inst *. Dynamically allocated, free using
+ * sr_dev_inst_free().
*/
-SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int status,
- const char *vendor, const char *model, const char *version)
+SR_API struct sr_dev_inst *sr_dev_inst_user_new(const char *vendor,
+ const char *model, const char *version)
{
struct sr_dev_inst *sdi;
- if (!(sdi = g_try_malloc(sizeof(struct sr_dev_inst)))) {
- sr_err("Device instance malloc failed.");
- return NULL;
- }
+ sdi = g_malloc0(sizeof(struct sr_dev_inst));
- sdi->driver = NULL;
- sdi->status = status;
- sdi->inst_type = -1;
- sdi->vendor = vendor ? g_strdup(vendor) : NULL;
- sdi->model = model ? g_strdup(model) : NULL;
- sdi->version = version ? g_strdup(version) : NULL;
- sdi->serial_num = NULL;
- sdi->connection_id = NULL;
- sdi->channels = NULL;
- sdi->channel_groups = NULL;
- sdi->session = NULL;
- sdi->conn = NULL;
- sdi->priv = NULL;
+ sdi->vendor = g_strdup(vendor);
+ sdi->model = g_strdup(model);
+ sdi->version = g_strdup(version);
+ sdi->inst_type = SR_INST_USER;
return sdi;
}
+/**
+ * Add a new channel to the specified device instance.
+ */
+SR_API int sr_dev_inst_channel_add(struct sr_dev_inst *sdi, int index, int type, const char *name)
+{
+ struct sr_channel *ch;
+
+ if (!sdi || sdi->inst_type != SR_INST_USER || index < 0)
+ return SR_ERR_ARG;
+
+ ch = sr_channel_new(index, type, TRUE, name);
+ sdi->channels = g_slist_append(sdi->channels, ch);
+
+ return SR_OK;
+}
+
/** @private
* Free device instance struct created by sr_dev_inst().
* @param sdi device instance to free.
* @param[in] address @copydoc sr_usb_dev_inst::address
* @param[in] hdl @copydoc sr_usb_dev_inst::devhdl
*
- * @retval NULL Error
* @retval other struct sr_usb_dev_inst * for USB device instance.
*/
SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,
{
struct sr_usb_dev_inst *udi;
- if (!(udi = g_try_malloc(sizeof(struct sr_usb_dev_inst)))) {
- sr_err("USB device instance malloc failed.");
- return NULL;
- }
-
+ udi = g_malloc0(sizeof(struct sr_usb_dev_inst));
udi->bus = bus;
udi->address = address;
udi->devhdl = hdl;
*
* @param[in] port OS-specific serial port specification. Examples:
* "/dev/ttyUSB0", "/dev/ttyACM1", "/dev/tty.Modem-0", "COM1".
+ * Must not be NULL.
* @param[in] serialcomm A serial communication parameters string, in the form
* of \<speed\>/\<data bits\>\<parity\>\<stopbits\>, for example
* "9600/8n1" or "600/7o2". This is an optional parameter;
- * it may be filled in later.
+ * it may be filled in later. Can be NULL.
*
* @return A pointer to a newly initialized struct sr_serial_dev_inst,
* or NULL on error.
{
struct sr_serial_dev_inst *serial;
- if (!port) {
- sr_err("Serial port required.");
- return NULL;
- }
-
- if (!(serial = g_try_malloc0(sizeof(struct sr_serial_dev_inst)))) {
- sr_err("Serial device instance malloc failed.");
- return NULL;
- }
-
+ serial = g_malloc0(sizeof(struct sr_serial_dev_inst));
serial->port = g_strdup(port);
if (serialcomm)
serial->serialcomm = g_strdup(serialcomm);
{
struct sr_usbtmc_dev_inst *usbtmc;
- if (!device) {
- sr_err("Device name required.");
- return NULL;
- }
-
- if (!(usbtmc = g_try_malloc0(sizeof(struct sr_usbtmc_dev_inst)))) {
- sr_err("USBTMC device instance malloc failed.");
- return NULL;
- }
-
+ usbtmc = g_malloc0(sizeof(struct sr_usbtmc_dev_inst));
usbtmc->device = g_strdup(device);
usbtmc->fd = -1;
*
* @return The driver instance or NULL on error.
*/
-SR_API struct sr_dev_driver *sr_dev_inst_driver_get(struct sr_dev_inst *sdi)
+SR_API struct sr_dev_driver *sr_dev_inst_driver_get(const struct sr_dev_inst *sdi)
{
if (!sdi || !sdi->driver)
return NULL;
*
* @return The vendor string or NULL.
*/
-SR_API const char *sr_dev_inst_vendor_get(struct sr_dev_inst *sdi)
+SR_API const char *sr_dev_inst_vendor_get(const struct sr_dev_inst *sdi)
{
if (!sdi)
return NULL;
*
* @return The model string or NULL.
*/
-SR_API const char *sr_dev_inst_model_get(struct sr_dev_inst *sdi)
+SR_API const char *sr_dev_inst_model_get(const struct sr_dev_inst *sdi)
{
if (!sdi)
return NULL;
*
* @return The version string or NULL.
*/
-SR_API const char *sr_dev_inst_version_get(struct sr_dev_inst *sdi)
+SR_API const char *sr_dev_inst_version_get(const struct sr_dev_inst *sdi)
{
if (!sdi)
return NULL;
*
* @return The serial number string or NULL.
*/
-SR_API const char *sr_dev_inst_sernum_get(struct sr_dev_inst *sdi)
+SR_API const char *sr_dev_inst_sernum_get(const struct sr_dev_inst *sdi)
{
if (!sdi)
return NULL;
* @return A copy of the connection id string or NULL. The caller is responsible
* for g_free()ing the string when it is no longer needed.
*/
-SR_API const char *sr_dev_inst_connid_get(struct sr_dev_inst *sdi)
+SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
{
struct drv_context *drvc;
int r, cnt, i, a, b;
/* connection_id isn't populated, let's do that here. */
serial = sdi->conn;
- sdi->connection_id = g_strdup(serial->port);
+ ((struct sr_dev_inst *)sdi)->connection_id = g_strdup(serial->port);
}
#endif
continue;
usb_get_port_path(devlist[i], connection_id, sizeof(connection_id));
- sdi->connection_id = g_strdup(connection_id);
+ ((struct sr_dev_inst *)sdi)->connection_id = g_strdup(connection_id);
break;
}
return sdi->connection_id;
}
+/**
+ * Queries a device instances' channel list.
+ *
+ * @param sdi Device instance to use. Must not be NULL.
+ *
+ * @return The GSList of channels or NULL.
+ */
+SR_API GSList *sr_dev_inst_channels_get(const struct sr_dev_inst *sdi)
+{
+ if (!sdi)
+ return NULL;
+
+ return sdi->channels;
+}
+
+/**
+ * Queries a device instances' channel groups list.
+ *
+ * @param sdi Device instance to use. Must not be NULL.
+ *
+ * @return The GSList of channel groups or NULL.
+ */
+SR_API GSList *sr_dev_inst_channel_groups_get(const struct sr_dev_inst *sdi)
+{
+ if (!sdi)
+ return NULL;
+
+ return sdi->channel_groups;
+}
+
/** @} */