]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/hung-chang-dso-2100/protocol.c
Use std_session_send_df_frame_begin()/_end() where possible.
[libsigrok.git] / src / hardware / hung-chang-dso-2100 / protocol.c
index 47fe8f0e7280505ce29792e2a408927d1581aeb7..92d52c35e9a26d11401f330847f6310eb7bacd95 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #include <config.h>
+#include <math.h>
 #include <ieee1284.h>
 #include "protocol.h"
 
  *             trigger on (rising or falling)
  *             The next state is 0x0C
  *  0x0C       Same as state 0x0F but expects the calibration
- *             value for the first channel's  position
+ *             value for the first channel's position
  *             (POS1 in the schematics)
  *             The next state is 0x0D
  *  0x0D       Same as state 0x0F but expects the calibration
- *             value for the second channel's  position
+ *             value for the second channel's position
  *             (POS2 in the schematics)
  *             The next state is 0x0E
  *  0x0E       Same as state 0x0F but expects the trigger level
@@ -331,14 +332,10 @@ static void push_samples(const struct sr_dev_inst *sdi, uint8_t *buf, size_t num
 {
        struct dev_context *devc = sdi->priv;
        float *data = devc->samples;
-       struct sr_datafeed_analog analog = {
-               .channels = devc->enabled_channel,
-               .num_samples = num,
-               .mq = SR_MQ_VOLTAGE,
-               .unit = SR_UNIT_VOLT,
-               .mqflags = 0,
-               .data = data,
-       };
+       struct sr_datafeed_analog analog;
+       struct sr_analog_encoding encoding;
+       struct sr_analog_meaning meaning;
+       struct sr_analog_spec spec;
        struct sr_datafeed_packet packet = {
                .type = SR_DF_ANALOG,
                .payload = &analog,
@@ -348,7 +345,18 @@ static void push_samples(const struct sr_dev_inst *sdi, uint8_t *buf, size_t num
        while (num--)
                data[num] = (buf[num] - 0x80) * factor;
 
-       sr_session_send(devc->cb_data, &packet);
+       float vdivlog = log10f(factor);
+       int digits = -(int)vdivlog + (vdivlog < 0.0);
+
+       sr_analog_init(&analog, &encoding, &meaning, &spec, digits);
+       analog.meaning->channels = devc->enabled_channel;
+       analog.meaning->mq = SR_MQ_VOLTAGE;
+       analog.meaning->unit = SR_UNIT_VOLT;
+       analog.meaning->mqflags = 0;
+       analog.num_samples = num;
+       analog.data = data;
+
+       sr_session_send(sdi, &packet);
 }
 
 static int read_subframe(const struct sr_dev_inst *sdi, uint8_t *buf)
@@ -388,12 +396,8 @@ static int read_subframe(const struct sr_dev_inst *sdi, uint8_t *buf)
                        if (interleave)
                                num *= 2;
                        if (!devc->step) {
-                               struct sr_datafeed_packet packet = {
-                                       .type = SR_DF_TRIGGER
-                               };
-
                                push_samples(sdi, buf, 6);
-                               sr_session_send(devc->cb_data, &packet);
+                               std_session_send_df_trigger(sdi);
                                buf += 6;
                                num -= 6;
                        }
@@ -411,8 +415,7 @@ static int read_subframe(const struct sr_dev_inst *sdi, uint8_t *buf)
 
 SR_PRIV int hung_chang_dso_2100_poll(int fd, int revents, void *cb_data)
 {
-       struct sr_datafeed_packet packet = { .type = SR_DF_FRAME_BEGIN };
-       const struct sr_dev_inst *sdi;
+       struct sr_dev_inst *sdi;
        struct dev_context *devc;
        uint8_t state, buf[1000];
 
@@ -439,7 +442,7 @@ SR_PRIV int hung_chang_dso_2100_poll(int fd, int revents, void *cb_data)
                return FALSE;
        }
 
-       sr_session_send(devc->cb_data, &packet);
+       std_session_send_df_frame_begin(sdi);
 
        if (devc->channel) {
                while (read_subframe(sdi, buf)) {
@@ -452,11 +455,10 @@ SR_PRIV int hung_chang_dso_2100_poll(int fd, int revents, void *cb_data)
                }
        }
 
-       packet.type = SR_DF_FRAME_END;
-       sr_session_send(devc->cb_data, &packet);
+       std_session_send_df_frame_end(sdi);
 
        if (++devc->frame >= devc->frame_limit)
-               hung_chang_dso_2100_dev_acquisition_stop(sdi, devc->cb_data);
+               sr_dev_acquisition_stop(sdi);
        else
                hung_chang_dso_2100_move_to(sdi, 0x21);