Compare commits

..

201 Commits

Author SHA1 Message Date
John Winans
96da4b1121 Added devMpc.c 1995-03-31 15:05:07 +00:00
John Winans
3c6191cccd Machine protection system interface card 1995-03-31 15:03:32 +00:00
Marty Kraimer
60a488940c Make include look at ansi before old 1995-03-31 13:54:27 +00:00
Marty Kraimer
1c1d8228c7 Allen Bradley completely rewritten and move to ansi 1995-03-31 13:49:52 +00:00
Marty Kraimer
b2ee2f2347 New version of Allen Bradlet driver 1995-03-31 13:48:59 +00:00
Marty Kraimer
2c2673dcea Allen Bradley support completele rewritten 1995-03-31 13:47:50 +00:00
Janet B. Anderson
0e760bfc70 Modified includes to reflect new drv subdirectories old and ansi 1995-03-31 00:05:46 +00:00
Janet B. Anderson
f0234af637 Added solaris scripts for starting caRepeater and iocLogServer - anj 1995-03-30 23:17:59 +00:00
Janet B. Anderson
96f58790c4 Seperated drv files into ansi and old dirs. Added combine dir. 1995-03-30 19:36:44 +00:00
Janet B. Anderson
2c1004fb41 Changed include location in drv directory 1995-03-30 19:13:13 +00:00
Marty Kraimer
f6025d2a1f Fixed bugs in dnNotify code. Move code to dbNotify.c from dbLink and dbAccess 1995-03-30 19:04:34 +00:00
cvs2svn
4d046c8424 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta10'. 1995-03-24 21:24:26 +00:00
John Winans
e7e17f07af Probable race condition in PEP TX task. Moved the final transmission
byte assignment into the point where the busy list is locked.  This
is how the Xycom TX task has worked all along.  This change fixed
seems to have fixed an apparant race condition where the receive task
gets a response to a transmitted message BEFORE the TX task gets
it on the busy list.
1995-03-24 21:24:25 +00:00
Janet B. Anderson
8a23d381c4 Added define for USG 1995-03-24 15:29:08 +00:00
Janet B. Anderson
46b9bb6e6a Changed bcopy to memcpy and added include for string.h 1995-03-24 15:28:20 +00:00
Marty Kraimer
9ab85124d3 Allow pvnames to contain ; 1995-03-24 13:42:21 +00:00
Ned Arnold
b8f07e873d Version 1.15 always fills in RxCV, even if RxPV's are not valid. 1995-03-17 17:51:55 +00:00
John Winans
0cfd58942f Added waveform writing support 1995-03-10 16:55:40 +00:00
Jeff Hill
b75d3964d7 more ANSI C changes and fixed send call back lost problem 1995-03-08 17:44:46 +00:00
cvs2svn
b9c8cd50e0 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta9'. 1995-03-08 13:48:39 +00:00
Marty Kraimer
e7b8b42452 Make sure errInit is called before epicsPrintf or errPrintf execute 1995-03-08 13:48:38 +00:00
Marty Kraimer
4cc62a1fce Take errInit out of dbLoad 1995-03-08 13:45:36 +00:00
Jeff Hill
333c985399 added FTP script 1995-03-07 23:19:44 +00:00
Jeff Hill
f513681bc0 no zero length message under SOLARIS 1995-03-07 22:56:45 +00:00
Jeff Hill
ddb459d08a ANSI C changes 1995-03-07 22:47:51 +00:00
Marty Kraimer
6aa5ecfa0e Allow errInit to be called multiple times 1995-03-07 21:18:56 +00:00
Marty Kraimer
9bdea89b06 errInit must be called before errPrintf 1995-03-07 21:17:16 +00:00
John Winans
3c8b4bf8c0 added assertion to misc.c for dealing with the '\a' character problem. 1995-03-07 19:23:12 +00:00
Janet B. Anderson
a912205614 Put static on sub_it() definition. 1995-03-07 17:27:58 +00:00
Janet B. Anderson
3b094ac9ae Removed CMPLR=OLD line 1995-03-07 17:18:43 +00:00
Ned Arnold
13a7380a47 Bug fix. Didn't update PxRA arrays if no readback PV's were specified. 1995-03-07 15:29:45 +00:00
Jeff Hill
f1bc683bd4 ssert => epicsAssert 1995-03-07 01:25:09 +00:00
Jeff Hill
5d3ded4397 ssert to epicsAssert.h 1995-03-07 01:21:16 +00:00
Jeff Hill
4a5cb2a6e5 assert.h => epicsAssert.h 1995-03-07 01:20:33 +00:00
Jeff Hill
9300dded40 sizeof A => sizeof(A) 1995-03-06 22:45:29 +00:00
Jeff Hill
cb86cd03a7 Compiler warnings fixed 1995-03-06 22:44:57 +00:00
Jeff Hill
cee91cb578 badd status map btw TScurrentTimeStamp() => tsLocalTime () fixed 1995-03-06 22:44:10 +00:00
Jeff Hill
679e1b8a56 added misssing includes 1995-03-06 22:43:19 +00:00
Jeff Hill
f6d91b8876 added missing includes 1995-03-06 22:42:55 +00:00
Jeff Hill
a86c813415 this time for sure 1995-03-06 22:42:03 +00:00
Jeff Hill
be2491bc51 created 1995-03-06 22:38:42 +00:00
Jeff Hill
1634c70c06 added assert stuff 1995-03-06 22:37:55 +00:00
Jeff Hill
df876abf50 fixed warning messages 1995-03-06 22:37:04 +00:00
Jeff Hill
d5873d5e8a add missing LOCAL 1995-03-06 22:35:49 +00:00
Jeff Hill
b6c87ce10e fetch time in one place only 1995-03-06 22:34:05 +00:00
Jeff Hill
00d40d3e73 debug stmnts 1995-03-06 22:33:37 +00:00
Jeff Hill
410e6d9c00 doc and clened up mux io 1995-03-06 22:32:33 +00:00
Jeff Hill
03944c94e3 cleaned up mux io 1995-03-06 22:32:07 +00:00
Jeff Hill
b5f31b4b13 doc and cleaned up mux io 1995-03-06 22:31:47 +00:00
Jeff Hill
7bb7e8a884 missing includes 1995-03-06 22:16:33 +00:00
Jeff Hill
d153387372 fix cast causes excess CPU consumption 1995-03-06 22:16:04 +00:00
Jeff Hill
d4a4b23a55 fetch time in only one place 1995-03-06 22:14:55 +00:00
Jeff Hill
14a152ba72 doc 1995-03-06 22:09:12 +00:00
Jeff Hill
20b6539144 fetch time only once 1995-03-06 22:08:41 +00:00
Jeff Hill
93b6da9b3c clean up 1995-03-06 22:07:34 +00:00
Jeff Hill
542c0115c5 de-lint 1995-03-06 22:06:53 +00:00
Jeff Hill
15440b9b6c Fetch current time in only one place 1995-03-06 22:06:21 +00:00
Jeff Hill
4cb9699c03 init conts var that will later be initialized by CA. 1995-03-06 21:53:23 +00:00
Jeff Hill
6460c2fc1d fetch time only once 1995-03-06 21:51:52 +00:00
Jeff Hill
9b858b8a5f better build for test codes 1995-03-06 21:46:25 +00:00
Ned Arnold
ed30327d93 added positioner readback arrays, PxRA. CHANGED scanRecord.ascii !!! Post monitor on .val at each point 1995-03-06 17:29:48 +00:00
John Winans
35aba51c7f Removed declaration of yylval. It caused problems for everyone and should
be defined by the yacc used to build parse.y anyway.
1995-03-06 17:15:11 +00:00
John Winans
12fd359a3c Forced antelope to compile under strict ANSI w/o any warnings. 1995-03-06 17:00:16 +00:00
Marty Kraimer
e0b6ce3867 tsLocalTime on vxWorks now returns S_ts_OK for success just like unix 1995-03-03 14:53:02 +00:00
Marty Kraimer
c5fce1bd6c Added callbackRequestProcessCallback 1995-03-03 14:50:06 +00:00
Janet B. Anderson
2dfbf28c1b Changed to += syntax 1995-03-02 19:21:09 +00:00
Janet B. Anderson
32add4c78f Changed to += syntax 1995-03-02 19:12:00 +00:00
Janet B. Anderson
9ea5c86ab5 changed to += syntax 1995-03-02 19:10:48 +00:00
Janet B. Anderson
48efca8456 Changes to += syntax 1995-03-02 18:53:37 +00:00
Janet B. Anderson
382c496b24 Changed to += syntax 1995-03-02 18:52:09 +00:00
Janet B. Anderson
13173544a9 Ansi c changes 1995-03-02 18:49:26 +00:00
Janet B. Anderson
19bf9ec448 Fixed call to inet_ntoa and added ifdef for free on HP 1995-03-01 19:43:56 +00:00
Ned Arnold
a08656090e Fixed bug in detecting a transition. Put .OVAL = .VAL statement at end of process() 1995-02-28 21:35:00 +00:00
Johnny Tang
7b03f77e30 to be compatible with select prototype on hp. 1995-02-28 00:57:23 +00:00
Johnny Tang
80dbdf6814 Adde LOCAL to register_new_client func. 1995-02-28 00:56:15 +00:00
Johnny Tang
103bd7492a added RF_IO data structure. 1995-02-28 00:51:55 +00:00
Marty Kraimer
e55693525c If on vxWorks add #include <vxWorks.h> 1995-02-27 15:36:56 +00:00
Marty Kraimer
64bd8e03dc Fixed COS task so it works for > 1 link. 1995-02-27 15:35:38 +00:00
Marty Kraimer
49b77d096f Add include #include <vxWorks.h> 1995-02-27 15:33:12 +00:00
Marty Kraimer
ae720e75af add include vxWorks.h 1995-02-27 15:29:55 +00:00
Marty Kraimer
bca7b39ab6 Fixed problem with adding,removing monitors 1995-02-24 19:06:05 +00:00
Ned Arnold
3600bb9513 Improved recWaitCaTask and associated record code 1995-02-24 16:52:51 +00:00
Matt Needes
339d08b71d Fixed locking error. OOPS. 1995-02-23 21:45:03 +00:00
Matt Needes
687e1a2c16 Fixed a comment. 1995-02-23 21:43:34 +00:00
Matt Needes
a53bffb128 Fixed some inaccuracies 1995-02-22 18:55:24 +00:00
Janet B. Anderson
4a7c1b1715 Added comments. 1995-02-21 17:53:22 +00:00
Janet B. Anderson
e75c3729b8 Fixed comment on #endif stmt 1995-02-21 17:52:42 +00:00
Janet B. Anderson
7cc6c1993d Fixed comments on #endif statements 1995-02-21 17:51:22 +00:00
Ned Arnold
63a3b6827c Added .RTST flag to (optionally) return the positioners to the start position after a scan 1995-02-21 17:10:10 +00:00
Ned Arnold
b1f570f66d Added queuing of input monitors (if IO_INTR scanned) so no transitions would be missed 1995-02-21 15:32:15 +00:00
cvs2svn
239e6cfa2e This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta8'. 1995-02-18 01:51:39 +00:00
Jeff Hill
e783ec0de9 added cinst to pformat decl so we match ansi C 1995-02-18 01:51:38 +00:00
Jeff Hill
23f970b821 const added to pformat declartion so we match ansi C 1995-02-18 01:50:07 +00:00
Jeff Hill
7ff04ea451 ansi C 1995-02-18 01:48:31 +00:00
Jeff Hill
fd9d79f445 epicsPrintf() changes 1995-02-18 01:41:12 +00:00
Marty Kraimer
a12e94cffb Forgot to remove mprintf.h 1995-02-17 20:59:30 +00:00
Marty Kraimer
d38eaf82cd Clean up errPrintf stuff 1995-02-17 20:55:09 +00:00
Marty Kraimer
b1382c3f19 All err init done by errInit 1995-02-17 20:50:21 +00:00
Jeff Hill
7eaeac2075 ansi C 1995-02-17 20:44:02 +00:00
Jeff Hill
96defa3afa use arch independent types 1995-02-17 20:43:32 +00:00
Jeff Hill
4b2f0c1d74 doc 1995-02-17 20:41:16 +00:00
Jeff Hill
53bfe9888a new model names 1995-02-17 20:40:27 +00:00
Jeff Hill
2c82e2976c use empty host name if os query fails 1995-02-17 20:10:46 +00:00
Jeff Hill
ea2efa0e47 fixed comment 1995-02-17 20:09:25 +00:00
Jeff Hill
bd5b7b61a0 Use empty user name if we cant query the os 1995-02-17 20:08:51 +00:00
Jeff Hill
6d2eafd2ca No ENV_PRIVATE_DATA alloc here and empty user name if query fails 1995-02-17 20:07:06 +00:00
Jeff Hill
67b4dc7064 added convert.c to the UNIX build 1995-02-17 20:05:23 +00:00
Janet B. Anderson
f3ad1f4d4e Initial version 1995-02-17 15:09:56 +00:00
Jeff Hill
0eb9331f88 NT changes 1995-02-16 22:35:44 +00:00
Jeff Hill
35b0e4aaba NT changes and (long) cast problem fixed 1995-02-16 22:34:06 +00:00
Ned Arnold
1ea57db276 changed name of caMonitor.c to recWaitCa.c 1995-02-16 20:36:59 +00:00
Ned Arnold
062e3d6d32 changed names of caMonitor stuff to recWaitCa stuff. Also added
individual flags for IO_INTR processing of inputs
1995-02-16 20:18:22 +00:00
Jim Kowalkowski
6937834dee Rewrote a suspicious looking loop. 1995-02-16 17:08:48 +00:00
Janet B. Anderson
f9793ec277 Initial version 1995-02-15 17:13:23 +00:00
John Winans
a93e2e8b26 Cleaned up some Hideos hacking and commented out the LANL debug code because
APS has had some add behaviour from GPIB lately and it is one of few things
that has changed WRT to it.
1995-02-14 22:33:01 +00:00
Marty Kraimer
d7275641dc Revert to previous version of dbpf 1995-02-14 19:57:38 +00:00
cvs2svn
9dc64d0063 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta7'. 1995-02-13 21:44:50 +00:00
Janet B. Anderson
afd124a431 Added cvs Id keyword 1995-02-13 21:44:49 +00:00
Janet B. Anderson
a2952bdd75 Update instructions 1995-02-13 20:47:02 +00:00
Marty Kraimer
5003f11977 Resolve diffs between last commits 1995-02-13 20:45:54 +00:00
Janet B. Anderson
8e12035e4a Initial version 1995-02-13 19:39:28 +00:00
Marty Kraimer
294c6778ec For CAMAC allow default (0) for A and F 1995-02-13 19:22:55 +00:00
Janet B. Anderson
3178294f08 fixed on-the-fly so 1st step is to end position 1995-02-13 18:40:11 +00:00
Janet B. Anderson
aa9222e276 Unbundled many files to extensions and removed some unused files. 1995-02-13 17:07:10 +00:00
Janet B. Anderson
fc18b7d4fb Added extern lines. 1995-02-13 16:53:06 +00:00
Janet B. Anderson
d4c7e14fd5 Added VERS and ODLY (output execution delay) 1995-02-13 16:51:34 +00:00
Janet B. Anderson
76dfa54089 Fixed order of posting monitors to be what people
expect (i.e. .cpt, .pxdv, .dxcv)
1995-02-13 16:50:32 +00:00
Janet B. Anderson
24bc06d5ff Reset nRequest to 1 1995-02-13 16:48:55 +00:00
Janet B. Anderson
e19085e380 Removed date from epicsRelease. 1995-02-13 16:46:04 +00:00
Janet B. Anderson
69fc84d4a6 Replaced include genDefs.h with assert.h 1995-02-13 16:42:18 +00:00
Janet B. Anderson
415ac1f797 Remove includes for arAccessLib.h and sydDefs.h 1995-02-13 16:40:26 +00:00
Janet B. Anderson
e4c383cfb5 Added LN and SQRT as synonyms for LOGE and SQR, respectively.
Added NINT, nearest integer function.
Modified handling of "-"  so operator can be either unary or binary.
1995-02-13 16:38:27 +00:00
Janet B. Anderson
c89e742e67 Added NINT 1995-02-13 16:35:52 +00:00
Janet B. Anderson
ab11ca0407 Modified to allow negative values for tsMinWest 1995-02-13 16:32:04 +00:00
Janet B. Anderson
78f3b493ea Unbundled many files to extensions 1995-02-13 16:27:59 +00:00
Janet B. Anderson
cdf7a99013 Unbundled many files to extensions 1995-02-13 16:22:22 +00:00
Janet B. Anderson
47e4ce63b1 Added preserve date option to cp commands 1995-02-13 16:12:32 +00:00
Janet B. Anderson
48cfc5ee15 Added cvs Id keyword 1995-02-13 16:09:14 +00:00
Janet B. Anderson
8746390dda Changed bcopy to memcopy 1995-02-13 16:07:39 +00:00
Janet B. Anderson
cbe1a0b970 Changed bzero to memset. 1995-02-13 16:06:21 +00:00
Janet B. Anderson
273f7aa5e3 Added math library to usr load libs 1995-02-13 16:05:32 +00:00
Janet B. Anderson
e74acbc234 Added math library to load libs 1995-02-13 15:57:30 +00:00
Marty Kraimer
b30c979b0b Set states defined true if any state value OR string is defined 1995-02-13 15:18:04 +00:00
Marty Kraimer
68a0f7a00b Low and High words were mixed up. 1995-02-13 15:15:06 +00:00
Marty Kraimer
0c9de2c129 For ab_bt_write and ab_bt_read, remove from driver list before calling callback 1995-02-13 15:10:55 +00:00
Marty Kraimer
e3f3d9c87b Remove special code for DBR_STRING to allow numeric index (dbLink now does this) 1995-02-13 15:08:18 +00:00
Marty Kraimer
45c5f93950 For DBR_STRING to DBF_choice allow numeric index as well as string choice 1995-02-13 15:05:38 +00:00
Marty Kraimer
c0e1c071bb dbScanLock and dbScanUnlock issue taskSuspend for illegal lock set 1995-02-13 15:04:46 +00:00
Janet B. Anderson
e95156d29b Changed include file from CONFIG_SITE to CONFIG 1995-02-13 15:00:09 +00:00
John Winans
a437b010b3 Killed 162 stuff and ready for TranServ. 1995-02-13 14:53:34 +00:00
Jeff Hill
7d3ed265a5 iocLogClient.c - new log source 1995-02-13 04:03:53 +00:00
Jeff Hill
85e899484d made ca_test.c (more) portable 1995-02-13 03:56:18 +00:00
Jeff Hill
8bb3067b90 drvTS.c - use errMessage () as discussed with jbk
iocInit.c - static => LOCAL for debugging and many changes
		to the parser for resource.def so that we
		allow white space between tokens in env var
1995-02-13 03:54:24 +00:00
Jeff Hill
1b5d92daf1 bucketLib.c - added LOCAL as required
ellLib.c - added missing stdio.h
envSubr.c - use getenv/putenv under vxWorks
errSymLib.c - call mprintf() and not printf or logMsg()
		(eliminated errToLogMsg variable)
genSubr.c - silenced DEC CC warning
tsSubr.c - fixed ts min west out of range test & VMS changes
1995-02-13 03:49:02 +00:00
Jeff Hill
22336dce1b Ignore IOC_BUILD proto form old clients
and make the beacon list global
1995-02-13 03:37:47 +00:00
Jeff Hill
1ecdaff1b5 NT/ALPHA(VMS/printf handler) changes 1995-02-13 03:32:27 +00:00
Marty Kraimer
de878747c6 Added (void *) cast for memset. Changed type for sec to time_t in logTime 1995-02-10 14:05:50 +00:00
Marty Kraimer
3cc8bec710 Changed long to dbr_long_t to get rid of warnings 1995-02-10 13:56:55 +00:00
John Winans
2a87278529 Nuked references to the old 162 code 1995-02-08 19:08:53 +00:00
John Winans
9bbf6fe17e Removed references to the mvme162 stuff (replaced by HiDEOS.) 1995-02-07 18:53:56 +00:00
John Winans
1c4adbf2ce Removed building of the drvMvme162 stuff (replaced by HiDEOS.) 1995-02-07 18:52:25 +00:00
Jim Kowalkowski
0170e0c88a Removed the stinking message "Cannot contact master timing IOC ". 1995-02-02 17:15:55 +00:00
Marty Kraimer
7b1c33aa63 cvtFloatToString and cvtDoubleToString failed for the value 1e7 1995-02-02 16:32:30 +00:00
John Winans
faf07df760 Added a type field to the configure command to disable the use of the event
system hardware if desired.
1995-02-01 15:29:54 +00:00
Janet B. Anderson
9594f7d245 Added X11 include def to USR_INCLUDES 1995-01-23 18:57:00 +00:00
Jim Kowalkowski
61d8593e66 Fix for a problem I believe is about quotes in patternsin dbInitSubs().
Added some debug code.
1995-01-18 20:54:02 +00:00
John Winans
363bf2a47c added the '0x' in front of the hex input and outputs in the report function. 1995-01-18 16:38:03 +00:00
John Winans
ba5d364469 Added a way groovy report function foe use by dbior. 1995-01-18 16:07:29 +00:00
Marty Kraimer
1ea888e720 Cleaned up error messages for missing record, device, driver support 1995-01-17 13:51:37 +00:00
Marty Kraimer
2f4992ceb7 Added ^ and ~ as valid characters (needed for CALC fields) 1995-01-17 13:50:34 +00:00
cvs2svn
3186db5576 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta6'. 1995-01-09 20:52:03 +00:00
John Winans
e7e77e415f Added analog input support for temperature 1995-01-09 20:52:02 +00:00
Marty Kraimer
8bbe24525b Must flush for dbhcr 1995-01-09 20:41:59 +00:00
John Winans
33074d31f4 Added AI support for temperature input 1995-01-09 20:28:42 +00:00
Marty Kraimer
16c09ec67c dbCalloc for papPeriodic previously allocated too much storage. 1995-01-09 19:39:25 +00:00
Marty Kraimer
a79e478a32 init_record always returns status=2 so that conversion is not performed 1995-01-09 19:36:46 +00:00
John Winans
3941fb3ead Added some ifdef'd out test code to see if the end of the sequence program
could be updated to NOT cause an extra sample from port zero to be taken
at the end of the sequence.  As it turns out, it causes more harm than
good.  There must be something wrong with my understanding on how it works.
For now, the misfeature of the extra sample at the end of the sequence will
have to stay.
1995-01-06 17:03:43 +00:00
John Winans
1eb71e24b6 Added the log parameter to the doc 1995-01-06 16:55:52 +00:00
John Winans
dacd2a6cc5 Added a line of DOC 1995-01-06 16:55:18 +00:00
John Winans
e5dae1d675 enabled irq services and rearranged the parm names and meanings. 1995-01-06 16:55:04 +00:00
cvs2svn
5f24768671 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta5'. 1994-12-21 16:03:12 +00:00
Janet B. Anderson
d4f720482b Added $(RM) line and removed chmod line in vxWorks rules 1994-12-21 16:03:11 +00:00
Marty Kraimer
8f3b1cce16 get_enum_strs has no_strs=2 if no strings defined so CA clients work 1994-12-21 14:58:01 +00:00
Marty Kraimer
a94db92c29 get_enum_strs MUST set no_strs=2 if no strings defined 1994-12-21 14:19:44 +00:00
Marty Kraimer
b6a46820e9 If calink has MS or PP then issue error message only in errVerbose=TRUE 1994-12-21 14:16:59 +00:00
John Winans
cf7307f399 Added the devXxSkeletonGpib.c file to the build list. This is to insure that
it is a buildable module.
1994-12-20 15:31:45 +00:00
Marty Kraimer
fb0a164de1 Added FFO option 1994-12-19 18:25:51 +00:00
Marty Kraimer
8d9d7a126a In init_record mask is shifted not set equal to 1994-12-19 18:25:16 +00:00
cvs2svn
67378ebaa1 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta4'. 1994-12-16 16:11:27 +00:00
John Winans
0859173047 Added debug flag guards to ALL printing. The default debug level is set
to 1 -- this provides the same output as the old version.
1994-12-16 16:11:26 +00:00
John Winans
0f1c9c357a Changed error message in the event system error handler & added a conditional
based on a debug flag to print it... defaults to off.  (Per request from MRK.)
1994-12-16 15:51:21 +00:00
Janet B. Anderson
a4cfb43ba1 Now installs individual objects and devLibOpt 1994-12-15 19:44:44 +00:00
cvs2svn
6c620894f5 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta3'. 1994-12-15 16:12:45 +00:00
Marty Kraimer
b7451c7a5d Allow iocInit to continue even if getResources fails 1994-12-15 16:12:44 +00:00
John Winans
a2331c9d0e Changed a printf to logMsg and added a printing delay to use when
the ibDebug flag is set so things come out closer to the proper order.
1994-12-14 22:43:48 +00:00
John Winans
f44ce3dbb0 Changed printf to logMsg in the A24Malloc code and added a few more
debug statements.
1994-12-14 22:41:06 +00:00
John Winans
d9066673ef Removed DMAC command chaining structure(s) from the ibLink
structure so they can be malloc'd seperately.  This keeps
the usage of A24 space restricted to ONLY those structures
that have to be there.
1994-12-14 22:29:14 +00:00
Janet B. Anderson
82867f0684 Now installs individual objects instead of devLibOpt 1994-12-14 15:00:16 +00:00
John Winans
6fb928ea9d Updated the GPIB request header. 1994-12-12 19:59:45 +00:00
John Winans
ad41921414 Rewrote the init code so that it always returns a zero (don't kill the
startup.cmd file.)  It is possible that this could cause some confusion
to the database, should it decide to then use a link that did not init
properly.
1994-12-12 16:03:00 +00:00
cvs2svn
17c54db7f7 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta2'. 1994-12-07 15:11:14 +00:00
242 changed files with 49925 additions and 3709 deletions

View File

@@ -12,6 +12,9 @@
# install because the release.% syntax is illegal.
#
# $Log$
# Revision 1.22 1994/11/14 23:12:17 tang
# Replace ARCH_TYPE with .
#
# Revision 1.1.1.1 1994/11/09 01:08:53 epics
# Import of R3.12.0Beta
#
@@ -46,7 +49,7 @@
#
EPICS=..
include $(EPICS)/config/CONFIG_SITE
include $(EPICS)/config/CONFIG
all: install

71
README
View File

@@ -10,20 +10,20 @@ Notes:
1. Before you can build or really use EPICS, you must set your
path properly:
set path = ( $path EPICS/base/tools EPICS/base/bin/HOST_ARCH )
set path = ( $path EPICS/base/tools EPICS/base/bin/HOST_ARCH \
EPICS/extensions/bin HOST_ARCH )
e.g.:
set path = ( $path /home/epics/base/tools /home/epics/base/bin/sun4 )
set path = ( $path /home/epics/base/tools /home/epics/base/bin/sun4 \
/home/epics/extensions/bin/sun4 )
2. If you are using GNU make (which is now THE supported make utility
for the build), you probably want to invoke it with the
--no-print-directory option when you are building at the TOP level:
2. You must use GNU make (which is now THE supported make utility) for
the build. A script, gmake, exists in the base/tools directory to invoke
it with the --no-print-directory option. This option will turn off the
annoying messages GNU make produces upon entering a directory.
make --no-print-directory
This is to turn off the annoying messages GNU make produces upon
entering a directory.
gmake
----------------------------------------------------------------------------
Part 1 - Configuring and Building EPICS Base
@@ -31,13 +31,13 @@ This is to turn off the annoying messages GNU make produces upon
1.1 To configure EPICS, edit the following files:
base/config/CONFIG_SITE - Build choices/HOST_ARCH/Vx location.
base/config/CONFIG_SITE.* - Location of X, etc.
base/config/CONFIG - For overriding specific variables.
config/CONFIG_SITE - Build choices/HOST_ARCH/Vx location.
config/CONFIG_SITE.* - Location of X, etc.
config/CONFIG - For overriding specific variables.
1.2 To add a target architecture to EPICS:
cd epics/base/config
cd epics/config
cp CONFIG_ARCH.mv167 CONFIG_ARCH.YOUR_ARCH
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
@@ -50,25 +50,27 @@ This is to turn off the annoying messages GNU make produces upon
1.3 To build EPICS:
make - To build and install EPICS.
make clean - To clean temporary object files. Clean will
remove files from ALL O.ARCH dirs, not
only those specified in BUILD_ARCHS.
cd epics/base
gmake - To build and install EPICS.
gmake clean - To clean temporary object files. Clean will
remove files from ALL O.ARCH dirs, not
only those specified in BUILD_ARCHS.
1.4 To create an EPICS release:
edit include/version.h - ONLY IF you need to change the EPICS
edit base/include/version.h - ONLY IF you need to change the EPICS
version number.
make release - Will create Tar file, but only after
generating dependencies.
make built_release - Same as above, but INCLUDING BINARIES.
gmake release - Will create Tar file
gmake built_release - Will create Tar file, after generating
dependencies, INCLUDING BINARIES.
1.5 "Partial" build commands:
make clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
make install.sun4 - Builds sun4 only.
make install.mv167 - Builds mv167 only (a HOST_ARCH build must
gmake clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
gmake install.sun4 - Builds sun4 only.
gmake install.mv167 - Builds mv167 only (a HOST_ARCH build must
be complete before this can be issued).
NOTES:
@@ -81,8 +83,8 @@ NOTES:
3. During a normal build (a "make" or "make install"), the "depends"
dependency will NOT be invoked. Only if "make depends" is run
explicitly, or a "make release" is performed will dependencies be
generated automatically.
explicitly, or a "make built_release" is performed will dependencies
be generated automatically.
4. Temporary objects are stored in src/DIR/O.ARCH, This allows objects
for multiple architectures to be maintained at the same time.
@@ -130,11 +132,16 @@ define compile and link flags.
----------------------------------------------------------------------------
CONFIG_COMMON - Contains definitions describing the layout of base.
----------------------------------------------------------------------------
HRULES - Rules for traversing hierarchical directories.
CONFIG_BASE
CONFIG_EXTENSIONS - Defines what subdirectories get built by default under
base and extensions.
----------------------------------------------------------------------------
RULES.Vx - Rules for building with VxWorks makefiles.
----------------------------------------------------------------------------
RULES.Unix - Rules for building with Unix makefiles.
----------------------------------------------------------------------------
RULES_ARCHS
RULES_DIRS - Allows top-level type command syntax in low-level directories.
----------------------------------------------------------------------------
Table of files to change when building and adding architectures.
@@ -149,10 +156,13 @@ CONFIG_SITE.Unix.ARCH_CLASS m - c* -
CONFIG_SITE.Vx.ARCH_CLASS m c* - -
CONFIG.Unix.ARCH_CLASS - - c* -
CONFIG.Vx.ARCH_CLASS - c* - -
CONFIG_COMMON - - - -
HRULES - - - -
RULES.Vx - - - -
RULES.Unix - - - -
CONFIG_BASE - - - -
CONFIG_EXTENSIONS - - - -
CONFIG_COMMON - - - -
RULES_ARCHS - - - -
RULES_DIRS - - - -
m - Modify an existing file.
c - Create a new file.
@@ -229,9 +239,6 @@ RULES.Unix - - - -
Dependencies supported by lower level Makefiles:
depends - Generate include dependencies
pre_build - Build e_flex / antelope
build_libs - Builds libraries for use in "build"
install_libs - Installs these libraries in lib/ARCH
build - Builds objects, using libraries from "build_libs"
install - Installs executables in bin/ARCH
clean - Cleans objects

29
README.solaris Normal file
View File

@@ -0,0 +1,29 @@
----------------------------------------------------------------------------
EPICS R3.12 Notes for Solaris 2.3
- By Andrew Johnson
----------------------------------------------------------------------------
Notes:
1. In order to build and use EPICS under Solaris 2, you must include
various directories in your path in the order given below, in addition
to those named in base/README. Some of these directories may already be
included in your path from your .login script or .cshrc file, so be
careful that the ordering is correct.
setenv PATH /usr/ucb:/usr/bin:/usr/ccs/bin:$PATH
2. It is not possible to compile the whole of EPICS under Solaris 2
using only the GNU gcc compiler - some routines which are needed (for
example quiet_nan()) have been unbundled by Sun and are provided with
their ANSI C compiler. The path to the Sun compiler is explicitly set
using the SPARCWORKS definition in the file CONFIG_SITE.Unix.solaris
3. EPICS must be compiled and linked using the UCB compatability
libraries. The definitions UCB_LIB and UCB_INCLUDE are used here to
refer to these libraries and their header files, and the tools provided
within /usr/ucb must be used in preference to the System V ones, hence
the above path ordering.
--
anj@mail.ast.cam.ac.uk

View File

@@ -3,7 +3,7 @@ include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -D_NO_PROTO
USR_LDLIBS = -lAs -lCom -lDb -lCom -s
USR_LDLIBS = -lAs -lCom -lDb -lCom -lm -s
USR_LDFLAGS = -L.
DEPLIBS_BASE = $(EPICS_BASE_LIB)

View File

@@ -52,6 +52,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
* .01 10-15-93 mrk Initial Implementation
*/
#ifdef vxWorks
#include <vxWorks.h>
#include <taskLib.h>
#endif
#include <dbDefs.h>
#include <asLib.h>
#include <string.h>
@@ -60,9 +64,6 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
#include <stdio.h>
#include <gpHash.h>
#include <freeList.h>
#ifdef vxWorks
#include <taskLib.h>
#endif
/*Declare storage for Global Variables */
ASBASE *pasbase=NULL;

View File

@@ -1,6 +1,6 @@
integer [0-9]
name [a-zA-Z0-9_\.]
pvname [a-zA-Z0-9_:\.\[\]<>]
pvname [a-zA-Z0-9_:\.\[\]<>;]
string [a-zA-Z0-9_\,\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$]
%{

View File

@@ -15,13 +15,31 @@ $! - You are using Multinet for TCP/IP access. If not, the logical
$! name definitions below will need to be changed
$!
$!
$! Arguments : None
$! Arguments : optional source file name
$!
$! Created 16-NOV-1993 Mark L. Rivers
$! 05-MAY-1994 Jeff O. Hill Updated for EPICS 3.12
$! 07-MAR-1995 Jeff O. Hill Added FTP script
$!
$!========================================================================
$!
$! Example FTP script moves sources from UNIX to VMS
$! (remove "$!" comment delimeters)
$!
$! user XXXXXXX
$! cd [.ca]
$! prompt
$! lcd ~/epics/base/src/ca
$! mput *.c
$! mput *.h
$! put BUILD_VMS.COM
$! lcd ../libCom
$! mput *.c
$! mput *.h
$! lcd ../../include
$! mput *.h
$!========================================================================
$!
$ define /nolog sys multinet_root:[multinet.include.sys]
$ define /nolog vms multinet_root:[multinet.include.vms]
$ define /nolog net multinet_root:[multinet.include.net]
@@ -30,11 +48,13 @@ $ define /nolog arpa multinet_root:[multinet.include.arpa]
$ define /nolog tcp multinet_root:[multinet.include]
$!
$! Compile the functions and test programs
$! Define symbol for the CC command
$ call set_cc_command
$ if (p1 .nes. "")
$ then
$ cc /defines=(__STDC__)/include=([]) 'p1'
$ cc_command 'p1'
$ else
$ cc /defines=(__STDC__)/include=([]) -
$ cc_command -
ACCESS, -
CONN, -
CONVERT, -
@@ -51,6 +71,8 @@ VMS_DEPEN, -
ELLLIB, -
BUCKETLIB, -
ENVSUBR, -
TSSUBR, -
NEXTFIELDSUBR, -
CATIME, -
ACCTST
$ endif
@@ -71,7 +93,9 @@ IF_DEPEN, -
VMS_DEPEN, -
BSD_DEPEN, -
BUCKETLIB, -
TSSUBR, -
ENVSUBR, -
NEXTFIELDSUBR, -
ELLLIB
$! Link the test programs
$ call link acctst
@@ -84,10 +108,32 @@ $ catime == "$ EPICS_EXE:catime.exe"
$
$!
$ link: subroutine
$ link 'p1', sys$input/options
channel_access/lib
multinet_socket_library/share
sys$share:vaxcrtl/share
$! Link differently for VAX and AXP
$ if f$getsyi("HW_MODEL") .ge. 1024
$ then
$ link 'p1', sys$input/options
channel_access/lib
multinet_socket_library/share
$ else
$ link 'p1', sys$input/options
channel_access/lib
multinet_socket_library/share
sys$share:vaxcrtl/share
$ endif
$ endsubroutine
$
$
$! This subroutine sets up "cc_command" to use different switches for
$! VAX (assumes VAX C compiler) and AXP (DEC C compiler).
$ set_cc_command : subroutine
$ if f$getsyi("HW_MODEL") .ge. 1024
$ then
$! turn of no prototype messages because MULTINET does not
$! supply prototypes.
$ cc_command:== cc /warn=(disable=IMPLICITFUNC)/float=d_float /include=([], [-.include], [-.libcom])
$ else
$ cc_command:== cc /include=([], [-.include], [-.libcom])
$ endif
$ endsubroutine
$! ************************************************************

View File

@@ -2,26 +2,27 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
USR_LDLIBS = -lca -lCom
USR_LDLIBS = -lca -lCom -lm
USR_LDFLAGS = -L.
DEPLIBS_BASE = $(EPICS_BASE_LIB)
DEPLIBS = ./libca.a\
$(DEPLIBS_BASE)/libCom.a
SRCS.c = \
../iocinf.c ../access.c ../test_event.c ../service.c \
../flow_control.c ../repeater.c ../conn.c ../acctst.c \
../flow_control.c ../repeater.c ../conn.c \
../syncgrp.c ../if_depen.c ../netdb_depen.c ../bsd_depen.c \
../posix_depen.c ../caRepeater.c ../acctst.c
../posix_depen.c ../caRepeater.c ../acctst.c ../catime.c \
../convert.c
OBJS = caRepeater.o
LIBOBJS = \
iocinf.o access.o test_event.o service.o flow_control.o repeater.o \
conn.o syncgrp.o if_depen.o netdb_depen.o \
bsd_depen.o posix_depen.o
bsd_depen.o posix_depen.o convert.o
LIBNAME = libca.a
@@ -30,8 +31,16 @@ PROD = caRepeater
include $(EPICS)/config/RULES.Unix
acctst: acctst.o $(DEPLIBS_BASE)/libCom.a libca.a
acctst: acctst.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
acctst.o: ../acctst.c
$(COMPILE.c) $<
catime: catime.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
catime.o: ../catime.c
$(COMPILE.c) $<

View File

@@ -2,12 +2,11 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
SRCS.c = \
../iocinf.c ../access.c ../test_event.c ../service.c \
../flow_control.c ../repeater.c ../conn.c ../syncgrp.c \
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c \
../catime.c
OBJS = \
iocinf.o access.o test_event.o service.o flow_control.o \
@@ -20,3 +19,10 @@ include $(EPICS)/config/RULES.Vx
caLib: $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)
acctst.o: ../acctst.c
$(COMPILE.c) $<
catime.o: ../catime.c
$(COMPILE.c) $<

View File

@@ -134,6 +134,8 @@ static char *sccsId = "@(#) $Id$";
#include "iocinf.h"
#include "net_convert.h"
#include <epicsPrint.h>
#include <stdarg.h> /* for VMS old CC include order madness */
/****************************************************************/
@@ -142,19 +144,6 @@ static char *sccsId = "@(#) $Id$";
#define EXTMSGPTR(PIIU)\
((struct extmsg *) &(PIIU)->send.buf[(PIIU)->send.wtix])
/*
* Performs worst case message alignment
*/
#define CAC_ADD_MSG(PIIU) \
{ \
unsigned long size; \
struct extmsg *mp = EXTMSGPTR(PIIU); \
size = mp->m_postsize = CA_MESSAGE_ALIGN(mp->m_postsize); \
mp->m_postsize = htons(mp->m_postsize); \
CAC_RING_BUFFER_WRITE_ADVANCE( \
&(PIIU)->send, sizeof(struct extmsg) + size); \
}
@@ -189,12 +178,14 @@ static struct extmsg nullmsg;
/*
* local functions
*/
#if 0
LOCAL int cac_alloc_msg(
struct ioc_in_use *piiu,
unsigned extsize,
struct extmsg **ppMsg
);
#endif
LOCAL int cac_alloc_msg_no_flush(
struct ioc_in_use *piiu,
unsigned extsize,
@@ -230,6 +221,8 @@ struct extmsg *pmsg,
void *pext
);
LOCAL void cac_add_msg (IIU *piiu);
#ifdef CONVERSION_REQUIRED
LOCAL void *malloc_put_convert(unsigned long size);
LOCAL void free_put_convert(void *pBuf);
@@ -253,15 +246,17 @@ void *pext
)
{
struct extmsg msg;
unsigned long bytesAvailable;
unsigned long actualextsize;
unsigned long extsize;
unsigned long bytesSent;
unsigned bytesAvailable;
unsigned actualextsize;
unsigned extsize;
unsigned msgsize;
unsigned bytesSent;
msg = *pmsg;
actualextsize = pmsg->m_postsize;
extsize = CA_MESSAGE_ALIGN(pmsg->m_postsize);
msg.m_postsize = htons(extsize);
msg.m_postsize = htons((ca_uint16_t)extsize);
msgsize = extsize+sizeof(msg);
LOCK;
@@ -278,13 +273,13 @@ void *pext
* o Does not allow for messages larger than the
* ring buffer size.
*/
if(extsize+sizeof(msg)>piiu->send.max_msg){
if(msgsize>piiu->send.max_msg){
return ECA_TOLARGE;
}
bytesAvailable = cacRingBufferWriteSize(&piiu->send, FALSE);
if (bytesAvailable<extsize+sizeof(msg)) {
if (bytesAvailable<msgsize) {
/*
* try to send first so that we avoid the
* overhead of select() in high throughput
@@ -294,7 +289,7 @@ void *pext
bytesAvailable =
cacRingBufferWriteSize(&piiu->send, FALSE);
while(bytesAvailable<extsize+sizeof(msg)){
while(TRUE){
struct timeval itimeout;
/*
@@ -309,16 +304,35 @@ void *pext
UNLOCK;
LD_CA_TIME (SELECT_POLL, &itimeout);
cac_mux_io(&itimeout);
cac_mux_io (&itimeout);
LOCK;
bytesAvailable = cacRingBufferWriteSize(
&piiu->send,
FALSE);
if(bytesAvailable>=extsize+sizeof(msg)){
/*
* record the time if we end up blocking so that
* we can time out
*/
if (bytesAvailable>=extsize+sizeof(msg)) {
# if DEBUG
If (piiu->sendPending) {
printf ("-Unblocked-\n");
}
# endif /* DEBUG */
piiu->sendPending = FALSE;
break;
}
else {
if (!piiu->sendPending) {
# if DEBUG
printf ("-Blocked-\n");
# endif /* DEBUG */
piiu->timeAtSendBlock = ca_static->currentTime;
piiu->sendPending = TRUE;
}
}
}
}
@@ -347,8 +361,8 @@ void *pext
* if present
*/
{
static nullBuff[32];
int n;
static nullBuff[32];
unsigned n;
n = extsize-actualextsize;
if(n){
@@ -412,81 +426,29 @@ struct extmsg **ppMsg
/*
*
* cac_alloc_msg()
*
* return a pointer to reserved message buffer space or
* nill if the message will not fit
*
* LOCK should be on
*
*/
LOCAL int cac_alloc_msg(
struct ioc_in_use *piiu,
unsigned extsize,
struct extmsg **ppMsg
)
* cac_add_msg ()
*/
LOCAL void cac_add_msg (IIU *piiu)
{
unsigned msgsize;
unsigned long bytesAvailable;
struct extmsg *pmsg;
msgsize = sizeof(struct extmsg)+extsize;
unsigned long size;
struct extmsg *mp = EXTMSGPTR(piiu);
/*
* fail if max message size exceeded
* Performs worst case message alignment
*/
if(msgsize>=piiu->send.max_msg){
return ECA_TOLARGE;
}
bytesAvailable = cacRingBufferWriteSize(&piiu->send, TRUE);
if (bytesAvailable<msgsize) {
/*
* try to send first so that we avoid the
* overhead of select() in high throughput
* situations
*/
(*piiu->sendBytes)(piiu);
bytesAvailable = cacRingBufferWriteSize(
&piiu->send,
TRUE);
while (bytesAvailable<msgsize) {
struct timeval itimeout;
/*
* if connection drops request
* cant be completed
*/
if(!piiu->conn_up){
return ECA_BADCHID;
}
UNLOCK;
LD_CA_TIME (SELECT_POLL, &itimeout);
cac_mux_io(&itimeout);
LOCK;
bytesAvailable = cacRingBufferWriteSize(
&piiu->send,
TRUE);
}
}
pmsg = (struct extmsg *) &piiu->send.buf[piiu->send.wtix];
pmsg->m_postsize = extsize;
*ppMsg = pmsg;
return ECA_NORMAL;
mp->m_postsize = (unsigned short)
CA_MESSAGE_ALIGN(mp->m_postsize);
size = mp->m_postsize;
mp->m_postsize = htons(mp->m_postsize);
CAC_RING_BUFFER_WRITE_ADVANCE(
&piiu->send,
sizeof(struct extmsg) + size);
}
/*
*
* CA_TASK_INITIALIZE
*
*
*/
int APIENTRY ca_task_initialize(void)
{
@@ -518,6 +480,8 @@ int ca_os_independent_init (void)
ca_static->ca_exception_func = ca_default_exception_handler;
ca_static->ca_exception_arg = NULL;
caSetDefaultPrintfHandler();
/* record a default user name */
ca_static->ca_pUserName = localUserName();
if(!ca_static->ca_pUserName){
@@ -533,6 +497,8 @@ int ca_os_independent_init (void)
return ECA_ALLOCMEM;
}
cac_gettimeval (&ca_static->currentTime);
/* init sync group facility */
ca_sg_init();
@@ -541,10 +507,10 @@ int ca_os_independent_init (void)
*/
ca_static->ca_search_retry = 0;
ca_static->ca_conn_next_retry = CA_CURRENT_TIME;
sec = CA_RECAST_DELAY;
sec = (unsigned) CA_RECAST_DELAY;
ca_static->ca_conn_retry_delay.tv_sec = sec;
ca_static->ca_conn_retry_delay.tv_usec =
(CA_RECAST_DELAY-sec)*USEC_PER_SEC;
(long) ((CA_RECAST_DELAY-sec)*USEC_PER_SEC);
ellInit(&ca_static->ca_iiuList);
ellInit(&ca_static->ca_ioeventlist);
@@ -597,8 +563,6 @@ int ca_os_independent_init (void)
*/
LOCAL void create_udp_fd()
{
int pri;
char name[64];
int status;
if(ca_static->ca_piiuCast){
@@ -615,38 +579,43 @@ LOCAL void create_udp_fd()
}
#ifdef vxWorks
status = taskPriorityGet(VXTASKIDSELF, &pri);
if(status<0)
ca_signal(ECA_INTERNAL,NULL);
{
int pri;
char name[64];
strcpy(name,"RD ");
strncat(
name,
taskName(VXTHISTASKID),
sizeof(name)-strlen(name)-1);
status = taskPriorityGet(VXTASKIDSELF, &pri);
if(status<0)
ca_signal(ECA_INTERNAL,NULL);
strcpy(name,"RD ");
strncat(
name,
taskName(VXTHISTASKID),
sizeof(name)-strlen(name)-1);
status = taskSpawn(
name,
pri-1,
VX_FP_TASK,
4096,
(FUNCPTR)cac_recv_task,
(int)taskIdCurrent,
0,
0,
0,
0,
0,
0,
0,
0,
0);
if (status<0) {
ca_signal(ECA_INTERNAL,NULL);
}
ca_static->recv_tid = status;
status = taskSpawn(
name,
pri-1,
VX_FP_TASK,
4096,
(FUNCPTR)cac_recv_task,
(int)taskIdCurrent,
0,
0,
0,
0,
0,
0,
0,
0,
0);
if (status<0) {
ca_signal(ECA_INTERNAL,NULL);
}
ca_static->recv_tid = status;
#endif
}
@@ -1072,7 +1041,7 @@ int APIENTRY ca_search_and_connect
chix->pConnFunc = conn_func;
chix->type = TYPENOTCONN; /* invalid initial type */
chix->count = 0; /* invalid initial count */
chix->id.sid = ~0L; /* invalid initial server id */
chix->id.sid = ~0U; /* invalid initial server id */
chix->state = cs_never_conn;
ellInit(&chix->eventq);
@@ -1088,10 +1057,10 @@ int APIENTRY ca_search_and_connect
*/
ca_static->ca_search_retry = 0;
ca_static->ca_conn_next_retry = CA_CURRENT_TIME;
sec = CA_RECAST_DELAY;
sec = (int) CA_RECAST_DELAY;
ca_static->ca_conn_retry_delay.tv_sec = sec;
ca_static->ca_conn_retry_delay.tv_usec =
(CA_RECAST_DELAY-sec)*USEC_PER_SEC;
(long) ((CA_RECAST_DELAY-sec)*USEC_PER_SEC);
UNLOCK;
@@ -1152,7 +1121,7 @@ int reply_type
mptr++;
strncpy((char *)mptr, (char *)(chix + 1), size);
CAC_ADD_MSG(piiu);
cac_add_msg(piiu);
/*
* increment the number of times we have tried this
@@ -1721,7 +1690,7 @@ void *pvalue
struct extmsg hdr;
int postcnt;
unsigned size_of_one;
int i;
unsigned i;
# ifdef CONVERSION_REQUIRED
void *pCvrtBuf;
void *pdest;
@@ -1777,6 +1746,8 @@ void *pvalue
case DBR_ENUM:
case DBR_SHORT:
case DBR_PUT_ACKT:
case DBR_PUT_ACKS:
# if DBR_INT != DBR_SHORT
case DBR_INT:
# endif /*DBR_INT != DBR_SHORT*/
@@ -1812,10 +1783,10 @@ void *pvalue
hdr.m_cmmd = htons(cmd);
hdr.m_type = htons(type);
hdr.m_count = htons(count);
hdr.m_count = htons((ca_uint16_t)count);
hdr.m_cid = chix->id.sid;
hdr.m_available = id;
hdr.m_postsize = postcnt;
hdr.m_postsize = (ca_uint16_t) postcnt;
status = cac_push_msg(piiu, &hdr, pvalue);
@@ -2033,7 +2004,6 @@ long mask
{
evid monix;
int status;
int size;
INITCHK;
LOOSECHIXCHK(chix);
@@ -2063,7 +2033,8 @@ long mask
if (!chix->piiu) {
# ifdef vxWorks
static int dbevsize;
int size;
static int dbevsize;
if(!dbevsize){
dbevsize = db_sizeof_event_block();
@@ -2098,7 +2069,7 @@ long mask
monix->p_delta = p_delta;
monix->n_delta = n_delta;
monix->timeout = timeout;
monix->mask = mask;
monix->mask = (unsigned short) mask;
# ifdef vxWorks
if(!chix->piiu){
@@ -2169,8 +2140,10 @@ int ca_request_event(evid monix)
unsigned count;
struct monops msg;
struct ioc_in_use *piiu;
ca_float32_t p_delta;
ca_float32_t n_delta;
ca_float32_t tmo;
piiu = chix->piiu;
/*
@@ -2201,10 +2174,14 @@ int ca_request_event(evid monix)
msg.m_header.m_postsize = sizeof(msg.m_info);
/* msg body */
htonf(&monix->p_delta, &msg.m_info.m_hval);
htonf(&monix->n_delta, &msg.m_info.m_lval);
htonf(&monix->timeout, &msg.m_info.m_toval);
p_delta = (ca_float32_t) monix->p_delta;
n_delta = (ca_float32_t) monix->n_delta;
tmo = (ca_float32_t) monix->timeout;
htonf(&p_delta, &msg.m_info.m_hval);
htonf(&n_delta, &msg.m_info.m_lval);
htonf(&tmo, &msg.m_info.m_toval);
msg.m_info.m_mask = htons(monix->mask);
msg.m_info.m_pad = 0; /* allow future use */
status = cac_push_msg(piiu, &msg.m_header, &msg.m_info);
@@ -2563,9 +2540,9 @@ int APIENTRY ca_clear_channel (chid chix)
/* msg header */
hdr.m_cmmd = htons(IOC_CLEAR_CHANNEL);
hdr.m_available = chix->cid;
hdr.m_cid = chix->id.sid;
hdr.m_type = htons(0);
hdr.m_count = htons(0);
hdr.m_cid = chix->id.sid;
hdr.m_postsize = 0;
status = cac_push_msg(piiu, &hdr, NULL);
@@ -2645,7 +2622,6 @@ void clearChannelResources(unsigned id)
int APIENTRY ca_pend(ca_real timeout, int early)
{
struct timeval beg_time;
struct timeval cur_time;
ca_real delay;
INITCHK;
@@ -2664,28 +2640,32 @@ int APIENTRY ca_pend(ca_real timeout, int early)
* Also takes care of outstanding recvs
* for single threaded clients
*/
#if 0
ca_flush_io();
#endif
if(pndrecvcnt<1 && early){
return ECA_NORMAL;
}
cac_gettimeval(&beg_time);
/*
* the current time set iderectly within ca_flush_io()
* above.
*/
beg_time = ca_static->currentTime;
delay = 0.0;
while(TRUE){
ca_real remaining;
struct timeval tmo;
if(pndrecvcnt<1 && early)
if (pndrecvcnt<1 && early) {
return ECA_NORMAL;
}
if(timeout == 0.0){
remaining = SELECT_POLL;
}
else{
cac_gettimeval (&cur_time);
delay = cac_time_diff (&cur_time, &beg_time);
remaining = timeout-delay;
if(remaining<=0.0){
if(early){
@@ -2700,9 +2680,17 @@ int APIENTRY ca_pend(ca_real timeout, int early)
remaining = min(SELECT_POLL, remaining);
}
tmo.tv_sec = remaining;
tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC;
tmo.tv_sec = (long) remaining;
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
cac_block_for_io_completion(&tmo);
/*
* the current time set within cac_block_for_io_completion()
* above.
*/
if (timeout != 0.0) {
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
}
}
}
@@ -2714,13 +2702,13 @@ ca_real cac_time_diff (ca_time *pTVA, ca_time *pTVB)
{
ca_real delay;
delay = pTVA->tv_sec - pTVB->tv_sec;
if(pTVA->tv_usec>pTVB->tv_usec){
delay = pTVA->tv_sec - pTVB->tv_sec;
delay += (pTVA->tv_usec - pTVB->tv_usec) /
(ca_real)(USEC_PER_SEC);
}
else{
delay -= 1.0;
delay = pTVA->tv_sec - pTVB->tv_sec - 1L;
delay += (USEC_PER_SEC - pTVB->tv_usec + pTVA->tv_usec) /
(ca_real)(USEC_PER_SEC);
}
@@ -3015,7 +3003,7 @@ int echo_request(struct ioc_in_use *piiu, ca_time *pCurrentTime)
phdr->m_available = htons(0);
phdr->m_postsize = 0;
CAC_ADD_MSG(piiu);
cac_add_msg(piiu);
piiu->echoPending = TRUE;
piiu->send_needed = TRUE;
@@ -3214,7 +3202,7 @@ LOCAL void ca_default_exception_handler(struct exception_handler_args args)
*/
LOCK;
sprintf(sprintf_buf,
"%s - with request chan=%s op=%d data type=%s count=%d\n",
"%s - with request chan=%s op=%d data type=%s count=%d",
args.ctx,
pName,
args.op,
@@ -3265,7 +3253,7 @@ int ca_defunct()
* currently implemented as a function
* (may be implemented as a MACRO in the future)
*/
char APIENTRY *ca_host_name_function(chid chix)
char * APIENTRY ca_host_name_function(chid chix)
{
IIU *piiu;
@@ -3353,3 +3341,51 @@ int ca_channel_status(int tid)
return ECA_NORMAL;
}
#endif /*vxWorks*/
/*
* ca_replace_printf_handler ()
*/
int APIENTRY ca_replace_printf_handler (
int (*ca_printf_func)(const char *pformat, va_list args)
)
{
if (ca_printf_func) {
ca_static->ca_printf_func = ca_printf_func;
}
else {
/*
* os dependent
*/
caSetDefaultPrintfHandler();
}
return ECA_NORMAL;
}
/*
* ca_printf()
*/
int ca_printf(char *pformat, ...)
{
int (*ca_printf_func)(const char *pformat, va_list args);
va_list theArgs;
int status;
va_start(theArgs, pformat);
ca_printf_func = epicsVprintf;
if (ca_static) {
if (ca_static->ca_printf_func) {
ca_printf_func = ca_static->ca_printf_func;
}
}
status = (*ca_printf_func) (pformat, theArgs);
va_end(theArgs);
return status;
}

View File

@@ -9,11 +9,17 @@ static char *sccsId = "@(#) $Id$";
#include <LIB$ROUTINES.H>
#endif
/*
* ANSI
*/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include "os_depen.h"
#include <epicsAssert.h>
#include <cadef.h>
#define EVENT_ROUTINE null_event
@@ -218,22 +224,22 @@ int doacctst(char *pname)
double dval = 3.3;
float fval = -8893.3;
double dret;
float fret;
double dret = DBL_MAX;
float fret = FLT_MAX;
status = ca_put(DBR_DOUBLE, chix1, &dval);
SEVCHK(status, NULL);
status = ca_get(DBR_DOUBLE, chix1, &dret);
SEVCHK(status, NULL);
ca_pend_io(30.0);
assert(dval - dret < .000001);
assert( fabs(dval-dret) < DBL_EPSILON*4);
status = ca_put(DBR_FLOAT, chix1, &fval);
SEVCHK(status, NULL);
status = ca_get(DBR_FLOAT, chix1, &fret);
SEVCHK(status, NULL);
ca_pend_io(30.0);
assert(fval - fret < .0001);
assert( fabs(fval-fret) < FLT_EPSILON*4);
}
/*
@@ -556,8 +562,8 @@ void conn_cb(struct event_handler_args args)
void test_sync_groups(chid chix)
{
int status;
CA_SYNC_GID gid1;
CA_SYNC_GID gid2;
CA_SYNC_GID gid1=0;
CA_SYNC_GID gid2=0;
printf("Performing sync group test...");
fflush(stdout);

View File

@@ -18,8 +18,8 @@ void caAddConfiguredAddr(
SOCKET socket,
int port);
int local_addr(SOCKET socket, struct sockaddr_in *plcladdr);
int local_addr(SOCKET socket, struct sockaddr_in *plcladdr);
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort);
union caAddr{
struct sockaddr_in inetAddr;

View File

@@ -42,13 +42,17 @@
*/
int cac_select_io(struct timeval *ptimeout, int flags)
{
/*
* Use auto timeout so there is no chance of
* recursive reuse of ptimeout
*/
struct timeval autoTimeOut = *ptimeout;
long status;
IIU *piiu;
unsigned long freespace;
int maxfd;
SOCKET maxfd;
caFDInfo *pfdi;
LOCK;
pfdi = (caFDInfo *) ellGet(&ca_static->fdInfoFreeList);
@@ -87,39 +91,59 @@ int cac_select_io(struct timeval *ptimeout, int flags)
}
if (flags&CA_DO_SENDS) {
if (cacRingBufferReadSize(&piiu->send, FALSE)>0) {
if (cacRingBufferReadSize(&piiu->send, FALSE)>0) {
maxfd = max (maxfd,piiu->sock_chan);
FD_SET (piiu->sock_chan, &pfdi->writeMask);
}
FD_SET (piiu->sock_chan, &pfdi->writeMask);
}
}
}
UNLOCK;
#if 0
printf( "max fd=%d tv_usec=%d tv_sec=%d\n",
maxfd,
ptimeout->tv_usec,
ptimeout->tv_sec);
#endif
# if 0
if (maxfd==0) {
printf( "max fd=%d tv_usec=%d tv_sec=%d\n",
maxfd,
ptimeout->tv_usec,
ptimeout->tv_sec);
}
# endif
#if defined(vxWorks) && 0
if(client_lock->recurse>0){
ca_printf("lock is on and we are going to sleep %d!",
client_lock->recurse);
taskSuspend(0);
}
#endif
# if 0 && defined(vxWorks)
if(client_lock->recurse>0){
ca_printf("lock is on and we are going to sleep %d!",
client_lock->recurse);
taskSuspend(0);
}
# endif
status = select(
maxfd+1,
&pfdi->readMask,
&pfdi->writeMask,
NULL,
ptimeout);
# if defined(__hpux)
status = select(
maxfd+1,
(int *)&pfdi->readMask,
(int *)&pfdi->writeMask,
(int *)NULL,
&autoTimeOut);
# else
status = select(
maxfd+1,
&pfdi->readMask,
&pfdi->writeMask,
NULL,
&autoTimeOut);
# endif
# if 0
if(status<0){
printf("leaving select stat=%d - %s \n",
status, strerror(MYERRNO) );
}
else if (status==0) {
printf("tmo in select\n");
}
# endif
cac_gettimeval (&ca_static->currentTime);
#if 0
printf("leaving select stat=%d errno=%d \n", status, MYERRNO);
#endif
if (status<0) {
if (MYERRNO == EINTR) {
}
@@ -145,13 +169,13 @@ printf("leaving select stat=%d errno=%d \n", status, MYERRNO);
continue;
}
if (FD_ISSET(piiu->sock_chan,&pfdi->writeMask)) {
(*piiu->sendBytes)(piiu);
}
if (FD_ISSET(piiu->sock_chan,&pfdi->readMask)) {
(*piiu->recvBytes)(piiu);
}
if (FD_ISSET(piiu->sock_chan,&pfdi->writeMask)) {
(*piiu->sendBytes)(piiu);
}
}
}

View File

@@ -19,11 +19,11 @@
*
*/
#include <assert.h>
#include <stdio.h>
#include <iocinf.h>
main()
{
ca_repeater();
assert(0);
ca_repeater ();
assert (0);
return (0);
}

View File

@@ -52,12 +52,7 @@ static char *sccsId = "@(#) $Id$";
* Dump error messages to the appropriate place
*
*/
#ifdef __STDC__
int ca_printf(char *pformat, ...)
#else
int ca_printf(va_alist)
va_dcl
#endif
{
va_list args;
int status;
@@ -65,29 +60,9 @@ va_dcl
va_start(args, pformat);
#if defined(vxWorks)
{
int logMsgArgs[6];
int i;
for(i=0; i< NELEMENTS(logMsgArgs); i++){
logMsgArgs[i] = va_arg(args, int);
}
status = logMsg(
pformat,
logMsgArgs[0],
logMsgArgs[1],
logMsgArgs[2],
logMsgArgs[3],
logMsgArgs[4],
logMsgArgs[5]);
}
status = mprintf(pformat, args);
#else
status = vfprintf(
stderr,
pformat,
args);
status = vfprintf(stderr, pformat, args);
#endif
va_end(args);

View File

@@ -1,30 +1,25 @@
/*
*
* CA performance test
*
* History
* joh 09-12-89 Initial release
* joh 12-20-94 portability
*
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
CA performance test
#include <epicsAssert.h>
#include <cadef.h>
History
joh 09-12-89 Initial release
*/
#ifdef VMS
#include <LIB$ROUTINES.H>
#ifndef LOCAL
#define LOCAL static
#endif
/* System includes */
#ifdef vxWorks
#include <vxWorks.h>
#include <taskLib.h>
#endif
#include <cadef.h>
#include <caerr.h>
#include <db_access.h>
#ifndef OK
#define OK 0
#endif
@@ -41,17 +36,44 @@
#define NELEMENTS(A) (sizeof (A) / sizeof ((A) [0]))
#endif
#define NUM 1
#define ITERATION_COUNT 10000
#define ITERATION_COUNT 1000
#define WAIT_FOR_ACK
chid chan_list[min(10000,ITERATION_COUNT)];
typedef struct testItem {
chid chix;
char name[40];
int type;
int count;
union db_access_val val;
}ti;
ti itemList[ITERATION_COUNT];
int catime (char *channelName);
typedef void tf (ti *pItems, unsigned iterations, unsigned *pInlineIter);
LOCAL void test (
ti *pItems,
unsigned iterations
);
LOCAL tf test_search;
LOCAL tf test_free;
LOCAL tf test_wait;
LOCAL tf test_put;
LOCAL tf test_wait;
LOCAL tf test_get;
void timeIt(
tf *pfunc,
ti *pItem,
unsigned iterations
);
#ifndef vxWorks
main(argc, argv)
int argc;
char **argv;
int main(int argc, char **argv)
{
char *pname;
@@ -61,167 +83,358 @@ char **argv;
}
else{
printf("usage: %s <channel name>", argv[0]);
return -1;
}
return 0;
}
#endif
catime(channelName)
char *channelName;
/*
* catime ()
*/
int catime (char *channelName)
{
chid ai_1;
long i;
unsigned strsize;
long status;
long i,j;
void *ptr;
int test_search(), test_free();
SEVCHK (ca_task_initialize(),"Unable to initialize");
SEVCHK(ca_task_initialize(),"Unable to initialize");
strsize = sizeof(itemList[i].name)-1;
for (i=0; i<NELEMENTS(itemList); i++) {
strncpy (
itemList[i].name,
channelName,
strsize);
itemList[i].name[strsize]= '\0';
itemList[i].count = 1;
}
printf ("search test\n");
timeIt (test_search, itemList, NELEMENTS(itemList));
SEVCHK(ca_search(channelName,&ai_1),NULL);
status = ca_pend_io(5.0);
SEVCHK(status,NULL);
if(status == ECA_TIMEOUT)
exit(OK);
printf (
"channel name=%s, native type=%d, native count=%d\n",
ca_name(itemList[0].chix),
ca_field_type(itemList[0].chix),
ca_element_count(itemList[0].chix));
ptr = (void *) malloc(NUM*sizeof(union db_access_val)+NUM*MAX_STRING_SIZE);
if(!ptr)
exit(OK);
for (i=0; i<NELEMENTS(itemList); i++) {
itemList[i].val.fltval = 0.0;
itemList[i].type = DBR_FLOAT;
}
printf ("float test\n");
test (itemList, NELEMENTS(itemList));
printf("channel name %s native type %d native count %d\n",ai_1+1,ai_1->type,ai_1->count);
printf("search test\n");
timex(test_search,channelName);
printf("free test\n");
timex(test_free,ai_1);
for (i=0; i<NELEMENTS(itemList); i++) {
strcpy(itemList[i].val.strval, "0.0");
itemList[i].type = DBR_STRING;
}
printf ("string test\n");
test (itemList, NELEMENTS(itemList));
for (i=0; i<NELEMENTS(itemList); i++) {
itemList[i].val.intval = 0;
itemList[i].type = DBR_INT;
}
printf ("interger test\n");
test (itemList, NELEMENTS(itemList));
for(i=0;i<NUM;i++)
((float *)ptr)[i] = 0.0;
test(ai_1, "DBR_FLOAT", DBR_FLOAT, NUM, ptr);
printf ("free test\n");
timeIt (test_free, itemList, NELEMENTS(itemList));
for(i=0;i<NUM;i++)
strcpy((char *)ptr+(MAX_STRING_SIZE*i),"0.0");
test(ai_1, "DBR_STRING", DBR_STRING, NUM, ptr);
SEVCHK (ca_task_exit (), "Unable to free resources at exit");
for(i=0;i<NUM;i++)
((int *)ptr)[i]=0;
test(ai_1, "DBR_INT", DBR_INT, NUM, ptr);
free(ptr);
exit(OK);
return OK;
}
test(chix, name, type, count, ptr)
chid chix;
char *name;
int type,count;
void *ptr;
/*
* test ()
*/
LOCAL void test (
ti *pItems,
unsigned iterations
)
{
int test_put(), test_get(), test_wait();
printf("%s\n",name);
timex(test_put,chix, name, type, count, ptr);
timex(test_get,chix, name, type, count, ptr);
timex(test_wait,chix, name, type, count, ptr);
printf ("\tasync put test\n");
timeIt (test_put, pItems, iterations);
printf ("\tasync get test\n");
timeIt (test_get, pItems, iterations);
printf ("\tsynch get test\n");
timeIt (test_wait, pItems, iterations);
}
#ifndef vxWorks
timex(pfunc, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
void (*pfunc)();
int arg1;
int arg2;
int arg3;
int arg4;
int arg5;
int arg6;
int arg7;
/*
* timeIt ()
*/
void timeIt(
tf *pfunc,
ti *pItems,
unsigned iterations
)
{
(*pfunc)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
TS_STAMP end_time;
TS_STAMP start_time;
double delay;
int status;
unsigned inlineIter;
}
#endif
test_search(name)
char *name;
{
int i;
for(i=0; i< NELEMENTS(chan_list);i++){
SEVCHK(ca_search(name,&chan_list[i]),NULL);
}
SEVCHK(ca_pend_io(0.0),NULL);
status = tsLocalTime(&start_time);
assert (status == S_ts_OK);
(*pfunc) (pItems, iterations, &inlineIter);
status = tsLocalTime(&end_time);
assert (status == S_ts_OK);
TsDiffAsDouble(&delay,&end_time,&start_time);
printf ("Elapsed Per Item = %f\n", delay/(iterations*inlineIter));
}
test_free(chix)
chid chix;
/*
* test_search ()
*/
LOCAL void test_search(
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
int i;
union db_access_val ival;
ti *pi;
int status;
for(i=0; i< NELEMENTS(chan_list);i++){
SEVCHK(ca_clear_channel(chan_list[i]),NULL);
}
#ifdef WAIT_FOR_ACK
SEVCHK(ca_array_get(DBR_INT,1,chix,&ival),NULL);
SEVCHK(ca_pend_io(0.0),NULL);
#else
SEVCHK(ca_flush_io(),NULL);
#endif
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_search (
pi->name,
&pi->chix);
SEVCHK (status, NULL);
}
status = ca_pend_io(0.0);
SEVCHK (status, NULL);
*pInlineIter = 1;
}
test_put(chix, name, type, count, ptr)
chid chix;
char *name;
int type,count;
void *ptr;
/*
* test_free ()
*/
LOCAL void test_free(
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
int i;
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_clear_channel (pi->chix);
SEVCHK (status, NULL);
}
*pInlineIter = 1;
}
/*
* test_put ()
*/
LOCAL void test_put(
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
ti *pi;
int status;
dbr_int_t val;
for(i=0; i< ITERATION_COUNT;i++){
SEVCHK(ca_array_put(type,count,chix,ptr),NULL);
#if 0
ca_flush_io();
#endif
}
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_put(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
}
#ifdef WAIT_FOR_ACK
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
SEVCHK(ca_pend_io(0.0),NULL);
#else
SEVCHK(ca_flush_io(),NULL);
status = ca_array_get (DBR_INT, 1, pItems[0].chix, &val);
SEVCHK (status, NULL);
status = ca_pend_io(100.0);
#endif
status = ca_array_put(
pItems[0].type,
pItems[0].count,
pItems[0].chix,
&pItems[0].val);
SEVCHK (status, NULL);
status = ca_flush_io();
SEVCHK (status, NULL);
*pInlineIter = 10;
}
test_get(chix, name, type, count, ptr)
chid chix;
char *name;
int type,count;
void *ptr;
/*
* test_get ()
*/
LOCAL void test_get(
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
int i;
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
}
status = ca_pend_io(100.0);
SEVCHK (status, NULL);
for(i=0; i< ITERATION_COUNT;i++){
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
#if 0
ca_flush_io();
#endif
}
SEVCHK(ca_pend_io(0.0),NULL);
*pInlineIter = 10;
}
test_wait(chix, name, type, count, ptr)
chid chix;
char *name;
int type,count;
void *ptr;
/*
* test_wait ()
*/
LOCAL void test_wait (
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
int i;
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
pi->count,
pi->chix,
&pi->val);
SEVCHK (status, NULL);
status = ca_pend_io(100.0);
SEVCHK (status, NULL);
}
for(i=0; i< ITERATION_COUNT;i++){
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
SEVCHK(ca_pend_io(0.0),NULL);
}
*pInlineIter = 1;
}

View File

@@ -66,9 +66,8 @@ LOCAL void retrySearchRequest(int silent);
void manage_conn(int silent)
{
IIU *piiu;
ca_time current;
ca_real delay;
unsigned long idelay;
long idelay;
/*
* prevent recursion
@@ -79,8 +78,6 @@ void manage_conn(int silent)
ca_static->ca_manage_conn_active = TRUE;
cac_gettimeval(&current);
/*
* issue connection heartbeat
* (if we dont see a beacon)
@@ -100,7 +97,7 @@ void manage_conn(int silent)
*/
if (piiu->sendPending) {
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&piiu->timeAtSendBlock);
if (delay>ca_static->ca_connectTMO) {
TAG_CONN_DOWN(piiu);
@@ -117,15 +114,15 @@ void manage_conn(int silent)
int rtmo;
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&piiu->timeAtEchoRequest);
stmo = delay > CA_RETRY_PERIOD;
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&piiu->timeAtLastRecv);
rtmo = delay > CA_RETRY_PERIOD;
if(stmo && rtmo && !piiu->sendPending){
piiu->timeAtEchoRequest = current;
piiu->timeAtEchoRequest = ca_static->currentTime;
noop_msg(piiu);
}
continue;
@@ -133,7 +130,7 @@ void manage_conn(int silent)
if(piiu->echoPending){
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&piiu->timeAtEchoRequest);
if (delay > CA_ECHO_TIMEOUT) {
/*
@@ -144,10 +141,10 @@ void manage_conn(int silent)
}
else{
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&piiu->timeAtLastRecv);
if (delay>ca_static->ca_connectTMO) {
echo_request(piiu, &current);
echo_request(piiu, &ca_static->currentTime);
}
}
@@ -159,10 +156,10 @@ void manage_conn(int silent)
*/
if (!ca_static->ca_repeater_contacted) {
delay = cac_time_diff (
&current,
&ca_static->currentTime,
&ca_static->ca_last_repeater_try);
if (delay > REPEATER_TRY_PERIOD) {
ca_static->ca_last_repeater_try = current;
ca_static->ca_last_repeater_try = ca_static->currentTime;
notify_ca_repeater();
}
}
@@ -181,13 +178,13 @@ void manage_conn(int silent)
if(ca_static->ca_conn_next_retry.tv_sec == CA_CURRENT_TIME.tv_sec &&
ca_static->ca_conn_next_retry.tv_usec == CA_CURRENT_TIME.tv_usec){
ca_static->ca_conn_next_retry = current;
ca_static->ca_conn_next_retry = ca_static->currentTime;
LOGRETRYINTERVAL
}
delay = cac_time_diff (
&ca_static->ca_conn_next_retry,
&current);
&ca_static->currentTime);
if (delay > 0.0) {
ca_static->ca_manage_conn_active = FALSE;
@@ -214,13 +211,13 @@ void manage_conn(int silent)
idelay = idelay << ca_static->ca_search_retry;
delay = idelay * CA_RECAST_DELAY; /* sec */
delay = min (CA_RECAST_PERIOD, delay);
idelay = delay;
idelay = (long) delay;
ca_static->ca_conn_retry_delay.tv_sec = idelay;
ca_static->ca_conn_retry_delay.tv_usec =
(delay-idelay)*USEC_PER_SEC;
(long) ((delay-idelay)*USEC_PER_SEC);
ca_static->ca_conn_next_retry =
cac_time_sum (
&current,
&ca_static->currentTime,
&ca_static->ca_conn_retry_delay);
LOGRETRYINTERVAL
@@ -347,18 +344,12 @@ LOCAL void logRetryInterval(char *pFN, unsigned lineno)
/*
*
*
* MARK_SERVER_AVAILABLE
*
*
*
*/
void mark_server_available(struct in_addr *pnet_addr)
{
chid chan;
ca_real currentPeriod;
ca_time currentTime;
bhe *pBHE;
unsigned port;
int netChange = FALSE;
@@ -373,8 +364,6 @@ void mark_server_available(struct in_addr *pnet_addr)
return;
}
cac_gettimeval(&currentTime);
LOCK;
/*
* look for it in the hash table
@@ -391,14 +380,14 @@ void mark_server_available(struct in_addr *pnet_addr)
* update time stamp and average period
*/
currentPeriod = cac_time_diff (
&currentTime,
&ca_static->currentTime,
&pBHE->timeStamp);
/*
* update the average
*/
pBHE->averagePeriod += currentPeriod;
pBHE->averagePeriod /= 2.0;
pBHE->timeStamp = currentTime;
pBHE->timeStamp = ca_static->currentTime;
if ((currentPeriod/4.0)>=pBHE->averagePeriod) {
#ifdef DEBUG
@@ -422,7 +411,7 @@ void mark_server_available(struct in_addr *pnet_addr)
netChange = TRUE;
}
if(pBHE->piiu){
pBHE->piiu->timeAtLastRecv = currentTime;
pBHE->piiu->timeAtLastRecv = ca_static->currentTime;
}
if(!netChange){
UNLOCK;
@@ -465,17 +454,17 @@ void mark_server_available(struct in_addr *pnet_addr)
{
ca_real diff;
ca_real delay;
unsigned idelay;
long idelay;
ca_time ca_delay;
ca_time next;
delay = (port&CA_RECAST_PORT_MASK);
delay /= MSEC_PER_SEC;
delay += CA_RECAST_DELAY;
idelay = delay;
idelay = (long) delay;
ca_delay.tv_sec = idelay;
ca_delay.tv_usec = (delay-idelay) * USEC_PER_SEC;
next = cac_time_sum(&currentTime, &ca_delay);
ca_delay.tv_usec = (long) ((delay-idelay) * USEC_PER_SEC);
next = cac_time_sum(&ca_static->currentTime, &ca_delay);
diff = cac_time_diff(
&ca_static->ca_conn_next_retry,
@@ -484,10 +473,10 @@ void mark_server_available(struct in_addr *pnet_addr)
ca_static->ca_conn_next_retry = next;
LOGRETRYINTERVAL
}
idelay = CA_RECAST_DELAY;
idelay = (long) CA_RECAST_DELAY;
ca_static->ca_conn_retry_delay.tv_sec = idelay;
ca_static->ca_conn_retry_delay.tv_usec =
(CA_RECAST_DELAY-idelay) * USEC_PER_SEC;
(long) ((CA_RECAST_DELAY-idelay) * USEC_PER_SEC);
ca_static->ca_search_retry = 0;
}

View File

@@ -35,11 +35,6 @@ static char *sccsId = "@(#) $Id$";
#include "iocinf.h"
#include "net_convert.h"
void htond(double *pHost, double *pNet);
void ntohd(double *pNet, double *pHost);
void htonf(float *pHost, float *pNet);
void ntohf(float *pNet, float *pHost);
/*
* if hton is true then it is a host to network conversion
* otherwise vise-versa
@@ -1374,7 +1369,7 @@ unsigned long num /* number of values */
}
#ifdef CA_FLOAT_MIT
#if defined(CA_FLOAT_MIT)
/************************************************************************/
/* double convert */
/* (THIS ASSUMES IEEE IS THE NETWORK FLOATING POINT FORMAT) */
@@ -1383,7 +1378,7 @@ unsigned long num /* number of values */
/* (this includes mapping of fringe reals to zero or infinity) */
/* (byte swaps included in conversion */
struct ieeedbl{
struct ieeedbl {
unsigned int mant2 : 32;
unsigned int mant1 : 20;
unsigned int exp : 11;
@@ -1396,7 +1391,7 @@ struct ieeedbl{
/* -1022<exp<1024 with mantissa of form 1.mant */
#define DBLEXPMINIEEE -1022 /* min for norm # IEEE exponent */
struct mitdbl{
struct mitdbl {
unsigned int mant1 : 7;
unsigned int exp : 8;
unsigned int sign : 1;
@@ -1413,7 +1408,6 @@ struct mitdbl{
#define DBLEXPMAXMIT 126 /* max MIT exponent */
#define DBLEXPMINMIT -128 /* min MIT exponent */
void htond(double *pHost, double *pNet)
{
double copyin;
@@ -1538,19 +1532,19 @@ struct mitflt{
void htonf(float *pHost, float *pNet)
{
struct mitflt *pMIT = pHost;
struct ieeeflt *pIEEE = pNet;
struct mitflt *pMIT = (struct mitflt *) pHost;
struct ieeeflt *pIEEE = (struct ieeeflt *) pNet;
long exp,mant,sign;
sign = pHost->sign;
sign = pMIT->sign;
if( (short)(pMIT->exp < EXPMINIEEE + MIT_SB){
if( ((int)pMIT->exp) < EXPMINIEEE + MIT_SB){
exp = 0;
mant = 0;
sign = 0;
}
else{
exp = (short)pMIT->exp-MIT_SB+IEEE_SB;
exp = ((int)pMIT->exp)-MIT_SB+IEEE_SB;
mant = (pMIT->mant1<<16) | pMIT->mant2;
}
pIEEE->mant = mant;
@@ -1566,12 +1560,12 @@ void htonf(float *pHost, float *pNet)
*/
void ntohf(float *pNet, float *pHost)
{
struct mitflt *pMIT = pHost;
struct ieeeflt *pIEEE = pNet;
struct mitflt *pMIT = (struct mitflt *) pHost;
struct ieeeflt *pIEEE = (struct ieeeflt *) pNet;
long exp,mant2,mant1,sign;
*(ca_uint32_t *)pIEEE = ntohl(*(ca_uint32_t *)pIEEE);
if( (short) pIEEE->exp > EXPMAXMIT + IEEE_SB){
if( ((int)pIEEE->exp) > EXPMAXMIT + IEEE_SB){
sign = pIEEE->sign;
exp = EXPMAXMIT + MIT_SB;
mant2 = ~0;
@@ -1598,7 +1592,7 @@ void ntohf(float *pNet, float *pHost)
#endif /*CA_FLOAT_MIT*/
#ifndef CA_FLOAT_MIT
#if defined(CA_FLOAT_IEEE) && 0
/*
* htond ()
@@ -1606,6 +1600,7 @@ void ntohf(float *pNet, float *pHost)
*/
void htond (double *IEEEhost, double *IEEEnet)
{
#ifdef CA_LITTLE_ENDIAN
ca_uint32_t *pHost = (ca_uint32_t *) IEEEhost;
ca_uint32_t *pNet = (ca_uint32_t *) IEEEnet;
ca_uint32_t tmp;
@@ -1618,6 +1613,9 @@ void htond (double *IEEEhost, double *IEEEnet)
tmp = pHost[0];
pNet[0] = htonl (pHost[1]);
pNet[1] = htonl (tmp);
#else
*IEEEnet = *IEEEhost;
#endif
}
/*
@@ -1626,6 +1624,7 @@ void htond (double *IEEEhost, double *IEEEnet)
*/
void ntohd (double *IEEEnet, double *IEEEhost)
{
#ifdef CA_LITTLE_ENDIAN
ca_uint32_t *pHost = (ca_uint32_t *) IEEEhost;
ca_uint32_t *pNet = (ca_uint32_t *) IEEEnet;
ca_uint32_t tmp;
@@ -1638,6 +1637,9 @@ void ntohd (double *IEEEnet, double *IEEEhost)
tmp = pNet[0];
pHost[0] = ntohl (pNet[1]);
pHost[1] = htonl (tmp);
#else
*IEEEhost = *IEEEnet;
#endif
}
/*
@@ -1664,7 +1666,7 @@ void htonf (float *IEEEhost, float *IEEEnet)
*pNet = htonl (*pHost);
}
#endif /* not CA_MIT_FLOAT*/
#endif /* IEEE float and little endian */

View File

@@ -50,8 +50,8 @@ static char *sccsId = "@(#) $Id$";
void flow_control(struct ioc_in_use *piiu)
{
unsigned nbytes;
register int status;
register int busy = piiu->client_busy;
int status;
int busy = piiu->client_busy;
LOCK;
@@ -95,6 +95,5 @@ void flow_control(struct ioc_in_use *piiu)
}
UNLOCK;
return;
}

View File

@@ -79,7 +79,9 @@ int local_addr(int s, struct sockaddr_in *plcladdr)
ifconf.ifc_req = ifreq;
status = socket_ioctl(s, SIOCGIFCONF, &ifconf);
if (status < 0 || ifconf.ifc_len == 0) {
ca_printf("CAC: ioctl failed %s\n", strerror(MYERRNO));
ca_printf(
"CAC: ioctl failed because \"%s\"\n",
strerror(MYERRNO));
ifconf.ifc_len = 0;
}
@@ -145,7 +147,7 @@ int local_addr(int s, struct sockaddr_in *plcladdr)
#if 0
/*
* An alternate sloution
* An alternate solution
* for os without the if routines
*/
/*

View File

@@ -73,7 +73,6 @@ static char *sccsId = "@(#) $Id$";
#define CA_GLBLSOURCE
#include "iocinf.h"
#include "net_convert.h"
#include <netinet/tcp.h>
LOCAL void tcp_recv_msg(struct ioc_in_use *piiu);
LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu);
@@ -188,6 +187,7 @@ int net_proto
UNLOCK;
return ECA_ALLOCMEM;
}
memset((char *)&pNode->destAddr,0,sizeof(pNode->destAddr));
pNode->destAddr.inetAddr.sin_family = AF_INET;
pNode->destAddr.inetAddr.sin_addr = *pnet_addr;
pNode->destAddr.inetAddr.sin_port =
@@ -219,7 +219,7 @@ int net_proto
IPPROTO_TCP,
TCP_NODELAY,
(char *)&true,
sizeof true);
sizeof(true));
if(status < 0){
free(piiu);
status = socket_close(sock);
@@ -270,57 +270,53 @@ int net_proto
#endif
#ifdef CA_SET_TCP_BUFFER_SIZES
/* set TCP buffer sizes */
i = MAX_MSG_SIZE;
status = setsockopt(
sock,
SOL_SOCKET,
SO_SNDBUF,
&i,
sizeof(i));
if(status < 0){
free(piiu);
status = socket_close(sock);
if(status<0){
SEVCHK(ECA_INTERNAL,NULL);
}
UNLOCK;
return ECA_SOCK;
}
i = MAX_MSG_SIZE;
status = setsockopt(
sock,
SOL_SOCKET,
SO_RCVBUF,
&i,
sizeof(i));
if(status < 0){
free(piiu);
status = socket_close(sock);
if(status<0){
SEVCHK(ECA_INTERNAL,NULL);
}
UNLOCK;
return ECA_SOCK;
}
{
int i;
int size;
/* fetch the TCP send buffer size */
i = sizeof(piiu->tcp_send_buff_size);
status = getsockopt(
sock,
SOL_SOCKET,
SO_SNDBUF,
(char *)&piiu->tcp_send_buff_size,
&i);
if(status < 0 || i != sizeof(piiu->tcp_send_buff_size)){
free(piiu);
status = socket_close(sock);
if(status<0){
SEVCHK(ECA_INTERNAL,NULL);
/* set TCP buffer sizes */
i = MAX_MSG_SIZE;
status = setsockopt(
sock,
SOL_SOCKET,
SO_SNDBUF,
&i,
sizeof(i));
if(status < 0){
free(piiu);
socket_close(sock);
UNLOCK;
return ECA_SOCK;
}
UNLOCK;
return ECA_SOCK;
}
i = MAX_MSG_SIZE;
status = setsockopt(
sock,
SOL_SOCKET,
SO_RCVBUF,
&i,
sizeof(i));
if(status < 0){
free(piiu);
socket_close(sock);
UNLOCK;
return ECA_SOCK;
}
/* fetch the TCP send buffer size */
i = sizeof(size);
status = getsockopt(
sock,
SOL_SOCKET,
SO_SNDBUF,
(char *)&size,
&i);
if(status < 0 || i != sizeof(size)){
free(piiu);
socket_close(sock);
UNLOCK;
return ECA_SOCK;
}
}
#endif
/* connect */
@@ -342,20 +338,6 @@ int net_proto
cacRingBufferInit(&piiu->recv, sizeof(piiu->send.buf));
cacRingBufferInit(&piiu->send, sizeof(piiu->send.buf));
/*
* Set non blocking IO
* to prevent dead locks
*/
status = socket_ioctl(
piiu->sock_chan,
FIONBIO,
&true);
if(status<0){
ca_printf(
"Error setting non-blocking io: %s\n",
strerror(MYERRNO));
}
/*
* Save the Host name for efficient access in the
* future.
@@ -435,6 +417,7 @@ int net_proto
sock,
ca_static->ca_server_port);
cacRingBufferInit(&piiu->recv, sizeof(piiu->send.buf));
cacRingBufferInit(&piiu->send, min(MAX_UDP,
sizeof(piiu->send.buf)));
@@ -443,7 +426,6 @@ int net_proto
piiu->host_name_str,
"<<unknown host>>",
sizeof(piiu->host_name_str)-1);
break;
default:
@@ -456,6 +438,20 @@ int net_proto
return ECA_INTERNAL;
}
/*
* Set non blocking IO
* to prevent dead locks
*/
status = socket_ioctl(
piiu->sock_chan,
FIONBIO,
&true);
if(status<0){
ca_printf(
"Error setting non-blocking io: %s\n",
strerror(MYERRNO));
}
if(fd_register_func){
LOCKEVENTS;
(*fd_register_func)(fd_register_arg, sock, TRUE);
@@ -571,21 +567,34 @@ void notify_ca_repeater()
LOCK; /*MULTINET TCP/IP routines are not reentrant*/
status = local_addr(piiuCast->sock_chan, &saddr);
if (status == OK) {
int len;
memset((char *)&msg, 0, sizeof(msg));
msg.m_cmmd = htons(REPEATER_REGISTER);
msg.m_available = saddr.sin_addr.s_addr;
saddr.sin_port = htons(ca_static->ca_repeater_port);
/*
* Intentionally sending a zero length message here
* until most CA repeater daemons have been restarted
* (and only then will accept the above protocol)
* (repeaters began accepting this protocol
* starting with EPICS 3.12)
*
* SOLARIS will not accept a zero length message
* and we are just porting there for 3.12 so
* we will use the new protocol for 3.12
*/
# ifdef SOLARIS
len = sizeof(msg);
# else /* SOLARIS */
len = 0;
# endif /* SOLARIS */
status = sendto(
piiuCast->sock_chan,
(char *)&msg, /* UCX requires a valid address here */
0, /* <= sizeof(msg) ! see comment above ! */
len,
0,
(struct sockaddr *)&saddr,
sizeof(saddr));
@@ -641,6 +650,8 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
pNode = (caAddrNode *) piiu->destAddr.node.next;
while(pNode){
unsigned long actualSendCnt;
status = sendto(
piiu->sock_chan,
&piiu->send.buf[piiu->send.rdix],
@@ -649,18 +660,27 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
&pNode->destAddr.sockAddr,
sizeof(pNode->destAddr.sockAddr));
if(status<0){
if( MYERRNO != EWOULDBLOCK &&
MYERRNO != ENOBUFS &&
MYERRNO != EINTR){
int localErrno;
localErrno = MYERRNO;
if( localErrno == EWOULDBLOCK &&
localErrno == ENOBUFS &&
localErrno == EINTR){
UNLOCK;
return;
}
else {
ca_printf(
"CAC: error on socket send() %s\n",
strerror(MYERRNO));
strerror(localErrno));
}
TAG_CONN_DOWN(piiu);
break;
}
assert(status == sendCnt);
actualSendCnt = (unsigned long) status;
assert (actualSendCnt == sendCnt);
pNode = (caAddrNode *) pNode->node.next;
}
@@ -687,6 +707,7 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
{
unsigned long sendCnt;
int status;
int localError;
/*
* check for shutdown in progress
@@ -697,55 +718,69 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
LOCK;
sendCnt = cacRingBufferReadSize(&piiu->send, TRUE);
assert(sendCnt<=piiu->send.max_msg);
/*
* return if nothing to send
* Check at least twice to see if there is anything
* in the ring buffer (in case the block of messages
* isnt continuous). Always return if the send was
* less bytes than requested.
*/
if(sendCnt == 0){
UNLOCK;
return;
}
while (TRUE) {
sendCnt = cacRingBufferReadSize(&piiu->send, TRUE);
assert(sendCnt<=piiu->send.max_msg);
status = send(
piiu->sock_chan,
&piiu->send.buf[piiu->send.rdix],
sendCnt,
0);
if(status>=0){
assert(status<=sendCnt);
piiu->sendPending = FALSE;
CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status);
sendCnt = cacRingBufferReadSize(&piiu->send, FALSE);
if(sendCnt==0){
/*
* return if nothing to send
*/
if(sendCnt == 0){
# ifdef DEBUG
if (piiu->sendPending) {
printf ("-Unblocked-\n");
}
# endif /* DEBUG */
piiu->sendPending = FALSE;
piiu->send_needed = FALSE;
UNLOCK;
return;
}
UNLOCK;
return;
status = send(
piiu->sock_chan,
&piiu->send.buf[piiu->send.rdix],
sendCnt,
0);
if (status<0) {
break;
}
else if (status==0) {
TAG_CONN_DOWN(piiu);
UNLOCK;
return;
}
CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status);
if (status != sendCnt) {
UNLOCK;
return;
}
}
if( MYERRNO == EWOULDBLOCK ||
MYERRNO == ENOBUFS ||
MYERRNO == EINTR){
localError = MYERRNO;
if( localError == EWOULDBLOCK ||
localError == ENOBUFS ||
localError == EINTR){
UNLOCK;
if(!piiu->sendPending){
cac_gettimeval(&piiu->timeAtSendBlock);
piiu->sendPending = TRUE;
}
return;
}
if( MYERRNO != EPIPE &&
MYERRNO != ECONNRESET &&
MYERRNO != ETIMEDOUT){
if( localError != EPIPE &&
localError != ECONNRESET &&
localError != ETIMEDOUT){
ca_printf(
"CAC: error on socket send() %s\n",
strerror(MYERRNO));
strerror(localError));
}
TAG_CONN_DOWN(piiu);
@@ -781,7 +816,6 @@ void cac_flush_internal()
UNLOCK;
}
/*
* cac_clean_iiu_list()
@@ -816,14 +850,16 @@ void ca_process_input_queue()
{
struct ioc_in_use *piiu;
LOCK;
/*
* dont allow recursion
* dont allow recursion
*/
if(post_msg_active){
UNLOCK;
return;
}
LOCK;
for( piiu=(IIU *)iiuList.node.next;
piiu;
piiu=(IIU *)piiu->node.next){
@@ -834,9 +870,12 @@ void ca_process_input_queue()
(*piiu->procInput)(piiu);
}
UNLOCK;
#if 0
cac_flush_internal();
#endif
}
@@ -856,56 +895,59 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
LOCK;
writeSpace = cacRingBufferWriteSize(&piiu->recv, TRUE);
if(writeSpace == 0){
UNLOCK;
return;
}
/*
* Check at least twice to see if there is ana space left
* in the ring buffer (in case the messages block
* isnt continuous). Always return if the send was
* less bytes than requested.
*/
while (TRUE) {
status = recv( piiu->sock_chan,
&piiu->recv.buf[piiu->recv.wtix],
writeSpace,
0);
if(status == 0){
TAG_CONN_DOWN(piiu);
UNLOCK;
return;
}
else if(status <0){
/* try again on status of -1 and no luck this time */
if(MYERRNO == EWOULDBLOCK || MYERRNO == EINTR){
UNLOCK;
return;
writeSpace = cacRingBufferWriteSize(&piiu->recv, TRUE);
if(writeSpace == 0){
break;
}
if( MYERRNO != EPIPE &&
MYERRNO != ECONNRESET &&
MYERRNO != ETIMEDOUT){
ca_printf(
"CAC: unexpected recv error (err=%s)\n",
strerror(MYERRNO));
status = recv( piiu->sock_chan,
&piiu->recv.buf[piiu->recv.wtix],
writeSpace,
0);
if(status == 0){
TAG_CONN_DOWN(piiu);
break;
}
TAG_CONN_DOWN(piiu);
UNLOCK;
return;
}
else if(status <0){
/* try again on status of -1 and no luck this time */
if(MYERRNO == EWOULDBLOCK || MYERRNO == EINTR){
break;
}
if( MYERRNO != EPIPE &&
MYERRNO != ECONNRESET &&
MYERRNO != ETIMEDOUT){
ca_printf(
"CAC: unexpected recv error (err=%s)\n",
strerror(MYERRNO));
}
TAG_CONN_DOWN(piiu);
break;
}
if(status>MAX_MSG_SIZE){
ca_printf( "CAC: recv_msg(): message overflow %l\n",
status-MAX_MSG_SIZE);
TAG_CONN_DOWN(piiu);
UNLOCK;
return;
}
assert (status<=writeSpace);
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
/*
* Record the time whenever we receive a message
* from this IOC
*/
piiu->timeAtLastRecv = ca_static->currentTime;
if (status != writeSpace) {
break;
}
}
/*
* Record the time whenever we receive a message
* from this IOC
*/
cac_gettimeval(&piiu->timeAtLastRecv);
UNLOCK;
return;
@@ -922,18 +964,20 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu)
int status;
long bytesToProcess;
LOCK;
/*
* dont allow recursion
*/
if(post_msg_active){
UNLOCK;
return;
}
pNode = (caAddrNode *) piiu->destAddr.node.next;
post_msg_active = TRUE;
LOCK;
pNode = (caAddrNode *) piiu->destAddr.node.next;
while(TRUE){
bytesToProcess = cacRingBufferReadSize(&piiu->recv, TRUE);
if(bytesToProcess == 0){
@@ -956,9 +1000,9 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu)
&piiu->recv,
bytesToProcess);
}
UNLOCK;
post_msg_active = FALSE;
UNLOCK;
flow_control(piiu);
@@ -1059,17 +1103,18 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
char *pBuf;
unsigned long bytesAvailable;
LOCK;
/*
* dont allow recursion
*/
if(post_msg_active){
UNLOCK;
return;
}
post_msg_active = TRUE;
LOCK;
while(TRUE){
bytesAvailable = cacRingBufferReadSize(&piiu->recv, TRUE);
@@ -1117,9 +1162,8 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
bytesAvailable);
}
UNLOCK;
post_msg_active = FALSE;
UNLOCK;
return;
}
@@ -1174,15 +1218,15 @@ void close_ioc (struct ioc_in_use *piiu)
chix = (chid) &piiu->chidlist.node.next;
while (chix = (chid) chix->node.next) {
chix->type = TYPENOTCONN;
chix->count = 0;
chix->count = 0U;
chix->state = cs_prev_conn;
chix->id.sid = ~0L;
chix->id.sid = ~0U;
chix->ar.read_access = FALSE;
chix->ar.write_access = FALSE;
/*
* try to reconnect
*/
chix->retry = 0;
chix->retry = 0U;
}
if (piiu->chidlist.count) {
@@ -1507,6 +1551,8 @@ unsigned long cacRingBufferWriteSize(struct ca_buffer *pBuf, int contiguous)
* vxWorks user will need to configure a DNS format name for the
* host name if they wish to be cnsistent with UNIX and VMS hosts.
*
* this needs to attempt to determine if the process is a remote
* login - hard to do under UNIX
*/
char *localHostName()
{
@@ -1564,6 +1610,7 @@ void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv,
}
while(pToken = getToken(&pStr)){
memset((char *)&addr,0,sizeof(addr));
addr.inetAddr.sin_family = AF_INET;
addr.inetAddr.sin_port = htons(port);
addr.inetAddr.sin_addr.s_addr = inet_addr(pToken);
@@ -1654,32 +1701,38 @@ void caPrintAddrList(ELLLIST *pList)
/*
* caFetchPortConfig()
*/
unsigned caFetchPortConfig(ENV_PARAM *pEnv, unsigned defaultPort)
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
{
long longStatus;
long port;
long epicsParam;
int port;
longStatus = envGetLongConfigParam(pEnv, &port);
longStatus = envGetLongConfigParam(pEnv, &epicsParam);
if (longStatus!=0) {
port = defaultPort;
epicsParam = defaultPort;
ca_printf ("EPICS \"%s\" integer fetch failed\n", pEnv->name);
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, port);
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, epicsParam);
}
/*
* Thus must be a server port that will fit in a signed
* This must be a server port that will fit in a signed
* short
*/
if (port <= IPPORT_USERRESERVED || port>SHRT_MAX) {
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>SHRT_MAX) {
ca_printf ("EPICS \"%s\" out of range\n", pEnv->name);
/*
* Quit if the port is wrong due CA coding error
*/
assert (port != defaultPort);
port = defaultPort;
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, port);
assert (epicsParam != defaultPort);
epicsParam = defaultPort;
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, epicsParam);
}
/*
* ok to clip to int here because we checked the range
*/
port = (int) epicsParam;
return port;
}

View File

@@ -80,11 +80,11 @@ HDRVERSIONID(iocinfh, "$Id$")
*/
#include <ctype.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
/*
@@ -95,10 +95,12 @@ HDRVERSIONID(iocinfh, "$Id$")
/*
* EPICS includes
*/
#include <epicsAssert.h>
#include <cadef.h>
#include <bucketLib.h>
#include <ellLib.h>
#include <envDefs.h>
#include <epicsPrint.h>
/*
* CA private includes
@@ -118,8 +120,8 @@ HDRVERSIONID(iocinfh, "$Id$")
# define NBBY 8 /* number of bits per byte */
#endif
#define MSEC_PER_SEC 1000
#define USEC_PER_SEC 1000000
#define MSEC_PER_SEC 1000L
#define USEC_PER_SEC 1000000L
/*
* catch when they use really large strings
@@ -168,8 +170,8 @@ struct pending_io_event{
typedef struct timeval ca_time;
#define LD_CA_TIME(FLOAT_TIME,PCATIME) \
((PCATIME)->tv_sec = (FLOAT_TIME), \
(PCATIME)->tv_usec = ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC)
((PCATIME)->tv_sec = (long) (FLOAT_TIME), \
(PCATIME)->tv_usec = (long) ( ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC ))
/*
* dont adjust
@@ -188,8 +190,8 @@ extern const ca_time CA_CURRENT_TIME;
*/
#define MAXCONNTRIES 30 /* N conn retries on unchanged net */
#define SELECT_POLL (0.1) /* units sec - polls into recast */
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
#define SELECT_POLL (0.05) /* units sec - polls into recast */
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
#define CA_RECAST_PORT_MASK 0xff /* random retry interval off port */
#define CA_RECAST_PERIOD (5.0) /* ul on retry period long term (sec) */
@@ -212,7 +214,7 @@ extern const ca_time CA_CURRENT_TIME;
#define CA_RETRY_PERIOD 5 /* int sec to next keepalive */
#define N_REPEATER_TRIES_PRIOR_TO_MSG 50
#define REPEATER_TRY_PERIOD (0.1)
#define REPEATER_TRY_PERIOD (1.0)
#ifdef vxWorks
typedef struct caclient_put_notify{
@@ -316,7 +318,7 @@ struct ca_buffer{
#define TAG_CONN_DOWN(PIIU) \
( \
/*ca_printf("Tagging connection down at %d in %s\n", __LINE__, __FILE__),*/ \
/* ca_printf("Tagging connection down at %d in %s\n", __LINE__, __FILE__), */\
(PIIU)->conn_up = FALSE \
)
@@ -395,6 +397,7 @@ struct ca_static{
ELLLIST putCvrtBuf;
ELLLIST fdInfoFreeList;
ELLLIST fdInfoList;
ca_time currentTime;
ca_time ca_conn_next_retry;
ca_time ca_conn_retry_delay;
ca_time ca_last_repeater_try;
@@ -409,6 +412,7 @@ struct ca_static{
void (*ca_connection_func)
(struct connection_handler_args);
void *ca_connection_arg;
int (*ca_printf_func)(const char *pformat, va_list args);
void (*ca_fd_register_func)
(void *, SOCKET, int);
void *ca_fd_register_arg;
@@ -591,6 +595,7 @@ ca_real cac_time_diff(ca_time *pTVA, ca_time *pTVB);
ca_time cac_time_sum(ca_time *pTVA, ca_time *pTVB);
void caIOBlockFree(evid pIOBlock);
void clearChannelResources(unsigned id);
void caSetDefaultPrintfHandler ();
/*
* !!KLUDGE!!

View File

@@ -82,7 +82,7 @@ typedef float ca_float32_t;
#define IOC_WRITE 4 /* write a channel value */
#define IOC_SNAPSHOT 5 /* snapshot of the system */
#define IOC_SEARCH 6 /* IOC channel search */
/* 7 */
#define IOC_BUILD 7 /* build - obsolete */
#define IOC_EVENTS_OFF 8 /* flow control */
#define IOC_EVENTS_ON 9 /* flow control */
#define IOC_READ_SYNC 10 /* purge old reads */
@@ -91,7 +91,7 @@ typedef float ca_float32_t;
#define IOC_RSRV_IS_UP 13 /* CA server has joined the net */
#define IOC_NOT_FOUND 14 /* channel not found */
#define IOC_READ_NOTIFY 15 /* add a one shot event */
/* 16 */
#define IOC_READ_BUILD 16 /* read and build - obsolete */
#define REPEATER_CONFIRM 17 /* registration confirmation */
#define IOC_CLAIM_CIU 18 /* client claims resource in server */
#define IOC_WRITE_NOTIFY 19 /* notify after write chan value */

View File

@@ -63,10 +63,30 @@
# endif
#endif
#if !defined(MIT_FLOAT) && !defined(CA_LITTLE_ENDIAN)
#define htond(IEEEhost, IEEEnet) (*(double *)(IEEEnet) = *(double *)(IEEEhost))
#define ntohd(IEEEnet, IEEEhost) (*(double *)(IEEEhost) = *(double *)(IEEEnet))
#define htonf(IEEEhost, IEEEnet) (*(float *)(IEEEnet) = *(float *)(IEEEhost))
#define ntohf(IEEEnet, IEEEhost) (*(float *)(IEEEhost) = *(float *)(IEEEnet))
#if defined(CA_FLOAT_IEEE) && !defined(CA_LITTLE_ENDIAN)
# define htond(IEEEhost, IEEEnet) \
(*(double *)(IEEEnet) = *(double *)(IEEEhost))
# define ntohd(IEEEnet, IEEEhost) \
(*(double *)(IEEEhost) = *(double *)(IEEEnet))
# define htonf(IEEEhost, IEEEnet) \
(*(float *)(IEEEnet) = *(float *)(IEEEhost))
# define ntohf(IEEEnet, IEEEhost) \
(*(float *)(IEEEhost) = *(float *)(IEEEnet))
#elif defined(CA_FLOAT_IEEE) && defined(CA_LITTLE_ENDIAN)
# define ntohf(NET,HOST) \
{*((u_long *)(HOST)) = ntohl(*((u_long *)(NET )));}
# define htonf(HOST,NET) \
{*((u_long *)(NET) ) = htonl(*((u_long *)(HOST)));}
# define ntohd(NET,HOST) \
{ ((u_long *)(HOST))[1] = ntohl(((u_long *)(NET))[0]) ; \
((u_long *)(HOST))[0] = ntohl(((u_long *)(NET))[1]) ;}
# define htond(HOST,NET) \
{ ((u_long *)(NET))[1] = htonl(((u_long *)(HOST))[0]) ; \
((u_long *)(NET))[0] = htonl(((u_long *)(HOST))[1]) ;}
#else
void htond(double *pHost, double *pNet);
void ntohd(double *pNet, double *pHost);
void htonf(float *pHost, float *pNet);
void ntohf(float *pNet, float *pHost);
#endif

View File

@@ -37,13 +37,18 @@ static char *sccsId = "@(#) $Id$";
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#ifdef _WINDOWS
# include <winsock.h>
#else
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <netdb.h>
#endif
#include <epicsAssert.h>
/*
@@ -55,7 +60,7 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
struct hostent *ent;
ent = gethostbyaddr(
pnet_addr,
(char *) pnet_addr,
sizeof(*pnet_addr),
AF_INET);
if(ent){

View File

@@ -24,6 +24,7 @@
* pairs reside at the same C bracket level
* .11 GeG 120992 support VMS/UCX
* .12 CJM 130794 define MYERRNO properly for UCX
* .13 CJM 311094 mods to support DEC C compiler
*
*/
@@ -39,6 +40,7 @@ static char *os_depenhSccsId = "$Id$";
* each socket library
*/
#ifdef UNIX
# include <unistd.h>
# include <errno.h>
# include <sys/types.h>
# include <sys/time.h>
@@ -46,7 +48,9 @@ static char *os_depenhSccsId = "$Id$";
# include <sys/param.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netinet/tcp.h>
# include <net/if.h>
# include <arpa/inet.h>
# define CA_OS_CONFIGURED
#endif
@@ -57,6 +61,7 @@ static char *os_depenhSccsId = "$Id$";
# include <sys/ioctl.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <netinet/tcp.h>
# include <net/if.h>
# include <systime.h>
@@ -93,9 +98,13 @@ static char *os_depenhSccsId = "$Id$";
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# define __TIME_LOADED /* dont include VMS CC time.h under MULTINET */
# include <netinet/tcp.h>
#if !defined(UCX)
# include <sys/time.h>
# include <tcp/errno.h>
# include <tcp/errno.h>
#else
# include <errno>
#endif
# include <ssdef>
# include <stsdef>
# include <iodef.h>
@@ -104,12 +113,12 @@ static char *os_depenhSccsId = "$Id$";
# include <descrip.h>
# define MAXHOSTNAMELEN 75
#ifdef UCX /* GeG 09-DEC-1992 */
# include <sys/ucx$inetdef.h>
# include <ucx.h>
# include <sys/ucx$inetdef.h>
# include <ucx.h>
#else
# include <net/if.h>
# include <vms/inetiodef.h>
# include <sys/ioctl.h>
# include <net/if.h>
# include <vms/inetiodef.h>
# include <sys/ioctl.h>
#endif
# define CA_OS_CONFIGURED
#endif /*VMS*/
@@ -123,15 +132,12 @@ static char *os_depenhSccsId = "$Id$";
#endif /*_WINDOWS*/
#ifndef CA_OS_CONFIGURED
#error Please define one of vxWorks, UNIX or VMS
#error Please define one of vxWorks, UNIX VMS, or _WINDOWS
#endif
/*
* Big endin architecture is assumed. Otherwise set "CA_LITTLE_ENDIAN".
*
* IEEE floating point architecture assumed. Set "CA_FLOAT_MIT" if
* appropriate. No other floating point formats currently
* supported.
* Here are the definitions for architecture dependent byte ordering
* and floating point format
*/
#if defined(VAX)
# define CA_FLOAT_MIT
@@ -139,10 +145,10 @@ static char *os_depenhSccsId = "$Id$";
#elif defined(_X86_)
# define CA_FLOAT_IEEE
# define CA_LITTLE_ENDIAN
#elif (defined(__ALPHA) || defined(__alpha)) && defined(VMS)
#elif (defined(__ALPHA) && defined(VMS) || defined(__alpha)) && defined(VMS)
# define CA_FLOAT_MIT
# define CA_LITTLE_ENDIAN
#elif (defined(__ALPHA) || defined(__alpha)) && defined(UNIX)
#elif (defined(__ALPHA) && defined(UNIX) || defined(__alpha)) && defined(UNIX)
# define CA_FLOAT_IEEE
# define CA_LITTLE_ENDIAN
#else
@@ -269,7 +275,6 @@ static char *os_depenhSccsId = "$Id$";
# else
# ifdef UCX
# define MYERRNO errno
extern volatile int noshare errno ;
# else
# define MYERRNO socket_errno
# endif
@@ -286,6 +291,12 @@ static char *os_depenhSccsId = "$Id$";
#endif
#ifdef _WINDOWS
# define LOCK
# define UNLOCK
# define LOCKEVENTS
# define UNLOCKEVENTS
# define EVENTLOCKTEST (post_msg_active)
# define MAXHOSTNAMELEN 75
# define IPPORT_USERRESERVED 5000
# define EWOULDBLOCK WSAEWOULDBLOCK
# define ENOBUFS WSAENOBUFS

View File

@@ -31,14 +31,6 @@
*
*/
/*
* ANSI includes
*/
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/param.h>
@@ -74,52 +66,27 @@ void cac_gettimeval(struct timeval *pt)
void cac_mux_io(struct timeval *ptimeout)
{
int count;
int newInput;
struct timeval timeout;
cac_clean_iiu_list();
timeout = *ptimeout;
do{
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE);
newInput = FALSE;
do{
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
if(count>0){
newInput = TRUE;
}
timeout.tv_usec = 0;
timeout.tv_sec = 0;
}
while(count>0);
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
ca_process_input_queue();
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(newInput);
}
log_time(char *pStr)
{
static struct timeval time;
struct timeval newtime;
struct timezone tz;
ca_real diff;
int status;
status = gettimeofday(&newtime, &tz);
assert(status==0);
diff = cac_time_diff(&newtime, &time);
printf("Expired %f - %s\n", diff, pStr);
time = newtime;
while(count>0);
}
@@ -220,7 +187,7 @@ char *localUserName()
if(!pName){
pName = getpwuid(getuid())->pw_name;
if(!pName){
return NULL;
pName = "";
}
}
@@ -256,7 +223,7 @@ void ca_spawn_repeater()
/*
* return to the caller
* if its the in the initiating process
* if its in the initiating process
*/
if (status){
return;
@@ -270,7 +237,8 @@ void ca_spawn_repeater()
status = execlp(pImageName, NULL);
if(status<0){
ca_printf("!!WARNING!!\n");
ca_printf("The executable \"%s\" couldnt be located.\n", pImageName);
ca_printf("The executable \"%s\" couldnt be located\n", pImageName);
ca_printf("because - %s\n", strerror(MYERRNO));
ca_printf("You may need to modify your PATH environment variable.\n");
ca_printf("Creating CA repeater with fork() system call.\n");
ca_printf("Repeater will inherit parents process name and resources.\n");
@@ -281,25 +249,14 @@ void ca_spawn_repeater()
exit(0);
}
/*
* ca_printf()
* caSetDefaultPrintfHandler ()
* use the normal default here
* ( see access.c )
*/
int ca_printf(char *pformat, ...)
void caSetDefaultPrintfHandler ()
{
va_list args;
int status;
va_start(args, pformat);
status = vfprintf(
stderr,
pformat,
args);
va_end(args);
return status;
ca_static->ca_printf_func = epicsVprintf;
}

View File

@@ -20,11 +20,11 @@
* Los Alamos National Laboratory
*
* Direct inqueries to:
* Andy Kozubal, AT-8, Mail Stop H820
* Jeff HIll, AT-8, Mail Stop H820
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
* Phone: (505) 667-6508
* E-mail: kozubal@k2.lanl.gov
* Phone: (505) 665-1831
* E-mail: johill@lanl.gov
*
* PURPOSE:
* Broadcasts fan out over the LAN, but UDP does not allow
@@ -141,8 +141,9 @@ void ca_repeater()
status = local_addr(sock, &local);
if(status != OK){
ca_printf("CA Repeater: no inet interfaces online?\n");
assert(0);
ca_printf(
"CA Repeater: failed during initialization - no local IP address\n");
exit (0);
}
#ifdef DEBUG
@@ -241,7 +242,7 @@ void ca_repeater()
/*
* register_new_client()
*/
void register_new_client(
LOCAL void register_new_client(
SOCKET sock,
struct sockaddr_in *pLocal,
struct sockaddr_in *pFrom)

View File

@@ -129,6 +129,10 @@ unsigned long blockSize
piiu->curMsgBytes += size;
if(piiu->curMsgBytes < sizeof(piiu->curMsg)){
#if 0
printf ("waiting for %d msg hdr bytes\n",
sizeof(piiu->curMsg)-piiu->curMsgBytes);
#endif
return OK;
}
@@ -174,10 +178,10 @@ unsigned long blockSize
if(piiu->pCurData){
free(piiu->pCurData);
}
piiu->curDataMax = 0;
piiu->pCurData = (void *)
malloc(piiu->curMsg.m_postsize);
if(!piiu->pCurData){
piiu->curDataMax = 0;
piiu->curMsgBytes = 0;
piiu->curDataBytes = 0;
return ERROR;
@@ -200,6 +204,10 @@ unsigned long blockSize
size);
piiu->curDataBytes += size;
if(piiu->curDataBytes < piiu->curMsg.m_postsize){
#if 0
printf ("waiting for %d msg bdy bytes\n",
piiu->curMsg.m_postsize-piiu->curDataBytes);
#endif
return OK;
}
pInBuf += size;
@@ -466,7 +474,6 @@ struct in_addr *pnet_addr
* read seq
*/
if (VALID_MSG(piiu)){
/*
* convert the data buffer from net
* format to host format
@@ -478,11 +485,19 @@ struct in_addr *pnet_addr
FALSE,
piiu->curMsg.m_count);
# else
memcpy(
(char *)pIOBlock->usr_arg,
piiu->pCurData,
dbr_size_n(piiu->curMsg.m_type,
piiu->curMsg.m_count));
if (piiu->curMsg.m_type == DBR_STRING) {
strcpy ((char *)pIOBlock->usr_arg,
piiu->pCurData);
}
else {
memcpy(
(char *)pIOBlock->usr_arg,
piiu->pCurData,
dbr_size_n (
piiu->curMsg.m_type,
piiu->curMsg.m_count)
);
}
# endif
/*
@@ -688,7 +703,7 @@ struct in_addr *pnet_addr
}
if (CA_V44(CA_PROTOCOL_VERSION,piiu->minor_version_number)) {
chan->id.sid = ntohl (piiu->curMsg.m_available);
chan->id.sid = piiu->curMsg.m_available;
}
reconnect_channel(piiu, chan);
break;

View File

@@ -97,7 +97,7 @@ void ca_sg_shutdown(struct ca_static *ca_temp)
/*
* ca_sg_create()
*/
int ca_sg_create(CA_SYNC_GID *pgid)
int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
{
int status;
CASG *pcasg;
@@ -162,7 +162,7 @@ int ca_sg_create(CA_SYNC_GID *pgid)
/*
* ca_sg_delete()
*/
int ca_sg_delete(CA_SYNC_GID gid)
int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
{
int status;
CASG *pcasg;
@@ -200,10 +200,9 @@ int ca_sg_delete(CA_SYNC_GID gid)
/*
* ca_sg_block()
*/
int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
{
struct timeval beg_time;
struct timeval cur_time;
ca_real delay;
int status;
CASG *pcasg;
@@ -244,7 +243,12 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
*/
ca_flush_io();
cac_gettimeval(&beg_time);
/*
* the current time set within ca_flush_io()
* above.
*/
beg_time = ca_static->currentTime;
delay = 0.0;
status = ECA_NORMAL;
while(pcasg->opPendCount){
@@ -254,8 +258,6 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
/*
* Exit if the timeout has expired
*/
cac_gettimeval (&cur_time);
delay = cac_time_diff (&cur_time, &beg_time);
remaining = timeout-delay;
if (remaining<=0.0) {
status = ECA_TIMEOUT;
@@ -270,9 +272,15 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
/*
* wait for asynch notification
*/
tmo.tv_sec = remaining;
tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC;
tmo.tv_sec = (long) remaining;
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
cac_block_for_sg_completion (pcasg, &tmo);
/*
* the current time set within cac_block_for_sg_completion()
* above.
*/
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
}
pcasg->opPendCount = 0;
pcasg->seqNo++;
@@ -283,7 +291,7 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
/*
* ca_sg_reset
*/
int ca_sg_reset(CA_SYNC_GID gid)
int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
{
CASG *pcasg;
@@ -305,7 +313,7 @@ int ca_sg_reset(CA_SYNC_GID gid)
/*
* ca_sg_test
*/
int ca_sg_test(CA_SYNC_GID gid)
int APIENTRY ca_sg_test(CA_SYNC_GID gid)
{
CASG *pcasg;
@@ -331,7 +339,7 @@ int ca_sg_test(CA_SYNC_GID gid)
/*
* ca_sg_array_put()
*/
int ca_sg_array_put(
int APIENTRY ca_sg_array_put(
CA_SYNC_GID gid,
chtype type,
unsigned long count,
@@ -396,7 +404,7 @@ void *pvalue)
/*
* ca_sg_array_get()
*/
int ca_sg_array_get(
int APIENTRY ca_sg_array_get(
CA_SYNC_GID gid,
chtype type,
unsigned long count,

View File

@@ -19,7 +19,7 @@ static char *sccsId = "$Id$";
#include "iocinf.h"
void ca_test_event(struct event_handler_args args)
void APIENTRY ca_test_event(struct event_handler_args args)
{
ca_printf("CAC: ~~~### in test event for [%s] ###~~~\n",args.chid+1);
ca_printf("CAC: User argument\t%x\n", args.usr);

View File

@@ -6,6 +6,8 @@
*
* GeG 09-DEC-1992 initial edit
* CJM 13-Jul-1994 add fd_set etc for R3.12
* CJM 09-Dec-1994 define fd_set etc. so it will compile for
* both DEC C and Vax C
*
*/
#ifndef _UCX_H_
@@ -70,13 +72,14 @@ typedef long fd_mask ;
#define howmany(x, y) (((x)+((y)-1))/(y))
#endif
typedef struct fd_set {
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)] ;
} fd_set ;
/*
* Both DEC C and VAX C only allow 32 fd's at once
*/
typedef int fd_set ;
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
#define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS)))
#define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS)))
#define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS)))
#define FD_ZERO(p) bzero((char *)(p), sizeof (*(p)))
#include <iodef.h>

View File

@@ -31,15 +31,6 @@
*
*/
/*
* ANSI includes
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdLib.h>
#include <stdarg.h>
/*
* VMS includes
*/
@@ -77,35 +68,27 @@ void cac_gettimeval(struct timeval *pt)
void cac_mux_io(struct timeval *ptimeout)
{
int count;
int newInput;
struct timeval timeout;
cac_clean_iiu_list();
timeout = *ptimeout;
do{
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
ca_process_input_queue();
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE);
newInput = FALSE;
do{
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
if(count>0){
newInput = TRUE;
}
timeout.tv_usec = 0;
timeout.tv_sec = 0;
}
while(count>0);
ca_process_input_queue();
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(newInput);
while(count>0);
}
@@ -147,7 +130,7 @@ void os_specific_sg_io_complete(CASG *pcasg)
/*
* cac_block_for_sg_completion()
*/
void cac_block_for_sg_completion(pTV)
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
{
cac_mux_io(pTV);
}
@@ -183,11 +166,7 @@ void cac_os_depen_exit (struct ca_static *pcas)
/*
*
* localUserName() - for VMS
*
* o Indicates failure by setting ptr to nill
*
*/
char *localUserName()
{
@@ -230,24 +209,13 @@ char *localUserName()
NULL,
NULL,
NULL);
if(status != SS$_NORMAL){
return NULL;
strcpy (pName, "");
}
/*
* test for remote login
*/
if(jobTypeSize != sizeof(jobType)){
return NULL;
}
/*
* This does not appear to change when it is
* a remote login ??
*/
if(jobType != JPI$K_LOCAL && jobType != JPI$K_DETACHED){
pTmp = "REMOTE";
return pTmp;
strcpy (pName, "");
}
/*
@@ -335,19 +303,12 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
/*
* ca_printf()
* caSetDefaultPrintfHandler ()
* use the normal default here
* ( see access.c )
*/
int ca_printf(char *pformat, ...)
void caSetDefaultPrintfHandler ()
{
va_list args;
int status;
va_start(args, pformat);
status = vfprintf(stderr, pformat, args);
va_end(args);
return status;
ca_static->ca_printf_func = epicsVprintf;
}

View File

@@ -31,8 +31,6 @@
*
*/
#include <stdarg.h>
#include <callback.h>
#include "iocinf.h"
#include "remLib.h"
@@ -106,7 +104,6 @@ void cac_mux_io(struct timeval *ptimeout)
#if NOASYNCRECV
cac_clean_iiu_list();
manage_conn(TRUE);
#endif
timeout = *ptimeout;
do{
@@ -120,6 +117,7 @@ void cac_mux_io(struct timeval *ptimeout)
#if NOASYNCRECV
ca_process_input_queue();
manage_conn(TRUE);
#endif
}
@@ -379,6 +377,7 @@ int cac_os_depen_init(struct ca_static *pcas)
return status;
}
evuser = (void *) db_init_events();
assert(evuser);
@@ -757,7 +756,7 @@ void ca_spawn_repeater()
/*
* ca_repeater_task()
*/
void ca_repeater_task()
LOCAL void ca_repeater_task()
{
taskwdInsert((int)taskIdCurrent, NULL, NULL);
ca_repeater();
@@ -848,6 +847,7 @@ void cac_recv_task(int tid)
{
struct timeval timeout;
int status;
int count;
taskwdInsert((int) taskIdCurrent, NULL, NULL);
@@ -862,18 +862,16 @@ void cac_recv_task(int tid)
#if NOASYNCRECV
taskDelay(60);
#else
manage_conn(TRUE);
timeout.tv_usec = 0;
timeout.tv_sec = 1;
cac_clean_iiu_list();
cac_select_io(
&timeout,
CA_DO_RECVS);
timeout.tv_usec = 50000;
timeout.tv_sec = 0;
count = cac_select_io(
&timeout,
CA_DO_SENDS | CA_DO_RECVS);
ca_process_input_queue();
ca_process_input_queue();
manage_conn(TRUE);
#endif
}
}
@@ -881,40 +879,17 @@ void cac_recv_task(int tid)
/*
* caSetDefaultPrintfHandler()
*
* replace the default printf handler with a
* vxWorks specific one that calls logMsg ()
* so that:
*
* ca_printf()
*
*
* o messages go to the log file
* o messages dont get intermixed
*/
int ca_printf(char *pformat, ...)
void caSetDefaultPrintfHandler ()
{
va_list args;
int status;
va_start(args, pformat);
{
int logMsgArgs[6];
int i;
for(i=0; i< NELEMENTS(logMsgArgs); i++){
logMsgArgs[i] = va_arg(args, int);
}
status = logMsg(
pformat,
logMsgArgs[0],
logMsgArgs[1],
logMsgArgs[2],
logMsgArgs[3],
logMsgArgs[4],
logMsgArgs[5]);
}
va_end(args);
return status;
ca_static->ca_printf_func = epicsVprintf;
}

View File

@@ -1,7 +1,8 @@
/*
* $Id$
* Author: Jeffrey O. Hill
* Author: Jeffrey O. Hill, Chris Timossi
* hill@luke.lanl.gov
* CATimossi@lbl.gov
* (505) 665 1831
* Date: 9-93
*
@@ -32,12 +33,9 @@
*/
/*
* ANSI includes
* Windows includes
*/
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <process.h>
#include "iocinf.h"
@@ -45,6 +43,11 @@
#error This source is specific to DOS/WINDOS
#endif
static int get_subnet_mask ( char SubNetMaskStr[256]);
static int RegTcpParams (char IpAddr[256], char SubNetMask[256]);
static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
LPDWORD lpdwType, LPBYTE lpbData, LPDWORD lpcbData );
/*
* cac_gettimeval
@@ -72,35 +75,27 @@ void cac_gettimeval(struct timeval *pt)
void cac_mux_io(struct timeval *ptimeout)
{
int count;
int newInput;
struct timeval timeout;
cac_clean_iiu_list();
timeout = *ptimeout;
do{
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE); newInput = FALSE;
do{
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
if(count>0){
newInput = TRUE;
}
timeout.tv_usec = 0;
timeout.tv_sec = 0;
}
while(count>0);
count = cac_select_io(
&timeout,
CA_DO_RECVS | CA_DO_SENDS);
ca_process_input_queue();
}
while(newInput);
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(count>0);
}
@@ -143,9 +138,10 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
*/
int cac_os_depen_init(struct ca_static *pcas)
{
int status;
int status;
WSADATA WsaData;
ca_static = ca_temp;
ca_static = pcas;
/*
* dont allow disconnect to terminate process
@@ -154,16 +150,17 @@ int cac_os_depen_init(struct ca_static *pcas)
* allow error to be returned to sendto()
* instead of handling disconnect at interrupt
*/
signal(SIGPIPE,SIG_IGN);
/* signal(SIGPIPE,SIG_IGN); */
# ifdef _WINSOCKAPI_
status = WSAStartup(MAKEWORD(1,1), &WsaData));
status = WSAStartup(MAKEWORD(1,1), &WsaData);
assert (status==0);
# endif
status = ca_os_independent_init ();
return status;
return status;
}
@@ -188,12 +185,16 @@ void cac_os_depen_exit (struct ca_static *pcas)
*/
char *localUserName()
{
int length;
char *pName;
char *pTmp;
int length;
char *pName;
char *pTmp;
char Uname[] = "";
pName = "Joe PC";
length = strlen(pName)+1;
pName = getenv("USERNAME");
if (!pName) {
pName = Uname;
}
length = strlen(pName)+1;
pTmp = malloc(length);
if(!pTmp){
@@ -219,8 +220,13 @@ void ca_spawn_repeater()
* running in the repeater process
* if here
*/
pImageName = "caRepeater";
status = system(pImageName);
pImageName = "caRepeater.exe";
//status = system(pImageName);
//Need to check if repeater is already loaded
//For now, start Repeater from a command line, not here
status = 0;
//status = _spawnlp(_P_DETACH,pImageName,"");
if(status<0){
ca_printf("!!WARNING!!\n");
ca_printf("Unable to locate the executable \"%s\".\n",
@@ -229,26 +235,241 @@ void ca_spawn_repeater()
}
}
/*
* caSetDefaultPrintfHandler ()
* use the normal default here
* ( see access.c )
*/
void caSetDefaultPrintfHandler ()
{
ca_static->ca_printf_func = epicsVprintf;
}
/*
* ca_printf()
*
* Network interface routines
*
*/
int ca_printf(char *pformat, ...)
/*
* local_addr()
*
* return 127.0.0.1
* (the loop back address)
*/
int local_addr (SOCKET s, struct sockaddr_in *plcladdr)
{
va_list args;
int status;
ca_uint32_t loopBackAddress = 0x7f000001;
va_start(args, pformat);
status = vfprintf(
stderr,
pformat,
args);
va_end(args);
return status;
plcladdr->sin_family = AF_INET;
plcladdr->sin_port = 0;
plcladdr->sin_addr.s_addr = ntohl (loopBackAddress);
return OK;
}
/*
* caDiscoverInterfaces()
*
* This routine is provided with the address of an ELLLIST a socket
* and a destination port number. When the routine returns there
* will be one additional inet address (a caAddrNode) in the list
* for each inet interface found that is up and isnt a loop back
* interface. If the interface supports broadcast then I add its
* broadcast address to the list. If the interface is a point to
* point link then I add the destination address of the point to
* point link to the list. In either case I set the port number
* in the address node to the port supplied in the argument
* list.
*
* LOCK should be applied here for (pList)
* (this is also called from the server)
*/
void caDiscoverInterfaces(ELLLIST *pList, SOCKET socket, int port)
{
struct sockaddr_in localAddr;
struct sockaddr_in InetAddr;
struct in_addr bcast_addr;
caAddrNode *pNode;
int status;
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
if(!pNode){
return;
}
broadcast_addr(&bcast_addr);
pNode->destAddr.inetAddr.sin_addr.s_addr = bcast_addr.s_addr; //broadcast addr
pNode->destAddr.inetAddr.sin_port = htons(port);
pNode->destAddr.inetAddr.sin_family = AF_INET;
//pNode->srcAddr.inetAddr = 0 ;//localAddr;
/*
* LOCK applied externally
*/
ellAdd(pList, &pNode->node);
}
int
broadcast_addr( struct in_addr *pcastaddr )
{
char netmask[256], lhostname[80];
static struct in_addr castaddr;
int status;
static char init = FALSE;
struct hostent *phostent;
unsigned long laddr;
if (init) {
*pcastaddr = castaddr;
return OK;
}
gethostname(lhostname,sizeof(lhostname));
phostent = gethostbyname(lhostname);
if (!phostent) {
return MYERRNO;
}
if (status = get_subnet_mask(netmask))
return ERROR;
laddr = *( (unsigned long *) phostent->h_addr_list[0]);
castaddr.s_addr = (laddr & inet_addr(netmask)) | ~inet_addr(netmask);
if (!init){
init = TRUE;
*pcastaddr = castaddr;
}
return OK;
}
static int get_subnet_mask ( char SubNetMaskStr[256])
{
char localadr[256];
return RegTcpParams (localadr, SubNetMaskStr);
}
static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
{
#define MAX_VALUE_NAME 128
static CHAR ValueName[MAX_VALUE_NAME];
static CHAR RegPath[256];
DWORD cbDataLen;
CHAR cbData[256];
DWORD dwType;
int status;
static char IpAddr[256], SubNetMask[256];
cbDataLen = sizeof(cbData);
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\1");
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
if (status) {
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\01");
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
if (status)
return status;
}
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\");
strcat(RegPath,cbData);
strcat(RegPath,"\\Parameters\\Tcpip");
cbDataLen = sizeof(IpAddr);
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "IPAddress", &dwType, IpAddr, &cbDataLen);
if (status)
return status;
strcpy(IpAddrStr,IpAddr);
cbDataLen = sizeof(SubNetMask);
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "SubnetMask", &dwType, SubNetMask, &cbDataLen);
if (status)
return status;
strcpy(SubNetMaskStr,SubNetMask);
return 0;
}
static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
LPDWORD lpdwType, LPBYTE lpbData, LPDWORD lpcbData )
{
HKEY hKey;
DWORD retCode;
DWORD dwcClassLen = MAX_PATH;
// OPEN THE KEY.
retCode = RegOpenKeyEx (hKeyRoot, // Key handle at root level.
RegPath, // Path name of child key.
0, // Reserved.
KEY_QUERY_VALUE, // Requesting read access.
&hKey); // Address of key to be returned.
if (retCode)
{
//wsprintf (Buf, "Error: RegOpenKeyEx = %d", retCode);
return -1;
}
retCode = RegQueryValueEx (hKey, // Key handle returned from RegOpenKeyEx.
lpzValueName, // Name of value.
NULL, // Reserved, dword = NULL.
lpdwType, // Type of data.
lpbData, // Data buffer.
lpcbData); // Size of data buffer.
if (retCode)
{
//wsprintf (Buf, "Error: RegQIK = %d, %d", retCode, __LINE__);
return -2;
}
return 0;
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
int status;
WSADATA WsaData;
switch (dwReason) {
case DLL_PROCESS_ATTACH:
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0)
return FALSE;
if (AllocConsole()) {
SetConsoleTitle("Channel Access Status");
freopen( "CONOUT$", "a", stderr );
fprintf(stderr, "Process attached to ca.dll R12\n");
}
break;
case DLL_PROCESS_DETACH:
if ((status = WSACleanup()) !=0)
return FALSE;
break;
case DLL_THREAD_ATTACH:
fprintf(stderr, "Thread attached to ca.dll R12\n");
break;
case DLL_THREAD_DETACH:
fprintf(stderr, "Thread detached from ca.dll R12\n");
break;
default:
break;
}
return TRUE;
}

View File

@@ -2,7 +2,7 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_LDLIBS = -lDb -lCom
USR_LDLIBS = -lDb -lCom -lm
USR_LDFLAGS = -L.
LEX = $(ELEX)

View File

@@ -4,16 +4,16 @@ include $(EPICS)/config/CONFIG_BASE
SRCS.c = \
../dbAccess.c ../dbBkpt.c ../dbFastLinkConv.c ../dbLink.c \
../dbStaticLib.c ../iocInit.c ../drvTS.c ../dbScan.c \
../dbNotify.c ../dbStaticLib.c ../iocInit.c ../drvTS.c ../dbScan.c \
../dbEvent.c ../dbTest.c ../dbls.c ../db_access.c \
../db_test.c ../recGbl.c ../callback.c ../taskwd.c \
../dbCaLink.c ../dbCaDblink.c ../devLib.c ../initHooks.c
OBJSdbLib = \
dbAccess.o dbBkpt.o dbFastLinkConv.o dbLink.o dbStaticLib.o \
iocInit.o drvTS.o dbScan.o dbEvent.o dbTest.o dbls.o db_access.o \
db_test.o recGbl.o callback.o taskwd.o dbCaLink.o dbCaDblink.o \
devLib.o
dbAccess.o dbBkpt.o dbFastLinkConv.o dbLink.o dbNotify.o \
dbStaticLib.o iocInit.o drvTS.o dbScan.o dbEvent.o dbTest.o dbls.o \
db_access.o db_test.o recGbl.o callback.o taskwd.o dbCaLink.o \
dbCaDblink.o devLib.o
PROD = initHooks.o dbLib

View File

@@ -1,6 +1,6 @@
b [a-zA-Z0-9_]
a [ \t]
d [a-zA-Z0-9_\,\./\*#\[\]%:;!|\'\-&\(\)@\?\+<>=$]
d [a-zA-Z0-9_\,\./\*#\[\]%:;!|\'\-&\(\)@\?\+<>=$\^\~]
%{

View File

@@ -43,6 +43,8 @@
#include <dbDefs.h>
#include <callback.h>
#include <dbAccess.h>
#include <recSup.h>
#include <taskwd.h>
#include <errMdef.h>
#include <task_params.h>
@@ -164,3 +166,22 @@ static void wdCallback(long ind)
rngDelete(callbackQ[ind]);
start(ind);
}
static void ProcessCallback(CALLBACK *pCallback)
{
struct dbCommon *pRec;
callbackGetUser(pRec, pCallback);
dbScanLock(pRec);
((struct rset*)(pRec->rset))->process(pRec);
dbScanUnlock(pRec);
}
void callbackRequestProcessCallback(CALLBACK *pCallback, int Priority, void *pRec)
{
callbackSetCallback(ProcessCallback, pCallback);
callbackSetPriority(Priority, pCallback);
callbackSetUser(pRec, pCallback);
callbackRequest(pCallback);
}

View File

@@ -117,12 +117,10 @@ long dbCommonInit();
/*
* The lock structure for each database lock set. A lockset is the
* connected graph of all adjacent nodes to a record. A record
* is considered adjacent if the link connecting it to the lock
* set causes that record to process. In other words, a record
* is considered part of the lock set if the action of getting
* or putting a value to that record (with a link) causes that
* record to process.
* connected graph of all adjacent nodes to a record (with one
* exception, single-valued NPP NMS gets), where adjacent is defined
* as a record connected by a get, put, or forward link to the current
* record.
*/
struct scanLock {
FAST_LOCK lock;
@@ -190,8 +188,8 @@ void dbScanLock(struct dbCommon *precord)
/* Move range check to iocInit */
if(lset < 0 || lset >= dbScanPvt.nset) {
errMessage(S_db_badLset, "Lock Set out of range");
exit(1);
errMessage(S_db_badLset, "Lock Set out of range:dbScanLock");
taskSuspend(taskIdSelf());
}
pscanLock = dbScanPvt.pscanLock + lset;
FASTLOCK(&pscanLock->lock);
@@ -212,10 +210,9 @@ void dbScanUnlock(struct dbCommon *precord)
/* Put check in iocInit() */
if(lset<0 || lset>=dbScanPvt.nset) {
errMessage(S_db_badLset,"Lock Set out of range");
return;
errMessage(S_db_badLset,"Lock Set out of range:dbScanUnlock");
taskSuspend(taskIdSelf());
}
pscanLock = dbScanPvt.pscanLock + lset;
pscanLock->precord = NULL;
FASTUNLOCK(&pscanLock->lock);
@@ -264,64 +261,20 @@ long dbScanPassive(struct dbCommon *pfrom, struct dbCommon *pto)
long status;
/* if not passive just return success */
if (pto->scan != 0) return(0);
if(pto->scan != 0) return(0);
if (pfrom && pfrom->ppn) {
PUTNOTIFY *ppn = pfrom->ppn;
if (pto->ppn) { /*already being used. Abandon request*/
ppn->status = S_db_Blocked;
dbNotifyCompletion(ppn);
} else {
ppn->nwaiting++;
pto->ppn = pfrom->ppn;
/*If already active must redo*/
if(pto->pact) ppn->rescan = TRUE;
}
}
if(pfrom && pfrom->ppn) dbNotifyAdd(pfrom,pto);
status = dbProcess(pto);
if (pfrom && pfrom->ppn) {
PUTNOTIFY *ppn = pfrom->ppn;
if (!pto->pact) {
pto->ppn = NULL;
} else { /*add to list of records for which to wait*/
pto->ppnn = ppn->list;
ppn->list = pto;
}
}
return(status);
}
/*KLUDGE: Following needed so that dbPutLink to PROC field works correctly*/
long dbScanLink(struct dbCommon *pfrom, struct dbCommon *pto)
{
long status;
if(pfrom && pfrom->ppn) {
PUTNOTIFY *ppn = pfrom->ppn;
if(pto->ppn) { /*already being used. Abandon request*/
ppn->status = S_db_Blocked;
dbNotifyCompletion(ppn);
} else {
ppn->nwaiting++;
pto->ppn = pfrom->ppn;
/*If already active must redo*/
if(pto->pact) ppn->rescan = TRUE;
}
}
if(pfrom && pfrom->ppn) dbNotifyAdd(pfrom,pto);
status = dbProcess(pto);
if(pfrom && pfrom->ppn) {
PUTNOTIFY *ppn = pfrom->ppn;
if(!pto->pact) {
pto->ppn = NULL;
} else { /*add to list of records for which to wait*/
pto->ppnn = ppn->list;
ppn->list = pto;
}
}
return(status);
}

View File

@@ -27,6 +27,7 @@
*
* Modification Log:
* -----------------
* $Log$
*/
/*
@@ -64,7 +65,7 @@
#include <vxLib.h>
#include <tickLib.h>
#include <sysLib.h>
#include <fast_lock.h>
#include <alarm.h>
#include <choice.h>
@@ -681,7 +682,15 @@ int dbBkpt(struct dbCommon *precord)
* breakpoint handler will not work as expected.
*/
/*
* Take and give a semaphore to check for breakpoints
* every time a record is processed. Slow. Thank
* goodness breakpoint checking is turned off during
* normal operation.
*/
semTake(bkpt_stack_sem, WAIT_FOREVER);
FIND_LOCKSET(precord, pnode);
semGive(bkpt_stack_sem);
if (pnode == NULL) {
/* no breakpoints in precord's lockset */

View File

@@ -62,7 +62,7 @@
* joh 21 080393 added task watch dog
*/
#include <assert.h>
#include <epicsAssert.h>
#include <vxWorks.h>
#include <types.h>
@@ -591,12 +591,12 @@ int db_post_single_event(struct event_block *pevent)
ev_que->valque[putix].sevr = sevr;
ev_que->valque[putix].time = precord->time;
/*
* use bcopy to avoid a bus error on
* use memcpy to avoid a bus error on
* union copy of char in the db at an odd
* address
*/
bcopy( pevent->paddr->pfield,
(char *)&ev_que->valque[putix].field,
memcpy( (char *)&ev_que->valque[putix].field,
pevent->paddr->pfield,
dbr_size[pevent->paddr->field_type]);
}
/* notify the event handler */
@@ -669,12 +669,12 @@ unsigned int select
ev_que->valque[putix].time = precord->time;
/*
* use bcopy to avoid a bus error on
* use memcpy to avoid a bus error on
* union copy of char in the db at an odd
* address
*/
bcopy( (char *)event->paddr->pfield,
(char *)&ev_que->valque[putix].field,
memcpy( (char *)&ev_que->valque[putix].field,
(char *)event->paddr->pfield,
dbr_size[event->paddr->field_type]);
}

View File

@@ -182,7 +182,6 @@ long dbPutField(
}
dbScanLock(precord);
status=dbPut(paddr,dbrType,pbuffer,nRequest);
if(status) recGblDbaddrError(status,paddr,"dbPutField");
if(status==0){
if((paddr->pfield==(void *)&precord->proc)
||(pfldDes->process_passive && precord->scan==0 && dbrType<DBR_PUT_ACKT)) {
@@ -199,145 +198,6 @@ long dbPutField(
return(status);
}
static void notifyCallback(CALLBACK *pcallback)
{
PUTNOTIFY *ppn=NULL;
long status;
callbackGetUser(ppn,pcallback);
if(ppn->cmd==notifyCmdRepeat) {
status = dbPutNotify(ppn);
} else if(ppn->cmd==notifyCmdCallUser) {
(ppn->userCallback)(ppn);
} else {/*illegal request*/
recGblRecordError(-1,ppn->paddr->precord,"dbNotifyCompletion: illegal callback request");
}
}
static void notifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
while(precord) {
void *pnext;
if(precord->rpro) {
precord->rpro = FALSE;
scanOnce(precord);
}
precord->ppn = NULL;
pnext = precord->ppnn;
precord->ppnn = NULL;
precord = pnext;
}
ppn->list = NULL;
}
void dbNotifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
dbScanLock(precord);
notifyCancel(ppn);
dbScanUnlock(precord);
}
long dbPutNotify(PUTNOTIFY *ppn)
{
struct dbAddr *paddr = ppn->paddr;
short dbrType = ppn->dbrType;
void *pbuffer = ppn->pbuffer;
long nRequest = ppn->nRequest;
long status=0;
struct fldDes *pfldDes=(struct fldDes *)(paddr->pfldDes);
struct dbCommon *precord = (struct dbCommon *)(paddr->precord);
callbackSetCallback(notifyCallback,&ppn->callback);
callbackSetUser(ppn,&ppn->callback);
callbackSetPriority(priorityLow,&ppn->callback);
/*check for putField disabled*/
if(precord->disp) {
if((void *)(&precord->disp) != paddr->pfield) {
ppn->cmd = notifyCmdCallUser;
ppn->status = S_db_putDisabled;
notifyCallback(&ppn->callback);
return(S_db_putDisabled);
}
}
dbScanLock(precord);
status=dbPut(paddr,dbrType,pbuffer,nRequest);
if(status) recGblDbaddrError(status,paddr,"dbPutField");
ppn->status = status;
if(status==0){
if((paddr->pfield==(void *)&precord->proc)
||(pfldDes->process_passive && precord->scan==0)) {
if(precord->ppn) {
/*record already has attached ppn. Blocked*/
ppn->status = status = S_db_Blocked;
return(status);
}
ppn->nwaiting = 1;
ppn->rescan = FALSE;
ppn->list = NULL;
precord->ppn = ppn;
precord->ppnn = NULL;
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
ppn->rescan = TRUE;
ppn->status = status = S_db_Pending;
return(status);
}
status=dbProcess(precord);
if(status==0) {
if(!precord->pact) {
precord->ppn = NULL;
} else {
precord->ppnn = ppn->list;
ppn->list = precord;
}
ppn->status = status = ((ppn->nwaiting == 0) ? 0 : S_db_Pending);
} else {
ppn->status = status;
notifyCancel(ppn);
}
} else { /*Make callback immediately*/
ppn->cmd = notifyCmdCallUser;
ppn->status = 0;
notifyCallback(&ppn->callback);
}
}
dbScanUnlock(precord);
return(status);
}
void dbNotifyCompletion(PUTNOTIFY *ppn)
{
if(ppn->status!=0 && ppn->status!=S_db_Pending) {
ppn->cmd = notifyCmdCallUser;
notifyCancel(ppn);
callbackRequest(&ppn->callback);
return;
}
/*decrement number of records being waited on*/
if(ppn->nwaiting<=0) {
recGblRecordError(-1,ppn->paddr->precord,"dbNotifyCompletion: nwaiting<-0 LOGIC");
return;
}
if(--ppn->nwaiting == 0) {/*original request completed*/
notifyCancel(ppn);
if(ppn->rescan) {
ppn->cmd = notifyCmdRepeat;
callbackRequest(&ppn->callback);
} else {
/*issue completion callback*/
ppn->cmd = notifyCmdCallUser;
if(ppn->status==S_db_Pending) ppn->status = 0;
callbackRequest(&ppn->callback);
}
}
}
long dbValueSize(
short dbr_type
)
@@ -3530,7 +3390,7 @@ long offset;
}
return(0);
}
static long putStringEnum(paddr,pbuffer,nRequest,no_elements,offset)
struct dbAddr *paddr;
char *pbuffer;
@@ -3538,15 +3398,41 @@ long nRequest;
long no_elements;
long offset;
{
struct rset *prset;
short record_type=(paddr->record_type);
long status;
struct rset *prset;
short record_type=(paddr->record_type);
unsigned short *pfield= (unsigned short*)(paddr->pfield);
long status;
unsigned int nchoices,ind;
int nargs,nchars;
struct dbr_enumStrs enumStrs;
if((prset=GET_PRSET(pdbBase->precSup,record_type)) && (prset->put_enum_str))
return( (*prset->put_enum_str)(paddr,pbuffer) );
status=S_db_noRSET;
recGblRecSupError(status,paddr,"dbPutField","put_enum_str");
return(S_db_badDbrtype);
if((prset=GET_PRSET(pdbBase->precSup,record_type))
&& (prset->put_enum_str)) {
status = (*prset->put_enum_str)(paddr,pbuffer);
if(!status) return(0);
if(prset->get_enum_strs) {
status = (*prset->get_enum_strs)(paddr,&enumStrs);
if(!status) {
nchoices = enumStrs.no_str;
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
*pfield = ind;
return(0);
}
status = S_db_badChoice;
}
}else {
status=S_db_noRSET;
}
} else {
status=S_db_noRSET;
}
if(status == S_db_noRSET) {
recGblRecSupError(status,paddr,"dbPutField","put_enum_str");
} else {
recGblDbaddrError(status,paddr,"dbPut(putStringEnum)");
}
return(status);
}
static long putStringGchoice(paddr,pbuffer,nRequest,no_elements,offset)
@@ -3560,20 +3446,27 @@ long offset;
unsigned short *pfield= (unsigned short*)(paddr->pfield);
char *pchoice;
struct choiceSet *pchoiceSet;
unsigned short i;
unsigned int nchoices,ind;
int nargs,nchars;
if(no_elements!=1){
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringGchoice)");
return(S_db_onlyOne);
}
if(pchoiceSet=GET_PCHOICE_SET(pdbBase->pchoiceGbl,choice_set)) {
for(i=0; i<pchoiceSet->number; i++) {
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
nchoices = pchoiceSet->number;
for(ind=0; ind<nchoices; ind++) {
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
if(strcmp(pchoice,pbuffer)==0) {
*pfield=i;
*pfield = ind;
return(0);
}
}
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
*pfield = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringGchoice)");
return(S_db_badChoice);
@@ -3589,20 +3482,27 @@ long offset;
unsigned short *pfield= (unsigned short*)(paddr->pfield);
char *pchoice;
struct choiceSet *pchoiceSet;
unsigned short i;
unsigned int nchoices,ind;
int nargs,nchars;
if(no_elements!=1){
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringCchoice)");
return(S_db_onlyOne);
}
if(pchoiceSet=pdbBase->pchoiceCvt) {
for(i=0; i<pchoiceSet->number; i++) {
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
nchoices = pchoiceSet->number;
for(ind=0; ind<nchoices; ind++) {
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
if(strcmp(pchoice,pbuffer)==0) {
*pfield=i;
*pfield=ind;
return(0);
}
}
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
*pfield = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringCchoice)");
return(S_db_badChoice);
@@ -3620,7 +3520,8 @@ long offset;
char *pchoice;
struct choiceSet *pchoiceSet;
struct arrChoiceSet *parrChoiceSet;
unsigned short i;
unsigned int nchoices,ind;
int nargs,nchars;
if(no_elements!=1){
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringRchoice)");
@@ -3628,13 +3529,19 @@ long offset;
}
if((parrChoiceSet=GET_PARR_CHOICE_SET(pdbBase->pchoiceRec,(paddr->record_type)))
&& (pchoiceSet=GET_PCHOICE_SET(parrChoiceSet,choice_set))) {
for(i=0; i<pchoiceSet->number; i++) {
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
nchoices = pchoiceSet->number;
for(ind=0; ind<nchoices; ind++) {
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
if(strcmp(pchoice,pbuffer)==0) {
*pfield=i;
*pfield=ind;
return(0);
}
}
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
*pfield = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringRchoice)");
return(S_db_badChoice);
@@ -3650,20 +3557,27 @@ long offset;
unsigned short *pfield= (unsigned short*)(paddr->pfield);
struct devChoiceSet *pdevChoiceSet;
char *pchoice;
unsigned short i;
unsigned int nchoices,ind;
int nargs,nchars;
if(no_elements!=1){
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringDchoice)");
return(S_db_onlyOne);
}
if(pdevChoiceSet=GET_PDEV_CHOICE_SET(pdbBase->pchoiceDev,paddr->record_type)) {
for(i=0; i<pdevChoiceSet->number; i++) {
if(!(pchoice=pdevChoiceSet->papDevChoice[i]->pchoice)) continue;
nchoices = pdevChoiceSet->number;
for(ind=0; ind<nchoices; ind++) {
if(!(pchoice=pdevChoiceSet->papDevChoice[ind]->pchoice)) continue;
if(strcmp(pchoice,pbuffer)==0) {
*pfield=i;
*pfield=ind;
return(0);
}
}
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
*pfield = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringDchoice)");
return(S_db_badChoice);
@@ -5875,7 +5789,9 @@ long dbPut(
if(special) {
if(special<100) { /*global processing*/
if(special==SPC_NOMOD) {
return(S_db_noMod);
status = S_db_noMod;
recGblDbaddrError(status,paddr,"dbPut");
return(status);
}else if(special==SPC_SCAN){
scanDelete(precord);
}

229
src/db/dbNotify.c Normal file
View File

@@ -0,0 +1,229 @@
/* dbNotify.c */
/* base/src/db $Id$ */
/*
* Author: Marty Kraimer
* Date: 03-30-95
* Extracted from dbLink.c
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 03-30-95 mrk Extracted from dbLink.c
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <taskLib.h>
#include <dbDefs.h>
#include <fast_lock.h>
#include <dbBase.h>
#include <dbAccess.h>
#include <dbStaticLib.h>
#include <dbScan.h>
#include <dbCommon.h>
#include <errMdef.h>
static void notifyCallback(CALLBACK *pcallback)
{
PUTNOTIFY *ppn=NULL;
long status;
callbackGetUser(ppn,pcallback);
if(ppn->cmd==notifyCmdRepeat) {
status = dbPutNotify(ppn);
} else if(ppn->cmd==notifyCmdCallUser) {
ppn->cmd = notifyUserCalled;
(ppn->userCallback)(ppn);
} else {/*illegal request*/
recGblRecordError(-1,ppn->paddr->precord,
"dbNotifyCompletion: illegal callback request");
}
}
static void notifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
while(precord) {
void *pnext;
if(precord->rpro) {
precord->rpro = FALSE;
scanOnce(precord);
}
precord->ppn = NULL;
pnext = precord->ppnn;
precord->ppnn = NULL;
precord = pnext;
}
ppn->list = NULL;
}
void dbNotifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
if(!precord) return;
dbScanLock(precord);
notifyCancel(ppn);
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
/*Bad lets try one time to wait*/
dbScanUnlock(precord);
taskDelay(10);
dbScanLock(precord);
}
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
epicsPrintf("dbNotifyCancel called while callback requested"
" but not called\n");
}
dbScanUnlock(precord);
}
static void issueCallback(PUTNOTIFY *ppn, notifyCmd cmd)
{
if(ppn->cmd!=notifyCmdNull) return;
ppn->cmd = cmd;
notifyCancel(ppn);
callbackRequest(&ppn->callback);
}
long dbPutNotify(PUTNOTIFY *ppn)
{
struct dbAddr *paddr = ppn->paddr;
short dbrType = ppn->dbrType;
void *pbuffer = ppn->pbuffer;
long nRequest = ppn->nRequest;
long status=0;
struct fldDes *pfldDes=(struct fldDes *)(paddr->pfldDes);
struct dbCommon *precord = (struct dbCommon *)(paddr->precord);
callbackSetCallback(notifyCallback,&ppn->callback);
callbackSetUser(ppn,&ppn->callback);
callbackSetPriority(priorityLow,&ppn->callback);
/*check for putField disabled*/
if(precord->disp) {
if((void *)(&precord->disp) != paddr->pfield) {
ppn->status = S_db_putDisabled;
issueCallback(ppn,notifyCmdCallUser);
return(S_db_putDisabled);
}
}
ppn->status = 0;
ppn->cmd = notifyCmdNull;
ppn->nwaiting = 1;
ppn->rescan = FALSE;
dbScanLock(precord);
status=dbPut(paddr,dbrType,pbuffer,nRequest);
ppn->status = status;
if(status==0){
if((paddr->pfield==(void *)&precord->proc)
||(pfldDes->process_passive && precord->scan==0)) {
if(precord->ppn) {
/*record already has attached ppn. Blocked*/
ppn->status = status = S_db_Blocked;
dbScanUnlock(precord);
return(status);
}
precord->ppn = ppn;
precord->ppnn = NULL;
ppn->list = precord;
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
ppn->rescan = TRUE;
dbScanUnlock(precord);
return(S_db_Pending);
}
status=dbProcess(precord);
if(status!=0) {
ppn->status = status;
issueCallback(ppn,notifyCmdCallUser);
}
} else { /*Make callback immediately*/
issueCallback(ppn,notifyCmdCallUser);
}
}
dbScanUnlock(precord);
return(S_db_Pending);
}
void dbNotifyCompletion(PUTNOTIFY *ppn)
{
if(ppn->status!=0) {
issueCallback(ppn,notifyCmdCallUser);
return;
}
/*decrement number of records being waited on*/
if(ppn->nwaiting<=0) {
recGblRecordError(-1,ppn->paddr->precord,"dbNotifyCompletion: nwaiting<-0 LOGIC");
return;
}
if(--ppn->nwaiting == 0) {/*original request completed*/
if(ppn->rescan) {
issueCallback(ppn,notifyCmdRepeat);
} else {
issueCallback(ppn,notifyCmdCallUser);
}
}
}
/*Remove all nonactive records from put notify list*/
void cleanPpList(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
struct dbCommon *pnext;
struct dbCommon *pprev=NULL;
while(precord) {
pnext = precord->ppnn;
if(!precord->pact) {
if(!pprev) ppn->list = pnext; else pprev->ppnn = pnext;
precord->ppn = NULL;
precord->ppnn = NULL;
} else {
pprev = precord;
}
precord = pnext;
}
}
void dbNotifyAdd(struct dbCommon *pfrom, struct dbCommon *pto)
{
PUTNOTIFY *ppn = pfrom->ppn;
if(pto->ppn) cleanPpList(pto->ppn); /* clean list before giving up*/
if (pto->ppn) { /*already being used. Abandon request*/
ppn->status = S_db_Blocked;
dbNotifyCompletion(ppn);
} else {
ppn->nwaiting++;
pto->ppn = pfrom->ppn;
pto->ppnn = ppn->list;
ppn->list = pto;
/*If already active must redo*/
if(pto->pact) ppn->rescan = TRUE;
}
}

View File

@@ -486,7 +486,7 @@ got_record:
recGblDbaddrError(status,&dbAddr,"initPeriodic");
exit(1);
}
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list));
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list*));
periodicTaskId = dbCalloc(nPeriodic,sizeof(int));
for(i=0; i<nPeriodic; i++) {
psl = dbCalloc(1,sizeof(struct scan_list));

View File

@@ -97,6 +97,11 @@ static char *promptCAMAC_IO[] = {
"subaddress:",
" function:",
" parameter:"};
static char *promptRF_IO[] = {
" cryo:",
" micro:",
" dataset:",
" element:"};
static char *promptAB_IO[] = {
" link:",
" adapter:",
@@ -149,6 +154,7 @@ static void initForms()
promptAddr[PV_LINK] = promptPV_LINK; formlines[PV_LINK] = 4;
promptAddr[VME_IO] = promptVME_IO; formlines[VME_IO] = 3;
promptAddr[CAMAC_IO] = promptCAMAC_IO; formlines[CAMAC_IO] = 6;
promptAddr[RF_IO] = promptRF_IO; formlines[RF_IO] = 4;
promptAddr[AB_IO] = promptAB_IO; formlines[AB_IO] = 6;
promptAddr[GPIB_IO] = promptGPIB_IO; formlines[GPIB_IO] = 3;
promptAddr[BITBUS_IO]= promptBITBUS_IO;formlines[BITBUS_IO]= 5;
@@ -1338,6 +1344,13 @@ DBENTRY *pdbentry;
plink->value.camacio.n,plink->value.camacio.a,
plink->value.camacio.f,plink->value.camacio.parm);
break;
case RF_IO:
sprintf(message,"#R%d M%d D%d E%d",
plink->value.rfio.cryo,
plink->value.rfio.micro,
plink->value.rfio.dataset,
plink->value.rfio.element);
break;
case AB_IO:
sprintf(message,"#L%d A%d C%d S%d F%d @%s",
plink->value.abio.link,plink->value.abio.adapter,
@@ -1682,6 +1695,25 @@ char *pstring;
}
}
break;
case RF_IO: {
char *end;
if(!(end = strchr(pstr,'#'))) return (S_dbLib_badField);
pstr = end + 1;
if(!(end = strchr(pstr,'R'))) return (S_dbLib_badField);
pstr = end + 1;
sscanf(pstr,"%hd",&plink->value.rfio.cryo);
if(!(end = strchr(pstr,'M'))) return (S_dbLib_badField);
pstr = end + 1;
sscanf(pstr,"%hd",&plink->value.rfio.micro);
if(!(end = strchr(pstr,'D'))) return (S_dbLib_badField);
pstr = end + 1;
sscanf(pstr,"%hd",&plink->value.rfio.dataset);
if(!(end = strchr(pstr,'E'))) return (S_dbLib_badField);
pstr = end + 1;
sscanf(pstr,"%hd",&plink->value.rfio.element);
}
break;
case AB_IO: {
char *end;
@@ -2459,6 +2491,15 @@ DBENTRY *pdbentry;
value++;
strcpy(*value,plink->value.camacio.parm);
break;
case RF_IO:
cvtShortToString(plink->value.rfio.cryo,*value);
value++;
cvtShortToString(plink->value.rfio.micro,*value);
value++;
cvtShortToString(plink->value.rfio.dataset,*value);
value++;
cvtShortToString(plink->value.rfio.element,*value);
break;
case AB_IO:
cvtShortToString(plink->value.abio.link,*value);
value++;
@@ -2627,6 +2668,35 @@ char **value;
value++; verify++;
strncpy(plink->value.camacio.parm,*value,CAMAC_PARAM_SZ-1);
break;
case RF_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.cryo = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.micro = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.dataset = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
value++; verify++;
lvalue = strtol(*value,&endp,0);
if(*endp==0) {
plink->value.rfio.element = lvalue; **verify = 0;
} else {
strcpy(*verify,"Illegal. Must be number");
}
break;
case AB_IO:
lvalue = strtol(*value,&endp,0);
if(*endp==0) {

View File

@@ -813,6 +813,7 @@ int dbhcr(void)
return(0);
}
dbReportDeviceConfig(pdbBase,stdout);
fflush(stdout);
return(0);
}

View File

@@ -109,7 +109,7 @@ char *filename;
/* load data base record name to pvName */
str = pvName[0];
bzero(str,1000*31);
memset(str,0,1000*31);
pdbbase=dbAllocBase();
pdbentry=dbAllocEntry(pdbbase);

View File

@@ -1,5 +1,5 @@
/* devLib.c - support for allocation of common device resources */
/* @(#)devLib.c 1.2 3/30/94 */
/* @(#)$Id$*/
/*
* Original Author: Marty Kraimer
@@ -45,12 +45,13 @@
* .08 05-28-93 joh Added an argument to devRegisterAddress()
* .09 05-28-93 joh Added devAddressMap()
* .10 06-14-93 joh Added devAllocAddress()
* .11 02-21-95 joh Fixed warning messages
*
* NOTES:
* .01 06-14-93 joh needs devAllocInterruptVector() routine
*/
static char *sccsID = "@(#)devLib.c 1.2\t3/30/94";
static char *sccsID = "@(#) $Id$";
#include <vxWorks.h>
@@ -91,8 +92,8 @@ LOCAL char addrListInit;
typedef struct{
NODE node;
const char *pOwnerName;
void *pFirst;
void *pLast;
char *pFirst;
char *pLast;
}rangeItem;
/*
@@ -103,7 +104,8 @@ LOCAL char *defaultHandlerNames[] = {
"_excStub",
"_excIntStub",
"_unsolicitedHandlerEPICS"};
LOCAL void *defaultHandlerAddr[NELEMENTS(defaultHandlerNames)];
typedef void myISR (void *pParam);
LOCAL myISR *defaultHandlerAddr[NELEMENTS(defaultHandlerNames)];
/*
* These routines are not exported
@@ -112,21 +114,21 @@ LOCAL void initHandlerAddrList(void);
LOCAL int vectorInUse(unsigned vectorNumber);
LOCAL long initAddrList(void);
LOCAL long addrVerify(epicsAddressType addrType, void *address);
LOCAL void (*isrFetch(unsigned vectorNumber))();
LOCAL myISR *isrFetch(unsigned vectorNumber);
LOCAL long blockFind(
epicsAddressType addrType,
void *pBlockFirst,
void *pBlockLast,
char *pBlockFirst,
char *pBlockLast,
/* size needed */
unsigned long size,
/* n ls bits zero in base addr */
unsigned alignment,
/* base address found */
void **ppBase);
char **ppBase);
LOCAL long report_conflict(
epicsAddressType addrType,
void *pFirst,
void *pLast,
char *pFirst,
char *pLast,
const char *pOwnerName);
LOCAL long devInsertAddress(
LIST *pRangeList,
@@ -140,25 +142,25 @@ LOCAL long devInstallAddr(
rangeItem *pRange,
const char *pOwnerName,
epicsAddressType addrType,
void *pFirst,
void *pLast,
char *pFirst,
char *pLast,
void **pLocalAddress);
LOCAL long blockDivide(
epicsAddressType addrType,
void *pBlockFirst,
void *pBlockLast,
char *pBlockFirst,
char *pBlockLast,
/* base address found */
void **ppBase,
char **ppBase,
unsigned long requestSize
);
LOCAL long blockProbe(
epicsAddressType addrType,
void *pFirst,
void *pLast
char *pFirst,
char *pLast
);
long locationProbe(
epicsAddressType addrType,
void *pLocation
char *pLocation
);
/*
@@ -336,8 +338,8 @@ void *baseAddress,
unsigned long size,
void **pLocalAddress)
{
void *pFirst;
void *pLast;
char *pFirst;
char *pLast;
rangeItem *pRange;
long s;
@@ -357,7 +359,7 @@ void **pLocalAddress)
return S_dev_lowValue;
}
pFirst = baseAddress;
pFirst = (char *) baseAddress;
pLast = pFirst + size - 1;
FASTLOCK(&addrListLock);
@@ -407,25 +409,26 @@ LOCAL long devInstallAddr(
rangeItem *pRange, /* item on the free list to be split */
const char *pOwnerName,
epicsAddressType addrType,
void *pFirst,
void *pLast,
void **pLocalAddress)
char *pFirst,
char *pLast,
void **ppLocalAddress)
{
rangeItem *pNewRange;
int s;
if(pLocalAddress){
int s1;
int s2;
if(ppLocalAddress){
char *pAddr;
int s1;
int s2;
s1 = sysBusToLocalAdrs(
EPICStovxWorksAddrType[addrType],
pLast,
(char **)pLocalAddress);
&pAddr);
s2 = sysBusToLocalAdrs(
EPICStovxWorksAddrType[addrType],
pFirst,
(char **)pLocalAddress);
&pAddr);
if(s1 || s2){
errPrintf(
S_dev_vxWorksAddrMapFail,
@@ -437,6 +440,8 @@ void **pLocalAddress)
pLast-pFirst+1);
return S_dev_vxWorksAddrMapFail;
}
*ppLocalAddress = (void *) pAddr;
}
/*
@@ -505,8 +510,8 @@ void **pLocalAddress)
*/
LOCAL long report_conflict(
epicsAddressType addrType,
void *pFirst,
void *pLast,
char *pFirst,
char *pLast,
const char *pOwnerName
)
{
@@ -567,6 +572,7 @@ epicsAddressType addrType,
void *baseAddress,
const char *pOwnerName)
{
char *charAddress = (char *) baseAddress;
rangeItem *pRange;
int s;
@@ -577,7 +583,7 @@ const char *pOwnerName)
}
}
s = addrVerify(addrType, baseAddress);
s = addrVerify(addrType, charAddress);
if(s != SUCCESS){
return s;
}
@@ -585,10 +591,10 @@ const char *pOwnerName)
FASTLOCK(&addrListLock);
pRange = (rangeItem *) addrAlloc[addrType].node.next;
while(pRange){
if(pRange->pFirst == baseAddress){
if(pRange->pFirst == charAddress){
break;
}
if(pRange->pFirst > baseAddress){
if(pRange->pFirst > charAddress){
pRange = NULL;
break;
}
@@ -608,7 +614,7 @@ const char *pOwnerName)
__LINE__,
"unregister address for %s at 0X %X failed because %s owns it",
pOwnerName,
baseAddress,
charAddress,
pRange->pOwnerName);
return s;
}
@@ -730,7 +736,7 @@ void **pLocalAddress)
{
int s;
rangeItem *pRange;
void *pBase;
char *pBase;
s = addrVerify(addrType, (void *)size);
if(s){
@@ -745,9 +751,6 @@ void **pLocalAddress)
pRange = (rangeItem *) addrFree[addrType].node.next;
while(pRange){
if(pRange->pLast-pRange->pFirst>=size-1){
void *pF;
void *pL;
s = blockFind(
addrType,
pRange->pFirst,
@@ -875,9 +878,11 @@ LOCAL long devListAddressMap(LIST *pRangeList)
printf("%s Address Map\n", epicsAddressTypeName[i]);
}
while(pri){
printf("0X %08X - %08X %s\n",
pri->pFirst,
pri->pLast,
printf("0X %0*lX - %0*lX %s\n",
(int) (sizeof (pri->pFirst) * 2U),
(unsigned long) pri->pFirst,
(int) (sizeof (pri->pFirst) * 2U),
(unsigned long) pri->pLast,
pri->pOwnerName);
pri = (rangeItem *) lstNext(&pri->node);
}
@@ -923,9 +928,9 @@ void unsolicitedHandlerEPICS(int vectorNumber)
LOCAL
void initHandlerAddrList(void)
{
int i;
UINT8 type;
int status;
int i;
SYM_TYPE type;
int status;
for(i=0; i<NELEMENTS(defaultHandlerNames); i++){
status =
@@ -951,18 +956,17 @@ void initHandlerAddrList(void)
*
*
*/
LOCAL
void (*isrFetch(unsigned vectorNumber))()
LOCAL myISR *isrFetch(unsigned vectorNumber)
{
void (*psub)();
void (*pCISR)();
myISR *psub;
myISR *pCISR;
void *pParam;
int s;
/*
* fetch the handler or C stub attached at this vector
*/
psub = (void (*)()) intVecGet((FUNCPTR *)INUM_TO_IVEC(vectorNumber));
psub = (myISR *) intVecGet((FUNCPTR *)INUM_TO_IVEC(vectorNumber));
/*
* from libvxWorks/veclist.c
@@ -993,7 +997,7 @@ unsigned vectorNumber
{
static int init;
int i;
void (*psub)();
myISR *psub;
if(!init){
initHandlerAddrList();
@@ -1026,11 +1030,11 @@ unsigned vectorNumber
*/
LOCAL long blockFind(
epicsAddressType addrType,
void *pBlockFirst,
void *pBlockLast,
char *pBlockFirst,
char *pBlockLast,
unsigned long size, /* size needed */
unsigned alignment, /* n ls bits zero in base addr */
void **ppBase /* base address found */
char **ppBase /* base address found */
)
{
int s;
@@ -1041,7 +1045,7 @@ void **ppBase /* base address found */
*/
mask = devCreateMask(alignment);
if(mask&(long)pBlockFirst){
pBlockFirst = (void *) (mask | (unsigned long) pBlockFirst);
pBlockFirst = (char *) (mask | (unsigned long) pBlockFirst);
pBlockFirst++;
}
@@ -1088,17 +1092,17 @@ void **ppBase /* base address found */
*/
LOCAL long blockDivide(
epicsAddressType addrType,
void *pBlockFirst,
void *pBlockLast,
void **ppBase, /* base address found */
char *pBlockFirst,
char *pBlockLast,
char **ppBase, /* base address found */
unsigned long requestSize
)
{
void *pBlock;
char *pBlock;
unsigned long bs;
int s;
s = blockProbe(addrType,pBlockFirst, pBlockFirst+(requestSize-1));
s = blockProbe(addrType, pBlockFirst, pBlockFirst+(requestSize-1));
if(!s){
*ppBase = pBlockFirst;
return SUCCESS;
@@ -1137,11 +1141,11 @@ unsigned long requestSize
*/
LOCAL long blockProbe(
epicsAddressType addrType,
void *pFirst,
void *pLast
char *pFirst,
char *pLast
)
{
void *pProbe;
char *pProbe;
int s;
pProbe = pFirst;
@@ -1161,10 +1165,10 @@ void *pLast
*/
long locationProbe(
epicsAddressType addrType,
void *pLocation
char *pLocation
)
{
void *pPhysical;
char *pPhysical;
int s;
/*
@@ -1174,33 +1178,33 @@ void *pLocation
s = sysBusToLocalAdrs(
EPICStovxWorksAddrType[addrType],
pLocation,
(char **)&pPhysical);
&pPhysical);
if(s<0){
return S_dev_vxWorksAddrMapFail;
}
{
char *pChar;
char byte;
int8_t *pChar;
int8_t byte;
pChar = pPhysical;
pChar = (int8_t *) pPhysical;
if(devPtrAlignTest(pChar)){
s = vxMemProbe(
pChar,
(char *) pChar,
READ,
sizeof(byte),
&byte);
(char *) &byte);
if(s!=ERROR){
return S_dev_addressOverlap;
}
}
}
{
short *pWord;
short word;
int16_t *pWord;
int16_t word;
pWord = pPhysical;
pWord = (int16_t *)pPhysical;
if(devPtrAlignTest(pWord)){
s = vxMemProbe(
(char *)pWord,
@@ -1213,10 +1217,10 @@ void *pLocation
}
}
{
long *pLongWord;
long longWord;
int32_t *pLongWord;
int32_t longWord;
pLongWord = pPhysical;
pLongWord = (int32_t *) pPhysical;
if(devPtrAlignTest(pLongWord)){
s = vxMemProbe(
(char *)pLongWord,
@@ -1270,13 +1274,15 @@ void *devLibA24Malloc(size_t size)
void *ret;
if (devLibA24Debug)
printf("devLibA24Malloc(%d) entered\n", size);
logMsg("devLibA24Malloc(%d) entered\n", size, 0,0,0,0,0);
if (A24MallocFunc == NULL)
{
/* See if the sysA24Malloc() function is present. */
if(symFindByName(sysSymTbl,"_sysA24Malloc", (char**)&A24MallocFunc,&stype)==ERROR)
{ /* Could not find sysA24Malloc... use the malloc one and hope we are OK */
if (devLibA24Debug)
logMsg("devLibA24Malloc() using regular malloc\n",0,0,0,0,0,0);
A24MallocFunc = malloc;
A24FreeFunc = free;
}
@@ -1284,6 +1290,8 @@ void *devLibA24Malloc(size_t size)
{
if(symFindByName(sysSymTbl,"_sysA24Free", (char**)&A24FreeFunc, &stype) == ERROR)
{ /* That's strange... we have malloc, but no free! */
if (devLibA24Debug)
logMsg("devLibA24Malloc() using regular malloc\n",0,0,0,0,0,0);
A24MallocFunc = malloc;
A24FreeFunc = free;
}
@@ -1301,5 +1309,8 @@ void *devLibA24Malloc(size_t size)
void devLibA24Free(void *pBlock)
{
if (devLibA24Debug)
logMsg("devLibA24Free(%p) entered\n", (unsigned long)pBlock,0,0,0,0,0);
A24FreeFunc(pBlock);
}

View File

@@ -1,6 +1,21 @@
/*
* $Log$
* Revision 1.7 1995/02/02 17:15:55 jbk
* Removed the stinking message "Cannot contact master timing IOC ".
*
* Revision 1.6 1995/02/01 15:29:54 winans
* Added a type field to the configure command to disable the use of the event
* system hardware if desired.
*
* Revision 1.5 1994/12/16 15:51:21 winans
* Changed error message in the event system error handler & added a conditional
* based on a debug flag to print it... defaults to off. (Per request from MRK.)
*
* Revision 1.4 1994/10/28 20:15:10 jbk
* increased the USP packet time-out to 250ms, added a parm to the configure()
* routine to let user specify it.
*
*/
/**************************************************************************
@@ -62,7 +77,12 @@ LICENSING INQUIRIES MAY BE DIRECTED TO THE INDUSTRIAL TECHNOLOGY
DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
*/
#if 1
#define NODEBUG
#define MAKE_DEBUG 0
#else
#define MAKE_DEBUG TSdriverDebug
#endif
#define TS_DRIVER
#include <vxWorks.h>
@@ -99,8 +119,12 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
#include <drvTS.h>
/* #define FL M_drvSup,__FILE__,__LINE__ */
#if 0
#define FL stderr
#define errPrintf fprintf
#else
#define FL M_drvSup,__FILE__,__LINE__
#endif
/* functions used by this driver */
static long TSgetUnixTime(struct timespec*);
@@ -173,7 +197,7 @@ TSinfo TSdata = { TS_master_dead, TS_async_slave, TS_async_none,
0,NULL,
TS_SYNC_RATE_SEC,TS_CLOCK_RATE_HZ,0,TS_TIME_OUT_MS,0,
TS_MASTER_PORT,TS_SLAVE_PORT,1,0,0,
NULL, NULL,NULL };
NULL, NULL,NULL, 0 };
extern char* sysBootLine;
@@ -244,9 +268,12 @@ long TSreport()
TSconfigure() - This is the configuration routine which is meant to
be called from the vxWorks startup.cmd script before iocInit.
It's job is to set operating parameters for the time stamp support code.
JRW -- if type = 0, then try to config using event system
if type = 1, then permanantly inhibit use of the event system
*/
void TSconfigure(int master, int sync_rate_sec, int clock_rate_hz,
int master_port, int slave_port, unsigned long time_out)
int master_port, int slave_port, unsigned long time_out, int type)
{
if(master) TSdata.master_timing_IOC=1;
else TSdata.master_timing_IOC=0;
@@ -268,6 +295,8 @@ void TSconfigure(int master, int sync_rate_sec, int clock_rate_hz,
if(time_out) TSdata.time_out=time_out;
else TSdata.time_out=TS_TIME_OUT_MS;
TSdata.UserRequestedType = type;
return;
}
@@ -342,39 +371,56 @@ long TSinit()
SYM_TYPE stype;
Debug(5,"In TSinit()\n",0);
/* ------------------------------------------------------------- */
/* find the lower level event system functions */
if(symFindByName(sysSymTbl,"_ErHaveReceiver",
(char**)&TShaveReceiver,&stype)==ERROR)
TShaveReceiver = TShaveReceiverError;
if(symFindByName(sysSymTbl,"_ErGetTicks",
(char**)&TSgetTicks,&stype)==ERROR)
TSgetTicks = TSgetTicksError;
if(symFindByName(sysSymTbl,"_ErRegisterEventHandler",
(char**)&TSregisterEventHandler,&stype)==ERROR)
TSregisterEventHandler = TSregisterEventHandlerError;
if(symFindByName(sysSymTbl,"_ErRegisterErrorHandler",
(char**)&TSregisterErrorHandler,&stype)==ERROR)
TSregisterErrorHandler = TSregisterErrorHandlerError;
if(symFindByName(sysSymTbl,"_ErForceSync",
(char**)&TSforceSync,&stype)==ERROR)
TSforceSync = TSforceSoftSync;
if(symFindByName(sysSymTbl,"_ErGetTime",
(char**)&TSgetTime,&stype)==ERROR)
TSgetTime = TSgetCurrentTime;
if(symFindByName(sysSymTbl,"_ErSyncEvent",
(char**)&TSsyncEvent,&stype)==ERROR)
TSdata.sync_event=ER_EVENT_RESET_TICK;
if (TSdata.UserRequestedType == 0)
{ /* default configuration probe */
/* ------------------------------------------------------------- */
/* find the lower level event system functions */
if(symFindByName(sysSymTbl,"_ErHaveReceiver",
(char**)&TShaveReceiver,&stype)==ERROR)
TShaveReceiver = TShaveReceiverError;
if(symFindByName(sysSymTbl,"_ErGetTicks",
(char**)&TSgetTicks,&stype)==ERROR)
TSgetTicks = TSgetTicksError;
if(symFindByName(sysSymTbl,"_ErRegisterEventHandler",
(char**)&TSregisterEventHandler,&stype)==ERROR)
TSregisterEventHandler = TSregisterEventHandlerError;
if(symFindByName(sysSymTbl,"_ErRegisterErrorHandler",
(char**)&TSregisterErrorHandler,&stype)==ERROR)
TSregisterErrorHandler = TSregisterErrorHandlerError;
if(symFindByName(sysSymTbl,"_ErForceSync",
(char**)&TSforceSync,&stype)==ERROR)
TSforceSync = TSforceSoftSync;
if(symFindByName(sysSymTbl,"_ErGetTime",
(char**)&TSgetTime,&stype)==ERROR)
TSgetTime = TSgetCurrentTime;
if(symFindByName(sysSymTbl,"_ErSyncEvent",
(char**)&TSsyncEvent,&stype)==ERROR)
TSdata.sync_event=ER_EVENT_RESET_TICK;
else
TSdata.sync_event=TSsyncEvent();
/* ------------------------------------------------------------- */
}
else
TSdata.sync_event=TSsyncEvent();
{ /* inhibit probe and use of the event system */
/* ------------------------------------------------------------- */
printf("WARNING: drvTS event hardware probe inhibited by user\n");
TShaveReceiver = TShaveReceiverError;
TSgetTicks = TSgetTicksError;
TSregisterEventHandler = TSregisterEventHandlerError;
TSregisterErrorHandler = TSregisterErrorHandlerError;
TSforceSync = TSforceSoftSync;
TSgetTime = TSgetCurrentTime;
TSdata.sync_event=ER_EVENT_RESET_TICK;
}
/* set all the known information about the system */
TSdata.event_table=NULL;
@@ -484,12 +530,14 @@ long TSinit()
{
struct timespec tp;
clock_gettime(CLOCK_REALTIME,&tp);
/* this should work */
errPrintf(FL,"Failed to set time from Unix server\n");
}
if( TSsetClockFromMaster()<0 )
{
errPrintf(FL,"Could not contact a master timing IOC\n");
/* do nothing here */
/* errPrintf(FL,"Could not contact a master timing IOC\n"); */
}
else
TSdata.state = TS_master_alive;
@@ -653,7 +701,23 @@ static void TSerrorHandler(int Card, int ErrorNum)
Could put the slave on the vxworks timer until next sync
*/
logMsg("***TSerrorHandler: error number %d=n",ErrorNum,0,0,0,0,0);
if(MAKE_DEBUG)
{
switch(ErrorNum)
{
case 1:
logMsg("***TSerrorHandler: event system error: TAXI violation",0,0,0,0,0,0);
break;
case 2:
logMsg("***TSerrorHandler: event system error: lost heartbeat",0,0,0,0,0,0);
break;
case 3:
logMsg("***TSerrorHandler: event system error: lost events",0,0,0,0,0,0);
break;
default:
logMsg("***TSerrorHandler: unknown error %d from event system", ErrorNum,0,0,0,0,0);
}
}
return;
}

View File

@@ -53,11 +53,12 @@
* .23 09-10-92 rcz changed funcptr pinitHooks from ret long to void
* .24 09-11-92 rcz moved setMasterTimeToSelf to a seperate C file
* .25 07-15-93 mrk Changed dbLoad for new dbStaticLib support
<<<<<<< iocInit.c
* .26 02-09-94 jbk changed to new time stamp support software ts_init()
* .27 03-18-94 mcn added comments
* .28 03-23-94 mrk Added asInit
* .29 04-04-94 mcn added code for uninitialized conversions (link conversion field)
* .30 01-10-95 joh Fixed no quoted strings in resource.def problem
* .31 02-10-95 joh static => LOCAL
*/
#include <vxWorks.h>
@@ -65,13 +66,17 @@
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <ellLib.h>
#include <errno.h>
#include <sysLib.h>
#include <symLib.h>
#include <sysSymTbl.h> /* for sysSymTbl*/
#include <logLib.h>
#include <taskLib.h>
#include <envLib.h>
#include <errnoLib.h>
#include <ellLib.h>
#include <sdrHeader.h>
#include <fast_lock.h>
#include <choice.h>
@@ -98,7 +103,7 @@
#define MODULE_TYPES_INIT 1
#include <module_types.h>
static initialized=FALSE;
LOCAL int initialized=FALSE;
/* The following is for use by interrupt routines */
int interruptAccept=FALSE;
@@ -109,15 +114,18 @@ struct dbBase *pdbBase=NULL;
long dbCommonInit();
/* define forward references*/
static long initDrvSup(void);
static long initRecSup(void);
static long initDevSup(void);
static long finishDevSup(void);
static long initDatabase(void);
static void createLockSets(void);
static short makeSameSet(struct dbAddr *paddr,short set);
static long initialProcess(void);
static long getResources(char *fname);
LOCAL long initDrvSup(void);
LOCAL long initRecSup(void);
LOCAL long initDevSup(void);
LOCAL long finishDevSup(void);
LOCAL long initDatabase(void);
LOCAL void createLockSets(void);
LOCAL short makeSameSet(struct dbAddr *paddr,short set);
LOCAL long initialProcess(void);
LOCAL long getResources(char *fname);
LOCAL int getResourceToken(FILE *fp, char *pToken, unsigned maxToken);
LOCAL int getResourceTokenInternal(FILE *fp, char *pToken, unsigned maxToken);
/*
* Initialize EPICS on the IOC.
@@ -140,13 +148,7 @@ int iocInit(char * pResourceFilename)
return(-1);
}
/*
* Build the data structure for error reporting
*/
if ((errSymBld()) != 0) {
logMsg("iocInit aborting because errSymBld failed to initialize \n",0,0,0,0,0,0);
return(-1);
}
errInit(); /*Initialize errPrintf task*/
/*
* Setup initialization hooks, but only if an initHooks routine has been defined.
@@ -176,11 +178,6 @@ int iocInit(char * pResourceFilename)
* Read EPICS resources.
*/
status = getResources(pResourceFilename);
if (status != 0) {
logMsg("iocInit aborting because getResources failed\n",0,0,0,0,0,0);
return(-1);
}
/* Call hook for after resources are read. */
if (pinitHooks) (*pinitHooks)(INITHOOKafterGetResources);
@@ -322,7 +319,7 @@ int iocInit(char * pResourceFilename)
* Call the initialization routine (init) for each
* driver type.
*/
static long initDrvSup(void) /* Locate all driver support entry tables */
LOCAL long initDrvSup(void) /* Locate all driver support entry tables */
{
char *pname;
char name[40];
@@ -341,7 +338,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
if (!(pdrvSup=pdbBase->pdrvSup)) {
status = S_drv_noDrvSup;
errMessage(status,"No device drivers are defined");
errMessage(status,"");
return(status);
}
@@ -360,7 +357,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
vxstatus = symFindByName(sysSymTbl, name, (void *) &(pdrvSup->papDrvet[i]), &type);
if (vxstatus != OK) {
strcpy(message,"driver entry table not found for ");
strcpy(message,": ");
strcat(message,pname);
status = S_drv_noDrvet;
errMessage(status,message);
@@ -389,7 +386,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
* Call the initialization routine (init) for each
* record type.
*/
static long initRecSup(void)
LOCAL long initRecSup(void)
{
char name[40];
int i;
@@ -404,7 +401,7 @@ static long initRecSup(void)
if(!(precType=pdbBase->precType)) {
status = S_rectype_noRecs;
errMessage(status,"No record types defined");
errMessage(status,"");
return(status);
}
@@ -450,7 +447,7 @@ static long initRecSup(void)
(void *) (&precSup->papRset[i]), &type);
if (vxstatus != OK) {
strcpy(message,"record support entry table not found for ");
strcpy(message,": ");
strcat(message,name);
status = S_rec_noRSET;
errMessage(status,message);
@@ -476,7 +473,7 @@ static long initRecSup(void)
* Call the initialization routine (init) for each
* device type (First Pass).
*/
static long initDevSup(void)
LOCAL long initDevSup(void)
{
char *pname;
char name[40];
@@ -491,7 +488,7 @@ static long initDevSup(void)
if (!(precDevSup = pdbBase->precDevSup)) {
status = S_dev_noDevSup;
errMessage(status,"No device support is defined");
errMessage(status,"");
return(status);
}
@@ -523,7 +520,7 @@ static long initDevSup(void)
if (vxstatus != OK) {
pdevSup->papDset[j]=NULL;
strcpy(message, "device support entry table not found for ");
strcpy(message, ": ");
strcat(message, pname);
status = S_dev_noDSET;
errMessage(status, message);
@@ -549,7 +546,7 @@ static long initDevSup(void)
* after the database records have been initialized and
* placed into lock sets.
*/
static long finishDevSup(void)
LOCAL long finishDevSup(void)
{
int i,j;
struct recDevSup *precDevSup;
@@ -581,7 +578,7 @@ static long finishDevSup(void)
return(0);
}
static long initDatabase(void)
LOCAL long initDatabase(void)
{
char name[PVNAME_SZ+FLDNAME_SZ+2];
short i,j;
@@ -615,7 +612,7 @@ static long initDatabase(void)
*/
if (!(precHeader = pdbBase->precHeader)) {
status = S_record_noRecords;
errMessage(status,"No database records are defined");
errMessage(status,"");
return(status);
}
@@ -660,7 +657,7 @@ static long initDatabase(void)
if (!prset) {
strcpy(name,precType->papName[i]);
strcat(name,"RSET");
strcpy(message,"record support entry table not found for ");
strcpy(message,": ");
strcat(message,name);
status = S_rec_noRSET;
errMessage(status,message);
@@ -778,9 +775,10 @@ static long initDatabase(void)
* Severity/No Maximize Severity(MS/NMS), and output NMS
* links ... The following code checks for this.
*/
if (plink->value.db_link.process_passive
if (errVerbose &&
(plink->value.db_link.process_passive
|| (pfldDes->field_type == DBF_OUTLINK
&& plink->value.db_link.maximize_sevr))
&& plink->value.db_link.maximize_sevr)))
{
/*
* Link PP and/or Outlink MS ...
@@ -795,7 +793,7 @@ static long initDatabase(void)
strcat(message," PP and/or MS illegal");
status = S_db_badField;
errMessage(status,message);
if(rtnval==OK) rtnval=status;
status = 0;
}
}
}
@@ -842,7 +840,7 @@ static long initDatabase(void)
* lock set. Records connected by forward links are
* definately considered part of the same lockset.
*/
static void createLockSets(void)
LOCAL void createLockSets(void)
{
int i,link;
struct recLoc *precLoc;
@@ -935,7 +933,7 @@ static void createLockSets(void)
dbScanLockInit(nset);
}
static short makeSameSet(struct dbAddr *paddr, short lset)
LOCAL short makeSameSet(struct dbAddr *paddr, short lset)
{
struct dbCommon *precord = paddr->precord;
short link;
@@ -1006,7 +1004,7 @@ static short makeSameSet(struct dbAddr *paddr, short lset)
* Process database records at initialization if
* their pini (process at init) field is set.
*/
static long initialProcess(void)
LOCAL long initialProcess(void)
{
short i;
struct recHeader *precHeader;
@@ -1030,199 +1028,362 @@ static long initialProcess(void)
return(0);
}
#define MAX 128
#define MAX 256
#define SAME 0
static char *cvt_str[] = {
enum resType {
resDBF_STRING,
resDBF_SHORT,
resDBF_LONG,
resDBF_FLOAT,
resDBF_DOUBLE,
resInvalid};
LOCAL char *cvt_str[] = {
"DBF_STRING",
"DBF_SHORT",
"DBF_LONG",
"DBF_FLOAT",
"DBF_DOUBLE"
"DBF_DOUBLE",
"Invalid",
};
#define CVT_COUNT (sizeof(cvt_str) / sizeof(char*))
static long getResources(char *fname)
#define EPICS_ENV_PREFIX "EPICS_"
long getResources(char *fname)
{
FILE *fp;
int len;
int len2;
int lineNum = 0;
int i = 0;
int found = 0;
int cvType = 0;
int epicsFlag;
char buff[MAX + 1];
char name[40];
char s1[MAX];
char s2[MAX];
char s3[MAX];
char message[100];
long rtnval = 0;
char name[40];
FILE *fp;
enum resType cvType = resInvalid;
int epicsFlag;
SYM_TYPE type;
char *pSymAddr;
char *pSymAddr;
short n_short;
long n_long;
float n_float;
double n_double;
int status;
if (!fname) return (0);
if ((fp = fopen(fname, "r")) == 0) {
errMessage(-1L, "getResources: No such Resource file");
errPrintf(
-1L,
__FILE__,
__LINE__,
"No such Resource file - %s",
fname);
return (-1);
}
while ( fgets( buff, MAX, fp) != NULL) {
len = strlen(buff);
lineNum++;
if (len < 2)
goto CLEAR;
if (len >= MAX) {
sprintf(message,
"getResources: Line too long - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
}
for (i = 0; i < len; i++) {
if (buff[i] == '!') {
goto CLEAR;
}
}
/* extract the 3 fields as strings */
if ((sscanf(buff, "%s %s %s", s1, s2, s3)) != 3) {
sprintf(message,
"getResources: Not enough fields - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
}
found = 0;
len2 = strlen(s2);
for (i = 0; i < CVT_COUNT; i++) {
while (TRUE) {
status = getResourceToken (fp, s1, sizeof(s1));
if (status<0) {
/*
* EOF
*/
break;
}
status = getResourceToken (fp, s2, sizeof(s2));
if (status<0) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Missing resource data type field for resource=%s in file=%s",
s1,
fname);
break;
}
status = getResourceToken (fp, s3, sizeof(s3));
if (status<0) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Missing resource value field for resource=%s data type=%s file=%s",
s1,
s2,
fname);
break; /* EOF */
}
if ((strncmp(s2, cvt_str[i], len2)) == SAME) {
found = 1;
cvType = i;
for (cvType = 0; cvType < resInvalid; cvType++) {
if (strcmp(s2, cvt_str[cvType]) == SAME) {
break;
}
}
if (!found) {
sprintf(message,
"getResources: Field 2 not defined - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
}
strcpy(name, "_");
strcat(name, s1);
rtnval = symFindByName(sysSymTbl, name, &pSymAddr, &type);
if (rtnval != OK) {
sprintf(message,
"getResources: Symbol name not found - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
status = symFindByName(sysSymTbl, name, &pSymAddr, &type);
if (status!= OK) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Matching Symbol name not found for resource=%s",
s1);
continue;
}
status = strncmp (
s1,
EPICS_ENV_PREFIX,
strlen (EPICS_ENV_PREFIX));
if (status == SAME) {
epicsFlag = 1;
if (cvType != resDBF_STRING) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"%s should be set with type DBF_STRING not type %s",
s1,
s2);
continue;
}
}
else {
epicsFlag = 0;
}
if ( (strncmp(s1,"EPICS_",6)) == SAME)
epicsFlag = 1;
else
epicsFlag = 0;
switch (cvType) {
case 0: /* DBF_STRING */
len = strlen(s3);
len2 = 20;
if (len >= len2) {
sprintf(message,
"getResources: Warning, string might exceed previous reserved space - line=%d",
lineNum);
errMessage(-1L, message);
}
if ( epicsFlag )
strncpy(pSymAddr+sizeof(void *), s3, len + 1);
else
strncpy(pSymAddr, s3, len + 1);
break;
case 1: /* DBF_SHORT */
if ((sscanf(s3, "%hd", &n_short)) != 1) {
sprintf(message,
"getResources: conversion failed - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
}
case resDBF_STRING:
if ( epicsFlag ) {
sprintf(message,
"getResources: %s is of type DBF_STRING - line =%d",
name,lineNum);
errMessage(-1L, message);
}
else
*(short *) pSymAddr = n_short;
char *pEnv;
break;
case 2: /* DBF_LONG */
if ((sscanf(s3, "%ld", &n_long)) != 1) {
sprintf(message,
"getResources: conversion failed - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
/*
* space for two strings, an '=' character,
* and a null termination
*/
pEnv = malloc (strlen (s3) + strlen (s1) + 2);
if (!pEnv) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
s1,
s3,
strerror (errnoGet()));
break;
}
strcpy (pEnv, s1);
strcat (pEnv, "=");
strcat (pEnv, s3);
status = putenv (pEnv);
if (status<0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
s1,
s3,
strerror (errnoGet()));
}
/*
* vxWorks copies into a private buffer
* (this does not match UNIX behavior)
*/
free (pEnv);
}
if ( epicsFlag ) {
sprintf(message,
"getResources: %s is of type DBF_STRING - line =%d",
name,lineNum);
errMessage(-1L, message);
}
else
*(long *) pSymAddr = n_long;
break;
case 3: /* DBF_FLOAT */
if ((sscanf(s3, "%e", &n_float)) != 1) {
sprintf(message,
"getResources: conversion failed - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
else{
strcpy(pSymAddr, s3);
}
if ( epicsFlag ) {
sprintf(message,
"getResources: %s is of type DBF_STRING - line =%d",
name,lineNum);
errMessage(-1L, message);
}
else
*(float *) pSymAddr = n_float;
break;
break;
case 4: /* DBF_DOUBLE */
if ((sscanf(s3, "%le", &n_double)) != 1) {
sprintf(message,
"getResources: conversion failed - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
case resDBF_SHORT:
if (sscanf(s3, "%hd", &n_short) != 1) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Resource=%s value=%s conversion to %s failed",
s1,
s3,
cvt_str[cvType]);
continue;
}
if ( epicsFlag ) {
sprintf(message,
"getResources: %s is of type DBF_STRING - line =%d",
name,lineNum);
errMessage(-1L, message);
}
else
*(double *) pSymAddr = n_double;
*(short *) pSymAddr = n_short;
break;
case resDBF_LONG:
if (sscanf(s3, "%ld", &n_long) != 1) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Resource=%s value=%s conversion to %s failed",
s1,
s3,
cvt_str[cvType]);
continue;
}
*(long *) pSymAddr = n_long;
break;
case resDBF_FLOAT:
if (sscanf(s3, "%e", &n_float) != 1) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Resource=%s value=%s conversion to %s failed",
s1,
s3,
cvt_str[cvType]);
continue;
}
*(float *) pSymAddr = n_float;
break;
case resDBF_DOUBLE:
if (sscanf(s3, "%le", &n_double) != 1) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Resource=%s value=%s conversion to %s failed",
s1,
s3,
cvt_str[cvType]);
continue;
}
*(double *) pSymAddr = n_double;
break;
default:
sprintf(message,
"getResources: switch default reached - line=%d", lineNum);
errMessage(-1L, message);
return (-1);
break;
errPrintf (
-1L,
__FILE__,
__LINE__,
"Invalid data type field=%s for resource=%s",
s2,
s1);
continue;
}
CLEAR: memset(buff, '\0', MAX);
memset(s1, '\0', MAX);
memset(s2, '\0', MAX);
memset(s3, '\0', MAX);
}
fclose(fp);
return (0);
}
static gotSdrSum=FALSE;
static struct sdrSum sdrSum;
/*
* getResourceToken
*/
LOCAL int getResourceToken(FILE *fp, char *pToken, unsigned maxToken)
{
int status;
/*
* keep reading until we get a token
* (and comments have been stripped)
*/
while (TRUE) {
status = getResourceTokenInternal (fp, pToken, maxToken);
if (status < 0) {
return status;
}
if (pToken[0] != '\0') {
return status;
}
}
}
/*
* getResourceTokenInternal
*/
LOCAL int getResourceTokenInternal(FILE *fp, char *pToken, unsigned maxToken)
{
char formatString[32];
char quoteCharString[2];
int status;
quoteCharString[0] = '\0';
status = fscanf (fp, " %1[\"`'!]", quoteCharString);
if (status<0) {
return status;
}
switch (quoteCharString[0]) {
/*
* its a comment
* (consume everything up to the next new line)
*/
case '!':
{
char tmp[MAX];
sprintf(formatString, "%%%d[^\n\r\v\f]", sizeof(tmp)-1);
status = fscanf (fp, "%[^\n\r\v\f]",tmp);
pToken[0] = '\0';
if (status<0) {
return status;
}
break;
}
/*
* its a plain token
*/
case '\0':
sprintf(formatString, " %%%ds", maxToken-1);
status = fscanf (fp, formatString, pToken);
if (status!=1) {
if (status < 0){
pToken[0] = '\0';
return status;
}
}
break;
/*
* it was a quoted string
*/
default:
sprintf(
formatString,
"%%%d[^%c]",
maxToken-1,
quoteCharString[0]);
status = fscanf (fp, formatString, pToken);
if (status!=1) {
if (status < 0){
pToken[0] = '\0';
return status;
}
}
sprintf(formatString, "%%1[%c]", quoteCharString[0]);
status = fscanf (fp, formatString, quoteCharString);
if (status!=1) {
errPrintf (
-1L,
__FILE__,
__LINE__,
"Resource file syntax error: unterminated string \"%s\"",
pToken);
pToken[0] = '\0';
if (status < 0){
return status;
}
}
break;
}
return 0;
}
LOCAL int gotSdrSum=FALSE;
LOCAL struct sdrSum sdrSum;
int dbLoad(char * pfilename)
{
long status;

View File

@@ -109,7 +109,6 @@ void recGblRecordError(long status,void *pdbc,char *pcaller_name)
strcat(buffer," ");
}
if(pcaller_name) {
strcat(buffer,"error detected in routine: ");
strcat(buffer,pcaller_name);
}
errMessage(status,buffer);

View File

@@ -259,13 +259,22 @@ int dbLoadRecords(char* pfilename, char* pattern, char* container)
if(is_not_inited)
{
#ifdef ERROR_STUFF
fprintf(stderr,"initing parser\n");
#endif
yyin=fp;
is_not_inited=0;
}
else
{
#ifdef ERROR_STUFF
fprintf(stderr,"restarting parser\n");
#endif
yyrestart(fp);
}
#ifdef ERROR_STUFF
fprintf(stderr,"before parser startup\n");
#endif
yyparse();
#ifndef vxWorks

View File

@@ -1,5 +1,5 @@
pvname [a-zA-Z0-9_\-:\.\[\]<>]
pvname [a-zA-Z0-9_\-:\.\[\]<>;]
value [a-zA-Z0-9_\,\^~\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$\{\}]
%{

View File

@@ -105,11 +105,11 @@ subst: PATTERN pattern subs
pattern: O_BRACE vars C_BRACE
{
/*
#ifdef ERROR_STUFF
int i;
for(i=0;i<var_count;i++) fprintf(stderr,"variable=(%s)\n",vars[i]);
fprintf(stderr,"var_count=%d\n",var_count);
*/
#endif
}
;
@@ -130,7 +130,9 @@ subs: subs sub
sub: WORD O_BRACE vals C_BRACE
{
sub_collect[strlen(sub_collect)-1]='\0';
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
#ifdef ERROR_STUFF
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
#endif
#ifndef SUB_TOOL
if(db_file_name)
dbLoadRecords(db_file_name,sub_collect,$1);
@@ -147,7 +149,9 @@ sub: WORD O_BRACE vals C_BRACE
| O_BRACE vals C_BRACE
{
sub_collect[strlen(sub_collect)-1]='\0';
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
#ifdef ERROR_STUFF
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
#endif
#ifndef SUB_TOOL
if(db_file_name)
dbLoadRecords(db_file_name,sub_collect,NULL);
@@ -199,7 +203,9 @@ var_subs: var_subs var_sub
var_sub: WORD O_BRACE sub_pats C_BRACE
{
sub_collect[strlen(sub_collect)-1]='\0';
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
#ifdef ERROR_STUFF
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
#endif
#ifndef SUB_TOOL
if(db_file_name)
dbLoadRecords(db_file_name,sub_collect,$1);
@@ -216,7 +222,9 @@ var_sub: WORD O_BRACE sub_pats C_BRACE
| O_BRACE sub_pats C_BRACE
{
sub_collect[strlen(sub_collect)-1]='\0';
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
#ifdef ERROR_STUFF
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
#endif
#ifndef SUB_TOOL
if(db_file_name)
dbLoadRecords(db_file_name,sub_collect,NULL);
@@ -292,7 +300,10 @@ int dbLoadTemplate(char* sub_file)
yyin=fp;
is_not_inited=0;
}
else yyrestart(fp);
else
{
yyrestart(fp);
}
yyparse();
@@ -324,12 +335,22 @@ main(int argc, char** argv)
}
/* use sub_collect and db_file_name to do work */
int sub_it()
static int sub_it()
{
FILE* fp;
char var_buff[500];
#ifdef ERROR_STUFF
fprintf(stderr,"In sub_it()\n");
#endif
if( *sub_collect )
{
#ifdef ERROR_STUFF
fprintf(stderr," dbInitSubst() calling\n");
#endif
dbInitSubst(sub_collect);
}
else
{
fprintf(stderr,"No valid substitutions found in table\n");
@@ -345,10 +366,16 @@ int sub_it()
/* do the work here */
while( fgets(var_buff,200,fp)!=(char*)NULL )
{
#ifdef ERROR_STUFF
fprintf(stderr," calling dbDoSubst()\n");
#endif
dbDoSubst(var_buff,500,NULL);
fputs(var_buff,stdout);
}
#ifdef ERROR_STUFF
fprintf(stderr," calling dbFreeSubst()\n");
#endif
dbFreeSubst();
fclose(fp);
return 0;

View File

@@ -191,13 +191,18 @@ long dbInitSubst(char* parm_pattern)
/* find vars and subs */
switch(*pp)
{
case '\\': pp++; break;
case '\\': pp++; break; /* skip the next character */
case '=': subst_total++; break;
case '\"': for(++pp;*pp!='\"';pp++) if(*pp=='\\') pp++; pp++; break;
case '\"':
for(++pp;*pp && *pp!='\"';pp++)
if(*pp=='\\') pp++;
break;
default: break;
}
}
/* fprintf(stderr,"total = %d\n",subst_total); */
#ifdef ERROR_STUFF
fprintf(stderr,"total = %d\n",subst_total);
#endif
/* allocate the substitution table */
subst = (struct var_sub*)malloc( sizeof(struct var_sub)*subst_total );
@@ -235,12 +240,12 @@ long dbInitSubst(char* parm_pattern)
}
/* debug code */
/*
#ifdef ERROR_STUFF
for(pi=0;pi<subst_total;pi++)
{
printf("table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
fprintf(stderr,"table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
}
*/
#endif
/* resolve the multiple substitutions now */
for(pi=0;pi<subst_total;pi++)
@@ -253,12 +258,12 @@ long dbInitSubst(char* parm_pattern)
}
/* more debug code */
/*
#ifdef ERROR_STUFF
for(pi=0;pi<subst_total;pi++)
{
printf("table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
fprintf(stderr,"table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
}
*/
#endif
}
else
{
@@ -276,7 +281,9 @@ static char* get_var(char** to, char* from)
pp = strpbrk(from," \t=");
*pp = '\0';
pp++;
/* fprintf(stderr,"get_var: (%s)\n",from); */
#ifdef ERROR_STUFF
fprintf(stderr,"get_var: (%s)\n",from);
#endif
*to=from;
return pp;
}
@@ -297,7 +304,9 @@ static char* get_sub(char* to, char* from)
else *cp++ = *pp;
}
*cp='\0';
/* fprintf(stderr,"get_sub: quote (%s)\n",to); */
#ifdef ERROR_STUFF
fprintf(stderr,"get_sub: quote (%s)\n",to);
#endif
pp++;
}
else
@@ -307,7 +316,9 @@ static char* get_sub(char* to, char* from)
{
*hold = '\0';
hold++;
/* fprintf(stderr,"get_sub: regular (%s)\n",pp); */
#ifdef ERROR_STUFF
fprintf(stderr,"get_sub: regular (%s)\n",pp);
#endif
}
strcpy(to,pp);

View File

@@ -2,195 +2,206 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_INCLUDES = -I../../drv
USR_INCLUDES = -I../../drv/ansi -I../../drv/old
SRCS.c = \
../devAiDvx2502.c\
../devAiSoft.c\
../devAiSoftRaw.c\
../devAiSymb.c\
../devAiTestAsyn.c\
../devAiXy566Di.c\
../devAiXy566DiL.c\
../devAiXy566Se.c\
../devAoSoft.c\
../devApsEg.c\
../devApsEr.c\
../devAoSoftRaw.c\
../devAoSymb.c\
../devAoTestAsyn.c\
../devAoVmiVme4100.c\
../devBiMpv910.c\
../devBiSoft.c\
../devBiSoftRaw.c\
../devBiTestAsyn.c\
../devBiXVme210.c\
../devBoMpv902.c\
../devBoSoft.c\
../devBoSoftRaw.c\
../devBoTestAsyn.c\
../devBoXVme220.c\
../devCommonGpib.c\
../devEventSoft.c\
../devEventTestIoEvent.c\
../devHistogramSoft.c\
../devHistogramTestAsyn.c\
../devLiSoft.c\
../devLiSymb.c\
../devLoSoft.c\
../devLoSymb.c\
../devMbbiMpv910.c\
../devMbbiSoft.c\
../devMbbiSoftRaw.c\
../devMbbiTestAsyn.c\
../devMbbiXVme210.c\
../devMbboMpv902.c\
../devMbboSoft.c\
../devMbboSoftRaw.c\
../devMbboTestAsyn.c\
../devMbboXVme220.c\
../devMbbiDirectMpv910.c\
../devMbbiDirectSoft.c\
../devMbbiDirectSoftRaw.c\
../devMbbiDirectXVme210.c\
../devMbboDirectMpv902.c\
../devMbboDirectSoft.c\
../devMbboDirectSoftRaw.c\
../devMbboDirectXVme220.c\
../devPtSoft.c\
../devSmCompumotor1830.c\
../devSmOms6Axis.c\
../devSiSoft.c\
../devSiSymb.c\
../devSiTestAsyn.c\
../devSoSoft.c\
../devSASoft.c\
../devSoSymb.c\
../devSoTestAsyn.c\
../devWfSoft.c\
../devWfTestAsyn.c\
../devWfXy566Sc.c\
../devAllenBradley.c\
../devAt5Vxi.c\
../devMz8310.c\
../devTimerMz8310.c\
../devVxiTDM.c\
../devAiKscV215.c\
../devXy240.c\
../devHpe1368a.c\
../devAt8Fp.c\
../devWfComet.c\
../devWfDvx2502.c\
../devWfJoergerVtr1.c\
../devAvme9440.c\
../devSysmon.c
# ../devAiCamac.c\
# ../devAaiCamac.c\
# ../devBiCamac.c\
# ../devLiCamac.c\
# ../devMbbiCamac.c\
# ../devMbbiDirectCamac.c\
# ../devWfCamac.c\
# ../devAoCamac.c\
# ../devAaoCamac.c\
# ../devBoCamac.c\
# ../devLoCamac.c\
# ../devMbboCamac.c\
# ../devMbboDirectCamac.c
# SRCS.c += ../devAaiCamac.c
# SRCS.c += ../devAiCamac.c
SRCS.c += ../devAiDvx2502.c
SRCS.c += ../devAiKscV215.c
SRCS.c += ../devAiSoft.c
SRCS.c += ../devAiSoftRaw.c
SRCS.c += ../devAiSymb.c
SRCS.c += ../devAiTestAsyn.c
SRCS.c += ../devAiXy566Di.c
SRCS.c += ../devAiXy566DiL.c
SRCS.c += ../devAiXy566Se.c
# SRCS.c += ../devAaoCamac.c
# SRCS.c += ../devAoCamac.c
SRCS.c += ../devAoSoft.c
SRCS.c += ../devAoSoftRaw.c
SRCS.c += ../devAoSymb.c
SRCS.c += ../devAoTestAsyn.c
SRCS.c += ../devAoVmiVme4100.c
SRCS.c += ../devApsEg.c
SRCS.c += ../devApsEr.c
SRCS.c += ../devAt5Vxi.c
SRCS.c += ../devAt8Fp.c
SRCS.c += ../devAvme9440.c
# SRCS.c += ../devBiCamac.c
SRCS.c += ../devBiMpv910.c
SRCS.c += ../devBiSoft.c
SRCS.c += ../devBiSoftRaw.c
SRCS.c += ../devBiTestAsyn.c
SRCS.c += ../devBiXVme210.c
# SRCS.c += ../devBoCamac.c
SRCS.c += ../devBoMpv902.c
SRCS.c += ../devBoSoft.c
SRCS.c += ../devBoSoftRaw.c
SRCS.c += ../devBoTestAsyn.c
SRCS.c += ../devBoXVme220.c
SRCS.c += ../devCommonGpib.c
SRCS.c += ../devEventSoft.c
SRCS.c += ../devEventTestIoEvent.c
SRCS.c += ../devHistogramSoft.c
SRCS.c += ../devHistogramTestAsyn.c
SRCS.c += ../devHpe1368a.c
# OBJS += devLiCamac.c
SRCS.c += ../devLiSoft.c
SRCS.c += ../devLiSymb.c
# OBJS += devLoCamac.c
SRCS.c += ../devLoSoft.c
SRCS.c += ../devLoSymb.c
# SRCS.c += ../devMbbiCamac.c
# SRCS.c += ../devMbbiDirectCamac.c
SRCS.c += ../devMbbiDirectMpv910.c
SRCS.c += ../devMbbiDirectSoft.c
SRCS.c += ../devMbbiDirectSoftRaw.c
SRCS.c += ../devMbbiDirectXVme210.c
SRCS.c += ../devMbbiMpv910.c
SRCS.c += ../devMbbiSoft.c
SRCS.c += ../devMbbiSoftRaw.c
SRCS.c += ../devMbbiTestAsyn.c
SRCS.c += ../devMbbiXVme210.c
# SRCS.c += ../devMbboCamac.c
# SRCS.c += ../devMbboDirectCamac.c
SRCS.c += ../devMbboDirectMpv902.c
SRCS.c += ../devMbboDirectSoft.c
SRCS.c += ../devMbboDirectSoftRaw.c
SRCS.c += ../devMbboDirectXVme220.c
SRCS.c += ../devMbboMpv902.c
SRCS.c += ../devMbboSoft.c
SRCS.c += ../devMbboSoftRaw.c
SRCS.c += ../devMbboTestAsyn.c
SRCS.c += ../devMbboXVme220.c
SRCS.c += ../devMz8310.c
SRCS.c += ../devPtSoft.c
SRCS.c += ../devSASoft.c
SRCS.c += ../devSiSoft.c
SRCS.c += ../devSiSymb.c
SRCS.c += ../devSiTestAsyn.c
SRCS.c += ../devSmCompumotor1830.c
SRCS.c += ../devSmOms6Axis.c
SRCS.c += ../devSoSoft.c
SRCS.c += ../devSoSymb.c
SRCS.c += ../devSoTestAsyn.c
SRCS.c += ../devSysmon.c
SRCS.c += ../devTimerMz8310.c
SRCS.c += ../devVxiTDM.c
# SRCS.c += ../devWfCamac.c
SRCS.c += ../devWfComet.c
SRCS.c += ../devWfDvx2502.c
SRCS.c += ../devWfJoergerVtr1.c
SRCS.c += ../devWfSoft.c
SRCS.c += ../devWfTestAsyn.c
SRCS.c += ../devWfXy566Sc.c
SRCS.c += ../devXy240.c
OBJS = \
devAiDvx2502.o\
devAiSoft.o\
devAiSoftRaw.o\
devAiSymb.o\
devAiTestAsyn.o\
devAiXy566Di.o\
devAiXy566DiL.o\
devAiXy566Se.o\
devAoSoft.o\
devAoSoftRaw.o\
devAoSymb.o\
devAoTestAsyn.o\
devAoVmiVme4100.o\
devBiMpv910.o\
devApsEg.o\
devApsEr.o\
devBiSoft.o\
devBiSoftRaw.o\
devBiTestAsyn.o\
devBiXVme210.o\
devBoMpv902.o\
devBoSoft.o\
devBoSoftRaw.o\
devBoTestAsyn.o\
devBoXVme220.o\
devCommonGpib.o\
devEventSoft.o\
devEventTestIoEvent.o\
devHistogramSoft.o\
devHistogramTestAsyn.o\
devLiSoft.o\
devLiSymb.o\
devLoSoft.o\
devLoSymb.o\
devMbbiMpv910.o\
devMbbiSoft.o\
devMbbiSoftRaw.o\
devMbbiTestAsyn.o\
devMbbiXVme210.o\
devMbboMpv902.o\
devMbboSoft.o\
devMbboSoftRaw.o\
devMbboTestAsyn.o\
devMbboXVme220.o\
devMbbiDirectMpv910.o\
devMbbiDirectSoft.o\
devMbbiDirectSoftRaw.o\
devMbbiDirectXVme210.o\
devMbboDirectMpv902.o\
devMbboDirectSoft.o\
devMbboDirectSoftRaw.o\
devMbboDirectXVme220.o\
devPtSoft.o\
devSmCompumotor1830.o\
devSmOms6Axis.o\
devSASoft.o\
devSiSoft.o\
devSiSymb.o\
devSiTestAsyn.o\
devSoSoft.o\
devSoSymb.o\
devSoTestAsyn.o\
devWfSoft.o\
devWfTestAsyn.o\
devWfXy566Sc.o\
devAllenBradley.o\
devAt5Vxi.o\
devMz8310.o\
devTimerMz8310.o\
devVxiTDM.o\
devAiKscV215.o\
devXy240.o\
devHpe1368a.o\
devAt8Fp.o\
devWfComet.o\
devWfDvx2502.o\
devWfJoergerVtr1.o\
devAvme9440.o\
devSysmon.o
# devAiCamac.o\
# devAaiCamac.o\
# devBiCamac.o\
# devLiCamac.o\
# devMbbiCamac.o\
# devMbbiDirectCamac.o\
# devWfCamac.o\
# devAoCamac.o\
# devAaoCamac.o\
# devBoCamac.o\
# devLoCamac.o\
# devMbboCamac.o\
# devMbboDirectCamac.o
SRCS.c += ../devAB1771IFE.c
SRCS.c += ../devAB1771IL.c
SRCS.c += ../devAB1771IR.c
SRCS.c += ../devAB1771IXE.c
SRCS.c += ../devAB1771OFE.c
SRCS.c += ../devABBINARY.c
SRCS.c += ../devMpc.c
# OBJS += devAaiCamac.o
# OBJS += devAiCamac.o
OBJS += devAiDvx2502.o
OBJS += devAiKscV215.o
OBJS += devAiSoft.o
OBJS += devAiSoftRaw.o
OBJS += devAiSymb.o
OBJS += devAiTestAsyn.o
OBJS += devAiXy566Di.o
OBJS += devAiXy566DiL.o
OBJS += devAiXy566Se.o
# OBJS += devAaoCamac.o
# OBJS += devAoCamac.o
OBJS += devAoSoft.o
OBJS += devAoSoftRaw.o
OBJS += devAoSymb.o
OBJS += devAoTestAsyn.o
OBJS += devAoVmiVme4100.o
OBJS += devApsEg.o
OBJS += devApsEr.o
OBJS += devAt5Vxi.o
OBJS += devAt8Fp.o
OBJS += devAvme9440.o
# OBJS += devBiCamac.o
OBJS += devBiMpv910.o
OBJS += devBiSoft.o
OBJS += devBiSoftRaw.o
OBJS += devBiTestAsyn.o
OBJS += devBiXVme210.o
# OBJS += devBoCamac.o
OBJS += devBoMpv902.o
OBJS += devBoSoft.o
OBJS += devBoSoftRaw.o
OBJS += devBoTestAsyn.o
OBJS += devBoXVme220.o
OBJS += devCommonGpib.o
OBJS += devEventSoft.o
OBJS += devEventTestIoEvent.o
OBJS += devHistogramSoft.o
OBJS += devHistogramTestAsyn.o
OBJS += devHpe1368a.o
# OBJS += devLiCamac.o
OBJS += devLiSoft.o
OBJS += devLiSymb.o
# OBJS += devLoCamac.o
OBJS += devLoSoft.o
OBJS += devLoSymb.o
# OBJS += devMbbiCamac.o
# OBJS += devMbbiDirectCamac.o
OBJS += devMbbiDirectMpv910.o
OBJS += devMbbiDirectSoft.o
OBJS += devMbbiDirectSoftRaw.o
OBJS += devMbbiDirectXVme210.o
OBJS += devMbbiMpv910.o
OBJS += devMbbiSoft.o
OBJS += devMbbiSoftRaw.o
OBJS += devMbbiTestAsyn.o
OBJS += devMbbiXVme210.o
# OBJS += devMbboCamac.o
# OBJS += devMbboDirectCamac.o
OBJS += devMbboDirectMpv902.o
OBJS += devMbboDirectSoft.o
OBJS += devMbboDirectSoftRaw.o
OBJS += devMbboDirectXVme220.o
OBJS += devMbboMpv902.o
OBJS += devMbboSoft.o
OBJS += devMbboSoftRaw.o
OBJS += devMbboTestAsyn.o
OBJS += devMbboXVme220.o
OBJS += devMz8310.o
OBJS += devPtSoft.o
OBJS += devSASoft.o
OBJS += devSiSoft.o
OBJS += devSiSymb.o
OBJS += devSiTestAsyn.o
OBJS += devSmCompumotor1830.o
OBJS += devSmOms6Axis.o
OBJS += devSoSoft.o
OBJS += devSoSymb.o
OBJS += devSoTestAsyn.o
OBJS += devSysmon.o
OBJS += devTimerMz8310.o
OBJS += devVxiTDM.o
# OBJS += devWfCamac.o
OBJS += devWfComet.o
OBJS += devWfDvx2502.o
OBJS += devWfJoergerVtr1.o
OBJS += devWfSoft.o
OBJS += devWfTestAsyn.o
OBJS += devWfXy566Sc.o
OBJS += devXy240.o
OBJS += devAB1771IFE.o
OBJS += devAB1771IL.o
OBJS += devAB1771IR.o
OBJS += devAB1771IXE.o
OBJS += devAB1771OFE.o
OBJS += devABBINARY.o
OBJS += devMpc.o
PROD = devSup
@@ -200,3 +211,4 @@ $(PROD): $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)

267
src/dev/devAB1771IFE.c Normal file
View File

@@ -0,0 +1,267 @@
/* devAB1771IFE.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident
* in the driver and device support to
significantly reduce the amount of code
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <aiRecord.h>
/* Create the dsets*/
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt);
LOCAL long init_1771IfeDiff(struct aiRecord *prec);
LOCAL long init_1771Ife0to5V(struct aiRecord *prec);
LOCAL long init_1771IfeMa(struct aiRecord *prec);
LOCAL long init_1771IfeSe(struct aiRecord *prec);
LOCAL long linconv_1771Ife(struct aiRecord *prec, int after);
LOCAL long read_1771Ife(struct aiRecord *prec);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_ai;
DEVSUPFUN special_linconv;} ABAIDSET;
ABAIDSET devAiAb1771Ife={6, 0, 0, init_1771IfeDiff,
ioinfo_ai, read_1771Ife, linconv_1771Ife};
ABAIDSET devAiAb1771Ife0to5V={6, 0, 0, init_1771Ife0to5V,
ioinfo_ai, read_1771Ife, linconv_1771Ife};
ABAIDSET devAiAb1771IfeMa={6, 0, 0, init_1771IfeMa,
ioinfo_ai, read_1771Ife, linconv_1771Ife};
ABAIDSET devAiAb1771IfeSe={6, 0, 0, init_1771IfeSe,
ioinfo_ai, read_1771Ife, linconv_1771Ife};
#define IFE_SCAN_RATE 1
#define IFE_INITMSG_LENGTH 37
#define IFE_DIFF_READMSG_LENGTH 12
#define IFE_SE_READMSG_LENGTH 20
struct ab1771Ife_read {
unsigned short diag; /* diagnostic word */
unsigned short urange; /* low byte - under range channels */
unsigned short orange; /* low byte - over range channels */
unsigned short sign; /* low byte - polarity 1 = negative */
short data[16]; /* 16 data values (can be signed) */
};
/* IFE Differential Initialization Message - from the IFE Manual */
LOCAL short ab1771IfeDiff_initmsg[IFE_INITMSG_LENGTH] = {
0xffff, 0xffff, /* -10 to 10 volts (signals 0 - 15) */
0x0700, /* signed magnitude - differential */
0xffff, 0x0000, /* scaled 0 - 4095 (12 bits) */
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095
};
/* 1771 - IFE 0 to 5 Volt */
LOCAL short ab1771Ife0to5v_initmsg[IFE_INITMSG_LENGTH] = {
0x5555, 0x5555, /* 0 to 5 volts (signals 0 - 15) */
0x0700, /* signed magnitude - differential */
0x0000, 0x0000, /* scaled 0 - 4095 (12 bits) */
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095
};
/* 1771 - IFE MilliAmp */
LOCAL short ab1771IfeMa_initmsg[IFE_INITMSG_LENGTH] = {
0x0000, 0x0000, /* 4 - 20 Ma (signals 0 - 15) */
0x0700, /* signed magnitude - differential */
0x0000, 0x0000, /* scaled 0 - 4095 (12 bits) */
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095
};
/* 1771 - IFE Single Ended (-10 to 10 Volts) */
LOCAL short ab1771IfeSe_initmsg[IFE_INITMSG_LENGTH] = {
0xffff, 0xffff, /* 0 to 5 volts (signals 0 - 15) */
0x0600, /* signed magnitude - differential */
0xffff, 0x0000, /* scaled 0 - 4095 (12 bits) */
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095
};
typedef struct {
void *drvPvt;
IOSCANPVT ioscanpvt;
unsigned short read_msg_len;
unsigned short *pread_msg;
} devPvt;
LOCAL void devCallback(void * drvPvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
if(!pdevPvt) return;
scanIoRequest(pdevPvt->ioscanpvt);
}
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)prec->dpvt;
if(!pdevPvt) return(0);
*ppvt = pdevPvt->ioscanpvt;
return(0);
}
LOCAL long read_1771Ife(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt= (devPvt *)prec->dpvt;
abStatus drvStatus;
struct ab1771Ife_read *pdata;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->getStatus)(pdevPvt->drvPvt);
pdata = (struct ab1771Ife_read *)pdevPvt->pread_msg;
if(drvStatus != abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
prec->rval = pdata->data[pabio->signal];
if( (pdata->orange & (1 << pabio->signal))
|| (pdata->urange & (1 << pabio->signal)) )
recGblSetSevr(prec,HW_LIMIT_ALARM,INVALID_ALARM);
return(0);
}
LOCAL long linconv_1771Ife(struct aiRecord *prec, int after)
{
if(!after) return(0);
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/4095.0;
return(0);
}
LOCAL long init_1771Ife(struct aiRecord *prec, const char *card_type,
unsigned short *pinit_msg, unsigned short read_size)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
/* ai.inp must be an AB_IO */
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Ife (init_record) Illegal INP field");
return(S_db_badField);
}
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/4095.0;
/* pointer to the data addess structure */
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeAi,card_type,devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
pdevPvt->read_msg_len = read_size;
pdevPvt->pread_msg = calloc(read_size,sizeof(unsigned short));
drvStatus = (*pabDrv->startScan)(drvPvt,IFE_SCAN_RATE,
pinit_msg,IFE_INITMSG_LENGTH,pdevPvt->pread_msg ,read_size);
if(drvStatus!=abSuccess) {
status = S_db_badField;
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Ife (init_record) startScan");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ife (init_record) registerCard");
break;
}
return(status);
}
LOCAL long init_1771IfeDiff(struct aiRecord *prec)
{
return(init_1771Ife(prec,"IFEDIFF",&ab1771IfeDiff_initmsg[0],
IFE_DIFF_READMSG_LENGTH));
}
LOCAL long init_1771Ife0to5V(struct aiRecord *prec)
{
return(init_1771Ife(prec,"IFE0to5V",&ab1771Ife0to5v_initmsg[0],
IFE_DIFF_READMSG_LENGTH));
}
LOCAL long init_1771IfeMa(struct aiRecord *prec)
{
return(init_1771Ife(prec,"IFEMA",&ab1771IfeMa_initmsg[0],
IFE_DIFF_READMSG_LENGTH));
}
LOCAL long init_1771IfeSe(struct aiRecord *prec)
{
return(init_1771Ife(prec,"IFESE",&ab1771IfeSe_initmsg[0],
IFE_SE_READMSG_LENGTH));
}

195
src/dev/devAB1771IL.c Normal file
View File

@@ -0,0 +1,195 @@
/* devAB1771IL.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident
* in the driver and device support to
significantly reduce the amount of code
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <aiRecord.h>
/* Create the dsets*/
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt);
LOCAL long init_1771Il(struct aiRecord *prec);
LOCAL long linconv_1771Il(struct aiRecord *prec, int after);
LOCAL long read_1771Il(struct aiRecord *prec);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_ai;
DEVSUPFUN special_linconv;} ABAIDSET;
ABAIDSET devAiAb1771Il={6, 0, 0, init_1771Il,
ioinfo_ai, read_1771Il, linconv_1771Il};
#define IL_SCAN_RATE 4
#define IL_INITMSG_LENGTH 19
#define IL_READMSG_LENGTH 12
#define IL_RANGE 0xffff /* volt inp for all channels -10 - 10V */
#define IL_DATA_FORMAT 0x600 /* signed magnitude binary */
struct ab1771il_read {
unsigned short diag; /* diagnostic word */
unsigned short urange; /* low byte - under range channels */
unsigned short orange; /* low byte - over range channels */
unsigned short sign; /* low byte - polarity 1 = negative */
short data[8]; /* 8 data values (can be signed) */
};
typedef struct {
void *drvPvt;
IOSCANPVT ioscanpvt;
unsigned short read_msg[IL_READMSG_LENGTH];
unsigned short *pinit_msg;
} devPvt;
LOCAL unsigned short initMsg[IL_INITMSG_LENGTH] = {
IL_RANGE,IL_DATA_FORMAT,0x0ff,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095,
0, 0x4095, 0, 0x4095, 0, 0x4095, 0, 0x4095
};
LOCAL void devCallback(void * drvPvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
if(!pdevPvt) return;
scanIoRequest(pdevPvt->ioscanpvt);
}
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)prec->dpvt;
if(!pdevPvt) return(0);
*ppvt = pdevPvt->ioscanpvt;
return(0);
}
LOCAL long read_1771Il(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt= (devPvt *)prec->dpvt;
abStatus drvStatus;
struct ab1771il_read *pdata;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->getStatus)(pdevPvt->drvPvt);
pdata = (struct ab1771il_read *)&pdevPvt->read_msg[0];
if(drvStatus != abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
prec->rval = pdata->data[pabio->signal];
if((pdata->urange&(1<<pabio->signal))
|| (pdata->orange&(1<<pabio->signal)) )
recGblSetSevr(prec,HW_LIMIT_ALARM,INVALID_ALARM);
return(0);
}
static long linconv_1771Il(struct aiRecord *prec, int after)
{
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/4095.0;
return(0);
}
LOCAL long init_1771Il(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
/* ai.inp must be an AB_IO */
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Il (init_record) Illegal INP field");
return(S_db_badField);
}
prec->eslo = (prec->eguf -prec->egul)/4095.0;
/* pointer to the data addess structure */
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeAi,"IL",devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
pdevPvt->pinit_msg = initMsg;
drvStatus = (*pabDrv->startScan)(drvPvt,IL_SCAN_RATE,
pdevPvt->pinit_msg,IL_INITMSG_LENGTH,
&pdevPvt->read_msg[0],IL_READMSG_LENGTH);
if(drvStatus != abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Il (init_record) startScan");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Il (init_record) registerCard");
break;
}
return(status);
}

216
src/dev/devAB1771IR.c Normal file
View File

@@ -0,0 +1,216 @@
/* devAB1771IR.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident
* in the driver and device support to
significantly reduce the amount of code
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <aiRecord.h>
/* Create the dsets*/
LOCAL long init_1771Ir(struct aiRecord *prec, const char *card_type,
unsigned short config);
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt);
LOCAL long init_1771IrPlatinum(struct aiRecord *prec);
LOCAL long init_1771IrCopper(struct aiRecord *prec);
LOCAL long read_1771Ir(struct aiRecord *prec);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_ai;
DEVSUPFUN special_linconv;} ABAIDSET;
ABAIDSET devAiAb1771IrPlatinum={6, 0, 0, init_1771IrPlatinum,
ioinfo_ai, read_1771Ir, 0};
ABAIDSET devAiAb1771IrCopper={6, 0, 0, init_1771IrCopper,
ioinfo_ai, read_1771Ir, 0};
#define IR_SCAN_RATE 5
#define IR_INITMSG_LENGTH 1
#define IR_READMSG_LENGTH 8
/*Register definitions*/
#define IR_UNITS_DEGF 0x40
#define IR_UNITS_OHMS 0x80
#define IR_COPPER 0x100
#define IR_SIGNED 0x400
struct ab1771Ir_read {
unsigned short status; /* status and over/under range */
unsigned short pol_over; /* polarity and overflow */
short data[6]; /* current values */
};
typedef struct {
void *drvPvt;
IOSCANPVT ioscanpvt;
unsigned short read_msg[IR_READMSG_LENGTH];
unsigned short write_msg;
} devPvt;
LOCAL void devCallback(void * drvPvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
if(!pdevPvt) return;
scanIoRequest(pdevPvt->ioscanpvt);
}
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)prec->dpvt;
if(!pdevPvt) return(0);
*ppvt = pdevPvt->ioscanpvt;
return(0);
}
LOCAL long read_1771Ir(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt= (devPvt *)prec->dpvt;
abStatus drvStatus;
struct ab1771Ir_read *pdata;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->getStatus)(pdevPvt->drvPvt);
pdata = (struct ab1771Ir_read *)&pdevPvt->read_msg;
if(drvStatus != abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}else{
unsigned short mask;
short value;
unsigned short signal = pabio->signal;
value = (short)pdata->data[signal];
if(pdata->pol_over& (0x100<<signal)) value = - value;
prec->rval = value;
mask = (1 << pabio->signal);
if((pdata->status & (1<<signal))
||(pdata->status & (0x100<<signal))){
recGblSetSevr(prec,HW_LIMIT_ALARM,INVALID_ALARM);
}
return(0);
}
}
LOCAL long init_1771Ir(struct aiRecord *prec, const char *card_type,
unsigned short config)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Ir (init_record) Illegal INP field");
return(S_db_badField);
}
prec->linr = 0;
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeAi,card_type,devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
if(pabio->parm[0]=='C') {
strcpy(prec->egu,"degC");
} else if(pabio->parm[0]=='O') {
config |= IR_UNITS_OHMS;
strcpy(prec->egu,"ohms");
} else {
config |= IR_UNITS_DEGF;
strcpy(prec->egu,"degF");
}
config |= IR_SIGNED;
pdevPvt->write_msg = config;
drvStatus = (*pabDrv->startScan)(drvPvt,IR_SCAN_RATE,
&pdevPvt->write_msg,IR_INITMSG_LENGTH,
pdevPvt->read_msg,IR_READMSG_LENGTH);
if(drvStatus != abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ir (init_record) startScan");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ir (init_record) registerCard");
break;
}
return(status);
}
LOCAL long init_1771IrPlatinum(struct aiRecord *prec)
{
return(init_1771Ir(prec,"IRPLATINUM",0));
}
LOCAL long init_1771IrCopper(struct aiRecord *prec)
{
return(init_1771Ir(prec,"IRCOPPER",IR_COPPER));
}

268
src/dev/devAB1771IXE.c Normal file
View File

@@ -0,0 +1,268 @@
/* devAB1771IXE.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident
* in the driver and device support to
significantly reduce the amount of code
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <aiRecord.h>
/* Create the dsets*/
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt);
LOCAL long init_1771Ixe(struct aiRecord *prec);
LOCAL long linconv_1771Ixe(struct aiRecord *prec, int after);
LOCAL long read_1771Ixe(struct aiRecord *prec);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_ai;
DEVSUPFUN special_linconv;} ABAIDSET;
ABAIDSET devAiAb1771Ixe={6, 0, 0, init_1771Ixe,
ioinfo_ai, read_1771Ixe, linconv_1771Ixe};
#define IXE_HALFSEC_RATE 5
#define IXE_1SEC_RATE 10
#define IXE_INITMSG_LENGTH 19
#define IXE_READMSG_LENGTH 12
#define IXE_NUM_CVTTYPES 14
typedef struct {
void *drvPvt;
IOSCANPVT ioscanpvt;
unsigned short init_msg[IXE_INITMSG_LENGTH];
unsigned short read_msg[IXE_READMSG_LENGTH];
unsigned short indCvt;
} devPvt;
/* xxxxxxxxxxxxxTTT - Thermocouple Types */
#define IXE_MILLI 0x0000 /* Millivolt input */
#define IXE_E 0x0001 /* "E" Thermocouple */
#define IXE_J 0x0002 /* "J" Thermocouple */
#define IXE_K 0x0003 /* "K" Thermocouple */
#define IXE_T 0x0004 /* "T" Thermocouple */
#define IXE_R 0x0005 /* "R" Thermocouple */
#define IXE_S 0x0006 /* "S" Thermocouple */
/* xxxxxxxCxxxxxxxx - Conversion into degrees F or C */
#define IXE_DEGC 0x0000
#define IXE_DEGF 0x0100
/* xxxxxFFxxxxxxxxx - Data Format */
#define IXE_SIGNED 0x0400 /* signed magnitude " " */
/* SSSSSxxxxxxxxxxx - Scan Rate */
#define IXE_HALFSEC 0x2800 /* sample time = 0.5 seconds */
#define IXE_1SEC 0x5000 /* sample time = 1.0 seconds */
#define IXE_2SECS 0xa000 /* sample time = 2.0 seconds */
#define IXE_3SECS 0xf000 /* sample time = 3.0 seconds */
#define IXE_STATUS 0xff
struct ab1771Ixe_read {
unsigned short pol_stat; /* status - polarity word */
unsigned short out_of_range; /* under - over range channels */
unsigned short alarms; /* inputs outside alarm limits */
short data[8]; /* current values */
unsigned short cjcw; /* cold junction cal word */
};
/*NOTE: The following degfinitions assumes that the allowed convert types
are defined as follows:
K_DGF=2, K_DGC=3, J_DGF=4, J_DGC=5, E_DGF=6, E_DGC=7, T_DGF=8,
T_DGC=9, R_DGF=10, R_DGC=11, S_DGF=12, S_DGC=13,
THIS IS A REAL KLUDGE. WE SHOULD FIND A BETTER WAY */
LOCAL unsigned short ixe_cvt[IXE_NUM_CVTTYPES] = {
IXE_MILLI | IXE_SIGNED | IXE_HALFSEC,
IXE_MILLI | IXE_SIGNED | IXE_HALFSEC,
IXE_K | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_K | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC,
IXE_J | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_J | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC,
IXE_E | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_E | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC,
IXE_T | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_T | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC,
IXE_R | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_R | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC,
IXE_S | IXE_DEGF | IXE_SIGNED | IXE_HALFSEC,
IXE_S | IXE_DEGC | IXE_SIGNED | IXE_HALFSEC
};
LOCAL const char* cardName[IXE_NUM_CVTTYPES] = {
"IXE_MV","IXE_MV","IXE_KDEGF","IXE_KDEGC",
"IXE_JDEGF","IXE_JDEGC","IXE_EDEGF","IXE_EDEGC",
"IXE_TDEGF","IXE_TDEGC","IXE_RDEGF","IXE_RDEGC",
"IXS_TDEGF","IXE_SDEGC"
};
LOCAL unsigned short scanRate[IXE_NUM_CVTTYPES] = {
IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,
IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,
IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,
IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE,IXE_HALFSEC_RATE
};
LOCAL void devCallback(void * drvPvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
if(!pdevPvt) return;
scanIoRequest(pdevPvt->ioscanpvt);
}
LOCAL long ioinfo_ai(int cmd,struct aiRecord *prec,IOSCANPVT *ppvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)prec->dpvt;
if(!pdevPvt) return(0);
*ppvt = pdevPvt->ioscanpvt;
return(0);
}
LOCAL long read_1771Ixe(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt= (devPvt *)prec->dpvt;
abStatus drvStatus;
struct ab1771Ixe_read *pdata;
long status;
unsigned short indCvt;
short rval;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
indCvt = pdevPvt->indCvt;
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->getStatus)(pdevPvt->drvPvt);
pdata = (struct ab1771Ixe_read *)&pdevPvt->read_msg[0];
if(drvStatus != abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
rval = pdata->data[pabio->signal];
if((pdata->pol_stat&(0x100<<pabio->signal))) rval = -rval;
if((pdata->out_of_range&(1<<pabio->signal))
|| (pdata->out_of_range&(0x100<<pabio->signal)) ) {
recGblSetSevr(prec,HW_LIMIT_ALARM,INVALID_ALARM);
}
if(indCvt!=0) {
prec->val = prec->rval = rval;
prec->udf = FALSE;
status=2; /*don't convert*/
} else {
prec->rval = rval + 10000;
status = 0;
}
return(status);
}
static long linconv_1771Ixe(struct aiRecord *prec, int after)
{
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/20000.0;
return(0);
}
LOCAL long init_1771Ixe(struct aiRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
unsigned short indCvt;
/* ai.inp must be an AB_IO */
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Ixe (init_record) Illegal INP field");
return(S_db_badField);
}
/*If conversion type is 2,...,IXE_NUM_CVTTYPES Ixe performs the conversion*/
/* THIS SHOULD BE CHANGED */
if(prec->linr>=2 && prec->linr <IXE_NUM_CVTTYPES) {
indCvt = prec->linr;
prec->linr = 0;
} else {
indCvt = 0;
}
prec->eslo = (prec->eguf -prec->egul)/20000.0;
/* pointer to the data addess structure */
pabio = (struct abio *)&(prec->inp.value);
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeAi,cardName[indCvt],devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
pdevPvt->indCvt = indCvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
pdevPvt->init_msg[0] = ixe_cvt[indCvt];
drvStatus = (*pabDrv->startScan)(drvPvt,scanRate[indCvt],
&pdevPvt->init_msg[0],IXE_INITMSG_LENGTH,
&pdevPvt->read_msg[0],IXE_READMSG_LENGTH);
if(drvStatus != abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ixe (init_record) startScan");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ixe (init_record) registerCard");
break;
}
return(status);
}

196
src/dev/devAB1771OFE.c Normal file
View File

@@ -0,0 +1,196 @@
/* devAB1771OFE.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident in the driver and
* device support to significantly reduce the amount of code
* ...
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sysLib.h>
#include <taskLib.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <aoRecord.h>
/* Create the dsets*/
LOCAL long init_1771Ofe(struct aoRecord *pao);
LOCAL long write_1771Ofe(struct aoRecord *pao);
LOCAL long linconv_1771Ofe(struct aoRecord *pao, int after);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN write_ao;
DEVSUPFUN special_linconv;
}ABAODSET;
ABAODSET devAoAb1771Ofe={ 6, NULL, NULL, init_1771Ofe, NULL,
write_1771Ofe, linconv_1771Ofe};
#define UPDATE_RATE 100
#define READ_MSG_LEN 5
#define WRITE_MSG_LEN 5
/* defines and structures for analog outputs */
/* configuration word 5 for the OFE module */
/* FxxxHHHHLLLLPPPP */
/* F - Data Format */
/* 0x0 specifies BCD */
/* 0x1 specifies Binary */
/* HHHH - Max Scaling Polarity */
/* LLLL - Min Scaling Polarity */
/* PPPP - Value Polarity */
#define OFE_BINARY 0x8000 /* talk binary instead of BCD */
#define OFE_SCALING 0x0000 /* all positive */
typedef struct {
void *drvPvt;
unsigned short read_msg[READ_MSG_LEN];
unsigned short write_msg[WRITE_MSG_LEN];
}devPvt;
LOCAL long init_1771Ofe(struct aoRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
int failed;
int i;
if (prec->out.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"devAiAb1771Ife (init_record) Illegal INP field");
return(S_db_badField);
}
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/4095.0;
/* pointer to the data addess structure */
pabio = (struct abio *)&(prec->out.value);
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeAo,"OFE",NULL,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
drvStatus = (*pabDrv->getStatus)(drvPvt);
if(drvStatus==abSuccess) {
prec->rval = (unsigned short)pdevPvt->read_msg[pabio->signal];
} else {
status = 2;
}
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
pdevPvt->write_msg[4] = OFE_BINARY | OFE_SCALING;
drvStatus = (*pabDrv->startScan)(drvPvt,UPDATE_RATE,
pdevPvt->write_msg,WRITE_MSG_LEN,
pdevPvt->read_msg ,READ_MSG_LEN);
if(drvStatus!=abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ife (init_record) startScan");
break;
}
/*wait for up to 1 seconds*/
for(failed=0; failed<10; failed++) {
taskDelay(vxTicksPerSecond/10);
drvStatus = (*pabDrv->getStatus)(drvPvt);
if(drvStatus==abSuccess) {
prec->rval=(unsigned short)pdevPvt->read_msg[pabio->signal];
for(i=0;i<4;i++) {
pdevPvt->write_msg[i] = pdevPvt->read_msg[i];
}
write_1771Ofe(prec);
status = 2;
break;
}
}
status = 0;
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,
"devAiAb1771Ife (init_record) registerCard");
break;
}
return(status);
}
LOCAL long write_1771Ofe(struct aoRecord *prec)
{
struct abio *pabio;
devPvt *pdevPvt = (devPvt *)prec->dpvt;
abStatus drvStatus;
void *drvPvt;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2); /*dont convert*/
}
drvPvt = pdevPvt->drvPvt;
pabio = (struct abio *)&(prec->out.value);
pdevPvt->write_msg[pabio->signal] = prec->rval;
drvStatus = (*pabDrv->updateAo)(drvPvt);
if(drvStatus!=abSuccess) {
if(recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM) && errVerbose
&& (prec->stat!=WRITE_ALARM || prec->sevr!=INVALID_ALARM))
recGblRecordError(-1,(void *)prec,"abDrv(updateAo)");
}
return(0);
}
LOCAL long linconv_1771Ofe(struct aoRecord *prec, int after)
{
if(!after) return(0);
/* set linear conversion slope*/
prec->eslo = (prec->eguf -prec->egul)/4095.0;
return(0);
}

617
src/dev/devABBINARY.c Normal file
View File

@@ -0,0 +1,617 @@
/* devABBINARY.c */
/*
* Original Author: Bob Dalesio
* Current Author: Bob Dalesio, Marty Kraimer
* Date: 3/6/91
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 12-01-94 lrd combine the device support that was resident in the driver and
* device support to significantly reduce the amount of code
* ...
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <alarm.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <recSup.h>
#include <devSup.h>
#include <link.h>
#include <drvAb.h>
#include <dbCommon.h>
#include <biRecord.h>
#include <boRecord.h>
#include <mbbiRecord.h>
#include <mbboRecord.h>
#include <mbbiDirectRecord.h>
#include <mbboDirectRecord.h>
typedef struct {
void *drvPvt;
IOSCANPVT ioscanpvt;
}devPvt;
/* Create the dsets*/
LOCAL long ioinfo(int cmd, struct dbCommon *prec, IOSCANPVT *ppvt);
LOCAL long read_bi(struct biRecord *prec);
LOCAL long init_bi08(struct biRecord *prec);
LOCAL long init_bi16(struct biRecord *prec);
LOCAL long init_bi32(struct biRecord *prec);
LOCAL long init_bi(struct biRecord *prec,abNumBits nBits);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_bi;} ABBIDSET;
ABBIDSET devBiAb= { 5, 0, 0, init_bi08, ioinfo, read_bi};
ABBIDSET devBiAb16= { 5, 0, 0, init_bi16, ioinfo, read_bi};
ABBIDSET devBiAb32= { 5, 0, 0, init_bi32, ioinfo, read_bi};
LOCAL long read_mbbi(struct mbbiRecord *prec);
LOCAL long init_mbbi08(struct mbbiRecord *prec);
LOCAL long init_mbbi16(struct mbbiRecord *prec);
LOCAL long init_mbbi32(struct mbbiRecord *prec);
LOCAL long init_mbbi(struct mbbiRecord *prec,abNumBits nBits);
ABBIDSET devMbbiAb= { 5, 0, 0, init_mbbi08, ioinfo, read_mbbi};
ABBIDSET devMbbiAb16={ 5, 0, 0, init_mbbi16, ioinfo, read_mbbi};
ABBIDSET devMbbiAb32={ 5, 0, 0, init_mbbi32, ioinfo, read_mbbi};
LOCAL long read_mbbiDirect(struct mbbiDirectRecord *prec);
LOCAL long init_mbbiDirect08(struct mbbiDirectRecord *prec);
LOCAL long init_mbbiDirect16(struct mbbiDirectRecord *prec);
LOCAL long init_mbbiDirect32(struct mbbiDirectRecord *prec);
LOCAL long init_mbbiDirect(struct mbbiDirectRecord *prec,abNumBits nBits);
ABBIDSET devMbbiDirectAb= { 5,0,0, init_mbbiDirect08,ioinfo, read_mbbiDirect};
ABBIDSET devMbbiDirectAb16={ 5,0,0, init_mbbiDirect16,ioinfo, read_mbbiDirect};
ABBIDSET devMbbiDirectAb32={ 5,0,0, init_mbbiDirect32,ioinfo, read_mbbiDirect};
LOCAL long write_bo(struct boRecord *prec);
LOCAL long init_bo08(struct boRecord *prec);
LOCAL long init_bo16(struct boRecord *prec);
LOCAL long init_bo32(struct boRecord *prec);
LOCAL long init_bo(struct boRecord *prec,abNumBits nBits);
typedef struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN write_bo;
} ABBODSET;
ABBODSET devBoAb= { 5, 0, 0, init_bo08, 0, write_bo};
ABBODSET devBoAb16= { 5, 0, 0, init_bo16, 0, write_bo};
ABBODSET devBoAb32= { 5, 0, 0, init_bo32, 0, write_bo};
LOCAL long write_mbbo(struct mbboRecord *prec);
LOCAL long init_mbbo08(struct mbboRecord *prec);
LOCAL long init_mbbo16(struct mbboRecord *prec);
LOCAL long init_mbbo32(struct mbboRecord *prec);
LOCAL long init_mbbo(struct mbboRecord *prec,abNumBits nBits);
ABBODSET devMbboAb= { 5, 0, 0, init_mbbo08, 0, write_mbbo};
ABBODSET devMbboAb16={ 5, 0, 0, init_mbbo16, 0, write_mbbo};
ABBODSET devMbboAb32={ 5, 0, 0, init_mbbo32, 0, write_mbbo};
LOCAL long write_mbboDirect(struct mbboDirectRecord *prec);
LOCAL long init_mbboDirect08(struct mbboDirectRecord *prec);
LOCAL long init_mbboDirect16(struct mbboDirectRecord *prec);
LOCAL long init_mbboDirect32(struct mbboDirectRecord *prec);
LOCAL long init_mbboDirect(struct mbboDirectRecord *prec,abNumBits nBits);
ABBODSET devMbboDirectAb= { 5, 0, 0, init_mbboDirect08, 0, write_mbboDirect};
ABBODSET devMbboDirectAb16={ 5, 0, 0, init_mbboDirect16, 0, write_mbboDirect};
ABBODSET devMbboDirectAb32={ 5, 0, 0, init_mbboDirect32, 0, write_mbboDirect};
LOCAL void devCallback(void * drvPvt)
{
devPvt *pdevPvt;
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
if(!pdevPvt) return;
if(!pdevPvt->ioscanpvt) return;
scanIoRequest(pdevPvt->ioscanpvt);
}
LOCAL long ioinfo(int cmd, struct dbCommon *prec, IOSCANPVT *ppvt)
{
devPvt *pdevPvt;
pdevPvt = prec->dpvt;
if(!pdevPvt) return(0);
*ppvt = pdevPvt->ioscanpvt;
return(0);
}
LOCAL long init_bi08(struct biRecord *prec)
{
return(init_bi(prec, abBit8));
}
LOCAL long init_bi16(struct biRecord *prec)
{
return(init_bi(prec, abBit16));
}
LOCAL long init_bi32(struct biRecord *prec)
{
return(init_bi(prec, abBit32));
}
LOCAL long init_mbbi08(struct mbbiRecord *prec)
{
return(init_mbbi(prec, abBit8));
}
LOCAL long init_mbbi16(struct mbbiRecord *prec)
{
return(init_mbbi(prec, abBit16));
}
LOCAL long init_mbbi32(struct mbbiRecord *prec)
{
return(init_mbbi(prec, abBit32));
}
LOCAL long init_mbbiDirect08(struct mbbiDirectRecord *prec)
{
return(init_mbbiDirect(prec, abBit8));
}
LOCAL long init_mbbiDirect16(struct mbbiDirectRecord *prec)
{
return(init_mbbiDirect(prec, abBit16));
}
LOCAL long init_mbbiDirect32(struct mbbiDirectRecord *prec)
{
return(init_mbbiDirect(prec, abBit32));
}
LOCAL long init_bo08(struct boRecord *prec)
{
return(init_bo(prec, abBit8));
}
LOCAL long init_bo16(struct boRecord *prec)
{
return(init_bo(prec, abBit16));
}
LOCAL long init_bo32(struct boRecord *prec)
{
return(init_bo(prec, abBit32));
}
LOCAL long init_mbbo08(struct mbboRecord *prec)
{
return(init_mbbo(prec, abBit8));
}
LOCAL long init_mbbo16(struct mbboRecord *prec)
{
return(init_mbbo(prec, abBit16));
}
LOCAL long init_mbbo32(struct mbboRecord *prec)
{
return(init_mbbo(prec, abBit32));
}
LOCAL long init_mbboDirect08(struct mbboDirectRecord *prec)
{
return(init_mbboDirect(prec, abBit8));
}
LOCAL long init_mbboDirect16(struct mbboDirectRecord *prec)
{
return(init_mbboDirect(prec, abBit16));
}
LOCAL long init_mbboDirect32(struct mbboDirectRecord *prec)
{
return(init_mbboDirect(prec, abBit32));
}
LOCAL long read_bi(struct biRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
unsigned long value;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->readBi)(drvPvt,&value,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
prec->rval = value;
return(0);
}
LOCAL long init_bi(struct biRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec,
"init_record: bad INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->inp.value);
prec->mask=1;
prec->mask <<= pabio->signal;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBi,"BINARY",devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
break;
}
return(status);
}
LOCAL long read_mbbi(struct mbbiRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
unsigned long value;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->readBi)(drvPvt,&value,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
prec->rval = value;
return(0);
}
LOCAL long init_mbbi(struct mbbiRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec, "Illegal INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->inp.value);
prec->shft = prec->inp.value.abio.signal;
prec->mask <<= prec->shft;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBi,"BINARY",devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
break;
}
return(status);
}
LOCAL long read_mbbiDirect(struct mbbiDirectRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
unsigned long value;
if(!pdevPvt) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->readBi)(drvPvt,&value,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,READ_ALARM,INVALID_ALARM);
return(2);
}
prec->rval = value;
return(0);
}
LOCAL long init_mbbiDirect(struct mbbiDirectRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
if (prec->inp.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec, "Illegal INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->inp.value);
prec->shft = prec->inp.value.abio.signal;
prec->mask <<= prec->shft;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBi,"BINARY",devCallback,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
scanIoInit(&pdevPvt->ioscanpvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
break;
}
return(status);
}
LOCAL long write_bo(struct boRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
if(!pdevPvt) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
return(0);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->updateBo)(drvPvt,prec->rval,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
}
return(0);
}
LOCAL long init_bo(struct boRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
unsigned long value;
if (prec->out.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec, "Illegal INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->out.value);
prec->mask = 1;
prec->mask <<= pabio->signal;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBo,"BINARY",NULL,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
recGblRecordError(S_db_badField,(void *)prec,
"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
return(status);
}
drvStatus = (*pabDrv->readBo)(drvPvt,&value,prec->mask);
if(drvStatus==abSuccess) {
prec->rval = value;
status = 0;
} else {
status = 2;
}
return(status);
}
LOCAL long write_mbbo(struct mbboRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
if(!pdevPvt) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
return(0);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->updateBo)(drvPvt,prec->rval,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
}
return(0);
}
LOCAL long init_mbbo(struct mbboRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
unsigned long value;
if (prec->out.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec, "Illegal INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->out.value);
prec->shft = prec->out.value.abio.signal;
prec->mask <<= prec->shft;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBo,"BINARY",NULL,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
recGblRecordError(S_db_badField,(void *)prec,
"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
return(status);
}
drvStatus = (*pabDrv->readBo)(drvPvt,&value,prec->mask);
if(drvStatus==abSuccess) {
prec->rval = value;
status = 0;
} else {
status = 2;
}
return(status);
}
LOCAL long write_mbboDirect(struct mbboDirectRecord *prec)
{
devPvt *pdevPvt = (devPvt *)prec->dpvt;
void *drvPvt;
abStatus drvStatus;
unsigned long value = prec->rval;
if(!pdevPvt) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
return(0);
}
drvPvt = pdevPvt->drvPvt;
drvStatus = (*pabDrv->updateBo)(drvPvt,value,prec->mask);
if(drvStatus!=abSuccess) {
recGblSetSevr(prec,WRITE_ALARM,INVALID_ALARM);
}
return(0);
}
LOCAL long init_mbboDirect(struct mbboDirectRecord *prec,abNumBits nBits)
{
struct abio *pabio;
devPvt *pdevPvt;
abStatus drvStatus;
long status=0;
void *drvPvt;
unsigned long value;
if (prec->out.type != AB_IO){
recGblRecordError(S_db_badField,(void *)prec, "Illegal INP field");
return(S_db_badField);
}
pabio = (struct abio *)&(prec->out.value);
prec->shft = prec->out.value.abio.signal;
prec->mask <<= prec->shft;
drvStatus = (*pabDrv->registerCard)(pabio->link,pabio->adapter,
pabio->card,typeBo,"BINARY",NULL,&drvPvt);
switch(drvStatus) {
case abSuccess :
pdevPvt = (devPvt *)(*pabDrv->getUserPvt)(drvPvt);
prec->dpvt = pdevPvt;
break;
case abNewCard :
pdevPvt = calloc(1,sizeof(devPvt));
pdevPvt->drvPvt = drvPvt;
prec->dpvt = pdevPvt;
(*pabDrv->setUserPvt)(drvPvt,(void *)pdevPvt);
drvStatus = (*pabDrv->setNbits)(drvPvt,nBits);
if(drvStatus!=abSuccess) {
recGblRecordError(S_db_badField,(void *)prec,
"init_record setNbits");
}
break;
default:
status = S_db_badField;
recGblRecordError(status,(void *)prec,"init_record registerCard");
return(status);
}
drvStatus = (*pabDrv->readBo)(drvPvt,&value,prec->mask);
if(drvStatus==abSuccess) {
prec->rval = value;
status = 0;
} else {
status = 2;
}
return(status);
}

1377
src/dev/devAllenBradleyOLD.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -774,6 +774,9 @@ STATIC int ErResetAll(ApsErStruct *pParm)
*
* Receive a hardware IRQ from an ER board.
*
* BUG -- should add errMessage calls for problem events & include storm
* control on them.
*
******************************************************************************/
STATIC void ErIrqHandler(ErLinkStruct *pLink)
{

View File

@@ -181,6 +181,8 @@ struct ioCard {
#define CONST_NUM_LINKS 6
#define STATIC
STATIC int devAvme9440Report();
static unsigned short BASEADD;
#define LED_INIT 0x02
#define LED_OKRUN 0x03
@@ -206,7 +208,7 @@ struct {
DEVSUPFUN write_bo; /* output command goes here */
}devBoAvme9440={
5,
NULL,
(DEVSUPFUN) devAvme9440Report,
init,
init_bo_record,
NULL,
@@ -263,7 +265,36 @@ struct {
NULL,
read_mbbi
};
/**************************************************************************
*
* Ultra groovy and useful reporting function called from 'dbior'.
*
**************************************************************************/
STATIC int devAvme9440Report()
{
int LinkNum = 0;
int CardBase = BASEADD;
int IntVec = INT_VEC_BASE;
while (LinkNum < avme9440_num_links)
{
if (cards[LinkNum].card != NULL)
{
printf(" Link %02.2d at 0x%4.4X, IRQ 0x%2.2X, input 0x%04.4X, output 0x%04.4X\n",
LinkNum,
CardBase,
IntVec,
cards[LinkNum].card->inputData,
cards[LinkNum].card->outputData);
}
LinkNum++;
CardBase += sizeof(struct avme9440);
IntVec++;
}
return(0);
}
/**************************************************************************
*

View File

@@ -77,10 +77,7 @@ struct boRecord *pbo;
long status;
status = recGblInitFastOutLink(&(pbo->out), (void *) pbo, DBR_LONG, "RVAL");
if (pbo->out.type != CA_LINK)
status = 2;
status = 2;
return status;
} /* end init_record() */

View File

@@ -2,6 +2,11 @@
/* base/src/dev $Id$ */
/*
* $Log$
* Revision 1.23 1995/01/06 16:55:52 winans
* Added the log parameter to the doc
*
*
* Author: John Winans
* Origional Author: Ned D. Arnold
* Date: 11-20-91
@@ -172,6 +177,15 @@ gDset *dset; /* pointer to dset used to reference the init function */
return(OK);
}
static void RegisterProcessCallback(CALLBACK *pCallback, int Priority, void *Parm)
{
callbackSetCallback(devGpibLib_processCallback, pCallback);
callbackSetPriority(Priority, pCallback);
callbackSetUser(Parm, pCallback);
callbackRequest(pCallback);
return;
}
/******************************************************************************
*
@@ -1288,9 +1302,13 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(pai,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
else
{
@@ -1335,9 +1353,13 @@ int srqStatus;
{
devGpibLib_setPvSevr(pai,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
devGpibLib_aiGpibFinish(pdpvt); /* and finish the processing */
@@ -1382,9 +1404,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pai,READ_ALARM,VALID_ALARM);
}
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(0);
}
@@ -1426,9 +1452,14 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pao,WRITE_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(IDLE);
}
@@ -1458,9 +1489,13 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(pli,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
else
{
@@ -1505,9 +1540,13 @@ int srqStatus;
{
devGpibLib_setPvSevr(pli,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
devGpibLib_liGpibFinish(pdpvt); /* and finish the processing */
@@ -1551,9 +1590,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pli,READ_ALARM,VALID_ALARM);
}
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(0);
}
@@ -1595,9 +1638,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(plo,WRITE_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(IDLE);
}
@@ -1624,9 +1671,13 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(pbi,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
else /* interpret response that came back */
{
@@ -1669,9 +1720,13 @@ int srqStatus;
{
devGpibLib_setPvSevr(pbi,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
devGpibLib_biGpibFinish(pdpvt); /* and finish the processing */
@@ -1718,9 +1773,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pbi,READ_ALARM,VALID_ALARM);
}
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback); /* jrw */
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(0);
}
@@ -1763,9 +1822,14 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pbo,WRITE_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(IDLE);
}
@@ -1792,9 +1856,13 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(pmbbi,WRITE_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
else
{
@@ -1839,9 +1907,13 @@ int srqStatus;
{
devGpibLib_setPvSevr(pmbbi,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
devGpibLib_mbbiGpibFinish(pdpvt); /* and finish the processing */
@@ -1888,9 +1960,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pmbbi,READ_ALARM,VALID_ALARM);
}
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(0);
}
@@ -1934,9 +2010,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pmbbo,WRITE_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback); /* jrw */
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(IDLE);
}
@@ -1966,9 +2046,13 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(psi,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback); /* jrw */
callbackRequest(&pdpvt->head.header.callback);
#endif
}
else
{
@@ -2013,9 +2097,13 @@ int srqStatus;
{
devGpibLib_setPvSevr(psi,READ_ALARM,VALID_ALARM);
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
}
devGpibLib_stringinGpibFinish(pdpvt); /* and finish the processing */
@@ -2051,9 +2139,13 @@ struct gpibDpvt *pdpvt;
psi->val[40] = '\0';
psi->udf = FALSE;
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback); /* jrw */
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(0);
}
@@ -2094,9 +2186,13 @@ struct gpibDpvt *pdpvt;
devGpibLib_setPvSevr(pso,WRITE_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback); /* jrw */
#if 1
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
#else
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest(&pdpvt->head.header.callback);
#endif
return(IDLE);
}
@@ -2279,14 +2375,16 @@ unsigned short val; /* used for EFAST operations only */
*
* The reason it is done this way is because the process() call may
* recursively call itself when records are chained and the callback
* task's stack is larger... just for this purpose.
* task's stack is larger... just for that reason.
*
******************************************************************************/
void
devGpibLib_processCallback(pDpvt)
struct gpibDpvt *pDpvt;
devGpibLib_processCallback(CALLBACK *pCallback)
{
struct gpibDpvt *pDpvt;
callbackGetUser(pDpvt, pCallback);
dbScanLock(pDpvt->precord);
(*(struct rset *)(pDpvt->precord->rset)).process(pDpvt->precord);
dbScanUnlock(pDpvt->precord);
@@ -2369,6 +2467,7 @@ void (*process)();
/* make sure the command type makes sendse for the record type */
if (parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBREAD &&
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBWRITE &&
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBSOFT &&
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBREADW)
{
@@ -2445,9 +2544,11 @@ int
devGpibLib_wfGpibWork(pdpvt)
struct gpibDpvt *pdpvt;
{
int OperationStatus;
struct waveformRecord *pwf= ((struct waveformRecord *)(pdpvt->precord));
struct gpibCmd *pCmd;
struct devGpibParmBlock *parmBlock;
short ibnode = pdpvt->head.device;
parmBlock = (struct devGpibParmBlock *)(((gDset*)(pwf->dset))->funPtr[pwf->dset->number]);
@@ -2458,27 +2559,60 @@ struct gpibDpvt *pdpvt;
if(*(parmBlock->debugFlag))
printf("devGpibLib_wfGpibWork: starting ...command type = %d\n",pCmd->type);
if (devGpibLib_xxGpibWork(pdpvt, pCmd->type, -1) == ERROR)
{
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest((void *)pdpvt);
/**** Handle writes internally... the generic routine will not work ****/
if (pCmd->type == GPIBWRITE)
{
/*
* check to see if this node has timed out within last 10 sec
*/
if(tickGet() < (pdpvt->phwpvt->tmoVal + parmBlock->timeWindow) )
{
if (*parmBlock->debugFlag)
printf("devGpibLib_xxGpibWork(): timeout flush\n");
OperationStatus = ERROR;
}
else
{
OperationStatus = (*(drvGpib.writeIb))(pdpvt->head.pibLink,
ibnode, pdpvt->msg, pCmd->msgLen, pdpvt->head.dmaTimeout);
if(*parmBlock->debugFlag)
printf("devGpibLib_xxGpibWork : done, status = %d\n",OperationStatus);
/* if error occurrs then mark it with time */
if(OperationStatus == ERROR)
{
(pdpvt->phwpvt->tmoCount)++; /* count timeouts */
pdpvt->phwpvt->tmoVal = tickGet(); /* set last timeout time */
}
}
}
else
{
OperationStatus = devGpibLib_xxGpibWork(pdpvt, pCmd->type, -1);
}
if (OperationStatus == ERROR)
{
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
}
else
{
if (pCmd->type != GPIBREADW)
devGpibLib_wfGpibFinish(pdpvt); /* If not waiting on SRQ, finish */
else
{
if (*(parmBlock->debugFlag) || ibSrqDebug)
printf("%s: marking srq Handler for READW operation\n", parmBlock->name);
pdpvt->phwpvt->srqCallback = (int (*)())(((gDset*)(pwf->dset))->funPtr[pwf->dset->number + 2]);
pdpvt->phwpvt->parm = (caddr_t)pdpvt; /* mark the handler */
return(BUSY); /* indicate device still in use */
else
{
if (*(parmBlock->debugFlag) || ibSrqDebug)
printf("%s: marking srq Handler for READW operation\n", parmBlock->name);
pdpvt->phwpvt->srqCallback = (int (*)())(((gDset*)(pwf->dset))->funPtr[pwf->dset->number + 2]);
pdpvt->phwpvt->parm = (caddr_t)pdpvt; /* mark the handler */
return(BUSY); /* indicate device still in use */
}
}
}
return(IDLE); /* indicate device is now idle */
}
@@ -2509,9 +2643,7 @@ int srqStatus;
{
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest((void *)pdpvt);
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
}
devGpibLib_wfGpibFinish(pdpvt); /* and finish the processing */
@@ -2547,9 +2679,8 @@ struct gpibDpvt *pdpvt;
{
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
}
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
pdpvt->head.header.callback.priority = priorityLow;
callbackRequest((void *)pdpvt);
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
return(0);
}

View File

@@ -81,7 +81,7 @@ static long init_record(pmbbo)
case (VME_IO) :
pvmeio = &(pmbbo->out.value.vmeio);
pmbbo->shft = pvmeio->signal;
pmbbo->mask = pmbbo->shft;
pmbbo->mask <<= pmbbo->shft;
status = xy220_read(pvmeio->card,pmbbo->mask,&value);
if(status==0) pmbbo->rbv = pmbbo->rval = value;
else status = 2;

View File

@@ -77,10 +77,7 @@ struct mbboRecord *pmbbo;
long status;
status = recGblInitFastOutLink(&(pmbbo->out), (void *) pmbbo, DBR_ULONG, "RVAL");
if (pmbbo->out.type == CA_LINK)
status = 2;
status = 2;
return status;
} /* end init_record() */

View File

@@ -83,7 +83,7 @@ static long init_record(pmbbo)
case (VME_IO) :
pvmeio = &(pmbbo->out.value.vmeio);
pmbbo->shft = pvmeio->signal;
pmbbo->mask = pmbbo->shft;
pmbbo->mask <<= pmbbo->shft;
status = xy220_read(pvmeio->card,pmbbo->mask,&value);
if(status==0) pmbbo->rbv = pmbbo->rval = value;
else status = 2;

1118
src/dev/devMpc.c Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,20 +4,33 @@ include $(EPICS)/config/CONFIG_BASE
USR_INCLUDES = -I../../drv
SRCS.c = \
../devAnalytekGpib.c ../devXxDg535Gpib.c ../devBBInteract.c \
../devGpibInteract.c ../devXxSr620Gpib.c ../devK486Gpib.c \
../devXxK196Gpib.c ../devXxDc5009Gpib.c ../devXxK263Gpib.c
SRCS.c += ../devAnalytekGpib.c
SRCS.c += ../devXxDg535Gpib.c
SRCS.c += ../devBBInteract.c
SRCS.c += ../devGpibInteract.c
SRCS.c += ../devXxSr620Gpib.c
SRCS.c += ../devK486Gpib.c
SRCS.c += ../devXxK196Gpib.c
SRCS.c += ../devXxDc5009Gpib.c
SRCS.c += ../devXxK263Gpib.c
SRCS.c += ../devXxSkeletonGpib.c
OBJS = \
devAnalytekGpib.o devXxDg535Gpib.o devBBInteract.o \
devGpibInteract.o devXxSr620Gpib.o devK486Gpib.o \
devXxK196Gpib.o devXxDc5009Gpib.o devXxK263Gpib.o
OBJS += devAnalytekGpib.o
OBJS += devXxDg535Gpib.o
OBJS += devBBInteract.o
OBJS += devGpibInteract.o
OBJS += devXxSr620Gpib.o
OBJS += devK486Gpib.o
OBJS += devXxK196Gpib.o
OBJS += devXxDc5009Gpib.o
OBJS += devXxK263Gpib.o
OBJS += devXxSkeletonGpib.o
PROD = devLibOpt
PROD = devLibOpt $(OBJS)
include $(EPICS)/config/RULES.Vx
devLibOpt: $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)

View File

@@ -139,8 +139,10 @@ int GI(void)
for (cnt=0; cnt < LIST_SIZE; cnt++)
{ /* init the elements of the command table */
#if 0
gpibIntCmds[cnt].head.header.list.list1 = NULL;
gpibIntCmds[cnt].head.header.list.list2 = NULL;
#endif
gpibIntCmds[cnt].head.workStart = gpibWork;
gpibIntCmds[cnt].head.link = 0;
gpibIntCmds[cnt].head.device = 0;
@@ -155,7 +157,7 @@ int GI(void)
}
ans = 0; /* set loop not to exit */
printf("\n\n");
logMsg("\n\n");
while ((ans != 'q') && (ans != 'Q'))
{
@@ -244,16 +246,20 @@ static int timingStudy(void)
pCmd[i]->busy = 0; /* mark message 'not in queue' */
pCmd[i]->count = 0;
#ifdef USE_162_STUFF
if (pCmd[i]->linkId < MVME162_LINK_NUM_BASE)
{
#endif
(*(drvGpib.ioctl))(pCmd[i]->linkType, pCmd[i]->linkId, pCmd[i]->bug, IBGENLINK, 0, NULL);
(*(drvGpib.ioctl))(pCmd[i]->linkType, pCmd[i]->linkId, pCmd[i]->bug, IBGETLINK, 0, &(pCmd[i]->head.pibLink));
#ifdef USE_162_STUFF
}
else
{
drv162IB_InitLink(pCmd[i]->linkId);
drv162IB_GetLink(pCmd[i]->linkId, &(pCmd[i]->head.pibLink));
}
#endif
}
else
{
@@ -289,11 +295,14 @@ static int timingStudy(void)
pCmd[i]->count++;
pCmd[i]->busy = 1; /* mark the xact as busy */
#ifdef USE_162_STUFF
if (pCmd[i]->linkId < MVME162_LINK_NUM_BASE)
#endif
(*(drvGpib.qGpibReq))(pCmd[i], IB_Q_LOW);
#ifdef USE_162_STUFF
else
drv162IB_QueueReq(pCmd[i], IB_Q_LOW);
#endif
reps--;
if (reps%10000 == 0)
{
@@ -359,11 +368,16 @@ static int sendMsg(void)
replyIsBack = FALSE;
ticks = 0;
#ifdef USE_162_STUFF
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
{
#endif
(*(drvGpib.ioctl))(pCmd->linkType, pCmd->linkId, pCmd->bug, IBGENLINK, 0, NULL);
(*(drvGpib.ioctl))(pCmd->linkType, pCmd->linkId, pCmd->bug, IBGETLINK, 0, &(pCmd->head.pibLink));
(*(drvGpib.qGpibReq))(pCmd, IB_Q_LOW); /* queue the msg */
#ifdef USE_162_STUFF
}
else
{
@@ -371,6 +385,7 @@ static int sendMsg(void)
drv162IB_GetLink(pCmd->linkId, &(pCmd->head.pibLink));
drv162IB_QueueReq(pCmd, IB_Q_LOW);
}
#endif
while (!replyIsBack && (ticks < maxTicks)) /* wait for reply msg */
{
@@ -380,6 +395,8 @@ static int sendMsg(void)
if (replyIsBack)
{
if (ibDebug)
taskDelay(60); /* Allow debug printing to complete */
showGpibMsg(msgNum);
}
else
@@ -399,10 +416,15 @@ static int gpibWork(struct gpibIntCmd *pCmd)
switch (pCmd->type) {
case 'w':
case 'W': /* write the message to the GPIB listen adrs */
#ifdef USE_162_STUFF
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
#endif
status =(*(drvGpib.writeIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
#ifdef USE_162_STUFF
else
status = drv162IB_write(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
#endif
if (status == ERROR)
strcpy(pCmd->resp, "GPIB TIMEOUT (while talking)");
@@ -411,10 +433,14 @@ static int gpibWork(struct gpibIntCmd *pCmd)
break;
case 'r':
case 'R': /* write the command string */
#ifdef USE_162_STUFF
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
#endif
status = (*(drvGpib.writeIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
#ifdef USE_162_STUFF
else
status = drv162IB_write(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
#endif
if (status == ERROR)
{
@@ -426,10 +452,14 @@ static int gpibWork(struct gpibIntCmd *pCmd)
case 'i':
/* read the instrument */
pCmd->resp[0] = 0; /* clear response string */
#ifdef USE_162_STUFF
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
#endif
status = (*(drvGpib.readIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->resp, MAX_MSG_LENGTH, GITime);
#ifdef USE_162_STUFF
else
status = drv162IB_read(pCmd->head.pibLink, pCmd->head.device, pCmd->resp, MAX_MSG_LENGTH, GITime);
#endif
if (status == ERROR)
{
@@ -438,7 +468,7 @@ static int gpibWork(struct gpibIntCmd *pCmd)
}
else if (status > (MAX_MSG_LENGTH - 1)) /* check length of resp */
{
printf("GPIB Response length equaled allocated space !!!\n");
logMsg("GPIB Response length equaled allocated space !!!\n");
pCmd->resp[(MAX_MSG_LENGTH)] = '\0'; /* place \0 at end */
}
else

View File

@@ -391,8 +391,8 @@ STATIC int srqHandler(struct hwpvt *phwpvt, int srqStatus)
printf("dc5009 srqHandler: Unsolicited SRQ being handled from link %d, device %d, status = 0x%02.2X\n",
phwpvt->link, phwpvt->device, srqStatus);
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.header.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.header.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
callbackRequest((CALLBACK*)phwpvt->unsolicitedDpvt);
}
else

View File

@@ -404,9 +404,9 @@ STATIC int srqHandler(struct hwpvt *phwpvt, int srqStatus)
printf("dc5009 srqHandler: Unsolicited SRQ being handled from link %d, device %d, status = 0x%02.2X\n",
phwpvt->link, phwpvt->device, srqStatus);
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.header.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.header.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
callbackRequest(phwpvt->unsolicitedDpvt);
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
callbackRequest((CALLBACK*)phwpvt->unsolicitedDpvt);
}
else
{

View File

@@ -282,8 +282,8 @@ STATIC int srqHandler(struct hwpvt *phwpvt, int srqStatus)
logMsg("Unsolicited SRQ being handled from link %d, device %d, status = 0x%02.2X\n",
phwpvt->link, phwpvt->device, srqStatus);
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.header.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.header.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
((struct gpibDpvt*)(phwpvt->unsolicitedDpvt))->head.callback.callback = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->process;
((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->head.callback.priority = ((struct gpibDpvt *)(phwpvt->unsolicitedDpvt))->processPri;
callbackRequest((CALLBACK*)phwpvt->unsolicitedDpvt);
}
else

View File

@@ -1,15 +1,12 @@
#
# $Id$
#
# Lowest Level Directroy Makefile
# by Janet Anderson
#
# $Log$
#
EPICS=../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS
DIRS = ansi old combine
include $(EPICS)/config/RULES_DIRS

View File

@@ -4,73 +4,74 @@ include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -fshared-data -fvolatile -mnobitfield -traditional
SRCS.c = \
../module_types.c\
../drvXy010.c\
../drvAb.c\
../drvBb902.c\
../drvBb910.c\
../drvCompuSm.c\
../drvDvx.c\
../drvMz8310.c\
../drvOms.c\
../drvStc.c\
../drvTime.c\
../drvVmi4100.c\
../drvXy210.c\
../drvXy220.c\
../drvXy240.c\
../drvXy566.c\
../drvAt5Vxi.c\
../drvHp1404a.c\
../drvEpvxi.c\
../drvEpvxiMsg.c\
../drvBitBus.c\
../drvGpib.c\
../drvMsg.c\
../drvBB232.c\
../drvHpe1368a.c\
../drvHpe1445a.c\
../drvKscV215.c\
../drvComet.c\
../drvJgvtr1.c\
../drvFp.c\
../drvMvme162.c\
../drvFpm.c
SRCS.c += ../module_types.c
SRCS.c += ../drvAb.c
SRCS.c += ../drvAt5Vxi.c
SRCS.c += ../drvBB232.c
SRCS.c += ../drvBb902.c
SRCS.c += ../drvBb910.c
SRCS.c += ../drvBitBus.c
# SRCS.c += ../drvCaenV265.c
SRCS.c += ../drvComet.c
SRCS.c += ../drvCompuSm.c
SRCS.c += ../drvDvx.c
SRCS.c += ../drvEpvxi.c
SRCS.c += ../drvEpvxiMsg.c
SRCS.c += ../drvFp.c
SRCS.c += ../drvFpm.c
SRCS.c += ../drvGpib.c
SRCS.c += ../drvHp1404a.c
SRCS.c += ../drvHpe1368a.c
SRCS.c += ../drvHpe1445a.c
SRCS.c += ../drvJgvtr1.c
SRCS.c += ../drvKscV215.c
SRCS.c += ../drvMsg.c
SRCS.c += ../drvMz8310.c
SRCS.c += ../drvOms.c
SRCS.c += ../drvStc.c
SRCS.c += ../drvTime.c
# SRCS.c += ../drvTranServ.c
SRCS.c += ../drvVmi4100.c
SRCS.c += ../drvXy010.c
SRCS.c += ../drvXy210.c
SRCS.c += ../drvXy220.c
SRCS.c += ../drvXy240.c
SRCS.c += ../drvXy566.c
OBJS += module_types.o
OBJS += drvAb.o
OBJS += drvAt5Vxi.o
OBJS += drvBB232.o
OBJS += drvBb902.o
OBJS += drvBb910.o
OBJS += drvBitBus.o
# OBJS += drvCaenV265.o
OBJS += drvComet.o
OBJS += drvCompuSm.o
OBJS += drvDvx.o
OBJS += drvEpvxi.o
OBJS += drvEpvxiMsg.o
OBJS += drvFp.o
OBJS += drvFpm.o
OBJS += drvGpib.o
OBJS += drvHp1404a.o
OBJS += drvHpe1368a.o
OBJS += drvHpe1445a.o
OBJS += drvJgvtr1.o
OBJS += drvKscV215.o
OBJS += drvMsg.o
OBJS += drvMz8310.o
OBJS += drvOms.o
OBJS += drvStc.o
OBJS += drvTime.o
# OBJS += drvTranServ.o
OBJS += drvVmi4100.o
OBJS += drvXy010.o
OBJS += drvXy210.o
OBJS += drvXy220.o
OBJS += drvXy240.o
OBJS += drvXy566.o
OBJS = \
module_types.o\
drvXy010.o\
drvAb.o\
drvBb902.o\
drvBb910.o\
drvCompuSm.o\
drvDvx.o\
drvMz8310.o\
drvOms.o\
drvStc.o\
drvTime.o\
drvVmi4100.o\
drvXy210.o\
drvXy220.o\
drvXy240.o\
drvXy566.o\
drvAt5Vxi.o\
drvHp1404a.o\
drvEpvxi.o\
drvEpvxiMsg.o\
drvBitBus.o\
drvGpib.o\
drvMsg.o\
drvBB232.o\
drvHpe1368a.o\
drvHpe1445a.o\
drvKscV215.o\
drvComet.o\
drvJgvtr1.o\
drvFp.o\
drvMvme162.o\
drvFpm.o
PROD = drvSup
@@ -81,5 +82,4 @@ $(PROD): $(OBJS)
$(LINK.c) $@ $(OBJS) $(LDLIBS)
# ../drvCaenV265.c\
# drvCaenV265.o\

View File

@@ -1,5 +1,6 @@
The CPU030 may need to have the nivxi path set correctly:
From the vxWorks shell type vxitedit
From the vxWorks shell type "vxitedit"
take option 2
take option 3
type list
@@ -8,6 +9,7 @@ The CPU030 may need to have the nivxi path set correctly:
(the path should end in nivxi
and should traverse the niCpu030
directories shipped with the 030
ie somethin of the form "???/config/niCPU030/nivxi"
type save
type exit
.

12
src/drv/ansi/Makefile Normal file
View File

@@ -0,0 +1,12 @@
#
# $Id$
#
#
#
EPICS=../../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS

18
src/drv/ansi/Makefile.Vx Normal file
View File

@@ -0,0 +1,18 @@
#
# $Id$
#
EPICS = ../../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -ansi
VX_WARN_YES = -Wall -pedantic
SRCS.c += ../drvAb.c
TARGETS += drvAb.o
include $(EPICS)/config/RULES.Vx

1713
src/drv/ansi/drvAb.c Normal file

File diff suppressed because it is too large Load Diff

87
src/drv/ansi/drvAb.h Normal file
View File

@@ -0,0 +1,87 @@
/* drvAb.h */
/* header file for the Allen-Bradley Remote Serial IO
* This defines interface between driver and device support
*
* Author: Marty Kraimer
* Date: 03-06-95
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* 01 03-06-95 mrk Moved all driver specific code to drvAb.c
*/
#ifndef INCdrvAbh
#define INCdrvAbh 1
#include "dbScan.h"
/* interface types */
typedef enum {typeNotAssigned,typeBi,typeBo,typeBiBo,typeAi,typeAo,typeBt}
cardType;
/* status values*/
typedef enum{abSuccess,abNewCard,abCardConflict,abNoCard,abNotInitialized,
abBtqueued,abBusy,abTimeout,abLinkDown,abFailure} abStatus;
extern char **abStatusMessage;
typedef enum{abBitNotdefined,abBit8,abBit16,abBit32} abNumBits;
extern char **abNumBitsMessage;
/*entry table for dev to drv routines*/
typedef struct {
abStatus (*registerCard)
(unsigned short link,unsigned short adapter, unsigned short card,
cardType type, const char *card_name,
void (*callback)(void *drvPvt),
void **drvPvt);
void (*getLocation)
(void *drvPvt,
unsigned short *link, unsigned short *adapter,unsigned short *card);
abStatus (*setNbits)(void *drvPvt, abNumBits nbits);
void (*setUserPvt)(void *drvPvt, void *userPvt);
void *(*getUserPvt)(void *drvPvt);
abStatus (*getStatus)(void *drvPvt);
abStatus(*startScan)
(void *drvPvt, unsigned short update_rate,
unsigned short *pwrite_msg, unsigned short write_msg_len,
unsigned short *pread_msg, unsigned short read_msg_len);
abStatus(*updateAo)(void *drvPvt);
abStatus(*updateBo) (void *drvPvt,unsigned long value,unsigned long mask);
abStatus(*readBo) (void *drvPvt,unsigned long *value,unsigned long mask);
abStatus(*readBi) (void *drvPvt,unsigned long *value,unsigned long mask);
abStatus(*btRead)(void *drvPvt,unsigned short *pread_msg,
unsigned short read_msg_len);
abStatus(*btWrite)(void *drvPvt,unsigned short *pwrite_msg,
unsigned short write_msg_len);
}abDrv;
extern abDrv *pabDrv;
int ab_reset(void);
int ab_reset_link(int link);
int abConfigNlinks(int nlinks);
int abConfigVme(int link, int base, int vector, int level);
int abConfigBaud(int link, int baud);
int abConfigScanList(int link, int scan_list_len, char *scan_list);
#endif /*INCdrvAbh*/

View File

@@ -551,10 +551,10 @@ unsigned short card;
printf("Allen Bradley: abBtCallback Logic Error");
return;
}
(preq->callback)(preq);
pabbtrequest[link][adapter][card] = NULL;
pcard = &ab_config[link][adapter][card];
*pcard &= ~(AB_INTERFACE_TYPE|AB_INIT_BIT|AB_SENT_INIT);
pabbtrequest[link][adapter][card] = NULL;
(preq->callback)(preq);
}
int ab_bt_read(link,adapter,card,preq)
@@ -1304,13 +1304,14 @@ abDoneTask(){
*
* simulate a change of state interrupt from the Allen-Bradley
*/
unsigned char ab_old_binary_ins[AB_MAX_LINKS*AB_MAX_ADAPTERS*AB_MAX_CARDS];
unsigned short ab_old_binary_ins[AB_MAX_LINKS][AB_MAX_ADAPTERS][AB_MAX_CARDS];
ab_bi_cos_simulator()
{
register struct ab_region *p6008;
register unsigned short link;
register unsigned short *pcard;
unsigned short *ps_input,*ps_oldval;
unsigned short new;
unsigned short *pold;
short adapter,card,inpinx;
short first_scan,first_scan_complete;
short adapter_status_change;
@@ -1323,8 +1324,6 @@ ab_bi_cos_simulator()
first_scan_complete = FALSE;
first_scan = TRUE;
for(;;){
/* check each link */
link = 0;
for (link = 0; link < AB_MAX_LINKS; link++){
if ((p6008 = p6008s[link]) == 0) continue;
for (adapter = 0; adapter < AB_MAX_ADAPTERS; adapter++){
@@ -1335,28 +1334,24 @@ ab_bi_cos_simulator()
for (card = 0; card < AB_MAX_CARDS; card++){
pcard = &ab_config[link][adapter][card];
inpinx = (adapter * AB_CARD_ADAPTER) + card;
pold = &ab_old_binary_ins[link][adapter][card];
if ((*pcard & AB_INTERFACE_TYPE) != AB_BI_INTERFACE) continue;
if ((*pcard & AB_CARD_TYPE) == ABBI_16_BIT){
/* sixteen bit byte ordering in dual ported memory */
/* byte 0011 2233 4455 6677 8899 AABB */
/* card 0000 2222 4444 6666 8888 AAAA */
if (inpinx & 0x1) continue;
ps_input = (unsigned short *)&(p6008->iit[inpinx]);
ps_oldval = (unsigned short *)&(ab_old_binary_ins[inpinx]);
if ((*ps_input != *ps_oldval) || first_scan || adapter_status_change){
scanIoRequest(ioscanpvt[link][adapter][card]);
*ps_oldval = *ps_input;
}
new = *(unsigned short *)&(p6008->iit[inpinx]);
}else{
/* eight bit byte ordering in dual ported memory */
/* 1100 3322 5544 7766 9988 BBAA */
if (inpinx & 0x1) inpinx--; /* shuffle those bytes */
else inpinx++;
if ((p6008->iit[inpinx] != ab_old_binary_ins[inpinx]) || first_scan || adapter_status_change){
scanIoRequest(ioscanpvt[link][adapter][card]);
ab_old_binary_ins[inpinx] = p6008->iit[inpinx];
}
new = (unsigned short)(p6008->iit[inpinx]);
}
if((new!=*pold) || first_scan || adapter_status_change){
scanIoRequest(ioscanpvt[link][adapter][card]);
*pold = new;
}
}
}

View File

@@ -450,10 +450,10 @@ struct at5vxi_model{
#define AT5VXI_MODEL_FROM_INDEX(INDEX) ((unsigned)((INDEX)|0xf00))
/*
NOTE: The macro AT5VXI_INDEX_FROM_MODEL(MODEL) defined above
should return an index into the correct data given the
VXI device's model code.
*/
* NOTE: The macro AT5VXI_INDEX_FROM_MODEL(MODEL) defined above
* should return an index into the correct data given the
* VXI device's model code.
*/
struct at5vxi_model at5vxi_models[] = {
{"INTERFACE SIMULATOR", "112Y-280158"},
{"I CONTROLLER", "112Y-280176"},
@@ -477,6 +477,16 @@ struct at5vxi_model at5vxi_models[] = {
{"DOWNCONVERTER", "112Y-280456"},
{"COAX MONITOR TRANSMITTER", "112Y-280587"},
{"CAVITY SIMULATOR", "112Y-280232"},
{"CABLE CONTROLLER (2 CHANNEL)","112Y-280539"},
{"BREADBOARD", "112Y-280358"},
{"I/O INTERFACE", "112Y-280359"},
{"DIAGNOSTIC - BPM", "112Y-280422-1"},
{"FAST ENVELOPE DETECTOR", "112Y-280421"},
{"DIAGNOSTIC - CM", "112Y-280422-2"},
{"DIAGNOSTIC - MISC", "112Y-280422-3"},
{"FAST VECTOR DETECTOR", "112Y-280651"},
{"SINGLE-WIDE VECTOR DETECTOR", "112Y-280672"},
{"FM / AM", "112Y-280xxx"}
};
#define AT5VXI_VALID_MODEL(MODEL) \

View File

@@ -65,6 +65,20 @@
* This driver currently needs work on error message generation.
*
* $Log$
* Revision 1.36 1994/12/16 16:11:26 winans
* Added debug flag guards to ALL printing. The default debug level is set
* to 1 -- this provides the same output as the old version.
*
* Revision 1.35 1994/12/12 16:02:57 winans
* Rewrote the init code so that it always returns a zero (don't kill the
* startup.cmd file.) It is possible that this could cause some confusion
* to the database, should it decide to then use a link that did not init
* properly.
*
* Revision 1.34 1994/10/19 18:31:22 winans
* ANSIfied the bitbus driver so that the compiler stopped warning about
* exery third line of code.
*
* Revision 1.33 1994/10/04 18:42:42 winans
* Added an extensive debugging facility.
*
@@ -129,6 +143,8 @@ STATIC int bbKill(int link);
STATIC void BBrebootFunc(void);
STATIC int txStuck(int link);
int BBConfig(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
int __BBConfig(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
#ifdef BB_SUPER_DEBUG
int BBHistDump(int link);
@@ -157,7 +173,7 @@ int XycomMaxOutstandMsgs = XYCOM_BB_MAX_OUTSTAND_MSGS;
* To disable this feature, set one of them to -1.
*
*****************************************************************************/
int bbDebug = 0;
int bbDebug = 1;
int bbDebugLink=-1;
int bbDebugNode=-1;
@@ -199,7 +215,16 @@ int BBConfig(unsigned long Link,
unsigned long IrqVector,
unsigned long IrqLevel)
{
__BBConfig(Link, LinkType, BaseAddr, IrqVector, IrqLevel);
return(0);
}
int __BBConfig(unsigned long Link,
unsigned long LinkType,
unsigned long BaseAddr,
unsigned long IrqVector,
unsigned long IrqLevel)
{
void *pVoid;
int j;
static int FirstTime = 1;
@@ -419,7 +444,7 @@ STATIC long reportBB(void)
{
int i;
if (bbDebug)
if (bbDebug>1)
printf("Bitbus debugging flag is set to %d\n", bbDebug);
for (i=0; i< BB_NUM_LINKS; i++)
@@ -468,8 +493,10 @@ pepReset(int link)
taskDelay(20); /* give the 80152 time to self check */
if ((pBBLink[link]->l.PepLink.bbRegs->stat_ctl & 0x10) != 0x0) {
printf("pepReset(%d): PB-BIT firmware reset failed!\n", link);
if ((pBBLink[link]->l.PepLink.bbRegs->stat_ctl & 0x10) != 0x0)
{
if (bbDebug)
printf("pepReset(%d): PB-BIT firmware reset failed!\n", link);
return(ERROR);
}
@@ -480,7 +507,8 @@ pepReset(int link)
if (!j)
{
printf("pepReset(%d): receive fifo will not clear after reset!\n", link);
if (bbDebug)
printf("pepReset(%d): receive fifo will not clear after reset!\n", link);
return(ERROR);
}
@@ -532,7 +560,8 @@ STATIC int xvmeReset(int link)
if (!j)
{
printf("xvmeReset(%d): Command buffer will not clear after reset!\n", link);
if (bbDebug)
printf("xvmeReset(%d): Command buffer will not clear after reset!\n", link);
return(ERROR);
}
@@ -542,13 +571,15 @@ STATIC int xvmeReset(int link)
if (!j)
{
printf("xvmeReset(%d): Data buffer will not clear after reset!\n", link);
if (bbDebug)
printf("xvmeReset(%d): Data buffer will not clear after reset!\n", link);
return(ERROR);
}
if ((pBBLink[link]->l.XycomLink.bbRegs->fifo_stat & XVME_FSVALID) != XVME_FSIDLE)
{
printf("xvmeReset(%d): XVME board not returning to idle status after reset!\n", link);
if (bbDebug)
printf("xvmeReset(%d): XVME board not returning to idle status after reset!\n", link);
return(ERROR);
}
@@ -846,7 +877,8 @@ xvmeRxTask(int link)
{ /* something bad happened... inject a delay to the */
/* requested timeout duration. */
printf("xvmeRxTask(%d): 0x91 from node %d, invoking synthetic delay\n", link, rxHead[2]);
if (bbDebug)
printf("xvmeRxTask(%d): 0x91 from node %d, invoking synthetic delay\n", link, rxHead[2]);
(pBBLink[link]->syntheticDelay[rxDpvtHead->txMsg.node]) = rxDpvtHead->retire;
pBBLink[link]->DelayCount++;
}
@@ -892,17 +924,6 @@ xvmeRxTask(int link)
rxDpvtHead->status = BB_OK; /* OK, unless BB_LENGTH */
rxState = BBRX_DATA; /* finish reading till RCMD */
#if 0
if (bbDebug)
{
printf("xvmeRxTask(%d): msg from node %d unsolicited!\nHeader:", link, rxHead[2]);
rxDpvtHead->rxMsg.length = 7; /* we just have the header now */
drvBitBusDumpMsg(&(rxDpvtHead->rxMsg));
}
semGive(pXvmeLink[link]->pbbLink->busyList.sem);
rxState = BBRX_IGN; /* nothing waiting... toss it */
#endif
}
break;
@@ -935,7 +956,8 @@ xvmeRxTask(int link)
if (rxDpvtHead == NULL)
{
ch = pBBLink[link]->l.XycomLink.bbRegs->cmnd;
printf("xvmeRxTask(%d): got unexpected XVME_RCMD\n", link);
if (bbDebug)
printf("xvmeRxTask(%d): got unexpected XVME_RCMD\n", link);
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, NULL, XACT_HIST_STATE_RX_URCMD);
#endif
@@ -945,7 +967,7 @@ xvmeRxTask(int link)
rxDpvtHead->status = BB_OK;
rxDpvtHead->rxCmd = pBBLink[link]->l.XycomLink.bbRegs->cmnd;
/* if (bbDebug) */
if (bbDebug)
{
printf("xvmeRxTask(%d): msg from node %d unsolicited:", link, rxDpvtHead->rxMsg.node);
drvBitBusDumpMsg(&(rxDpvtHead->rxMsg));
@@ -1008,14 +1030,14 @@ xvmeRxTask(int link)
/* Tell the watch dog I am ready for the reset (reset in the dog task) */
pBBLink[link]->rxAbortAck = 1;
/* if (bbDebug) */
if (bbDebug)
printf("xvmeRxTask(%d): resetting due to abort status\n", link);
/* wait for link state to become active again */
while (pBBLink[link]->abortFlag != 0)
taskDelay(RESET_POLL_TIME);
/* if bbDebug) */
if (bbDebug)
printf("xvmeRxTask(%d): restarting after abort\n", link);
}
}
@@ -1134,7 +1156,7 @@ xvmeWdTask(int link)
/* Get rid of the request and set error status etc... */
listDel(&(pBBLink[link]->busyList), pnode);
/*if (bbDebug)*/
if (bbDebug)
{
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, pnode, XACT_HIST_STATE_WD_TIMEOUT);
@@ -1172,7 +1194,8 @@ xvmeWdTask(int link)
{ /* Send out a RAC_NODE_OFFLINE to the controller */
semGive(pBBLink[link]->busyList.sem);
printf("issuing a node offline for link %d node %d\n", link, resetNodeData);
if (bbDebug)
printf("issuing a node offline for link %d node %d\n", link, resetNodeData);
semTake(pBBLink[link]->queue[BB_Q_HIGH].sem, WAIT_FOREVER);
listAddHead(&(pBBLink[link]->queue[BB_Q_HIGH]), &resetNode);
@@ -1182,7 +1205,8 @@ printf("issuing a node offline for link %d node %d\n", link, resetNodeData);
if (semTake(syncSem, sysClkRateGet()/4) == ERROR)
{
printf("xvmeWdTask(%d): link dead, trying manual reboot\n", link);
if (bbDebug)
printf("xvmeWdTask(%d): link dead, trying manual reboot\n", link);
pBBLink[link]->nukeEm = 1;
pBBLink[link]->abortFlag = 1; /* Start the abort sequence */
@@ -1286,13 +1310,13 @@ xvmeTxTask(int link)
BBSetHistEvent(link, NULL, XACT_HIST_STATE_TX_ABORT);
#endif
/* if (bbDebug) */
if (bbDebug)
printf("xvmeTxTask(%d): resetting due to abort status\n", link);
while (pBBLink[link]->abortFlag != 0)
taskDelay(RESET_POLL_TIME); /* wait for link to reset */
/* if (bbDebug) */
if (bbDebug)
printf("xvmeTxTask(%d): restarting after abort\n", link);
}
else
@@ -1325,7 +1349,8 @@ xvmeTxTask(int link)
if ((pBBLink[link]->syntheticDelay[pnode->txMsg.node] != 0)
&& (pBBLink[link]->syntheticDelay[pnode->txMsg.node] < now))
{
printf("xvmeTxTask(%d): terminating synthetic idle on node %d\n", link, pnode->txMsg.node);
if (bbDebug)
printf("xvmeTxTask(%d): terminating synthetic idle on node %d\n", link, pnode->txMsg.node);
(pBBLink[link]->deviceStatus[pnode->txMsg.node])--;
pBBLink[link]->syntheticDelay[pnode->txMsg.node] = 0;
pBBLink[link]-> DelayCount--;
@@ -1397,7 +1422,7 @@ xvmeTxTask(int link)
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, pnode, XACT_HIST_STATE_TX_RESET);
#endif
/* if (bbDebug) */
if (bbDebug)
printf("xvmeTxTask(%d): RAC_RESET_SLAVE sent, resetting node %d\n", link, pnode->txMsg.node);
pnode->status = BB_OK;
@@ -1471,8 +1496,11 @@ xvmeTxTask(int link)
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, pnode, XACT_HIST_STATE_TX_ABORT);
#endif
printf("Message in progress when abort issued:\n");
drvBitBusDumpMsg(&pnode->txMsg);
if (bbDebug)
{
printf("Message in progress when abort issued:\n");
drvBitBusDumpMsg(&pnode->txMsg);
}
}
/* BUG -- I don't really need this */
/* break;*/ /* stop checking the fifo queues */
@@ -1495,7 +1523,7 @@ xvmeTxTask(int link)
******************************************************************************/
STATIC int txStuck(int link)
{
/* if (bbDebug) */
if (bbDebug)
printf("bitbus transmitter task stuck, resetting link %d\n", link);
bbReset(link);
@@ -1523,14 +1551,6 @@ STATIC long qBBReq(struct dpvtBitBusHead *pdpvt, int prio)
errMessage(S_BB_badPrio, message);
return(ERROR);
}
#if 0
if (checkLink(pdpvt->link) == ERROR)
{
sprintf(message, "invalid link requested in call to qbbreq(%8.8X, %d)\n", pdpvt, prio);
errMessage(S_BB_rfu1, message);
return(ERROR);
}
#else
if (checkLink(pdpvt->link) == ERROR)
{
if (pdpvt->link >= BB_NUM_LINKS)
@@ -1546,7 +1566,6 @@ STATIC long qBBReq(struct dpvtBitBusHead *pdpvt, int prio)
}
return(ERROR);
}
#endif
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(pdpvt->link, pdpvt, XACT_HIST_STATE_QUEUE);
@@ -1945,7 +1964,8 @@ pepRxTask(int link)
if (rxHead[6] == 0x91)
{ /* something bad happened... inject a delay to the */
/* requested timeout duration. */
printf("pepRxTask(%d): 0x91 from node %d, invoking synthetic delay\n", link, rxHead[4]);
if (bbDebug)
printf("pepRxTask(%d): 0x91 from node %d, invoking synthetic delay\n", link, rxHead[4]);
(pBBLink[link]->syntheticDelay[rxDpvtHead->txMsg.node]) = rxDpvtHead->retire;
pBBLink[link]->DelayCount++;
}
@@ -1990,21 +2010,6 @@ pepRxTask(int link)
rxDpvtHead->status = BB_OK; /* OK, unless BB_LENGTH */
rxState = BBRX_DATA; /* finish reading till RCMD */
#if 0 /* relocated to later spot in function */
if (rxDpvtHead == NULL)
{
if (bbDebug > 9)
{
printf("pepRxTask(%d): msg from node %d unsolicited!\n",
link, rxHead[4]);
printf("contents: %2.2x %2.2x %2.2x %2.2x %2.2x\n",rxHead[2],
rxHead[3],rxHead[4],rxHead[5],rxHead[6]);
}
semGive(pXvmeLink[link]->pbbLink->busyList.sem);
rxState = BBRX_IGN; /* nothing waiting... toss it */
}
#endif
}
break;
@@ -2044,7 +2049,7 @@ pepRxTask(int link)
else if (rxDpvtHead == &UselessMsg)
{
rxDpvtHead->status = BB_OK;
/* if (bbDebug) */
if (bbDebug)
{
printf("pepRxTask(%d): msg from node %d unsolicited:\n", link, rxDpvtHead->rxMsg.node);
drvBitBusDumpMsg(&(rxDpvtHead->rxMsg));
@@ -2107,15 +2112,15 @@ pepRxTask(int link)
/* Tell the watch dog I am ready for the reset (reset in the dog task) */
pBBLink[link]->rxAbortAck = 1;
/* if (bbDebug) */
printf("pepRxTask(%d): resetting due to abort status\n", link);
if (bbDebug)
printf("pepRxTask(%d): resetting due to abort status\n", link);
/* wait for link state to become active again */
while (pBBLink[link]->abortFlag != 0)
taskDelay(RESET_POLL_TIME);
/* if bbDebug) */
printf("pepRxTask(%d): restarting after abort\n", link);
if (bbDebug)
printf("pepRxTask(%d): restarting after abort\n", link);
}
}
}
@@ -2233,9 +2238,11 @@ STATIC int pepWdTask(int link)
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, pnode, XACT_HIST_STATE_WD_TIMEOUT);
#endif
/* printf("pepWdTask(%d): TIMEOUT on xact 0x%8.8X\n", link, pnode);*/
printf("pepWdTask(%d): TIMEOUT on bitbus message:\n", link);
drvBitBusDumpMsg(&pnode->txMsg);
if (bbDebug)
{
printf("pepWdTask(%d): TIMEOUT on bitbus message:\n", link);
drvBitBusDumpMsg(&pnode->txMsg);
}
/* BUG -- do this here or defer until RX gets a response? */
(pBBLink[link]->deviceStatus[pnode->txMsg.node])--; /* fix device status */
@@ -2284,8 +2291,11 @@ STATIC int pepWdTask(int link)
semGive(pBBLink[link]->linkEventSem); /* Tell TxTask to send the messages */
if (semTake(syncSem, (sysClkRateGet()) ) == ERROR) {
printf("pepWdTask(%d): link dead, trying manual reboot\n", link);
if (semTake(syncSem, (sysClkRateGet()) ) == ERROR)
{
if (bbDebug)
printf("pepWdTask(%d): link dead, trying manual reboot\n", link);
pBBLink[link]->nukeEm = 1;
pBBLink[link]->abortFlag = 1;
semGive(pBBLink[link]->linkEventSem);
@@ -2373,7 +2383,7 @@ STATIC int pepTxTask(int link)
register int x;
unsigned long now;
if (bbDebug)
if (bbDebug>1)
printf("pepTxTask started for link %d\n", link);
while(1) {
@@ -2385,12 +2395,14 @@ STATIC int pepTxTask(int link)
BBSetHistEvent(link, NULL, XACT_HIST_STATE_TX_ABORT);
#endif
printf("pepTxTask(%d): resetting due to abort status\n", link);
if (bbDebug)
printf("pepTxTask(%d): resetting due to abort status\n", link);
while (pBBLink[link]->abortFlag != 0)
taskDelay(RESET_POLL_TIME); /* wait for link to reset */
printf("pepTxTask(%d): restarting after abort\n", link);
if (bbDebug)
printf("pepTxTask(%d): restarting after abort\n", link);
}
else
{
@@ -2420,7 +2432,8 @@ STATIC int pepTxTask(int link)
if ((pBBLink[link]->syntheticDelay[pnode->txMsg.node] != 0)
&& (pBBLink[link]->syntheticDelay[pnode->txMsg.node] < now))
{
printf("pepTxTask(%d): terminating synthetic idle on node %d\n", link, pnode->txMsg.node);
if (bbDebug)
printf("pepTxTask(%d): terminating synthetic idle on node %d\n", link, pnode->txMsg.node);
(pBBLink[link]->deviceStatus[pnode->txMsg.node])--;
pBBLink[link]->syntheticDelay[pnode->txMsg.node] = 0;
pBBLink[link]->DelayCount--;
@@ -2450,10 +2463,13 @@ STATIC int pepTxTask(int link)
/* Send the message in polled mode */
txTCount = pnode->txMsg.length;
/* BUG -- would be nice if we verify the length >6 here */
txCCount = 0;
txMsg = &(pnode->txMsg.length);
while ((txCCount < txTCount) && (pBBLink[link]->abortFlag == 0)) {
while ((txCCount < txTCount -1) && (pBBLink[link]->abortFlag == 0)) {
stuck = 1000;
while (((pBBLink[link]->l.PepLink.bbRegs->stat_ctl & PEP_BB_TFNF)
@@ -2478,12 +2494,13 @@ STATIC int pepTxTask(int link)
if (bbDebug>30)
printf("pepTxTask(%d): outputting %2.2X\n",link,0x00);
pBBLink[link]->l.PepLink.bbRegs->data = 0x00;
}
else if (txCCount == (txTCount -1)) { /* last byte of package */
#if 0
} else if (txCCount == (txTCount -1)) { /* last byte of package */
pBBLink[link]->l.PepLink.bbRegs->stat_ctl = *txMsg;
if (bbDebug>30)
printf("pepTxTask(%d): outputting last byte %2.2X\n",
link,*txMsg);
#endif
} else { /* regular ol' message byte */
pBBLink[link]->l.PepLink.bbRegs->data = *txMsg;
if (bbDebug>30)
@@ -2504,7 +2521,8 @@ STATIC int pepTxTask(int link)
#ifdef BB_SUPER_DEBUG
BBSetHistEvent(link, pnode, XACT_HIST_STATE_TX_RESET);
#endif
printf("pepTxTask(%d): RAC_RESET_SLAVE sent\n", link);
if (bbDebug)
printf("pepTxTask(%d): RAC_RESET_SLAVE sent\n", link);
pnode->status = BB_OK;
@@ -2526,6 +2544,11 @@ STATIC int pepTxTask(int link)
{
/* Lock the busy list */
semTake(pBBLink[link]->busyList.sem, WAIT_FOREVER);
pBBLink[link]->l.PepLink.bbRegs->stat_ctl = *txMsg;
if (bbDebug>30)
printf("pepTxTask(%d): outputting last byte %2.2X\n",
link,*txMsg);
/* set the retire time */
pnode->retire = tickGet();

View File

@@ -120,6 +120,9 @@
* BUGS:
* The driver should inspect the VXI make and model codes and use a data type
* for the DMA buffer that is appropriate.
*
* $Log$
*
*/
static char *SccsId = "$Id$";
@@ -884,14 +887,13 @@ int sramld(int card)
if (dvxDebug)
printf("Total channels read in %d\n", dvx[card].numChan);
#if 0 /* Force the user to reference board 7 on their own */
/* Make the extender system reset by referencing board 7 (No sample taken) */
*ramptr++ = GAIN_CHANNEL | ((0xF0 >> 3) & 3);
*ramptr++ = (((0xF0 & 7) << 3) | ((0xF0 & 0xE0) >> 5));
#endif
#if 1 /* This causes an extra sample to be taken at the end of the scan */
*ramptr++ = 0; /* mark the end of the sequence program */
*ramptr++ = 0;
#else /* This was supposed to get rid of the extra one, but does not work */
*(ramptr-1) &= 0xff3f;
*ramptr = *(ramptr-1);
#endif
/* set scan rate and run it once */
dvx[card].pdvx2502->samp_rate = DVX_DRATE;

View File

@@ -1,7 +1,17 @@
/* drvGpib.c */
/* share/src/drv/drvGpib.c %W% %G% */
/* Author: John Winans
/******************************************************************************
*
* TODO:
* - Autodetect the need to use a bounce buffer (saves time on boards that have
* "malloc"-able A24 space.
*
* - Launch campaign against the use of National Instruments hardware.
*
******************************************************************************
*
* Author: John Winans
* Date: 09-10-91
* GPIB driver for the NI-1014 and NI-1014D VME cards.
*
@@ -52,6 +62,21 @@
*
*
* $Log$
* Revision 1.27 1994/12/14 22:29:14 winans
* Removed DMAC command chaining structure(s) from the ibLink
* structure so they can be malloc'd seperately. This keeps
* the usage of A24 space restricted to ONLY those structures
* that have to be there.
*
* Revision 1.26 1994/12/12 16:03:00 winans
* Rewrote the init code so that it always returns a zero (don't kill the
* startup.cmd file.) It is possible that this could cause some confusion
* to the database, should it decide to then use a link that did not init
* properly.
*
* Revision 1.25 1994/10/28 19:55:30 winans
* Added VME bus violation prevention code/bug fix from LANL.
*
* Revision 1.24 1994/10/04 18:42:46 winans
* Added an extensive debugging facility.
*
@@ -132,11 +157,11 @@ STATIC char *ram_base; /* Base of the ram on the CPU board */
STATIC int timeoutSquelch = 0; /* Used to quiet timeout msgs during polling */
/* DMA timing bus error problem debugging in niPhysIo */
int ibDmaDebug = 0; /* Turns on DMA debug messages from this driver */
int ibDmaTimingError = 0; /* count "bad memProbes"/call of niPhysIo */
int ibDmaTimingErrorTotal = 0; /* count total "bad memProbes" in niPhysIo */
int ibDmaMaxError = 0 ; /* max # bad calls per call of niPhysIo */
STATIC char testWrite; /* test char to write to 1014 card */
int ibDmaDebug = 0; /* Turns on DMA debug messages from this driver */
int ibDmaTimingError = 0; /* count "bad memProbes"/call of niPhysIo */
int ibDmaTimingErrorTotal = 0; /* count total "bad memProbes" in niPhysIo */
int ibDmaMaxError = 0; /* max # bad calls per call of niPhysIo */
STATIC char testWrite; /* test char to write to 1014 card */
/******************************************************************************
@@ -183,6 +208,11 @@ struct cc_ary
short cc_TWO;
};
typedef struct DmaStuffStruct
{
struct cc_ary cc_array;
char cc_byte;
}DmaStuffStruct;
/******************************************************************************
*
* This structure is used to hold the hardware-specific information for a
@@ -197,8 +227,7 @@ struct niLink {
WDOG_ID watchDogId; /* watchdog for timeouts */
struct ibregs *ibregs;/* pointer to board registers */
char cc_byte;
struct cc_ary cc_array;
DmaStuffStruct *DmaStuff;
char r_isr1;
char r_isr2;
@@ -218,7 +247,7 @@ STATIC int pollInhibit[NIGPIB_NUM_LINKS][IBAPERLINK];
/******************************************************************************
*
* This structure is used to hold the hardware-specific information for a
* single Bit Bus GPIB link. They are dynamically allocated (and an ibLinkTask
* single BitBus GPIB link. They are dynamically allocated (and an ibLinkTask
* started for it) when an IOCTL command requests it.
*
* The IOCTL requests to initiate a BBGPIB_IO link comes from the device support
@@ -372,9 +401,9 @@ initGpib(void)
if (ibDebug)
logMsg("GPIB card found at address 0x%08.8X\n", pibregs);
if ((pNiLink[i] = (struct niLink *) devLibA24Malloc(sizeof(struct niLink))) == NULL)
if ((pNiLink[i] = (struct niLink *)malloc(sizeof(struct niLink))) == NULL)
{ /* This better never happen! */
logMsg("initGpib(): Can't malloc memory for NI-link data structures!");
logMsg("initGpib(): Can't malloc memory for NI-link data structures!\n");
return(ERROR);
}
@@ -402,10 +431,15 @@ initGpib(void)
pNiLink[i]->cmdSpins = 0;
pNiLink[i]->maxSpins = 0;
pNiLink[i]->cc_array.cc_ccb = 0; /* DMAC array chained structure */
pNiLink[i]->cc_array.cc_ONE = 1;
pNiLink[i]->cc_array.cc_n_1addr = 0;
pNiLink[i]->cc_array.cc_TWO = 2;
if ((pNiLink[i]->DmaStuff = (DmaStuffStruct *)devLibA24Malloc(sizeof(DmaStuffStruct))) == NULL)
{ /* This better never happen! */
logMsg("initGpib(): Can't malloc A24 memory for DMAC control structures!\n");
return(ERROR);
}
pNiLink[i]->DmaStuff->cc_array.cc_ccb = 0; /* DMAC chaining structure */
pNiLink[i]->DmaStuff->cc_array.cc_ONE = 1;
pNiLink[i]->DmaStuff->cc_array.cc_n_1addr = 0;
pNiLink[i]->DmaStuff->cc_array.cc_TWO = 2;
pNiLink[i]->first_read = 1; /* used in physIo() */
}
@@ -970,9 +1004,9 @@ int time; /* time to wait on the DMA operation */
b->auxmr = AUXRA | HR_HLDE; /* hold off on end */
if (cnt != 1)
pNiLink[link]->cc_byte = AUXRA | HR_HLDA; /* (cc) holdoff on all */
pNiLink[link]->DmaStuff->cc_byte = AUXRA | HR_HLDA; /* (cc) holdoff on all */
else
pNiLink[link]->cc_byte = b->auxmr = AUXRA | HR_HLDA; /* last byte, do now */
pNiLink[link]->DmaStuff->cc_byte = b->auxmr = AUXRA | HR_HLDA; /* last byte, do now */
b->ch0.ocr = D_DTM | D_XRQ;
/* make sure I only alter the 1014D port-specific fields here! */
b->cfg1 = D_ECC | D_IN | (NIGPIB_IRQ_LEVEL << 5) | D_BRG3 | D_DBM;
@@ -989,7 +1023,7 @@ int time; /* time to wait on the DMA operation */
memcpy(pNiLink[link]->A24BounceBuffer, buffer, length);
if (cnt != 1)
pNiLink[link]->cc_byte = AUX_SEOI; /* send EOI with last byte */
pNiLink[link]->DmaStuff->cc_byte = AUX_SEOI; /* send EOI with last byte */
else
b->auxmr = AUX_SEOI; /* last byte, do it now */
@@ -1006,28 +1040,28 @@ int time; /* time to wait on the DMA operation */
/* setup channel 1 (carry cycle) */
if(ibDebug > 5)
logMsg("PhysIO: readying to xlate cc pointers at %8.8X and %8.8X\n", &(pNiLink[link]->cc_byte), &pNiLink[link]->A24BounceBuffer[cnt - 1]);
logMsg("PhysIO: readying to xlate cc pointers at %8.8X and %8.8X\n", &(pNiLink[link]->DmaStuff->cc_byte), &pNiLink[link]->A24BounceBuffer[cnt - 1]);
#ifdef USE_OLD_XLATION
pNiLink[link]->cc_array.cc_ccb = &(pNiLink[link]->cc_byte) + (long) ram_base;
pNiLink[link]->cc_array.cc_n_1addr = &(pNiLink[link]->A24BounceBuffer[cnt - 1]) + (long)ram_base;
pNiLink[link]->DmaStuff->cc_array.cc_ccb = &(pNiLink[link]->DmaStuff->cc_byte) + (long) ram_base;
pNiLink[link]->DmaStuff->cc_array.cc_n_1addr = &(pNiLink[link]->A24BounceBuffer[cnt - 1]) + (long)ram_base;
#else
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->cc_byte), &(pNiLink[link]->cc_array.cc_ccb)) == ERROR)
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->DmaStuff->cc_byte), &(pNiLink[link]->DmaStuff->cc_array.cc_ccb)) == ERROR)
return(ERROR);
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->A24BounceBuffer[cnt - 1]), &(pNiLink[link]->cc_array.cc_n_1addr)) == ERROR)
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->A24BounceBuffer[cnt - 1]), &(pNiLink[link]->DmaStuff->cc_array.cc_n_1addr)) == ERROR)
return(ERROR);
#endif
if(ibDebug > 5)
logMsg("PhysIO: &cc_byte=%8.8X, &pNiLink[link]->A24BounceBuffer[cnt-1]=%8.8X, ", pNiLink[link]->cc_array.cc_ccb, pNiLink[link]->cc_array.cc_n_1addr);
logMsg("PhysIO: &cc_byte=%8.8X, &pNiLink[link]->A24BounceBuffer[cnt-1]=%8.8X, ", pNiLink[link]->DmaStuff->cc_array.cc_ccb, pNiLink[link]->DmaStuff->cc_array.cc_n_1addr);
cnt--;
#ifdef USE_OLD_XLATION
temp_addr = (long) (&(pNiLink[link]->cc_array)) + (long)ram_base;
temp_addr = (long) (&(pNiLink[link]->DmaStuff->cc_array)) + (long)ram_base;
#else
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->cc_array), &temp_addr) == ERROR)
if (sysLocalToBusAdrs(VME_AM_STD_SUP_DATA, &(pNiLink[link]->DmaStuff->cc_array), &temp_addr) == ERROR)
return(ERROR);
#endif
if(ibDebug > 5)
@@ -1061,6 +1095,7 @@ int time; /* time to wait on the DMA operation */
else
b->ch1.ccr = D_EINT;
#ifdef INCLUDE_LANL_DMA_TIMING_CHECKER
/*************************************************************************
* DMAC BUS ERROR CATCH
* The following lines are included because of a possible VME protocol
@@ -1079,12 +1114,14 @@ int time; /* time to wait on the DMA operation */
if (ibDmaTimingError > ibDmaMaxError)
ibDmaMaxError = ibDmaTimingError;
if (ibDmaDebug)
printf("DMA timing: error = %d, total = %d, max = %d\n",
logMsg("DMA timing: error = %d, total = %d, max = %d\n",
ibDmaTimingError, ibDmaTimingErrorTotal, ibDmaMaxError);
/***************************************************************************/
#endif
b->ch0.ccr = D_SRT;
#ifdef INCLUDE_LANL_DMA_TIMING_CHECKER
/****************************
* DMAC BUS ERROR CATCH
*****************************/
@@ -1095,9 +1132,10 @@ int time; /* time to wait on the DMA operation */
if (ibDmaTimingError > ibDmaMaxError)
ibDmaMaxError = ibDmaTimingError;
if (ibDmaDebug)
printf("DMA timing: error = %d, total = %d, max = %d\n",
logMsg("DMA timing: error = %d, total = %d, max = %d\n",
ibDmaTimingError, ibDmaTimingErrorTotal, ibDmaMaxError);
/***************************************************************************/
#endif
b->imr2 = w_imr2; /* this must be done last */
@@ -2524,13 +2562,13 @@ IBHistDump(int type, int link, int bug)
{
if (pibLink->linkType == GPIB_IO)
{
printf("%d GPIB-L%d-D%d: %s\n", pibLink->History.Hist[i].Time,
logMsg("%d GPIB-L%d-D%d: %s\n", pibLink->History.Hist[i].Time,
pibLink->linkId, pibLink->History.Hist[i].DevAddr,
pibLink->History.Hist[i].Msg);
}
else if (pibLink->linkType == BBGPIB_IO)
{
printf("%d BBIB-l%d-B%d-D%d: %s\n", pibLink->History.Hist[i].Time,
logMsg("%d BBIB-l%d-B%d-D%d: %s\n", pibLink->History.Hist[i].Time,
pibLink->linkId, pibLink->bug, pibLink->History.Hist[i].DevAddr,
pibLink->History.Hist[i].Msg);
}
@@ -2544,3 +2582,12 @@ IBHistDump(int type, int link, int bug)
return(0);
}
#endif
#if 0
/* A way to stop the CPU when idle... run from shell at prio 250 */
cpuStopperThingy()
{
while (1)
asm(" stop #0x3000");
}
#endif

View File

@@ -338,8 +338,8 @@ register unsigned int val;
/* use structure to handle high and low short swap */
/* get current output */
work = (dio[card].dptr->port4_5 << 16)
+ dio[card].dptr->port6_7;
work = (dio[card].dptr->port6_7 << 16)
+ dio[card].dptr->port4_5;
work = (work & ~mask) | (val & mask);

View File

@@ -237,8 +237,5 @@ NIGPIB_SHORT_OFF = 0x5000;
NIGPIB_IVEC_BASE = 100;
NIGPIB_IRQ_LEVEL = 5;
MVME162_EXT_OFF = 0x40000000;
MVME162_IVEC_BASE = 104;
MVME162_IRQ_LEVEL = 5;
return(0);
}

10
src/drv/old/Makefile Normal file
View File

@@ -0,0 +1,10 @@
#
# $Id$
#
EPICS=../../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS

78
src/drv/old/Makefile.Vx Normal file
View File

@@ -0,0 +1,78 @@
#
# $Id$
#
EPICS = ../../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -fshared-data -fvolatile -mnobitfield -traditional
SRCS.c += ../module_types.c
SRCS.c += ../drvAt5Vxi.c
SRCS.c += ../drvBB232.c
SRCS.c += ../drvBb902.c
SRCS.c += ../drvBb910.c
SRCS.c += ../drvBitBus.c
# SRCS.c += ../drvCaenV265.c
SRCS.c += ../drvComet.c
SRCS.c += ../drvCompuSm.c
SRCS.c += ../drvDvx.c
SRCS.c += ../drvEpvxi.c
SRCS.c += ../drvEpvxiMsg.c
SRCS.c += ../drvFp.c
SRCS.c += ../drvFpm.c
SRCS.c += ../drvGpib.c
SRCS.c += ../drvHp1404a.c
SRCS.c += ../drvHpe1368a.c
SRCS.c += ../drvHpe1445a.c
SRCS.c += ../drvJgvtr1.c
SRCS.c += ../drvKscV215.c
SRCS.c += ../drvMsg.c
SRCS.c += ../drvMz8310.c
SRCS.c += ../drvOms.c
SRCS.c += ../drvStc.c
SRCS.c += ../drvTime.c
# SRCS.c += ../drvTranServ.c
SRCS.c += ../drvVmi4100.c
SRCS.c += ../drvXy010.c
SRCS.c += ../drvXy210.c
SRCS.c += ../drvXy220.c
SRCS.c += ../drvXy240.c
SRCS.c += ../drvXy566.c
TARGETS += module_types.o
TARGETS += drvAt5Vxi.o
TARGETS += drvBB232.o
TARGETS += drvBb902.o
TARGETS += drvBb910.o
TARGETS += drvBitBus.o
# TARGETS += drvCaenV265.o
TARGETS += drvComet.o
TARGETS += drvCompuSm.o
TARGETS += drvDvx.o
TARGETS += drvEpvxi.o
TARGETS += drvEpvxiMsg.o
TARGETS += drvFp.o
TARGETS += drvFpm.o
TARGETS += drvGpib.o
TARGETS += drvHp1404a.o
TARGETS += drvHpe1368a.o
TARGETS += drvHpe1445a.o
TARGETS += drvJgvtr1.o
TARGETS += drvKscV215.o
TARGETS += drvMsg.o
TARGETS += drvMz8310.o
TARGETS += drvOms.o
TARGETS += drvStc.o
TARGETS += drvTime.o
# TARGETS += drvTranServ.o
TARGETS += drvVmi4100.o
TARGETS += drvXy010.o
TARGETS += drvXy210.o
TARGETS += drvXy220.o
TARGETS += drvXy240.o
TARGETS += drvXy566.o
include $(EPICS)/config/RULES.Vx

View File

@@ -0,0 +1,30 @@
The CPU030 may need to have the nivxi path set correctly:
From the vxWorks shell type "vxitedit"
take option 2
take option 3
type list
type modify 0
type in the correct path when promped
(the path should end in nivxi
and should traverse the niCpu030
directories shipped with the 030
ie somethin of the form "???/config/niCPU030/nivxi"
type save
type exit
.
.
.
You may may need to setup front panel to backplane trigger
routing:
To take a TTL input and map it to VXI backplane ECL trigger 0
type in (to the vxWorks shell):
epvxiRouteTriggerECL(<logical address>, 1, 0)
where <logical address> specifies the card with the
front panel trigger connection.

2505
src/drv/old/drvAbOLD.c Normal file

File diff suppressed because it is too large Load Diff

348
src/drv/old/drvAbOLD.h Normal file
View File

@@ -0,0 +1,348 @@
/* drvAb.h */
/* base/src/drv $Id$ */
/* header file for the Allen-Bradley Remote Serial IO
*
* Author: Bob Dalesio
* Date: 6-21-88
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 02-01-89 lrd added IFE module support
* changed max chan from 8 to 16
* .02 04-24-89 lrd moved AB_* to module_types.h
* added bit to config table for attempting
* initialization
* .03 01-30-90 lrd add plc/adapter distinction
* .04 03-03-92 mrk added defs for Type E,T,R,S Tcs
*
*/
/* NOTES:
* 1. We are using double slot addressing which dictates that there is an
* output slot for each input slot.
* Slots 1,3,5,7,9,11 are input slots
* Slots 2,4,6,8,10,12 are output slots
* The database uses card numbers 0-11 to address slots 1-12
* 2. This code has not been tested for more than one link (6008). More
* extensive modifications are required to implement this
*/
/* osw - operating status word definitions */
#define PROGRAM_MODE 0x01 /* program/reset mode */
#define TEST_MODE 0x02 /* test/reset mode */
#define RUN_MODE 0x04 /* run mode */
#define DEBUG_MODE 0x08 /* we are debugging */
#define UNSOLICITED_BT 0x10 /* detected block xfer we didn't want */
#define BTS_QUEUED 0x20 /* block xfers queued */
#define ADAPTER_FAULT 0x40 /* at least one faulted adapter in scan
list */
#define ADAP_FLT_CHNG 0x80 /* a change has occurred in an adapter's
status...do link status check */
#define OSW_MASK 0xdf /* these are the bits of interest */
/* commands to the 6008 link controller */
#define AUTO_CONF 0x10
#define SCAN_LIST 0x11
#define SET_UP 0x13
#define SET_MODE 0x20
#define LINK_STATUS 0x21
/* block transfer command definitions */
#define AB_READ 0x01
#define AB_WRITE 0x02
/* these are used for the SET_UP command */
#define DEF_RATE 0x01 /* default baud rate 57.6K */
#define FAST_RATE 0x02 /* 115.2 KB */
#define NO_CHANGE 0xff /* no change */
#define AB_IL 0x05 /* interrupt level */
#define DEBUG 0x01 /* debug - turn off watchdog timer */
#define AB_INT_ENABLE 0x00 /* interrupt enabled */
#define AB_SYSFAIL_DISABLE 0x01 /* disable VMEbus SYSFAIL signal */
/* status returned through the dual ported memory */
#define SCANNER_POWERUP 0x90 /* power up status */
#define BT_ACCEPTED 0x2f /* block trans accepted by scanner */
#define BT_TIMEOUT 0x23 /* block transfer timeout */
/* DUAL PORTED MEMORY AREA DEFINITION */
/* mail box definition */
struct dp_mbox {
unsigned short conf_stat; /* confirmation status word */
unsigned short command; /* command word */
unsigned short address; /* module address */
unsigned short bt_tag; /* block transfer tag number */
unsigned short resv[9]; /* 18 bytes reserved */
unsigned char dummy;
unsigned char fl_lock; /* semaphore word byte */
unsigned short data_len; /* length of data sent/returned */
union {
unsigned short wd[64]; /* 64 words of data */
unsigned char bd[128]; /* or 128 bytes of data */
} da;
};
/* entire region with the mailbox */
struct ab_region {
unsigned char oit[128]; /* output image table */
unsigned char iit[128]; /* input image table */
unsigned short osw; /* operating status word */
struct dp_mbox mail; /* dual port mail box */
unsigned short gda[1872-66]; /* unused part gen data area */
unsigned short sys_fail_set1; /* first byte to set for recovering from SYSFAIL */
unsigned short sys_fail_set2; /* second byte to set for recovering from SYSFAIL */
unsigned char vmeid[60]; /* scanner id */
unsigned short sc_intr; /* to interrupt the scanner */
unsigned short sc_pad; /* last word in scanner shared mem */
};
/* Allen-Bradley IO configuration array equates */
#define AB_NOT_INIT 0x0000
#define AB_NO_CARD 0xffff
#define AB_CARD_TYPE 0x001f
#define AB_INTERFACE_TYPE 0x00e0
#define AB_CONVERSION 0x0f00
#define AB_PLC 0x1000
#define AB_SENT_INIT 0x2000
#define AB_UPDATE 0x4000
#define AB_INIT_BIT 0x8000
/* interface types */
#define AB_NOT_ASSIGNED 0x0000
#define AB_BI_INTERFACE 0x0020
#define AB_BO_INTERFACE 0x0040
#define AB_AI_INTERFACE 0x0060
#define AB_AO_INTERFACE 0x0080
#define AB_BT_READ 0x00A0
#define AB_BT_WRITE 0x00C0
/* scale data - 16 bit min and a 16 bit max */
struct ascale {
unsigned short a_min;
unsigned short a_max;
};
/* defines and structures for analog outputs */
/* configuration word 5 for the OFE module */
/* FxxxHHHHLLLLPPPP */
/* F - Data Format */
/* 0x0 specifies BCD */
/* 0x1 specifies Binary */
/* HHHH - Max Scaling Polarity */
/* LLLL - Min Scaling Polarity */
/* PPPP - Value Polarity */
#define OFE_BINARY 0x8000 /* talk binary instead of BCD */
#define OFE_SCALING 0x0000 /* all positive */
struct ab1771ofe_write{
unsigned short data[4]; /* data to write */
unsigned short conf; /* config word */
struct ascale scales[4]; /* min & max scaling */
};
/* defines and structures for analog inputs */
/* confgiuration word 0 for the IL module: */
/* 7766554433221100 */
/* 00 - Signal Range for Channel 0 */
/* 0x0 specifies 1 - 5 Volts DC */
/* 0x1 specifies 0 - 5 Volts DC */
/* 0x2 specifies -5 - +5 Volts DC */
/* 0x3 specifies -10 - +10 Volts DC */
/* 11-77 - Signal Ranges for Channels 1 - 7 */
#define IL_RANGE 0xffff /* volt inp for all channels -10 - 10V */
/* configuration word 1 for the IL module */
/* 00000DD000000000 */
/* DD - Data Format */
/* 0x0 specifiesBinary Coded Decimal */
/* 0x2 specifies 2s compliment binary */
/* 0x3 specifies signed magnitude binary */
#define IL_DATA_FORMAT 0x600 /* signed magnitude binary */
/* configuration word 2 for the IL module */
/* HHHHHHHHLLLLLLLL */
/* HHHHHHHH - Sign Bits for each of the max scaling value */
/* LLLLLLLL - Sign Bits for each of the min scaling value */
#define IL_MAX_SCALING_SIGN 0 /* max scale is always positive */
#define IL_MIN_SCALING_SIGN 0xff /* min scale is always negative */
#define IL_MAX_SCALE itobcd(4095) /* max scale is +4095 */
#define IL_MIN_SCALE itobcd(4095) /* min scale is -4095 */
#define IL_SCALE_SIGN ((IL_MAX_SCALING_SIGN << 8) | IL_MIN_SCALING_SIGN)
#define IL_SCALE ((IL_MAX_SCALE << 8) | IL_MIN_SCALE)
struct ab1771il_config {
unsigned short ranges; /* range for all channels */
unsigned short conf; /* config word */
unsigned short signs; /* scaling bits for sign */
struct ascale scales[8]; /* min & max for 8 channels */
};
struct ab1771il_read {
unsigned short diag; /* diagnostic word */
unsigned short urange; /* low byte - under range channels */
unsigned short orange; /* low byte - over range channels */
unsigned short sign; /* low byte - polarity 1 = negative */
short data[8]; /* 8 data values (can be signed) */
};
/* confgiuration word 0 and 1 for the IFE module: */
/* 7766554433221100 */
/* 1514131211109988 */
/* 00 - Signal Range for Channel 0 */
/* 0x0 specifies 1 - 5 Volts DC */
/* 0x1 specifies 0 - 5 Volts DC */
/* 0x2 specifies -5 - +5 Volts DC */
/* 0x3 specifies -10 - +10 Volts DC */
/* 11-15 - Signal Ranges for Channels 1 - 15 */
#define IFE_RANGE 0xffff /* volt inp for all channels -10 - 10V */
/* configuration word 2 for the IFE module */
/* 00000DDT 00000000 */
/* DD - Data Format */
/* 0x0 specifiesBinary Coded Decimal */
/* 0x2 specifies 2s compliment binary */
/* 0x3 specifies signed magnitude binary */
/* T - Input Type */
/* 0x0 specifies single ended */
/* 0x1 specifies differential */
#define IFE_DATA_FORMAT 0x700 /* signed magnitude binary/ differential */
#define IFE_SE_DATA_FORMAT 0x600 /* signed magnitude binary/ single-ended */
/* configuration word 3 for the IFE module */
/* LLLLLLLLLLLLLLLL */
/* LLLLLLLL - Sign Bits for each of the min scaling value */
#define IFE_MAX_SCALING_SIGN 0 /* max scale is always positive */
#define IFE_MIN_SCALING_SIGN 0xff /* min scale is always negative */
#define IFE_MAX_SCALE itobcd(4095) /* max scale is +4095 */
#define IFE_MIN_SCALE itobcd(4095) /* min scale is -4095 */
#define IFE_SCALE_SIGN ((IFE_MAX_SCALING_SIGN << 8) | IFE_MIN_SCALING_SIGN)
#define IFE_SCALE ((IFE_MAX_SCALE << 8) | IFE_MIN_SCALE)
struct ab1771ife_config {
unsigned short range1; /* range for all channels */
unsigned short range2; /* range for all channels */
unsigned short conf; /* config word */
unsigned short minsigns; /* scaling bits for sign */
unsigned short maxsigns; /* scaling bits for sign */
struct ascale scales[16]; /* min & max for up to 16 channels */
};
struct ab1771ife_read {
unsigned short diag; /* diagnostic word */
unsigned short urange; /* low byte - under range channels */
unsigned short orange; /* low byte - over range channels */
unsigned short sign; /* low byte - polarity 1 = negative */
short data[16]; /* 16 data values (can be signed) */
};
/* defines and structures for thermocouple inputs */
/* configuration word 0 for the IXE module: */
/* SSSSSFFCUxxxxTTT */
/* TTT - Thermocouple Type */
/* xxxx - Not Used */
/* U - Update cold junction 3/sec to calibrate */
/* C - Conversion into degrees F or C */
/* FF - Data Format */
/* SSSSS - Sample Time */
/* xxxxxxxxxxxxxTTT - Thermocouple Types */
#define IXE_MILLI 0x0000 /* Millivolt input */
#define IXE_E 0x0001 /* "E" Thermocouple */
#define IXE_J 0x0002 /* "J" Thermocouple */
#define IXE_K 0x0003 /* "K" Thermocouple */
#define IXE_T 0x0004 /* "T" Thermocouple */
#define IXE_R 0x0005 /* "R" Thermocouple */
#define IXE_S 0x0006 /* "S" Thermocouple */
#define K_DGF 2
#define K_DGC 3
#define J_DGF 4
#define J_DGC 5
#define E_DGF 6
#define E_DGC 7
#define T_DGF 8
#define T_DGC 9
#define R_DGF 10
#define R_DGC 11
#define S_DGF 12
#define S_DGC 13
/* xxxxxxxCxxxxxxxx - Conversion into degrees F or C */
#define IXE_DEGC 0x0000
#define IXE_DEGF 0x0100
/* xxxxxFFxxxxxxxxx - Data Format */
#define IXE_BCD 0x0000 /* data is BCD */
#define IXE_2SCOMP 0x0200 /* twos complement binary data */
#define IXE_SIGNED 0x0400 /* signed magnitude " " */
/* SSSSSxxxxxxxxxxx - Scan Rate */
#define IXE_HALFSEC 0x2800 /* sample time = 0.5 seconds */
#define IXE_1SEC 0x5000 /* sample time = 1.0 seconds */
#define IXE_2SECS 0xa000 /* sample time = 2.0 seconds */
#define IXE_3SECS 0xf000 /* sample time = 3.0 seconds */
/* configuration data transfer to the IXE card */
struct ab1771ixe_config {
unsigned short conv_rate; /* conversion and scan rate data */
unsigned short alarm_enable; /* low byte = channel alarm enable */
unsigned short limit_polarity; /* low & hi alarm polarity bits */
struct ascale alarm_limits[8];/* low & hi alarm values */
unsigned short calibration[8]; /* gain & zero correction values */
};
#define IXE_STATUS 0xff
struct ab1771ixe_read {
unsigned short pol_stat; /* status - polarity word */
unsigned short out_of_range; /* under - over range channels */
unsigned short alarms; /* inputs outside alarm limits */
short data[8]; /* current values */
unsigned short cjcw; /* cold junction cal word */
};
/*Conversion value passed to abb_ai_driver*/
#define IR_degF 0
#define IR_degC 1
#define IR_Ohms 2
/*Register definitions*/
#define IR_UNITS_DEGF 0x40
#define IR_UNITS_OHMS 0x80
#define IR_COPPER 0x100
#define IR_SIGNED 0x400
/* configuration data transfer to the IR card */
struct ab1771ir_config {
unsigned short conv_rate; /* conversion and scan rate data */
unsigned short resistance; /* 10ohm resiatance @25 degC */
unsigned short bias[6]; /* bias */
unsigned short calibration[6]; /* */
};
struct ab1771ir_read {
unsigned short status; /* status and over/under range */
unsigned short pol_over; /* polarity and overflow */
short data[6]; /* current values */
};

1482
src/drv/old/drvAt5Vxi.c Normal file

File diff suppressed because it is too large Load Diff

93
src/drv/old/drvAt5Vxi.h Normal file
View File

@@ -0,0 +1,93 @@
/* base/src/drv $Id$ */
/*
*
* driver for at5 designed VXI modules
*
* Author: Jeff Hill
* Date: 11-89
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
*/
typedef long at5VxiStatus;
at5VxiStatus at5vxi_one_shot(
int preset, /* TRUE or COMPLEMENT logic */
double edge0_delay, /* sec */
double edge1_delay, /* set */
unsigned card, /* 0 through ... */
unsigned channel, /* 0 through channels on a card */
int int_source, /* (FALSE)External/(TRUE)Internal source
*/
void *event_rtn, /* subroutine to run on events */
int event_rtn_param /* parameter to pass to above routine */
);
at5VxiStatus at5vxi_one_shot_read(
int *preset, /* TRUE or COMPLEMENT logic */
double *edge0_delay, /* sec */
double *edge1_delay, /* sec */
unsigned card, /* 0 through ... */
unsigned channel, /* 0 through channels on a card */
int *int_source /* (FALSE)External/(TRUE)Internal src */
);
at5VxiStatus at5vxi_ai_driver(
unsigned card,
unsigned chan,
unsigned short *prval
);
at5VxiStatus at5vxi_ao_driver(
unsigned card,
unsigned chan,
unsigned short *prval,
unsigned short *prbval
);
at5VxiStatus at5vxi_ao_read(
unsigned card,
unsigned chan,
unsigned short *pval
);
at5VxiStatus at5vxi_bi_driver(
unsigned card,
unsigned long mask,
unsigned long *prval
);
at5VxiStatus at5vxi_bo_driver(
unsigned card,
unsigned long val,
unsigned long mask
);
at5VxiStatus at5vxi_getioscanpvt(
unsigned card,
IOSCANPVT *scanpvt
);

598
src/drv/old/drvBB232.c Normal file
View File

@@ -0,0 +1,598 @@
/* base/src/drv $Id$ */
/*
* Author: John Winans
* Date: 05-21-92
* EPICS BITBUS -> R/S-232 driver
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, 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
*
* Modification Log:
* -----------------
* .01 09-30-91 jrw created
*
*/
#define DRVBB232_C
#include <vxWorks.h>
#include <types.h>
#if 0 /* COMMENTED OUT SOME INCLUDES */
#include <iosLib.h>
#include <taskLib.h>
#include <memLib.h>
#include <semLib.h>
#include <wdLib.h>
#include <wdLib.h>
#include <tickLib.h>
#include <vme.h>
#endif /* COMMENTED OUT SOME INCLUDES */
#include <task_params.h>
#include <module_types.h>
#include <drvSup.h>
#include <devSup.h>
#include <dbDefs.h>
#include <dbCommon.h>
#include <dbAccess.h>
#include <link.h>
#include <callback.h>
#include <fast_lock.h>
#include <drvMsg.h>
#include <drvBitBusInterface.h>
#include <drvRs232.h>
#include <drvBB232.h>
int drvBB232Debug = 0;
int softBB232 = 0;
extern struct drvBitBusEt drvBitBus;
/******************************************************************************
*
******************************************************************************/
#define BB232LINK_PRI 50
#define BB232LINK_OPT VX_FP_TASK|VX_STDIO
#define BB232LINK_STACK 5000
/******************************************************************************
*
******************************************************************************/
static long
report()
{
printf("Report for BITBUS -> RS-232 driver\n");
return(OK);
}
/******************************************************************************
*
******************************************************************************/
static long
init(pparms)
msgDrvIniParm *pparms;
{
if (drvBB232Debug)
printf("Init for BITBUS -> RS-232 driver\n");
return(OK);
}
/******************************************************************************
*
* This function is called to allocate any structures needed to hold
* device-specific data that is added to the msgXact structure.
*
* It is also responsible for filling in the msgXact.phwpvt pointer.
*
******************************************************************************/
static long
genXact(p)
msgDrvGenXParm *p;
{
long stat = -1;
char message[100];
drvBB232Link *pdrvBB232Link;
struct dpvtBitBusHead *pdpvtBitBusHead;
if (p->plink->type != BITBUS_IO)
{
p->pmsgXact->prec->pact = TRUE;
sprintf("%s: invalid device type in devSup.ascii (%d)\n", p->pmsgXact->prec->name, p->plink->type);
errMessage(S_db_badField, message);
return(ERROR);
}
if (drvBB232Debug)
printf("BB232 genXact entered for link %d, bug %d, port %d, parm %s\n", p->plink->value.bitbusio.link, p->plink->value.bitbusio.node, p->plink->value.bitbusio.port, p->plink->value.bitbusio.parm);
p->pmsgXact->phwpvt = p->pmsgXact->pparmBlock->pmsgHwpvt;
/* try to find the hwpvt structure for the required link, bug, and port */
while ((p->pmsgXact->phwpvt != NULL) && (stat == -1))
{
pdrvBB232Link = (drvBB232Link *)(p->pmsgXact->phwpvt->pmsgLink->p);
if ((pdrvBB232Link->link == p->plink->value.bitbusio.link)
&& (pdrvBB232Link->node == p->plink->value.bitbusio.node)
&& (pdrvBB232Link->port == p->plink->value.bitbusio.port))
{
if (pdrvBB232Link->pparmBlock != p->pmsgXact->pparmBlock)
{
sprintf(message, "%s: Two different devices on same BB232 port\n", p->pmsgXact->prec->name);
errMessage(S_db_badField, message);
return(ERROR);
}
else
stat = 0; /* Found the correct hwpvt structure */
}
else
p->pmsgXact->phwpvt = p->pmsgXact->phwpvt->next;
}
if (stat != 0)
{ /* Could not find a msgHwpvt for the right link, create a new one */
if ((p->pmsgXact->phwpvt = drvMsg_genHwpvt(p->pmsgXact->pparmBlock, p->plink)) == NULL)
return(ERROR);
}
/* Set again in case hwpvt was just allocated (and to make compiler happy) */
pdrvBB232Link = (drvBB232Link *)(p->pmsgXact->phwpvt->pmsgLink->p);
p->pmsgXact->callback.callback = NULL;
p->pmsgXact->psyncSem = NULL;
/* Create the skeleton bitbus driver message */
pdpvtBitBusHead = (struct dpvtBitBusHead *) malloc(sizeof(struct dpvtBitBusHead));
(struct dpvtBitBusHead *)(p->pmsgXact->p) = pdpvtBitBusHead;
pdpvtBitBusHead->finishProc = NULL;
pdpvtBitBusHead->psyncSem = malloc(sizeof(SEM_ID));
*(pdpvtBitBusHead->psyncSem) = semBCreate(SEM_Q_PRIORITY, SEM_EMPTY);
pdpvtBitBusHead->link = pdrvBB232Link->link;
pdpvtBitBusHead->txMsg.route = BB_STANDARD_TX_ROUTE;
pdpvtBitBusHead->txMsg.node = pdrvBB232Link->node;
pdpvtBitBusHead->txMsg.tasks = BB_232_TASK;
pdpvtBitBusHead->txMsg.cmd = 0xff;
pdpvtBitBusHead->rxMsg.data = (unsigned char *) malloc(BB_MAX_DAT_LEN);
/* in case I read before write */
pdpvtBitBusHead->rxMsg.cmd = 0;
pdpvtBitBusHead->rxMsg.length = BB_MSG_HEADER_SIZE;
pdpvtBitBusHead->status = BB_OK;
pdpvtBitBusHead->rxMaxLen = 0;
pdpvtBitBusHead->ageLimit = 0;
if (sscanf(p->plink->value.bitbusio.parm,"%d", &(p->pmsgXact->parm)) != 1)
{
p->pmsgXact->prec->pact = TRUE;
sprintf("%s: invalid parameter string >%s<\n", p->pmsgXact->prec->name, p->plink->value.bitbusio.parm);
errMessage(S_db_badField, message);
return(ERROR);
}
return(OK);
}
/******************************************************************************
*
* This function is called to allocate any structures needed to hold
* device-specific data that is added to the msgHwpvt structure.
*
* It is also responsible for filling in the msgHwpvt.pmsgLink pointer.
*
******************************************************************************/
static long
genHwpvt(p)
msgDrvGenHParm *p;
{
int stat = ERROR;
if (drvBB232Debug)
printf("BB232 genHwpvt entered\n");
p->pmsgHwpvt->pmsgLink = drvBB232Block.pmsgLink;
while ((p->pmsgHwpvt->pmsgLink != NULL) && (stat == ERROR))
{
if ((((drvBB232Link *)(p->pmsgHwpvt->pmsgLink->p))->link == p->plink->value.bitbusio.link)
&& (((drvBB232Link *)(p->pmsgHwpvt->pmsgLink->p))->node == p->plink->value.bitbusio.node)
&& (((drvBB232Link *)(p->pmsgHwpvt->pmsgLink->p))->port == p->plink->value.bitbusio.port))
stat = OK;
else
p->pmsgHwpvt->pmsgLink = p->pmsgHwpvt->pmsgLink->next;
}
if (stat != OK)
{
if ((p->pmsgHwpvt->pmsgLink = drvMsg_genLink(p->pparmBlock, p->plink)) == NULL)
return(ERROR);
}
return(OK);
}
/******************************************************************************
*
* This function is called to allocate any structures needed to hold
* device-specific data that is added to the msgLink structure.
*
******************************************************************************/
static long
genLink(p)
msgDrvGenLParm *p;
{
char name[20];
char message[100];
drvBB232Link *pdrvBB232Link;
if (drvBB232Debug)
printf("BB232 genLink, link = %d, node = %d\n", p->plink->value.bitbusio.link, p->plink->value.bitbusio.node, p->plink->value.bitbusio.port);
switch (p->op) {
case MSG_GENLINK_CREATE:
/* BUG -- verify that the link and node numbers are within range! */
if (p->plink->value.bitbusio.port & (~DD_232_PORT))
{
sprintf(message, "drvBB232: port number %d out of range\n", p->plink->value.bitbusio.port);
errMessage(S_db_badField, message);
return(ERROR);
}
if ((p->pmsgLink->p = malloc(sizeof(drvBB232Link))) == NULL)
return(ERROR);
pdrvBB232Link = (drvBB232Link *)(p->pmsgLink->p);
pdrvBB232Link->link = p->plink->value.bitbusio.link;
pdrvBB232Link->node = p->plink->value.bitbusio.node;
pdrvBB232Link->port = p->plink->value.bitbusio.port;
pdrvBB232Link->pparmBlock = p->pparmBlock;
return(OK);
case MSG_GENLINK_ABORT:
if (drvBB232Debug)
printf("BB232 genLink: called with abort status\n");
pdrvBB232Link = (drvBB232Link *)(p->pmsgLink->p);
/* BUG - free(p->pmsgLink->p); Don't forget to take it out of the list */
return(OK);
}
return(ERROR);
}
/******************************************************************************
*
* This function is called to allow the device to indicate that a device-related
* event has occurred. If an event had occurred, it would have to place the
* address of a valid transaction structure in pxact. This xact structure
* will then be processed by the message link task as indicated by the
* return code of this function.
*
* MSG_EVENT_NONE = no event has occurred, pxact not filled in.
* MSG_EVENT_WRITE = event occurred, process the writeOp assoc'd w/pxact.
* MSG_EVENT_READ = event occurred, process the readOp assoc'd w/pxact.
*
* Note that MSG_EVENT_READ only makes sense when returned with a transaction
* that has deferred readback specified for its readOp function. Because if
* it is NOT a deferred readback, it will be done immediately after the writeOp.
* Even if that writeOp was due to a MSG_EVENT_WRITE from this function.
*
******************************************************************************/
static long
checkEvent(p)
msgChkEParm *p;
{
return(MSG_EVENT_NONE);
}
/******************************************************************************
*
* This IOCTL function is used to handle non-I/O related operations required
* to operate the RS-232 interface.
*
******************************************************************************/
static long
command(p)
ioctlCommand *p;
{
msgXact *pxact;
struct dpvtBitBusHead *pdpvtBitBusHead;
drvBB232Link *pdrvBB232Link;
switch (p->cmd) {
case IOCTL232_BREAK: /* send a BREAK signal to the serial port. */
/* Build a break message to send */
pxact = (msgXact *) (p->pparm);
pdpvtBitBusHead = (struct dpvtBitBusHead *) pxact->p;
pdrvBB232Link = (drvBB232Link *)(pxact->phwpvt->pmsgLink->p);
pdpvtBitBusHead->status = BB_OK;
pdpvtBitBusHead->rxMaxLen = 0;
pdpvtBitBusHead->txMsg.length = BB_MSG_HEADER_SIZE;
pdpvtBitBusHead->txMsg.cmd = BB_232_BREAK + pdrvBB232Link->port;
pdpvtBitBusHead->rxMsg.cmd = 0;
if (drvBB232Debug > 7)
{
printf("drvBB232.control (tx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->txMsg));
}
(*(drvBitBus.qReq))(pdpvtBitBusHead, BB_Q_LOW);
semTake(*(pdpvtBitBusHead->psyncSem), WAIT_FOREVER);
if ((pdpvtBitBusHead->status == BB_OK) && !(pdpvtBitBusHead->rxMsg.cmd & 1))
return(OK);
else
return(ERROR);
}
if (drvBB232Debug)
printf("drvBB232.control: bad command 0x%02.2X\n", p->cmd);
return(ERROR);
}
/******************************************************************************
*
* This function is used to write a string of characters out to an RS-232
* device.
*
* Note that the BUGs reply to the write messages with the first 13 bytes
* of the machine's response string (if there is one.) This response string
* will be left in the pdpvtBitBusHead->rxMsg buffer when the drvRead()
* function is called later.
*
******************************************************************************/
static long
drvWrite(pxact, pwrParm)
msgXact *pxact;
msgStrParm *pwrParm;
{
int len;
drvBB232Link *pdrvBB232Link = (drvBB232Link *)(pxact->phwpvt->pmsgLink->p);
struct dpvtBitBusHead *pdpvtBitBusHead = (struct dpvtBitBusHead *) pxact->p;
unsigned char loopLen;
/* build a bitbus message and call the bitbus driver */
if (pwrParm->len == -1)
len = strlen(pwrParm->buf);
else
len = pwrParm->len;
pdpvtBitBusHead->txMsg.data = (unsigned char *) pwrParm->buf;
pdpvtBitBusHead->status = BB_OK;
pdpvtBitBusHead->rxMaxLen = BB_MAX_MSG_LENGTH;
pdpvtBitBusHead->txMsg.cmd = BB_232_CMD + pdrvBB232Link->port;
pdpvtBitBusHead->rxMsg.cmd = 0;
while (len && (pdpvtBitBusHead->status == BB_OK) &&
!(pdpvtBitBusHead->rxMsg.cmd & 1))
{
if (len > BB_MAX_DAT_LEN)
loopLen = BB_MAX_DAT_LEN;
else
loopLen = len;
pdpvtBitBusHead->txMsg.length = loopLen + BB_MSG_HEADER_SIZE;
if (softBB232)
{
printf("drvBB232.drvWrite(tx L%d N%d P%d):\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->txMsg));
}
else
{
(*(drvBitBus.qReq))(pdpvtBitBusHead, BB_Q_LOW); /* do it */
semTake(*(pdpvtBitBusHead->psyncSem), WAIT_FOREVER); /* wait for completion */
if (drvBB232Debug > 10)
{
printf("drvBB232.drvWrite (tx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->txMsg));
}
}
pdpvtBitBusHead->txMsg.data += loopLen;
len -= loopLen;
}
if ((pdpvtBitBusHead->status != BB_OK) || (pdpvtBitBusHead->rxMsg.cmd & 1))
{
if (drvBB232Debug)
printf("BB232 write error on link %d, node %d, port %d, driver %02.2X, message %02.2X\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port, pdpvtBitBusHead->status, pdpvtBitBusHead->rxMsg.cmd);
pxact->status = XACT_IOERR;
}
return(pxact->status);
}
/******************************************************************************
*
* This function is used to read a string of characters from an RS-232 device.
*
* It is assumed that pdpvtBitBusHead->rxMsg has already got up to 13
* bytes of the response data already filled in (left there by the prior
* call to drvWrite().) If a call to this function is made when there is
* garbage in the initial pdpvtBitBusHead->rxMsg buffer, set the length field
* to 0 and the status field to BB_OK.
*
******************************************************************************/
static long
drvRead(pxact, prdParm)
msgXact *pxact;
msgStrParm *prdParm;
{
drvBB232Link *pdrvBB232Link = (drvBB232Link *)(pxact->phwpvt->pmsgLink->p);
struct dpvtBitBusHead *pdpvtBitBusHead = (struct dpvtBitBusHead *) pxact->p;
int len = prdParm->len;
int loopLen = 0;
unsigned char *tmp = pdpvtBitBusHead->rxMsg.data;
/* check if data already loaded into pdpvtBitBusHead->rxMsg */
if ((pdpvtBitBusHead->rxMsg.length > BB_MSG_HEADER_SIZE) && (pdpvtBitBusHead->status == BB_OK))
{
loopLen = pdpvtBitBusHead->rxMsg.length - BB_MSG_HEADER_SIZE;
if (prdParm->len < loopLen)
loopLen = prdParm->len;
if (drvBB232Debug > 9)
{
printf("drvBB232.drvRead (rx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->rxMsg));
}
bcopy(pdpvtBitBusHead->rxMsg.data, prdParm->buf, loopLen);
len -= loopLen;
}
pdpvtBitBusHead->txMsg.length = BB_MSG_HEADER_SIZE;
pdpvtBitBusHead->txMsg.cmd = BB_232_CMD + pdrvBB232Link->port;
pdpvtBitBusHead->rxMsg.data = (unsigned char *) (&(prdParm->buf[loopLen]));
if (!(pdpvtBitBusHead->rxMsg.cmd & BB_232_EOI))
{ /* If we did not hit EOI yet, keep reading */
while (len && (pdpvtBitBusHead->status == BB_OK))
{
if (len > BB_MAX_DAT_LEN)
loopLen = BB_MAX_DAT_LEN;
else
loopLen = len;
pdpvtBitBusHead->rxMaxLen = loopLen + BB_MSG_HEADER_SIZE;
if (softBB232)
{
printf("drvBB232.drvRead(tx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->txMsg));
pdpvtBitBusHead->status = BB_232_EOI;
}
else
{
if (drvBB232Debug > 10)
{
printf("drvBB232.drvRead(tx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->txMsg));
}
(*(drvBitBus.qReq))(pdpvtBitBusHead, BB_Q_LOW); /* do it */
semTake(*(pdpvtBitBusHead->psyncSem), WAIT_FOREVER); /* wait for completion */
if (drvBB232Debug > 9)
{
printf("drvBB232.drvRead (rx L%d N%d P%d)\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->rxMsg));
}
}
if (pdpvtBitBusHead->rxMsg.cmd & (~BB_232_EOI))
{ /* Something is wrong... */
if (drvBB232Debug > 6)
{
printf("drvBB232.drvRead (rx L%d N%d P%d) Error response from BUG\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
drvBitBusDumpMsg(&(pdpvtBitBusHead->rxMsg));
}
pxact->status = XACT_IOERR;
break; /* note that we will fall thru to the null-term code */
}
if (pdpvtBitBusHead->rxMsg.cmd & BB_232_EOI)
{
pdpvtBitBusHead->rxMsg.data += pdpvtBitBusHead->rxMsg.length - BB_MSG_HEADER_SIZE;
len -= pdpvtBitBusHead->rxMsg.length - BB_MSG_HEADER_SIZE;
break;
}
pdpvtBitBusHead->rxMsg.data += loopLen;
len -= loopLen;
}
}
/* Null-terminate the input string (if there is room) */
if (len)
*(pdpvtBitBusHead->rxMsg.data) = '\0';
else
pxact->status = XACT_LENGTH;
/* Note that the following error check, takes priority over a length error */
if (pdpvtBitBusHead->status != BB_OK)
{
if (drvBB232Debug)
printf("BB232 read error on link %d, node %d, port %d\n", pdrvBB232Link->link, pdrvBB232Link->node, pdrvBB232Link->port);
pxact->status = XACT_IOERR;
}
/* BUG -- this can print unterminated strings !! */
if (drvBB232Debug > 7)
printf("drvRead: got >%s<\n", prdParm->buf);
pdpvtBitBusHead->rxMsg.length = BB_MSG_HEADER_SIZE; /* in case keep reading */
return(pxact->status);
}
/******************************************************************************
*
* This handles any IOCTL calls made to BB-232 devices.
*
******************************************************************************/
static long
drvIoctl(cmd, pparm)
int cmd;
void *pparm;
{
switch (cmd) {
case MSGIOCTL_REPORT:
return(report());
case MSGIOCTL_INIT:
return(init(pparm));
case MSGIOCTL_INITREC:
if (drvBB232Debug)
printf("drvBB232Block.drvIoctl got a MSGIOCTL_INITREC request!\n");
return(ERROR);
case MSGIOCTL_GENXACT:
return(genXact(pparm));
case MSGIOCTL_GENHWPVT:
return(genHwpvt(pparm));
case MSGIOCTL_GENLINK:
return(genLink(pparm));
case MSGIOCTL_CHECKEVENT:
return(checkEvent(pparm));
case MSGIOCTL_COMMAND:
return(command(pparm));
}
return(ERROR);
}
msgDrvBlock drvBB232Block = {
"BB232", /* taskName */
BB232LINK_PRI, /* taskPri */
BB232LINK_OPT, /* taskOpt */
BB232LINK_STACK, /* taskStack */
NULL, /* pmsgLink (linked list header) */
drvWrite, /* drvWrite */
drvRead, /* drvRead */
drvIoctl /* drvIoctl */
};

Some files were not shown because too many files have changed in this diff Show More