+ ret = hid_send_feature_report(devc->hid_dev, report, sizeof(report));
+ if (ret != sizeof(report))
+ return SR_ERR_IO;
+
+ /* Update relay state cache (non-fatal). */
+ (void)dcttech_usbrelay_update_state(sdi);
+
+ return SR_OK;
+}
+
+/* Answers the query from cached relay state. Beware of 1-based indexing. */
+SR_PRIV int dcttech_usbrelay_query_cg(const struct sr_dev_inst *sdi,
+ const struct sr_channel_group *cg, gboolean *on)
+{
+ struct dev_context *devc;
+ struct channel_group_context *cgc;
+ size_t relay_idx;
+ uint32_t relay_mask;
+
+ devc = sdi->priv;
+ if (!cg)
+ return SR_ERR_ARG;
+ cgc = cg->priv;
+ relay_idx = cgc->number;
+ if (relay_idx < 1 || relay_idx > devc->relay_count)
+ return SR_ERR_ARG;
+ relay_mask = 1U << (relay_idx - 1);
+
+ *on = devc->relay_state & relay_mask;