1 /*******************************************************************
2 uLan Communication - simple test client
4 ul_lcscan.c - procceed wavelength scanning with LCD5000
6 (C) Copyright 1996,1999 by Pavel Pisa
8 The uLan driver is distributed under the Gnu General Public Licence.
9 See file COPYING for details.
10 *******************************************************************/
18 #include <sys/types.h>
24 #include <ul_lib/ulan.h>
30 /*******************************************************************/
32 char *ul_dev_name = UL_DEV_NAME;
50 char *oi_var_aoid=NULL;
51 char *oi_var_val=NULL;
53 int oi_var_oiddes_print(int oid, uchar *despack)
55 char *desname=uloi_oiddespack_strdup(despack,0);
56 char *destype=uloi_oiddespack_strdup(despack,1);
59 printf(" %5d deslen=%d name=\"%s\" type=\"%s\"\n",
60 oid,despack[0],desname?desname:"",destype?destype:"");
65 if(desname) free(desname);
66 if(destype) free(destype);
70 int oi_var_test(char *aoid, char *valin, char **valout, char *type)
77 uloi_coninfo_t *coninfo;
79 coninfo=uloi_open(ul_dev_name,module,0x10,0,10);
80 if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};
82 if((aoid!=NULL)&&(*aoid))
85 { oid=strtol(aoid,NULL,0);
88 { ret=uloi_get_aoiddes(coninfo,oi_var_rd?ULOI_DOIO:ULOI_DOII,aoid,NULL);
90 { fprintf(stderr,"oi_var_test : uloi_get_aoiddes returned %d\n",ret);
96 if(valout==NULL&&!oi_var_rd)
98 { val=strtol(valin,NULL,0);
101 ret=uloi_set_var(coninfo,oid,&val,vallen);
102 if(ret<0) { fprintf(stderr,"oi_var_test : uloi_set_var failed\n");return -1;};
105 { ret=uloi_get_var(coninfo,oid,&val,vallen);
106 if(ret<0) {fprintf(stderr,"oi_var_test : uloi_get_var failed\n");return -1;};
107 if(val&0x8000) val|=~0xffff; else val&=0xffff;
108 printf("%s=%d\n",aoid,val);
113 ret=uloi_get_oids(coninfo,ULOI_QOII,&oids);
115 { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
118 printf("module recognized commands and set vars:\n");
120 { uchar *despack=NULL;
121 if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],&despack)>=0){
122 oi_var_oiddes_print(oids[i],despack);
126 printf(" %5d no reply\n",oids[i]);
130 ret=uloi_get_oids(coninfo,ULOI_QOIO,&oids);
132 { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret);
135 printf("module recognized get vars:\n");
137 { uchar *despack=NULL;
138 if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],&despack)>=0){
139 oi_var_oiddes_print(oids[i],despack);
143 printf(" %5d no reply\n",oids[i]);
154 int print_modules(int max_addr)
162 ul_fd=ul_open(ul_dev_name, NULL);
163 if(ul_fd==UL_FD_INVALID)
164 { perror("print_modules : uLan open failed");return -1;};
165 for(i=1;i<=max_addr;i++)
167 ret=ul_send_query_wait(ul_fd,i,UL_CMD_SID,
168 UL_BFL_NORE|UL_BFL_PRQ,NULL,0,&buf,&buf_len);
172 for(ret=0;(ret<buf_len)&&*p;ret++,p++);
174 fwrite(buf,ret,1,stdout);
184 int debug_kernel(int debug_msk)
187 ul_fd=ul_open(ul_dev_name, NULL);
188 if(ul_fd==UL_FD_INVALID) { perror("send_cmd_go : uLan open failed");return -1;};
189 ret=ul_drv_debflg(ul_fd,debug_msk);
194 float IEEE4tofloat(void *p)
199 mantisa=up[0]|((unsigned)up[1]<<8)|
200 ((unsigned long)up[2]<<16)|0x800000;
201 if(up[3]&0x80) mantisa=-mantisa;
202 exponent=(up[2]>>7)|(((int)up[3]&0x7f)<<1);
203 return ldexp((float)mantisa,exponent-0x7f-23);
206 uchar test_cmd[]={0,0,0,204,0,234,0,20,0,204,0,0,0};
208 int wl_set_wlen(uloi_coninfo_t *coninfo,unsigned wlen)
211 ret=uloi_set_var_u2(coninfo,204,wlen);
212 if(ret<0) return ret;
215 ret=uloi_get_var_u2(coninfo,204,&u);
216 if(ret<0) return ret;
217 if(u==0x8000) continue;
218 if(u&0x8000) return -1;
219 if(u!=wlen) return -1;
229 uloi_coninfo_t *coninfo;
231 struct timeval timeout;
236 coninfo=uloi_open(ul_dev_name,module,0x10,0,10);
237 if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;};
240 { uloi_set_var_u2(coninfo,208,time_co);
244 { uloi_set_var_u2(coninfo,209,adc_chan);
248 { uloi_set_var_u2(coninfo,207,lampctrl);
252 if(!wl_step) wl_end=wlen;
253 if(((wl_begin<=wl_end)&&(wl_step>=0))
254 ||((wl_begin>=wl_end)&&(wl_step<0))) while(1)
255 { ret=wl_set_wlen(coninfo,wlen);
256 fprintf(stderr,"ul_set_wlen returned %d\n",ret);
257 sleep(wl_pause/1000);
259 { ret=uloi_send_cmd(coninfo,255);
260 fprintf(stderr,"uloi_send_cmd returned %d\n",ret);
263 ret=uloi_get_var(coninfo,220,buf,4);
264 fprintf(stderr,"uloi_get_var returned %d\n",ret);
265 printf("%d %f\n",wlen,IEEE4tofloat(buf));
267 if((wlen==wl_end)||!wl_step) break;
269 if(((wl_step>0)&&(wlen>wl_end))
270 ||((wl_step<0)&&(wlen<wl_end))) wlen=wl_end;
276 ul_fd=ul_open(ul_dev_name, NULL);
277 if(ul_fd==UL_FD_INVALID) { perror("wl_scan : uLan open failed");return -1;};
278 memset(&msginfo,0,sizeof(msginfo));
280 msginfo.cmd=UL_CMD_LCDABS;
281 ret=ul_addfilt(ul_fd,&msginfo);
282 if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};
283 msginfo.cmd=UL_CMD_LCDMRK;
284 ret=ul_addfilt(ul_fd,&msginfo);
285 if(ret<0) { printf("wl_scan : add filter failed\n");return ret;};
289 #ifndef WITHOUT_SYS_SELECT
291 FD_SET (ul_fd2sys_fd(ul_fd), &set);
295 while ((ret=select(FD_SETSIZE,&set, NULL, NULL,&timeout))==-1
298 {printf("\nwl_scan : break by user\n");break;};
299 if(ret<0) return ret;
301 #else /* WITHOUT_SYS_SELECT */
302 while (ul_fd_wait(ul_fd,1)<=0);
303 #endif /* WITHOUT_SYS_SELECT */
304 ret=ul_acceptmsg(ul_fd,&msginfo);
306 { printf("wl_scan : problem to accept message\n");
309 if(msginfo.flg&UL_BFL_FAIL)
310 {ul_freemsg(ul_fd);continue;};
311 if(msginfo.cmd==UL_CMD_LCDABS)
312 { while((ret=ul_read(ul_fd,buf,4))==4)
314 abs=IEEE4tofloat(buf);
315 printf("%9.6f\n",abs);
318 if(msginfo.cmd==UL_CMD_LCDMRK)
320 memset(buf,0,sizeof(buf));
321 ul_read(ul_fd,buf,4);
322 printf("MARK %d %d\n",buf[0],buf[1]);
334 printf("usage: ul_lcabsp <parameters> <hex_file>\n");
335 printf(" -d, --uldev <name> name of uLan device [/dev/ulan]\n");
336 printf(" -m, --module <num> messages from/to module\n");
337 printf(" -p, --print <max> print modules to max address\n");
338 printf(" --debug-kernel <m> flags to debug kernel\n");
339 printf(" -b, --begin <wlen> initial wavelength\n");
340 printf(" -e, --end <wlen> final wavelength\n");
341 printf(" -s, --step <wlen> wavelength step\n");
342 printf(" -z, --zero zero absorbance\n");
343 printf(" -t, --time-const <s> ADC filter time constant\n");
344 printf(" -c, --adc-chan <c> imput chanel of ADC\n");
345 printf(" -l, --lamp <l> lamp control\n");
346 printf(" -o, --oi-var <oid>=<v> uLan OI variable set\n");
347 printf(" -o, --oi-var <oid>? uLan OI variable read\n");
348 printf(" -V, --version show version\n");
349 printf(" -h, --help this usage screen\n");
352 int main(int argc,char *argv[])
354 static struct option long_opts[] = {
355 { "uldev", 1, 0, 'd' },
356 { "module",1, 0, 'm' },
357 { "print", 1, 0, 'p' },
358 { "version",0,0, 'V' },
359 { "help", 0, 0, 'h' },
360 { "debug-kernel", 1, 0, 'D' },
361 { "begin", 1, 0, 'b' },
362 { "end", 1, 0, 'e' },
363 { "step", 1, 0, 's' },
364 { "pause", 1, 0, 'P' },
365 { "zero", 0, 0, 'z' },
366 { "time-const", 1, 0, 't' },
367 { "adc-chan", 1, 0, 'c' },
368 { "lanmp", 1, 0, 'l' },
369 { "oi-var",1, 0, 'o' },
375 #ifndef HAS_GETOPT_LONG
376 while ((opt = getopt(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:")) != EOF)
378 while ((opt = getopt_long(argc, argv, "d:m:p:Vhb:e:s:P:zt:c:l:o:",
379 &long_opts[0], NULL)) != EOF)
386 module = strtol(optarg,NULL,0);
389 prt_modules = strtol(optarg,NULL,0);
392 debugk = strtol(optarg,NULL,0);
396 fputs("uLan lcscan v0.7\n", stdout);
399 wl_begin = strtol(optarg,NULL,0);
402 wl_end = strtol(optarg,NULL,0);
405 wl_step = strtol(optarg,NULL,0);
408 wl_pause = strtol(optarg,NULL,0);
415 time_co=strtod(optarg,NULL)*100;
419 adc_chan=strtol(optarg,NULL,0);
423 lampctrl=strtol(optarg,NULL,0);
429 oi_var_val=strpbrk(optarg,":=?");
444 exit(opt == 'h' ? 0 : 1);
447 if(debugk_flg) debug_kernel(debugk);
449 if(prt_modules) print_modules(prt_modules);
451 if(oi_var_fl) oi_var_test(oi_var_aoid,oi_var_val,NULL,NULL);
453 if(!debugk_flg&&!prt_modules&&!oi_var_fl)