]> sigrok.org Git - libsigrok.git/commitdiff
cem-dt-885x: Send last measurement at normal rate in hold mode
authorBert Vermeulen <redacted>
Wed, 12 Jun 2013 14:04:23 +0000 (16:04 +0200)
committerBert Vermeulen <redacted>
Wed, 12 Jun 2013 16:34:42 +0000 (18:34 +0200)
The device only sends the "hold" token otherwise, which clashes somewhat
with other devices. This makes the device more predictable for frontends.

hardware/cem-dt-885x/protocol.c
hardware/cem-dt-885x/protocol.h

index b727ada9c4f796c7087d02c1f0f7925cad59c1d3..c9d0c89e580ad07e3844247ceaf14e3bb829496c 100644 (file)
@@ -169,6 +169,7 @@ static void process_mset(const struct sr_dev_inst *sdi)
 static void process_byte(const struct sr_dev_inst *sdi, const unsigned char c)
 {
        struct dev_context *devc;
+       gint64 cur_time;
        int len;
 
        if (!(devc = sdi->priv))
@@ -178,14 +179,26 @@ static void process_byte(const struct sr_dev_inst *sdi, const unsigned char c)
                /* Device is in hold mode */
                devc->cur_mqflags |= SR_MQFLAG_HOLD;
 
-               /* TODO: send out the last measurement at the same
-                * rate as it normally gets sent */
+               if (devc->hold_last_sent == 0) {
+                       /* First hold notification. */
+                       devc->hold_last_sent = g_get_monotonic_time();
+                       /* When the device leaves hold mode, it starts from scratch. */
+                       devc->state = ST_INIT;
+               } else {
+                       cur_time = g_get_monotonic_time();
+                       if (cur_time - devc->hold_last_sent > HOLD_REPEAT_INTERVAL) {
+                               /* Force the last measurement out again. */
+                               devc->cmd = 0xa5;
+                               devc->token = TOKEN_MEAS_WAS_READOUT;
+                               process_mset(sdi);
+                               devc->hold_last_sent = cur_time;
+                       }
+               }
 
-               /* When the device leaves hold mode, it starts from scratch. */
-               devc->state = ST_INIT;
                return;
        }
        devc->cur_mqflags &= ~SR_MQFLAG_HOLD;
+       devc->hold_last_sent = 0;
 
        if (devc->state == ST_INIT) {
                if (c == 0xa5) {
index f3809fc27d37d53da25f20fb1f45375dc03d8d41..fa96d163fdfb0f21aa49395885c8b1e507df6287 100644 (file)
@@ -35,6 +35,9 @@
 #define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
 
 #define BUF_SIZE 32
+/* When in hold mode, force the last measurement out at this interval.
+ * We're using 50ms, which duplicates the non-hold 20Hz update rate. */
+#define HOLD_REPEAT_INTERVAL 50 * 1000
 
 enum {
        TOKEN_WEIGHT_TIME_FAST = 0x02,
@@ -80,6 +83,7 @@ struct dev_context {
        int buf_len;
        unsigned char buf[BUF_SIZE];
        float last_spl;
+       gint64 hold_last_sent;
 
 };