Compare commits

...

189 Commits

Author SHA1 Message Date
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
167 changed files with 6844 additions and 3509 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

@@ -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);

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)) {
@@ -266,7 +265,6 @@ long dbPutNotify(PUTNOTIFY *ppn)
}
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)
@@ -3530,7 +3528,7 @@ long offset;
}
return(0);
}
static long putStringEnum(paddr,pbuffer,nRequest,no_elements,offset)
struct dbAddr *paddr;
char *pbuffer;
@@ -3538,15 +3536,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 +3584,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 +3620,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 +3658,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 +3667,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 +3695,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 +5927,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);
}

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

@@ -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

@@ -4,193 +4,191 @@ include $(EPICS)/config/CONFIG_BASE
USR_INCLUDES = -I../../drv
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 += ../devAllenBradley.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
# 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 += devAllenBradley.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
PROD = devSup
@@ -200,3 +198,7 @@ $(PROD): $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)

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;

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

@@ -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
.

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);
}

View File

@@ -22,12 +22,12 @@ PROD = iocCore vxWorks vxWorks.sym
include $(EPICS)/config/RULES.Vx
vxWorks: $(VX_IMAGE)
cp $< .
chmod 444 $@
@$(RM) $@
@cp -p $< .
vxWorks.sym: $(VX_IMAGE_SYM)
cp $< .
chmod 444 $@
@$(RM) $@
@cp -p $< .
iocCore: $(IOC_CORE_OBJS)
$(LINK.c) $@ $(IOC_CORE_OBJS)

View File

@@ -4,27 +4,48 @@ include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -D_NO_PROTO
SRCS.c = \
../arAccessLib.c ../arCSCheck.c ../arChanIO.c ../bfSubr.c \
../bucketLib.c ../calcPerform.c ../cmdSubr.c ../cvtFast.c \
../cvtNumbers.c ../ellLib.c ../envSubr.c ../errMtst.c ../errSymLib.c \
../ezsSockSubr.c ../fdmgr.c ../freeListLib.c ../genSubr.c \
../genTaskSubr.c ../gpHashLib.c ../helpSubr.c ../memDebugLib.c \
../nextFieldSubr.c ../postfix.c ../sydSubr.c ../sydSubrCA.c \
../sydSubrCF.c ../sydSubrSSF.c ../tsSubr.c errSymTbl.c ../errInc.c \
../realpath.c
SRCS.c += ../bucketLib.c
SRCS.c += ../calcPerform.c
SRCS.c += ../cvtFast.c
SRCS.c += ../ellLib.c
SRCS.c += ../envSubr.c
SRCS.c += ../errInc.c
SRCS.c += ../errMtst.c
SRCS.c += ../errPrintfUNIX.c
SRCS.c += ../errSymLib.c
SRCS.c += errSymTbl.c
SRCS.c += ../fdmgr.c
SRCS.c += ../freeListLib.c
SRCS.c += ../gpHashLib.c
SRCS.c += ../memDebugLib.c
SRCS.c += ../nextFieldSubr.c
SRCS.c += ../postfix.c
SRCS.c += ../realpath.c
SRCS.c += ../tsSubr.c
SRCS.c += ../assertUNIX.c
LIBOBJS = \
tsSubr.o arAccessLib.o arCSCheck.o arChanIO.o bfSubr.o bucketLib.o \
calcPerform.o cmdSubr.o cvtFast.o cvtNumbers.o ellLib.o \
envSubr.o errMtst.o errSymLib.o errSymTbl.o ezsSockSubr.o fdmgr.o \
freeListLib.o genSubr.o genTaskSubr.o gpHashLib.o helpSubr.o \
memDebugLib.o nextFieldSubr.o postfix.o sydSubr.o sydSubrCA.o \
sydSubrCF.o sydSubrSSF.o realpath.o
LIBOBJS += bucketLib.o
LIBOBJS += calcPerform.o
LIBOBJS += cvtFast.o
LIBOBJS += ellLib.o
LIBOBJS += envSubr.o
LIBOBJS += errMtst.o
LIBOBJS += errPrintfUNIX.o
LIBOBJS += errSymLib.o
LIBOBJS += errSymTbl.o
LIBOBJS += fdmgr.o
LIBOBJS += freeListLib.o
LIBOBJS += gpHashLib.o
LIBOBJS += memDebugLib.o
LIBOBJS += nextFieldSubr.o
LIBOBJS += postfix.o
LIBOBJS += realpath.o
LIBOBJS += tsSubr.o
LIBOBJS += assertUNIX.o
LIBNAME = libCom.a
#TARGETS = cvtTest tsTest sydTest
#TARGETS = tsTest
include $(EPICS)/config/RULES.Unix
@@ -38,15 +59,9 @@ errSymTbl.c errInc.o: errInc.c
pre_build:
@test -f errInc.c || ln -s ../errInc.c errInc.c
cvtTest: cvtNumbers.o
$(LINK.c) -o $@ cvtNumbers.o -lCom -lDb -lCom -lm -s
tsTest: tsSubr.o
$(LINK.c) -o $@ tsSubr.o -lCom -lDb -lCom -lm -s
sydTest: sydSubr.o
$(LINK.c) -o $@ sydSubr.o -lCom -lca -lDb -lCom -lm -s
clean::
@$(RM) errInc.c errSymTbl.c

View File

@@ -2,28 +2,44 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
SRCS.c = \
../calcPerform.c ../cmdSubr.c ../cvtBpt.c ../cvtFast.c \
../cvtNumbers.c ../gpHashLib.c ../freeListLib.c ../ellLib.c \
../envSubr.c ../errSymLib.c ../ezsSockSubr.c ../genSubr.c \
../genTaskSubr.c ../helpSubr.c ../nextFieldSubr.c ../postfix.c \
../sydSubr.c ../sydSubrCA.c ../sydSubrCF.c ../sydSubrSSF.c \
../bucketLib.c ../memDebugLib.c ../tsSubr.c ../pal.c \
../paldef.c errSymTbl.c
SRCS.c += ../calcPerform.c
SRCS.c += ../cvtBpt.c
SRCS.c += ../cvtFast.c
SRCS.c += ../gpHashLib.c
SRCS.c += ../freeListLib.c
SRCS.c += ../ellLib.c
SRCS.c += ../envSubr.c
SRCS.c += ../errSymLib.c
SRCS.c += ../nextFieldSubr.c
SRCS.c += ../postfix.c
SRCS.c += ../bucketLib.c
SRCS.c += ../memDebugLib.c
SRCS.c += ../tsSubr.c
SRCS.c += ../pal.c
SRCS.c += ../paldef.c
SRCS.c += errSymTbl.c
SRCS.c += ../errPrintfVX.c
SRCS.c += ../assertVX.c
OBJS += calcPerform.o
OBJS += cvtBpt.o
OBJS += cvtFast.o
OBJS += ellLib.o
OBJS += envSubr.o
OBJS += errSymLib.o
OBJS += errSymTbl.o
OBJS += nextFieldSubr.o
OBJS += postfix.o
OBJS += bucketLib.o
OBJS += tsSubr.o
OBJS += gpHashLib.o
OBJS += freeListLib.o
OBJS += pal.o
OBJS += paldef.o
OBJS += errPrintfVX.o
OBJS += assertVX.o
OBJS = \
calcPerform.o cvtBpt.o cvtFast.o ellLib.o envSubr.o errSymLib.o \
errSymTbl.o genSubr.o genTaskSubr.o nextFieldSubr.o postfix.o \
bucketLib.o tsSubr.o gpHashLib.o freeListLib.o pal.o paldef.o
OBJS1 = \
cmdSubr.o cvtNumbers.o cvtFast.o ezsSockSubr.o helpSubr.o
OBJS2 = \
sydSubr.o sydSubrCA.o sydSubrCF.o sydSubrSSF.o
PROD = libCom libCom1 libCom2
PROD = libCom
include $(EPICS)/config/RULES.Vx
@@ -43,10 +59,3 @@ libCom: $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)
libCom1: $(OBJS1)
$(RM) $@
$(LINK.c) $@ $(OBJS1) $(LDLIBS)
libCom2: $(OBJS2)
$(RM) $@
$(LINK.c) $@ $(OBJS2) $(LDLIBS)

65
src/libCom/assertUNIX.c Normal file
View File

@@ -0,0 +1,65 @@
/* $Id$
* assertUNIX.c
* Author: Jeffrey Hill
* Date: 02-27-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:
* -----------------
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <epicsAssert.h>
#include <epicsPrint.h>
/*
* epicsAssert ()
*/
void epicsAssert (const char *pFile, const unsigned line, const char *pMsg)
{
epicsPrintf (
"\n\n\nA call to \"assert (%s)\" failed in %s line %d.\n", pMsg, pFile, line);
epicsPrintf (
"The file \"core\" will be created in the current working directory.\n");
epicsPrintf (
"Please save this file and the text of this message in order to assist\n");
epicsPrintf (
"in diagnosing this problem.\n");
epicsPrintf (
"Please contact the author of this software or else send the text of\n");
epicsPrintf (
"this message to \"tech_talk@aps.anl.gov\"\n");
abort ();
}

71
src/libCom/assertVX.c Normal file
View File

@@ -0,0 +1,71 @@
/* $Id$
* assertVX.c
* Author: Jeff Hill
* Date: 02-27-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:
* -----------------
***************************************************************************
*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <vxWorks.h>
#include <taskLib.h>
#include <epicsAssert.h>
#include <epicsPrint.h>
/*
* epicsAssert ()
*
* This forces assert failures into the log file and then
* calls taskSuspend() instead of exit() so that we can debug
* the problem.
*/
void epicsAssert (const char *pFile, const unsigned line, const char *pMsg)
{
int taskId = taskIdSelf();
epicsPrintf (
"\n\n\n%s: A call to \"assert (%s)\" failed in %s at %d\n",
taskName (taskId),
pMsg,
pFile,
line);
epicsPrintf (
"Please send a copy of the output from \"tt (0x%x)\" and a copy of this message\n",
taskId);
epicsPrintf (
"to the author or \"tech_talk@aps.anl.gov\"\n");
taskSuspend (taskId);
}

View File

@@ -35,11 +35,12 @@
*/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <epicsAssert.h>
#include <bucketLib.h>
#ifndef NBBY
@@ -196,7 +197,7 @@ LOCAL ITEM **bucketUnsignedCompare (ITEM **ppi, const void *pId)
/*
* bucketPointerCompare()
*/
ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
LOCAL ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
{
void *ptr;
void **pItemId;
@@ -219,7 +220,7 @@ ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
/*
* bucketStringCompare ()
*/
ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
LOCAL ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
{
const char *pStr = pId;
ITEM *pi;
@@ -241,7 +242,7 @@ ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
/*
* bucketUnsignedHash ()
*/
BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
{
const unsigned *pUId = pId;
unsigned src;
@@ -262,11 +263,10 @@ BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
/*
* bucketPointerHash ()
*
*/
BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
{
void * const *ppId = pId;
void * const *ppId = (void * const *) pId;
unsigned long src;
BUCKETID hashid;
@@ -292,7 +292,7 @@ BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
/*
* bucketStringHash ()
*/
BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
{
const char *pStr = pId;
BUCKETID hashid;

View File

@@ -35,11 +35,12 @@
*/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <epicsAssert.h>
#include <bucketLib.h>
#ifndef NBBY
@@ -196,7 +197,7 @@ LOCAL ITEM **bucketUnsignedCompare (ITEM **ppi, const void *pId)
/*
* bucketPointerCompare()
*/
ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
LOCAL ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
{
void *ptr;
void **pItemId;
@@ -219,7 +220,7 @@ ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
/*
* bucketStringCompare ()
*/
ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
LOCAL ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
{
const char *pStr = pId;
ITEM *pi;
@@ -241,7 +242,7 @@ ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
/*
* bucketUnsignedHash ()
*/
BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
{
const unsigned *pUId = pId;
unsigned src;
@@ -262,11 +263,10 @@ BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
/*
* bucketPointerHash ()
*
*/
BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
{
void * const *ppId = pId;
void * const *ppId = (void * const *) pId;
unsigned long src;
BUCKETID hashid;
@@ -292,7 +292,7 @@ BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
/*
* bucketStringHash ()
*/
BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
LOCAL BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
{
const char *pStr = pId;
BUCKETID hashid;

View File

@@ -472,6 +472,10 @@ printf ("*FINISHED*\n");
*pstacktop = floor(*pstacktop);
break;
case NINT:
*pstacktop = (double)(long)((*pstacktop) >= 0 ? (*pstacktop)+0.5 : (*pstacktop)-0.5);
break;
case REL_NOT:
*pstacktop = ((*pstacktop)?0:1);
break;

View File

@@ -115,7 +115,14 @@
#define SEPERATOR 8
#define TRASH 9
#define FLOAT_PT_CONST 10
#define MINUS_OPERATOR 11
#define UNARY_MINUS_I_S_P 7
#define UNARY_MINUS_I_C_P 8
#define UNARY_MINUS_CODE UNARY_NEG
#define BINARY_MINUS_I_S_P 4
#define BINARY_MINUS_I_C_P 4
#define BINARY_MINUS_CODE SUB
/* flags end of element table */
#define END_ELEMENTS -1
@@ -149,9 +156,12 @@ static struct expression_element elements[] = {
/* element i_s_p i_c_p type_element internal_rep */
"ABS", 7, 8, UNARY_OPERATOR, ABS_VAL, /* absolute value */
"NOT", 7, 8, UNARY_OPERATOR, UNARY_NEG, /* unary negate */
"-", 7, 8, MINUS_OPERATOR, UNARY_NEG, /* unary negate (or binary op) */
"SQRT", 7, 8, UNARY_OPERATOR, SQU_RT, /* square root */
"SQR", 7, 8, UNARY_OPERATOR, SQU_RT, /* square root */
"EXP", 7, 8, UNARY_OPERATOR, EXP, /* exponential function */
"LOGE", 7, 8, UNARY_OPERATOR, LOG_E, /* log E */
"LN", 7, 8, UNARY_OPERATOR, LOG_E, /* log E */
"LOG", 7, 8, UNARY_OPERATOR, LOG_10, /* log 10 */
"ACOS", 7, 8, UNARY_OPERATOR, ACOS, /* arc cosine */
"ASIN", 7, 8, UNARY_OPERATOR, ASIN, /* arc sine */
@@ -160,6 +170,7 @@ static struct expression_element elements[] = {
"MIN", 7, 8, UNARY_OPERATOR, MIN, /* minimum of 2 args */
"CEIL", 7, 8, UNARY_OPERATOR, CEIL, /* smallest integer >= */
"FLOOR", 7, 8, UNARY_OPERATOR, FLOOR, /* largest integer <= */
"NINT", 7, 8, UNARY_OPERATOR, NINT, /* nearest integer */
"COSH", 7, 8, UNARY_OPERATOR, COSH, /* hyperbolic cosine */
"COS", 7, 8, UNARY_OPERATOR, COS, /* cosine */
"SINH", 7, 8, UNARY_OPERATOR, SINH, /* hyperbolic sine */
@@ -216,7 +227,9 @@ static struct expression_element elements[] = {
"^", 6, 6, BINARY_OPERATOR,EXPON, /* exponentiation */
"**", 6, 6, BINARY_OPERATOR,EXPON, /* exponentiation */
"+", 4, 4, BINARY_OPERATOR,ADD, /* addition */
#if 0
"-", 4, 4, BINARY_OPERATOR,SUB, /* subtraction */
#endif
"*", 5, 5, BINARY_OPERATOR,MULT, /* multiplication */
"/", 5, 5, BINARY_OPERATOR,DIV, /* division */
"%", 5, 5, BINARY_OPERATOR,MODULO, /* modulo */
@@ -305,6 +318,7 @@ short *perror;
register struct expression_element *pstacktop;
double constant;
register char *pposthold, *pc;
char in_stack_pri, in_coming_pri, code;
/* convert infix expression to upper case */
for (pc=pinfix; *pc; pc++) {
@@ -416,6 +430,38 @@ short *perror;
new_expression = FALSE;
break;
case MINUS_OPERATOR:
if (operand_needed){
/* then assume minus was intended as a unary operator */
in_coming_pri = UNARY_MINUS_I_C_P;
in_stack_pri = UNARY_MINUS_I_S_P;
code = UNARY_MINUS_CODE;
new_expression = FALSE;
}
else {
/* then assume minus was intended as a binary operator */
in_coming_pri = BINARY_MINUS_I_C_P;
in_stack_pri = BINARY_MINUS_I_S_P;
code = BINARY_MINUS_CODE;
operand_needed = TRUE;
}
/* add operators of higher or equal priority to */
/* postfix notation */
while ((pstacktop->in_stack_pri >= in_coming_pri)
&& (pstacktop >= &stack[1])){
*ppostfix++ = pstacktop->code;
pstacktop--;
}
/* add new operator to stack */
pstacktop++;
*pstacktop = *pelement;
pstacktop->in_stack_pri = in_stack_pri;
pstacktop->code = code;
break;
case SEPERATOR:
if (operand_needed){
*perror = 4;

View File

@@ -472,6 +472,10 @@ printf ("*FINISHED*\n");
*pstacktop = floor(*pstacktop);
break;
case NINT:
*pstacktop = (double)(long)((*pstacktop) >= 0 ? (*pstacktop)+0.5 : (*pstacktop)-0.5);
break;
case REL_NOT:
*pstacktop = ((*pstacktop)?0:1);
break;

View File

@@ -48,6 +48,10 @@
* Also they are not used on vxWorks
*/
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <limits.h> /* XPG2/XPG3/POSIX.1/FIPS151-1/ANSI-C */
@@ -100,7 +104,7 @@ int cvtFloatToString(
/* whole numbers */
got_one = 0;
for (iplace = 1000000; iplace >= 1; iplace /= 10){
for (iplace = 10000000; iplace >= 1; iplace /= 10){
if (whole >= iplace){
got_one = 1;
number = whole / iplace;
@@ -178,7 +182,7 @@ int cvtDoubleToString(
/* whole numbers */
got_one = 0;
for (iplace = 1000000; iplace >= 1; iplace /= 10){
for (iplace = 10000000; iplace >= 1; iplace /= 10){
if (whole >= iplace){
got_one = 1;
number = whole / iplace;

View File

@@ -48,6 +48,10 @@
* Also they are not used on vxWorks
*/
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <limits.h> /* XPG2/XPG3/POSIX.1/FIPS151-1/ANSI-C */
@@ -100,7 +104,7 @@ int cvtFloatToString(
/* whole numbers */
got_one = 0;
for (iplace = 1000000; iplace >= 1; iplace /= 10){
for (iplace = 10000000; iplace >= 1; iplace /= 10){
if (whole >= iplace){
got_one = 1;
number = whole / iplace;
@@ -178,7 +182,7 @@ int cvtDoubleToString(
/* whole numbers */
got_one = 0;
for (iplace = 1000000; iplace >= 1; iplace /= 10){
for (iplace = 10000000; iplace >= 1; iplace /= 10){
if (whole >= iplace){
got_one = 1;
number = whole / iplace;

View File

@@ -32,6 +32,12 @@
/* #define DEBUG_DRIVER */
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <stdlib.h>
#include <ellLib.h>
#if !defined(NULL)

View File

@@ -32,6 +32,12 @@
/* #define DEBUG_DRIVER */
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <stdlib.h>
#include <ellLib.h>
#if !defined(NULL)

View File

@@ -28,6 +28,8 @@
* .01 07-20-91 rac initial version
* .02 08-07-91 joh added config get for long and double C types
* .03 08-07-91 joh added config get for struct in_addr type
* .04 01-11-95 joh use getenv()/putenv() to fetch/write env
* vars under vxWorks
*
* make options
* -DvxWorks makes a version for VxWorks
@@ -60,20 +62,26 @@
*
*-***************************************************************************/
#ifdef vxWorks
# include <vxWorks.h>
# include <stdioLib.h>
# include <in.h>
# include <types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WINDOWS
# include <winsock.h>
#else
# include <stdio.h>
# include <stdlib.h>
# include <sys/types.h>
# include <netinet/in.h>
# include <sys/types.h>
# include <netinet/in.h>
#endif
#ifdef vxWorks
#include <inetLib.h>
#include <envLib.h>
#include <errnoLib.h>
#endif
#define ENV_PRIVATE_DATA
#include <envDefs.h>
#include <errMdef.h>
#include <epicsEnvParams.h>
@@ -122,11 +130,8 @@ char *pBuf; /* I pointer to parameter buffer */
char *pEnv; /* pointer to environment string */
long i;
#ifndef vxWorks
pEnv = getenv(pParam->name);
#else
pEnv = NULL;
#endif
if (pEnv == NULL)
pEnv = pParam->dflt;
if (strlen(pEnv) <= 0)
@@ -363,26 +368,64 @@ ENV_PARAM *pParam; /* I pointer to config param structure */
*
*-*/
long
envSetConfigParam(pParam, value)
ENV_PARAM *pParam; /* I pointer to config param structure */
char *value; /* I pointer to value string */
envSetConfigParam (pParam, value)
ENV_PARAM *pParam; /* I pointer to config param structure */
char *value; /* I pointer to value string */
{
#ifndef vxWorks
printf("envSetConfigParam can't be used in UNIX\n");
printf("envSetConfigParam can only be used under vxWorks\n");
return -1L;
#else
if (strlen(value) < 80)
strcpy(pParam->dflt, value);
else {
strncpy(pParam->dflt, value, 79);
pParam->dflt[79] = '\0';
}
long retCode = 0;
int status;
char *pEnv;
/*
* space for two strings, an '=' character,
* and a null termination
*/
pEnv = malloc (strlen (pParam->name) + strlen (value) + 2);
if (!pEnv) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errnoGet()));
return -1L;
}
strcpy (pEnv, pParam->name);
strcat (pEnv, "=");
strcat (pEnv, value);
status = putenv (pEnv);
if (status<0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errnoGet()));
retCode = -1L;
}
/*
* vxWorks copies into a private buffer
* (this does not match UNIX behavior)
*/
free (pEnv);
return retCode;
#endif
return 0;
}
/*parameters meant to be modified in epicsEnvParams.h*/
epicsSetEnvParams()
int epicsSetEnvParams()
{
printf("setting EPICS environment parameters\n");
envSetConfigParam(&EPICS_TS_MIN_WEST, EPICS_TS_MIN_VALUE);
@@ -393,7 +436,8 @@ epicsSetEnvParams()
envSetConfigParam(&EPICS_IOC_LOG_FILE_NAME, EPICS_IOC_LOG_FILE_TXT);
return 0;
}
epicsPrtEnvParams()
int epicsPrtEnvParams()
{
envPrtConfigParam(&EPICS_TS_MIN_WEST);
envPrtConfigParam(&EPICS_CMD_PROTO_PORT);

View File

@@ -28,6 +28,8 @@
* .01 07-20-91 rac initial version
* .02 08-07-91 joh added config get for long and double C types
* .03 08-07-91 joh added config get for struct in_addr type
* .04 01-11-95 joh use getenv()/putenv() to fetch/write env
* vars under vxWorks
*
* make options
* -DvxWorks makes a version for VxWorks
@@ -60,20 +62,26 @@
*
*-***************************************************************************/
#ifdef vxWorks
# include <vxWorks.h>
# include <stdioLib.h>
# include <in.h>
# include <types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WINDOWS
# include <winsock.h>
#else
# include <stdio.h>
# include <stdlib.h>
# include <sys/types.h>
# include <netinet/in.h>
# include <sys/types.h>
# include <netinet/in.h>
#endif
#ifdef vxWorks
#include <inetLib.h>
#include <envLib.h>
#include <errnoLib.h>
#endif
#define ENV_PRIVATE_DATA
#include <envDefs.h>
#include <errMdef.h>
#include <epicsEnvParams.h>
@@ -122,11 +130,8 @@ char *pBuf; /* I pointer to parameter buffer */
char *pEnv; /* pointer to environment string */
long i;
#ifndef vxWorks
pEnv = getenv(pParam->name);
#else
pEnv = NULL;
#endif
if (pEnv == NULL)
pEnv = pParam->dflt;
if (strlen(pEnv) <= 0)
@@ -363,26 +368,64 @@ ENV_PARAM *pParam; /* I pointer to config param structure */
*
*-*/
long
envSetConfigParam(pParam, value)
ENV_PARAM *pParam; /* I pointer to config param structure */
char *value; /* I pointer to value string */
envSetConfigParam (pParam, value)
ENV_PARAM *pParam; /* I pointer to config param structure */
char *value; /* I pointer to value string */
{
#ifndef vxWorks
printf("envSetConfigParam can't be used in UNIX\n");
printf("envSetConfigParam can only be used under vxWorks\n");
return -1L;
#else
if (strlen(value) < 80)
strcpy(pParam->dflt, value);
else {
strncpy(pParam->dflt, value, 79);
pParam->dflt[79] = '\0';
}
long retCode = 0;
int status;
char *pEnv;
/*
* space for two strings, an '=' character,
* and a null termination
*/
pEnv = malloc (strlen (pParam->name) + strlen (value) + 2);
if (!pEnv) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errnoGet()));
return -1L;
}
strcpy (pEnv, pParam->name);
strcat (pEnv, "=");
strcat (pEnv, value);
status = putenv (pEnv);
if (status<0) {
errPrintf(
-1L,
__FILE__,
__LINE__,
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
pParam->name,
value,
strerror (errnoGet()));
retCode = -1L;
}
/*
* vxWorks copies into a private buffer
* (this does not match UNIX behavior)
*/
free (pEnv);
return retCode;
#endif
return 0;
}
/*parameters meant to be modified in epicsEnvParams.h*/
epicsSetEnvParams()
int epicsSetEnvParams()
{
printf("setting EPICS environment parameters\n");
envSetConfigParam(&EPICS_TS_MIN_WEST, EPICS_TS_MIN_VALUE);
@@ -393,7 +436,8 @@ epicsSetEnvParams()
envSetConfigParam(&EPICS_IOC_LOG_FILE_NAME, EPICS_IOC_LOG_FILE_TXT);
return 0;
}
epicsPrtEnvParams()
int epicsPrtEnvParams()
{
envPrtConfigParam(&EPICS_TS_MIN_WEST);
envPrtConfigParam(&EPICS_CMD_PROTO_PORT);

View File

@@ -12,8 +12,6 @@
#include "dbRecType.h"
#include "dbRecords.h"
#include "tsDefs.h"
#include "arAccessLib.h"
#include "sydDefs.h"
#include "drvGpibErr.h"
#include "drvBitBusErr.h"
#include "calink.h"
@@ -23,4 +21,4 @@
#include "errMdef.h"
#ifdef VXLIST
/* epics vxWorks only*/
#endif VXLIST
#endif /* VXLIST */

View File

@@ -0,0 +1,83 @@
/* $Id$
* errPrintfUNIX.c
* Author: Marty Kraimer
* Date: 02-16-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: errPrintfUNIX.c
* -----------------
* .01 02-16-95 mrk Extracted from errSymLib.c
***************************************************************************
* This must ultimately be replaced by a facility that allows remote
* nodes access to the error messages. A message handling communication
* task should be written that allows multiple remote nodes to request
* notification of all error messages.
* For now lets just print messages and last errno via logMsg or printf
***************************************************************************
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <epicsAssert.h>
#include <dbDefs.h>
#include <errMdef.h>
#include <epicsPrint.h>
#include "errSymTbl.h"
/****************************************************************
* ERRMESSAGE - now a macro to call errPrintf
* ERRPRINTF - print an error symbol message
***************************************************************/
void errPrintf(long status, const char *pFileName,
int lineno, const char *pformat, ...)
{
va_list pvar;
va_start(pvar, pformat);
if(pFileName && errVerbose){
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
}
if(status==0) status = errno;
if(status>0) {
int rtnval;
unsigned short modnum,errnum;
char name[256];
rtnval = errSymFind(status,name);
modnum = status >> 16;
errnum = status & 0xffff;
if(rtnval) {
printf( "Error status (module %hu, number %hu) not in symbol table",
modnum, errnum);
} else {
printf("%s ",name);
}
}
vprintf(pformat,pvar);
printf("\n");
}

270
src/libCom/errPrintfVX.c Normal file
View File

@@ -0,0 +1,270 @@
/* $Id$
* errPrintfVX.c
* Author: Marty Kraimer and Jeff Hill
* Date: 6-1-90
*
* 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: errPrintfVX.c
* -----------------
* .01 02-16-95 mrk Extracted from errSymLib.c
***************************************************************************
*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <vxWorks.h>
#include <vxLib.h>
#include <taskLib.h>
#include <errnoLib.h>
#include <intLib.h>
#include <types.h>
#include <symLib.h>
#include <semLib.h>
#include <error.h>
#include <logLib.h>
#include <epicsAssert.h>
#include <ellLib.h>
#include <dbDefs.h>
#include <task_params.h>
#include <errMdef.h>
#include <epicsPrint.h>
#ifndef LOCAL
#define LOCAL static
#endif /* LOCAL */
static int mprintf (const char *pFormat, ...);
static int vmprintf (const char *pFormat, va_list pvar);
extern FILE *iocLogFile;
LOCAL SEM_ID clientWaitForTask;
LOCAL SEM_ID clientWaitForCompletion;
LOCAL SEM_ID serverWaitForWork;
LOCAL void epicsPrintTask(void);
LOCAL void errPrintfPVT(void);
typedef enum{cmdErrPrintf,cmdEpicsPrint} cmdType;
LOCAL struct {
cmdType cmd;
int taskid;
long status;
const char *pFileName;
int lineno;
const char *pformat;
va_list pvar;
int oldtaskid;
int printfStatus;
}pvtData;
LOCAL int errInitFlag=0;
void errInit(void)
{
if(!vxTas(&errInitFlag)) return;
pvtData.oldtaskid = 0;
if((clientWaitForTask=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
if((clientWaitForCompletion=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
if((serverWaitForWork=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
taskSpawn(EPICSPRINT_NAME,EPICSPRINT_PRI,EPICSPRINT_OPT,
EPICSPRINT_STACK,(FUNCPTR)epicsPrintTask,
0,0,0,0,0,0,0,0,0,0);
if ((errSymBld()) != 0) {
logMsg("errSymBld failed to initialize\n",0,0,0,0,0,0);
}
}
LOCAL void epicsPrintTask(void)
{
semGive(clientWaitForTask);
while(TRUE) {
if(semTake(serverWaitForWork,WAIT_FOREVER)!=OK)
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
switch(pvtData.cmd) {
case (cmdErrPrintf) :
errPrintfPVT();
break;
case (cmdEpicsPrint) :
pvtData.printfStatus = vmprintf(pvtData.pformat,pvtData.pvar);
break;
}
semGive(clientWaitForCompletion);
}
}
void errPrintf(long status, const char *pFileName,
int lineno, const char *pformat, ...)
{
va_list pvar;
if(INT_CONTEXT()) {
int logMsgArgs[6];
int i;
va_start (pvar, pformat);
for (i=0; i<NELEMENTS(logMsgArgs); i++) {
logMsgArgs[i] = va_arg(pvar, int);
}
logMsg ((char *)pformat,logMsgArgs[0],logMsgArgs[1],
logMsgArgs[2],logMsgArgs[3],logMsgArgs[4],
logMsgArgs[5]);
va_end (pvar);
return;
}
errInit();
va_start (pvar, pformat);
if(semTake(clientWaitForTask,WAIT_FOREVER)!=OK) {
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
taskSuspend(taskIdSelf());
}
pvtData.cmd = cmdErrPrintf;
pvtData.taskid = taskIdSelf();
pvtData.status = status;
pvtData.pFileName = pFileName;
pvtData.lineno = lineno;
pvtData.pformat = pformat;
pvtData.pvar = pvar;
semGive(serverWaitForWork);
if(semTake(clientWaitForCompletion,WAIT_FOREVER)!=OK) {
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
taskSuspend(taskIdSelf());
}
semGive(clientWaitForTask);
}
LOCAL void errPrintfPVT(void)
{
long status = pvtData.status;
const char *pFileName = pvtData.pFileName;
int lineno = pvtData.lineno;
const char *pformat = pvtData.pformat;
va_list pvar = pvtData.pvar;
if(pvtData.taskid != pvtData.oldtaskid) {
mprintf("task: 0X%x %s\n",pvtData.taskid,taskName(pvtData.taskid));
pvtData.oldtaskid = pvtData.taskid;
}
if(pFileName && errVerbose){
mprintf("filename=\"%s\" line number=%d\n", pFileName, lineno);
}
if(status==0) status = MYERRNO;
if(status>0) {
int rtnval;
unsigned short modnum,errnum;
char name[256];
rtnval = errSymFind(status,name);
modnum = status >> 16;
errnum = status & 0xffff;
if(rtnval) {
mprintf("Error status (module %hu, number %hu) not in symbol table\n",
modnum, errnum);
} else {
mprintf("%s ",name);
}
}
vmprintf(pformat,pvar);
mprintf("\n");
return;
}
int epicsPrintf(const char *pformat, ...)
{
va_list pvar;
va_start(pvar, pformat);
return epicsVprintf(pformat,pvar);
}
int epicsVprintf(const char *pformat, va_list pvar)
{
int status;
if(INT_CONTEXT()) {
int logMsgArgs[6];
int i;
for (i=0; i<NELEMENTS(logMsgArgs); i++) {
logMsgArgs[i] = va_arg(pvar, int);
}
status = logMsg ((char *)pformat,logMsgArgs[0],logMsgArgs[1],
logMsgArgs[2],logMsgArgs[3],logMsgArgs[4],
logMsgArgs[5]);
va_end (pvar);
return status;
}
errInit();
if(semTake(clientWaitForTask,WAIT_FOREVER)!=OK) {
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
taskSuspend(taskIdSelf());
}
pvtData.cmd = cmdEpicsPrint;
pvtData.pformat = pformat;
pvtData.pvar = pvar;
semGive(serverWaitForWork);
if(semTake(clientWaitForCompletion,WAIT_FOREVER)!=OK) {
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
taskSuspend(taskIdSelf());
}
status = pvtData.printfStatus;
semGive(clientWaitForTask);
return status;
}
LOCAL int mprintf (const char *pFormat, ...)
{
va_list pvar;
va_start (pvar, pFormat);
return vmprintf (pFormat, pvar);
}
LOCAL int vmprintf (const char *pFormat, va_list pvar)
{
int s0;
int s1;
s0 = vfprintf(stdout,pFormat,pvar);
fflush(stdout);
s1 = vfprintf(iocLogFile,pFormat,pvar);
fflush(iocLogFile);
va_end(pvar);
if (s1<0) {
return s1;
}
return s0;
}

View File

@@ -61,27 +61,31 @@
* .01 09-04-93 rcz Merged errMessage.c, errPrint.c, errSymFind.c
* rcz into one file (errSymLib.c) and changed method
* rcz of errSymTable lookup.
* .02 01-13-95 joh call mprintf() instead of logMsg()
* and eliminated errToLogMsg variable
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ellLib.h>
#include <dbDefs.h>
#include <errMdef.h>
#include "errSymTbl.h"
#include <stdio.h>
#ifdef vxWorks
#include <vxWorks.h>
#include <taskLib.h>
#include <logLib.h>
#include <types.h>
#include <symLib.h>
#include <errnoLib.h>
extern SYMTAB_ID statSymTbl;
#else
#include <string.h>
extern int errno;
extern int sys_nerr;
extern int sys_nerr;
extern char *sys_errlist[];
#endif
@@ -108,15 +112,10 @@ static int initialized = FALSE;
extern ERRSYMTAB_ID errSymTbl;
#ifdef vxWorks
int errToLogMsg = TRUE;
#endif
/*Declare storage for errVerbose( defined in errMdef.h)*/
int errVerbose=0;
/****************************************************************
* ERRSYMBLD
@@ -192,215 +191,6 @@ unsigned short errnum;
return((unsigned short)(((modnum - 500) * 20) + errnum) % NHASH);
}
/****************************************************************
* ERRMESSAGE - now a macro to call errPrintf
* ERRPRINTF - print an error symbol message
***************************************************************/
#ifdef __STDC__
void errPrintf(long status, char *pFileName, int lineno, char *pformat, ...)
#else
void errPrintf(va_alist)
va_dcl
#endif
{
va_list pvar;
static char *pReformat;
static int reformatSize;
static char pAdd[] = {'\n', '\0'};
#ifndef __STDC__
long status;
char *pformat;
char *pFileName;
int lineno;
#endif
#ifdef vxWorks
int id;
static int saveid = -1;
char *pname;
#endif
#ifdef __STDC__
va_start(pvar, pformat);
#else
va_start(pvar);
status = va_arg(pvar, long);
pFileName = va_arg(pvar, char *);
lineno = va_arg(pvar, int);
pformat = va_arg(pvar, char *);
#endif
#ifdef vxWorks
if(!errToLogMsg) {
id = taskIdSelf();
if (saveid != id) {
saveid = id;
pname = taskName(id);
printf("taskid=%x taskname=%s ", id, pname);
}
}
#endif
if(pFileName && errVerbose){
#ifdef vxWorks
if(errToLogMsg) {
logMsg("filename=\"%s\" line number=%d\n", pFileName, lineno,
NULL, NULL, NULL, NULL);
}
else{
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
}
#else
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
#endif
}
if (pformat != NULL) {
int size;
size = strlen(pformat)+NELEMENTS(pAdd);
if(reformatSize < size){
/*
* use a reasonable size string
*/
size = max(0xff, size);
if(pReformat){
free(pReformat);
}
pReformat = (char *) malloc(size);
if(pReformat){
reformatSize = size;
}
else{
#ifdef vxWorks
logMsg("%s: calloc error\n", __FILE__,
NULL, NULL, NULL, NULL, NULL);
#else
printf("%s: calloc error\n", __FILE__);
#endif
return;
}
}
strcpy(pReformat, pformat);
strcat(pReformat, pAdd);
}
verrPrintStatus(status, pReformat, pvar);
return;
}
/****************************************************************
* ERRPRINTSTATUS
***************************************************************/
#ifdef __STDC__
int errPrintStatus(long status, char *pFormat, ...)
#else
int errPrintStatus(va_alist)
va_dcl
#endif
{
va_list pvar;
#ifndef __STDC__
long status;
char *pFormat;
#endif
#ifdef __STDC__
va_start(pvar, pFormat);
#else
va_start(pvar);
status = va_arg(pvar, long);
pFormat = va_arg(pvar, char *);
#endif
return verrPrintStatus(status, pFormat, pvar);
}
/****************************************************************
* VERRPRINTSTATUS
***************************************************************/
#ifdef __STDC__
int verrPrintStatus(long status, char *pFormatString, va_list pvar)
#else
int verrPrintStatus(status, pFormatString, pvar)
long status;
char *pFormatString;
va_list pvar;
#endif
{
static char ctxToLarge[] = "** Context String Overflow **";
char name[256];
int rtnval;
int namelen;
int formatlen;
unsigned short modnum;
unsigned short errnum;
name[0] = '\0';
if(status==0) status = MYERRNO;
if(status >= -1){
rtnval = 0;
}
else {
rtnval = status;
}
if(status>0) {
rtnval = errSymFind(status,name);
modnum = status >> 16;
errnum = status & 0xffff;
if(rtnval) {
sprintf(name,
"Error status (module %hu, number %hu) not in symbol table",
modnum, errnum);
}
}
if(pFormatString){
namelen = strlen(name);
formatlen = strlen(pFormatString);
strcat(name," ");
if(sizeof(name)-namelen-1 > formatlen){
strcat(name, pFormatString);
}
else if(sizeof(name)-namelen-1 > sizeof(ctxToLarge)){
strcat(name, ctxToLarge);
}
else{
fprintf(stderr,ctxToLarge);
}
}
#ifdef vxWorks
if(errToLogMsg){
int i;
int logMsgArgs[6];
for(i=0; i< NELEMENTS(logMsgArgs); i++){
logMsgArgs[i] = va_arg(pvar, int);
}
logMsg(
name,
logMsgArgs[0],
logMsgArgs[1],
logMsgArgs[2],
logMsgArgs[3],
logMsgArgs[4],
logMsgArgs[5]);
}
else{
vprintf(name, pvar);
}
#else
vprintf(name, pvar);
#endif
return rtnval;
}
/****************************************************************
* ERRSYMBOLADD
* adds symbols to the master errnumlist as compiled from errSymTbl.c
@@ -438,11 +228,11 @@ int UnixSymFind(status, pname, pvalue)
{
if (status >= sys_nerr || status < 1) {
*pvalue = -1;
return;
return(0);
}
strcpy(pname, sys_errlist[status]);
*pvalue = status;
return;
return(0);
}
#endif
@@ -466,7 +256,7 @@ int ModSymFind(status, pname, pvalue)
modNum = (status >> 16);
if (modNum < 501) {
*pvalue = -1;
return;
return(0);
}
hashInd = errhash(status);
phashnode = (ERRNUMNODE**)&hashtable[hashInd];
@@ -475,14 +265,14 @@ int ModSymFind(status, pname, pvalue)
if (pNextNode->errNum == status) {
strcpy(pname, pNextNode->message);
*pvalue = status;
return;
return(0);
}
phashnode = &pNextNode->hashnode;
pNextNode = *phashnode;
}
*pname = 0;
*pvalue = -1;
return ;
return(0);
}
/****************************************************************
@@ -623,3 +413,5 @@ unsigned short endErrNum;
errSymTestPrint(errNum);
}
}

View File

@@ -61,27 +61,31 @@
* .01 09-04-93 rcz Merged errMessage.c, errPrint.c, errSymFind.c
* rcz into one file (errSymLib.c) and changed method
* rcz of errSymTable lookup.
* .02 01-13-95 joh call mprintf() instead of logMsg()
* and eliminated errToLogMsg variable
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ellLib.h>
#include <dbDefs.h>
#include <errMdef.h>
#include "errSymTbl.h"
#include <stdio.h>
#ifdef vxWorks
#include <vxWorks.h>
#include <taskLib.h>
#include <logLib.h>
#include <types.h>
#include <symLib.h>
#include <errnoLib.h>
extern SYMTAB_ID statSymTbl;
#else
#include <string.h>
extern int errno;
extern int sys_nerr;
extern int sys_nerr;
extern char *sys_errlist[];
#endif
@@ -108,15 +112,10 @@ static int initialized = FALSE;
extern ERRSYMTAB_ID errSymTbl;
#ifdef vxWorks
int errToLogMsg = TRUE;
#endif
/*Declare storage for errVerbose( defined in errMdef.h)*/
int errVerbose=0;
/****************************************************************
* ERRSYMBLD
@@ -192,215 +191,6 @@ unsigned short errnum;
return((unsigned short)(((modnum - 500) * 20) + errnum) % NHASH);
}
/****************************************************************
* ERRMESSAGE - now a macro to call errPrintf
* ERRPRINTF - print an error symbol message
***************************************************************/
#ifdef __STDC__
void errPrintf(long status, char *pFileName, int lineno, char *pformat, ...)
#else
void errPrintf(va_alist)
va_dcl
#endif
{
va_list pvar;
static char *pReformat;
static int reformatSize;
static char pAdd[] = {'\n', '\0'};
#ifndef __STDC__
long status;
char *pformat;
char *pFileName;
int lineno;
#endif
#ifdef vxWorks
int id;
static int saveid = -1;
char *pname;
#endif
#ifdef __STDC__
va_start(pvar, pformat);
#else
va_start(pvar);
status = va_arg(pvar, long);
pFileName = va_arg(pvar, char *);
lineno = va_arg(pvar, int);
pformat = va_arg(pvar, char *);
#endif
#ifdef vxWorks
if(!errToLogMsg) {
id = taskIdSelf();
if (saveid != id) {
saveid = id;
pname = taskName(id);
printf("taskid=%x taskname=%s ", id, pname);
}
}
#endif
if(pFileName && errVerbose){
#ifdef vxWorks
if(errToLogMsg) {
logMsg("filename=\"%s\" line number=%d\n", pFileName, lineno,
NULL, NULL, NULL, NULL);
}
else{
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
}
#else
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
#endif
}
if (pformat != NULL) {
int size;
size = strlen(pformat)+NELEMENTS(pAdd);
if(reformatSize < size){
/*
* use a reasonable size string
*/
size = max(0xff, size);
if(pReformat){
free(pReformat);
}
pReformat = (char *) malloc(size);
if(pReformat){
reformatSize = size;
}
else{
#ifdef vxWorks
logMsg("%s: calloc error\n", __FILE__,
NULL, NULL, NULL, NULL, NULL);
#else
printf("%s: calloc error\n", __FILE__);
#endif
return;
}
}
strcpy(pReformat, pformat);
strcat(pReformat, pAdd);
}
verrPrintStatus(status, pReformat, pvar);
return;
}
/****************************************************************
* ERRPRINTSTATUS
***************************************************************/
#ifdef __STDC__
int errPrintStatus(long status, char *pFormat, ...)
#else
int errPrintStatus(va_alist)
va_dcl
#endif
{
va_list pvar;
#ifndef __STDC__
long status;
char *pFormat;
#endif
#ifdef __STDC__
va_start(pvar, pFormat);
#else
va_start(pvar);
status = va_arg(pvar, long);
pFormat = va_arg(pvar, char *);
#endif
return verrPrintStatus(status, pFormat, pvar);
}
/****************************************************************
* VERRPRINTSTATUS
***************************************************************/
#ifdef __STDC__
int verrPrintStatus(long status, char *pFormatString, va_list pvar)
#else
int verrPrintStatus(status, pFormatString, pvar)
long status;
char *pFormatString;
va_list pvar;
#endif
{
static char ctxToLarge[] = "** Context String Overflow **";
char name[256];
int rtnval;
int namelen;
int formatlen;
unsigned short modnum;
unsigned short errnum;
name[0] = '\0';
if(status==0) status = MYERRNO;
if(status >= -1){
rtnval = 0;
}
else {
rtnval = status;
}
if(status>0) {
rtnval = errSymFind(status,name);
modnum = status >> 16;
errnum = status & 0xffff;
if(rtnval) {
sprintf(name,
"Error status (module %hu, number %hu) not in symbol table",
modnum, errnum);
}
}
if(pFormatString){
namelen = strlen(name);
formatlen = strlen(pFormatString);
strcat(name," ");
if(sizeof(name)-namelen-1 > formatlen){
strcat(name, pFormatString);
}
else if(sizeof(name)-namelen-1 > sizeof(ctxToLarge)){
strcat(name, ctxToLarge);
}
else{
fprintf(stderr,ctxToLarge);
}
}
#ifdef vxWorks
if(errToLogMsg){
int i;
int logMsgArgs[6];
for(i=0; i< NELEMENTS(logMsgArgs); i++){
logMsgArgs[i] = va_arg(pvar, int);
}
logMsg(
name,
logMsgArgs[0],
logMsgArgs[1],
logMsgArgs[2],
logMsgArgs[3],
logMsgArgs[4],
logMsgArgs[5]);
}
else{
vprintf(name, pvar);
}
#else
vprintf(name, pvar);
#endif
return rtnval;
}
/****************************************************************
* ERRSYMBOLADD
* adds symbols to the master errnumlist as compiled from errSymTbl.c
@@ -438,11 +228,11 @@ int UnixSymFind(status, pname, pvalue)
{
if (status >= sys_nerr || status < 1) {
*pvalue = -1;
return;
return(0);
}
strcpy(pname, sys_errlist[status]);
*pvalue = status;
return;
return(0);
}
#endif
@@ -466,7 +256,7 @@ int ModSymFind(status, pname, pvalue)
modNum = (status >> 16);
if (modNum < 501) {
*pvalue = -1;
return;
return(0);
}
hashInd = errhash(status);
phashnode = (ERRNUMNODE**)&hashtable[hashInd];
@@ -475,14 +265,14 @@ int ModSymFind(status, pname, pvalue)
if (pNextNode->errNum == status) {
strcpy(pname, pNextNode->message);
*pvalue = status;
return;
return(0);
}
phashnode = &pNextNode->hashnode;
pNextNode = *phashnode;
}
*pname = 0;
*pvalue = -1;
return ;
return(0);
}
/****************************************************************
@@ -623,3 +413,5 @@ unsigned short endErrNum;
errSymTestPrint(errNum);
}
}

View File

@@ -62,6 +62,10 @@
* if we are in fdmgr_pend_event()
* .15 joh 011993 Created fdmgr header file
* .16 joh 011993 Converted to ANSI C
* .17 joh 030895 More ANSI C changes and fixed lost send callback
* problem (send call back discarded when fdmgr pend
* event time out expires even if the send call back
* has not been called at least once).
*
* NOTES:
*
@@ -95,9 +99,10 @@ static char *pSccsId = "@(#) $Id$";
* ANSI
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#ifdef vxWorks
#include <vxWorks.h>
@@ -108,6 +113,7 @@ static char *pSccsId = "@(#) $Id$";
#include <selectLib.h>
#endif
#include <epicsAssert.h>
#include <fdmgr.h>
#ifndef TRUE
@@ -182,9 +188,7 @@ fdctx *pfdctx,
struct timeval *pt
);
LOCAL void select_alarm(
fdctx *pfdctx
);
LOCAL void select_alarm(void *pParam);
LOCAL int fdmgr_select(
fdctx *pfdctx,
@@ -269,7 +273,7 @@ int fdmgr_delete(fdctx *pfdctx)
fdmgrAlarm *fdmgr_add_timeout(
fdctx *pfdctx,
struct timeval *ptimeout,
void (*func)(),
void (*func)(void *),
void *param
)
{
@@ -330,10 +334,10 @@ void *param
}
}
if(pa){
ellInsert(&pfdctx->alarm_list, pa->node.previous, (ELLNODE*)palarm);
ellInsert(&pfdctx->alarm_list, pa->node.previous, &palarm->node);
}
else{
ellAdd(&pfdctx->alarm_list,(ELLNODE*) palarm);
ellAdd(&pfdctx->alarm_list, &palarm->node);
}
palarm->alt = alt_alarm;
UNLOCK(pfdctx);
@@ -360,8 +364,8 @@ fdmgrAlarm *palarm
LOCK(pfdctx);
alt = palarm->alt;
if(alt == alt_alarm){
ellDelete(&pfdctx->alarm_list, (ELLNODE*)palarm);
ellAdd(&pfdctx->free_alarm_list, (ELLNODE*)palarm);
ellDelete(&pfdctx->alarm_list, &palarm->node);
ellAdd(&pfdctx->free_alarm_list, &palarm->node);
palarm->alt = alt_free;
status = OK;
}
@@ -423,7 +427,7 @@ fdmgrAlarm *palarm
int fdmgr_add_fd(
fdctx *pfdctx,
int fd,
void (*pfunc)(),
void (*pfunc)(void *),
void *param
)
{
@@ -449,7 +453,7 @@ int fdmgr_add_callback(
fdctx *pfdctx,
int fd,
enum fdi_type fdi,
void (*pfunc)(),
void (*pfunc)(void *),
void *param
)
{
@@ -495,7 +499,7 @@ void *param
pfdentry->delete_pending = FALSE;
LOCK(pfdctx);
ellAdd(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
ellAdd(&pfdctx->fdentry_list, &pfdentry->node);
UNLOCK(pfdctx);
return OK;
@@ -542,7 +546,7 @@ enum fdi_type fdi
pfdentry = (fdentry *) pfdentry->node.next){
if(pfdentry->fd == fd && pfdentry->fdi == fdi){
ellDelete(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
ellDelete(&pfdctx->fdentry_list, &pfdentry->node);
fdmgr_finish_off_fdentry(pfdctx, pfdentry);
status = OK;
break;
@@ -603,7 +607,7 @@ register fdentry *pfdentry
)
{
FD_CLR(pfdentry->fd, pfdentry->pfds);
ellAdd(&pfdctx->fdentry_free_list, (ELLNODE*)pfdentry);
ellAdd(&pfdctx->fdentry_free_list, &pfdentry->node);
}
@@ -618,9 +622,8 @@ struct timeval *ptimeout
)
{
int status;
extern errno;
struct timeval t;
fdmgrAlarm *palarm;
fdmgrAlarm *palarm;
lockFDMGRPendEvent(pfdctx);
@@ -707,12 +710,21 @@ struct timeval *ptimeout
# ifdef vxWorks
taskSafe();
# endif
# if defined (__hpux)
status = select(
pfdctx->maxfd,
(int *)&pfdctx->readch,
(int *)&pfdctx->writech,
(int *)&pfdctx->excpch,
ptimeout);
# else
status = select(
pfdctx->maxfd,
&pfdctx->readch,
&pfdctx->writech,
&pfdctx->excpch,
ptimeout);
# endif
# ifdef vxWorks
taskUnsafe();
# endif
@@ -730,8 +742,8 @@ struct timeval *ptimeout
ptimeout->tv_usec);
else
fdmgrPrintf(
"fdmgr: error from select %d\n",
errno);
"fdmgr: error from select %s\n",
strerror(errno));
return labor_performed;
}
@@ -742,14 +754,14 @@ struct timeval *ptimeout
LOCK(pfdctx)
pfdentry = (fdentry *) pfdentry->node.next;
if(pfdentry){
ellDelete(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
ellDelete(&pfdctx->fdentry_list, &pfdentry->node);
/*
*
* holding place where it can be marked
* pending delete but not deleted
*
*/
ellAdd(&pfdctx->fdentry_in_use_list, (ELLNODE*)pfdentry);
ellAdd(&pfdctx->fdentry_in_use_list, &pfdentry->node);
}
UNLOCK(pfdctx)
@@ -774,26 +786,29 @@ struct timeval *ptimeout
*/
if(!pfdentry->delete_pending){
(*pfdentry->pfunc)(pfdentry->param);
/*
* writes are one shots
*/
if (pfdentry->fdi==fdi_write) {
pfdentry->delete_pending = TRUE;
}
labor_performed = TRUE;
}
UNLOCK_FD_HANDLER(pfdctx);
}
LOCK(pfdctx)
ellDelete(&pfdctx->fdentry_in_use_list, (ELLNODE*)pfdentry);
ellDelete(&pfdctx->fdentry_in_use_list, &pfdentry->node);
/*
* if it is marked pending delete
* reset it and place it on the free list
*
* write fd interest is treated as a one shot
* so remove them after each action
*/
if(pfdentry->delete_pending || pfdentry->fdi==fdi_write){
if(pfdentry->delete_pending){
fdmgr_finish_off_fdentry(pfdctx, pfdentry);
}
else{
ellAdd(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
ellAdd(&pfdctx->fdentry_list, &pfdentry->node);
}
UNLOCK(pfdctx)
@@ -818,8 +833,8 @@ struct timeval *poffset
{
struct timeval t;
int status;
fdmgrAlarm *pa;
fdmgrAlarm *nextpa;
fdmgrAlarm *pa;
fdmgrAlarm *nextpa;
status = fdmgr_gettimeval(pfdctx, &t);
assert (status >= 0);
@@ -832,9 +847,9 @@ struct timeval *poffset
if(pa->t.tv_usec > t.tv_usec)
break;
nextpa = (fdmgrAlarm*)pa->node.next;
ellDelete(&pfdctx->alarm_list, (ELLNODE*)pa);
ellAdd(&pfdctx->expired_alarm_list, (ELLNODE*)pa);
nextpa = (fdmgrAlarm*) pa->node.next;
ellDelete(&pfdctx->alarm_list, &pa->node);
ellAdd(&pfdctx->expired_alarm_list, &pa->node);
pa->alt = alt_expired;
}
UNLOCK(pfdctx);
@@ -914,10 +929,10 @@ struct timeval *poffset
* select_alarm()
*
*/
LOCAL void select_alarm(
fdctx *pfdctx
)
LOCAL void select_alarm(void *pParam)
{
fdctx *pfdctx = pParam;
pfdctx->select_tmo = TRUE;
}

View File

@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
* .01 04-19-94 mrk Initial Implementation
*/
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <stddef.h>

View File

@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
* .01 04-19-94 mrk Initial Implementation
*/
#ifdef vxWorks
#include <vxWorks.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <stddef.h>

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