/* dev17K66A.c */ /* * Author: Makoto Tobiyama * Date: 11_Aug_2009 */ #include <epicsStdio.h> #include <devCommonGpib.h> /*********************************************************************** * asynDriver is distributed subject to a Software License Agreement * found in file LICENSE that is included with this distribution. ***********************************************************************/ #define DSET_AI devAi17K66A #define DSET_AO devAo17K66A #define DSET_BI devBi17K66A #define DSET_BO devBo17K66A #define DSET_LI devLi17K66A #define DSET_LO devLo17K66A #define DSET_MBBO devMbbo17K66A #define DSET_MBBI devMbbi17K66A #define DSET_SI devSi17K66A #define DSET_SO devSo17K66A #define DSET_WF devWf17K66A #include <devGpib.h> #include <string.h> #include <stdlib.h> #define TIMEOUT 5.0 #define TIMEWINDOW 2.0 static int readString(gpibDpvt *pdpvt,int P1, int P2, char **P3); static int rd_data(char wav[], long temp[]); static int rd_wf_data(struct gpibDpvt *pdpvt, int p1, int p2, char **p3); /* * Define end-of-string character(s) here to allow * easier changes when testing the driver. */ #define EOSNL "" static struct gpibCmd gpibCmds[] = { /* COMAND 0 set_delay */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "DLY%05ld\r", 511, 511, NULL, 0, 0, NULL, NULL, EOSNL }, /* COMAND 1 set_dev */ {&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "DVD%05ld\r", 511, 511, NULL, 0, 0, NULL, NULL, EOSNL }, /* COMAND 2 read status */ {&DSET_WF, GPIBREAD, IB_Q_LOW, "GET\r",NULL, 0, 8191, rd_wf_data, 0,0,NULL,NULL, EOSNL } }; /* The following is the number of elements in the command array above. */ #define NUMPARAMS sizeof(gpibCmds)/sizeof(struct gpibCmd) /****************************************************************************** * * Initialization for device support * This is called one time before any records are initialized with a parm * value of 0. And then again AFTER all record-level init is complete * with a param value of 1. * ******************************************************************************/ static long init_ai(int parm) { if(parm==0) { devSupParms.name = "dev17K66A"; devSupParms.gpibCmds = gpibCmds; devSupParms.numparams = NUMPARAMS; devSupParms.timeout = TIMEOUT; devSupParms.timeWindow = TIMEWINDOW; devSupParms.respond2Writes = 1.0; } return(0); } static int readString(gpibDpvt *pdpvt,int P1, int P2, char **P3) { stringinRecord *prec = (stringinRecord*)pdpvt->precord; strncpy(prec->val,pdpvt->msg,sizeof(prec->val)); prec->val[sizeof(prec->val) - 1] = 0; return(0); } static int rd_data(char wav[], long data[]) { /* 012345678901234567890 OEN/DVD12345/DLY12345 */ int i; char wa1[32767]; /* printf("input %s\n",wav); */ strcpy(wa1,strtok(wav,"/")); if (strcmp(wa1,"OEN")==0) { data[0]=0; } else { data[0]=1; } for (i=7;i<12;i++) { wa1[i-7]=wav[i]; } /* printf("DVD %s\n",wa1); */ data[1]=atoi(wa1); for (i=16;i<21;i++) { wa1[i-16]=wav[i]; } data[2]= atoi(wa1); return 0; } static int rd_wf_data(struct gpibDpvt *pdpvt, int p1, int p2, char **p3) { struct waveformRecord *pwf = (struct waveformRecord *) (pdpvt->precord); char *craw; long *temparray; long temp[500], *ptemp; int ok_flag; unsigned long numElem; temparray = (long *) pwf->bptr; craw = pdpvt->msg; /* printf("craw %s\n",craw); */ if (strlen(craw)==0) { printf("ERROR NULL\n"); return(-1); } ok_flag = rd_data(craw,temp); numElem=3; pwf->nord =numElem; ptemp=temp; while (numElem--) { *temparray++ = (int) *ptemp++; } return(0); }