📄 ul_dysn.c
字号:
/******************************************************************* uLan Communication - simple test client ul_lcscan.c - procceed wavelength scanning with LCD5000 (C) Copyright 1996,1999 by Pavel Pisa The uLan driver is distributed under the Gnu General Public Licence. See file COPYING for details. *******************************************************************/#define _GNU_SOURCE#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <stdio.h>#include <getopt.h>#include <errno.h>#include <sys/types.h>#include <sys/time.h>#include <sys/stat.h>#include <string.h>#include <ctype.h>#include <time.h>#include <ul_lib/ulan.h>#if !defined( __GNUC__)||defined(DJGPP)||defined(NO_GET_DELIM)||defined (__MINGW32__)int getdelim(char **line,size_t *linelen,char delim,FILE *F){ char c; int l=0; do{ if(l+2>=*linelen) { *linelen=l+20; if(!*line) *line=(char *)malloc(*linelen); else *line=(char *)realloc(*line,*linelen); } c=fgetc(F); if(feof(F)) {if(l) break; else return -1;} if(c!='\r') (*line)[l++]=c; } while(c!=delim); (*line)[l]=0; return l;};#endif/*******************************************************************/int ul_new_memrq_head(ul_fd_t ul_fd, int dadr, int cmd, int mtype, int start, int len){ int ret; int i; ul_msginfo msginfo; uchar buf[8]; msginfo.dadr=dadr; msginfo.cmd=cmd; msginfo.flg=UL_BFL_ARQ|UL_BFL_PRQ|UL_BFL_M2IN; ret=ul_newmsg(ul_fd,&msginfo); if(ret<0) return ret; i=0; buf[i++]=(uchar)mtype; buf[i++]=mtype>>8; buf[i++]=(uchar)start; buf[i++]=start>>8; if(mtype&0x100) {buf[i++]=start>>16; buf[i++]=start>>24;}; buf[i++]=(uchar)len; buf[i++]=len>>8; if(ul_write(ul_fd,buf,i)!=i) { ul_abortmsg(ul_fd); ret=-1; }; return ret;};int ul_new_memrq_read(ul_fd_t ul_fd, int dadr, int mtype, int start, int len){ int ret; ul_msginfo msginfo; ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_RDM,mtype,start,len); if (ret<0) return ret; msginfo.dadr=dadr; msginfo.cmd=UL_CMD_RDM&0x7F; msginfo.flg=UL_BFL_REC|UL_BFL_LNMM|UL_BFL_M2IN; msginfo.len=len; ret=ul_tailmsg(ul_fd,&msginfo); if (ret<0) {ul_abortmsg(ul_fd);return ret;}; ret=ul_freemsg(ul_fd); return ret;};int ul_new_memrq_write(ul_fd_t ul_fd, int dadr, int mtype, int start, int len, void *buf){ int ret; ul_msginfo msginfo; ret=ul_new_memrq_head(ul_fd,dadr,UL_CMD_WRM,mtype,start,len); if(ret<0) return ret; msginfo.dadr=dadr; msginfo.cmd=UL_CMD_WRM&0x7F; msginfo.flg=UL_BFL_SND|UL_BFL_LNMM|UL_BFL_ARQ|UL_BFL_M2IN; msginfo.len=len; ret=ul_tailmsg(ul_fd,&msginfo); if(ret<0) {ul_abortmsg(ul_fd);return ret;}; if(buf) { ret=ul_write(ul_fd,buf,len); if(ret<0) {ul_abortmsg(ul_fd);return ret;}; ret=ul_freemsg(ul_fd); }; return ret;};int ul_mem_read_wait(ul_fd_t ul_fd, int dadr, int mtype, int start, int len, void *ptr){ int ret, stamp; ul_msginfo msginfo; stamp=ret=ul_new_memrq_read(ul_fd,dadr,mtype,start,len); if(ret<0) return ret; /* ioctl(ul_fd,UL_KLOGBLL); */ /* ioctl(ul_fd,UL_STROKE); */ do { ul_freemsg(ul_fd); ret=ul_fd_wait(ul_fd,20); if(ret<0) {printf("Select returned %d\n",ret);return ret;}; if(!ret) {printf("Select - timeout\n");return -1;}; ret=ul_acceptmsg(ul_fd,&msginfo); if(ret<0) { printf("Accept msg returned %d\n",ret); return ret; }; } while(msginfo.stamp!=stamp); if(msginfo.flg&UL_BFL_FAIL) { printf("Failed msg flg=0x%X\n",msginfo.flg); ul_freemsg(ul_fd);return -1; }; ret=ul_actailmsg(ul_fd,&msginfo); if(ret<0) { printf("Accept tail returned %d\n",ret); ul_freemsg(ul_fd); return ret; }; if((ret=ul_read(ul_fd,ptr,len))!=len) { printf("Bad read len %d, rq %d, msg %d\n",ret,len,msginfo.len); ul_freemsg(ul_fd);return -1; }; ul_freemsg(ul_fd); return len;};/*******************************************************************/char *ul_dev_name = UL_DEV_NAME;int module= 0;int prt_modules= 0;int prt_modules_dyn= 0;int debugk = 0;int debugk_flg = 0;int oi_var_fl = 0;int oi_var_rd = 0;char *oi_var_aoid=NULL;char *oi_var_val=NULL;int new_sn_flg = 0;unsigned long new_sn;int no_permanent_flg=0;int new_adr_flg = 0;int new_adr = 0;int new_adrnvsv_flg = 0;int interactive_flg = 0;#define SCAN_BLK_LEN 1024int set_new_sn(int module,unsigned long new_sn);/*******************************************************************/int oi_var_oiddes_print(int oid, uchar *despack){ char *desname=uloi_oiddespack_strdup(despack,0); char *destype=uloi_oiddespack_strdup(despack,1); if(desname){ printf(" %5d deslen=%d name=\"%s\" type=\"%s\"\n", oid,despack[0],desname?desname:"",destype?destype:""); }else{ printf(" %5d\n",oid); } if(desname) free(desname); if(destype) free(destype); return 0;}int oi_var_test(char *aoid, char *valin, char **valout, char *type){ int ret; int oid; int val; int vallen=2; int i; uloi_coninfo_t *coninfo; coninfo=uloi_open(ul_dev_name,module,0x10,0,10); if(!coninfo) { perror("wl_scan : uLan OI open failed");return -1;}; if((aoid!=NULL)&&(*aoid)) { if(isdigit(*aoid)) { oid=strtol(aoid,NULL,0); } else { ret=uloi_get_aoiddes(coninfo,oi_var_rd?ULOI_DOIO:ULOI_DOII,aoid,NULL); if(ret<0) { fprintf(stderr,"oi_var_test : uloi_get_aoiddes returned %d\n",ret); return -1; }; oid=ret; } if(valout==NULL&&!oi_var_rd) { if(valin&&*valin) { val=strtol(valin,NULL,0); } else vallen=0; ret=uloi_set_var(coninfo,oid,&val,vallen); if(ret<0) { fprintf(stderr,"oi_var_test : uloi_set_var failed\n");return -1;}; } else { ret=uloi_get_var(coninfo,oid,&val,vallen); if(ret<0) {fprintf(stderr,"oi_var_test : uloi_get_var failed\n");return -1;}; if(val&0x8000) val|=~0xffff; else val&=0xffff; printf("%s=%d\n",aoid,val); } } else { int *oids; ret=uloi_get_oids(coninfo,ULOI_QOII,&oids); if(ret<0) { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret); return -1; }; printf("module recognized commands and set vars:\n"); for(i=0;i<ret;i++) { uchar *despack=NULL; if(uloi_get_oiddes(coninfo,ULOI_DOII,oids[i],&despack)>=0){ oi_var_oiddes_print(oids[i],despack); if(despack) free(despack); }else{ printf(" %5d no reply\n",oids[i]); } } free(oids); ret=uloi_get_oids(coninfo,ULOI_QOIO,&oids); if(ret<0) { fprintf(stderr,"oi_var_test : uloi_get_oids returned %d\n",ret); return -1; }; printf("module recognized get vars:\n"); for(i=0;i<ret;i++) { uchar *despack=NULL; if(uloi_get_oiddes(coninfo,ULOI_DOIO,oids[i],&despack)>=0){ oi_var_oiddes_print(oids[i],despack); if(despack) free(despack); }else{ printf(" %5d no reply\n",oids[i]); } } free(oids); } uloi_close(coninfo); return 0;}int print_modules(int max_addr){ int ret; int adr; ul_fd_t ul_fd; uchar *buf=NULL; int buf_len; int count=0; uchar buf_out[10]; ul_msginfo msginfo; int ul_ncs_filter_on=0; ul_fd=ul_open(ul_dev_name, NULL); if(ul_fd==UL_FD_INVALID) { perror("print_modules : uLan open failed");return -1;}; for(adr=1;adr<=max_addr;adr++) { ret=ul_send_query_wait(ul_fd,adr,UL_CMD_SID, UL_BFL_NORE|UL_BFL_PRQ,NULL,0,(void**)&buf,&buf_len); if(ret>=0) { count++; for(ret=0;(ret<buf_len)&&buf[ret];ret++); printf("%2d: ",adr); fwrite(buf,ret,1,stdout); printf("\n"); free(buf); buf=NULL; /* NCS information request */ if(!ul_ncs_filter_on){ memset(&msginfo,0,sizeof(ul_msginfo)); msginfo.cmd=UL_CMD_NCS; ul_addfilt(ul_fd,&msginfo); ul_ncs_filter_on=1; } buf_out[0]=ULNCS_SID_RQ; ret=ul_send_command(ul_fd,adr,UL_CMD_NCS, UL_BFL_NORE|UL_BFL_PRQ,buf_out,1); while(1) { ret=ul_fd_wait(ul_fd,10); if(ret<0) return -1; if(ret==0) { printf("cannot retrieve SN info for %d\n",adr); break; } ret=ul_acceptmsg(ul_fd,&msginfo); if(ret<0) return ret; if((msginfo.cmd!=UL_CMD_NCS) ||(msginfo.sadr!=adr) ||(msginfo.len<3)) { ul_freemsg(ul_fd); continue; } buf=malloc(msginfo.len); ret=ul_read(ul_fd,buf,msginfo.len); ul_freemsg(ul_fd); if(buf[0]==ULNCS_SID_RPLY) { if(msginfo.len>=5) { printf("%2d %8lX: ",msginfo.sadr,(buf[1])+((long)buf[2]<<8)+ ((long)buf[3]<<16)+((long)buf[4]<<24)); fwrite(buf+5,msginfo.len-5,1,stdout); printf("\n"); free(buf); buf=NULL; break; } } free(buf); buf=NULL; } /* */ }; if(buf) free(buf); buf=NULL; }; ul_close(ul_fd); return count;};int print_modules_dyn(void){ int ret; ul_fd_t ul_fd; uchar *buf=NULL; int count=0; uchar buf_out[10]; ul_msginfo msginfo; int ul_ncs_filter_on=0; ul_fd=ul_open(ul_dev_name, NULL); if(ul_fd==UL_FD_INVALID) { perror("print_modules_dyn : uLan open failed");return -1;}; if(!ul_ncs_filter_on){ memset(&msginfo,0,sizeof(ul_msginfo)); msginfo.cmd=UL_CMD_NCS; ul_addfilt(ul_fd,&msginfo); ul_ncs_filter_on=1; } buf_out[0]=ULNCS_SID_RQ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -