X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fmotech-lps-30x%2Fapi.c;h=0ed6b09b458f56a00a396afaac19e13863a9c077;hb=329733d92c5004f0fe308eff26b9537fded2cdf3;hp=f0a0fd876a3b9ea6f471dcec8f9590d952b1e84c;hpb=5b980134c527de2f7971a69f7264fffd726625ea;p=libsigrok.git diff --git a/src/hardware/motech-lps-30x/api.c b/src/hardware/motech-lps-30x/api.c index f0a0fd87..0ed6b09b 100644 --- a/src/hardware/motech-lps-30x/api.c +++ b/src/hardware/motech-lps-30x/api.c @@ -43,6 +43,12 @@ SR_PRIV int lps_query_status(struct sr_dev_inst* sdi); #define VENDOR_MOTECH "Motech" +/** Driver capabilities generic. */ +static const uint32_t drvopts[] = { + /* Device class */ + SR_CONF_POWER_SUPPLY, +}; + /** Driver scanning options. */ static const uint32_t scanopts[] = { SR_CONF_CONN, @@ -64,9 +70,9 @@ static const uint32_t devopts[] = { /** Hardware capabilities channel 1, 2. */ static const uint32_t devopts_ch12[] = { SR_CONF_OUTPUT_VOLTAGE | SR_CONF_GET, - SR_CONF_OUTPUT_VOLTAGE_MAX | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_OUTPUT_VOLTAGE_TARGET | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_OUTPUT_CURRENT | SR_CONF_GET, - SR_CONF_OUTPUT_CURRENT_MAX | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_OUTPUT_CURRENT_LIMIT | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_OUTPUT_ENABLED | SR_CONF_GET | SR_CONF_SET, }; @@ -82,7 +88,7 @@ static const char *channel_modes[] = { "Track2", }; -static struct lps_modelspec models[] = { +static const struct lps_modelspec models[] = { { LPS_UNKNOWN, "Dummy", 0, { @@ -128,9 +134,9 @@ static struct lps_modelspec models[] = { }, }; -static int init_lps301(struct sr_context *sr_ctx) +static int init_lps301(struct sr_dev_driver *di, struct sr_context *sr_ctx) { - return std_init(sr_ctx, &motech_lps_301_driver_info, LOG_PREFIX); + return std_init(sr_ctx, di, LOG_PREFIX); } /** Send command to device with va_list. @@ -146,7 +152,7 @@ SR_PRIV int lps_send_va(struct sr_serial_dev_inst *serial, const char* fmt, va_l sr_spew("lps_send_va: \"%s\"", buf); - retc = serial_write_blocking(serial, buf, strlen(buf)); + retc = serial_write_blocking(serial, buf, strlen(buf), 0); if (retc < 0) return SR_ERR; @@ -375,9 +381,9 @@ static GSList *do_scan(lps_modelid modelid, struct sr_dev_driver *drv, GSList *o GSList *devices; const char *conn, *serialcomm; int cnt; - gchar buf[LINELEN_MAX]; + gchar buf[LINELEN_MAX]; gchar channel[10]; - char* verstr; + char *verstr; sdi = NULL; devc = NULL; @@ -396,8 +402,7 @@ static GSList *do_scan(lps_modelid modelid, struct sr_dev_driver *drv, GSList *o serialcomm = SERIALCOMM; /* Init serial port. */ - if (!(serial = sr_serial_dev_inst_new(conn, serialcomm))) - return NULL; + serial = sr_serial_dev_inst_new(conn, serialcomm); if (serial_open(serial, SERIAL_RDWR) != SR_OK) goto exit_err; @@ -436,7 +441,6 @@ static GSList *do_scan(lps_modelid modelid, struct sr_dev_driver *drv, GSList *o goto exit_err; } - g_strstrip(buf); verstr = buf + 4; } @@ -444,7 +448,11 @@ static GSList *do_scan(lps_modelid modelid, struct sr_dev_driver *drv, GSList *o Therefore just print an error message, but do not exit with error. */ sr_err("Failed to query for hardware version: %d %s", errno, strerror(errno)); - sdi = sr_dev_inst_new(0, SR_ST_INACTIVE, VENDOR_MOTECH, models[modelid].modelstr, verstr); + sdi = g_malloc0(sizeof(struct sr_dev_inst)); + sdi->status = SR_ST_INACTIVE; + sdi->vendor = g_strdup(VENDOR_MOTECH); + sdi->model = g_strdup(models[modelid].modelstr); + sdi->version = g_strdup(verstr); sdi->driver = drv; sdi->inst_type = SR_INST_SERIAL; sdi->conn = serial; @@ -461,8 +469,7 @@ static GSList *do_scan(lps_modelid modelid, struct sr_dev_driver *drv, GSList *o /* Setup channels and channel groups. */ for (cnt = 0; cnt < models[modelid].num_channels; cnt++) { snprintf(channel, sizeof(channel), "CH%d", cnt + 1); - ch = sr_channel_new(cnt, SR_CHANNEL_ANALOG, TRUE, channel); - sdi->channels = g_slist_append(sdi->channels, ch); + ch = sr_channel_new(sdi, cnt, SR_CHANNEL_ANALOG, TRUE, channel); devc->channel_status[cnt].info = g_slist_append(NULL, ch); @@ -504,19 +511,14 @@ exit_err: } /** Scan for LPS-301 device. */ -static GSList *scan_lps301(GSList *options) +static GSList *scan_lps301(struct sr_dev_driver *di, GSList *options) { - return do_scan(LPS_301, &motech_lps_301_driver_info, options); + return do_scan(LPS_301, di, options); } -static GSList *doDevList(struct sr_dev_driver *drv) +static GSList *dev_list_lps301(const struct sr_dev_driver *di) { - return ((struct drv_context *)(drv->priv))->instances; -} - -static GSList *dev_list_lps301(void) -{ - return doDevList(&motech_lps_301_driver_info); + return ((struct drv_context *)(di->priv))->instances; } static void dev_clear_private(struct dev_context* devc) @@ -530,14 +532,14 @@ static void dev_clear_private(struct dev_context* devc) g_timer_destroy(devc->elapsed_msec); } -static int dev_clear_lps301(void) +static int dev_clear_lps301(const struct sr_dev_driver *di) { - return std_dev_clear(&motech_lps_301_driver_info, (std_dev_clear_callback)dev_clear_private); + return std_dev_clear(di, (std_dev_clear_callback)dev_clear_private); } -static int cleanup(void) +static int cleanup(const struct sr_dev_driver *di) { - return dev_clear_lps301(); + return dev_clear_lps301(di); } static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, @@ -575,13 +577,13 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s case SR_CONF_OUTPUT_VOLTAGE: *data = g_variant_new_double(devc->channel_status[ch_idx].output_voltage_last); break; - case SR_CONF_OUTPUT_VOLTAGE_MAX: + case SR_CONF_OUTPUT_VOLTAGE_TARGET: *data = g_variant_new_double(devc->channel_status[ch_idx].output_voltage_max); break; case SR_CONF_OUTPUT_CURRENT: *data = g_variant_new_double(devc->channel_status[ch_idx].output_current_last); break; - case SR_CONF_OUTPUT_CURRENT_MAX: + case SR_CONF_OUTPUT_CURRENT_LIMIT: *data = g_variant_new_double(devc->channel_status[ch_idx].output_current_max); break; case SR_CONF_OUTPUT_ENABLED: @@ -664,7 +666,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd ch_idx = ch->index; switch (key) { - case SR_CONF_OUTPUT_VOLTAGE_MAX: + case SR_CONF_OUTPUT_VOLTAGE_TARGET: dval = g_variant_get_double(data); if (dval < 0 || dval > devc->model->channels[ch_idx].voltage[1]) return SR_ERR_ARG; @@ -685,7 +687,7 @@ static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sd else return lps_cmd_ok(sdi->conn, "VSET%d %05.3f", ch_idx+1, dval); break; - case SR_CONF_OUTPUT_CURRENT_MAX: + case SR_CONF_OUTPUT_CURRENT_LIMIT: dval = g_variant_get_double(data); if (dval < 0 || dval > devc->model->channels[ch_idx].current[1]) return SR_ERR_ARG; @@ -734,6 +736,12 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t)); return SR_OK; + case SR_CONF_DEVICE_OPTIONS: + if (sdi != NULL) + break; + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t)); + return SR_OK; default: if (sdi == NULL) return SR_ERR_ARG; @@ -775,7 +783,7 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, devopts_ch3, ARRAY_SIZE(devopts_ch3), sizeof(uint32_t)); break; - case SR_CONF_OUTPUT_VOLTAGE_MAX: + case SR_CONF_OUTPUT_VOLTAGE_TARGET: g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); /* Min, max, step. */ for (i = 0; i < 3; i++) { @@ -784,7 +792,7 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * } *data = g_variant_builder_end(&gvb); break; - case SR_CONF_OUTPUT_CURRENT_MAX: + case SR_CONF_OUTPUT_CURRENT_LIMIT: g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY); /* Min, max, step. */ for (i = 0; i < 3; i++) {