g_free(serial->serialcomm);
g_free(serial);
}
-
#endif
+SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device)
+{
+ struct sr_usbtmc_dev_inst *usbtmc;
+
+ if (!device) {
+ sr_err("Device name required.");
+ return NULL;
+ }
+
+ if (!(usbtmc = g_try_malloc0(sizeof(struct sr_usbtmc_dev_inst)))) {
+ sr_err("USBTMC device instance malloc failed.");
+ return NULL;
+ }
+
+ usbtmc->device = g_strdup(device);
+ usbtmc->fd = -1;
+
+ return usbtmc;
+}
+
+SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc)
+{
+ g_free(usbtmc->device);
+ g_free(usbtmc);
+}
+
/**
* Get the list of devices/instances of the specified driver.
*
{
struct dev_context *devc;
struct sr_dev_inst *sdi;
- struct sr_serial_dev_inst *serial;
+ struct sr_usbtmc_dev_inst *usbtmc;
struct sr_probe *probe;
unsigned int i;
int len, num_tokens;
gchar **tokens, *channel_name;
*devices = NULL;
- if (!(serial = sr_serial_dev_inst_new(port, NULL)))
+ if (!(usbtmc = sr_usbtmc_dev_inst_new(port)))
return SR_ERR_MALLOC;
- if (serial_open(serial, SERIAL_RDWR) != SR_OK)
+ if ((usbtmc->fd = open(usbtmc->device, O_RDWR)) < 0)
return SR_ERR;
- len = serial_write(serial, "*IDN?", 5);
- len = serial_read(serial, buf, sizeof(buf));
- if (serial_close(serial) != SR_OK)
+ len = write(usbtmc->fd, "*IDN?", 5);
+ len = read(usbtmc->fd, buf, sizeof(buf));
+ if (close(usbtmc->fd) < 0)
return SR_ERR;
- sr_serial_dev_inst_free(serial);
+ sr_usbtmc_dev_inst_free(usbtmc);
if (len == 0)
return SR_ERR_NA;
g_strfreev(tokens);
- if (!(sdi->conn = sr_serial_dev_inst_new(port, NULL)))
+ if (!(sdi->conn = sr_usbtmc_dev_inst_new(port)))
return SR_ERR_MALLOC;
sdi->driver = di;
- sdi->inst_type = SR_INST_SERIAL;
+ sdi->inst_type = SR_INST_USBTMC;
if (!(devc = g_try_malloc0(sizeof(struct dev_context))))
return SR_ERR_MALLOC;
static int dev_open(struct sr_dev_inst *sdi)
{
+ struct sr_usbtmc_dev_inst *usbtmc = sdi->conn;
- if (serial_open(sdi->conn, SERIAL_RDWR) != SR_OK)
+ if ((usbtmc->fd = open(usbtmc->device, O_RDWR)) < 0)
return SR_ERR;
if (rigol_ds_get_dev_cfg(sdi) != SR_OK)
static int dev_close(struct sr_dev_inst *sdi)
{
- struct sr_serial_dev_inst *serial;
+ struct sr_usbtmc_dev_inst *usbtmc;
- serial = sdi->conn;
- if (serial && serial->fd != -1) {
- serial_close(serial);
+ usbtmc = sdi->conn;
+ if (usbtmc && usbtmc->fd != -1) {
+ close(usbtmc->fd);
+ usbtmc->fd = -1;
sdi->status = SR_ST_INACTIVE;
}
static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
{
- struct sr_serial_dev_inst *serial;
+ struct sr_usbtmc_dev_inst *usbtmc;
struct dev_context *devc;
struct sr_probe *probe;
GSList *l;
if (sdi->status != SR_ST_ACTIVE)
return SR_ERR_DEV_CLOSED;
- serial = sdi->conn;
+ usbtmc = sdi->conn;
devc = sdi->priv;
if (devc->data_source == DATA_SOURCE_LIVE) {
if (!devc->enabled_analog_probes && !devc->enabled_digital_probes)
return SR_ERR;
- sr_source_add(serial->fd, G_IO_IN, 50, rigol_ds_receive, (void *)sdi);
+ sr_source_add(usbtmc->fd, G_IO_IN, 50, rigol_ds_receive, (void *)sdi);
/* Send header packet to the session bus. */
std_session_send_df_header(cb_data, LOG_PREFIX);
static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
{
struct dev_context *devc;
- struct sr_serial_dev_inst *serial;
+ struct sr_usbtmc_dev_inst *usbtmc;
(void)cb_data;
g_slist_free(devc->enabled_digital_probes);
devc->enabled_analog_probes = NULL;
devc->enabled_digital_probes = NULL;
- serial = sdi->conn;
- sr_source_remove(serial->fd);
+ usbtmc = sdi->conn;
+ sr_source_remove(usbtmc->fd);
return SR_OK;
}
}
/* Read the header of a data block */
-static int rigol_ds_read_header(struct sr_serial_dev_inst *serial)
+static int rigol_ds_read_header(struct sr_usbtmc_dev_inst *usbtmc)
{
char start[3], length[10];
int len, tmp;
/* Read the hashsign and length digit. */
- tmp = serial_read(serial, start, 2);
+ tmp = read(usbtmc->fd, start, 2);
start[2] = '\0';
if (tmp != 2)
{
len = atoi(start + 1);
/* Read the data length. */
- tmp = serial_read(serial, length, len);
+ tmp = read(usbtmc->fd, length, len);
length[len] = '\0';
if (tmp != len)
{
SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
{
struct sr_dev_inst *sdi;
- struct sr_serial_dev_inst *serial;
+ struct sr_usbtmc_dev_inst *usbtmc;
struct dev_context *devc;
struct sr_datafeed_packet packet;
struct sr_datafeed_analog analog;
if (!(devc = sdi->priv))
return TRUE;
- serial = sdi->conn;
+ usbtmc = sdi->conn;
if (revents == G_IO_IN) {
if (devc->model->protocol == PROTOCOL_IEEE488_2) {
sr_dbg("New block header expected");
if (rigol_ds_send(sdi, ":WAV:DATA?") != SR_OK)
return TRUE;
- len = rigol_ds_read_header(serial);
+ len = rigol_ds_read_header(usbtmc);
if (len == -1)
return TRUE;
/* At slow timebases in live capture the DS2072
if (devc->data_source == DATA_SOURCE_LIVE
&& (unsigned)len < devc->num_frame_bytes) {
sr_dbg("Discarding short data block");
- serial_read(serial, devc->buffer, len + 1);
+ read(usbtmc->fd, devc->buffer, len + 1);
return TRUE;
}
devc->num_block_bytes = len;
probe = devc->channel_frame;
if (devc->model->protocol == PROTOCOL_IEEE488_2) {
len = devc->num_block_bytes - devc->num_block_read;
- len = serial_read(serial, devc->buffer,
+ len = read(usbtmc->fd, devc->buffer,
len < ACQ_BUFFER_SIZE ? len : ACQ_BUFFER_SIZE);
} else {
waveform_size = probe->type == SR_PROBE_ANALOG ?
DS1000_ANALOG_LIVE_WAVEFORM_SIZE : DIGITAL_WAVEFORM_SIZE;
- len = serial_read(serial, devc->buffer, waveform_size - devc->num_frame_bytes);
+ len = read(usbtmc->fd, devc->buffer, waveform_size - devc->num_frame_bytes);
}
sr_dbg("Received %d bytes.", len);
if (len == -1)
sr_dbg("Block has been completed");
/* Discard the terminating linefeed and prepare for
possible next block */
- serial_read(serial, devc->buffer, 1);
+ read(usbtmc->fd, devc->buffer, 1);
devc->num_block_bytes = 0;
if (devc->data_source != DATA_SOURCE_LIVE)
rigol_ds_set_wait_event(devc, WAIT_BLOCK);
va_list args;
char buf[256];
int len, out, ret;
+ struct sr_usbtmc_dev_inst *usbtmc = sdi->conn;
va_start(args, format);
len = vsnprintf(buf, 255, format, args);
va_end(args);
strcat(buf, "\n");
len++;
- out = serial_write(sdi->conn, buf, len);
+ out = write(usbtmc->fd, buf, len);
buf[len - 1] = '\0';
if (out != len) {
sr_dbg("Only sent %d/%d bytes of '%s'.", out, len, buf);
{
int len;
struct dev_context *devc = sdi->priv;
+ struct sr_usbtmc_dev_inst *usbtmc = sdi->conn;
if (rigol_ds_send(sdi, cmd) != SR_OK)
return SR_ERR;
- if ((len = serial_read(sdi->conn, reply, maxlen - 1)) < 0)
+ if ((len = read(usbtmc->fd, reply, maxlen - 1)) < 0)
return SR_ERR;
reply[len] = '\0';
};
#endif
+struct sr_usbtmc_dev_inst {
+ char *device;
+ int fd;
+};
+
/* Private driver context. */
struct drv_context {
struct sr_context *sr_ctx;
SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial);
#endif
+/* USBTMC-specific instances */
+SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device);
+SR_PRIV void sr_usbtmc_dev_inst_free(struct sr_usbtmc_dev_inst *usbtmc);
/*--- hwdriver.c ------------------------------------------------------------*/
SR_INST_USB = 10000,
/** Device instance type for serial port devices. */
SR_INST_SERIAL,
+ /** Device instance type for USBTMC devices. */
+ SR_INST_USBTMC,
};
/** Device instance status. */
if (sdi->inst_type == SR_INST_USB)
sr_usb_dev_inst_free(sdi->conn);
#endif
+ if (sdi->inst_type == SR_INST_USBTMC)
+ sr_usbtmc_dev_inst_free(sdi->conn);
}
if (clear_private)
clear_private(sdi->priv);