]> rtime.felk.cvut.cz Git - can-usb1.git/blob - ulan/host/ul_drv/utils/ul_sendmsg.c
Initializing repo
[can-usb1.git] / ulan / host / ul_drv / utils / ul_sendmsg.c
1 /*******************************************************************
2   uLan Communication - simple test client
3
4   ul_spy.c      - message monitor
5
6   (C) Copyright 1996,1999 by Pavel Pisa 
7
8   The uLan driver is distributed under the Gnu General Public Licence. 
9   See file COPYING for details.
10  *******************************************************************/
11
12 #include <unistd.h>
13 #include <stdlib.h>
14 #include <fcntl.h>
15 #include <stdio.h>
16 #include <getopt.h>
17 #include <errno.h>
18 #include <string.h>
19 #include <sys/types.h>
20 #include <sys/time.h>
21 #include <sys/stat.h>
22 #include <ul_lib/ulan.h>
23
24 int si_long(char **ps,long *val,int base)
25 {
26   char *p;
27   *val=strtol(*ps,&p,base);
28   if(*ps==p) return -1;
29   *ps=p;
30   return 1;
31 }
32
33 int add_to_arr(void **pdata,int *plen,int base,char *str)
34 {
35   char *s=str;
36   long val;
37   void *p;
38   
39   do{
40     while(*s && strchr(", \t:;",*s)) s++;
41     if(!*s) break;
42     if(si_long(&s,&val,base)<0){
43       return -1;
44     }
45     if(*pdata==NULL){
46       *plen=0;
47       *pdata=p=malloc(1);
48     }else{
49       p=realloc(*pdata,*plen+1);
50       if(p==NULL) return -1;
51       *pdata=p;
52     }
53     ((uchar*)p)[*plen]=val;
54     (*plen)++;
55   } while(1);
56   return 1;
57 }
58
59 /*******************************************************************/
60
61 char *ul_dev_name = UL_DEV_NAME;
62 int msg_module = 0;
63 int msg_cmd    = 0;
64 uchar *msg_data= NULL;
65 int msg_len  = 0;
66 uchar msg_flg  = 0;
67 int prt_modules= 0;
68 int debugk     = 0;
69 int debugk_flg = 0;
70 int query_flg = 0;
71 int logk_flg = 0;
72
73 int print_modules(int max_addr)
74 { int ret;
75   int i;
76   ul_fd_t ul_fd;
77   uchar *p;
78   void *buf=NULL;
79   int buf_len;
80   int count=0; 
81   ul_fd=ul_open(ul_dev_name, NULL);
82   if(ul_fd==UL_FD_INVALID)
83     { perror("print_modules : uLan open failed");return -1;};
84   for(i=1;i<=max_addr;i++)
85   {
86     ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
87                         UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
88     if(ret>=0)
89     { count++;
90       p=(uchar*)buf;
91       for(ret=0;(ret<buf_len)&&*p;ret++,p++);
92       printf("%2d:  ",i);
93       fwrite(buf,ret,1,stdout);
94       printf("\n");
95     };
96     if(buf) free(buf);
97     buf=NULL;
98   };
99   ul_close(ul_fd);
100   return count;
101 };
102
103 int debug_kernel(int debug_msk)
104 { int ret;
105   ul_fd_t ul_fd;
106   ul_fd=ul_open(ul_dev_name, NULL);
107   if(ul_fd==UL_FD_INVALID)
108     { perror("debug_kernel : uLan open failed");return -1;};
109   ret=ul_drv_debflg(ul_fd,debug_msk);
110   ul_close(ul_fd);
111   return ret;
112 };
113
114 int log_kernel(void)
115 { int ret;
116   ul_fd_t ul_fd;
117   ul_fd=ul_open(ul_dev_name, NULL);
118   if(ul_fd==UL_FD_INVALID)
119     { perror("log_kernel : uLan open failed");return -1;};
120  #if defined(_WIN32) 
121   { DWORD bytes_ret;
122     ret=DeviceIoControl(ul_fd,UL_KLOGBLL,
123                   NULL,0,NULL,0,
124                   &bytes_ret,NULL)?0:-1;
125   }
126  #elif !defined(UL_DRV_IN_LIB)
127   ret=ioctl(ul_fd,UL_KLOGBLL,0);
128  #endif
129   ul_close(ul_fd);
130   return ret;
131 };
132
133 int send_message(void)
134 {
135   int ret;
136   ul_fd_t ul_fd;
137   int i;
138   uchar *bufout=NULL;
139   int lenout=0;
140
141   ul_fd=ul_open(ul_dev_name, NULL);
142   if(ul_fd==UL_FD_INVALID)
143     { perror("send_message : uLan open failed");return -1;};
144
145   if(!query_flg){
146     ret=ul_send_command_wait(ul_fd,msg_module,msg_cmd,msg_flg,
147                          msg_data,msg_len);
148     fprintf(stderr,"ul_send_command_wait ret %d\n",ret);
149   }else{
150     ret=ul_send_query_wait(ul_fd,msg_module,msg_cmd,msg_flg,
151                     msg_data,msg_len,(void**)&bufout,&lenout);
152     fprintf(stderr,"ul_send_query_wait ret %d\n",ret);
153     for(i=0;i<lenout;i++) printf("0x%02x ",bufout[i]);
154     printf("\n");
155   }
156                
157   if(bufout!=NULL) free(bufout);
158                     
159   ul_close(ul_fd);
160   return 0;
161 };
162
163 static void
164 usage(void)
165 {
166   printf("usage: ul_sendmsg <parameters> <hex_bytes>\n");
167   printf("  -d, --uldev  <name>      name of uLan device [/dev/ulan]\n");
168   printf("  -m, --module <num>       destination module address\n");
169   printf("  -c, --command <num>      command\n");
170   printf("  -f, --flags <num>        flags\n");
171   printf("  -q, --query              send query type message\n");
172   printf("  -p, --print  <max>       print modules to max address\n");
173   printf("      --debug-kernel <m>   flags to debug kernel\n");
174   printf("  -V, --version            show version\n");
175   printf("  -h, --help               this usage screen\n");
176 }
177
178 int main(int argc,char *argv[])
179 {
180   static struct option long_opts[] = {
181     { "uldev", 1, 0, 'd' },
182     { "module",1, 0, 'm' },
183     { "command",1,0, 'c' },
184     { "flags", 1, 0, 'f' },
185     { "query", 0, 0, 'q' },
186     { "print", 1, 0, 'p' },
187     { "version",0,0, 'V' },
188     { "help",  0, 0, 'h' },
189     { "debug-kernel", 1, 0, 'D' },
190     { "log-kernel", 0, 0, 'L' },
191     { 0, 0, 0, 0}
192   };
193   int opt;
194
195  #ifndef HAS_GETOPT_LONG
196   while ((opt = getopt(argc, argv, "d:m:c:f:qp:VhD:L")) != EOF)
197  #else
198   while ((opt = getopt_long(argc, argv, "d:m:c:f:qp:VhD:L",
199                             &long_opts[0], NULL)) != EOF)
200  #endif
201     switch (opt) {
202     case 'd':
203       ul_dev_name=optarg;
204       break;
205     case 'm':
206       msg_module = strtol(optarg,NULL,0);
207       break;
208     case 'c':
209       msg_cmd = strtol(optarg,NULL,0);
210       break;
211     case 'f':
212       msg_flg = strtol(optarg,NULL,0);
213       break;
214     case 'q':
215       query_flg=1;
216       break;
217     case 'p':
218       prt_modules = strtol(optarg,NULL,0);
219       break;
220     case 'D':
221       debugk = strtol(optarg,NULL,0);
222       debugk_flg=1;
223       break;
224     case 'L':
225       logk_flg=1;
226       break;
227     case 'V':
228       fputs("uLan send message v0.7\n", stdout);
229       exit(0);
230     case 'h':
231     default:
232       usage();
233       exit(opt == 'h' ? 0 : 1);
234     }
235
236   if(debugk_flg) debug_kernel(debugk);
237
238   if(logk_flg) log_kernel();
239
240   if(prt_modules) print_modules(prt_modules);
241
242   for(;optind<argc;optind++){
243     if(add_to_arr((void**)&msg_data,&msg_len,0,argv[optind])<0){
244       fprintf(stderr,"%s: incorrect message data \"%s\"\n",argv[0],argv[optind]);
245       exit(2);
246     }
247   }
248
249   send_message();
250
251   return 0;
252 }