static int dev_open(struct sr_dev_inst *sdi) { struct dev_context *devc; struct sr_scpi_dev_inst *scpi; GVariant *beeper; if (sdi->status != SR_ST_INACTIVE) return SR_ERR; scpi = sdi->conn; if (sr_scpi_open(scpi) < 0) return SR_ERR; sdi->status = SR_ST_ACTIVE; devc = sdi->priv; scpi_cmd(sdi, devc->device->commands, SCPI_CMD_REMOTE); devc = sdi->priv; devc->beeper_was_set = FALSE; if (scpi_cmd_resp(sdi, devc->device->commands, &beeper, G_VARIANT_TYPE_BOOLEAN, SCPI_CMD_BEEPER) == SR_OK) { if (g_variant_get_boolean(beeper)) { devc->beeper_was_set = TRUE; scpi_cmd(sdi, devc->device->commands, SCPI_CMD_BEEPER_DISABLE); } g_variant_unref(beeper); } return SR_OK; }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; const GVariantType *gvtype; unsigned int i; int cmd, ret; char *s; if (!sdi) return SR_ERR_ARG; devc = sdi->priv; if (cg) { /* * These options only apply to channel groups with a single * channel -- they're per-channel settings for the device. */ /* * Config keys are handled below depending on whether a channel * group was provided by the frontend. However some of these * take a CG on one PPS but not on others. Check the device's * profile for that here, and NULL out the channel group as needed. */ for (i = 0; i < devc->device->num_devopts; i++) { if (devc->device->devopts[i] == key) { cg = NULL; break; } } } gvtype = NULL; cmd = -1; switch (key) { case SR_CONF_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OUTPUT_ENABLED; break; case SR_CONF_VOLTAGE: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_MEAS_VOLTAGE; break; case SR_CONF_VOLTAGE_TARGET: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_VOLTAGE_TARGET; break; case SR_CONF_OUTPUT_FREQUENCY: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_MEAS_FREQUENCY; break; case SR_CONF_OUTPUT_FREQUENCY_TARGET: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_FREQUENCY_TARGET; break; case SR_CONF_CURRENT: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_MEAS_CURRENT; break; case SR_CONF_CURRENT_LIMIT: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_CURRENT_LIMIT; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ENABLED; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ACTIVE; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_THRESHOLD; break; case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ENABLED; break; case SR_CONF_OVER_CURRENT_PROTECTION_ACTIVE: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ACTIVE; break; case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_THRESHOLD; break; case SR_CONF_OVER_TEMPERATURE_PROTECTION: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION; break; case SR_CONF_REGULATION: gvtype = G_VARIANT_TYPE_STRING; cmd = SCPI_CMD_GET_OUTPUT_REGULATION; } if (!gvtype) return SR_ERR_NA; if (cg) select_channel(sdi, cg->channels->data); ret = scpi_cmd_resp(sdi, devc->device->commands, data, gvtype, cmd); if (cmd == SCPI_CMD_GET_OUTPUT_REGULATION) { /* * The Rigol DP800 series return CV/CC/UR, Philips PM2800 * return VOLT/CURR. We always return a GVariant string in * the Rigol notation. */ if ((ret = sr_scpi_get_string(sdi->conn, NULL, &s)) != SR_OK) return ret; if (!strcmp(s, "CV") || !strcmp(s, "VOLT")) { *data = g_variant_new_string("CV"); } else if (!strcmp(s, "CC") || !strcmp(s, "CURR")) { *data = g_variant_new_string("CC"); } else if (!strcmp(s, "UR")) { *data = g_variant_new_string("UR"); } else { sr_dbg("Unknown response to SCPI_CMD_GET_OUTPUT_REGULATION: %s", s); ret = SR_ERR_DATA; } g_free(s); } return ret; }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct dev_context *devc; const GVariantType *gvtype; unsigned int i; int cmd, ret; if (!sdi) return SR_ERR_ARG; devc = sdi->priv; if (cg) { /* * These options only apply to channel groups with a single * channel -- they're per-channel settings for the device. */ /* * Config keys are handled below depending on whether a channel * group was provided by the frontend. However some of these * take a CG on one PPS but not on others. Check the device's * profile for that here, and NULL out the channel group as needed. */ for (i = 0; i < devc->device->num_devopts; i++) { if (devc->device->devopts[i] == key) { cg = NULL; break; } } } gvtype = NULL; cmd = -1; switch (key) { case SR_CONF_OUTPUT_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OUTPUT_ENABLED; break; case SR_CONF_OUTPUT_VOLTAGE: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_MEAS_VOLTAGE; break; case SR_CONF_OUTPUT_VOLTAGE_TARGET: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_VOLTAGE_TARGET; break; case SR_CONF_OUTPUT_CURRENT: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_MEAS_CURRENT; break; case SR_CONF_OUTPUT_CURRENT_LIMIT: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_CURRENT_LIMIT; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ENABLED; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_ACTIVE: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_ACTIVE; break; case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_OVER_VOLTAGE_PROTECTION_THRESHOLD; break; case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ENABLED; break; case SR_CONF_OVER_CURRENT_PROTECTION_ACTIVE: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_ACTIVE; break; case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD: gvtype = G_VARIANT_TYPE_DOUBLE; cmd = SCPI_CMD_GET_OVER_CURRENT_PROTECTION_THRESHOLD; break; case SR_CONF_OVER_TEMPERATURE_PROTECTION: gvtype = G_VARIANT_TYPE_BOOLEAN; cmd = SCPI_CMD_GET_OVER_TEMPERATURE_PROTECTION; break; case SR_CONF_OUTPUT_REGULATION: gvtype = G_VARIANT_TYPE_STRING; cmd = SCPI_CMD_GET_OUTPUT_REGULATION; } if (gvtype) { if (cg) select_channel(sdi, cg->channels->data); ret = scpi_cmd_resp(sdi, data, gvtype, cmd); } else ret = SR_ERR_NA; return ret; }