📄 cmd_1760.c
字号:
//*************************************************************************// // Copyright (c) 2001 IAG Software Team, //// Beijing R&D Center // // Advantech Co., Ltd.//// User program for Linux comedi device driver//// This is An Unpublished Work Containing Confidential And Proprietary// Information Which Is The Property Of Advantech Automation Corp.//// Any Disclosure, Use, Or Reproduction, Without Written Authorization From// Advantech Automation Corp., Is Strictly Prohibit.//////*************************************************************************// Program : do_1760.c// Revision: 1.0 // Author : Zhang Aimin // Date : 12/30/01 //// Description: Test various functions of PCI-1760. // This program use insn method to read from the IMB or write to the OMB// of PCI-1760.//-------------------------------------------------------------------------/*Options: * -i Digital input No parameters. * -f Digital filter Param: Channel SampleNum * -p Pattern match Param: Status * -c Counter Param: ResetValue MatchValue CountEdge * -r Relay output Param: RelayMask * -s State change Param: RisingMask FallingMask * -m PWM Param: PWMn EnableFlag LowPeriods HighPeriods BurstCount */#include<stdio.h>#include<stdlib.h>#include<unistd.h> //sleep()#include <comedilib.h> //comedi library#include <fcntl.h> //file control library#include<errno.h> //error codes report library #include<string.h> //string function library#include<getopt.h> //argument analyse function library#include<ctype.h> //c languge type librarychar *filename="/dev/comedi0"; //comedi device file nameint verbose_flag;comedi_t *device; //comedi deviceint subdevice=2; //subdevice numberint channel=0; //channel indexvoid Usage(char *progname){ printf("Usage:\n"); printf(" (1) %s -i\n",progname); printf(" (2) %s -f Channel SampleNum \n",progname); printf(" (3) %s -p ChanMask Pattern\n",progname); printf(" (4) %s -c ResetValue MatchValue CountEdge\n",progname); printf(" (5) %s -r RelayMask\n",progname); printf(" (6) %s -r RisingMask FallingMask\n",progname); printf(" (7) %s -m PWMn EnableFlag [HighPeriod LowPeriod BurstCount]\n",progname); exit(0);}int GetStatus(comedi_insn *insn,int cmd,int *imb0) //COMMAND 0x07{ lsampl_t imb[4],omb[4]={0x0,0x0,0x7,0x0}; insn->insn=INSN_WRITE; insn->data=omb; omb[0]=cmd & 0xff; if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } usleep(500); insn->insn=INSN_READ; insn->data=imb; if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } *imb0=imb[0] & 0xff; return 0;}int DigitalInput(comedi_insn *insn,int *data){ lsampl_t dataread[4]; insn->insn=INSN_READ; insn->data=dataread; if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } *data=insn->data[3] &0xff; printf("data read: 0x%x.\n",*data); return 0;}int DigitalFilter(comedi_insn *insn,int chan,int samplenum){ return 0;}int PatternMatch(comedi_insn *insn, int mask,int pattern){ int count; lsampl_t datawrite[4]={0x0,0x0,0x0,0x0},dataread[4]; insn->insn=INSN_WRITE; insn->data=datawrite; printf("mask: %d,pattern: %d\n",mask,pattern); datawrite[2]=0x21; //Enable/Disable the pattern match function of IDI datawrite[0]=mask & 0xff; //Pattern match enable mask if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } sleep(1); insn->insn=INSN_READ; insn->data=dataread; if(comedi_do_insn(device,insn)<0) { printf("read error!\n"); return -1; } insn->insn=INSN_WRITE; datawrite[2]=0x22; //Set the pattern match value of IDI datawrite[0]=pattern & 0xff; //Pattern match enable mask if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]); sleep(2); insn->data=datawrite; datawrite[2]=0x60; if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } insn->insn=INSN_READ; insn->data=dataread; if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]); count=0; while(count++<10000) sleep(1); return 0;}int RelayOutput(comedi_insn *insn,int mask){ lsampl_t omb[4]={0x0,0x0,0x1,0x0}; insn->insn=INSN_WRITE; insn->data=omb; omb[0]=mask; if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error:%d %s\n",errno,strerror(errno)); return -1; } return 0;} int StateChange(comedi_insn *insn,int rMask,int fMask){ lsampl_t omb[4]={0x0,0x0,0x0,0x0}; lsampl_t dataread[4],count; insn->insn=INSN_WRITE; insn->data=omb; omb[0]=rMask; //Rising mask omb[2]=0x23; //Enable/Disable rising edge detection function of IDI if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error!\n"); return -1; } sleep(1); omb[0]=fMask; //Falling mask omb[2]=0x24; //Enable/Disable falling edge detection funciton of IDI if(comedi_do_insn(device,insn)<0) { printf("comedi_do_insn error!\n"); return -1; } sleep(8); insn->data=omb; omb[2]=0x60; if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } insn->insn=INSN_READ; insn->data=dataread; if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } printf("dataread: 0x%x 0x%x 0x%x 0x%x\n",dataread[0],dataread[1],dataread[2],dataread[3]); count=0; while(count++<10000) sleep(1); return 0;}int PWM(comedi_insn *insn,int PWMn,int flagEnable,int lPeriod,int hPeriod,int burst){ lsampl_t omb[4]={0x0,0x0,0x0,0x0}; int hByte,lByte; int PWMStatus; PWMn &= 1; //We assure that PWMn=0 or 1 insn->insn=INSN_WRITE; insn->data=omb; /*Step 1: Sets the high period value of PWMn*/ lByte=hPeriod & 0xff; hByte=(hPeriod >>8) & 0xff; omb[0]=lByte; omb[1]=hByte; omb[2]=0x10+2*PWMn; //Command code if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } /*Step 2: Sets the low period value of PWMn*/ lByte=lPeriod & 0xff; hByte=(lPeriod >>8) & 0xff; omb[0]=lByte; omb[1]=hByte; omb[2]=0x11+2*PWMn; //Command code if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } /*Step 3: Sets the burst count of PWMn*/ lByte=burst & 0xff; //Maximum value is 0xff hByte=(burst >>8) & 0xff; omb[0]=lByte; omb[1]=hByte; omb[2]=0x14+PWMn; //Command code if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } usleep(100); /*Step 4: Read the PWM outputs' enable/disable flags. *We do this in order not to affect another channel when *we deal with a channel. */ GetStatus(insn,0x1f,&PWMStatus); PWMStatus &= 0x3; //Only bit0 and bit1 is valid value printf("PWMStatus: %d\n",PWMStatus); /*Step 5: Enable the PWMn outputs.*/ insn->insn=INSN_WRITE; insn->data=omb; flagEnable &= 1; if(PWMn==0) omb[0]=(2 & PWMStatus) | flagEnable; else omb[0]=(1 & PWMStatus) |(flagEnable <<1); omb[2]=0x1f; //Command code printf("PWMn %d ~PWMn %d ~PWMn&PWMStatus %d flagEnable %d Enableflag: %d.\n",PWMn,~PWMn, ~PWMn&PWMStatus,flagEnable,omb[0]); if(comedi_do_insn(device,insn)<0) { printf("write error!\n"); return -1; } sleep(1); GetStatus(insn,0x1f,&PWMStatus); PWMStatus &= 0x3; //Only bit0 and bit1 is valid value printf("PWMStatus: %d\n",PWMStatus); sleep(50); return 0;}int main(int argc,char *argv[]){ char progname[20]; char ch,option='i'; int optioncount=0; extern int optind; lsampl_t dataread[4]; int data; comedi_insn insn; strncpy(progname,argv[0],19>strlen(argv[0])?19:strlen(argv[0])); while((ch=getopt(argc,argv,"if:p:c:r:s:m:"))!=EOF) { switch(ch) {case 'i': case 'f': case 'c': case 'p': case 'r': case 's': case 'm': option=ch; optioncount++; break; default: Usage(progname); } } if(optioncount >1) { printf("One and only one option required!\n"); Usage(progname); } printf("argc=%d,optioncount=%d\n",argc,optioncount); argc -=2; argv+=2; if((device=comedi_open(filename))==NULL) { printf("comedi_open(\"%s\") error: %s\n",filename,strerror(errno)); exit(0); } memset(&insn,0,sizeof(insn)); insn.subdev=2; insn.insn=INSN_READ; insn.n=4; insn.chanspec=CR_PACK(channel,0,0); insn.data=dataread; switch(option) { case 'i': DigitalInput(&insn,&data); break; case 'f': { int chan,samplenum; if(argc <2) { printf("Invalid parameters!\n"); Usage(progname); } chan=atoi(argv[0]); samplenum=atoi(argv[1]); DigitalFilter(&insn,chan,samplenum); break; } case 'c': { int resetValue,matchValue,enable; if(argc <3) { printf("Invalid parameters!\n"); Usage(progname); } resetValue=atoi(argv[0]); matchValue=atoi(argv[1]); enable=atoi(argv[2]);// Counter(&insn,resetValue,matchValue,enable); break; } case 'p': { int mask,pattern; printf("optind=%d,argc=%d %s %s\n",optind,argc, argv[0],argv[1]); if(argc<2) { printf("Invalid parameters!\n"); Usage(progname); } mask=atoi(argv[0]) &0xff; pattern=atoi(argv[1]) & 0xff; PatternMatch(&insn,mask,pattern); break; } case 'r': { int mask; if(argc<1) { printf("Invalid parameter number!\n"); Usage(progname); } mask=atoi(argv[0]) & 0xff; RelayOutput(&insn,mask); break; } case 's': { int rMask,fMask; if(argc<2) { printf("Invalid parameter number!\n"); Usage(progname); } rMask=atoi(argv[0]) & 0xff; fMask=atoi(argv[1]) & 0xff; StateChange(&insn,rMask,fMask); break; } case 'm': { int PWMn,flagEnable,hPeriod,lPeriod,burst; hPeriod=1; //Default value lPeriod=1; burst=0; //Continuous if(argc<2) { printf("Invalid parameter number!\n"); Usage(progname); } PWMn=atoi(argv[0]) & 1; flagEnable=atoi(argv[1]) & 1; argc -=2; argv+=2; if(argc>=3) lPeriod=atoi(argv[0]) & 0xffff; if(argc>=4) hPeriod=atoi(argv[1]) & 0xffff; if(argc>=5) burst=atoi(argv[2]) & 0xffff; PWM(&insn,PWMn,flagEnable,lPeriod,hPeriod,burst); break; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -