chiark / gitweb /
undo broken deletion
[trains.git] / parport / siggen.c
1 /**/
2
3 #include <assert.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <stdio.h>
7
8 #include <sys/ioctl.h>
9 #include <linux/ppdev.h>
10
11 #include "lib.h"
12
13 static void badusage(void) {
14   fprintf(stderr,
15           "usage: siggen [m<mult>] item...\n"
16           "items:\n"
17           "  k<value>   PPWCONTROL value\n"
18           "  t<value>   PPWDATA    value\n"
19           "  w<value>   usleep(value)\n"
20           "options:\n"
21           "  n<value>   do whole list n times\n"
22           "  m<value>   do every item m times\n");
23   exit(12);
24 }         
25
26 int main(int argc, const char *const *argv) {
27   int ii, io=0, m=1, n=-1, loops_count, loops_n, loops_incr;
28   unsigned long ul;
29   unsigned char v;
30   const char *a;
31
32   argc--;
33   argv++;
34   while (argc>=1 && (a=argv[0])) {
35     switch (a[0]) {
36     case 'm': m= number(a+1); break;
37     case 'n': n= number(a+1); break;
38     default: goto loop_break_options;
39     }
40     argc--;
41     argv++;
42   }
43 loop_break_options:
44   if (argc<1) badusage();
45
46   if (n==-1) {
47     loops_n= 1;
48     loops_incr= 0;
49   } else {
50     loops_n= n * argc * m;
51     loops_incr= 1;
52   }
53   for (ii=0, loops_count=0;
54        loops_count < loops_n;
55        ii++, ii%=(argc*m), loops_count += loops_incr) {
56     a= argv[ii/m];
57     switch (a[0]) {
58     case 'k': io= PPWCONTROL; break;
59     case 't': io= PPWDATA;    break;
60     case 'w': io= -1;         break;
61     default: badusage();
62     }
63     ul= number(a+1);
64     if (io==-1) {
65       usleep_gettod(ul);
66     } else {
67       v= ul;
68       doioctl(io, &v, v);
69     }
70   }
71   return 0;
72 }