X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Fzketech-ebd-usb%2Fapi.c;h=cb59292e7799b40f0315537a7a742fcece9baf39;hp=63c88861889c7163e4c1a83a1a25fd4c2a031896;hb=9890fb1f08ff399c5ea6cf0e99226f23dddcaf8c;hpb=c527132aec5ff8f2fc9646f360a7b0874301e4e7 diff --git a/src/hardware/zketech-ebd-usb/api.c b/src/hardware/zketech-ebd-usb/api.c index 63c88861..cb59292e 100644 --- a/src/hardware/zketech-ebd-usb/api.c +++ b/src/hardware/zketech-ebd-usb/api.c @@ -20,115 +20,198 @@ #include #include "protocol.h" -static GSList *scan(struct sr_dev_driver *di, GSList *options) -{ - struct drv_context *drvc; - GSList *devices; +static const uint32_t scanopts[] = { + SR_CONF_CONN, + SR_CONF_SERIALCOMM, +}; - (void)options; +static const uint32_t drvopts[] = { + SR_CONF_ELECTRONIC_LOAD, +}; - devices = NULL; - drvc = di->context; - drvc->instances = NULL; +static const uint32_t devopts[] = { + SR_CONF_CONTINUOUS, + SR_CONF_CURRENT_LIMIT | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET, +}; - /* TODO: scan for devices, either based on a SR_CONF_CONN option - * or on a USB scan. */ +static GSList *scan(struct sr_dev_driver *di, GSList *options) +{ + struct dev_context *devc; + GSList *l; + struct sr_dev_inst *sdi; + const char *conn, *serialcomm; + struct sr_config *src; + struct sr_serial_dev_inst *serial; + uint8_t reply[MSGLEN]; + + conn = NULL; + serialcomm = NULL; + + for (l = options; l; l = l->next) { + src = l->data; + switch (src->key) { + case SR_CONF_CONN: + conn = g_variant_get_string(src->data, NULL); + break; + case SR_CONF_SERIALCOMM: + serialcomm = g_variant_get_string(src->data, NULL); + break; + } + } - return devices; -} + if (!conn) + return NULL; + if (!serialcomm) + serialcomm = "9600/8e1"; + + serial = sr_serial_dev_inst_new(conn, serialcomm); + if (serial_open(serial, SERIAL_RDWR) != SR_OK) + return NULL; + + sdi = g_malloc0(sizeof(struct sr_dev_inst)); + sdi->status = SR_ST_INACTIVE; + sdi->vendor = g_strdup("ZKETECH"); + sdi->model = g_strdup("EBD-USB"); + sdi->inst_type = SR_INST_SERIAL; + sdi->conn = serial; + + sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "V"); + sr_channel_new(sdi, 1, SR_CHANNEL_ANALOG, TRUE, "I"); + + devc = g_malloc0(sizeof(struct dev_context)); + g_mutex_init(&devc->rw_mutex); + devc->current_limit = 0; + devc->running = FALSE; + devc->load_activated = FALSE; + sr_sw_limits_init(&devc->limits); + sdi->priv = devc; + + /* Starting device. */ + zketech_ebd_usb_init(serial, devc); + int ret = zketech_ebd_usb_read_chars(serial, MSGLEN, reply); + if (ret != MSGLEN || reply[MSGFRAMEBEGINPOS] != MSGFRAMEBEGIN \ + || reply[MSGFRAMEENDPOS] != MSGFRAMEEND) { + sr_warn("Invalid message received!"); + ret = SR_ERR; + } + zketech_ebd_usb_stop(serial, devc); -static int dev_open(struct sr_dev_inst *sdi) -{ - (void)sdi; + serial_close(serial); - /* TODO: get handle from sdi->conn and open it. */ + if (ret < 0) + return NULL; - return SR_OK; + return std_scan_complete(di, g_slist_append(NULL, sdi)); } static int dev_close(struct sr_dev_inst *sdi) { - (void)sdi; + struct dev_context *devc; - /* TODO: get handle from sdi->conn and close it. */ + devc = (sdi) ? sdi->priv : NULL; + if (devc) + g_mutex_clear(&devc->rw_mutex); - return SR_OK; + return std_serial_dev_close(sdi); } static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { int ret; + struct dev_context *devc; + float fvalue; - (void)sdi; - (void)data; (void)cg; - ret = SR_OK; + if (!sdi || !data) + return SR_ERR_ARG; + + devc = sdi->priv; + switch (key) { - /* TODO */ + case SR_CONF_LIMIT_SAMPLES: + case SR_CONF_LIMIT_MSEC: + return sr_sw_limits_config_get(&devc->limits, key, data); + case SR_CONF_CURRENT_LIMIT: + ret = zketech_ebd_usb_get_current_limit(sdi, &fvalue); + if (ret == SR_OK) + *data = g_variant_new_double(fvalue); + return ret; default: return SR_ERR_NA; } - - return ret; } static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { - int ret; + double value; + struct dev_context *devc; - (void)sdi; (void)data; (void)cg; - ret = SR_OK; + devc = sdi->priv; + switch (key) { - /* TODO */ + case SR_CONF_LIMIT_MSEC: + case SR_CONF_LIMIT_SAMPLES: + return sr_sw_limits_config_set(&devc->limits, key, data); + case SR_CONF_CURRENT_LIMIT: + value = g_variant_get_double(data); + if (value < 0.0 || value > 4.0) + return SR_ERR_ARG; + return zketech_ebd_usb_set_current_limit(sdi, value); default: - ret = SR_ERR_NA; + return SR_ERR_NA; } - - return ret; } static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { - int ret; - - (void)sdi; - (void)data; - (void)cg; - - ret = SR_OK; switch (key) { - /* TODO */ + case SR_CONF_SCAN_OPTIONS: + case SR_CONF_DEVICE_OPTIONS: + return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts); + case SR_CONF_CURRENT_LIMIT: + *data = std_gvar_min_max_step(0.0, 4.0, 0.01); + break; default: return SR_ERR_NA; } - return ret; + return SR_OK; } static int dev_acquisition_start(const struct sr_dev_inst *sdi) { - /* TODO: configure hardware, reset acquisition state, set up - * callbacks and send header packet. */ + struct dev_context *devc; + struct sr_serial_dev_inst *serial; + + devc = sdi->priv; + serial = sdi->conn; + + sr_sw_limits_acquisition_start(&devc->limits); + std_session_send_df_header(sdi); - (void)sdi; + zketech_ebd_usb_init(serial, devc); + if (!zketech_ebd_usb_current_is0(devc)) + zketech_ebd_usb_loadstart(serial, devc); + + serial_source_add(sdi->session, serial, G_IO_IN, 100, + zketech_ebd_usb_receive_data, (void *)sdi); return SR_OK; } static int dev_acquisition_stop(struct sr_dev_inst *sdi) { - /* TODO: stop acquisition. */ - - (void)sdi; + zketech_ebd_usb_loadstop(sdi->conn, sdi->priv); - return SR_OK; + return std_serial_dev_acquisition_stop(sdi); } SR_PRIV struct sr_dev_driver zketech_ebd_usb_driver_info = { @@ -143,11 +226,10 @@ SR_PRIV struct sr_dev_driver zketech_ebd_usb_driver_info = { .config_get = config_get, .config_set = config_set, .config_list = config_list, - .dev_open = dev_open, + .dev_open = std_serial_dev_open, .dev_close = dev_close, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = dev_acquisition_stop, .context = NULL, }; - SR_REGISTER_DEV_DRIVER(zketech_ebd_usb_driver_info);