X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fcommon%2Fscpi_serial.c;h=9711c010a80fb9f5c92cfe60af7710d5e8760684;hb=c1bcb8cc633cc69ce4a872f59ec2b686bc00bd04;hp=0ee5894742629833e20fbe4526afa53460cb6b41;hpb=05c644ea081f5973fcbb2429318b808b931edfe3;p=libsigrok.git diff --git a/hardware/common/scpi_serial.c b/hardware/common/scpi_serial.c index 0ee58947..9711c010 100644 --- a/hardware/common/scpi_serial.c +++ b/hardware/common/scpi_serial.c @@ -34,7 +34,20 @@ struct scpi_serial { char last_character; }; -SR_PRIV int scpi_serial_open(void *priv) +static int scpi_serial_dev_inst_new(void *priv, const char *resource, + char **params, const char *serialcomm) +{ + struct scpi_serial *sscpi = priv; + + (void)params; + + if (!(sscpi->serial = sr_serial_dev_inst_new(resource, serialcomm))) + return SR_ERR; + + return SR_OK; +} + +static int scpi_serial_open(void *priv) { struct scpi_serial *sscpi = priv; struct sr_serial_dev_inst *serial = sscpi->serial; @@ -48,7 +61,7 @@ SR_PRIV int scpi_serial_open(void *priv) return SR_OK; } -SR_PRIV int scpi_serial_source_add(void *priv, int events, int timeout, +static int scpi_serial_source_add(void *priv, int events, int timeout, sr_receive_data_callback_t cb, void *cb_data) { struct scpi_serial *sscpi = priv; @@ -57,7 +70,7 @@ SR_PRIV int scpi_serial_source_add(void *priv, int events, int timeout, return serial_source_add(serial, events, timeout, cb, cb_data); } -SR_PRIV int scpi_serial_source_remove(void *priv) +static int scpi_serial_source_remove(void *priv) { struct scpi_serial *sscpi = priv; struct sr_serial_dev_inst *serial = sscpi->serial; @@ -65,7 +78,7 @@ SR_PRIV int scpi_serial_source_remove(void *priv) return serial_source_remove(serial); } -SR_PRIV int scpi_serial_send(void *priv, const char *command) +static int scpi_serial_send(void *priv, const char *command) { int len, result, written; gchar *terminated_command; @@ -92,61 +105,7 @@ SR_PRIV int scpi_serial_send(void *priv, const char *command) return SR_OK; } -SR_PRIV int scpi_serial_receive(void *priv, char **scpi_response) -{ - int len, ret; - char buf[256]; - unsigned int i; - GString *response; - struct scpi_serial *sscpi = priv; - struct sr_serial_dev_inst *serial = sscpi->serial; - - response = g_string_sized_new(1024); - - for (i = 0; i <= SCPI_READ_RETRIES; i++) { - while ((len = serial_read(serial, buf, sizeof(buf))) > 0) - response = g_string_append_len(response, buf, len); - - if (response->len > 0 && - response->str[response->len-1] == '\n') { - sr_spew("Fetched full SCPI response."); - break; - } - - g_usleep(SCPI_READ_RETRY_TIMEOUT); - } - - if (response->len == 0) { - sr_dbg("No SCPI response received."); - g_string_free(response, TRUE); - *scpi_response = NULL; - return SR_ERR; - } else if (response->str[response->len - 1] == '\n') { - /* - * The SCPI response contains a LF ('\n') at the end and we - * don't need this so replace it with a '\0' and decrement - * the length. - */ - response->str[--response->len] = '\0'; - ret = SR_OK; - } else { - sr_warn("Incomplete SCPI response received!"); - ret = SR_ERR; - } - - /* Minor optimization: steal the string instead of copying. */ - *scpi_response = response->str; - - /* A SCPI response can be quite large, print at most 50 characters. */ - sr_dbg("SCPI response received (length %d): '%.50s'", - response->len, response->str); - - g_string_free(response, FALSE); - - return ret; -} - -SR_PRIV int scpi_serial_read_begin(void *priv) +static int scpi_serial_read_begin(void *priv) { struct scpi_serial *sscpi = priv; @@ -155,7 +114,7 @@ SR_PRIV int scpi_serial_read_begin(void *priv) return SR_OK; } -SR_PRIV int scpi_serial_read_data(void *priv, char *buf, int maxlen) +static int scpi_serial_read_data(void *priv, char *buf, int maxlen) { struct scpi_serial *sscpi = priv; int ret; @@ -174,7 +133,7 @@ SR_PRIV int scpi_serial_read_data(void *priv, char *buf, int maxlen) return ret; } -SR_PRIV int scpi_serial_read_complete(void *priv) +static int scpi_serial_read_complete(void *priv) { struct scpi_serial *sscpi = priv; @@ -184,46 +143,29 @@ SR_PRIV int scpi_serial_read_complete(void *priv) static int scpi_serial_close(void *priv) { struct scpi_serial *sscpi = priv; - struct sr_serial_dev_inst *serial = sscpi->serial; - return serial_close(serial); + return serial_close(sscpi->serial); } static void scpi_serial_free(void *priv) { struct scpi_serial *sscpi = priv; - struct sr_serial_dev_inst *serial = sscpi->serial; - sr_serial_dev_inst_free(serial); - g_free(sscpi); + sr_serial_dev_inst_free(sscpi->serial); } -SR_PRIV struct sr_scpi_dev_inst *scpi_serial_dev_inst_new(const char *port, - const char *serialcomm) -{ - struct sr_scpi_dev_inst *scpi; - struct scpi_serial *sscpi; - struct sr_serial_dev_inst *serial; - - if (!(serial = sr_serial_dev_inst_new(port, serialcomm))) - return NULL; - - sscpi = g_malloc(sizeof(struct scpi_serial)); - - sscpi->serial = serial; - - scpi = g_malloc(sizeof(struct sr_scpi_dev_inst)); - - scpi->open = scpi_serial_open; - scpi->source_add = scpi_serial_source_add; - scpi->source_remove = scpi_serial_source_remove; - scpi->send = scpi_serial_send; - scpi->read_begin = scpi_serial_read_begin; - scpi->read_data = scpi_serial_read_data; - scpi->read_complete = scpi_serial_read_complete; - scpi->close = scpi_serial_close; - scpi->free = scpi_serial_free; - scpi->priv = sscpi; - - return scpi; -} +SR_PRIV const struct sr_scpi_dev_inst scpi_serial_dev = { + .name = "serial", + .prefix = "", + .priv_size = sizeof(struct scpi_serial), + .dev_inst_new = scpi_serial_dev_inst_new, + .open = scpi_serial_open, + .source_add = scpi_serial_source_add, + .source_remove = scpi_serial_source_remove, + .send = scpi_serial_send, + .read_begin = scpi_serial_read_begin, + .read_data = scpi_serial_read_data, + .read_complete = scpi_serial_read_complete, + .close = scpi_serial_close, + .free = scpi_serial_free, +};