added minimum time between output option to BlinkenOutput
Stefan Schuermans

Stefan Schuermans commited on 2013-12-28 00:23:04
Showing 3 changed files, with 48 additions and 7 deletions.

... ...
@@ -196,6 +196,7 @@ static int serial_settings_set(int fd, int settings, int speed)
196 196
 // returns error code (not for device-errors, 0 for success)
197 197
 static int recv_and_out(SOCKET udpSocket, int dev_fd,
198 198
                         int *p_device_output_active,
199
+                        unsigned int min_interval_ms,
199 200
                         unsigned int format_change,
200 201
                         unsigned int format_height, unsigned int format_width,
201 202
                         unsigned int format_channels,
... ...
@@ -205,10 +206,12 @@ static int recv_and_out(SOCKET udpSocket, int dev_fd,
205 206
   fd_set readFds, errFds;
206 207
   stBlinkenFrame *pFrame;
207 208
   char buffer[65536];   // 64kB is more than maximum UDP size
208
-  int maxFd, len, dev_eof;
209
+  int maxFd, len, dev_eof, out_ok;
209 210
   struct timeval start, timeout, *p_timeout, end;
211
+  struct timeval out_last, out_now;
210 212
 
211 213
   dev_eof = 0;
214
+  gettimeofday(&out_last, NULL);
212 215
   for (;;) {
213 216
     // wait for next frame
214 217
     FD_ZERO(&readFds);
... ...
@@ -272,8 +275,19 @@ static int recv_and_out(SOCKET udpSocket, int dev_fd,
272 275
         // free frame
273 276
         BlinkenFrameFree(pFrame);
274 277
 
278
+        // check if minimum interval between output frames is met
279
+        gettimeofday(&out_now, NULL);
280
+        if (out_now.tv_sec > out_last.tv_sec - min_interval_ms / 1000)
281
+          out_ok = 1;
282
+        else if ((out_now.tv_sec - out_last.tv_sec) * 1000 +
283
+                 ((long)out_now.tv_usec - (long)out_last.tv_usec) / 1000 >
284
+                 min_interval_ms)
285
+          out_ok = 1;
286
+        else
287
+          out_ok = 0;
288
+
275 289
         // output data to device
276
-        if (dev_fd != -1 && len > 0) {
290
+        if (dev_fd != -1 && len > 0 && out_ok) {
277 291
           if (write(dev_fd, buffer, len) != len) {
278 292
             if (*p_device_output_active)
279 293
               printf("error writing to device\n");
... ...
@@ -283,6 +297,8 @@ static int recv_and_out(SOCKET udpSocket, int dev_fd,
283 297
           if (!*p_device_output_active)
284 298
             printf("restarted output to device...\n");
285 299
           *p_device_output_active = 1;
300
+          // remember last time of output
301
+          out_last = out_now;
286 302
         }
287 303
       }
288 304
     }
... ...
@@ -331,7 +347,9 @@ static int recv_and_out(SOCKET udpSocket, int dev_fd,
331 347
 static int open_and_output(SOCKET udpSocket, char *device,
332 348
                            int *p_device_output_active,
333 349
                            int serial_settings_change, int serial_settings,
334
-                           int serial_speed, unsigned int format_change,
350
+                           int serial_speed,
351
+                           unsigned int min_interval_ms,
352
+                           unsigned int format_change,
335 353
                            unsigned int format_height,
336 354
                            unsigned int format_width,
337 355
                            unsigned int format_channels,
... ...
@@ -360,6 +378,7 @@ static int open_and_output(SOCKET udpSocket, char *device,
360 378
   }
361 379
   // receive frames and output to device
362 380
   err = recv_and_out(udpSocket, dev_fd, p_device_output_active,
381
+                     min_interval_ms,
363 382
                      format_change, format_height, format_width,
364 383
                      format_channels, format_colors, proto, 0, 0);
365 384
 
... ...
@@ -376,6 +395,7 @@ static int open_and_output_loop(SOCKET udpSocket, char *device,
376 395
                                 int serial_settings, int serial_speed,
377 396
                                 int reopen_device,
378 397
                                 unsigned int reopen_device_ms,
398
+                                unsigned int min_interval_ms,
379 399
                                 unsigned int format_change,
380 400
                                 unsigned int format_height,
381 401
                                 unsigned int format_width,
... ...
@@ -394,7 +414,8 @@ static int open_and_output_loop(SOCKET udpSocket, char *device,
394 414
     err = open_and_output(udpSocket, device,
395 415
                           &device_output_active,
396 416
                           serial_settings_change, serial_settings,
397
-                          serial_speed, format_change, format_height,
417
+                          serial_speed, min_interval_ms,
418
+                          format_change, format_height,
398 419
                           format_width, format_channels, format_colors,
399 420
                           proto);
400 421
     if (err != 0 || !reopen_device)
... ...
@@ -407,6 +428,7 @@ static int open_and_output_loop(SOCKET udpSocket, char *device,
407 428
 
408 429
     // only fetch data from socket for a short time
409 430
     err = recv_and_out(udpSocket, -1, &device_output_active,
431
+                       min_interval_ms,
410 432
                        format_change, format_height, format_width,
411 433
                        format_channels, format_colors, proto, 1,
412 434
                        reopen_device_ms);
... ...
@@ -430,7 +452,8 @@ int main(int argCnt, char **args)
430 452
   etBlinkenProto proto;
431 453
   unsigned int format_change, format_height, format_width, format_channels,
432 454
       format_colors;
433
-  unsigned int height, width, channels, colors, reopen_device_ms;
455
+  unsigned int height, width, channels, colors;
456
+  unsigned int reopen_device_ms, min_interval_ms;
434 457
   int serial_settings_change, reopen_device;
435 458
   char txt[64];
436 459
   unsigned short port;
... ...
@@ -466,6 +489,8 @@ int main(int argCnt, char **args)
466 489
            "     settings to use for serial devices (defaults to no change)\n"
467 490
            "  -o <milliseconds>\n"
468 491
            "     reopen device after short time on error (defaults to not reopen)\n"
492
+           "  -i <milliseconds>\n"
493
+           "     minimum interval between two frames on output (defaults to 0)\n"
469 494
            "\n", args[0]);
470 495
     return 0;
471 496
   }
... ...
@@ -489,6 +514,7 @@ int main(int argCnt, char **args)
489 514
   serial_speed = 0;
490 515
   serial_settings_change = 0;
491 516
   reopen_device = 0;
517
+  min_interval_ms = 0;
492 518
   for (i = 1; i < argCnt; i++) {
493 519
 
494 520
     // local address
... ...
@@ -601,6 +627,17 @@ int main(int argCnt, char **args)
601 627
       } else
602 628
         printf("missing time for \"-o\"\n");
603 629
     }
630
+    // minimum interval between two frame on output
631
+    else if (strcmp(args[i], "-i") == 0) {
632
+      if (i + 1 < argCnt) {
633
+        i++;
634
+        if (sscanf(args[i], "%u", &min_interval_ms) != 1) {
635
+          min_interval_ms = 0;
636
+          printf("invalid number of milliseconds \"%s\"\n", args[i]);
637
+        }
638
+      } else
639
+        printf("missing time for \"-i\"\n");
640
+    }
604 641
     // unknown parameter
605 642
     else
606 643
       printf
... ...
@@ -627,7 +664,7 @@ int main(int argCnt, char **args)
627 664
   // open device and output frames in a loop
628 665
   open_and_output_loop(udpSocket, device,
629 666
                        serial_settings_change, serial_settings, serial_speed,
630
-                       reopen_device, reopen_device_ms,
667
+                       reopen_device, reopen_device_ms, min_interval_ms,
631 668
                        format_change, format_height, format_width,
632 669
                        format_channels, format_colors, proto);
633 670
 
... ...
@@ -1,3 +1,7 @@
1
+0.7.2 2013-12-27
2
+----------------
3
+added minimum time between output option to BlinkenOutput
4
+
1 5
 0.7.1 2011-11-19
2 6
 ----------------
3 7
 added missing status output for BlinkenConv -C
... ...
@@ -1,5 +1,5 @@
1 1
 # BlinkenLib
2
-# Copyright 2004-2011 Stefan Schuermans <stefan@blinkenarea.org>
2
+# Copyright 2004-2013 Stefan Schuermans <stefan@blinkenarea.org>
3 3
 # Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
4 4
 # a blinkenarea.org project
5 5
 
6 6