X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fhameg-hmo%2Fapi.c;h=ee7c74430b2ceb9ce63a2650b93918daa2cebaf4;hb=61c39f54bbcae7bdde86ddb11b2fd0ff308d319b;hp=6a16bb1dba832419eed31d151e8e06dad74bc218;hpb=23f43dff15abf5202d81f36e062b0ae5b0ca01cd;p=libsigrok.git diff --git a/hardware/hameg-hmo/api.c b/hardware/hameg-hmo/api.c index 6a16bb1d..ee7c7443 100644 --- a/hardware/hameg-hmo/api.c +++ b/hardware/hameg-hmo/api.c @@ -23,6 +23,13 @@ #define SERIALCOMM "115200/8n1/flow=1" +SR_PRIV struct sr_dev_driver hameg_hmo_driver_info; +static struct sr_dev_driver *di = &hameg_hmo_driver_info; + +static const char *manufacturers[] = { + "HAMEG", +}; + static const int32_t hwopts[] = { SR_CONF_CONN, SR_CONF_SERIALCOMM, @@ -186,6 +193,79 @@ skip_device: #endif } +static int check_manufacturer(const char *manufacturer) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(manufacturers); ++i) + if (!strcmp(manufacturer, manufacturers[i])) + return SR_OK; + + return SR_ERR; +} + +static struct sr_dev_inst *hmo_probe_serial_device(const char *serial_device, + const char *serial_options) +{ + struct sr_dev_inst *sdi; + struct dev_context *devc; + struct sr_scpi_hw_info *hw_info; + struct sr_scpi_dev_inst *scpi; + + sdi = NULL; + devc = NULL; + scpi = NULL; + hw_info = NULL; + + if (!(scpi = scpi_serial_dev_inst_new(serial_device, serial_options))) + goto fail; + + sr_info("Probing %s.", serial_device); + if (sr_scpi_open(scpi) != SR_OK) + goto fail; + + if (sr_scpi_get_hw_id(scpi, &hw_info) != SR_OK) { + sr_info("Couldn't get IDN response."); + goto fail; + } + + if (check_manufacturer(hw_info->manufacturer) != SR_OK) + goto fail; + + if (!(sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, + hw_info->manufacturer, hw_info->model, + hw_info->firmware_version))) { + goto fail; + } + sr_scpi_hw_info_free(hw_info); + hw_info = NULL; + + if (!(devc = g_try_malloc0(sizeof(struct dev_context)))) + goto fail; + + sdi->driver = di; + sdi->priv = devc; + sdi->inst_type = SR_INST_SCPI; + sdi->conn = scpi; + + if (hmo_init_device(sdi) != SR_OK) + goto fail; + + return sdi; + +fail: + if (hw_info) + sr_scpi_hw_info_free(hw_info); + if (scpi) + sr_scpi_free(scpi); + if (sdi) + sr_dev_inst_free(sdi); + if (devc) + g_free(devc); + + return NULL; +} + static GSList *scan(GSList *options) { GSList *devices;