]> sigrok.org Git - libsigrok.git/blobdiff - src/serial.c
output/ascii: style nits in name alignment and trigger flush
[libsigrok.git] / src / serial.c
index 7f9de4f686f1f08fb01d11276420ae5f09a9dd2e..fe39effc604f10119dcc822d4b0281557697115a 100644 (file)
@@ -122,10 +122,13 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
        if (ret != SR_OK)
                return ret;
 
-       if (serial->serialcomm)
-               return serial_set_paramstr(serial, serial->serialcomm);
-       else
-               return SR_OK;
+       if (serial->serialcomm) {
+               ret = serial_set_paramstr(serial, serial->serialcomm);
+               if (ret != SR_OK)
+                       return ret;
+       }
+
+       return serial_flush(serial);
 }
 
 /**
@@ -244,7 +247,9 @@ SR_PRIV int serial_drain(struct sr_serial_dev_inst *serial)
  * @retval SR_ERR_ARG Invalid parameters.
  * @retval SR_OK Successful registration.
  *
- * Callbacks get unregistered by specifying #NULL for the 'cb' parameter.
+ * Callbacks get unregistered by specifying NULL for the 'cb' parameter.
+ *
+ * @private
  */
 SR_PRIV int serial_set_read_chunk_cb(struct sr_serial_dev_inst *serial,
        serial_rx_chunk_callback cb, void *cb_data)
@@ -264,7 +269,7 @@ SR_PRIV int serial_set_read_chunk_cb(struct sr_serial_dev_inst *serial,
  *
  * @param[in] serial Previously opened serial port instance.
  *
- * @internal
+ * @private
  */
 SR_PRIV void sr_ser_discard_queued_data(struct sr_serial_dev_inst *serial)
 {
@@ -280,7 +285,7 @@ SR_PRIV void sr_ser_discard_queued_data(struct sr_serial_dev_inst *serial)
  *
  * @param[in] serial Previously opened serial port instance.
  *
- * @internal
+ * @private
  */
 SR_PRIV size_t sr_ser_has_queued_data(struct sr_serial_dev_inst *serial)
 {
@@ -298,7 +303,7 @@ SR_PRIV size_t sr_ser_has_queued_data(struct sr_serial_dev_inst *serial)
  * @param[in] data Pointer to data bytes to queue.
  * @param[in] len Number of data bytes to queue.
  *
- * @internal
+ * @private
  */
 SR_PRIV void sr_ser_queue_rx_data(struct sr_serial_dev_inst *serial,
        const uint8_t *data, size_t len)
@@ -320,7 +325,7 @@ SR_PRIV void sr_ser_queue_rx_data(struct sr_serial_dev_inst *serial,
  * @param[out] data Pointer to store retrieved data bytes into.
  * @param[in] len Number of data bytes to retrieve.
  *
- * @internal
+ * @private
  */
 SR_PRIV size_t sr_ser_unqueue_rx_data(struct sr_serial_dev_inst *serial,
        uint8_t *data, size_t len)
@@ -355,6 +360,8 @@ SR_PRIV size_t sr_ser_unqueue_rx_data(struct sr_serial_dev_inst *serial,
  *
  * Returns 0 if no receive data is available, or if the amount of
  * available receive data cannot get determined.
+ *
+ * @private
  */
 SR_PRIV size_t serial_has_receive_data(struct sr_serial_dev_inst *serial)
 {
@@ -570,7 +577,7 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
        const char *paramstr)
 {
 /** @cond PRIVATE */
-#define SERIAL_COMM_SPEC "^(\\d+)/([5678])([neo])([12])(.*)$"
+#define SERIAL_COMM_SPEC "^(\\d+)(/([5678])([neo])([12]))?(.*)$"
 /** @endcond */
 
        GRegex *reg;
@@ -578,7 +585,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
        int speed, databits, parity, stopbits, flow, rts, dtr, i;
        char *mstr, **opts, **kv;
 
-       speed = databits = parity = stopbits = flow = 0;
+       speed = flow = 0;
+       databits = 8;
+       parity = SP_PARITY_NONE;
+       stopbits = 1;
        rts = dtr = -1;
        sr_spew("Parsing parameters from \"%s\".", paramstr);
        reg = g_regex_new(SERIAL_COMM_SPEC, 0, 0, NULL);
@@ -586,10 +596,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
                if ((mstr = g_match_info_fetch(match, 1)))
                        speed = strtoul(mstr, NULL, 10);
                g_free(mstr);
-               if ((mstr = g_match_info_fetch(match, 2)))
+               if ((mstr = g_match_info_fetch(match, 3)) && mstr[0])
                        databits = strtoul(mstr, NULL, 10);
                g_free(mstr);
-               if ((mstr = g_match_info_fetch(match, 3))) {
+               if ((mstr = g_match_info_fetch(match, 4)) && mstr[0]) {
                        switch (mstr[0]) {
                        case 'n':
                                parity = SP_PARITY_NONE;
@@ -603,10 +613,10 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
                        }
                }
                g_free(mstr);
-               if ((mstr = g_match_info_fetch(match, 4)))
+               if ((mstr = g_match_info_fetch(match, 5)) && mstr[0])
                        stopbits = strtoul(mstr, NULL, 10);
                g_free(mstr);
-               if ((mstr = g_match_info_fetch(match, 5)) && mstr[0] != '\0') {
+               if ((mstr = g_match_info_fetch(match, 6)) && mstr[0] != '\0') {
                        if (mstr[0] != '/') {
                                sr_dbg("missing separator before extra options");
                                speed = 0;
@@ -654,6 +664,8 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
        }
        g_match_info_unref(match);
        g_regex_unref(reg);
+       sr_spew("Got params: rate %d, frame %d/%d/%d, flow %d, rts %d, dtr %d.",
+               speed, databits, parity, stopbits, flow, rts, dtr);
 
        if (speed) {
                return serial_set_params(serial, speed, databits, parity,