]> sigrok.org Git - libsigrok.git/blobdiff - src/std.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / std.c
index cd3bdd0b33de3f4ec296d1e84e7ca18d8bafa3be..959d0005680c5d2ebad6abb1637ca28a9221f035 100644 (file)
--- a/src/std.c
+++ b/src/std.c
@@ -21,8 +21,6 @@
  * @file
  *
  * Standard API helper functions.
- *
- * @internal
  */
 
 /* Needed for gettimeofday(), at least on FreeBSD. */
@@ -197,19 +195,7 @@ SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi)
        return SR_OK;
 }
 
-/**
- * Standard API helper for sending an SR_DF_END packet.
- *
- * This function can be used to simplify most drivers'
- * dev_acquisition_stop() API callback.
- *
- * @param[in] sdi The device instance to use. Must not be NULL.
- *
- * @retval SR_OK Success.
- * @retval SR_ERR_ARG Invalid argument.
- * @retval other Other error.
- */
-SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi)
+static int send_df_without_payload(const struct sr_dev_inst *sdi, uint16_t packet_type)
 {
        const char *prefix;
        int ret;
@@ -222,11 +208,11 @@ SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi)
 
        prefix = (sdi->driver) ? sdi->driver->name : "unknown";
 
-       packet.type = SR_DF_END;
+       packet.type = packet_type;
        packet.payload = NULL;
 
        if ((ret = sr_session_send(sdi, &packet)) < 0) {
-               sr_err("%s: Failed to send SR_DF_END packet: %d.", prefix, ret);
+               sr_err("%s: Failed to send packet of type %d: %d.", prefix, packet_type, ret);
                return ret;
        }
 
@@ -234,10 +220,10 @@ SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi)
 }
 
 /**
- * Standard API helper for sending an SR_DF_FRAME_BEGIN packet.
+ * Standard API helper for sending an SR_DF_END packet.
  *
  * This function can be used to simplify most drivers'
- * frame handling.
+ * dev_acquisition_stop() API callback.
  *
  * @param[in] sdi The device instance to use. Must not be NULL.
  *
@@ -245,35 +231,47 @@ SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi)
  * @retval SR_ERR_ARG Invalid argument.
  * @retval other Other error.
  */
-SR_PRIV int std_session_send_frame_begin(const struct sr_dev_inst *sdi)
+SR_PRIV int std_session_send_df_end(const struct sr_dev_inst *sdi)
 {
-       const char *prefix;
-       int ret;
-       struct sr_datafeed_packet packet;
-
-       if (!sdi) {
-               sr_err("%s: Invalid argument.", __func__);
-               return SR_ERR_ARG;
-       }
-
-       prefix = (sdi->driver) ? sdi->driver->name : "unknown";
-
-       packet.type = SR_DF_FRAME_BEGIN;
-       packet.payload = NULL;
+       return send_df_without_payload(sdi, SR_DF_END);
+}
 
-       if ((ret = sr_session_send(sdi, &packet)) < 0) {
-               sr_err("%s: Failed to send SR_DF_FRAME_BEGIN packet: %d.", prefix, ret);
-               return ret;
-       }
+/**
+ * Standard API helper for sending an SR_DF_TRIGGER packet.
+ *
+ * This function can be used to simplify most drivers' trigger handling.
+ *
+ * @param[in] sdi The device instance to use. Must not be NULL.
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR_ARG Invalid argument.
+ * @retval other Other error.
+ */
+SR_PRIV int std_session_send_df_trigger(const struct sr_dev_inst *sdi)
+{
+       return send_df_without_payload(sdi, SR_DF_TRIGGER);
+}
 
-       return SR_OK;
+/**
+ * Standard API helper for sending an SR_DF_FRAME_BEGIN packet.
+ *
+ * This function can be used to simplify most drivers' frame handling.
+ *
+ * @param[in] sdi The device instance to use. Must not be NULL.
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR_ARG Invalid argument.
+ * @retval other Other error.
+ */
+SR_PRIV int std_session_send_df_frame_begin(const struct sr_dev_inst *sdi)
+{
+       return send_df_without_payload(sdi, SR_DF_FRAME_BEGIN);
 }
 
 /**
  * Standard API helper for sending an SR_DF_FRAME_END packet.
  *
- * This function can be used to simplify most drivers'
- * frame handling.
+ * This function can be used to simplify most drivers' frame handling.
  *
  * @param[in] sdi The device instance to use. Must not be NULL.
  *
@@ -281,28 +279,9 @@ SR_PRIV int std_session_send_frame_begin(const struct sr_dev_inst *sdi)
  * @retval SR_ERR_ARG Invalid argument.
  * @retval other Other error.
  */
-SR_PRIV int std_session_send_frame_end(const struct sr_dev_inst *sdi)
+SR_PRIV int std_session_send_df_frame_end(const struct sr_dev_inst *sdi)
 {
-       const char *prefix;
-       int ret;
-       struct sr_datafeed_packet packet;
-
-       if (!sdi) {
-               sr_err("%s: Invalid argument.", __func__);
-               return SR_ERR_ARG;
-       }
-
-       prefix = (sdi->driver) ? sdi->driver->name : "unknown";
-
-       packet.type = SR_DF_FRAME_END;
-       packet.payload = NULL;
-
-       if ((ret = sr_session_send(sdi, &packet)) < 0) {
-               sr_err("%s: Failed to send SR_DF_FRAME_END packet: %d.", prefix, ret);
-               return ret;
-       }
-
-       return SR_OK;
+       return send_df_without_payload(sdi, SR_DF_FRAME_END);
 }
 
 #ifdef HAVE_SERIAL_COMM
@@ -392,11 +371,6 @@ SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi)
                return ret;
        }
 
-       if ((ret = sr_dev_close(sdi)) < 0) {
-               sr_err("%s: Failed to close device: %d.", prefix, ret);
-               return ret;
-       }
-
        return std_session_send_df_end(sdi);
 }
 
@@ -450,7 +424,7 @@ SR_PRIV int std_dev_clear_with_callback(const struct sr_dev_driver *driver,
                        ret = SR_ERR_BUG;
                        continue;
                }
-               if (driver->dev_close)
+               if (driver->dev_close && sdi->status == SR_ST_ACTIVE)
                        driver->dev_close(sdi);
 
                if (sdi->conn) {
@@ -624,14 +598,15 @@ SR_PRIV GVariant *std_gvar_tuple_array(const uint64_t a[][2], unsigned int n)
        GVariant *rational[2];
        GVariantBuilder gvb;
 
-       g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
+       g_variant_builder_init(&gvb, G_VARIANT_TYPE_TUPLE);
 
        for (i = 0; i < n; i++) {
                rational[0] = g_variant_new_uint64(a[i][0]);
                rational[1] = g_variant_new_uint64(a[i][1]);
 
                /* FIXME: Valgrind reports a memory leak here. */
-               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational, 2));
+               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational,
+                       ARRAY_SIZE(rational)));
        }
 
        return g_variant_builder_end(&gvb);
@@ -643,14 +618,15 @@ SR_PRIV GVariant *std_gvar_tuple_rational(const struct sr_rational *r, unsigned
        GVariant *rational[2];
        GVariantBuilder gvb;
 
-       g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
+       g_variant_builder_init(&gvb, G_VARIANT_TYPE_TUPLE);
 
        for (i = 0; i < n; i++) {
                rational[0] = g_variant_new_uint64(r[i].p);
                rational[1] = g_variant_new_uint64(r[i].q);
 
                /* FIXME: Valgrind reports a memory leak here. */
-               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational, 2));
+               g_variant_builder_add_value(&gvb, g_variant_new_tuple(rational,
+                       ARRAY_SIZE(rational)));
        }
 
        return g_variant_builder_end(&gvb);
@@ -713,17 +689,17 @@ SR_PRIV GVariant *std_gvar_min_max_step_thresholds(const double min, const doubl
 
        g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
 
-       for (d = min; d <= max; d += step) {
+       for (d = min; d <= max + step / 2.0; d += step) {
                /*
                 * We will never see exactly 0.0 because of the error we're
                 * accumulating, so catch the "zero" value and force it to be 0.
                 */
-               v = ((d > (-step / 2)) && (d < (step / 2))) ? 0 : d;
+               v = ((d > (-step / 2.0)) && (d < (step / 2.0))) ? 0 : d;
 
                range[0] = g_variant_new_double(v);
                range[1] = g_variant_new_double(v);
 
-               gvar = g_variant_new_tuple(range, 2);
+               gvar = g_variant_new_tuple(range, ARRAY_SIZE(range));
                g_variant_builder_add_value(&gvb, gvar);
        }
 
@@ -737,7 +713,7 @@ SR_PRIV GVariant *std_gvar_tuple_u64(uint64_t low, uint64_t high)
        range[0] = g_variant_new_uint64(low);
        range[1] = g_variant_new_uint64(high);
 
-       return g_variant_new_tuple(range, 2);
+       return g_variant_new_tuple(range, ARRAY_SIZE(range));
 }
 
 SR_PRIV GVariant *std_gvar_tuple_double(double low, double high)
@@ -747,7 +723,7 @@ SR_PRIV GVariant *std_gvar_tuple_double(double low, double high)
        range[0] = g_variant_new_double(low);
        range[1] = g_variant_new_double(high);
 
-       return g_variant_new_tuple(range, 2);
+       return g_variant_new_tuple(range, ARRAY_SIZE(range));
 }
 
 SR_PRIV GVariant *std_gvar_array_i32(const int32_t a[], unsigned int n)
@@ -796,7 +772,7 @@ SR_PRIV GVariant *std_gvar_thresholds(const double a[][2], unsigned int n)
        for (i = 0; i < n; i++) {
                range[0] = g_variant_new_double(a[i][0]);
                range[1] = g_variant_new_double(a[i][1]);
-               gvar = g_variant_new_tuple(range, 2);
+               gvar = g_variant_new_tuple(range, ARRAY_SIZE(range));
                g_variant_builder_add_value(&gvb, gvar);
        }
 
@@ -954,3 +930,12 @@ SR_PRIV int std_dummy_set_params(struct sr_serial_dev_inst *serial,
        return SR_OK;
 }
 
+SR_PRIV int std_dummy_set_handshake(struct sr_serial_dev_inst *serial,
+       int rts, int dtr)
+{
+       (void)serial;
+       (void)rts;
+       (void)dtr;
+
+       return SR_OK;
+}