| Line 1 | Line 1 |
| /* devXxK196Gpib.c */ | /*************************************************************************\ |
| /* share/src/devOpt @(#)devXxK196Gpib.c 1.2 3/18/92 */ | * Copyright (c) 2002 The University of Chicago, as Operator of Argonne |
| * National Laboratory. | |
| * Copyright (c) 2002 The Regents of the University of California, as | |
| * Operator of Los Alamos National Laboratory. | |
| * EPICS BASE Versions 3.13.7 | |
| * and higher are distributed subject to a Software License Agreement found | |
| * in file LICENSE that is included with this distribution. | |
| \*************************************************************************/ | |
| /* | /* |
| * Author: John Winans | |
| * Date: 11-19-91 | |
| * | |
| * Experimental Physics and Industrial Control System (EPICS) | |
| * | |
| * Copyright 1988, 1989, the Regents of the University of California, | |
| * and the University of Chicago Board of Governors. | |
| * | |
| * This software was produced under U.S. Government contracts: | |
| * (W-7405-ENG-36) at the Los Alamos National Laboratory, | |
| * and (W-31-109-ENG-38) at Argonne National Laboratory. | |
| * | |
| * Initial development by: | |
| * The Controls and Automation Group (AT-8) | |
| * Ground Test Accelerator | |
| * Accelerator Technology Division | |
| * Los Alamos National Laboratory | |
| * | |
| * Co-developed with | |
| * The Controls and Computing Group | |
| * Accelerator Systems Division | |
| * Advanced Photon Source | |
| * Argonne National Laboratory | |
| * | |
| * All rights reserved. No part of this publication may be reproduced, | |
| * stored in a retrieval system, transmitted, in any form or by any | |
| * means, electronic, mechanical, photocopying, recording, or otherwise | |
| * without prior written permission of Los Alamos National Laboratory | |
| * and Argonne National Laboratory. | |
| * | |
| * Modification Log: | * Modification Log: |
| * ----------------- | * ----------------- |
| * .01 05-30-91 jrw Initial Release | * .01 05-30-91 jrw Initial Release |
| * .02 01-14-02 nda modified init_dev_sup() per 3.13 req'ts | * .02 01-14-02 nda modified init_dev_sup() per 3.13 req'ts |
| * .03 05-11-04 wen example of R3.13 to R3.14/ASYN conversion | |
| */ | */ |
| #define DSET_AI devAiK196Gpib | #define DSET_AI devAiK196Gpib |
| #define DSET_AO devAoK196Gpib | |
| #define DSET_LI devLiK196Gpib | |
| #define DSET_LO devLoK196Gpib | |
| #define DSET_BI devBiK196Gpib | |
| #define DSET_BO devBoK196Gpib | #define DSET_BO devBoK196Gpib |
| #define DSET_MBBO devMbboK196Gpib | #define DSET_MBBO devMbboK196Gpib |
| #define DSET_MBBI devMbbiK196Gpib | |
| #define DSET_SI devSiK196Gpib | |
| #define DSET_SO devSoK196Gpib | |
| #include <vxWorks.h> | |
| #include <taskLib.h> | |
| #include <rngLib.h> | |
| #include <types.h> | |
| #include <stdioLib.h> | |
| #include <alarm.h> | |
| #include <cvtTable.h> | |
| #include <dbDefs.h> | |
| #include <dbAccess.h> | |
| #include <devSup.h> | |
| #include <recSup.h> | |
| #include <drvSup.h> | |
| #include <link.h> | |
| #include <module_types.h> | |
| #include <dbCommon.h> | |
| #include <aiRecord.h> | |
| #include <aoRecord.h> | |
| #include <biRecord.h> | |
| #include <boRecord.h> | |
| #include <mbbiRecord.h> | |
| #include <mbboRecord.h> | |
| #include <stringinRecord.h> | |
| #include <stringoutRecord.h> | |
| #include <longinRecord.h> | |
| #include <longoutRecord.h> | |
| #include <drvGpibInterface.h> | |
| #include <devCommonGpib.h> | #include <devCommonGpib.h> |
| #include <devGpib.h> | |
| static long init_dev_sup(), report(); | |
| static struct devGpibParmBlock devSupParms; | |
| /****************************************************************************** | |
| * | |
| * Define all the dset's. | |
| * | |
| * Note that the dset names are provided via the #define lines at the top of | |
| * this file. | |
| * | |
| * Other than for the debugging flag(s), these DSETs are the only items that | |
| * will appear in the global name space within the IOC. | |
| * | |
| * The last 3 items in the DSET structure are used to point to the parm | |
| * structure, the work functions used for each record type, and the srq | |
| * handler for each record type. | |
| * | |
| ******************************************************************************/ | |
| gDset DSET_AI = {6, {report, init_dev_sup, devGpibLib_initAi, NULL, | |
| devGpibLib_readAi, NULL, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_aiGpibWork, (DRVSUPFUN)devGpibLib_aiGpibSrq}}; | |
| gDset DSET_AO = {6, {NULL, NULL, devGpibLib_initAo, NULL, | |
| devGpibLib_writeAo, NULL, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_aoGpibWork, NULL}}; | |
| gDset DSET_BI = {5, {NULL, NULL, devGpibLib_initBi, NULL, | |
| devGpibLib_readBi, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_biGpibWork, (DRVSUPFUN)devGpibLib_biGpibSrq}}; | |
| gDset DSET_BO = {5, {NULL, NULL, devGpibLib_initBo, NULL, | |
| devGpibLib_writeBo, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_boGpibWork, NULL}}; | |
| gDset DSET_MBBI = {5, {NULL, NULL, devGpibLib_initMbbi, NULL, | |
| devGpibLib_readMbbi, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_mbbiGpibWork, (DRVSUPFUN)devGpibLib_mbbiGpibSrq}}; | |
| gDset DSET_MBBO = {5, {NULL, NULL, devGpibLib_initMbbo, NULL, | |
| devGpibLib_writeMbbo, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_mbboGpibWork, NULL}}; | |
| gDset DSET_SI = {5, {NULL, NULL, devGpibLib_initSi, NULL, | |
| devGpibLib_readSi, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)&devGpibLib_stringinGpibWork, (DRVSUPFUN)devGpibLib_stringinGpibSrq}}; | |
| gDset DSET_SO = {5, {NULL, NULL, devGpibLib_initSo, NULL, | |
| devGpibLib_writeSo, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_stringoutGpibWork, NULL}}; | |
| gDset DSET_LI = {5, {NULL, NULL, devGpibLib_initLi, NULL, | |
| devGpibLib_readLi, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_liGpibWork, (DRVSUPFUN)devGpibLib_liGpibSrq}}; | |
| gDset DSET_LO = {5, {NULL, NULL, devGpibLib_initLo, NULL, | |
| devGpibLib_writeLo, (DRVSUPFUN)&devSupParms, | |
| (DRVSUPFUN)devGpibLib_loGpibWork, NULL}}; | |
| static int K196Debug = 0; /* debugging flags */ | |
| /* | /* |
| * Use the TIME_WINDOW defn to indicate how long commands should be ignored | * Use the TIME_WINDOW defn to indicate how long commands should be ignored |
| * for a given device after it times out. The ignored commands will be | * for a given device after it times out. The ignored commands will be |
| * returned as errors to device support. | * returned as errors to device support. |
| * | * |
| * Use the DMA_TIME to define how long you wish to wait for an I/O operation | * Use the TIMEOUT to define how long you wish to wait for an I/O operation |
| * to complete once started. | * to complete once started. |
| */ | */ |
| #define TIME_WINDOW 600 /* 10 seconds on a getTick call */ | #define TIME_WINDOW 10.0 /* 10 seconds */ |
| #define DMA_TIME 30 /* 1/2 second on a watchdog time */ | #define TIMEOUT 0.5 /* 1/2 second */ |
| /****************************************************************************** | /****************************************************************************** |
| * | * |
| * String arrays for EFAST operations. Note that the last entry must be | * String arrays for EFAST operations. Note that the last entry must be |
| * NULL. | * NULL. |
| * | * |
| * On input operations, only as many bytes as are found in the string array | * On input operations, only as many bytes as are found in the string array |
| * elements are compared. If there are more bytes than that in the input | * elements are compared. If there are more bytes than that in the input |
| * message, they are ignored. The first matching string found (starting | * message, they are ignored. The first matching string found (starting |
| * from the 0'th element) will be used as a match. | * from the 0'th element) will be used as a match. |
| * | * |
| * NOTE: For the input operations, the strings are compared literally! This | * NOTE: For the input operations, the strings are compared literally! This |
| * can cause problems if the instrument is returning things like \r and \n | * can cause problems if the instrument is returning things like \r and \n |
| Line 200 static char *(set196rate[]) = {"S0X" | Line 87 static char *(set196rate[]) = {"S0X" |
| * | * |
| * Array of structures that define all GPIB messages | * Array of structures that define all GPIB messages |
| * supported for this type of instrument. | * supported for this type of instrument. |
| * | * |
| ******************************************************************************/ | ******************************************************************************/ |
| /* forward declarations of some custom convert routines */ | /* forward declarations of some custom convert routines */ |
| static struct gpibCmd gpibCmds[] = | static struct gpibCmd gpibCmds[] = |
| { | { |
| /* Param 0, (model) */ | /* Param 0, (model) */ |
| FILL, | FILL, |
| /* Param 1 initialization string */ | /* Param 1 initialization string */ |
| {&DSET_BO, GPIBCMD, IB_Q_HIGH, "L0XR3X", NULL, 0, 32, | {&DSET_BO, GPIBCMD, IB_Q_HIGH, "L0XR3X", NULL, 0, 32, |
| NULL, 0, 0, NULL, NULL, -1}, | NULL, 0, 0, NULL, NULL, NULL}, |
| /* Param 2 read current or voltage value */ | /* Param 2 read current or voltage value */ |
| /* "%*4c%lf" = ignore first 4 characters, use double precision floating point format */ | /* "%*4c%lf" = ignore first 4 characters, use double precision floating point format */ |
| {&DSET_AI, GPIBREAD, IB_Q_HIGH, "U7", "%*4c%lf", 0, 32, | {&DSET_AI, GPIBREAD, IB_Q_HIGH, "U7", "%*4c%lf", 0, 32, |
| NULL, 0, 0, NULL, NULL, -1}, | NULL, 0, 0, NULL, NULL, NULL}, |
| /* Param 3 set function */ | /* Param 3 set function */ |
| {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, | {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, |
| NULL, 0, 0, set196function, NULL, -1}, | NULL, 0, 0, set196function, NULL, NULL}, |
| /* Param 4 set range */ | /* Param 4 set range */ |
| {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, | {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, |
| NULL, 0, 0, set196range, NULL, -1}, | NULL, 0, 0, set196range, NULL, NULL}, |
| /* Param 5 set resolution */ | /* Param 5 set resolution */ |
| {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, | {&DSET_MBBO, GPIBEFASTO, IB_Q_HIGH, NULL, NULL, 0, 0, |
| NULL, 0, 0, set196rate, NULL, -1}, | NULL, 0, 0, set196rate, NULL, NULL}, |
| }; | }; |
| /* The following is the number of elements in the command array above. */ | /* The following is the number of elements in the command array above. */ |
| #define NUMPARAMS sizeof(gpibCmds)/sizeof(struct gpibCmd) | #define NUMPARAMS sizeof(gpibCmds)/sizeof(struct gpibCmd) |
| /****************************************************************************** | /****************************************************************************** |
| * | * |
| * Initialization for device support | * Initialization for device support |
| * This is called one time before any records are initialized with a parm | * 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 | * value of 0. And then again AFTER all record-level init is complete |
| * with a param value of 1. | * with a param value of 1. |
| * | * |
| ******************************************************************************/ | ******************************************************************************/ |
| static long | static long |
| init_dev_sup(parm) | init_ai(int parm) |
| int parm; | |
| { | { |
| if(parm==0) { | if(parm==0) { |
| devSupParms.debugFlag = &K196Debug; | |
| devSupParms.respond2Writes = -1; | devSupParms.respond2Writes = -1; |
| devSupParms.timeWindow = TIME_WINDOW; | devSupParms.timeWindow = TIME_WINDOW; |
| devSupParms.hwpvtHead = 0; | |
| devSupParms.gpibCmds = gpibCmds; | devSupParms.gpibCmds = gpibCmds; |
| devSupParms.numparams = NUMPARAMS; | devSupParms.numparams = NUMPARAMS; |
| devSupParms.magicSrq = -1; | |
| devSupParms.name = "devXxK196Gpib"; | devSupParms.name = "devXxK196Gpib"; |
| devSupParms.dmaTimeout = DMA_TIME; | devSupParms.timeout = TIMEOUT; |
| devSupParms.srqHandler = 0; | |
| devSupParms.wrConversion = 0; | |
| } | } |
| return(devGpibLib_initDevSup(parm, &DSET_AI)); | return 0; |
| } | } |
| /****************************************************************************** | |
| * | |
| * Print a report of operating statistics for all devices supported by this | |
| * module. | |
| * | |
| ******************************************************************************/ | |
| static long | |
| report() | |
| { | |
| return(devGpibLib_report(&DSET_AI)); | |
| } |