diff --git a/src/device.c b/src/device.c index fe3e2316..dd34f796 100644 --- a/src/device.c +++ b/src/device.c @@ -133,6 +133,25 @@ SR_API int sr_dev_channel_enable(struct sr_channel *channel, return SR_OK; } +/* Returns the next enabled channel, wrapping around if necessary. */ +SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi, + struct sr_channel *cur_channel) +{ + struct sr_channel *next_channel; + GSList *l; + + next_channel = cur_channel; + do { + l = g_slist_find(sdi->channels, next_channel); + if (l && l->next) + next_channel = l->next->data; + else + next_channel = sdi->channels->data; + } while (!next_channel->enabled); + + return next_channel; +} + /** * Determine whether the specified device instance has the specified * capability. diff --git a/src/hardware/scpi-pps/api.c b/src/hardware/scpi-pps/api.c index 58e14f6e..1210b81c 100644 --- a/src/hardware/scpi-pps/api.c +++ b/src/hardware/scpi-pps/api.c @@ -597,7 +597,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) std_session_send_df_header(sdi, LOG_PREFIX); /* Prime the pipe with the first channel's fetch. */ - ch = next_enabled_channel(sdi, NULL); + ch = sr_next_enabled_channel(sdi, NULL); pch = ch->priv; if ((ret = select_channel(sdi, ch)) < 0) return ret; diff --git a/src/hardware/scpi-pps/protocol.c b/src/hardware/scpi-pps/protocol.c index c4b73add..fcf3f21b 100644 --- a/src/hardware/scpi-pps/protocol.c +++ b/src/hardware/scpi-pps/protocol.c @@ -53,24 +53,6 @@ SR_PRIV int select_channel(const struct sr_dev_inst *sdi, struct sr_channel *ch) return ret; } -SR_PRIV struct sr_channel *next_enabled_channel(const struct sr_dev_inst *sdi, - struct sr_channel *cur_channel) -{ - struct sr_channel *next_channel; - GSList *l; - - next_channel = cur_channel; - do { - l = g_slist_find(sdi->channels, next_channel); - if (l && l->next) - next_channel = l->next->data; - else - next_channel = sdi->channels->data; - } while (!next_channel->enabled); - - return next_channel; -} - SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data) { struct dev_context *devc; @@ -115,7 +97,7 @@ SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data) } if (g_slist_length(sdi->channels) > 1) { - next_channel = next_enabled_channel(sdi, devc->cur_channel); + next_channel = sr_next_enabled_channel(sdi, devc->cur_channel); if (select_channel(sdi, next_channel) != SR_OK) { sr_err("Failed to select channel %s", next_channel->name); return FALSE; diff --git a/src/hardware/scpi-pps/protocol.h b/src/hardware/scpi-pps/protocol.h index 77589245..6c84c089 100644 --- a/src/hardware/scpi-pps/protocol.h +++ b/src/hardware/scpi-pps/protocol.h @@ -156,8 +156,6 @@ SR_PRIV extern const struct scpi_pps pps_profiles[]; SR_PRIV const char *get_vendor(const char *raw_vendor); SR_PRIV int select_channel(const struct sr_dev_inst *sdi, struct sr_channel *ch); -SR_PRIV struct sr_channel *next_enabled_channel(const struct sr_dev_inst *sdi, - struct sr_channel *cur_channel); SR_PRIV int scpi_pps_receive_data(int fd, int revents, void *cb_data); #endif diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 4b3daf44..d3675782 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -632,6 +632,8 @@ enum { SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi, int index, int type, gboolean enabled, const char *name); +SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi, + struct sr_channel *cur_channel); /** Device instance data */ struct sr_dev_inst {